runwork 0.15.0 → 0.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +19272 -116
- package/package.json +4 -4
- package/dist/__tests__/curl-parser.test.d.ts +0 -1
- package/dist/__tests__/curl-parser.test.js +0 -250
- package/dist/__tests__/install-scripts.test.d.ts +0 -1
- package/dist/__tests__/install-scripts.test.js +0 -280
- package/dist/__tests__/types-manager.test.d.ts +0 -1
- package/dist/__tests__/types-manager.test.js +0 -89
- package/dist/agents/__tests__/chatgpt-registry.test.d.ts +0 -1
- package/dist/agents/__tests__/chatgpt-registry.test.js +0 -61
- package/dist/agents/__tests__/claude-code-managed-block.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-code-managed-block.test.js +0 -97
- package/dist/agents/__tests__/claude-code-plugin.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-code-plugin.test.js +0 -47
- package/dist/agents/__tests__/claude-code-stats.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-code-stats.test.js +0 -390
- package/dist/agents/__tests__/claude-desktop-memory.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-desktop-memory.test.js +0 -154
- package/dist/agents/__tests__/claude-desktop-plugin-tree.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-desktop-plugin-tree.test.js +0 -161
- package/dist/agents/__tests__/claude-desktop-plugin.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-desktop-plugin.test.js +0 -117
- package/dist/agents/__tests__/claude-desktop-rpm.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-desktop-rpm.test.js +0 -126
- package/dist/agents/__tests__/claude-desktop-stats.test.d.ts +0 -1
- package/dist/agents/__tests__/claude-desktop-stats.test.js +0 -280
- package/dist/agents/__tests__/codex-instructions.test.d.ts +0 -1
- package/dist/agents/__tests__/codex-instructions.test.js +0 -57
- package/dist/agents/__tests__/codex-minimum-permissions.test.d.ts +0 -1
- package/dist/agents/__tests__/codex-minimum-permissions.test.js +0 -82
- package/dist/agents/__tests__/codex-stats.test.d.ts +0 -1
- package/dist/agents/__tests__/codex-stats.test.js +0 -370
- package/dist/agents/__tests__/cursor-merge.test.d.ts +0 -1
- package/dist/agents/__tests__/cursor-merge.test.js +0 -66
- package/dist/agents/__tests__/cursor-stats.test.d.ts +0 -1
- package/dist/agents/__tests__/cursor-stats.test.js +0 -183
- package/dist/agents/__tests__/defaults-merge.test.d.ts +0 -1
- package/dist/agents/__tests__/defaults-merge.test.js +0 -268
- package/dist/agents/__tests__/detection.test.d.ts +0 -1
- package/dist/agents/__tests__/detection.test.js +0 -89
- package/dist/agents/__tests__/graceful-degradation.test.d.ts +0 -1
- package/dist/agents/__tests__/graceful-degradation.test.js +0 -129
- package/dist/agents/__tests__/instruction-hint.test.d.ts +0 -1
- package/dist/agents/__tests__/instruction-hint.test.js +0 -69
- package/dist/agents/__tests__/intro-skill.test.d.ts +0 -1
- package/dist/agents/__tests__/intro-skill.test.js +0 -193
- package/dist/agents/__tests__/schema-validation.test.d.ts +0 -1
- package/dist/agents/__tests__/schema-validation.test.js +0 -212
- package/dist/agents/__tests__/skill-slug.test.d.ts +0 -1
- package/dist/agents/__tests__/skill-slug.test.js +0 -77
- package/dist/agents/claude-code.d.ts +0 -53
- package/dist/agents/claude-code.js +0 -754
- package/dist/agents/claude-desktop-plugin-tree.d.ts +0 -59
- package/dist/agents/claude-desktop-plugin-tree.js +0 -143
- package/dist/agents/claude-desktop.d.ts +0 -47
- package/dist/agents/claude-desktop.js +0 -684
- package/dist/agents/cline.d.ts +0 -15
- package/dist/agents/cline.js +0 -130
- package/dist/agents/codex.d.ts +0 -44
- package/dist/agents/codex.js +0 -453
- package/dist/agents/conversation-skills.d.ts +0 -18
- package/dist/agents/conversation-skills.js +0 -229
- package/dist/agents/cursor.d.ts +0 -48
- package/dist/agents/cursor.js +0 -324
- package/dist/agents/default-config.d.ts +0 -30
- package/dist/agents/default-config.js +0 -67
- package/dist/agents/defaults-merge.d.ts +0 -72
- package/dist/agents/defaults-merge.js +0 -131
- package/dist/agents/detect.d.ts +0 -4
- package/dist/agents/detect.js +0 -67
- package/dist/agents/detection.d.ts +0 -18
- package/dist/agents/detection.js +0 -94
- package/dist/agents/gemini.d.ts +0 -15
- package/dist/agents/gemini.js +0 -122
- package/dist/agents/generic-adapter.d.ts +0 -25
- package/dist/agents/generic-adapter.js +0 -151
- package/dist/agents/intro-skill.d.ts +0 -45
- package/dist/agents/intro-skill.js +0 -447
- package/dist/agents/registry-data.d.ts +0 -192
- package/dist/agents/registry-data.js +0 -669
- package/dist/agents/registry.d.ts +0 -13
- package/dist/agents/registry.js +0 -36
- package/dist/agents/runtime-detection.d.ts +0 -82
- package/dist/agents/runtime-detection.js +0 -271
- package/dist/agents/session-start-hook.d.ts +0 -37
- package/dist/agents/session-start-hook.js +0 -159
- package/dist/agents/types.d.ts +0 -171
- package/dist/agents/types.js +0 -75
- package/dist/agents/utils/instruction-hint.d.ts +0 -21
- package/dist/agents/utils/instruction-hint.js +0 -108
- package/dist/agents/utils/json-config.d.ts +0 -19
- package/dist/agents/utils/json-config.js +0 -69
- package/dist/agents/utils/toml-config.d.ts +0 -8
- package/dist/agents/utils/toml-config.js +0 -27
- package/dist/agents/windsurf.d.ts +0 -14
- package/dist/agents/windsurf.js +0 -102
- package/dist/api/__tests__/client.test.d.ts +0 -1
- package/dist/api/__tests__/client.test.js +0 -272
- package/dist/api/client.d.ts +0 -326
- package/dist/api/client.js +0 -427
- package/dist/auth/__tests__/login-flow.test.d.ts +0 -1
- package/dist/auth/__tests__/login-flow.test.js +0 -101
- package/dist/auth/__tests__/store.test.d.ts +0 -1
- package/dist/auth/__tests__/store.test.js +0 -132
- package/dist/auth/login-flow.d.ts +0 -26
- package/dist/auth/login-flow.js +0 -137
- package/dist/auth/store.d.ts +0 -5
- package/dist/auth/store.js +0 -62
- package/dist/commands/__tests__/clone-args.test.d.ts +0 -1
- package/dist/commands/__tests__/clone-args.test.js +0 -51
- package/dist/commands/__tests__/clone-source-result.test.d.ts +0 -1
- package/dist/commands/__tests__/clone-source-result.test.js +0 -45
- package/dist/commands/__tests__/info-merge.test.d.ts +0 -1
- package/dist/commands/__tests__/info-merge.test.js +0 -55
- package/dist/commands/__tests__/mcp-entries.test.d.ts +0 -1
- package/dist/commands/__tests__/mcp-entries.test.js +0 -48
- package/dist/commands/__tests__/setup-persona.test.d.ts +0 -1
- package/dist/commands/__tests__/setup-persona.test.js +0 -31
- package/dist/commands/__tests__/setup.test.d.ts +0 -1
- package/dist/commands/__tests__/setup.test.js +0 -81
- package/dist/commands/__tests__/sync-redetect.test.d.ts +0 -1
- package/dist/commands/__tests__/sync-redetect.test.js +0 -96
- package/dist/commands/__tests__/sync-telemetry.test.d.ts +0 -1
- package/dist/commands/__tests__/sync-telemetry.test.js +0 -281
- package/dist/commands/__tests__/upgrade.test.d.ts +0 -1
- package/dist/commands/__tests__/upgrade.test.js +0 -157
- package/dist/commands/agents.d.ts +0 -2
- package/dist/commands/agents.js +0 -160
- package/dist/commands/api-keys.d.ts +0 -2
- package/dist/commands/api-keys.js +0 -95
- package/dist/commands/apps.d.ts +0 -2
- package/dist/commands/apps.js +0 -82
- package/dist/commands/build-plugin.d.ts +0 -2
- package/dist/commands/build-plugin.js +0 -135
- package/dist/commands/clone.d.ts +0 -60
- package/dist/commands/clone.js +0 -271
- package/dist/commands/components.d.ts +0 -2
- package/dist/commands/components.js +0 -43
- package/dist/commands/deploy.d.ts +0 -2
- package/dist/commands/deploy.js +0 -279
- package/dist/commands/dev.d.ts +0 -11
- package/dist/commands/dev.js +0 -1011
- package/dist/commands/doctor.d.ts +0 -2
- package/dist/commands/doctor.js +0 -230
- package/dist/commands/endpoints.d.ts +0 -2
- package/dist/commands/endpoints.js +0 -189
- package/dist/commands/entities.d.ts +0 -2
- package/dist/commands/entities.js +0 -198
- package/dist/commands/files.d.ts +0 -2
- package/dist/commands/files.js +0 -193
- package/dist/commands/inbox.d.ts +0 -11
- package/dist/commands/inbox.js +0 -60
- package/dist/commands/info.d.ts +0 -178
- package/dist/commands/info.js +0 -455
- package/dist/commands/init.d.ts +0 -21
- package/dist/commands/init.js +0 -185
- package/dist/commands/integrations.d.ts +0 -2
- package/dist/commands/integrations.js +0 -233
- package/dist/commands/login.d.ts +0 -2
- package/dist/commands/login.js +0 -44
- package/dist/commands/logout.d.ts +0 -2
- package/dist/commands/logout.js +0 -13
- package/dist/commands/logs.d.ts +0 -2
- package/dist/commands/logs.js +0 -232
- package/dist/commands/mcp-entries.d.ts +0 -13
- package/dist/commands/mcp-entries.js +0 -26
- package/dist/commands/mcp.d.ts +0 -2
- package/dist/commands/mcp.js +0 -245
- package/dist/commands/open.d.ts +0 -2
- package/dist/commands/open.js +0 -53
- package/dist/commands/resume.d.ts +0 -2
- package/dist/commands/resume.js +0 -289
- package/dist/commands/save-convo.d.ts +0 -8
- package/dist/commands/save-convo.js +0 -20
- package/dist/commands/schedules.d.ts +0 -2
- package/dist/commands/schedules.js +0 -221
- package/dist/commands/setup.d.ts +0 -27
- package/dist/commands/setup.js +0 -177
- package/dist/commands/share-convo.d.ts +0 -24
- package/dist/commands/share-convo.js +0 -167
- package/dist/commands/skills.d.ts +0 -2
- package/dist/commands/skills.js +0 -352
- package/dist/commands/sync-telemetry.d.ts +0 -33
- package/dist/commands/sync-telemetry.js +0 -186
- package/dist/commands/sync.d.ts +0 -37
- package/dist/commands/sync.js +0 -702
- package/dist/commands/uninstall.d.ts +0 -2
- package/dist/commands/uninstall.js +0 -145
- package/dist/commands/upgrade.d.ts +0 -14
- package/dist/commands/upgrade.js +0 -217
- package/dist/commands/validate.d.ts +0 -2
- package/dist/commands/validate.js +0 -89
- package/dist/commands/welcome.d.ts +0 -1
- package/dist/commands/welcome.js +0 -86
- package/dist/commands/workflows.d.ts +0 -2
- package/dist/commands/workflows.js +0 -187
- package/dist/deploy/__tests__/deploy-state.test.d.ts +0 -1
- package/dist/deploy/__tests__/deploy-state.test.js +0 -80
- package/dist/deploy/__tests__/deploy-status.test.d.ts +0 -1
- package/dist/deploy/__tests__/deploy-status.test.js +0 -41
- package/dist/deploy/__tests__/detach-args.test.d.ts +0 -1
- package/dist/deploy/__tests__/detach-args.test.js +0 -30
- package/dist/deploy/deploy-state.d.ts +0 -36
- package/dist/deploy/deploy-state.js +0 -63
- package/dist/deploy/deploy-status.d.ts +0 -21
- package/dist/deploy/deploy-status.js +0 -36
- package/dist/deploy/detach.d.ts +0 -32
- package/dist/deploy/detach.js +0 -71
- package/dist/dev/__tests__/attach.test.d.ts +0 -1
- package/dist/dev/__tests__/attach.test.js +0 -296
- package/dist/dev/__tests__/detach.test.d.ts +0 -1
- package/dist/dev/__tests__/detach.test.js +0 -404
- package/dist/dev/__tests__/preview-url-poller.test.d.ts +0 -1
- package/dist/dev/__tests__/preview-url-poller.test.js +0 -149
- package/dist/dev/__tests__/session.test.d.ts +0 -1
- package/dist/dev/__tests__/session.test.js +0 -446
- package/dist/dev/__tests__/startup-sync.test.d.ts +0 -1
- package/dist/dev/__tests__/startup-sync.test.js +0 -32
- package/dist/dev/__tests__/stop.test.d.ts +0 -1
- package/dist/dev/__tests__/stop.test.js +0 -172
- package/dist/dev/attach.d.ts +0 -120
- package/dist/dev/attach.js +0 -269
- package/dist/dev/detach.d.ts +0 -187
- package/dist/dev/detach.js +0 -292
- package/dist/dev/preview-url-poller.d.ts +0 -35
- package/dist/dev/preview-url-poller.js +0 -50
- package/dist/dev/session.d.ts +0 -175
- package/dist/dev/session.js +0 -258
- package/dist/dev/startup-sync.d.ts +0 -23
- package/dist/dev/startup-sync.js +0 -14
- package/dist/dev/stop.d.ts +0 -52
- package/dist/dev/stop.js +0 -101
- package/dist/devtools/registry-data.d.ts +0 -46
- package/dist/devtools/registry-data.js +0 -40
- package/dist/generated/bundled-types.d.ts +0 -1
- package/dist/generated/bundled-types.js +0 -46
- package/dist/generated/version.d.ts +0 -1
- package/dist/generated/version.js +0 -2
- package/dist/git/__tests__/auto-commit.test.d.ts +0 -1
- package/dist/git/__tests__/auto-commit.test.js +0 -431
- package/dist/git/__tests__/classify-sync-error.test.d.ts +0 -1
- package/dist/git/__tests__/classify-sync-error.test.js +0 -57
- package/dist/git/__tests__/credential-helper-e2e.test.d.ts +0 -21
- package/dist/git/__tests__/credential-helper-e2e.test.js +0 -195
- package/dist/git/__tests__/credentials.test.d.ts +0 -1
- package/dist/git/__tests__/credentials.test.js +0 -141
- package/dist/git/__tests__/deploy-guard.test.d.ts +0 -1
- package/dist/git/__tests__/deploy-guard.test.js +0 -61
- package/dist/git/__tests__/ensure-git-credential-helper.test.d.ts +0 -1
- package/dist/git/__tests__/ensure-git-credential-helper.test.js +0 -133
- package/dist/git/__tests__/ensure-runwork-remote.test.d.ts +0 -1
- package/dist/git/__tests__/ensure-runwork-remote.test.js +0 -109
- package/dist/git/__tests__/identity.test.d.ts +0 -1
- package/dist/git/__tests__/identity.test.js +0 -146
- package/dist/git/__tests__/manifest.test.d.ts +0 -1
- package/dist/git/__tests__/manifest.test.js +0 -446
- package/dist/git/__tests__/preflight-resolution.test.d.ts +0 -1
- package/dist/git/__tests__/preflight-resolution.test.js +0 -366
- package/dist/git/__tests__/preflight.test.d.ts +0 -1
- package/dist/git/__tests__/preflight.test.js +0 -36
- package/dist/git/__tests__/repo-config.test.d.ts +0 -1
- package/dist/git/__tests__/repo-config.test.js +0 -26
- package/dist/git/__tests__/sync.test.d.ts +0 -1
- package/dist/git/__tests__/sync.test.js +0 -405
- package/dist/git/auto-commit.d.ts +0 -35
- package/dist/git/auto-commit.js +0 -293
- package/dist/git/classify-sync-error.d.ts +0 -21
- package/dist/git/classify-sync-error.js +0 -111
- package/dist/git/credentials.d.ts +0 -75
- package/dist/git/credentials.js +0 -164
- package/dist/git/critical-files.d.ts +0 -20
- package/dist/git/critical-files.js +0 -68
- package/dist/git/deploy-guard.d.ts +0 -53
- package/dist/git/deploy-guard.js +0 -78
- package/dist/git/identity.d.ts +0 -44
- package/dist/git/identity.js +0 -133
- package/dist/git/preflight.d.ts +0 -57
- package/dist/git/preflight.js +0 -276
- package/dist/git/remote.d.ts +0 -37
- package/dist/git/remote.js +0 -75
- package/dist/git/repo-config.d.ts +0 -8
- package/dist/git/repo-config.js +0 -29
- package/dist/git/sync.d.ts +0 -15
- package/dist/git/sync.js +0 -159
- package/dist/health/__tests__/checks.test.d.ts +0 -1
- package/dist/health/__tests__/checks.test.js +0 -357
- package/dist/health/__tests__/cli-distribution-checks.test.d.ts +0 -1
- package/dist/health/__tests__/cli-distribution-checks.test.js +0 -196
- package/dist/health/__tests__/fix.test.d.ts +0 -1
- package/dist/health/__tests__/fix.test.js +0 -72
- package/dist/health/__tests__/runner-filter.test.d.ts +0 -1
- package/dist/health/__tests__/runner-filter.test.js +0 -61
- package/dist/health/checks.d.ts +0 -42
- package/dist/health/checks.js +0 -636
- package/dist/health/fix.d.ts +0 -22
- package/dist/health/fix.js +0 -62
- package/dist/health/runner.d.ts +0 -8
- package/dist/health/runner.js +0 -47
- package/dist/health/types.d.ts +0 -12
- package/dist/health/types.js +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/logs/__tests__/tailer-format.test.d.ts +0 -1
- package/dist/logs/__tests__/tailer-format.test.js +0 -43
- package/dist/logs/tailer.d.ts +0 -17
- package/dist/logs/tailer.js +0 -217
- package/dist/sync/__tests__/change-detect.test.d.ts +0 -1
- package/dist/sync/__tests__/change-detect.test.js +0 -123
- package/dist/sync/__tests__/hash.test.d.ts +0 -1
- package/dist/sync/__tests__/hash.test.js +0 -18
- package/dist/sync/change-detect.d.ts +0 -19
- package/dist/sync/change-detect.js +0 -136
- package/dist/sync/conflict-ui.d.ts +0 -5
- package/dist/sync/conflict-ui.js +0 -78
- package/dist/sync/executor.d.ts +0 -23
- package/dist/sync/executor.js +0 -102
- package/dist/sync/hash.d.ts +0 -1
- package/dist/sync/hash.js +0 -4
- package/dist/sync/types.d.ts +0 -24
- package/dist/sync/types.js +0 -1
- package/dist/template/manifest.d.ts +0 -17
- package/dist/template/manifest.js +0 -145
- package/dist/tools/types.d.ts +0 -52
- package/dist/tools/types.js +0 -8
- package/dist/types-manager.d.ts +0 -1
- package/dist/types-manager.js +0 -35
- package/dist/types.d.ts +0 -349
- package/dist/types.js +0 -1
- package/dist/ui/__tests__/banner.test.d.ts +0 -1
- package/dist/ui/__tests__/banner.test.js +0 -98
- package/dist/ui/__tests__/colors.test.d.ts +0 -1
- package/dist/ui/__tests__/colors.test.js +0 -22
- package/dist/ui/__tests__/keyboard.test.d.ts +0 -1
- package/dist/ui/__tests__/keyboard.test.js +0 -34
- package/dist/ui/__tests__/status-line.test.d.ts +0 -1
- package/dist/ui/__tests__/status-line.test.js +0 -54
- package/dist/ui/banner.d.ts +0 -29
- package/dist/ui/banner.js +0 -153
- package/dist/ui/colors.d.ts +0 -4
- package/dist/ui/colors.js +0 -7
- package/dist/ui/keyboard.d.ts +0 -12
- package/dist/ui/keyboard.js +0 -61
- package/dist/ui/status-line.d.ts +0 -6
- package/dist/ui/status-line.js +0 -53
- package/dist/utils/__tests__/format-error.test.d.ts +0 -1
- package/dist/utils/__tests__/format-error.test.js +0 -43
- package/dist/utils/__tests__/help-json.test.d.ts +0 -1
- package/dist/utils/__tests__/help-json.test.js +0 -39
- package/dist/utils/__tests__/http.test.d.ts +0 -1
- package/dist/utils/__tests__/http.test.js +0 -381
- package/dist/utils/__tests__/ignore-matcher.test.d.ts +0 -1
- package/dist/utils/__tests__/ignore-matcher.test.js +0 -205
- package/dist/utils/__tests__/output.test.d.ts +0 -1
- package/dist/utils/__tests__/output.test.js +0 -38
- package/dist/utils/__tests__/prompt.test.d.ts +0 -1
- package/dist/utils/__tests__/prompt.test.js +0 -27
- package/dist/utils/__tests__/resolve.test.d.ts +0 -1
- package/dist/utils/__tests__/resolve.test.js +0 -95
- package/dist/utils/__tests__/sqlite.test.d.ts +0 -1
- package/dist/utils/__tests__/sqlite.test.js +0 -89
- package/dist/utils/agent-guidance.d.ts +0 -47
- package/dist/utils/agent-guidance.js +0 -128
- package/dist/utils/app-info.d.ts +0 -70
- package/dist/utils/app-info.js +0 -167
- package/dist/utils/curl-parser.d.ts +0 -12
- package/dist/utils/curl-parser.js +0 -162
- package/dist/utils/data-input.d.ts +0 -1
- package/dist/utils/data-input.js +0 -38
- package/dist/utils/format-error.d.ts +0 -10
- package/dist/utils/format-error.js +0 -38
- package/dist/utils/fs.d.ts +0 -5
- package/dist/utils/fs.js +0 -23
- package/dist/utils/help-json.d.ts +0 -70
- package/dist/utils/help-json.js +0 -88
- package/dist/utils/http.d.ts +0 -46
- package/dist/utils/http.js +0 -421
- package/dist/utils/ignore-matcher.d.ts +0 -47
- package/dist/utils/ignore-matcher.js +0 -132
- package/dist/utils/output.d.ts +0 -17
- package/dist/utils/output.js +0 -27
- package/dist/utils/prompt.d.ts +0 -5
- package/dist/utils/prompt.js +0 -42
- package/dist/utils/resolve.d.ts +0 -12
- package/dist/utils/resolve.js +0 -52
- package/dist/utils/setup-state.d.ts +0 -3
- package/dist/utils/setup-state.js +0 -19
- package/dist/utils/sqlite-adapter.d.ts +0 -48
- package/dist/utils/sqlite-adapter.js +0 -147
- package/dist/utils/sqlite.d.ts +0 -14
- package/dist/utils/sqlite.js +0 -14
- package/dist/utils/subprocess.d.ts +0 -19
- package/dist/utils/subprocess.js +0 -27
- package/dist/utils/which.d.ts +0 -14
- package/dist/utils/which.js +0 -47
- package/dist/utils/zip.d.ts +0 -7
- package/dist/utils/zip.js +0 -42
- package/dist/validate/__tests__/validate.test.d.ts +0 -1
- package/dist/validate/__tests__/validate.test.js +0 -42
- package/dist/validate/freshness.d.ts +0 -28
- package/dist/validate/freshness.js +0 -48
- package/dist/validate/preview.d.ts +0 -21
- package/dist/validate/preview.js +0 -39
- package/dist/workspace/resolve.d.ts +0 -19
- package/dist/workspace/resolve.js +0 -100
|
@@ -1,366 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
// Mocks must be declared before imports of the module under test so vitest
|
|
3
|
-
// hoists them above the static import.
|
|
4
|
-
vi.mock('child_process', async () => {
|
|
5
|
-
const actual = await vi.importActual('child_process');
|
|
6
|
-
return { ...actual, execFileSync: vi.fn() };
|
|
7
|
-
});
|
|
8
|
-
vi.mock('fs', async () => {
|
|
9
|
-
const actual = await vi.importActual('fs');
|
|
10
|
-
return { ...actual, existsSync: vi.fn() };
|
|
11
|
-
});
|
|
12
|
-
vi.mock('os', async () => {
|
|
13
|
-
const actual = await vi.importActual('os');
|
|
14
|
-
return { ...actual, homedir: vi.fn(() => 'C:\\Users\\test') };
|
|
15
|
-
});
|
|
16
|
-
import { execFileSync } from 'child_process';
|
|
17
|
-
import { existsSync } from 'fs';
|
|
18
|
-
import { probeGit, resetGitProbeCache, buildMissingGitMessage, parseGitVersion, } from '../preflight.js';
|
|
19
|
-
const mockedExec = vi.mocked(execFileSync);
|
|
20
|
-
const mockedExists = vi.mocked(existsSync);
|
|
21
|
-
function enoent(file) {
|
|
22
|
-
const err = new Error(`spawn ${file} ENOENT`);
|
|
23
|
-
err.code = 'ENOENT';
|
|
24
|
-
err.errno = -2;
|
|
25
|
-
err.syscall = `spawn ${file}`;
|
|
26
|
-
err.path = file;
|
|
27
|
-
return err;
|
|
28
|
-
}
|
|
29
|
-
describe('probeGit -- Windows fallback resolution', () => {
|
|
30
|
-
let originalPlatform;
|
|
31
|
-
let originalPath;
|
|
32
|
-
let originalProgramFiles;
|
|
33
|
-
let originalProgramFilesX86;
|
|
34
|
-
let originalLocalAppData;
|
|
35
|
-
beforeEach(() => {
|
|
36
|
-
resetGitProbeCache();
|
|
37
|
-
originalPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
|
|
38
|
-
Object.defineProperty(process, 'platform', { value: 'win32', writable: true, configurable: true });
|
|
39
|
-
originalPath = process.env.PATH;
|
|
40
|
-
originalProgramFiles = process.env.ProgramFiles;
|
|
41
|
-
originalProgramFilesX86 = process.env['ProgramFiles(x86)'];
|
|
42
|
-
originalLocalAppData = process.env.LOCALAPPDATA;
|
|
43
|
-
process.env.PATH = 'C:\\Windows\\system32;C:\\Windows';
|
|
44
|
-
process.env.ProgramFiles = 'C:\\Program Files';
|
|
45
|
-
process.env['ProgramFiles(x86)'] = 'C:\\Program Files (x86)';
|
|
46
|
-
process.env.LOCALAPPDATA = 'C:\\Users\\test\\AppData\\Local';
|
|
47
|
-
mockedExec.mockReset();
|
|
48
|
-
mockedExists.mockReset();
|
|
49
|
-
});
|
|
50
|
-
afterEach(() => {
|
|
51
|
-
if (originalPlatform)
|
|
52
|
-
Object.defineProperty(process, 'platform', originalPlatform);
|
|
53
|
-
if (originalPath !== undefined)
|
|
54
|
-
process.env.PATH = originalPath;
|
|
55
|
-
else
|
|
56
|
-
delete process.env.PATH;
|
|
57
|
-
if (originalProgramFiles !== undefined)
|
|
58
|
-
process.env.ProgramFiles = originalProgramFiles;
|
|
59
|
-
else
|
|
60
|
-
delete process.env.ProgramFiles;
|
|
61
|
-
if (originalProgramFilesX86 !== undefined)
|
|
62
|
-
process.env['ProgramFiles(x86)'] = originalProgramFilesX86;
|
|
63
|
-
else
|
|
64
|
-
delete process.env['ProgramFiles(x86)'];
|
|
65
|
-
if (originalLocalAppData !== undefined)
|
|
66
|
-
process.env.LOCALAPPDATA = originalLocalAppData;
|
|
67
|
-
else
|
|
68
|
-
delete process.env.LOCALAPPDATA;
|
|
69
|
-
delete process.env.Path;
|
|
70
|
-
});
|
|
71
|
-
it('resolves via where.exe when bare git lookup fails', () => {
|
|
72
|
-
const realGitPath = 'C:\\Program Files\\Git\\cmd\\git.exe';
|
|
73
|
-
mockedExec.mockImplementation((file) => {
|
|
74
|
-
if (file === 'git')
|
|
75
|
-
throw enoent('git');
|
|
76
|
-
if (file === 'where.exe')
|
|
77
|
-
return Buffer.from(`${realGitPath}\r\n`);
|
|
78
|
-
if (file === realGitPath)
|
|
79
|
-
return Buffer.from('git version 2.43.0.windows.1');
|
|
80
|
-
throw enoent(file);
|
|
81
|
-
});
|
|
82
|
-
mockedExists.mockImplementation((p) => p === realGitPath);
|
|
83
|
-
const probe = probeGit();
|
|
84
|
-
expect(probe.installed).toBe(true);
|
|
85
|
-
expect(probe.source).toBe('where');
|
|
86
|
-
expect(probe.path).toBe(realGitPath);
|
|
87
|
-
expect(probe.version).toContain('git version 2.43.0');
|
|
88
|
-
});
|
|
89
|
-
it('prepends the resolved git directory to PATH', () => {
|
|
90
|
-
const realGitPath = 'C:\\Program Files\\Git\\cmd\\git.exe';
|
|
91
|
-
mockedExec.mockImplementation((file) => {
|
|
92
|
-
if (file === 'git')
|
|
93
|
-
throw enoent('git');
|
|
94
|
-
if (file === 'where.exe')
|
|
95
|
-
return Buffer.from(`${realGitPath}\r\n`);
|
|
96
|
-
if (file === realGitPath)
|
|
97
|
-
return Buffer.from('git version 2.43.0');
|
|
98
|
-
throw enoent(file);
|
|
99
|
-
});
|
|
100
|
-
mockedExists.mockReturnValue(true);
|
|
101
|
-
probeGit();
|
|
102
|
-
expect(process.env.PATH?.split(';')[0]).toBe('C:\\Program Files\\Git\\cmd');
|
|
103
|
-
});
|
|
104
|
-
it('also mirrors the new value into Path (case variant) when present', () => {
|
|
105
|
-
process.env.Path = process.env.PATH; // simulate Windows where Path is set
|
|
106
|
-
const realGitPath = 'C:\\Program Files\\Git\\cmd\\git.exe';
|
|
107
|
-
mockedExec.mockImplementation((file) => {
|
|
108
|
-
if (file === 'git')
|
|
109
|
-
throw enoent('git');
|
|
110
|
-
if (file === 'where.exe')
|
|
111
|
-
return Buffer.from(`${realGitPath}\r\n`);
|
|
112
|
-
if (file === realGitPath)
|
|
113
|
-
return Buffer.from('git version 2.43.0');
|
|
114
|
-
throw enoent(file);
|
|
115
|
-
});
|
|
116
|
-
mockedExists.mockReturnValue(true);
|
|
117
|
-
probeGit();
|
|
118
|
-
expect(process.env.Path).toBe(process.env.PATH);
|
|
119
|
-
});
|
|
120
|
-
it('prefers .exe match when where.exe lists multiple candidates', () => {
|
|
121
|
-
const exePath = 'C:\\Program Files\\Git\\cmd\\git.exe';
|
|
122
|
-
const cmdShim = 'C:\\Users\\test\\.runwork\\bin\\git';
|
|
123
|
-
mockedExec.mockImplementation((file) => {
|
|
124
|
-
if (file === 'git')
|
|
125
|
-
throw enoent('git');
|
|
126
|
-
if (file === 'where.exe')
|
|
127
|
-
return Buffer.from(`${cmdShim}\r\n${exePath}\r\n`);
|
|
128
|
-
if (file === exePath)
|
|
129
|
-
return Buffer.from('git version 2.43.0');
|
|
130
|
-
throw enoent(file);
|
|
131
|
-
});
|
|
132
|
-
mockedExists.mockImplementation((p) => p === exePath || p === cmdShim);
|
|
133
|
-
const probe = probeGit();
|
|
134
|
-
expect(probe.path).toBe(exePath);
|
|
135
|
-
});
|
|
136
|
-
it('falls back to the registry when where.exe fails', () => {
|
|
137
|
-
const installRoot = 'C:\\Program Files\\Git';
|
|
138
|
-
const gitExe = 'C:\\Program Files\\Git\\cmd\\git.exe';
|
|
139
|
-
mockedExec.mockImplementation((file, args) => {
|
|
140
|
-
if (file === 'git')
|
|
141
|
-
throw enoent('git');
|
|
142
|
-
if (file === 'where.exe')
|
|
143
|
-
throw enoent('where.exe');
|
|
144
|
-
if (file === 'reg.exe') {
|
|
145
|
-
// Only HKLM has a value; HKCU returns nothing (we throw to mimic).
|
|
146
|
-
const key = args?.[1] ?? '';
|
|
147
|
-
if (key.includes('HKLM')) {
|
|
148
|
-
return Buffer.from('HKEY_LOCAL_MACHINE\\SOFTWARE\\GitForWindows\r\n' +
|
|
149
|
-
` InstallPath REG_SZ ${installRoot}\r\n`);
|
|
150
|
-
}
|
|
151
|
-
throw enoent('reg.exe');
|
|
152
|
-
}
|
|
153
|
-
if (file === gitExe)
|
|
154
|
-
return Buffer.from('git version 2.43.0');
|
|
155
|
-
throw enoent(file);
|
|
156
|
-
});
|
|
157
|
-
mockedExists.mockImplementation((p) => p === gitExe);
|
|
158
|
-
const probe = probeGit();
|
|
159
|
-
expect(probe.installed).toBe(true);
|
|
160
|
-
expect(probe.source).toBe('registry');
|
|
161
|
-
expect(probe.path).toBe(gitExe);
|
|
162
|
-
expect(process.env.PATH?.split(';')[0]).toBe('C:\\Program Files\\Git\\cmd');
|
|
163
|
-
});
|
|
164
|
-
it('honours HKCU\\Software\\GitForWindows when HKLM is empty', () => {
|
|
165
|
-
const installRoot = 'C:\\Users\\test\\AppData\\Local\\Programs\\Git';
|
|
166
|
-
const gitExe = 'C:\\Users\\test\\AppData\\Local\\Programs\\Git\\cmd\\git.exe';
|
|
167
|
-
mockedExec.mockImplementation((file, args) => {
|
|
168
|
-
if (file === 'git')
|
|
169
|
-
throw enoent('git');
|
|
170
|
-
if (file === 'where.exe')
|
|
171
|
-
throw enoent('where.exe');
|
|
172
|
-
if (file === 'reg.exe') {
|
|
173
|
-
const key = args?.[1] ?? '';
|
|
174
|
-
if (key.includes('HKLM'))
|
|
175
|
-
throw enoent('reg.exe');
|
|
176
|
-
if (key.includes('HKCU')) {
|
|
177
|
-
return Buffer.from('HKEY_CURRENT_USER\\Software\\GitForWindows\r\n' +
|
|
178
|
-
` InstallPath REG_SZ ${installRoot}\r\n`);
|
|
179
|
-
}
|
|
180
|
-
throw enoent('reg.exe');
|
|
181
|
-
}
|
|
182
|
-
if (file === gitExe)
|
|
183
|
-
return Buffer.from('git version 2.43.0');
|
|
184
|
-
throw enoent(file);
|
|
185
|
-
});
|
|
186
|
-
mockedExists.mockImplementation((p) => p === gitExe);
|
|
187
|
-
const probe = probeGit();
|
|
188
|
-
expect(probe.installed).toBe(true);
|
|
189
|
-
expect(probe.source).toBe('registry');
|
|
190
|
-
expect(probe.path).toBe(gitExe);
|
|
191
|
-
});
|
|
192
|
-
it('falls back to canonical install path when where.exe and registry both fail', () => {
|
|
193
|
-
const canonical = 'C:\\Program Files\\Git\\cmd\\git.exe';
|
|
194
|
-
mockedExec.mockImplementation((file) => {
|
|
195
|
-
if (file === 'git')
|
|
196
|
-
throw enoent('git');
|
|
197
|
-
if (file === 'where.exe')
|
|
198
|
-
throw enoent('where.exe');
|
|
199
|
-
if (file === 'reg.exe')
|
|
200
|
-
throw enoent('reg.exe');
|
|
201
|
-
if (file === canonical)
|
|
202
|
-
return Buffer.from('git version 2.43.0');
|
|
203
|
-
throw enoent(file);
|
|
204
|
-
});
|
|
205
|
-
mockedExists.mockImplementation((p) => p === canonical);
|
|
206
|
-
const probe = probeGit();
|
|
207
|
-
expect(probe.installed).toBe(true);
|
|
208
|
-
expect(probe.source).toBe('canonical');
|
|
209
|
-
expect(probe.path).toBe(canonical);
|
|
210
|
-
expect(process.env.PATH?.split(';')[0]).toBe('C:\\Program Files\\Git\\cmd');
|
|
211
|
-
});
|
|
212
|
-
it('finds a portable MinGit dropped under ~/.runwork/tools/mingit', () => {
|
|
213
|
-
const portable = 'C:\\Users\\test\\.runwork\\tools\\mingit\\cmd\\git.exe';
|
|
214
|
-
mockedExec.mockImplementation((file) => {
|
|
215
|
-
if (file === 'git')
|
|
216
|
-
throw enoent('git');
|
|
217
|
-
if (file === 'where.exe')
|
|
218
|
-
throw enoent('where.exe');
|
|
219
|
-
if (file === 'reg.exe')
|
|
220
|
-
throw enoent('reg.exe');
|
|
221
|
-
if (file === portable)
|
|
222
|
-
return Buffer.from('git version 2.45.0.windows.1');
|
|
223
|
-
throw enoent(file);
|
|
224
|
-
});
|
|
225
|
-
mockedExists.mockImplementation((p) => p === portable);
|
|
226
|
-
const probe = probeGit();
|
|
227
|
-
expect(probe.installed).toBe(true);
|
|
228
|
-
expect(probe.source).toBe('canonical');
|
|
229
|
-
expect(probe.path).toBe(portable);
|
|
230
|
-
});
|
|
231
|
-
it('finds a Scoop install at ~/scoop/apps/git/current/cmd/git.exe', () => {
|
|
232
|
-
const scoop = 'C:\\Users\\test\\scoop\\apps\\git\\current\\cmd\\git.exe';
|
|
233
|
-
mockedExec.mockImplementation((file) => {
|
|
234
|
-
if (file === 'git')
|
|
235
|
-
throw enoent('git');
|
|
236
|
-
if (file === 'where.exe')
|
|
237
|
-
throw enoent('where.exe');
|
|
238
|
-
if (file === 'reg.exe')
|
|
239
|
-
throw enoent('reg.exe');
|
|
240
|
-
if (file === scoop)
|
|
241
|
-
return Buffer.from('git version 2.45.0');
|
|
242
|
-
throw enoent(file);
|
|
243
|
-
});
|
|
244
|
-
mockedExists.mockImplementation((p) => p === scoop);
|
|
245
|
-
const probe = probeGit();
|
|
246
|
-
expect(probe.installed).toBe(true);
|
|
247
|
-
expect(probe.path).toBe(scoop);
|
|
248
|
-
});
|
|
249
|
-
it('returns installed=false when nothing resolves and preserves the bare-call error', () => {
|
|
250
|
-
mockedExec.mockImplementation((file) => { throw enoent(file); });
|
|
251
|
-
mockedExists.mockReturnValue(false);
|
|
252
|
-
const probe = probeGit();
|
|
253
|
-
expect(probe.installed).toBe(false);
|
|
254
|
-
expect(probe.error?.code).toBe('ENOENT');
|
|
255
|
-
expect(probe.error?.path).toBe('git');
|
|
256
|
-
// No PATH side-effect when nothing was resolved.
|
|
257
|
-
expect(process.env.PATH?.startsWith('C:\\Windows\\system32')).toBe(true);
|
|
258
|
-
});
|
|
259
|
-
it('caches the probe result across calls and stops re-spawning git', () => {
|
|
260
|
-
const realGitPath = 'C:\\Program Files\\Git\\cmd\\git.exe';
|
|
261
|
-
mockedExec.mockImplementation((file) => {
|
|
262
|
-
if (file === 'git')
|
|
263
|
-
throw enoent('git');
|
|
264
|
-
if (file === 'where.exe')
|
|
265
|
-
return Buffer.from(`${realGitPath}\r\n`);
|
|
266
|
-
if (file === realGitPath)
|
|
267
|
-
return Buffer.from('git version 2.43.0');
|
|
268
|
-
throw enoent(file);
|
|
269
|
-
});
|
|
270
|
-
mockedExists.mockReturnValue(true);
|
|
271
|
-
const first = probeGit();
|
|
272
|
-
const callsAfterFirst = mockedExec.mock.calls.length;
|
|
273
|
-
const second = probeGit();
|
|
274
|
-
expect(second).toBe(first);
|
|
275
|
-
expect(mockedExec.mock.calls.length).toBe(callsAfterFirst);
|
|
276
|
-
});
|
|
277
|
-
it('does not double-prepend PATH on repeat probes after a cache reset', () => {
|
|
278
|
-
const realGitPath = 'C:\\Program Files\\Git\\cmd\\git.exe';
|
|
279
|
-
mockedExec.mockImplementation((file) => {
|
|
280
|
-
if (file === 'git')
|
|
281
|
-
throw enoent('git');
|
|
282
|
-
if (file === 'where.exe')
|
|
283
|
-
return Buffer.from(`${realGitPath}\r\n`);
|
|
284
|
-
if (file === realGitPath)
|
|
285
|
-
return Buffer.from('git version 2.43.0');
|
|
286
|
-
throw enoent(file);
|
|
287
|
-
});
|
|
288
|
-
mockedExists.mockReturnValue(true);
|
|
289
|
-
probeGit();
|
|
290
|
-
const pathAfterFirst = process.env.PATH;
|
|
291
|
-
resetGitProbeCache();
|
|
292
|
-
probeGit();
|
|
293
|
-
expect(process.env.PATH).toBe(pathAfterFirst);
|
|
294
|
-
});
|
|
295
|
-
it('skips canonical paths whose env var is unset', () => {
|
|
296
|
-
delete process.env.ProgramFiles;
|
|
297
|
-
delete process.env['ProgramFiles(x86)'];
|
|
298
|
-
delete process.env.LOCALAPPDATA;
|
|
299
|
-
// Only the hard-coded "C:\\Program Files\\Git\\cmd\\git.exe" default
|
|
300
|
-
// remains. Make existsSync reject it too -- nothing should resolve.
|
|
301
|
-
mockedExec.mockImplementation((file) => { throw enoent(file); });
|
|
302
|
-
mockedExists.mockReturnValue(false);
|
|
303
|
-
const probe = probeGit();
|
|
304
|
-
expect(probe.installed).toBe(false);
|
|
305
|
-
});
|
|
306
|
-
});
|
|
307
|
-
describe('probeGit -- non-Windows hosts skip the fallback', () => {
|
|
308
|
-
let originalPlatform;
|
|
309
|
-
beforeEach(() => {
|
|
310
|
-
resetGitProbeCache();
|
|
311
|
-
originalPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
|
|
312
|
-
Object.defineProperty(process, 'platform', { value: 'darwin', writable: true, configurable: true });
|
|
313
|
-
mockedExec.mockReset();
|
|
314
|
-
mockedExists.mockReset();
|
|
315
|
-
});
|
|
316
|
-
afterEach(() => {
|
|
317
|
-
if (originalPlatform)
|
|
318
|
-
Object.defineProperty(process, 'platform', originalPlatform);
|
|
319
|
-
});
|
|
320
|
-
it('does not invoke where.exe on macOS when bare lookup fails', () => {
|
|
321
|
-
mockedExec.mockImplementation((file) => { throw enoent(file); });
|
|
322
|
-
mockedExists.mockReturnValue(true);
|
|
323
|
-
const probe = probeGit();
|
|
324
|
-
expect(probe.installed).toBe(false);
|
|
325
|
-
const calledFiles = mockedExec.mock.calls.map((c) => c[0]);
|
|
326
|
-
expect(calledFiles).toContain('git');
|
|
327
|
-
expect(calledFiles).not.toContain('where.exe');
|
|
328
|
-
});
|
|
329
|
-
it('returns immediately on bare-call success without further probing', () => {
|
|
330
|
-
mockedExec.mockImplementation((file) => {
|
|
331
|
-
if (file === 'git')
|
|
332
|
-
return Buffer.from('git version 2.45.0');
|
|
333
|
-
throw enoent(file);
|
|
334
|
-
});
|
|
335
|
-
mockedExists.mockReturnValue(false);
|
|
336
|
-
const probe = probeGit();
|
|
337
|
-
expect(probe.installed).toBe(true);
|
|
338
|
-
expect(probe.source).toBe('PATH');
|
|
339
|
-
expect(probe.path).toBe('git');
|
|
340
|
-
expect(mockedExists).not.toHaveBeenCalled();
|
|
341
|
-
});
|
|
342
|
-
});
|
|
343
|
-
describe('parseGitVersion', () => {
|
|
344
|
-
it('extracts a semver-ish number from `git --version` output', () => {
|
|
345
|
-
expect(parseGitVersion('git version 2.43.0')).toBe('2.43.0');
|
|
346
|
-
expect(parseGitVersion('git version 2.43.0.windows.1')).toBe('2.43.0');
|
|
347
|
-
expect(parseGitVersion('git version 2.45')).toBe('2.45');
|
|
348
|
-
});
|
|
349
|
-
it('returns null for unparsable input', () => {
|
|
350
|
-
expect(parseGitVersion(undefined)).toBeNull();
|
|
351
|
-
expect(parseGitVersion('')).toBeNull();
|
|
352
|
-
expect(parseGitVersion('not a version')).toBeNull();
|
|
353
|
-
});
|
|
354
|
-
});
|
|
355
|
-
describe('buildMissingGitMessage with a probe error', () => {
|
|
356
|
-
it('appends the underlying error message when one is present', () => {
|
|
357
|
-
const err = new Error('spawn git ENOENT');
|
|
358
|
-
err.code = 'ENOENT';
|
|
359
|
-
const msg = buildMissingGitMessage('clone', { installed: false, error: err });
|
|
360
|
-
expect(msg).toContain('Underlying error: spawn git ENOENT');
|
|
361
|
-
});
|
|
362
|
-
it('omits the underlying-error footer when no probe is supplied', () => {
|
|
363
|
-
const msg = buildMissingGitMessage('clone');
|
|
364
|
-
expect(msg).not.toContain('Underlying error');
|
|
365
|
-
});
|
|
366
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { probeGit, buildMissingGitMessage } from '../preflight.js';
|
|
3
|
-
describe('probeGit', () => {
|
|
4
|
-
it('reports installed=true when git is on PATH (CI invariant)', () => {
|
|
5
|
-
// The CLI test suite already shells out to git in many other tests, so
|
|
6
|
-
// we treat git as a hard prerequisite for this package's own tests.
|
|
7
|
-
const probe = probeGit();
|
|
8
|
-
expect(probe.installed).toBe(true);
|
|
9
|
-
expect(probe.version).toMatch(/^git version /);
|
|
10
|
-
});
|
|
11
|
-
});
|
|
12
|
-
describe('buildMissingGitMessage', () => {
|
|
13
|
-
it('mentions the failing command name', () => {
|
|
14
|
-
const msg = buildMissingGitMessage('clone');
|
|
15
|
-
expect(msg).toContain('runwork clone');
|
|
16
|
-
});
|
|
17
|
-
it('lists install hints for all three OSes', () => {
|
|
18
|
-
const msg = buildMissingGitMessage('dev');
|
|
19
|
-
expect(msg).toMatch(/macOS/);
|
|
20
|
-
expect(msg).toMatch(/Windows/);
|
|
21
|
-
expect(msg).toMatch(/Linux/);
|
|
22
|
-
});
|
|
23
|
-
it('ends with a verification command', () => {
|
|
24
|
-
const msg = buildMissingGitMessage('init');
|
|
25
|
-
expect(msg).toContain('git --version');
|
|
26
|
-
});
|
|
27
|
-
it('only includes the Windows-shell-PATH hint when running on Windows', () => {
|
|
28
|
-
const msg = buildMissingGitMessage('clone');
|
|
29
|
-
if (process.platform === 'win32') {
|
|
30
|
-
expect(msg).toMatch(/cached when it opened/);
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
expect(msg).not.toMatch(/cached when it opened/);
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
-
vi.mock('child_process');
|
|
3
|
-
const mockExecFileSync = (await import('child_process')).execFileSync;
|
|
4
|
-
const { hardenRepoForRestrictedFs } = await import('../repo-config.js');
|
|
5
|
-
describe('git/repo-config hardenRepoForRestrictedFs', () => {
|
|
6
|
-
beforeEach(() => vi.clearAllMocks());
|
|
7
|
-
it('disables gc.auto and maintenance.auto in the repo (local scope)', () => {
|
|
8
|
-
mockExecFileSync.mockReturnValue(Buffer.from(''));
|
|
9
|
-
hardenRepoForRestrictedFs('/repo');
|
|
10
|
-
const configCalls = mockExecFileSync.mock.calls
|
|
11
|
-
.filter((c) => c[0] === 'git' && c[1][0] === 'config')
|
|
12
|
-
.map((c) => c[1].slice(1));
|
|
13
|
-
expect(configCalls).toContainEqual(['gc.auto', '0']);
|
|
14
|
-
expect(configCalls).toContainEqual(['maintenance.auto', 'false']);
|
|
15
|
-
// Repo scope, not --global.
|
|
16
|
-
expect(configCalls.every((args) => !args.includes('--global'))).toBe(true);
|
|
17
|
-
// Run against the given cwd.
|
|
18
|
-
for (const call of mockExecFileSync.mock.calls) {
|
|
19
|
-
expect(call[2].cwd).toBe('/repo');
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
it('never throws when git config fails (best-effort)', () => {
|
|
23
|
-
mockExecFileSync.mockImplementation(() => { throw new Error('git unavailable'); });
|
|
24
|
-
expect(() => hardenRepoForRestrictedFs('/repo')).not.toThrow();
|
|
25
|
-
});
|
|
26
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|