Limitations & non-goals
Two different lists. Confusing them wastes everyone’s time.
Not built yet
Section titled “Not built yet”On the roadmap, in priority order.
| Missing | Notes |
|---|---|
| Config file | No argus.config.ts. Globs, timeout, concurrency and aliases are flags or defaults. |
passWithNoTests |
A zero-match run exits 2. |
| Snapshots | toMatchSnapshot, .snap files, --update, obsolete pruning. Designed, not implemented. |
| Coverage | No provider, thresholds or reporters. |
| Watch mode | No file watching or re-run on change. |
| Pluggable reporters | Terminal output only. No JSON, no JUnit. |
bail, retry, test-name filtering |
Not implemented. |
| Setup files | No user-supplied global setup or teardown. |
| Windows | No prebuilt VM. --provision or --hermes only. |
Out of scope on purpose
Section titled “Out of scope on purpose”These are not “later”. They are decisions.
Running on a device or emulator
Section titled “Running on a device or emulator”Argus is the standalone-VM case. On-device runners exist and solve a different problem — one that costs a native build and a device, and buys app-level fidelity Argus does not claim.
Use both. Unit-level engine fidelity here; app-level behaviour there.
Full Jest compatibility
Section titled “Full Jest compatibility”Argus implements the surface that makes sense on Hermes, not the whole of Jest.
Notably absent, and staying absent:
jest.mock('module', factory)and automatic module mocking. There is no module registry to intercept — everything is bundled before the VM starts. Inject the dependency instead.- The
jestglobal.globalThis.jestisundefined. A namespace implementing two-thirds of Jest is worse than none: copied code would appear to work until it reached the missing third. - Fake timers. The standalone VM has no timers to fake.
A React Native runtime
Section titled “A React Native runtime”Argus does not provide, and is not working toward:
- Metro runtime behaviour
- Native app lifecycle
- Device APIs (
AppState,Dimensions,Linking,Animated, …) - Real UI rendering
- Layout and measurement
What exists is a native-module shim so code reaching for NativeModules or
TurboModuleRegistry can run and be controlled — see
Native modules — plus four host components for component tests.
Replacing Vitest or Jest for non-RN projects
Section titled “Replacing Vitest or Jest for non-RN projects”Argus exists because React Native ships on Hermes. On a project that does not, it buys nothing that Vitest does not already do better.
Bundling another JavaScript engine
Section titled “Bundling another JavaScript engine”Not JavaScriptCore, not V8, not QuickJS. The whole argument is the engine your app ships.
Environment gaps to plan around
Section titled “Environment gaps to plan around”The standalone VM has no host APIs. This is the single most common source of surprise:
| Not available | What to do |
|---|---|
setTimeout, setInterval, setImmediate |
Inject a scheduler; see Async tests |
fetch, XMLHttpRequest |
Inject the transport |
require, dynamic import |
Everything is bundled up front |
process, fs, any Node built-in |
Host-only; not present in the Hermes realm |
window, document |
No DOM, by definition |
Available: console (built on print), queueMicrotask, global, Promise, and the
whole JavaScript language for the target engine — including Intl, which is built in.
Component-testing gaps
Section titled “Component-testing gaps”Covered in full on Component testing:
waitFor, findBy*, userEvent, fake timers, Suspense guarantees, layout, and native
platform fidelity beyond the four shim components.
Held node references go stale after an update — re-query through screen.
The honest summary
Section titled “The honest summary”Argus tells you the truth about engine behaviour for unit-level code. It does not tell you your screen looks right, your navigation works, or your native module is wired up.
Those need a device. This does not pretend otherwise.