Step 1 of 4: Drop test-only DI with vitest module mocking
Add vitest alongside node:test. Migrate leaf modules that have no downstream consumers of their DI params.
Setup
- Add
vitest as dev dependency
- Configure
vitest.config.ts (coexist with node:test during migration)
- Update CI to run both runners
Files to migrate (15 DI params removed)
src/daemon/recording-telemetry.ts (1 param)
- Remove
writeTelemetry?: typeof writeRecordingTelemetry
- Rewrite test with
vi.mock
src/daemon/handlers/find.ts (1 param)
- Remove
dispatch?: typeof dispatchCommand
- Rewrite
__tests__/find.test.ts with vi.mock('../../core/dispatch.ts')
src/daemon/handlers/install-source.ts (7 params)
- Remove
deps object: resolveInstallDevice?, getRequestSignal?, prepareIosInstallArtifact?, installIosInstallablePath?, prepareAndroidInstallArtifact?, installAndroidInstallablePathAndResolvePackageName?, inferAndroidAppName?
- Rewrite
__tests__/install-source.test.ts with vi.mock for each platform import
src/daemon/handlers/session-runtime-command.ts (1 param)
- Remove
clearRuntimeHints?: typeof clearRuntimeHintsFromApp
- Rewrite relevant test with
vi.mock('../runtime-hints.ts')
src/daemon/android-system-dialog.ts (4 params)
- Remove
snapshotAndroidUi?, reopenAndroidApp?, readAndroidAppState?, execCommand?
- Rewrite
__tests__/request-router-android-modal.test.ts with vi.mock
src/daemon/handlers/interaction-snapshot.ts (1 param)
- Remove
dispatch: typeof dispatchCommand = dispatchCommand default-value DI
- Mock dispatch in calling test
Validation
pnpm typecheck
pnpm test:unit (node:test suite still passes)
- vitest suite passes for migrated files
- No optional
typeof params remain in touched files
CI lint guard
Add to CI: rg '\?\s*:\s*typeof\s+' <touched files> must return zero matches.
Part of migration: #1→#2→#3→#4
Step 1 of 4: Drop test-only DI with vitest module mocking
Add vitest alongside
node:test. Migrate leaf modules that have no downstream consumers of their DI params.Setup
vitestas dev dependencyvitest.config.ts(coexist withnode:testduring migration)Files to migrate (15 DI params removed)
src/daemon/recording-telemetry.ts(1 param)writeTelemetry?: typeof writeRecordingTelemetryvi.mocksrc/daemon/handlers/find.ts(1 param)dispatch?: typeof dispatchCommand__tests__/find.test.tswithvi.mock('../../core/dispatch.ts')src/daemon/handlers/install-source.ts(7 params)depsobject:resolveInstallDevice?,getRequestSignal?,prepareIosInstallArtifact?,installIosInstallablePath?,prepareAndroidInstallArtifact?,installAndroidInstallablePathAndResolvePackageName?,inferAndroidAppName?__tests__/install-source.test.tswithvi.mockfor each platform importsrc/daemon/handlers/session-runtime-command.ts(1 param)clearRuntimeHints?: typeof clearRuntimeHintsFromAppvi.mock('../runtime-hints.ts')src/daemon/android-system-dialog.ts(4 params)snapshotAndroidUi?,reopenAndroidApp?,readAndroidAppState?,execCommand?__tests__/request-router-android-modal.test.tswithvi.mocksrc/daemon/handlers/interaction-snapshot.ts(1 param)dispatch: typeof dispatchCommand = dispatchCommanddefault-value DIValidation
pnpm typecheckpnpm test:unit(node:test suite still passes)typeofparams remain in touched filesCI lint guard
Add to CI:
rg '\?\s*:\s*typeof\s+' <touched files>must return zero matches.Part of migration: #1→#2→#3→#4