Skip to content

Argus

Your React Native app ships on Hermes. Your tests run on Node. Argus closes that gap — the real engine, spawned per test file, at unit-test speed.

The engine that ships is the engine that tests

Section titled “The engine that ships is the engine that tests”

Argus bundles each test file into a sealed IIFE, spawns the standalone hermes VM on it, and reads a framed result line back. No Metro, no native build, no emulator — and no V8 pretending to be Hermes.

// sum.test.ts — plain TypeScript, running on the real Hermes VM
import { sum } from './sum';
describe('sum', () => {
test('adds numbers', () => {
expect(sum(2, 3)).toBe(5);
});
test('rejects a non-number', () => {
expect(() => sum(2, 'three' as never)).toThrow(TypeError);
});
});
Terminal window
argus "src/**/*.test.ts"

Real Hermes, not an emulation

The hermes CLI VM, spawned as a subprocess per file. Same bytecode model React Native uses on device — compile to HBC, interpret it.

Jest-shaped surface

describe / test / it, the four hooks, .skip / .only / .todo, async tests, expect.extend, assertion counting. Familiar where familiarity helps.

Engine pinned by your project

Argus reads the Hermes version your React Native install pins, then provisions exactly that VM. Legacy and V1 both supported.

Stacks that point at your source

Failure stacks are remapped through the bundle’s source map, back to the original .ts / .tsx line you wrote.

Component testing on real React

render, screen, getBy*, within, fireEvent, act — real React 19 running inside Hermes, not a DOM shim on Node.

A hardened result channel

User tests can pollute prototypes and hijack globals. The result frame survives it: captured primordials, a private nonce, a hand-written serializer.