gipity 1.0.355 → 1.0.365
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/capture/sources/claude-code.js +76 -11
- package/dist/commands/add.js +44 -27
- package/dist/commands/generate.js +16 -13
- package/dist/commands/page-eval.js +42 -3
- package/dist/commands/page-inspect.js +32 -4
- package/dist/commands/page-screenshot.js +34 -23
- package/dist/commands/page-test.js +86 -0
- package/dist/commands/page.js +5 -3
- package/dist/commands/service.js +56 -0
- package/dist/commands/skill.js +2 -1
- package/dist/commands/text.js +148 -0
- package/dist/commands/workflow.js +10 -14
- package/dist/config.js +8 -1
- package/dist/help-skills.js +1 -0
- package/dist/helpers/output.js +7 -1
- package/dist/helpers/text-analysis.js +200 -0
- package/dist/hooks/capture-runner.js +32 -8
- package/dist/index.js +31 -2
- package/dist/knowledge.js +13 -3
- package/dist/relay/daemon.js +11 -1
- package/dist/relay/stream-json.js +45 -8
- package/dist/setup.js +18 -4
- package/dist/sync.js +14 -2
- package/package.json +8 -7
- package/dist/__tests__/adopt-cwd.test.d.ts +0 -1
- package/dist/__tests__/adopt-cwd.test.js +0 -176
- package/dist/__tests__/adopt-cwd.test.js.map +0 -1
- package/dist/__tests__/capture-transcript.test.d.ts +0 -1
- package/dist/__tests__/capture-transcript.test.js +0 -92
- package/dist/__tests__/capture-transcript.test.js.map +0 -1
- package/dist/__tests__/claude-noninteractive.test.d.ts +0 -1
- package/dist/__tests__/claude-noninteractive.test.js +0 -92
- package/dist/__tests__/claude-noninteractive.test.js.map +0 -1
- package/dist/__tests__/claude-trust.test.d.ts +0 -1
- package/dist/__tests__/claude-trust.test.js +0 -71
- package/dist/__tests__/claude-trust.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-add.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-add.test.js +0 -45
- package/dist/__tests__/cli-cmd-add.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-agent.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-agent.test.js +0 -76
- package/dist/__tests__/cli-cmd-agent.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-approval.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-approval.test.js +0 -47
- package/dist/__tests__/cli-cmd-approval.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-audit.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-audit.test.js +0 -33
- package/dist/__tests__/cli-cmd-audit.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-chat.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-chat.test.js +0 -94
- package/dist/__tests__/cli-cmd-chat.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-credits.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-credits.test.js +0 -66
- package/dist/__tests__/cli-cmd-credits.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-db.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-db.test.js +0 -95
- package/dist/__tests__/cli-cmd-db.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-deploy.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-deploy.test.js +0 -53
- package/dist/__tests__/cli-cmd-deploy.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-domain.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-domain.test.js +0 -73
- package/dist/__tests__/cli-cmd-domain.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-email.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-email.test.js +0 -31
- package/dist/__tests__/cli-cmd-email.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-file.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-file.test.js +0 -86
- package/dist/__tests__/cli-cmd-file.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-fn.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-fn.test.js +0 -50
- package/dist/__tests__/cli-cmd-fn.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-generate.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-generate.test.js +0 -46
- package/dist/__tests__/cli-cmd-generate.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-gmail.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-gmail.test.js +0 -49
- package/dist/__tests__/cli-cmd-gmail.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-info.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-info.test.js +0 -52
- package/dist/__tests__/cli-cmd-info.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-init.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-init.test.js +0 -76
- package/dist/__tests__/cli-cmd-init.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-job.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-job.test.js +0 -204
- package/dist/__tests__/cli-cmd-job.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-location.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-location.test.js +0 -58
- package/dist/__tests__/cli-cmd-location.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-login.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-login.test.js +0 -41
- package/dist/__tests__/cli-cmd-login.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-logout.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-logout.test.js +0 -20
- package/dist/__tests__/cli-cmd-logout.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-logs.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-logs.test.js +0 -40
- package/dist/__tests__/cli-cmd-logs.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-memory.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-memory.test.js +0 -58
- package/dist/__tests__/cli-cmd-memory.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-page-inspect.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-page-inspect.test.js +0 -47
- package/dist/__tests__/cli-cmd-page-inspect.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-page.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-page.test.js +0 -90
- package/dist/__tests__/cli-cmd-page.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-plan.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-plan.test.js +0 -81
- package/dist/__tests__/cli-cmd-plan.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-project.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-project.test.js +0 -61
- package/dist/__tests__/cli-cmd-project.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-rbac.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-rbac.test.js +0 -39
- package/dist/__tests__/cli-cmd-rbac.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-realtime.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-realtime.test.js +0 -51
- package/dist/__tests__/cli-cmd-realtime.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-records.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-records.test.js +0 -67
- package/dist/__tests__/cli-cmd-records.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-relay.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-relay.test.js +0 -100
- package/dist/__tests__/cli-cmd-relay.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-sandbox.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-sandbox.test.js +0 -46
- package/dist/__tests__/cli-cmd-sandbox.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-scaffold.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-scaffold.test.js +0 -30
- package/dist/__tests__/cli-cmd-scaffold.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-skill.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-skill.test.js +0 -40
- package/dist/__tests__/cli-cmd-skill.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-test.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-test.test.js +0 -58
- package/dist/__tests__/cli-cmd-test.test.js.map +0 -1
- package/dist/__tests__/cli-cmd-workflow.test.d.ts +0 -1
- package/dist/__tests__/cli-cmd-workflow.test.js +0 -84
- package/dist/__tests__/cli-cmd-workflow.test.js.map +0 -1
- package/dist/__tests__/cli-e2e-live.test.d.ts +0 -1
- package/dist/__tests__/cli-e2e-live.test.js +0 -144
- package/dist/__tests__/cli-e2e-live.test.js.map +0 -1
- package/dist/__tests__/cli-smoke.test.d.ts +0 -1
- package/dist/__tests__/cli-smoke.test.js +0 -69
- package/dist/__tests__/cli-smoke.test.js.map +0 -1
- package/dist/__tests__/config.test.d.ts +0 -1
- package/dist/__tests__/config.test.js +0 -95
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/flag-aliases.test.d.ts +0 -1
- package/dist/__tests__/flag-aliases.test.js +0 -53
- package/dist/__tests__/flag-aliases.test.js.map +0 -1
- package/dist/__tests__/helpers/mock-server.d.ts +0 -52
- package/dist/__tests__/helpers/mock-server.js +0 -86
- package/dist/__tests__/helpers/mock-server.js.map +0 -1
- package/dist/__tests__/helpers/spawn-cli.d.ts +0 -30
- package/dist/__tests__/helpers/spawn-cli.js +0 -72
- package/dist/__tests__/helpers/spawn-cli.js.map +0 -1
- package/dist/__tests__/helpers/test-home.d.ts +0 -22
- package/dist/__tests__/helpers/test-home.js +0 -35
- package/dist/__tests__/helpers/test-home.js.map +0 -1
- package/dist/__tests__/hook-capture.test.d.ts +0 -1
- package/dist/__tests__/hook-capture.test.js +0 -65
- package/dist/__tests__/hook-capture.test.js.map +0 -1
- package/dist/__tests__/prompts.test.d.ts +0 -1
- package/dist/__tests__/prompts.test.js +0 -129
- package/dist/__tests__/prompts.test.js.map +0 -1
- package/dist/__tests__/push-cas.test.d.ts +0 -1
- package/dist/__tests__/push-cas.test.js +0 -133
- package/dist/__tests__/push-cas.test.js.map +0 -1
- package/dist/__tests__/relay-bridge-abort.test.d.ts +0 -1
- package/dist/__tests__/relay-bridge-abort.test.js +0 -65
- package/dist/__tests__/relay-bridge-abort.test.js.map +0 -1
- package/dist/__tests__/relay-daemon.test.d.ts +0 -1
- package/dist/__tests__/relay-daemon.test.js +0 -232
- package/dist/__tests__/relay-daemon.test.js.map +0 -1
- package/dist/__tests__/relay-ingest-contract.test.d.ts +0 -1
- package/dist/__tests__/relay-ingest-contract.test.js +0 -76
- package/dist/__tests__/relay-ingest-contract.test.js.map +0 -1
- package/dist/__tests__/relay-installers.test.d.ts +0 -1
- package/dist/__tests__/relay-installers.test.js +0 -95
- package/dist/__tests__/relay-installers.test.js.map +0 -1
- package/dist/__tests__/relay-machine-id.test.d.ts +0 -1
- package/dist/__tests__/relay-machine-id.test.js +0 -41
- package/dist/__tests__/relay-machine-id.test.js.map +0 -1
- package/dist/__tests__/relay-pair.test.d.ts +0 -1
- package/dist/__tests__/relay-pair.test.js.map +0 -1
- package/dist/__tests__/relay-redact.test.d.ts +0 -1
- package/dist/__tests__/relay-redact.test.js +0 -78
- package/dist/__tests__/relay-redact.test.js.map +0 -1
- package/dist/__tests__/relay-state.test.d.ts +0 -1
- package/dist/__tests__/relay-state.test.js +0 -85
- package/dist/__tests__/relay-state.test.js.map +0 -1
- package/dist/__tests__/setup-skills-block.test.d.ts +0 -1
- package/dist/__tests__/setup-skills-block.test.js +0 -65
- package/dist/__tests__/setup-skills-block.test.js.map +0 -1
- package/dist/__tests__/stream-json.test.d.ts +0 -1
- package/dist/__tests__/stream-json.test.js +0 -186
- package/dist/__tests__/stream-json.test.js.map +0 -1
- package/dist/__tests__/sync-apply.test.d.ts +0 -1
- package/dist/__tests__/sync-apply.test.js +0 -457
- package/dist/__tests__/sync-apply.test.js.map +0 -1
- package/dist/__tests__/sync-lock.test.d.ts +0 -1
- package/dist/__tests__/sync-lock.test.js +0 -105
- package/dist/__tests__/sync-lock.test.js.map +0 -1
- package/dist/__tests__/sync.test.d.ts +0 -1
- package/dist/__tests__/sync.test.js +0 -160
- package/dist/__tests__/sync.test.js.map +0 -1
- package/dist/__tests__/template-vars.test.d.ts +0 -1
- package/dist/__tests__/template-vars.test.js +0 -119
- package/dist/__tests__/template-vars.test.js.map +0 -1
- package/dist/__tests__/updater.test.d.ts +0 -1
- package/dist/__tests__/updater.test.js +0 -95
- package/dist/__tests__/updater.test.js.map +0 -1
- package/dist/__tests__/upload.test.d.ts +0 -1
- package/dist/__tests__/upload.test.js +0 -92
- package/dist/__tests__/upload.test.js.map +0 -1
- package/dist/__tests__/utils.test.d.ts +0 -1
- package/dist/__tests__/utils.test.js +0 -69
- package/dist/__tests__/utils.test.js.map +0 -1
- package/dist/adopt-cwd.d.ts +0 -69
- package/dist/adopt-cwd.js.map +0 -1
- package/dist/api.d.ts +0 -41
- package/dist/api.js.map +0 -1
- package/dist/auth.d.ts +0 -17
- package/dist/auth.js.map +0 -1
- package/dist/banner.d.ts +0 -6
- package/dist/banner.js.map +0 -1
- package/dist/capture/sources/claude-code.d.ts +0 -78
- package/dist/capture/sources/claude-code.js.map +0 -1
- package/dist/coding-guidelines.d.ts +0 -9
- package/dist/coding-guidelines.js.map +0 -1
- package/dist/colors.d.ts +0 -22
- package/dist/colors.js.map +0 -1
- package/dist/commands/add.d.ts +0 -2
- package/dist/commands/add.js.map +0 -1
- package/dist/commands/agent.d.ts +0 -2
- package/dist/commands/agent.js.map +0 -1
- package/dist/commands/api.d.ts +0 -1
- package/dist/commands/api.js.map +0 -1
- package/dist/commands/approval.d.ts +0 -2
- package/dist/commands/approval.js.map +0 -1
- package/dist/commands/audit.d.ts +0 -2
- package/dist/commands/audit.js.map +0 -1
- package/dist/commands/browser.d.ts +0 -2
- package/dist/commands/browser.js.map +0 -1
- package/dist/commands/chat.d.ts +0 -2
- package/dist/commands/chat.js.map +0 -1
- package/dist/commands/checkpoint.d.ts +0 -2
- package/dist/commands/checkpoint.js.map +0 -1
- package/dist/commands/claude.d.ts +0 -16
- package/dist/commands/claude.js.map +0 -1
- package/dist/commands/credits.d.ts +0 -2
- package/dist/commands/credits.js.map +0 -1
- package/dist/commands/db.d.ts +0 -2
- package/dist/commands/db.js.map +0 -1
- package/dist/commands/deploy.d.ts +0 -2
- package/dist/commands/deploy.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -2
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/domain.d.ts +0 -2
- package/dist/commands/domain.js.map +0 -1
- package/dist/commands/email.d.ts +0 -2
- package/dist/commands/email.js.map +0 -1
- package/dist/commands/file.d.ts +0 -2
- package/dist/commands/file.js.map +0 -1
- package/dist/commands/fn.d.ts +0 -2
- package/dist/commands/fn.js.map +0 -1
- package/dist/commands/generate.d.ts +0 -2
- package/dist/commands/generate.js.map +0 -1
- package/dist/commands/gmail.d.ts +0 -2
- package/dist/commands/gmail.js.map +0 -1
- package/dist/commands/hook-capture.d.ts +0 -15
- package/dist/commands/hook-capture.js.map +0 -1
- package/dist/commands/init.d.ts +0 -2
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/job.d.ts +0 -2
- package/dist/commands/job.js.map +0 -1
- package/dist/commands/location.d.ts +0 -9
- package/dist/commands/location.js.map +0 -1
- package/dist/commands/login.d.ts +0 -2
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/logout.d.ts +0 -2
- package/dist/commands/logout.js.map +0 -1
- package/dist/commands/logs.d.ts +0 -2
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/memory.d.ts +0 -2
- package/dist/commands/memory.js.map +0 -1
- package/dist/commands/page-eval.d.ts +0 -2
- package/dist/commands/page-eval.js.map +0 -1
- package/dist/commands/page-inspect.d.ts +0 -2
- package/dist/commands/page-inspect.js.map +0 -1
- package/dist/commands/page-screenshot.d.ts +0 -2
- package/dist/commands/page-screenshot.js.map +0 -1
- package/dist/commands/page.d.ts +0 -2
- package/dist/commands/page.js.map +0 -1
- package/dist/commands/plan.d.ts +0 -2
- package/dist/commands/plan.js.map +0 -1
- package/dist/commands/project.d.ts +0 -2
- package/dist/commands/project.js.map +0 -1
- package/dist/commands/push.d.ts +0 -2
- package/dist/commands/push.js.map +0 -1
- package/dist/commands/rbac.d.ts +0 -2
- package/dist/commands/rbac.js.map +0 -1
- package/dist/commands/realtime.d.ts +0 -2
- package/dist/commands/realtime.js.map +0 -1
- package/dist/commands/records.d.ts +0 -2
- package/dist/commands/records.js.map +0 -1
- package/dist/commands/relay-install.d.ts +0 -11
- package/dist/commands/relay-install.js.map +0 -1
- package/dist/commands/relay.d.ts +0 -9
- package/dist/commands/relay.js.map +0 -1
- package/dist/commands/sandbox.d.ts +0 -2
- package/dist/commands/sandbox.js.map +0 -1
- package/dist/commands/scaffold.d.ts +0 -2
- package/dist/commands/scaffold.js.map +0 -1
- package/dist/commands/skill.d.ts +0 -2
- package/dist/commands/skill.js.map +0 -1
- package/dist/commands/skills.d.ts +0 -2
- package/dist/commands/skills.js.map +0 -1
- package/dist/commands/start-cc.d.ts +0 -2
- package/dist/commands/start-cc.js.map +0 -1
- package/dist/commands/status.d.ts +0 -2
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/sync.d.ts +0 -2
- package/dist/commands/sync.js.map +0 -1
- package/dist/commands/test.d.ts +0 -2
- package/dist/commands/test.js.map +0 -1
- package/dist/commands/uninstall.d.ts +0 -10
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/commands/update.d.ts +0 -2
- package/dist/commands/update.js.map +0 -1
- package/dist/commands/upload.d.ts +0 -2
- package/dist/commands/upload.js.map +0 -1
- package/dist/commands/workflow.d.ts +0 -2
- package/dist/commands/workflow.js.map +0 -1
- package/dist/config.d.ts +0 -39
- package/dist/config.js.map +0 -1
- package/dist/flag-aliases.d.ts +0 -17
- package/dist/flag-aliases.js.map +0 -1
- package/dist/gip3dw-guide.d.ts +0 -7
- package/dist/gip3dw-guide.js.map +0 -1
- package/dist/gipcc.d.ts +0 -2
- package/dist/gipcc.js.map +0 -1
- package/dist/gipccd.d.ts +0 -2
- package/dist/gipccd.js.map +0 -1
- package/dist/help-skills.d.ts +0 -7
- package/dist/help-skills.js.map +0 -1
- package/dist/helpers/command.d.ts +0 -12
- package/dist/helpers/command.js.map +0 -1
- package/dist/helpers/index.d.ts +0 -6
- package/dist/helpers/index.js.map +0 -1
- package/dist/helpers/output.d.ts +0 -22
- package/dist/helpers/output.js.map +0 -1
- package/dist/helpers/sync.d.ts +0 -13
- package/dist/helpers/sync.js.map +0 -1
- package/dist/hooks/capture-runner.d.ts +0 -24
- package/dist/hooks/capture-runner.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js.map +0 -1
- package/dist/knowledge.d.ts +0 -11
- package/dist/knowledge.js.map +0 -1
- package/dist/platform-overview.d.ts +0 -9
- package/dist/platform-overview.js.map +0 -1
- package/dist/project-setup.d.ts +0 -29
- package/dist/project-setup.js.map +0 -1
- package/dist/prompts.d.ts +0 -80
- package/dist/prompts.js.map +0 -1
- package/dist/provider-docs.d.ts +0 -27
- package/dist/provider-docs.js.map +0 -1
- package/dist/relay/daemon.d.ts +0 -47
- package/dist/relay/daemon.js.map +0 -1
- package/dist/relay/device-http.d.ts +0 -9
- package/dist/relay/device-http.js.map +0 -1
- package/dist/relay/installers.d.ts +0 -24
- package/dist/relay/installers.js.map +0 -1
- package/dist/relay/machine-id.d.ts +0 -2
- package/dist/relay/machine-id.js.map +0 -1
- package/dist/relay/onboarding.d.ts +0 -8
- package/dist/relay/onboarding.js.map +0 -1
- package/dist/relay/paths.d.ts +0 -5
- package/dist/relay/paths.js.map +0 -1
- package/dist/relay/redact.d.ts +0 -34
- package/dist/relay/redact.js.map +0 -1
- package/dist/relay/state.d.ts +0 -39
- package/dist/relay/state.js.map +0 -1
- package/dist/relay/stream-json.d.ts +0 -105
- package/dist/relay/stream-json.js.map +0 -1
- package/dist/relay/transcripts.d.ts +0 -60
- package/dist/relay/transcripts.js.map +0 -1
- package/dist/setup.d.ts +0 -101
- package/dist/setup.js.map +0 -1
- package/dist/sync.d.ts +0 -74
- package/dist/sync.js.map +0 -1
- package/dist/template-vars.d.ts +0 -32
- package/dist/template-vars.js.map +0 -1
- package/dist/updater/bootstrap.d.ts +0 -13
- package/dist/updater/bootstrap.js.map +0 -1
- package/dist/updater/check.d.ts +0 -12
- package/dist/updater/check.js.map +0 -1
- package/dist/updater/shim.d.ts +0 -2
- package/dist/updater/shim.js.map +0 -1
- package/dist/updater/state.d.ts +0 -24
- package/dist/updater/state.js.map +0 -1
- package/dist/upload.d.ts +0 -40
- package/dist/upload.js.map +0 -1
- package/dist/utils.d.ts +0 -39
- package/dist/utils.js.map +0 -1
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
|
-
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'fs';
|
|
4
|
-
import { tmpdir } from 'os';
|
|
5
|
-
import { join } from 'path';
|
|
6
|
-
import { plan, formatPlan, walkLocal } from '../sync.js';
|
|
7
|
-
function remote(path, sha, sv = 1, size = 100) {
|
|
8
|
-
return { path, size, sha256: sha, serverVersion: sv, modified: '2024-01-01' };
|
|
9
|
-
}
|
|
10
|
-
function local(size = 100, sha) {
|
|
11
|
-
return { size, mtime: '2024-01-01', sha256: sha };
|
|
12
|
-
}
|
|
13
|
-
function baselineOf(sha, sv = 1, size = 100) {
|
|
14
|
-
return { size, mtime: '2024-01-01', sha256: sha, serverVersion: sv };
|
|
15
|
-
}
|
|
16
|
-
describe('plan() - 9-cell decision table', () => {
|
|
17
|
-
it('unchanged × unchanged → noop (no action)', () => {
|
|
18
|
-
const p = plan(new Map([['foo', local(100, 'h1')]]), new Map([['foo', remote('foo', 'h1', 5)]]), { foo: baselineOf('h1', 5) });
|
|
19
|
-
assert.equal(p.actions.length, 0);
|
|
20
|
-
});
|
|
21
|
-
it('unchanged × modified → download', () => {
|
|
22
|
-
const p = plan(new Map([['foo', local(100, 'h1')]]), new Map([['foo', remote('foo', 'h2', 6)]]), { foo: baselineOf('h1', 5) });
|
|
23
|
-
assert.equal(p.actions.length, 1);
|
|
24
|
-
assert.equal(p.actions[0].kind, 'download');
|
|
25
|
-
});
|
|
26
|
-
it('unchanged × deleted → delete-local', () => {
|
|
27
|
-
const p = plan(new Map([['foo', local(100, 'h1')]]), new Map(), { foo: baselineOf('h1', 5) });
|
|
28
|
-
assert.equal(p.actions.length, 1);
|
|
29
|
-
assert.equal(p.actions[0].kind, 'delete-local');
|
|
30
|
-
});
|
|
31
|
-
it('modified × unchanged → upload with CAS=baseline.serverVersion', () => {
|
|
32
|
-
const p = plan(new Map([['foo', local(100, 'h-local-new')]]), new Map([['foo', remote('foo', 'h1', 5)]]), { foo: baselineOf('h1', 5) });
|
|
33
|
-
assert.equal(p.actions.length, 1);
|
|
34
|
-
assert.equal(p.actions[0].kind, 'upload');
|
|
35
|
-
assert.equal(p.actions[0].expectedServerVersion, 5);
|
|
36
|
-
});
|
|
37
|
-
it('modified × modified (shas differ) → conflict', () => {
|
|
38
|
-
const p = plan(new Map([['foo', local(100, 'h-local')]]), new Map([['foo', remote('foo', 'h-remote', 6)]]), { foo: baselineOf('h-base', 5) });
|
|
39
|
-
assert.equal(p.actions.length, 1);
|
|
40
|
-
assert.equal(p.actions[0].kind, 'conflict');
|
|
41
|
-
assert.ok(p.actions[0].renamedLocalTo);
|
|
42
|
-
assert.ok(p.actions[0].renamedLocalTo.includes('conflict from'));
|
|
43
|
-
});
|
|
44
|
-
it('modified × modified (shas happen to match) → noop', () => {
|
|
45
|
-
const p = plan(new Map([['foo', local(100, 'h-new')]]), new Map([['foo', remote('foo', 'h-new', 6)]]), { foo: baselineOf('h-base', 5) });
|
|
46
|
-
assert.equal(p.actions.length, 0);
|
|
47
|
-
});
|
|
48
|
-
it('modified × deleted → re-upload as new (expected=null)', () => {
|
|
49
|
-
const p = plan(new Map([['foo', local(100, 'h-local')]]), new Map(), { foo: baselineOf('h-base', 5) });
|
|
50
|
-
assert.equal(p.actions.length, 1);
|
|
51
|
-
assert.equal(p.actions[0].kind, 'upload');
|
|
52
|
-
assert.equal(p.actions[0].expectedServerVersion, null);
|
|
53
|
-
});
|
|
54
|
-
it('added × absent → upload as new (expected=null)', () => {
|
|
55
|
-
const p = plan(new Map([['foo', local(100, 'h1')]]), new Map(), {});
|
|
56
|
-
assert.equal(p.actions.length, 1);
|
|
57
|
-
assert.equal(p.actions[0].kind, 'upload');
|
|
58
|
-
assert.equal(p.actions[0].expectedServerVersion, null);
|
|
59
|
-
});
|
|
60
|
-
it('added × added (shas match) → noop', () => {
|
|
61
|
-
const p = plan(new Map([['foo', local(100, 'h1')]]), new Map([['foo', remote('foo', 'h1', 1)]]), {});
|
|
62
|
-
assert.equal(p.actions.length, 0);
|
|
63
|
-
});
|
|
64
|
-
it('added × added (shas differ) → conflict', () => {
|
|
65
|
-
const p = plan(new Map([['foo', local(100, 'h-local')]]), new Map([['foo', remote('foo', 'h-remote', 1)]]), {});
|
|
66
|
-
assert.equal(p.actions.length, 1);
|
|
67
|
-
assert.equal(p.actions[0].kind, 'conflict');
|
|
68
|
-
});
|
|
69
|
-
it('deleted × unchanged → delete-remote with CAS=baseline.serverVersion', () => {
|
|
70
|
-
const p = plan(new Map(), new Map([['foo', remote('foo', 'h1', 5)]]), { foo: baselineOf('h1', 5) });
|
|
71
|
-
assert.equal(p.actions.length, 1);
|
|
72
|
-
assert.equal(p.actions[0].kind, 'delete-remote');
|
|
73
|
-
assert.equal(p.actions[0].expectedServerVersion, 5);
|
|
74
|
-
});
|
|
75
|
-
it('deleted × modified → download (remote preserved)', () => {
|
|
76
|
-
const p = plan(new Map(), new Map([['foo', remote('foo', 'h-new', 6)]]), { foo: baselineOf('h-base', 5) });
|
|
77
|
-
assert.equal(p.actions.length, 1);
|
|
78
|
-
assert.equal(p.actions[0].kind, 'download');
|
|
79
|
-
});
|
|
80
|
-
it('deleted × deleted → noop (baseline dropped silently)', () => {
|
|
81
|
-
const p = plan(new Map(), new Map(), { foo: baselineOf('h1', 5) });
|
|
82
|
-
assert.equal(p.actions.length, 0);
|
|
83
|
-
});
|
|
84
|
-
it('absent × added → download (remote added since last sync)', () => {
|
|
85
|
-
const p = plan(new Map(), new Map([['foo', remote('foo', 'h1', 1)]]), {});
|
|
86
|
-
assert.equal(p.actions.length, 1);
|
|
87
|
-
assert.equal(p.actions[0].kind, 'download');
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
describe('plan() - summary counts', () => {
|
|
91
|
-
it('counts uploads, downloads, conflicts, deletes correctly', () => {
|
|
92
|
-
const p = plan(new Map([
|
|
93
|
-
['add', local(100, 'a1')], // → upload
|
|
94
|
-
['mod', local(100, 'm2')], // → upload (CAS)
|
|
95
|
-
['keep', local(100, 'k1')], // unchanged
|
|
96
|
-
['conflict', local(100, 'cL')], // → conflict
|
|
97
|
-
['delremote', local(100, 'd1')], // unchanged, remote deletes → delete-local
|
|
98
|
-
]), new Map([
|
|
99
|
-
['mod', remote('mod', 'm1', 5)],
|
|
100
|
-
['keep', remote('keep', 'k1', 3)],
|
|
101
|
-
['conflict', remote('conflict', 'cR', 7)],
|
|
102
|
-
['remote-new', remote('remote-new', 'r1', 1)], // → download
|
|
103
|
-
]), {
|
|
104
|
-
mod: baselineOf('m1', 5),
|
|
105
|
-
keep: baselineOf('k1', 3),
|
|
106
|
-
conflict: baselineOf('cBase', 6),
|
|
107
|
-
delremote: baselineOf('d1', 4),
|
|
108
|
-
});
|
|
109
|
-
assert.equal(p.uploads, 2);
|
|
110
|
-
assert.equal(p.downloads, 1);
|
|
111
|
-
assert.equal(p.deletesLocal, 1);
|
|
112
|
-
assert.equal(p.conflicts, 1);
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
describe('formatPlan', () => {
|
|
116
|
-
it('returns "Up to date." for empty plan', () => {
|
|
117
|
-
const p = plan(new Map(), new Map(), {});
|
|
118
|
-
assert.equal(formatPlan(p), 'Up to date.');
|
|
119
|
-
});
|
|
120
|
-
it('includes action counts in the summary line', () => {
|
|
121
|
-
const p = plan(new Map([['foo', local(100, 'h1')]]), new Map(), {});
|
|
122
|
-
const out = formatPlan(p);
|
|
123
|
-
assert.ok(out.includes('1 upload'));
|
|
124
|
-
assert.ok(out.includes('↑ foo'));
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
describe('walkLocal - nested-project boundary', () => {
|
|
128
|
-
it('does not descend into a subdirectory carrying its own .gipity.json', () => {
|
|
129
|
-
const root = mkdtempSync(join(tmpdir(), 'gipity-walk-'));
|
|
130
|
-
try {
|
|
131
|
-
writeFileSync(join(root, 'a.txt'), 'a');
|
|
132
|
-
mkdirSync(join(root, 'sub'));
|
|
133
|
-
writeFileSync(join(root, 'sub', 'b.txt'), 'b');
|
|
134
|
-
mkdirSync(join(root, 'nested'));
|
|
135
|
-
writeFileSync(join(root, 'nested', '.gipity.json'), '{}');
|
|
136
|
-
writeFileSync(join(root, 'nested', 'c.txt'), 'c');
|
|
137
|
-
const result = walkLocal(root, [], {});
|
|
138
|
-
assert.ok(result.has('a.txt'));
|
|
139
|
-
assert.ok(result.has('sub/b.txt'), 'ordinary subdirectories are still walked');
|
|
140
|
-
assert.equal(result.has('nested/c.txt'), false, 'files of a nested Gipity project must not be scooped by the parent');
|
|
141
|
-
assert.equal(result.has('nested/.gipity.json'), false);
|
|
142
|
-
}
|
|
143
|
-
finally {
|
|
144
|
-
rmSync(root, { recursive: true, force: true });
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
it('still walks a project root that has its own .gipity.json', () => {
|
|
148
|
-
const root = mkdtempSync(join(tmpdir(), 'gipity-walk-'));
|
|
149
|
-
try {
|
|
150
|
-
writeFileSync(join(root, '.gipity.json'), '{}');
|
|
151
|
-
writeFileSync(join(root, 'a.txt'), 'a');
|
|
152
|
-
const result = walkLocal(root, ['.gipity.json'], {});
|
|
153
|
-
assert.ok(result.has('a.txt'), 'the boundary check applies to subdirs, never the root itself');
|
|
154
|
-
}
|
|
155
|
-
finally {
|
|
156
|
-
rmSync(root, { recursive: true, force: true });
|
|
157
|
-
}
|
|
158
|
-
});
|
|
159
|
-
});
|
|
160
|
-
//# sourceMappingURL=sync.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sync.test.js","sourceRoot":"","sources":["../../src/__tests__/sync.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for the template-var substitution that `gipity init` runs before
|
|
3
|
-
* syncing local files up. The bug it guards against: karaoke-captions shipped
|
|
4
|
-
* literal `{{PROJECT_GUID}}` to production because init didn't substitute,
|
|
5
|
-
* every fn-call 404'd, and no error reached the Dashboard because the
|
|
6
|
-
* analytics script wasn't loaded either.
|
|
7
|
-
*/
|
|
8
|
-
import { describe, it } from 'node:test';
|
|
9
|
-
import assert from 'node:assert/strict';
|
|
10
|
-
import { mkdtempSync, mkdirSync, writeFileSync, readFileSync, rmSync } from 'fs';
|
|
11
|
-
import { tmpdir } from 'os';
|
|
12
|
-
import { join } from 'path';
|
|
13
|
-
import { buildTemplateVars, substituteString, substituteDir, KNOWN_PLACEHOLDERS, } from '../template-vars.js';
|
|
14
|
-
describe('buildTemplateVars', () => {
|
|
15
|
-
it('produces a value for every KNOWN_PLACEHOLDERS key', () => {
|
|
16
|
-
const vars = buildTemplateVars({ projectGuid: 'p_abc12345', projectName: 'My App' });
|
|
17
|
-
for (const key of KNOWN_PLACEHOLDERS) {
|
|
18
|
-
assert.ok(key in vars, `missing substitution for ${key}`);
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
it('html-escapes the title', () => {
|
|
22
|
-
const vars = buildTemplateVars({ projectGuid: 'p_x', projectName: '<script>alert(1)</script>' });
|
|
23
|
-
assert.equal(vars['{{TITLE}}'], '<script>alert(1)</script>');
|
|
24
|
-
});
|
|
25
|
-
it('embeds projectGuid in the analytics script data-app attribute', () => {
|
|
26
|
-
const vars = buildTemplateVars({ projectGuid: 'p_kmunc98x', projectName: 'X' });
|
|
27
|
-
assert.match(vars['{{ANALYTICS_SCRIPT}}'], /data-app="p_kmunc98x"/);
|
|
28
|
-
});
|
|
29
|
-
it('omits meta tags when no description is provided', () => {
|
|
30
|
-
const vars = buildTemplateVars({ projectGuid: 'p_x', projectName: 'X' });
|
|
31
|
-
assert.equal(vars['{{DESCRIPTION_META}}'], '');
|
|
32
|
-
assert.equal(vars['{{OG_DESCRIPTION}}'], '');
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
describe('substituteString', () => {
|
|
36
|
-
it('replaces all known placeholders', () => {
|
|
37
|
-
const vars = buildTemplateVars({ projectGuid: 'p_abc', projectName: 'Acme' });
|
|
38
|
-
const out = substituteString(`const APP_GUID = '{{PROJECT_GUID}}';\n<title>{{TITLE}}</title>`, vars);
|
|
39
|
-
assert.match(out, /APP_GUID = 'p_abc'/);
|
|
40
|
-
assert.match(out, /<title>Acme<\/title>/);
|
|
41
|
-
assert.doesNotMatch(out, /\{\{PROJECT_GUID\}\}/);
|
|
42
|
-
assert.doesNotMatch(out, /\{\{TITLE\}\}/);
|
|
43
|
-
});
|
|
44
|
-
it('leaves unrelated content alone', () => {
|
|
45
|
-
const vars = buildTemplateVars({ projectGuid: 'p_x', projectName: 'X' });
|
|
46
|
-
const input = `const x = "{{NOT_A_TEMPLATE_VAR}}"; // user content`;
|
|
47
|
-
assert.equal(substituteString(input, vars), input);
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
describe('substituteDir', () => {
|
|
51
|
-
function makeTmpProject() {
|
|
52
|
-
const dir = mkdtempSync(join(tmpdir(), 'gipity-tmpl-test-'));
|
|
53
|
-
return { dir, cleanup: () => rmSync(dir, { recursive: true, force: true }) };
|
|
54
|
-
}
|
|
55
|
-
it('rewrites every file that contains a known placeholder', async () => {
|
|
56
|
-
const { dir, cleanup } = makeTmpProject();
|
|
57
|
-
try {
|
|
58
|
-
mkdirSync(join(dir, 'src', 'js'), { recursive: true });
|
|
59
|
-
writeFileSync(join(dir, 'src', 'index.html'), `<title>{{TITLE}}</title>\n{{ANALYTICS_SCRIPT}}`);
|
|
60
|
-
writeFileSync(join(dir, 'src', 'js', 'main.js'), `const APP_GUID = '{{PROJECT_GUID}}';`);
|
|
61
|
-
writeFileSync(join(dir, 'src', 'image.png'), Buffer.from([0x89, 0x50]));
|
|
62
|
-
const result = await substituteDir(dir, { projectGuid: 'p_xyz98765', projectName: 'Caption Test 05' });
|
|
63
|
-
assert.equal(result.changed.length, 2, `changed: ${JSON.stringify(result.changed)}`);
|
|
64
|
-
assert.equal(result.unresolved.length, 0);
|
|
65
|
-
const html = readFileSync(join(dir, 'src', 'index.html'), 'utf-8');
|
|
66
|
-
assert.match(html, /<title>Caption Test 05<\/title>/);
|
|
67
|
-
assert.match(html, /data-app="p_xyz98765"/);
|
|
68
|
-
const js = readFileSync(join(dir, 'src', 'js', 'main.js'), 'utf-8');
|
|
69
|
-
assert.equal(js, `const APP_GUID = 'p_xyz98765';`);
|
|
70
|
-
}
|
|
71
|
-
finally {
|
|
72
|
-
cleanup();
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
it('flags placeholders we don\'t know about as unresolved', async () => {
|
|
76
|
-
const { dir, cleanup } = makeTmpProject();
|
|
77
|
-
try {
|
|
78
|
-
writeFileSync(join(dir, 'README.md'), `Hello {{FUTURE_THING}} world.`);
|
|
79
|
-
const result = await substituteDir(dir, { projectGuid: 'p_x', projectName: 'X' });
|
|
80
|
-
assert.equal(result.changed.length, 0);
|
|
81
|
-
assert.equal(result.unresolved.length, 1);
|
|
82
|
-
assert.deepEqual(result.unresolved[0].tokens, ['{{FUTURE_THING}}']);
|
|
83
|
-
}
|
|
84
|
-
finally {
|
|
85
|
-
cleanup();
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
it('does not touch files without any placeholder', async () => {
|
|
89
|
-
const { dir, cleanup } = makeTmpProject();
|
|
90
|
-
try {
|
|
91
|
-
writeFileSync(join(dir, 'plain.js'), `const x = 1;`);
|
|
92
|
-
const result = await substituteDir(dir, { projectGuid: 'p_x', projectName: 'X' });
|
|
93
|
-
assert.equal(result.changed.length, 0);
|
|
94
|
-
assert.equal(result.unresolved.length, 0);
|
|
95
|
-
assert.equal(readFileSync(join(dir, 'plain.js'), 'utf-8'), `const x = 1;`);
|
|
96
|
-
}
|
|
97
|
-
finally {
|
|
98
|
-
cleanup();
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
it('post-condition: no known placeholders remain in any rewritten file', async () => {
|
|
102
|
-
// This is the regression guard for the karaoke shipped-`{{PROJECT_GUID}}` bug.
|
|
103
|
-
const { dir, cleanup } = makeTmpProject();
|
|
104
|
-
try {
|
|
105
|
-
for (const key of KNOWN_PLACEHOLDERS) {
|
|
106
|
-
writeFileSync(join(dir, `${key.replace(/[{}]/g, '')}.html`), key);
|
|
107
|
-
}
|
|
108
|
-
await substituteDir(dir, { projectGuid: 'p_real', projectName: 'Real' });
|
|
109
|
-
for (const key of KNOWN_PLACEHOLDERS) {
|
|
110
|
-
const content = readFileSync(join(dir, `${key.replace(/[{}]/g, '')}.html`), 'utf-8');
|
|
111
|
-
assert.doesNotMatch(content, new RegExp(key.replace(/[{}]/g, '\\$&')), `placeholder ${key} leaked into deployed content`);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
finally {
|
|
115
|
-
cleanup();
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
//# sourceMappingURL=template-vars.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"template-vars.test.js","sourceRoot":"","sources":["../../src/__tests__/template-vars.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { describe, it, before, after, beforeEach } from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
|
-
import { mkdtempSync, writeFileSync, mkdirSync } from 'fs';
|
|
4
|
-
import { tmpdir } from 'os';
|
|
5
|
-
import { join } from 'path';
|
|
6
|
-
import { compareSemver } from '../updater/check.js';
|
|
7
|
-
describe('compareSemver', () => {
|
|
8
|
-
it('treats equal versions as 0', () => {
|
|
9
|
-
assert.equal(compareSemver('1.2.3', '1.2.3'), 0);
|
|
10
|
-
});
|
|
11
|
-
it('detects patch bumps', () => {
|
|
12
|
-
assert.ok(compareSemver('1.0.10', '1.0.9') > 0);
|
|
13
|
-
assert.ok(compareSemver('1.0.9', '1.0.10') < 0);
|
|
14
|
-
});
|
|
15
|
-
it('detects minor bumps', () => {
|
|
16
|
-
assert.ok(compareSemver('1.2.0', '1.1.99') > 0);
|
|
17
|
-
});
|
|
18
|
-
it('detects major bumps', () => {
|
|
19
|
-
assert.ok(compareSemver('2.0.0', '1.99.99') > 0);
|
|
20
|
-
});
|
|
21
|
-
it('treats missing components as zero', () => {
|
|
22
|
-
assert.equal(compareSemver('1.0', '1.0.0'), 0);
|
|
23
|
-
assert.ok(compareSemver('1.0.1', '1.0') > 0);
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
// state.ts reads HOME at import time via state file paths; we have to swap
|
|
27
|
-
// HOME before requiring it, then re-import via dynamic import each test.
|
|
28
|
-
describe('state + settings (with isolated HOME)', () => {
|
|
29
|
-
let originalHome;
|
|
30
|
-
let tmpHome;
|
|
31
|
-
before(() => {
|
|
32
|
-
originalHome = process.env['HOME'];
|
|
33
|
-
});
|
|
34
|
-
beforeEach(() => {
|
|
35
|
-
tmpHome = mkdtempSync(join(tmpdir(), 'gipity-test-'));
|
|
36
|
-
process.env['HOME'] = tmpHome;
|
|
37
|
-
// Clear env knobs that other tests might have set.
|
|
38
|
-
delete process.env['DISABLE_AUTOUPDATER'];
|
|
39
|
-
delete process.env['CI'];
|
|
40
|
-
});
|
|
41
|
-
after(() => {
|
|
42
|
-
if (originalHome)
|
|
43
|
-
process.env['HOME'] = originalHome;
|
|
44
|
-
else
|
|
45
|
-
delete process.env['HOME'];
|
|
46
|
-
});
|
|
47
|
-
// Note: state.ts captures HOME at module-load time via top-level
|
|
48
|
-
// `join(homedir(), '.gipity')`. The first import wins. We work around this
|
|
49
|
-
// by computing paths ourselves and only using state.ts's pure functions.
|
|
50
|
-
it('readState returns defaults when no file exists', async () => {
|
|
51
|
-
const mod = await import(`../updater/state.js?cachebust=${Date.now()}`);
|
|
52
|
-
// GIPITY_DIR may be cached to original HOME - force-create the path the
|
|
53
|
-
// module is actually using, then assert defaults shape.
|
|
54
|
-
const s = mod.readState();
|
|
55
|
-
assert.equal(typeof s.lastCheckAt, 'number');
|
|
56
|
-
assert.equal(s.updateChannel, 'stable');
|
|
57
|
-
});
|
|
58
|
-
it('updatesDisabled respects DISABLE_AUTOUPDATER=1', async () => {
|
|
59
|
-
process.env['DISABLE_AUTOUPDATER'] = '1';
|
|
60
|
-
const mod = await import(`../updater/state.js?cachebust=${Date.now() + 1}`);
|
|
61
|
-
const r = mod.updatesDisabled();
|
|
62
|
-
assert.equal(r.disabled, true);
|
|
63
|
-
assert.match(r.reason ?? '', /DISABLE_AUTOUPDATER/);
|
|
64
|
-
});
|
|
65
|
-
it('updatesDisabled respects CI', async () => {
|
|
66
|
-
process.env['CI'] = '1';
|
|
67
|
-
const mod = await import(`../updater/state.js?cachebust=${Date.now() + 2}`);
|
|
68
|
-
const r = mod.updatesDisabled();
|
|
69
|
-
assert.equal(r.disabled, true);
|
|
70
|
-
assert.match(r.reason ?? '', /CI/);
|
|
71
|
-
});
|
|
72
|
-
it('round-trips state file', async () => {
|
|
73
|
-
const mod = await import(`../updater/state.js?cachebust=${Date.now() + 3}`);
|
|
74
|
-
mod.writeState({ installedVersion: '9.9.9', lastCheckAt: 12345, lastError: null, updateChannel: 'stable' });
|
|
75
|
-
const s = mod.readState();
|
|
76
|
-
assert.equal(s.installedVersion, '9.9.9');
|
|
77
|
-
assert.equal(s.lastCheckAt, 12345);
|
|
78
|
-
});
|
|
79
|
-
it('readState recovers from corrupt JSON', async () => {
|
|
80
|
-
const mod = await import(`../updater/state.js?cachebust=${Date.now() + 4}`);
|
|
81
|
-
mkdirSync(mod.GIPITY_DIR, { recursive: true });
|
|
82
|
-
writeFileSync(mod.STATE_FILE, '{not json');
|
|
83
|
-
const s = mod.readState();
|
|
84
|
-
assert.equal(s.installedVersion, null);
|
|
85
|
-
assert.equal(s.lastCheckAt, 0);
|
|
86
|
-
});
|
|
87
|
-
it('readSettings recovers from corrupt JSON', async () => {
|
|
88
|
-
const mod = await import(`../updater/state.js?cachebust=${Date.now() + 5}`);
|
|
89
|
-
mkdirSync(mod.GIPITY_DIR, { recursive: true });
|
|
90
|
-
writeFileSync(mod.SETTINGS_FILE, '{broken');
|
|
91
|
-
const s = mod.readSettings();
|
|
92
|
-
assert.equal(s.autoUpdates, true);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
//# sourceMappingURL=updater.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"updater.test.js","sourceRoot":"","sources":["../../src/__tests__/updater.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAU,aAAa,EAAc,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,2EAA2E;AAC3E,yEAAyE;AACzE,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,IAAI,YAAgC,CAAC;IACrC,IAAI,OAAe,CAAC;IAEpB,MAAM,CAAC,GAAG,EAAE;QACV,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;QAC9B,mDAAmD;QACnD,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,GAAG,EAAE;QACT,IAAI,YAAY;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC;;YAChD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,iEAAiE;IACjE,2EAA2E;IAC3E,yEAAyE;IAEzE,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iCAAiC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxE,wEAAwE;QACxE,wDAAwD;QACxD,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,GAAG,GAAG,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iCAAiC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,qBAAqB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QACxB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iCAAiC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iCAAiC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,GAAG,CAAC,UAAU,CAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5G,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iCAAiC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iCAAiC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,aAAa,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
|
-
import { writeFileSync, mkdtempSync, rmSync } from 'fs';
|
|
4
|
-
import { join } from 'path';
|
|
5
|
-
import { tmpdir } from 'os';
|
|
6
|
-
import { hashFile, guessMime } from '../upload.js';
|
|
7
|
-
describe('guessMime', () => {
|
|
8
|
-
it('detects common types from extension', () => {
|
|
9
|
-
assert.equal(guessMime('foo.html'), 'text/html');
|
|
10
|
-
assert.equal(guessMime('a/b/c.css'), 'text/css');
|
|
11
|
-
assert.equal(guessMime('img.png'), 'image/png');
|
|
12
|
-
assert.equal(guessMime('vid.mp4'), 'video/mp4');
|
|
13
|
-
assert.equal(guessMime('doc.pdf'), 'application/pdf');
|
|
14
|
-
});
|
|
15
|
-
it('falls back to application/octet-stream for unknown', () => {
|
|
16
|
-
assert.equal(guessMime('mystery'), 'application/octet-stream');
|
|
17
|
-
assert.equal(guessMime('x.weirdext'), 'application/octet-stream');
|
|
18
|
-
});
|
|
19
|
-
it('is case-insensitive on extension', () => {
|
|
20
|
-
assert.equal(guessMime('IMG.PNG'), 'image/png');
|
|
21
|
-
assert.equal(guessMime('Doc.PDF'), 'application/pdf');
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
describe('hashFile', () => {
|
|
25
|
-
let tmp;
|
|
26
|
-
function makeTmp() {
|
|
27
|
-
return mkdtempSync(join(tmpdir(), 'gipity-upload-test-'));
|
|
28
|
-
}
|
|
29
|
-
it('returns SHA-256 + size for a small text file', async () => {
|
|
30
|
-
tmp = makeTmp();
|
|
31
|
-
try {
|
|
32
|
-
const file = join(tmp, 'hello.txt');
|
|
33
|
-
writeFileSync(file, 'hello world');
|
|
34
|
-
const r = await hashFile(file);
|
|
35
|
-
assert.equal(r.size, 11);
|
|
36
|
-
// Known SHA-256 of "hello world"
|
|
37
|
-
assert.equal(r.sha256, 'b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9');
|
|
38
|
-
}
|
|
39
|
-
finally {
|
|
40
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
it('returns 0 size + empty-buf hash for an empty file', async () => {
|
|
44
|
-
tmp = makeTmp();
|
|
45
|
-
try {
|
|
46
|
-
const file = join(tmp, 'empty');
|
|
47
|
-
writeFileSync(file, '');
|
|
48
|
-
const r = await hashFile(file);
|
|
49
|
-
assert.equal(r.size, 0);
|
|
50
|
-
// SHA-256 of empty input
|
|
51
|
-
assert.equal(r.sha256, 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
|
|
52
|
-
}
|
|
53
|
-
finally {
|
|
54
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
it('handles binary content with null bytes', async () => {
|
|
58
|
-
tmp = makeTmp();
|
|
59
|
-
try {
|
|
60
|
-
const file = join(tmp, 'bin');
|
|
61
|
-
const buf = Buffer.from([0x00, 0xff, 0x10, 0x00, 0x42]);
|
|
62
|
-
writeFileSync(file, buf);
|
|
63
|
-
const r = await hashFile(file);
|
|
64
|
-
assert.equal(r.size, 5);
|
|
65
|
-
// Independent SHA-256 of those bytes
|
|
66
|
-
const { createHash } = await import('crypto');
|
|
67
|
-
const expected = createHash('sha256').update(buf).digest('hex');
|
|
68
|
-
assert.equal(r.sha256, expected);
|
|
69
|
-
}
|
|
70
|
-
finally {
|
|
71
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
it('streams correctly for a 1MB file', async () => {
|
|
75
|
-
tmp = makeTmp();
|
|
76
|
-
try {
|
|
77
|
-
const file = join(tmp, 'big');
|
|
78
|
-
const buf = Buffer.alloc(1024 * 1024);
|
|
79
|
-
for (let i = 0; i < buf.length; i++)
|
|
80
|
-
buf[i] = i % 256;
|
|
81
|
-
writeFileSync(file, buf);
|
|
82
|
-
const r = await hashFile(file);
|
|
83
|
-
assert.equal(r.size, 1024 * 1024);
|
|
84
|
-
const { createHash } = await import('crypto');
|
|
85
|
-
assert.equal(r.sha256, createHash('sha256').update(buf).digest('hex'));
|
|
86
|
-
}
|
|
87
|
-
finally {
|
|
88
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
//# sourceMappingURL=upload.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload.test.js","sourceRoot":"","sources":["../../src/__tests__/upload.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
|
-
import { decodeJwtExp, isBinaryFile, formatSize, formatAge } from '../utils.js';
|
|
4
|
-
describe('decodeJwtExp', () => {
|
|
5
|
-
it('extracts exp from a valid JWT', () => {
|
|
6
|
-
// Header: {"alg":"HS256"}, Payload: {"exp":1700000000}, Signature: fake
|
|
7
|
-
const header = Buffer.from('{"alg":"HS256"}').toString('base64url');
|
|
8
|
-
const payload = Buffer.from('{"exp":1700000000}').toString('base64url');
|
|
9
|
-
const token = `${header}.${payload}.fakesig`;
|
|
10
|
-
assert.equal(decodeJwtExp(token), 1700000000);
|
|
11
|
-
});
|
|
12
|
-
it('returns null for malformed token', () => {
|
|
13
|
-
assert.equal(decodeJwtExp('not.a.jwt'), null);
|
|
14
|
-
assert.equal(decodeJwtExp(''), null);
|
|
15
|
-
assert.equal(decodeJwtExp('onlyone'), null);
|
|
16
|
-
});
|
|
17
|
-
it('returns null when exp is missing', () => {
|
|
18
|
-
const header = Buffer.from('{"alg":"HS256"}').toString('base64url');
|
|
19
|
-
const payload = Buffer.from('{"sub":"user"}').toString('base64url');
|
|
20
|
-
const token = `${header}.${payload}.fakesig`;
|
|
21
|
-
assert.equal(decodeJwtExp(token), null);
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
describe('isBinaryFile', () => {
|
|
25
|
-
it('detects binary files (null bytes)', () => {
|
|
26
|
-
const buf = Buffer.from([0x48, 0x65, 0x00, 0x6c, 0x6f]);
|
|
27
|
-
assert.equal(isBinaryFile(buf), true);
|
|
28
|
-
});
|
|
29
|
-
it('detects text files', () => {
|
|
30
|
-
const buf = Buffer.from('Hello, world!', 'utf-8');
|
|
31
|
-
assert.equal(isBinaryFile(buf), false);
|
|
32
|
-
});
|
|
33
|
-
it('handles empty buffer', () => {
|
|
34
|
-
assert.equal(isBinaryFile(Buffer.alloc(0)), false);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
describe('formatSize', () => {
|
|
38
|
-
it('formats bytes', () => {
|
|
39
|
-
assert.equal(formatSize(0), '0 B');
|
|
40
|
-
assert.equal(formatSize(512), '512 B');
|
|
41
|
-
assert.equal(formatSize(1023), '1023 B');
|
|
42
|
-
});
|
|
43
|
-
it('formats kilobytes', () => {
|
|
44
|
-
assert.equal(formatSize(1024), '1.0 KB');
|
|
45
|
-
assert.equal(formatSize(1536), '1.5 KB');
|
|
46
|
-
});
|
|
47
|
-
it('formats megabytes', () => {
|
|
48
|
-
assert.equal(formatSize(1048576), '1.0 MB');
|
|
49
|
-
assert.equal(formatSize(2621440), '2.5 MB');
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
describe('formatAge', () => {
|
|
53
|
-
it('returns "just now" for recent timestamps', () => {
|
|
54
|
-
assert.equal(formatAge(new Date().toISOString()), 'just now');
|
|
55
|
-
});
|
|
56
|
-
it('returns minutes ago', () => {
|
|
57
|
-
const fiveMinAgo = new Date(Date.now() - 5 * 60 * 1000).toISOString();
|
|
58
|
-
assert.equal(formatAge(fiveMinAgo), '5m ago');
|
|
59
|
-
});
|
|
60
|
-
it('returns hours ago', () => {
|
|
61
|
-
const threeHoursAgo = new Date(Date.now() - 3 * 60 * 60 * 1000).toISOString();
|
|
62
|
-
assert.equal(formatAge(threeHoursAgo), '3h ago');
|
|
63
|
-
});
|
|
64
|
-
it('returns days ago', () => {
|
|
65
|
-
const twoDaysAgo = new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString();
|
|
66
|
-
assert.equal(formatAge(twoDaysAgo), '2d ago');
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
//# sourceMappingURL=utils.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../src/__tests__/utils.test.ts"],"names":[],"mappings":"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"}
|