@imgly/codesign-mcp 0.1.6 → 0.1.8
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/README.md +5 -10
- package/assets/docs/api/index.d.ts +9 -3
- package/assets/docs/guide/SKILL.md +2 -2
- package/assets/docs/guide/api/node/classes/creativeengine.md +13 -13
- package/assets/docs/guide/edit-image/transform/scale.md +1 -3
- package/assets/docs/guide/filters-and-effects/duotone.md +1 -1
- package/assets/docs/guide/get-started/bun.md +0 -2
- package/assets/docs/guide/get-started/deno.md +0 -1
- package/assets/docs/guide/get-started/vanilla.md +0 -2
- package/assets/docs/guide/import-media/default-assets.md +20 -24
- package/assets/docs/guide/plugins/print-ready-pdf.md +0 -2
- package/assets/docs/guide/serve-assets.md +80 -23
- package/assets/docs/handbook/SKILL.md +6 -7
- package/dist/assets/inline.generated.js +12 -12
- package/dist/assets/inline.generated.js.map +1 -1
- package/dist/cli/http.d.ts.map +1 -1
- package/dist/cli/http.js +29 -5
- package/dist/cli/http.js.map +1 -1
- package/dist/cli/stdio.d.ts.map +1 -1
- package/dist/cli/stdio.js +145 -48
- package/dist/cli/stdio.js.map +1 -1
- package/dist/cli/trial-license.generated.d.ts +1 -1
- package/dist/cli/trial-license.generated.js +1 -1
- package/dist/cli/trial-license.generated.js.map +1 -1
- package/dist/config.d.ts +17 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +20 -1
- package/dist/config.js.map +1 -1
- package/dist/diagnostics/bundle.d.ts +3 -0
- package/dist/diagnostics/bundle.d.ts.map +1 -1
- package/dist/diagnostics/bundle.js +25 -22
- package/dist/diagnostics/bundle.js.map +1 -1
- package/dist/diagnostics/events.d.ts +6 -0
- package/dist/diagnostics/events.d.ts.map +1 -1
- package/dist/diagnostics/events.js.map +1 -1
- package/dist/diagnostics/prompt.d.ts +3 -0
- package/dist/diagnostics/prompt.d.ts.map +1 -0
- package/dist/diagnostics/prompt.js +21 -0
- package/dist/diagnostics/prompt.js.map +1 -0
- package/dist/diagnostics/router.d.ts +12 -0
- package/dist/diagnostics/router.d.ts.map +1 -0
- package/dist/diagnostics/router.js +64 -0
- package/dist/diagnostics/router.js.map +1 -0
- package/dist/diagnostics/spa-assets.generated.d.ts.map +1 -0
- package/dist/diagnostics/spa-assets.generated.js +1231 -0
- package/dist/diagnostics/spa-assets.generated.js.map +1 -0
- package/dist/diagnostics/status.d.ts +38 -0
- package/dist/diagnostics/status.d.ts.map +1 -0
- package/dist/diagnostics/status.js +53 -0
- package/dist/diagnostics/status.js.map +1 -0
- package/dist/diagnostics/summary.d.ts +48 -0
- package/dist/diagnostics/summary.d.ts.map +1 -0
- package/dist/diagnostics/summary.js +116 -0
- package/dist/diagnostics/summary.js.map +1 -0
- package/dist/diagnostics/tool.d.ts +16 -0
- package/dist/diagnostics/tool.d.ts.map +1 -0
- package/dist/diagnostics/tool.js +90 -0
- package/dist/diagnostics/tool.js.map +1 -0
- package/dist/engine/asset-sources.d.ts +8 -0
- package/dist/engine/asset-sources.d.ts.map +1 -1
- package/dist/engine/asset-sources.js +9 -2
- package/dist/engine/asset-sources.js.map +1 -1
- package/dist/engine/cesdk-adapter.d.ts +5 -1
- package/dist/engine/cesdk-adapter.d.ts.map +1 -1
- package/dist/engine/cesdk-adapter.js +8 -1
- package/dist/engine/cesdk-adapter.js.map +1 -1
- package/dist/engine/engine-capacity.d.ts +16 -0
- package/dist/engine/engine-capacity.d.ts.map +1 -0
- package/dist/engine/engine-capacity.js +48 -0
- package/dist/engine/engine-capacity.js.map +1 -0
- package/dist/engine/engine-slots.d.ts +48 -0
- package/dist/engine/engine-slots.d.ts.map +1 -0
- package/dist/engine/engine-slots.js +182 -0
- package/dist/engine/engine-slots.js.map +1 -0
- package/dist/engine/uri-resolver.js.map +1 -1
- package/dist/server.d.ts +25 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +24 -4
- package/dist/server.js.map +1 -1
- package/dist/tools/engine.d.ts +92 -14
- package/dist/tools/engine.d.ts.map +1 -1
- package/dist/tools/engine.js +147 -20
- package/dist/tools/engine.js.map +1 -1
- package/dist/tools/export.d.ts.map +1 -1
- package/dist/tools/export.js +34 -4
- package/dist/tools/export.js.map +1 -1
- package/dist/tools/index.js +2 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/load.d.ts.map +1 -1
- package/dist/tools/load.js +26 -19
- package/dist/tools/load.js.map +1 -1
- package/dist/tools/preview.d.ts.map +1 -1
- package/dist/tools/preview.js +60 -40
- package/dist/tools/preview.js.map +1 -1
- package/dist/tools/{open-editor.d.ts → view.d.ts} +3 -3
- package/dist/tools/view.d.ts.map +1 -0
- package/dist/tools/{open-editor.js → view.js} +20 -18
- package/dist/tools/view.js.map +1 -0
- package/dist/viewer/listener.d.ts +2 -0
- package/dist/viewer/listener.d.ts.map +1 -1
- package/dist/viewer/listener.js +2 -0
- package/dist/viewer/listener.js.map +1 -1
- package/dist/viewer/presigned-r2-url-builder.d.ts +1 -1
- package/dist/viewer/presigned-r2-url-builder.js +1 -1
- package/dist/viewer/presigned-r2-url-builder.js.map +1 -1
- package/dist/viewer/router.d.ts.map +1 -1
- package/dist/viewer/router.js +8 -17
- package/dist/viewer/router.js.map +1 -1
- package/dist/viewer/session-mount.js.map +1 -1
- package/dist/viewer/spa-assets.generated.d.ts.map +1 -1
- package/dist/viewer/spa-assets.generated.js +750 -869
- package/dist/viewer/spa-assets.generated.js.map +1 -1
- package/dist/viewer/url-builder.d.ts +4 -3
- package/dist/viewer/url-builder.d.ts.map +1 -1
- package/dist/viewer/url-builder.js +4 -4
- package/dist/viewer/url-builder.js.map +1 -1
- package/package.json +7 -6
- package/dist/dashboard/router.d.ts +0 -3
- package/dist/dashboard/router.d.ts.map +0 -1
- package/dist/dashboard/router.js +0 -19
- package/dist/dashboard/router.js.map +0 -1
- package/dist/dashboard/spa-assets.generated.d.ts.map +0 -1
- package/dist/dashboard/spa-assets.generated.js +0 -220
- package/dist/dashboard/spa-assets.generated.js.map +0 -1
- package/dist/metrics/mount.d.ts +0 -11
- package/dist/metrics/mount.d.ts.map +0 -1
- package/dist/metrics/mount.js +0 -13
- package/dist/metrics/mount.js.map +0 -1
- package/dist/metrics/recorder.d.ts +0 -55
- package/dist/metrics/recorder.d.ts.map +0 -1
- package/dist/metrics/recorder.js +0 -97
- package/dist/metrics/recorder.js.map +0 -1
- package/dist/test/scripts/changelog-add.d.ts +0 -8
- package/dist/test/scripts/changelog-add.d.ts.map +0 -1
- package/dist/test/scripts/changelog-add.js +0 -50
- package/dist/test/scripts/changelog-add.js.map +0 -1
- package/dist/test/scripts/changelog-collate.d.ts +0 -38
- package/dist/test/scripts/changelog-collate.d.ts.map +0 -1
- package/dist/test/scripts/changelog-collate.js +0 -171
- package/dist/test/scripts/changelog-collate.js.map +0 -1
- package/dist/test/test/changelog.test.d.ts +0 -2
- package/dist/test/test/changelog.test.d.ts.map +0 -1
- package/dist/test/test/changelog.test.js +0 -293
- package/dist/test/test/changelog.test.js.map +0 -1
- package/dist/test/test/cli/dispatcher.test.d.ts +0 -2
- package/dist/test/test/cli/dispatcher.test.d.ts.map +0 -1
- package/dist/test/test/cli/dispatcher.test.js +0 -54
- package/dist/test/test/cli/dispatcher.test.js.map +0 -1
- package/dist/test/test/cli/redirect-console.test.d.ts +0 -2
- package/dist/test/test/cli/redirect-console.test.d.ts.map +0 -1
- package/dist/test/test/cli/redirect-console.test.js +0 -78
- package/dist/test/test/cli/redirect-console.test.js.map +0 -1
- package/dist/test/test/cli/resolve-license.test.d.ts +0 -2
- package/dist/test/test/cli/resolve-license.test.d.ts.map +0 -1
- package/dist/test/test/cli/resolve-license.test.js +0 -29
- package/dist/test/test/cli/resolve-license.test.js.map +0 -1
- package/dist/test/test/cli/stdio-diagnostics.test.d.ts +0 -2
- package/dist/test/test/cli/stdio-diagnostics.test.d.ts.map +0 -1
- package/dist/test/test/cli/stdio-diagnostics.test.js +0 -31
- package/dist/test/test/cli/stdio-diagnostics.test.js.map +0 -1
- package/dist/test/test/cli/stdio-license.test.d.ts +0 -2
- package/dist/test/test/cli/stdio-license.test.d.ts.map +0 -1
- package/dist/test/test/cli/stdio-license.test.js +0 -19
- package/dist/test/test/cli/stdio-license.test.js.map +0 -1
- package/dist/test/test/config.test.d.ts +0 -2
- package/dist/test/test/config.test.d.ts.map +0 -1
- package/dist/test/test/config.test.js +0 -95
- package/dist/test/test/config.test.js.map +0 -1
- package/dist/test/test/cross-ref.test.d.ts +0 -2
- package/dist/test/test/cross-ref.test.d.ts.map +0 -1
- package/dist/test/test/cross-ref.test.js +0 -39
- package/dist/test/test/cross-ref.test.js.map +0 -1
- package/dist/test/test/diagnostics/bundle.test.d.ts +0 -2
- package/dist/test/test/diagnostics/bundle.test.d.ts.map +0 -1
- package/dist/test/test/diagnostics/bundle.test.js +0 -53
- package/dist/test/test/diagnostics/bundle.test.js.map +0 -1
- package/dist/test/test/diagnostics/compose.test.d.ts +0 -2
- package/dist/test/test/diagnostics/compose.test.d.ts.map +0 -1
- package/dist/test/test/diagnostics/compose.test.js +0 -31
- package/dist/test/test/diagnostics/compose.test.js.map +0 -1
- package/dist/test/test/diagnostics/file-sink.test.d.ts +0 -2
- package/dist/test/test/diagnostics/file-sink.test.d.ts.map +0 -1
- package/dist/test/test/diagnostics/file-sink.test.js +0 -113
- package/dist/test/test/diagnostics/file-sink.test.js.map +0 -1
- package/dist/test/test/diagnostics/redact.test.d.ts +0 -2
- package/dist/test/test/diagnostics/redact.test.d.ts.map +0 -1
- package/dist/test/test/diagnostics/redact.test.js +0 -59
- package/dist/test/test/diagnostics/redact.test.js.map +0 -1
- package/dist/test/test/diagnostics/tool-call-adapter.test.d.ts +0 -2
- package/dist/test/test/diagnostics/tool-call-adapter.test.d.ts.map +0 -1
- package/dist/test/test/diagnostics/tool-call-adapter.test.js +0 -34
- package/dist/test/test/diagnostics/tool-call-adapter.test.js.map +0 -1
- package/dist/test/test/engine/asset-sources.test.d.ts +0 -2
- package/dist/test/test/engine/asset-sources.test.d.ts.map +0 -1
- package/dist/test/test/engine/asset-sources.test.js +0 -100
- package/dist/test/test/engine/asset-sources.test.js.map +0 -1
- package/dist/test/test/engine/cesdk-adapter.test.d.ts +0 -2
- package/dist/test/test/engine/cesdk-adapter.test.d.ts.map +0 -1
- package/dist/test/test/engine/cesdk-adapter.test.js +0 -32
- package/dist/test/test/engine/cesdk-adapter.test.js.map +0 -1
- package/dist/test/test/engine/mutex.test.d.ts +0 -2
- package/dist/test/test/engine/mutex.test.d.ts.map +0 -1
- package/dist/test/test/engine/mutex.test.js +0 -63
- package/dist/test/test/engine/mutex.test.js.map +0 -1
- package/dist/test/test/engine/session.test.d.ts +0 -2
- package/dist/test/test/engine/session.test.d.ts.map +0 -1
- package/dist/test/test/engine/session.test.js +0 -159
- package/dist/test/test/engine/session.test.js.map +0 -1
- package/dist/test/test/engine/unsplash-source.test.d.ts +0 -2
- package/dist/test/test/engine/unsplash-source.test.d.ts.map +0 -1
- package/dist/test/test/engine/unsplash-source.test.js +0 -129
- package/dist/test/test/engine/unsplash-source.test.js.map +0 -1
- package/dist/test/test/engine/uri-resolver.test.d.ts +0 -2
- package/dist/test/test/engine/uri-resolver.test.d.ts.map +0 -1
- package/dist/test/test/engine/uri-resolver.test.js +0 -38
- package/dist/test/test/engine/uri-resolver.test.js.map +0 -1
- package/dist/test/test/gateway/hosted-stub.test.d.ts +0 -2
- package/dist/test/test/gateway/hosted-stub.test.d.ts.map +0 -1
- package/dist/test/test/gateway/hosted-stub.test.js +0 -11
- package/dist/test/test/gateway/hosted-stub.test.js.map +0 -1
- package/dist/test/test/gateway/local.test.d.ts +0 -2
- package/dist/test/test/gateway/local.test.d.ts.map +0 -1
- package/dist/test/test/gateway/local.test.js +0 -29
- package/dist/test/test/gateway/local.test.js.map +0 -1
- package/dist/test/test/handbook-contract.test.d.ts +0 -2
- package/dist/test/test/handbook-contract.test.d.ts.map +0 -1
- package/dist/test/test/handbook-contract.test.js +0 -79
- package/dist/test/test/handbook-contract.test.js.map +0 -1
- package/dist/test/test/http/server.test.d.ts +0 -2
- package/dist/test/test/http/server.test.d.ts.map +0 -1
- package/dist/test/test/http/server.test.js +0 -338
- package/dist/test/test/http/server.test.js.map +0 -1
- package/dist/test/test/http/session-id-header.test.d.ts +0 -2
- package/dist/test/test/http/session-id-header.test.d.ts.map +0 -1
- package/dist/test/test/http/session-id-header.test.js +0 -76
- package/dist/test/test/http/session-id-header.test.js.map +0 -1
- package/dist/test/test/http/session-manager.test.d.ts +0 -2
- package/dist/test/test/http/session-manager.test.d.ts.map +0 -1
- package/dist/test/test/http/session-manager.test.js +0 -97
- package/dist/test/test/http/session-manager.test.js.map +0 -1
- package/dist/test/test/http/workspace-auth.test.d.ts +0 -2
- package/dist/test/test/http/workspace-auth.test.d.ts.map +0 -1
- package/dist/test/test/http/workspace-auth.test.js +0 -40
- package/dist/test/test/http/workspace-auth.test.js.map +0 -1
- package/dist/test/test/metrics/mount.test.d.ts +0 -2
- package/dist/test/test/metrics/mount.test.d.ts.map +0 -1
- package/dist/test/test/metrics/mount.test.js +0 -59
- package/dist/test/test/metrics/mount.test.js.map +0 -1
- package/dist/test/test/metrics/recorder.test.d.ts +0 -2
- package/dist/test/test/metrics/recorder.test.d.ts.map +0 -1
- package/dist/test/test/metrics/recorder.test.js +0 -118
- package/dist/test/test/metrics/recorder.test.js.map +0 -1
- package/dist/test/test/revisions/hash.test.d.ts +0 -2
- package/dist/test/test/revisions/hash.test.d.ts.map +0 -1
- package/dist/test/test/revisions/hash.test.js +0 -33
- package/dist/test/test/revisions/hash.test.js.map +0 -1
- package/dist/test/test/revisions/store.test.d.ts +0 -2
- package/dist/test/test/revisions/store.test.d.ts.map +0 -1
- package/dist/test/test/revisions/store.test.js +0 -315
- package/dist/test/test/revisions/store.test.js.map +0 -1
- package/dist/test/test/server.metrics.test.d.ts +0 -2
- package/dist/test/test/server.metrics.test.d.ts.map +0 -1
- package/dist/test/test/server.metrics.test.js +0 -87
- package/dist/test/test/server.metrics.test.js.map +0 -1
- package/dist/test/test/server.test.d.ts +0 -2
- package/dist/test/test/server.test.d.ts.map +0 -1
- package/dist/test/test/server.test.js +0 -146
- package/dist/test/test/server.test.js.map +0 -1
- package/dist/test/test/skill-tools.test.d.ts +0 -2
- package/dist/test/test/skill-tools.test.d.ts.map +0 -1
- package/dist/test/test/skill-tools.test.js +0 -84
- package/dist/test/test/skill-tools.test.js.map +0 -1
- package/dist/test/test/smoke.test.d.ts +0 -2
- package/dist/test/test/smoke.test.d.ts.map +0 -1
- package/dist/test/test/smoke.test.js +0 -8
- package/dist/test/test/smoke.test.js.map +0 -1
- package/dist/test/test/tools/asset-generate.test.d.ts +0 -2
- package/dist/test/test/tools/asset-generate.test.d.ts.map +0 -1
- package/dist/test/test/tools/asset-generate.test.js +0 -66
- package/dist/test/test/tools/asset-generate.test.js.map +0 -1
- package/dist/test/test/tools/asset-search.test.d.ts +0 -2
- package/dist/test/test/tools/asset-search.test.d.ts.map +0 -1
- package/dist/test/test/tools/asset-search.test.js +0 -121
- package/dist/test/test/tools/asset-search.test.js.map +0 -1
- package/dist/test/test/tools/edit-harness.d.ts +0 -14
- package/dist/test/test/tools/edit-harness.d.ts.map +0 -1
- package/dist/test/test/tools/edit-harness.js +0 -30
- package/dist/test/test/tools/edit-harness.js.map +0 -1
- package/dist/test/test/tools/edit.telemetry.test.d.ts +0 -2
- package/dist/test/test/tools/edit.telemetry.test.d.ts.map +0 -1
- package/dist/test/test/tools/edit.telemetry.test.js +0 -46
- package/dist/test/test/tools/edit.telemetry.test.js.map +0 -1
- package/dist/test/test/tools/edit.test.d.ts +0 -2
- package/dist/test/test/tools/edit.test.d.ts.map +0 -1
- package/dist/test/test/tools/edit.test.js +0 -267
- package/dist/test/test/tools/edit.test.js.map +0 -1
- package/dist/test/test/tools/export-harness.d.ts +0 -13
- package/dist/test/test/tools/export-harness.d.ts.map +0 -1
- package/dist/test/test/tools/export-harness.js +0 -27
- package/dist/test/test/tools/export-harness.js.map +0 -1
- package/dist/test/test/tools/export.telemetry.test.d.ts +0 -2
- package/dist/test/test/tools/export.telemetry.test.d.ts.map +0 -1
- package/dist/test/test/tools/export.telemetry.test.js +0 -65
- package/dist/test/test/tools/export.telemetry.test.js.map +0 -1
- package/dist/test/test/tools/export.test.d.ts +0 -2
- package/dist/test/test/tools/export.test.d.ts.map +0 -1
- package/dist/test/test/tools/export.test.js +0 -174
- package/dist/test/test/tools/export.test.js.map +0 -1
- package/dist/test/test/tools/history.test.d.ts +0 -2
- package/dist/test/test/tools/history.test.d.ts.map +0 -1
- package/dist/test/test/tools/history.test.js +0 -29
- package/dist/test/test/tools/history.test.js.map +0 -1
- package/dist/test/test/tools/import.test.d.ts +0 -2
- package/dist/test/test/tools/import.test.d.ts.map +0 -1
- package/dist/test/test/tools/import.test.js +0 -122
- package/dist/test/test/tools/import.test.js.map +0 -1
- package/dist/test/test/tools/index.test.d.ts +0 -2
- package/dist/test/test/tools/index.test.d.ts.map +0 -1
- package/dist/test/test/tools/index.test.js +0 -117
- package/dist/test/test/tools/index.test.js.map +0 -1
- package/dist/test/test/tools/inspect.test.d.ts +0 -2
- package/dist/test/test/tools/inspect.test.d.ts.map +0 -1
- package/dist/test/test/tools/inspect.test.js +0 -62
- package/dist/test/test/tools/inspect.test.js.map +0 -1
- package/dist/test/test/tools/list.test.d.ts +0 -2
- package/dist/test/test/tools/list.test.d.ts.map +0 -1
- package/dist/test/test/tools/list.test.js +0 -23
- package/dist/test/test/tools/list.test.js.map +0 -1
- package/dist/test/test/tools/load.integration.test.d.ts +0 -2
- package/dist/test/test/tools/load.integration.test.d.ts.map +0 -1
- package/dist/test/test/tools/load.integration.test.js +0 -165
- package/dist/test/test/tools/load.integration.test.js.map +0 -1
- package/dist/test/test/tools/load.test.d.ts +0 -2
- package/dist/test/test/tools/load.test.d.ts.map +0 -1
- package/dist/test/test/tools/load.test.js +0 -387
- package/dist/test/test/tools/load.test.js.map +0 -1
- package/dist/test/test/tools/metrics.test.d.ts +0 -2
- package/dist/test/test/tools/metrics.test.d.ts.map +0 -1
- package/dist/test/test/tools/metrics.test.js +0 -29
- package/dist/test/test/tools/metrics.test.js.map +0 -1
- package/dist/test/test/tools/open-editor.test.d.ts +0 -2
- package/dist/test/test/tools/open-editor.test.d.ts.map +0 -1
- package/dist/test/test/tools/open-editor.test.js +0 -53
- package/dist/test/test/tools/open-editor.test.js.map +0 -1
- package/dist/test/test/tools/preview-harness.d.ts +0 -9
- package/dist/test/test/tools/preview-harness.d.ts.map +0 -1
- package/dist/test/test/tools/preview-harness.js +0 -23
- package/dist/test/test/tools/preview-harness.js.map +0 -1
- package/dist/test/test/tools/preview.telemetry.test.d.ts +0 -2
- package/dist/test/test/tools/preview.telemetry.test.d.ts.map +0 -1
- package/dist/test/test/tools/preview.telemetry.test.js +0 -36
- package/dist/test/test/tools/preview.telemetry.test.js.map +0 -1
- package/dist/test/test/tools/preview.test.d.ts +0 -2
- package/dist/test/test/tools/preview.test.d.ts.map +0 -1
- package/dist/test/test/tools/preview.test.js +0 -75
- package/dist/test/test/tools/preview.test.js.map +0 -1
- package/dist/test/test/tools/rename.test.d.ts +0 -2
- package/dist/test/test/tools/rename.test.d.ts.map +0 -1
- package/dist/test/test/tools/rename.test.js +0 -16
- package/dist/test/test/tools/rename.test.js.map +0 -1
- package/dist/test/test/tools/save.test.d.ts +0 -2
- package/dist/test/test/tools/save.test.d.ts.map +0 -1
- package/dist/test/test/tools/save.test.js +0 -137
- package/dist/test/test/tools/save.test.js.map +0 -1
- package/dist/test/test/tools/schema-best-practices.d.ts +0 -13
- package/dist/test/test/tools/schema-best-practices.d.ts.map +0 -1
- package/dist/test/test/tools/schema-best-practices.js +0 -169
- package/dist/test/test/tools/schema-best-practices.js.map +0 -1
- package/dist/test/test/tools/schema-best-practices.test.d.ts +0 -3
- package/dist/test/test/tools/schema-best-practices.test.d.ts.map +0 -1
- package/dist/test/test/tools/schema-best-practices.test.js +0 -194
- package/dist/test/test/tools/schema-best-practices.test.js.map +0 -1
- package/dist/test/test/tools/spans.test.d.ts +0 -2
- package/dist/test/test/tools/spans.test.d.ts.map +0 -1
- package/dist/test/test/tools/spans.test.js +0 -84
- package/dist/test/test/tools/spans.test.js.map +0 -1
- package/dist/test/test/viewer/broadcaster.test.d.ts +0 -2
- package/dist/test/test/viewer/broadcaster.test.d.ts.map +0 -1
- package/dist/test/test/viewer/broadcaster.test.js +0 -53
- package/dist/test/test/viewer/broadcaster.test.js.map +0 -1
- package/dist/test/test/viewer/cesdk-cdn.test.d.ts +0 -2
- package/dist/test/test/viewer/cesdk-cdn.test.d.ts.map +0 -1
- package/dist/test/test/viewer/cesdk-cdn.test.js +0 -19
- package/dist/test/test/viewer/cesdk-cdn.test.js.map +0 -1
- package/dist/test/test/viewer/config-route.test.d.ts +0 -2
- package/dist/test/test/viewer/config-route.test.d.ts.map +0 -1
- package/dist/test/test/viewer/config-route.test.js +0 -28
- package/dist/test/test/viewer/config-route.test.js.map +0 -1
- package/dist/test/test/viewer/resource-route.test.d.ts +0 -2
- package/dist/test/test/viewer/resource-route.test.d.ts.map +0 -1
- package/dist/test/test/viewer/resource-route.test.js +0 -70
- package/dist/test/test/viewer/resource-route.test.js.map +0 -1
- package/dist/test/test/viewer/router.test.d.ts +0 -2
- package/dist/test/test/viewer/router.test.d.ts.map +0 -1
- package/dist/test/test/viewer/router.test.js +0 -227
- package/dist/test/test/viewer/router.test.js.map +0 -1
- package/dist/test/test/viewer/session-mount.test.d.ts +0 -2
- package/dist/test/test/viewer/session-mount.test.d.ts.map +0 -1
- package/dist/test/test/viewer/session-mount.test.js +0 -52
- package/dist/test/test/viewer/session-mount.test.js.map +0 -1
- package/dist/test/test/viewer/spa-version.test.d.ts +0 -2
- package/dist/test/test/viewer/spa-version.test.d.ts.map +0 -1
- package/dist/test/test/viewer/spa-version.test.js +0 -14
- package/dist/test/test/viewer/spa-version.test.js.map +0 -1
- package/dist/test/test/viewer/url-builder.test.d.ts +0 -2
- package/dist/test/test/viewer/url-builder.test.d.ts.map +0 -1
- package/dist/test/test/viewer/url-builder.test.js +0 -98
- package/dist/test/test/viewer/url-builder.test.js.map +0 -1
- package/dist/test/test/workspace/content-hash.test.d.ts +0 -2
- package/dist/test/test/workspace/content-hash.test.d.ts.map +0 -1
- package/dist/test/test/workspace/content-hash.test.js +0 -17
- package/dist/test/test/workspace/content-hash.test.js.map +0 -1
- package/dist/test/test/workspace/hosted-stub.test.d.ts +0 -2
- package/dist/test/test/workspace/hosted-stub.test.d.ts.map +0 -1
- package/dist/test/test/workspace/hosted-stub.test.js +0 -30
- package/dist/test/test/workspace/hosted-stub.test.js.map +0 -1
- package/dist/test/test/workspace/in-memory.test.d.ts +0 -2
- package/dist/test/test/workspace/in-memory.test.d.ts.map +0 -1
- package/dist/test/test/workspace/in-memory.test.js +0 -4
- package/dist/test/test/workspace/in-memory.test.js.map +0 -1
- package/dist/test/test/workspace/node-fs.test.d.ts +0 -2
- package/dist/test/test/workspace/node-fs.test.d.ts.map +0 -1
- package/dist/test/test/workspace/node-fs.test.js +0 -20
- package/dist/test/test/workspace/node-fs.test.js.map +0 -1
- package/dist/test/test/workspace/s3.test.d.ts +0 -2
- package/dist/test/test/workspace/s3.test.d.ts.map +0 -1
- package/dist/test/test/workspace/s3.test.js +0 -153
- package/dist/test/test/workspace/s3.test.js.map +0 -1
- package/dist/test/test/workspace/scoped.test.d.ts +0 -2
- package/dist/test/test/workspace/scoped.test.d.ts.map +0 -1
- package/dist/test/test/workspace/scoped.test.js +0 -59
- package/dist/test/test/workspace/scoped.test.js.map +0 -1
- package/dist/test/test/workspace/shared-contract.d.ts +0 -3
- package/dist/test/test/workspace/shared-contract.d.ts.map +0 -1
- package/dist/test/test/workspace/shared-contract.js +0 -92
- package/dist/test/test/workspace/shared-contract.js.map +0 -1
- package/dist/test/tsconfig.test.tsbuildinfo +0 -1
- package/dist/test/vitest.config.d.ts +0 -3
- package/dist/test/vitest.config.d.ts.map +0 -1
- package/dist/test/vitest.config.js +0 -8
- package/dist/test/vitest.config.js.map +0 -1
- package/dist/tools/metrics.d.ts +0 -11
- package/dist/tools/metrics.d.ts.map +0 -1
- package/dist/tools/metrics.js +0 -28
- package/dist/tools/metrics.js.map +0 -1
- package/dist/tools/open-editor.d.ts.map +0 -1
- package/dist/tools/open-editor.js.map +0 -1
- /package/dist/{dashboard → diagnostics}/spa-assets.generated.d.ts +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node-fs.test.d.ts","sourceRoot":"","sources":["../../../../test/workspace/node-fs.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { mkdtemp, rm } from 'node:fs/promises';
|
|
2
|
-
import { tmpdir } from 'node:os';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
import { afterEach, beforeEach } from 'vitest';
|
|
5
|
-
import { NodeWorkspaceFS } from '../../src/workspace/node-fs.js';
|
|
6
|
-
import { runWorkspaceContract } from './shared-contract.js';
|
|
7
|
-
let dirs = [];
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
dirs = [];
|
|
10
|
-
});
|
|
11
|
-
afterEach(async () => {
|
|
12
|
-
for (const d of dirs)
|
|
13
|
-
await rm(d, { recursive: true, force: true });
|
|
14
|
-
});
|
|
15
|
-
runWorkspaceContract('NodeWorkspaceFS', async () => {
|
|
16
|
-
const dir = await mkdtemp(join(tmpdir(), 'codesign-mcp-fs-'));
|
|
17
|
-
dirs.push(dir);
|
|
18
|
-
return new NodeWorkspaceFS(dir);
|
|
19
|
-
});
|
|
20
|
-
//# sourceMappingURL=node-fs.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node-fs.test.js","sourceRoot":"","sources":["../../../../test/workspace/node-fs.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,IAAI,IAAI,GAAa,EAAE,CAAC;AAExB,UAAU,CAAC,GAAG,EAAE;IACd,IAAI,GAAG,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC;AAEH,oBAAoB,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;IACjD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,OAAO,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC","sourcesContent":["import { mkdtemp, rm } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { afterEach, beforeEach } from 'vitest';\nimport { NodeWorkspaceFS } from '../../src/workspace/node-fs.js';\nimport { runWorkspaceContract } from './shared-contract.js';\n\nlet dirs: string[] = [];\n\nbeforeEach(() => {\n dirs = [];\n});\n\nafterEach(async () => {\n for (const d of dirs) await rm(d, { recursive: true, force: true });\n});\n\nrunWorkspaceContract('NodeWorkspaceFS', async () => {\n const dir = await mkdtemp(join(tmpdir(), 'codesign-mcp-fs-'));\n dirs.push(dir);\n return new NodeWorkspaceFS(dir);\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"s3.test.d.ts","sourceRoot":"","sources":["../../../../test/workspace/s3.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { DeleteObjectCommand, GetObjectCommand, HeadObjectCommand, ListObjectsV2Command, PutObjectCommand } from '@aws-sdk/client-s3';
|
|
3
|
-
import { S3WorkspaceFS } from '../../src/workspace/s3.js';
|
|
4
|
-
/** Minimal in-memory fake of the S3 `send`-based client the adapter uses. */
|
|
5
|
-
function makeFakeS3(seed = {}) {
|
|
6
|
-
const store = new Map();
|
|
7
|
-
for (const [k, v] of Object.entries(seed))
|
|
8
|
-
store.set(k, new TextEncoder().encode(v));
|
|
9
|
-
const notFound = () => {
|
|
10
|
-
const err = new Error('NoSuchKey');
|
|
11
|
-
err.name = 'NoSuchKey';
|
|
12
|
-
err.$metadata = { httpStatusCode: 404 };
|
|
13
|
-
throw err;
|
|
14
|
-
};
|
|
15
|
-
const client = {
|
|
16
|
-
store,
|
|
17
|
-
send: vi.fn(async (cmd) => {
|
|
18
|
-
if (cmd instanceof PutObjectCommand) {
|
|
19
|
-
const { Key, Body } = cmd.input;
|
|
20
|
-
const bytes = typeof Body === 'string'
|
|
21
|
-
? new TextEncoder().encode(Body)
|
|
22
|
-
: Body;
|
|
23
|
-
store.set(Key, bytes);
|
|
24
|
-
return {};
|
|
25
|
-
}
|
|
26
|
-
if (cmd instanceof GetObjectCommand) {
|
|
27
|
-
const bytes = store.get(cmd.input.Key);
|
|
28
|
-
if (!bytes)
|
|
29
|
-
notFound();
|
|
30
|
-
return {
|
|
31
|
-
Body: {
|
|
32
|
-
transformToByteArray: async () => bytes
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
if (cmd instanceof HeadObjectCommand) {
|
|
37
|
-
const bytes = store.get(cmd.input.Key);
|
|
38
|
-
if (!bytes)
|
|
39
|
-
notFound();
|
|
40
|
-
return { ContentLength: bytes.byteLength, LastModified: new Date(0) };
|
|
41
|
-
}
|
|
42
|
-
if (cmd instanceof ListObjectsV2Command) {
|
|
43
|
-
const prefix = cmd.input.Prefix ?? '';
|
|
44
|
-
const delimiter = cmd.input.Delimiter;
|
|
45
|
-
const keys = [...store.keys()].filter((k) => k.startsWith(prefix));
|
|
46
|
-
const contents = [];
|
|
47
|
-
const commonPrefixes = new Set();
|
|
48
|
-
for (const k of keys) {
|
|
49
|
-
const rest = k.slice(prefix.length);
|
|
50
|
-
if (delimiter && rest.includes(delimiter)) {
|
|
51
|
-
commonPrefixes.add(prefix + rest.slice(0, rest.indexOf(delimiter) + 1));
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
contents.push({ Key: k });
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return {
|
|
58
|
-
Contents: contents,
|
|
59
|
-
CommonPrefixes: [...commonPrefixes].map((Prefix) => ({ Prefix })),
|
|
60
|
-
IsTruncated: false
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
if (cmd instanceof DeleteObjectCommand) {
|
|
64
|
-
store.delete(cmd.input.Key);
|
|
65
|
-
return {};
|
|
66
|
-
}
|
|
67
|
-
throw new Error(`fake S3: unhandled command ${cmd.constructor.name}`);
|
|
68
|
-
})
|
|
69
|
-
};
|
|
70
|
-
return client;
|
|
71
|
-
}
|
|
72
|
-
function makeFs(seed) {
|
|
73
|
-
const client = makeFakeS3(seed);
|
|
74
|
-
const fs = new S3WorkspaceFS({ client: client, bucket: 'b' });
|
|
75
|
-
return { fs, client };
|
|
76
|
-
}
|
|
77
|
-
describe('S3WorkspaceFS', () => {
|
|
78
|
-
it('writeFile then readFile round-trips utf8', async () => {
|
|
79
|
-
const { fs } = makeFs();
|
|
80
|
-
await fs.writeFile('objects/ab/cd.scene', 'hello');
|
|
81
|
-
expect(await fs.readFile('objects/ab/cd.scene', 'utf8')).toBe('hello');
|
|
82
|
-
});
|
|
83
|
-
it('readFile throws ENOENT for a missing key', async () => {
|
|
84
|
-
const { fs } = makeFs();
|
|
85
|
-
await expect(fs.readFile('missing', 'utf8')).rejects.toMatchObject({
|
|
86
|
-
code: 'ENOENT'
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
it('exists is true for a written key and false otherwise', async () => {
|
|
90
|
-
const { fs } = makeFs({ 'a/b': 'x' });
|
|
91
|
-
expect(await fs.exists('a/b')).toBe(true);
|
|
92
|
-
expect(await fs.exists('a/z')).toBe(false);
|
|
93
|
-
});
|
|
94
|
-
it('exists is true for a prefix that has children (a "directory")', async () => {
|
|
95
|
-
const { fs } = makeFs({ 'journal/root1/0001-leaf': '' });
|
|
96
|
-
expect(await fs.exists('journal')).toBe(true);
|
|
97
|
-
});
|
|
98
|
-
it('readdir returns immediate child names (dirs + files)', async () => {
|
|
99
|
-
const { fs } = makeFs({
|
|
100
|
-
'journal/root1/0001-a': '',
|
|
101
|
-
'journal/root2/0002-b': ''
|
|
102
|
-
});
|
|
103
|
-
expect((await fs.readdir('journal')).sort()).toEqual(['root1', 'root2']);
|
|
104
|
-
expect(await fs.readdir('journal/root1')).toEqual(['0001-a']);
|
|
105
|
-
});
|
|
106
|
-
it('rename copies bytes to the new key and removes the old', async () => {
|
|
107
|
-
const { fs } = makeFs({ 'a/old': 'payload' });
|
|
108
|
-
await fs.rename('a/old', 'a/new');
|
|
109
|
-
expect(await fs.exists('a/old')).toBe(false);
|
|
110
|
-
expect(await fs.readFile('a/new', 'utf8')).toBe('payload');
|
|
111
|
-
});
|
|
112
|
-
it('stat reports a file for an object and a directory for a prefix', async () => {
|
|
113
|
-
const { fs } = makeFs({ 'd/child': 'x' });
|
|
114
|
-
const fileStat = await fs.stat('d/child');
|
|
115
|
-
expect(fileStat.isFile()).toBe(true);
|
|
116
|
-
expect(fileStat.isDirectory()).toBe(false);
|
|
117
|
-
const dirStat = await fs.stat('d');
|
|
118
|
-
expect(dirStat.isDirectory()).toBe(true);
|
|
119
|
-
expect(dirStat.isFile()).toBe(false);
|
|
120
|
-
});
|
|
121
|
-
it('rm recursive deletes the prefix subtree AND the key itself', async () => {
|
|
122
|
-
const { fs } = makeFs({
|
|
123
|
-
p: 'self',
|
|
124
|
-
'p/a': '1',
|
|
125
|
-
'p/b/c': '2'
|
|
126
|
-
});
|
|
127
|
-
await fs.rm('p', { recursive: true });
|
|
128
|
-
expect(await fs.exists('p')).toBe(false);
|
|
129
|
-
expect(await fs.exists('p/a')).toBe(false);
|
|
130
|
-
expect(await fs.exists('p/b/c')).toBe(false);
|
|
131
|
-
});
|
|
132
|
-
it('retries a read-after-write 404 then succeeds (bounded)', async () => {
|
|
133
|
-
const { fs, client } = makeFs();
|
|
134
|
-
let gets = 0;
|
|
135
|
-
const realSend = client.send;
|
|
136
|
-
client.send = vi.fn(async (cmd) => {
|
|
137
|
-
if (cmd instanceof GetObjectCommand) {
|
|
138
|
-
gets += 1;
|
|
139
|
-
if (gets === 1) {
|
|
140
|
-
const err = new Error('NoSuchKey');
|
|
141
|
-
err.name = 'NoSuchKey';
|
|
142
|
-
err.$metadata = { httpStatusCode: 404 };
|
|
143
|
-
throw err;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
return realSend(cmd);
|
|
147
|
-
});
|
|
148
|
-
client.store.set('k', new TextEncoder().encode('v'));
|
|
149
|
-
expect(await fs.readFile('k', 'utf8')).toBe('v');
|
|
150
|
-
expect(gets).toBe(2);
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
//# sourceMappingURL=s3.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"s3.test.js","sourceRoot":"","sources":["../../../../test/workspace/s3.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi } from 'vitest';\nimport {\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n PutObjectCommand\n} from '@aws-sdk/client-s3';\nimport { S3WorkspaceFS } from '../../src/workspace/s3.js';\n\n/** Minimal in-memory fake of the S3 `send`-based client the adapter uses. */\nfunction makeFakeS3(seed: Record<string, string> = {}) {\n const store = new Map<string, Uint8Array>();\n for (const [k, v] of Object.entries(seed))\n store.set(k, new TextEncoder().encode(v));\n\n const notFound = (): never => {\n const err = new Error('NoSuchKey') as Error & {\n name: string;\n $metadata: { httpStatusCode: number };\n };\n err.name = 'NoSuchKey';\n err.$metadata = { httpStatusCode: 404 };\n throw err;\n };\n\n const client = {\n store,\n send: vi.fn(async (cmd: unknown) => {\n if (cmd instanceof PutObjectCommand) {\n const { Key, Body } = cmd.input;\n const bytes =\n typeof Body === 'string'\n ? new TextEncoder().encode(Body)\n : (Body as Uint8Array);\n store.set(Key as string, bytes);\n return {};\n }\n if (cmd instanceof GetObjectCommand) {\n const bytes = store.get(cmd.input.Key as string);\n if (!bytes) notFound();\n return {\n Body: {\n transformToByteArray: async () => bytes\n }\n };\n }\n if (cmd instanceof HeadObjectCommand) {\n const bytes = store.get(cmd.input.Key as string);\n if (!bytes) notFound();\n return { ContentLength: bytes!.byteLength, LastModified: new Date(0) };\n }\n if (cmd instanceof ListObjectsV2Command) {\n const prefix = (cmd.input.Prefix as string) ?? '';\n const delimiter = cmd.input.Delimiter as string | undefined;\n const keys = [...store.keys()].filter((k) => k.startsWith(prefix));\n const contents: Array<{ Key: string }> = [];\n const commonPrefixes = new Set<string>();\n for (const k of keys) {\n const rest = k.slice(prefix.length);\n if (delimiter && rest.includes(delimiter)) {\n commonPrefixes.add(\n prefix + rest.slice(0, rest.indexOf(delimiter) + 1)\n );\n } else {\n contents.push({ Key: k });\n }\n }\n return {\n Contents: contents,\n CommonPrefixes: [...commonPrefixes].map((Prefix) => ({ Prefix })),\n IsTruncated: false\n };\n }\n if (cmd instanceof DeleteObjectCommand) {\n store.delete(cmd.input.Key as string);\n return {};\n }\n throw new Error(\n `fake S3: unhandled command ${(cmd as object).constructor.name}`\n );\n })\n };\n return client;\n}\n\nfunction makeFs(seed?: Record<string, string>) {\n const client = makeFakeS3(seed);\n const fs = new S3WorkspaceFS({ client: client as never, bucket: 'b' });\n return { fs, client };\n}\n\ndescribe('S3WorkspaceFS', () => {\n it('writeFile then readFile round-trips utf8', async () => {\n const { fs } = makeFs();\n await fs.writeFile('objects/ab/cd.scene', 'hello');\n expect(await fs.readFile('objects/ab/cd.scene', 'utf8')).toBe('hello');\n });\n\n it('readFile throws ENOENT for a missing key', async () => {\n const { fs } = makeFs();\n await expect(fs.readFile('missing', 'utf8')).rejects.toMatchObject({\n code: 'ENOENT'\n });\n });\n\n it('exists is true for a written key and false otherwise', async () => {\n const { fs } = makeFs({ 'a/b': 'x' });\n expect(await fs.exists('a/b')).toBe(true);\n expect(await fs.exists('a/z')).toBe(false);\n });\n\n it('exists is true for a prefix that has children (a \"directory\")', async () => {\n const { fs } = makeFs({ 'journal/root1/0001-leaf': '' });\n expect(await fs.exists('journal')).toBe(true);\n });\n\n it('readdir returns immediate child names (dirs + files)', async () => {\n const { fs } = makeFs({\n 'journal/root1/0001-a': '',\n 'journal/root2/0002-b': ''\n });\n expect((await fs.readdir('journal')).sort()).toEqual(['root1', 'root2']);\n expect(await fs.readdir('journal/root1')).toEqual(['0001-a']);\n });\n\n it('rename copies bytes to the new key and removes the old', async () => {\n const { fs } = makeFs({ 'a/old': 'payload' });\n await fs.rename('a/old', 'a/new');\n expect(await fs.exists('a/old')).toBe(false);\n expect(await fs.readFile('a/new', 'utf8')).toBe('payload');\n });\n\n it('stat reports a file for an object and a directory for a prefix', async () => {\n const { fs } = makeFs({ 'd/child': 'x' });\n const fileStat = await fs.stat('d/child');\n expect(fileStat.isFile()).toBe(true);\n expect(fileStat.isDirectory()).toBe(false);\n const dirStat = await fs.stat('d');\n expect(dirStat.isDirectory()).toBe(true);\n expect(dirStat.isFile()).toBe(false);\n });\n\n it('rm recursive deletes the prefix subtree AND the key itself', async () => {\n const { fs } = makeFs({\n p: 'self',\n 'p/a': '1',\n 'p/b/c': '2'\n });\n await fs.rm('p', { recursive: true });\n expect(await fs.exists('p')).toBe(false);\n expect(await fs.exists('p/a')).toBe(false);\n expect(await fs.exists('p/b/c')).toBe(false);\n });\n\n it('retries a read-after-write 404 then succeeds (bounded)', async () => {\n const { fs, client } = makeFs();\n let gets = 0;\n const realSend = client.send;\n client.send = vi.fn(async (cmd: unknown) => {\n if (cmd instanceof GetObjectCommand) {\n gets += 1;\n if (gets === 1) {\n const err = new Error('NoSuchKey') as Error & {\n name: string;\n $metadata: { httpStatusCode: number };\n };\n err.name = 'NoSuchKey';\n err.$metadata = { httpStatusCode: 404 };\n throw err;\n }\n }\n return realSend(cmd);\n });\n client.store.set('k', new TextEncoder().encode('v'));\n expect(await fs.readFile('k', 'utf8')).toBe('v');\n expect(gets).toBe(2);\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scoped.test.d.ts","sourceRoot":"","sources":["../../../../test/workspace/scoped.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { InMemoryWorkspaceFS } from '../../src/workspace/in-memory.js';
|
|
3
|
-
import { sanitizeWorkspaceId, ScopedWorkspaceFS } from '../../src/workspace/scoped.js';
|
|
4
|
-
describe('sanitizeWorkspaceId', () => {
|
|
5
|
-
it('accepts a plain id and a namespaced id', () => {
|
|
6
|
-
expect(sanitizeWorkspaceId('default')).toBe('default');
|
|
7
|
-
expect(sanitizeWorkspaceId('u/usr_8842')).toBe('u/usr_8842');
|
|
8
|
-
expect(sanitizeWorkspaceId('s/abc-123')).toBe('s/abc-123');
|
|
9
|
-
});
|
|
10
|
-
it.each([
|
|
11
|
-
['', 'empty'],
|
|
12
|
-
['/abs', 'leading slash'],
|
|
13
|
-
['..', 'dot-dot'],
|
|
14
|
-
['a/../b', 'traversal segment'],
|
|
15
|
-
['a//b', 'empty segment'],
|
|
16
|
-
['a/', 'trailing slash'],
|
|
17
|
-
['a\\b', 'backslash'],
|
|
18
|
-
['a\x01b', 'control char']
|
|
19
|
-
])('rejects %s (%s) with EINVAL', (id) => {
|
|
20
|
-
expect(() => sanitizeWorkspaceId(id)).toThrowError(expect.objectContaining({ code: 'EINVAL' }));
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
describe('ScopedWorkspaceFS', () => {
|
|
24
|
-
it('prefixes writes/reads under workspaces/<id>/', async () => {
|
|
25
|
-
const inner = new InMemoryWorkspaceFS();
|
|
26
|
-
const scoped = new ScopedWorkspaceFS(inner, 'u/usr_8842');
|
|
27
|
-
await scoped.writeFile('objects/ab/cd.scene', 'hello');
|
|
28
|
-
expect(await inner.readFile('workspaces/u/usr_8842/objects/ab/cd.scene', 'utf8')).toBe('hello');
|
|
29
|
-
expect(await scoped.readFile('objects/ab/cd.scene', 'utf8')).toBe('hello');
|
|
30
|
-
});
|
|
31
|
-
it('isolates two workspaces sharing one inner fs', async () => {
|
|
32
|
-
const inner = new InMemoryWorkspaceFS();
|
|
33
|
-
const a = new ScopedWorkspaceFS(inner, 'u/a');
|
|
34
|
-
const b = new ScopedWorkspaceFS(inner, 'u/b');
|
|
35
|
-
await a.writeFile('f', 'A');
|
|
36
|
-
await b.writeFile('f', 'B');
|
|
37
|
-
expect(await a.readFile('f', 'utf8')).toBe('A');
|
|
38
|
-
expect(await b.readFile('f', 'utf8')).toBe('B');
|
|
39
|
-
});
|
|
40
|
-
it('scopes readdir input and returns unprefixed names', async () => {
|
|
41
|
-
const inner = new InMemoryWorkspaceFS();
|
|
42
|
-
const scoped = new ScopedWorkspaceFS(inner, 'ws');
|
|
43
|
-
await scoped.writeFile('journal/root1/0000000000000005-abc', '');
|
|
44
|
-
expect(await scoped.readdir('journal')).toEqual(['root1']);
|
|
45
|
-
});
|
|
46
|
-
it('scopes both paths of a rename', async () => {
|
|
47
|
-
const inner = new InMemoryWorkspaceFS();
|
|
48
|
-
const scoped = new ScopedWorkspaceFS(inner, 'ws');
|
|
49
|
-
await scoped.writeFile('a', 'x');
|
|
50
|
-
await scoped.rename('a', 'b');
|
|
51
|
-
expect(await scoped.exists('a')).toBe(false);
|
|
52
|
-
expect(await scoped.readFile('b', 'utf8')).toBe('x');
|
|
53
|
-
expect(await inner.exists('workspaces/ws/b')).toBe(true);
|
|
54
|
-
});
|
|
55
|
-
it('rejects an illegal workspaceId at construction', () => {
|
|
56
|
-
expect(() => new ScopedWorkspaceFS(new InMemoryWorkspaceFS(), '../escape')).toThrowError(expect.objectContaining({ code: 'EINVAL' }));
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
//# sourceMappingURL=scoped.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scoped.test.js","sourceRoot":"","sources":["../../../../test/workspace/scoped.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,+BAA+B,CAAC;AAEvC,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7D,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,EAAE,EAAE,OAAO,CAAC;QACb,CAAC,MAAM,EAAE,eAAe,CAAC;QACzB,CAAC,IAAI,EAAE,SAAS,CAAC;QACjB,CAAC,QAAQ,EAAE,mBAAmB,CAAC;QAC/B,CAAC,MAAM,EAAE,eAAe,CAAC;QACzB,CAAC,IAAI,EAAE,gBAAgB,CAAC;QACxB,CAAC,MAAM,EAAE,WAAW,CAAC;QACrB,CAAC,QAAQ,EAAE,cAAc,CAAC;KAC3B,CAAC,CAAC,6BAA6B,EAAE,CAAC,EAAE,EAAE,EAAE;QACvC,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAChD,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAC5C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,KAAK,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC1D,MAAM,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,CACJ,MAAM,KAAK,CAAC,QAAQ,CAAC,2CAA2C,EAAE,MAAM,CAAC,CAC1E,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChB,MAAM,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,KAAK,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,IAAI,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,IAAI,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,KAAK,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,CAAC,SAAS,CAAC,oCAAoC,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,KAAK,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CACJ,GAAG,EAAE,CAAC,IAAI,iBAAiB,CAAC,IAAI,mBAAmB,EAAE,EAAE,WAAW,CAAC,CACpE,CAAC,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it } from 'vitest';\nimport { InMemoryWorkspaceFS } from '../../src/workspace/in-memory.js';\nimport {\n sanitizeWorkspaceId,\n ScopedWorkspaceFS\n} from '../../src/workspace/scoped.js';\n\ndescribe('sanitizeWorkspaceId', () => {\n it('accepts a plain id and a namespaced id', () => {\n expect(sanitizeWorkspaceId('default')).toBe('default');\n expect(sanitizeWorkspaceId('u/usr_8842')).toBe('u/usr_8842');\n expect(sanitizeWorkspaceId('s/abc-123')).toBe('s/abc-123');\n });\n\n it.each([\n ['', 'empty'],\n ['/abs', 'leading slash'],\n ['..', 'dot-dot'],\n ['a/../b', 'traversal segment'],\n ['a//b', 'empty segment'],\n ['a/', 'trailing slash'],\n ['a\\\\b', 'backslash'],\n ['a\\x01b', 'control char']\n ])('rejects %s (%s) with EINVAL', (id) => {\n expect(() => sanitizeWorkspaceId(id)).toThrowError(\n expect.objectContaining({ code: 'EINVAL' })\n );\n });\n});\n\ndescribe('ScopedWorkspaceFS', () => {\n it('prefixes writes/reads under workspaces/<id>/', async () => {\n const inner = new InMemoryWorkspaceFS();\n const scoped = new ScopedWorkspaceFS(inner, 'u/usr_8842');\n await scoped.writeFile('objects/ab/cd.scene', 'hello');\n expect(\n await inner.readFile('workspaces/u/usr_8842/objects/ab/cd.scene', 'utf8')\n ).toBe('hello');\n expect(await scoped.readFile('objects/ab/cd.scene', 'utf8')).toBe('hello');\n });\n\n it('isolates two workspaces sharing one inner fs', async () => {\n const inner = new InMemoryWorkspaceFS();\n const a = new ScopedWorkspaceFS(inner, 'u/a');\n const b = new ScopedWorkspaceFS(inner, 'u/b');\n await a.writeFile('f', 'A');\n await b.writeFile('f', 'B');\n expect(await a.readFile('f', 'utf8')).toBe('A');\n expect(await b.readFile('f', 'utf8')).toBe('B');\n });\n\n it('scopes readdir input and returns unprefixed names', async () => {\n const inner = new InMemoryWorkspaceFS();\n const scoped = new ScopedWorkspaceFS(inner, 'ws');\n await scoped.writeFile('journal/root1/0000000000000005-abc', '');\n expect(await scoped.readdir('journal')).toEqual(['root1']);\n });\n\n it('scopes both paths of a rename', async () => {\n const inner = new InMemoryWorkspaceFS();\n const scoped = new ScopedWorkspaceFS(inner, 'ws');\n await scoped.writeFile('a', 'x');\n await scoped.rename('a', 'b');\n expect(await scoped.exists('a')).toBe(false);\n expect(await scoped.readFile('b', 'utf8')).toBe('x');\n expect(await inner.exists('workspaces/ws/b')).toBe(true);\n });\n\n it('rejects an illegal workspaceId at construction', () => {\n expect(\n () => new ScopedWorkspaceFS(new InMemoryWorkspaceFS(), '../escape')\n ).toThrowError(expect.objectContaining({ code: 'EINVAL' }));\n });\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shared-contract.d.ts","sourceRoot":"","sources":["../../../../test/workspace/shared-contract.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,GAC/C,IAAI,CAiGN"}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
// packages/codesign-mcp/test/workspace/shared-contract.test.ts
|
|
2
|
-
//
|
|
3
|
-
// Every `WorkspaceFS` impl must pass this suite. Call `runWorkspaceContract`
|
|
4
|
-
// from an impl-specific test file with a factory that returns a fresh FS per
|
|
5
|
-
// test.
|
|
6
|
-
import { describe, expect, it } from 'vitest';
|
|
7
|
-
export function runWorkspaceContract(name, makeFS) {
|
|
8
|
-
describe(`WorkspaceFS contract — ${name}`, () => {
|
|
9
|
-
it('writeFile + readFile round-trips bytes', async () => {
|
|
10
|
-
const fs = await makeFS();
|
|
11
|
-
const data = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);
|
|
12
|
-
await fs.writeFile('a/b/c.bin', data);
|
|
13
|
-
const out = await fs.readFile('a/b/c.bin');
|
|
14
|
-
expect(out).toEqual(data);
|
|
15
|
-
});
|
|
16
|
-
it('writeFile + readFile(utf8) round-trips a string', async () => {
|
|
17
|
-
const fs = await makeFS();
|
|
18
|
-
await fs.writeFile('hello.txt', 'héllo wörld');
|
|
19
|
-
const out = await fs.readFile('hello.txt', 'utf8');
|
|
20
|
-
expect(out).toBe('héllo wörld');
|
|
21
|
-
});
|
|
22
|
-
it('writeFile creates parent dirs implicitly', async () => {
|
|
23
|
-
const fs = await makeFS();
|
|
24
|
-
await fs.writeFile('deep/nested/path/file.txt', 'x');
|
|
25
|
-
expect(await fs.exists('deep/nested/path/file.txt')).toBe(true);
|
|
26
|
-
});
|
|
27
|
-
it('readFile throws ENOENT for missing files', async () => {
|
|
28
|
-
const fs = await makeFS();
|
|
29
|
-
await expect(fs.readFile('nope')).rejects.toMatchObject({
|
|
30
|
-
code: 'ENOENT'
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
it('stat returns size + isFile/isDirectory flags', async () => {
|
|
34
|
-
const fs = await makeFS();
|
|
35
|
-
await fs.writeFile('f.txt', 'hello');
|
|
36
|
-
const st = await fs.stat('f.txt');
|
|
37
|
-
expect(st.isFile()).toBe(true);
|
|
38
|
-
expect(st.isDirectory()).toBe(false);
|
|
39
|
-
expect(st.size).toBe(5);
|
|
40
|
-
});
|
|
41
|
-
it('stat throws ENOENT for missing paths', async () => {
|
|
42
|
-
const fs = await makeFS();
|
|
43
|
-
await expect(fs.stat('nope')).rejects.toMatchObject({ code: 'ENOENT' });
|
|
44
|
-
});
|
|
45
|
-
it('exists returns false instead of throwing', async () => {
|
|
46
|
-
const fs = await makeFS();
|
|
47
|
-
expect(await fs.exists('nope')).toBe(false);
|
|
48
|
-
await fs.writeFile('yes', '');
|
|
49
|
-
expect(await fs.exists('yes')).toBe(true);
|
|
50
|
-
});
|
|
51
|
-
it('readdir returns entries', async () => {
|
|
52
|
-
const fs = await makeFS();
|
|
53
|
-
await fs.writeFile('d/a', '1');
|
|
54
|
-
await fs.writeFile('d/b', '2');
|
|
55
|
-
const entries = (await fs.readdir('d')).sort();
|
|
56
|
-
expect(entries).toEqual(['a', 'b']);
|
|
57
|
-
});
|
|
58
|
-
it('readdir with withFileTypes returns Dirent[]', async () => {
|
|
59
|
-
const fs = await makeFS();
|
|
60
|
-
await fs.writeFile('d/a', '1');
|
|
61
|
-
await fs.mkdir('d/sub');
|
|
62
|
-
const entries = (await fs.readdir('d', { withFileTypes: true }))
|
|
63
|
-
.slice()
|
|
64
|
-
.sort((x, y) => x.name.localeCompare(y.name));
|
|
65
|
-
expect(entries.map((e) => [e.name, e.isFile(), e.isDirectory()])).toEqual([
|
|
66
|
-
['a', true, false],
|
|
67
|
-
['sub', false, true]
|
|
68
|
-
]);
|
|
69
|
-
});
|
|
70
|
-
it('mkdir recursive creates intermediate dirs', async () => {
|
|
71
|
-
const fs = await makeFS();
|
|
72
|
-
await fs.mkdir('a/b/c', { recursive: true });
|
|
73
|
-
const st = await fs.stat('a/b/c');
|
|
74
|
-
expect(st.isDirectory()).toBe(true);
|
|
75
|
-
});
|
|
76
|
-
it('rm removes files; recursive removes subtrees', async () => {
|
|
77
|
-
const fs = await makeFS();
|
|
78
|
-
await fs.writeFile('d/a', '1');
|
|
79
|
-
await fs.writeFile('d/b', '2');
|
|
80
|
-
await fs.rm('d', { recursive: true });
|
|
81
|
-
expect(await fs.exists('d')).toBe(false);
|
|
82
|
-
});
|
|
83
|
-
it('rename moves a file', async () => {
|
|
84
|
-
const fs = await makeFS();
|
|
85
|
-
await fs.writeFile('src.txt', 'hi');
|
|
86
|
-
await fs.rename('src.txt', 'dst.txt');
|
|
87
|
-
expect(await fs.exists('src.txt')).toBe(false);
|
|
88
|
-
expect(await fs.readFile('dst.txt', 'utf8')).toBe('hi');
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=shared-contract.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shared-contract.js","sourceRoot":"","sources":["../../../../test/workspace/shared-contract.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/codesign-mcp/test/workspace/shared-contract.test.ts\n//\n// Every `WorkspaceFS` impl must pass this suite. Call `runWorkspaceContract`\n// from an impl-specific test file with a factory that returns a fresh FS per\n// test.\nimport { describe, expect, it } from 'vitest';\nimport type { WorkspaceFS } from '../../src/workspace/types.js';\n\nexport function runWorkspaceContract(\n name: string,\n makeFS: () => Promise<WorkspaceFS> | WorkspaceFS\n): void {\n describe(`WorkspaceFS contract — ${name}`, () => {\n it('writeFile + readFile round-trips bytes', async () => {\n const fs = await makeFS();\n const data = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n await fs.writeFile('a/b/c.bin', data);\n const out = await fs.readFile('a/b/c.bin');\n expect(out).toEqual(data);\n });\n\n it('writeFile + readFile(utf8) round-trips a string', async () => {\n const fs = await makeFS();\n await fs.writeFile('hello.txt', 'héllo wörld');\n const out = await fs.readFile('hello.txt', 'utf8');\n expect(out).toBe('héllo wörld');\n });\n\n it('writeFile creates parent dirs implicitly', async () => {\n const fs = await makeFS();\n await fs.writeFile('deep/nested/path/file.txt', 'x');\n expect(await fs.exists('deep/nested/path/file.txt')).toBe(true);\n });\n\n it('readFile throws ENOENT for missing files', async () => {\n const fs = await makeFS();\n await expect(fs.readFile('nope')).rejects.toMatchObject({\n code: 'ENOENT'\n });\n });\n\n it('stat returns size + isFile/isDirectory flags', async () => {\n const fs = await makeFS();\n await fs.writeFile('f.txt', 'hello');\n const st = await fs.stat('f.txt');\n expect(st.isFile()).toBe(true);\n expect(st.isDirectory()).toBe(false);\n expect(st.size).toBe(5);\n });\n\n it('stat throws ENOENT for missing paths', async () => {\n const fs = await makeFS();\n await expect(fs.stat('nope')).rejects.toMatchObject({ code: 'ENOENT' });\n });\n\n it('exists returns false instead of throwing', async () => {\n const fs = await makeFS();\n expect(await fs.exists('nope')).toBe(false);\n await fs.writeFile('yes', '');\n expect(await fs.exists('yes')).toBe(true);\n });\n\n it('readdir returns entries', async () => {\n const fs = await makeFS();\n await fs.writeFile('d/a', '1');\n await fs.writeFile('d/b', '2');\n const entries = (await fs.readdir('d')).sort();\n expect(entries).toEqual(['a', 'b']);\n });\n\n it('readdir with withFileTypes returns Dirent[]', async () => {\n const fs = await makeFS();\n await fs.writeFile('d/a', '1');\n await fs.mkdir('d/sub');\n const entries = (await fs.readdir('d', { withFileTypes: true }))\n .slice()\n .sort((x, y) => x.name.localeCompare(y.name));\n expect(entries.map((e) => [e.name, e.isFile(), e.isDirectory()])).toEqual(\n [\n ['a', true, false],\n ['sub', false, true]\n ]\n );\n });\n\n it('mkdir recursive creates intermediate dirs', async () => {\n const fs = await makeFS();\n await fs.mkdir('a/b/c', { recursive: true });\n const st = await fs.stat('a/b/c');\n expect(st.isDirectory()).toBe(true);\n });\n\n it('rm removes files; recursive removes subtrees', async () => {\n const fs = await makeFS();\n await fs.writeFile('d/a', '1');\n await fs.writeFile('d/b', '2');\n await fs.rm('d', { recursive: true });\n expect(await fs.exists('d')).toBe(false);\n });\n\n it('rename moves a file', async () => {\n const fs = await makeFS();\n await fs.writeFile('src.txt', 'hi');\n await fs.rename('src.txt', 'dst.txt');\n expect(await fs.exists('src.txt')).toBe(false);\n expect(await fs.readFile('dst.txt', 'utf8')).toBe('hi');\n });\n });\n}\n"]}
|