@storyshelf/core 0.6.2 → 0.8.0
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 +49 -32
- package/dist/adapter/capture-queue.d.mts +44 -4
- package/dist/adapter/capture-runner.d.mts +134 -12
- package/dist/adapter/capture-runner.mjs +9 -12
- package/dist/adapter/database.d.mts +89 -10
- package/dist/adapter/database.mjs +4 -3
- package/dist/adapter/database.mjs.map +1 -1
- package/dist/adapter/design.d.mts +83 -0
- package/dist/adapter/design.mjs +27 -0
- package/dist/adapter/design.mjs.map +1 -0
- package/dist/adapter/email-sender.d.mts +0 -2
- package/dist/adapter/metadata.d.mts +3 -12
- package/dist/adapter/notifier.d.mts +6 -3
- package/dist/adapter/notifier.mjs +5 -1
- package/dist/adapter/oauth.d.mts +50 -0
- package/dist/adapter/setup.d.mts +4 -7
- package/dist/adapter/setup.mjs +3 -3
- package/dist/adapter/setup.mjs.map +1 -1
- package/dist/adapter/storage.d.mts +1 -3
- package/dist/adapter/webhook-events.d.mts +0 -2
- package/dist/adapter/webhook-events.mjs +13 -14
- package/dist/adapter/webhook-events.mjs.map +1 -1
- package/dist/adapters/capture-target-offers.d.mts +26 -0
- package/dist/adapters/capture-target-offers.mjs +57 -0
- package/dist/adapters/capture-target-offers.mjs.map +1 -0
- package/dist/adapters/capture-target.d.mts +69 -0
- package/dist/adapters/capture-target.mjs +75 -0
- package/dist/adapters/capture-target.mjs.map +1 -0
- package/dist/adapters/notifier/build-comment.d.mts +22 -0
- package/dist/adapters/notifier/build-comment.mjs +23 -0
- package/dist/adapters/notifier/build-comment.mjs.map +1 -0
- package/dist/adapters/notifier/build-state.d.mts +97 -0
- package/dist/adapters/notifier/build-state.mjs +217 -0
- package/dist/adapters/notifier/build-state.mjs.map +1 -0
- package/dist/adapters/notifier/events.d.mts +4 -4
- package/dist/adapters/notifier/events.mjs +32 -20
- package/dist/adapters/notifier/events.mjs.map +1 -1
- package/dist/adapters/notifier/format.d.mts +0 -2
- package/dist/adapters/notifier/format.mjs +1 -2
- package/dist/adapters/notifier/provider.d.mts +53 -9
- package/dist/adapters/notifier/provider.mjs +11 -0
- package/dist/adapters/notifier/provider.mjs.map +1 -0
- package/dist/adapters/notifier/state.d.mts +22 -0
- package/dist/adapters/notifier/state.mjs +65 -0
- package/dist/adapters/notifier/state.mjs.map +1 -0
- package/dist/adapters/notifier/types.d.mts +51 -4
- package/dist/adapters/remote-browser.d.mts +168 -0
- package/dist/adapters/remote-browser.mjs +201 -0
- package/dist/adapters/remote-browser.mjs.map +1 -0
- package/dist/adapters/remote-lease-attempt.mjs +39 -0
- package/dist/adapters/remote-lease-attempt.mjs.map +1 -0
- package/dist/adapters/remote-lease-error.d.mts +25 -0
- package/dist/adapters/remote-lease-error.mjs +54 -0
- package/dist/adapters/remote-lease-error.mjs.map +1 -0
- package/dist/adapters/remote-lease-held.d.mts +15 -0
- package/dist/adapters/remote-lease-held.mjs +86 -0
- package/dist/adapters/remote-lease-held.mjs.map +1 -0
- package/dist/adapters/remote-lease-shutdown.d.mts +12 -0
- package/dist/adapters/remote-lease-shutdown.mjs +32 -0
- package/dist/adapters/remote-lease-shutdown.mjs.map +1 -0
- package/dist/adapters/remote-lease.d.mts +39 -0
- package/dist/adapters/remote-lease.mjs +175 -0
- package/dist/adapters/remote-lease.mjs.map +1 -0
- package/dist/adapters/remote-limiter.mjs +121 -0
- package/dist/adapters/remote-limiter.mjs.map +1 -0
- package/dist/adapters/remote-pool.d.mts +56 -0
- package/dist/adapters/remote-pool.mjs +195 -0
- package/dist/adapters/remote-pool.mjs.map +1 -0
- package/dist/adapters/render-runs.d.mts +23 -0
- package/dist/adapters/render-runs.mjs +40 -0
- package/dist/adapters/render-runs.mjs.map +1 -0
- package/dist/adapters/setup-runner.d.mts +0 -2
- package/dist/adapters/setup-runner.mjs +3 -6
- package/dist/adapters/setup-runner.mjs.map +1 -1
- package/dist/adapters/sources.d.mts +10 -0
- package/dist/adapters/sources.mjs +19 -0
- package/dist/adapters/sources.mjs.map +1 -0
- package/dist/adapters/validate.d.mts +0 -2
- package/dist/adapters/validate.mjs +27 -20
- package/dist/adapters/validate.mjs.map +1 -1
- package/dist/ai.d.mts +103 -0
- package/dist/ai.mjs +18 -0
- package/dist/ai.mjs.map +1 -0
- package/dist/auth.d.mts +0 -2
- package/dist/auth.mjs +1 -2
- package/dist/brand-packs.d.mts +0 -2
- package/dist/brand-packs.mjs +0 -1
- package/dist/capture/a11y/axe-source.d.mts +16 -0
- package/dist/capture/a11y/axe-source.mjs +36 -0
- package/dist/capture/a11y/axe-source.mjs.map +1 -0
- package/dist/capture/a11y/in-page.d.mts +25 -0
- package/dist/capture/a11y/in-page.mjs +59 -0
- package/dist/capture/a11y/in-page.mjs.map +1 -0
- package/dist/capture/a11y/map.d.mts +22 -0
- package/dist/capture/a11y/map.mjs +47 -0
- package/dist/capture/a11y/map.mjs.map +1 -0
- package/dist/capture/a11y/options.d.mts +21 -0
- package/dist/capture/a11y/options.mjs +74 -0
- package/dist/capture/a11y/options.mjs.map +1 -0
- package/dist/capture/adapter.d.mts +46 -5
- package/dist/capture/adapter.mjs +1 -2
- package/dist/capture/adapter.mjs.map +1 -1
- package/dist/capture/affected.d.mts +2 -2
- package/dist/capture/affected.mjs +14 -6
- package/dist/capture/affected.mjs.map +1 -1
- package/dist/capture/attempt-logger.mjs +83 -0
- package/dist/capture/attempt-logger.mjs.map +1 -0
- package/dist/capture/browsers.d.mts +33 -0
- package/dist/capture/browsers.mjs +66 -0
- package/dist/capture/browsers.mjs.map +1 -0
- package/dist/capture/build-state/deliver.d.mts +30 -0
- package/dist/capture/build-state/deliver.mjs +117 -0
- package/dist/capture/build-state/deliver.mjs.map +1 -0
- package/dist/capture/build-state/index.d.mts +8 -0
- package/dist/capture/build-state/notify-job.d.mts +54 -0
- package/dist/capture/build-state/notify-job.mjs +132 -0
- package/dist/capture/build-state/notify-job.mjs.map +1 -0
- package/dist/capture/build-state/publisher.d.mts +21 -0
- package/dist/capture/build-state/publisher.mjs +106 -0
- package/dist/capture/build-state/publisher.mjs.map +1 -0
- package/dist/capture/build-state/resume.d.mts +7 -0
- package/dist/capture/build-state/resume.mjs +46 -0
- package/dist/capture/build-state/resume.mjs.map +1 -0
- package/dist/capture/build-state/types.d.mts +47 -0
- package/dist/capture/catalog/catalogue.d.mts +20 -0
- package/dist/capture/catalog/catalogue.mjs +52 -0
- package/dist/capture/catalog/catalogue.mjs.map +1 -0
- package/dist/capture/catalog/components.d.mts +21 -0
- package/dist/capture/catalog/components.mjs +54 -0
- package/dist/capture/catalog/components.mjs.map +1 -0
- package/dist/capture/catalog/history.d.mts +28 -0
- package/dist/capture/catalog/history.mjs +50 -0
- package/dist/capture/catalog/history.mjs.map +1 -0
- package/dist/capture/catalog/hook.d.mts +12 -0
- package/dist/capture/catalog/hook.mjs +18 -0
- package/dist/capture/catalog/hook.mjs.map +1 -0
- package/dist/capture/catalog/index.d.mts +11 -0
- package/dist/capture/catalog/load.d.mts +24 -0
- package/dist/capture/catalog/load.mjs +48 -0
- package/dist/capture/catalog/load.mjs.map +1 -0
- package/dist/capture/catalog/parse.d.mts +13 -0
- package/dist/capture/catalog/parse.mjs +55 -0
- package/dist/capture/catalog/parse.mjs.map +1 -0
- package/dist/capture/catalog/read.d.mts +15 -0
- package/dist/capture/catalog/read.mjs +39 -0
- package/dist/capture/catalog/read.mjs.map +1 -0
- package/dist/capture/catalog/types.d.mts +31 -0
- package/dist/capture/comparison-reference.d.mts +27 -0
- package/dist/capture/comparison-reference.mjs +75 -0
- package/dist/capture/comparison-reference.mjs.map +1 -0
- package/dist/capture/consumer/capture-handler.d.mts +56 -0
- package/dist/capture/consumer/capture-handler.mjs +117 -0
- package/dist/capture/consumer/capture-handler.mjs.map +1 -0
- package/dist/capture/consumer/idle.d.mts +15 -0
- package/dist/capture/consumer/idle.mjs +24 -0
- package/dist/capture/consumer/idle.mjs.map +1 -0
- package/dist/capture/consumer/index.d.mts +11 -0
- package/dist/capture/consumer/index.mjs +138 -0
- package/dist/capture/consumer/index.mjs.map +1 -0
- package/dist/capture/consumer/loop.mjs +109 -0
- package/dist/capture/consumer/loop.mjs.map +1 -0
- package/dist/capture/consumer/metrics.d.mts +39 -0
- package/dist/capture/consumer/metrics.mjs +37 -0
- package/dist/capture/consumer/metrics.mjs.map +1 -0
- package/dist/capture/consumer/retry.d.mts +31 -0
- package/dist/capture/consumer/retry.mjs +33 -0
- package/dist/capture/consumer/retry.mjs.map +1 -0
- package/dist/capture/consumer/run-job.mjs +194 -0
- package/dist/capture/consumer/run-job.mjs.map +1 -0
- package/dist/capture/consumer/startup.mjs +37 -0
- package/dist/capture/consumer/startup.mjs.map +1 -0
- package/dist/capture/consumer/types.d.mts +95 -0
- package/dist/capture/crash-failure.d.mts +23 -0
- package/dist/capture/crash-failure.mjs +69 -0
- package/dist/capture/crash-failure.mjs.map +1 -0
- package/dist/capture/db-queue/cadence.d.mts +30 -0
- package/dist/capture/db-queue/cadence.mjs +37 -0
- package/dist/capture/db-queue/cadence.mjs.map +1 -0
- package/dist/capture/db-queue/claim.d.mts +7 -0
- package/dist/capture/db-queue/claim.mjs +148 -0
- package/dist/capture/db-queue/claim.mjs.map +1 -0
- package/dist/capture/db-queue/clock.mjs +11 -0
- package/dist/capture/db-queue/clock.mjs.map +1 -0
- package/dist/capture/db-queue/codec.mjs +75 -0
- package/dist/capture/db-queue/codec.mjs.map +1 -0
- package/dist/capture/db-queue/index.d.mts +18 -0
- package/dist/capture/db-queue/index.mjs +89 -0
- package/dist/capture/db-queue/index.mjs.map +1 -0
- package/dist/capture/db-queue/keeper.d.mts +34 -0
- package/dist/capture/db-queue/keeper.mjs +91 -0
- package/dist/capture/db-queue/keeper.mjs.map +1 -0
- package/dist/capture/db-queue/lease.mjs +45 -0
- package/dist/capture/db-queue/lease.mjs.map +1 -0
- package/dist/capture/db-queue/lifecycle.mjs +35 -0
- package/dist/capture/db-queue/lifecycle.mjs.map +1 -0
- package/dist/capture/db-queue/operations.mjs +93 -0
- package/dist/capture/db-queue/operations.mjs.map +1 -0
- package/dist/capture/db-queue/poll-loop.d.mts +28 -0
- package/dist/capture/db-queue/poll-loop.mjs +88 -0
- package/dist/capture/db-queue/poll-loop.mjs.map +1 -0
- package/dist/capture/db-queue/poll.d.mts +8 -0
- package/dist/capture/db-queue/poll.mjs +68 -0
- package/dist/capture/db-queue/poll.mjs.map +1 -0
- package/dist/capture/db-queue/timers.d.mts +10 -0
- package/dist/capture/db-queue/timers.mjs +36 -0
- package/dist/capture/db-queue/timers.mjs.map +1 -0
- package/dist/capture/db-queue/types.d.mts +81 -0
- package/dist/capture/db-queue/types.mjs +11 -0
- package/dist/capture/db-queue/types.mjs.map +1 -0
- package/dist/capture/db-queue/wake.mjs +47 -0
- package/dist/capture/db-queue/wake.mjs.map +1 -0
- package/dist/capture/design.mjs +38 -0
- package/dist/capture/design.mjs.map +1 -0
- package/dist/capture/diff-record.mjs +24 -5
- package/dist/capture/diff-record.mjs.map +1 -1
- package/dist/capture/dispatch.d.mts +13 -10
- package/dist/capture/dispatch.mjs +102 -111
- package/dist/capture/dispatch.mjs.map +1 -1
- package/dist/capture/enrich.mjs +59 -0
- package/dist/capture/enrich.mjs.map +1 -0
- package/dist/capture/failure-sets.mjs +21 -0
- package/dist/capture/failure-sets.mjs.map +1 -0
- package/dist/capture/fingerprint.d.mts +40 -0
- package/dist/capture/fingerprint.mjs +82 -0
- package/dist/capture/fingerprint.mjs.map +1 -0
- package/dist/capture/forked/channel.d.mts +23 -0
- package/dist/capture/forked/child.d.mts +32 -0
- package/dist/capture/forked/child.mjs +201 -0
- package/dist/capture/forked/child.mjs.map +1 -0
- package/dist/capture/forked/crash-tracker.mjs +22 -0
- package/dist/capture/forked/crash-tracker.mjs.map +1 -0
- package/dist/capture/forked/decision.d.mts +24 -0
- package/dist/capture/forked/decision.mjs +26 -0
- package/dist/capture/forked/decision.mjs.map +1 -0
- package/dist/capture/forked/exit.mjs +11 -0
- package/dist/capture/forked/exit.mjs.map +1 -0
- package/dist/capture/forked/fork.d.mts +29 -0
- package/dist/capture/forked/fork.mjs +92 -0
- package/dist/capture/forked/fork.mjs.map +1 -0
- package/dist/capture/forked/forked-capture.d.mts +38 -0
- package/dist/capture/forked/forked-capture.mjs +239 -0
- package/dist/capture/forked/forked-capture.mjs.map +1 -0
- package/dist/capture/forked/lease-book.mjs +45 -0
- package/dist/capture/forked/lease-book.mjs.map +1 -0
- package/dist/capture/forked/protocol.d.mts +36 -0
- package/dist/capture/forked/protocol.mjs +24 -0
- package/dist/capture/forked/protocol.mjs.map +1 -0
- package/dist/capture/forked/runs.mjs +74 -0
- package/dist/capture/forked/runs.mjs.map +1 -0
- package/dist/capture/guards.mjs +1 -2
- package/dist/capture/ignore-regions.d.mts +36 -0
- package/dist/capture/ignore-regions.mjs +65 -0
- package/dist/capture/ignore-regions.mjs.map +1 -0
- package/dist/capture/isolate.mjs +140 -0
- package/dist/capture/isolate.mjs.map +1 -0
- package/dist/capture/job-lease.d.mts +26 -0
- package/dist/capture/job-lease.mjs +56 -0
- package/dist/capture/job-lease.mjs.map +1 -0
- package/dist/capture/matrix.mjs +298 -0
- package/dist/capture/matrix.mjs.map +1 -0
- package/dist/capture/modes.d.mts +23 -0
- package/dist/capture/modes.mjs +106 -0
- package/dist/capture/modes.mjs.map +1 -0
- package/dist/capture/orchestrator.d.mts +37 -7
- package/dist/capture/orchestrator.mjs +120 -110
- package/dist/capture/orchestrator.mjs.map +1 -1
- package/dist/capture/pipeline.d.mts +9 -4
- package/dist/capture/pipeline.mjs +284 -48
- package/dist/capture/pipeline.mjs.map +1 -1
- package/dist/capture/progress.d.mts +9 -0
- package/dist/capture/progress.mjs +27 -0
- package/dist/capture/progress.mjs.map +1 -0
- package/dist/capture/publish/accept.d.mts +37 -0
- package/dist/capture/publish/accept.mjs +27 -0
- package/dist/capture/publish/accept.mjs.map +1 -0
- package/dist/capture/publish/complete.d.mts +44 -0
- package/dist/capture/publish/complete.mjs +63 -0
- package/dist/capture/publish/complete.mjs.map +1 -0
- package/dist/capture/publish/extract.d.mts +18 -0
- package/dist/capture/publish/extract.mjs +120 -0
- package/dist/capture/publish/extract.mjs.map +1 -0
- package/dist/capture/publish/handler.d.mts +26 -0
- package/dist/capture/publish/handler.mjs +61 -0
- package/dist/capture/publish/handler.mjs.map +1 -0
- package/dist/capture/publish/index.d.mts +11 -0
- package/dist/capture/publish/invalid-zip.d.mts +8 -0
- package/dist/capture/publish/invalid-zip.mjs +11 -0
- package/dist/capture/publish/invalid-zip.mjs.map +1 -0
- package/dist/capture/publish/limits.d.mts +35 -0
- package/dist/capture/publish/limits.mjs +38 -0
- package/dist/capture/publish/limits.mjs.map +1 -0
- package/dist/capture/publish/published.d.mts +13 -0
- package/dist/capture/publish/published.mjs +17 -0
- package/dist/capture/publish/published.mjs.map +1 -0
- package/dist/capture/publish/run.d.mts +31 -0
- package/dist/capture/publish/run.mjs +29 -0
- package/dist/capture/publish/run.mjs.map +1 -0
- package/dist/capture/rediff.d.mts +1 -3
- package/dist/capture/rediff.mjs +23 -9
- package/dist/capture/rediff.mjs.map +1 -1
- package/dist/capture/render.mjs +52 -0
- package/dist/capture/render.mjs.map +1 -0
- package/dist/capture/scratch.d.mts +42 -0
- package/dist/capture/scratch.mjs +136 -0
- package/dist/capture/scratch.mjs.map +1 -0
- package/dist/capture/shard-plan.mjs +127 -0
- package/dist/capture/shard-plan.mjs.map +1 -0
- package/dist/capture/shards/context.mjs +51 -0
- package/dist/capture/shards/context.mjs.map +1 -0
- package/dist/capture/shards/execute.mjs +175 -0
- package/dist/capture/shards/execute.mjs.map +1 -0
- package/dist/capture/shards/fan-out.mjs +125 -0
- package/dist/capture/shards/fan-out.mjs.map +1 -0
- package/dist/capture/shards/history.mjs +34 -0
- package/dist/capture/shards/history.mjs.map +1 -0
- package/dist/capture/shards/reduce.mjs +96 -0
- package/dist/capture/shards/reduce.mjs.map +1 -0
- package/dist/capture/sizing.d.mts +0 -2
- package/dist/capture/sizing.mjs +2 -13
- package/dist/capture/sizing.mjs.map +1 -1
- package/dist/capture/skip-checks.mjs +3 -67
- package/dist/capture/skip-checks.mjs.map +1 -1
- package/dist/capture/statics.d.mts +7 -10
- package/dist/capture/statics.mjs +26 -74
- package/dist/capture/statics.mjs.map +1 -1
- package/dist/capture/storybook-urls.d.mts +38 -0
- package/dist/capture/storybook-urls.mjs +41 -0
- package/dist/capture/storybook-urls.mjs.map +1 -0
- package/dist/capture/storybook.d.mts +12 -6
- package/dist/capture/storybook.mjs +63 -19
- package/dist/capture/storybook.mjs.map +1 -1
- package/dist/capture/target.mjs +20 -0
- package/dist/capture/target.mjs.map +1 -0
- package/dist/capture/targets.d.mts +23 -0
- package/dist/capture/targets.mjs +31 -0
- package/dist/capture/targets.mjs.map +1 -0
- package/dist/capture/tests.d.mts +35 -0
- package/dist/capture/tests.mjs +136 -0
- package/dist/capture/tests.mjs.map +1 -0
- package/dist/capture/token-chunks.mjs +91 -0
- package/dist/capture/token-chunks.mjs.map +1 -0
- package/dist/capture.d.mts +63 -7
- package/dist/capture.mjs +51 -3
- package/dist/config.d.mts +136 -14
- package/dist/config.mjs +14 -8
- package/dist/config.mjs.map +1 -1
- package/dist/diff.d.mts +7 -3
- package/dist/diff.mjs +15 -3
- package/dist/diff.mjs.map +1 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +2 -2
- package/dist/insights/budget.d.mts +18 -0
- package/dist/insights/budget.mjs +32 -0
- package/dist/insights/budget.mjs.map +1 -0
- package/dist/insights/envelope.d.mts +57 -0
- package/dist/insights/envelope.mjs +59 -0
- package/dist/insights/envelope.mjs.map +1 -0
- package/dist/insights/evidence-health.d.mts +30 -0
- package/dist/insights/evidence-health.mjs +27 -0
- package/dist/insights/evidence-health.mjs.map +1 -0
- package/dist/insights/evidence.d.mts +53 -0
- package/dist/insights/evidence.mjs +63 -0
- package/dist/insights/evidence.mjs.map +1 -0
- package/dist/insights/hash.d.mts +16 -0
- package/dist/insights/hash.mjs +20 -0
- package/dist/insights/hash.mjs.map +1 -0
- package/dist/insights/limits.d.mts +22 -0
- package/dist/insights/limits.mjs +23 -0
- package/dist/insights/limits.mjs.map +1 -0
- package/dist/insights/prompts/v1.d.mts +11 -0
- package/dist/insights/prompts/v1.mjs +33 -0
- package/dist/insights/prompts/v1.mjs.map +1 -0
- package/dist/insights/redact.d.mts +7 -0
- package/dist/insights/redact.mjs +23 -0
- package/dist/insights/redact.mjs.map +1 -0
- package/dist/insights/text.mjs +43 -0
- package/dist/insights/text.mjs.map +1 -0
- package/dist/insights.d.mts +11 -0
- package/dist/insights.mjs +12 -0
- package/dist/logger.d.mts +0 -2
- package/dist/logger.mjs +18 -3
- package/dist/logger.mjs.map +1 -1
- package/dist/models/ai-budget-alert.d.mts +21 -0
- package/dist/models/ai-budget-alert.mjs +37 -0
- package/dist/models/ai-budget-alert.mjs.map +1 -0
- package/dist/models/ai-usage.d.mts +38 -0
- package/dist/models/ai-usage.mjs +60 -0
- package/dist/models/ai-usage.mjs.map +1 -0
- package/dist/models/baseline-approval.d.mts +18 -0
- package/dist/models/baseline-approval.mjs +41 -0
- package/dist/models/baseline-approval.mjs.map +1 -0
- package/dist/models/baseline-archive.d.mts +82 -0
- package/dist/models/baseline-archive.mjs +105 -0
- package/dist/models/baseline-archive.mjs.map +1 -0
- package/dist/models/baseline-atomic.mjs +66 -0
- package/dist/models/baseline-atomic.mjs.map +1 -0
- package/dist/models/baseline-conflict.d.mts +6 -0
- package/dist/models/baseline-conflict.mjs +9 -0
- package/dist/models/baseline-conflict.mjs.map +1 -0
- package/dist/models/baseline-export.d.mts +17 -0
- package/dist/models/baseline-export.mjs +135 -0
- package/dist/models/baseline-export.mjs.map +1 -0
- package/dist/models/baseline-import.mjs +117 -0
- package/dist/models/baseline-import.mjs.map +1 -0
- package/dist/models/baseline-origin.d.mts +16 -0
- package/dist/models/baseline-origin.mjs +35 -0
- package/dist/models/baseline-origin.mjs.map +1 -0
- package/dist/models/baseline-status.d.mts +0 -2
- package/dist/models/baseline-status.mjs +1 -2
- package/dist/models/baseline-transfer.d.mts +48 -0
- package/dist/models/baseline-transfer.mjs +149 -0
- package/dist/models/baseline-transfer.mjs.map +1 -0
- package/dist/models/baseline.d.mts +37 -7
- package/dist/models/baseline.mjs +152 -28
- package/dist/models/baseline.mjs.map +1 -1
- package/dist/models/build-component.d.mts +26 -0
- package/dist/models/build-component.mjs +54 -0
- package/dist/models/build-component.mjs.map +1 -0
- package/dist/models/build-review-status.d.mts +27 -0
- package/dist/models/build-review-status.mjs +36 -0
- package/dist/models/build-review-status.mjs.map +1 -0
- package/dist/models/build-review.d.mts +26 -0
- package/dist/models/build-review.mjs +53 -0
- package/dist/models/build-review.mjs.map +1 -0
- package/dist/models/build.d.mts +25 -5
- package/dist/models/build.mjs +53 -15
- package/dist/models/build.mjs.map +1 -1
- package/dist/models/capture-attempt.d.mts +7 -3
- package/dist/models/capture-attempt.mjs +30 -6
- package/dist/models/capture-attempt.mjs.map +1 -1
- package/dist/models/capture-job.d.mts +104 -0
- package/dist/models/capture-job.mjs +287 -0
- package/dist/models/capture-job.mjs.map +1 -0
- package/dist/models/capture-log.d.mts +1 -3
- package/dist/models/capture-log.mjs +5 -5
- package/dist/models/capture-log.mjs.map +1 -1
- package/dist/models/capture-shard.d.mts +60 -0
- package/dist/models/capture-shard.mjs +189 -0
- package/dist/models/capture-shard.mjs.map +1 -0
- package/dist/models/changeset.d.mts +46 -0
- package/dist/models/changeset.mjs +80 -0
- package/dist/models/changeset.mjs.map +1 -0
- package/dist/models/columns.mjs +18 -0
- package/dist/models/columns.mjs.map +1 -0
- package/dist/models/comment.d.mts +4 -3
- package/dist/models/comment.mjs +8 -6
- package/dist/models/comment.mjs.map +1 -1
- package/dist/models/component.d.mts +41 -0
- package/dist/models/component.mjs +59 -0
- package/dist/models/component.mjs.map +1 -0
- package/dist/models/connections.d.mts +39 -0
- package/dist/models/connections.mjs +111 -0
- package/dist/models/connections.mjs.map +1 -0
- package/dist/models/content-ref.d.mts +1 -3
- package/dist/models/content-ref.mjs +2 -3
- package/dist/models/content-ref.mjs.map +1 -1
- package/dist/models/credentials.d.mts +0 -2
- package/dist/models/credentials.mjs +13 -4
- package/dist/models/credentials.mjs.map +1 -1
- package/dist/models/design-credentials.d.mts +39 -0
- package/dist/models/design-credentials.mjs +85 -0
- package/dist/models/design-credentials.mjs.map +1 -0
- package/dist/models/design-health.d.mts +14 -0
- package/dist/models/design-health.mjs +24 -0
- package/dist/models/design-health.mjs.map +1 -0
- package/dist/models/design-nodes.d.mts +81 -0
- package/dist/models/design-nodes.mjs +221 -0
- package/dist/models/design-nodes.mjs.map +1 -0
- package/dist/models/design-renders.mjs +73 -0
- package/dist/models/design-renders.mjs.map +1 -0
- package/dist/models/design-resolve.d.mts +27 -0
- package/dist/models/design-resolve.mjs +40 -0
- package/dist/models/design-resolve.mjs.map +1 -0
- package/dist/models/design.d.mts +37 -0
- package/dist/models/design.mjs +89 -0
- package/dist/models/design.mjs.map +1 -0
- package/dist/models/inherited-ratio.d.mts +19 -0
- package/dist/models/inherited-ratio.mjs +21 -0
- package/dist/models/inherited-ratio.mjs.map +1 -0
- package/dist/models/insight.d.mts +68 -0
- package/dist/models/insight.mjs +161 -0
- package/dist/models/insight.mjs.map +1 -0
- package/dist/models/label.d.mts +4 -4
- package/dist/models/label.mjs +26 -12
- package/dist/models/label.mjs.map +1 -1
- package/dist/models/member.d.mts +1 -3
- package/dist/models/member.mjs +6 -6
- package/dist/models/member.mjs.map +1 -1
- package/dist/models/notification-channel.d.mts +37 -5
- package/dist/models/notification-channel.mjs +89 -11
- package/dist/models/notification-channel.mjs.map +1 -1
- package/dist/models/notification-subscription.d.mts +1 -4
- package/dist/models/notification-subscription.mjs +8 -11
- package/dist/models/notification-subscription.mjs.map +1 -1
- package/dist/models/project-group-mapping.d.mts +6 -3
- package/dist/models/project-group-mapping.mjs +15 -6
- package/dist/models/project-group-mapping.mjs.map +1 -1
- package/dist/models/project.d.mts +9 -3
- package/dist/models/project.mjs +10 -6
- package/dist/models/project.mjs.map +1 -1
- package/dist/models/public-origin.d.mts +61 -0
- package/dist/models/public-origin.mjs +113 -0
- package/dist/models/public-origin.mjs.map +1 -0
- package/dist/models/review-switch-off.d.mts +12 -0
- package/dist/models/review-switch-off.mjs +25 -0
- package/dist/models/review-switch-off.mjs.map +1 -0
- package/dist/models/site-settings.d.mts +21 -0
- package/dist/models/site-settings.mjs +47 -0
- package/dist/models/site-settings.mjs.map +1 -0
- package/dist/models/snapshot.d.mts +39 -3
- package/dist/models/snapshot.mjs +54 -5
- package/dist/models/snapshot.mjs.map +1 -1
- package/dist/models/token.d.mts +13 -3
- package/dist/models/token.mjs +24 -7
- package/dist/models/token.mjs.map +1 -1
- package/dist/models/usage.d.mts +74 -0
- package/dist/models/usage.mjs +148 -0
- package/dist/models/usage.mjs.map +1 -0
- package/dist/models/user.d.mts +1 -3
- package/dist/models/user.mjs +5 -5
- package/dist/models/user.mjs.map +1 -1
- package/dist/models/webhook.d.mts +15 -3
- package/dist/models/webhook.mjs +34 -6
- package/dist/models/webhook.mjs.map +1 -1
- package/dist/models.d.mts +30 -4
- package/dist/models.mjs +31 -6
- package/dist/options.d.mts +16 -0
- package/dist/options.mjs +88 -0
- package/dist/options.mjs.map +1 -0
- package/dist/paths.d.mts +21 -6
- package/dist/paths.mjs +57 -12
- package/dist/paths.mjs.map +1 -1
- package/dist/retention/ai.d.mts +16 -0
- package/dist/retention/ai.mjs +22 -0
- package/dist/retention/ai.mjs.map +1 -0
- package/dist/retention/pending.mjs +46 -0
- package/dist/retention/pending.mjs.map +1 -0
- package/dist/retention/published-gzip-sweep.mjs +28 -0
- package/dist/retention/published-gzip-sweep.mjs.map +1 -0
- package/dist/retention/screenshot-sweep.d.mts +49 -0
- package/dist/retention/screenshot-sweep.mjs +127 -0
- package/dist/retention/screenshot-sweep.mjs.map +1 -0
- package/dist/retention.d.mts +16 -4
- package/dist/retention.mjs +76 -16
- package/dist/retention.mjs.map +1 -1
- package/dist/schema/baseline.d.mts +8 -2
- package/dist/schema/build-component.d.mts +23 -0
- package/dist/schema/build-review.d.mts +15 -0
- package/dist/schema/build.d.mts +7 -2
- package/dist/schema/capture-attempt.d.mts +0 -2
- package/dist/schema/capture-job.d.mts +58 -0
- package/dist/schema/capture-shard.d.mts +33 -0
- package/dist/schema/comment.d.mts +2 -2
- package/dist/schema/connection.d.mts +22 -0
- package/dist/schema/content-ref.d.mts +0 -2
- package/dist/schema/design.d.mts +56 -0
- package/dist/schema/insight.d.mts +52 -0
- package/dist/schema/label.d.mts +0 -2
- package/dist/schema/member.d.mts +0 -2
- package/dist/schema/notification.d.mts +4 -2
- package/dist/schema/project-group-mapping.d.mts +0 -2
- package/dist/schema/project.d.mts +21 -2
- package/dist/schema/site-setting.d.mts +19 -0
- package/dist/schema/snapshot.d.mts +17 -2
- package/dist/schema/token.d.mts +0 -2
- package/dist/schema/usage.d.mts +28 -0
- package/dist/schema/user.d.mts +0 -2
- package/dist/schema/webhook.d.mts +0 -2
- package/dist/schema.d.mts +12 -6
- package/dist/serverless.d.mts +19 -0
- package/dist/serverless.mjs +36 -0
- package/dist/serverless.mjs.map +1 -0
- package/dist/test-helpers/build-reference-contract.d.mts +14 -0
- package/dist/test-helpers/build-reference-contract.mjs +66 -0
- package/dist/test-helpers/build-reference-contract.mjs.map +1 -0
- package/dist/test-helpers/create-project.d.mts +1 -3
- package/dist/test-helpers/create-project.mjs +1 -2
- package/dist/test-helpers/database-contract.d.mts +0 -2
- package/dist/test-helpers/database-contract.mjs +37 -2
- package/dist/test-helpers/database-contract.mjs.map +1 -1
- package/dist/test-helpers/deferred.d.mts +37 -0
- package/dist/test-helpers/deferred.mjs +60 -0
- package/dist/test-helpers/deferred.mjs.map +1 -0
- package/dist/test-helpers/design-contract.d.mts +19 -0
- package/dist/test-helpers/design-contract.mjs +39 -0
- package/dist/test-helpers/design-contract.mjs.map +1 -0
- package/dist/test-helpers/fake-adapters.d.mts +0 -2
- package/dist/test-helpers/fake-adapters.mjs +1 -2
- package/dist/test-helpers/fake-database.d.mts +0 -2
- package/dist/test-helpers/fake-database.mjs +21 -4
- package/dist/test-helpers/fake-database.mjs.map +1 -1
- package/dist/test-helpers/fake-design.d.mts +41 -0
- package/dist/test-helpers/fake-design.mjs +113 -0
- package/dist/test-helpers/fake-design.mjs.map +1 -0
- package/dist/test-helpers/fake-notifier.d.mts +19 -0
- package/dist/test-helpers/fake-notifier.mjs +43 -0
- package/dist/test-helpers/fake-notifier.mjs.map +1 -0
- package/dist/test-helpers/fake-storage.d.mts +0 -2
- package/dist/test-helpers/fake-storage.mjs +1 -2
- package/dist/test-helpers/fake-tables.mjs +260 -69
- package/dist/test-helpers/fake-tables.mjs.map +1 -1
- package/dist/test-helpers/manual-clock.d.mts +25 -0
- package/dist/test-helpers/manual-clock.mjs +55 -0
- package/dist/test-helpers/manual-clock.mjs.map +1 -0
- package/dist/test-helpers/notifier-contract.d.mts +7 -3
- package/dist/test-helpers/notifier-contract.mjs +33 -5
- package/dist/test-helpers/notifier-contract.mjs.map +1 -1
- package/dist/test-helpers/queue-contract.d.mts +16 -4
- package/dist/test-helpers/queue-contract.mjs +196 -3
- package/dist/test-helpers/queue-contract.mjs.map +1 -1
- package/dist/test-helpers/queue-multi-instance.d.mts +18 -0
- package/dist/test-helpers/queue-multi-instance.mjs +205 -0
- package/dist/test-helpers/queue-multi-instance.mjs.map +1 -0
- package/dist/test-helpers/runner-contract.d.mts +0 -2
- package/dist/test-helpers/runner-contract.mjs +12 -2
- package/dist/test-helpers/runner-contract.mjs.map +1 -1
- package/dist/test-helpers/sql-chunks.mjs +25 -2
- package/dist/test-helpers/sql-chunks.mjs.map +1 -1
- package/dist/test-helpers/storage-contract.d.mts +0 -2
- package/dist/test-helpers/storage-contract.mjs +2 -3
- package/dist/test-helpers.d.mts +10 -4
- package/dist/test-helpers.mjs +9 -3
- package/dist/tracing.mjs +36 -6
- package/dist/tracing.mjs.map +1 -1
- package/dist/types.d.mts +14 -5
- package/dist/types.mjs +22 -6
- package/dist/types.mjs.map +1 -1
- package/dist/urls.d.mts +4 -2
- package/dist/urls.mjs +12 -4
- package/dist/urls.mjs.map +1 -1
- package/dist/utils/adaptive-concurrency.d.mts +64 -0
- package/dist/utils/adaptive-concurrency.mjs +148 -0
- package/dist/utils/adaptive-concurrency.mjs.map +1 -0
- package/dist/utils/connect-retry.d.mts +26 -0
- package/dist/utils/connect-retry.mjs +42 -0
- package/dist/utils/connect-retry.mjs.map +1 -0
- package/dist/utils/encrypt.d.mts +0 -2
- package/dist/utils/encrypt.mjs +1 -2
- package/dist/utils/environment.d.mts +17 -0
- package/dist/utils/environment.mjs +58 -0
- package/dist/utils/environment.mjs.map +1 -0
- package/dist/utils/hash.d.mts +0 -2
- package/dist/utils/hash.mjs +1 -2
- package/dist/utils/http.d.mts +29 -3
- package/dist/utils/http.mjs +100 -19
- package/dist/utils/http.mjs.map +1 -1
- package/dist/utils/map-adaptive.d.mts +13 -0
- package/dist/utils/map-adaptive.mjs +71 -0
- package/dist/utils/map-adaptive.mjs.map +1 -0
- package/dist/utils/map-limit.d.mts +8 -0
- package/dist/utils/map-limit.mjs +31 -0
- package/dist/utils/map-limit.mjs.map +1 -0
- package/dist/utils/mime.d.mts +0 -2
- package/dist/utils/mime.mjs +1 -2
- package/dist/utils/page-limiter.d.mts +35 -0
- package/dist/utils/page-limiter.mjs +55 -0
- package/dist/utils/page-limiter.mjs.map +1 -0
- package/dist/utils/path-security.d.mts +0 -2
- package/dist/utils/path-security.mjs +2 -4
- package/dist/utils/path-security.mjs.map +1 -1
- package/dist/utils/public-origin.d.mts +18 -0
- package/dist/utils/public-origin.mjs +74 -0
- package/dist/utils/public-origin.mjs.map +1 -0
- package/dist/utils/redact.d.mts +0 -2
- package/dist/utils/redact.mjs +4 -2
- package/dist/utils/redact.mjs.map +1 -1
- package/dist/utils/remote-environment.d.mts +76 -0
- package/dist/utils/remote-environment.mjs +163 -0
- package/dist/utils/remote-environment.mjs.map +1 -0
- package/dist/utils/resources.d.mts +62 -0
- package/dist/utils/resources.mjs +121 -0
- package/dist/utils/resources.mjs.map +1 -0
- package/dist/utils/screenshot-store.d.mts +13 -0
- package/dist/utils/screenshot-store.mjs +40 -0
- package/dist/utils/screenshot-store.mjs.map +1 -0
- package/dist/utils/session-gate.d.mts +23 -0
- package/dist/utils/session-gate.mjs +69 -0
- package/dist/utils/session-gate.mjs.map +1 -0
- package/dist/utils/storybook-token.d.mts +89 -0
- package/dist/utils/storybook-token.mjs +135 -0
- package/dist/utils/storybook-token.mjs.map +1 -0
- package/dist/utils/storybook-url.d.mts +13 -0
- package/dist/utils/storybook-url.mjs +20 -0
- package/dist/utils/storybook-url.mjs.map +1 -0
- package/dist/utils/timing.d.mts +0 -2
- package/dist/utils/timing.mjs +2 -3
- package/dist/utils/timing.mjs.map +1 -1
- package/dist/utils/ulid.d.mts +0 -2
- package/dist/utils/ulid.mjs +1 -2
- package/dist/utils/zip-read.mjs +128 -0
- package/dist/utils/zip-read.mjs.map +1 -0
- package/dist/utils/zip-write.d.mts +16 -0
- package/dist/utils/zip-write.mjs +187 -0
- package/dist/utils/zip-write.mjs.map +1 -0
- package/dist/utils.d.mts +17 -3
- package/dist/utils.mjs +18 -4
- package/package.json +35 -26
- package/dist/adapter/capture-runner.mjs.map +0 -1
- package/dist/adapter/git-host/comments.d.mts +0 -41
- package/dist/adapter/git-host/comments.mjs +0 -54
- package/dist/adapter/git-host/comments.mjs.map +0 -1
- package/dist/adapter/git-host/helpers.d.mts +0 -13
- package/dist/adapter/git-host/helpers.mjs +0 -30
- package/dist/adapter/git-host/helpers.mjs.map +0 -1
- package/dist/adapter/git-host.d.mts +0 -42
- package/dist/capture/queue.d.mts +0 -38
- package/dist/capture/queue.mjs +0 -98
- package/dist/capture/queue.mjs.map +0 -1
- package/dist/capture/recovery.d.mts +0 -21
- package/dist/capture/recovery.mjs +0 -83
- package/dist/capture/recovery.mjs.map +0 -1
- package/dist/capture/status-fanout.mjs +0 -72
- package/dist/capture/status-fanout.mjs.map +0 -1
- package/dist/diff/engine.d.mts +0 -16
- package/dist/diff/engine.mjs +0 -87
- package/dist/diff/engine.mjs.map +0 -1
- package/dist/diff/options.d.mts +0 -42
- package/dist/diff/options.mjs +0 -15
- package/dist/diff/options.mjs.map +0 -1
- package/dist/models/status-config.d.mts +0 -38
- package/dist/models/status-config.mjs +0 -63
- package/dist/models/status-config.mjs.map +0 -1
- package/dist/schema/status-config.d.mts +0 -16
- package/dist/test-helpers/git-contract.d.mts +0 -11
- package/dist/test-helpers/git-contract.mjs +0 -34
- package/dist/test-helpers/git-contract.mjs.map +0 -1
- /package/dist/adapter/{git-host.mjs → oauth.mjs} +0 -0
package/dist/utils/timing.mjs
CHANGED
|
@@ -2,12 +2,12 @@ import "node:path";
|
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
5
|
-
|
|
5
|
+
// src/utils/timing.ts
|
|
6
6
|
/**
|
|
7
7
|
* Per-scope timing recorder: aggregate millisecond sums under shared names.
|
|
8
8
|
*
|
|
9
9
|
* Framework- and telemetry-free (ALS + numbers only) so any host — the Hono
|
|
10
|
-
* app, the
|
|
10
|
+
* app, the forked capture child, or a third-party server — can open a scope. The
|
|
11
11
|
* app folds request scopes into `Server-Timing`; background scopes surface
|
|
12
12
|
* as log lines and attempt history. Without an open scope every call is a
|
|
13
13
|
* cheap no-op, keeping unit tests and sleeping workers silent.
|
|
@@ -40,7 +40,6 @@ async function timed(name, fn) {
|
|
|
40
40
|
function roundedTimings(timings) {
|
|
41
41
|
return Object.fromEntries(Object.entries(timings).map(([name, ms]) => [name, Math.round(ms)]));
|
|
42
42
|
}
|
|
43
|
-
//#endregion
|
|
44
43
|
export { addTiming, roundedTimings, runWithTimings, timed };
|
|
45
44
|
|
|
46
45
|
//# sourceMappingURL=timing.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timing.mjs","names":[],"sources":["../../src/utils/timing.ts"],"sourcesContent":["/**\n * Per-scope timing recorder: aggregate millisecond sums under shared names.\n *\n * Framework- and telemetry-free (ALS + numbers only) so any host — the Hono\n * app, the
|
|
1
|
+
{"version":3,"file":"timing.mjs","names":[],"sources":["../../src/utils/timing.ts"],"sourcesContent":["/**\n * Per-scope timing recorder: aggregate millisecond sums under shared names.\n *\n * Framework- and telemetry-free (ALS + numbers only) so any host — the Hono\n * app, the forked capture child, or a third-party server — can open a scope. The\n * app folds request scopes into `Server-Timing`; background scopes surface\n * as log lines and attempt history. Without an open scope every call is a\n * cheap no-op, keeping unit tests and sleeping workers silent.\n */\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\n/** Aggregated durations for one scope (family/phase name → total ms). */\nexport type TimingMap = Record<string, number>;\n\nconst scopes = new AsyncLocalStorage<TimingMap>();\n\n/** Run `fn` with a fresh timing scope, returning its result and aggregates. */\nexport async function runWithTimings<T>(\n fn: () => T | Promise<T>,\n): Promise<{ result: T; timings: TimingMap }> {\n const timings: TimingMap = {};\n const result = await scopes.run(timings, fn);\n return { result, timings };\n}\n\n/** Add `durationMs` to `name` in the active scope (no-op when scopeless). */\nexport function addTiming(name: string, durationMs: number): void {\n const timings = scopes.getStore();\n if (!timings) {\n return;\n }\n timings[name] = (timings[name] ?? 0) + durationMs;\n}\n\n/** Run `fn`, recording its wall duration under `name` in the active scope. */\nexport async function timed<T>(name: string, fn: () => T | Promise<T>): Promise<T> {\n const started = performance.now();\n try {\n return await fn();\n } finally {\n addTiming(name, performance.now() - started);\n }\n}\n\n/** Copy of aggregates with whole-millisecond values for logs and headers. */\nexport function roundedTimings(timings: TimingMap): TimingMap {\n return Object.fromEntries(Object.entries(timings).map(([name, ms]) => [name, Math.round(ms)]));\n}\n"],"mappings":";;;;;;;;;;;;;;AAcA,MAAM,SAAS,IAAI,kBAA6B;;AAGhD,eAAsB,eACpB,IAC4C;CAC5C,MAAM,UAAqB,CAAC;CAE5B,OAAO;EAAE,QAAA,MADY,OAAO,IAAI,SAAS,EAAE;EAC1B;CAAQ;AAC3B;;AAGA,SAAgB,UAAU,MAAc,YAA0B;CAChE,MAAM,UAAU,OAAO,SAAS;CAChC,IAAI,CAAC,SACH;CAEF,QAAQ,SAAS,QAAQ,SAAS,KAAK;AACzC;;AAGA,eAAsB,MAAS,MAAc,IAAsC;CACjF,MAAM,UAAU,YAAY,IAAI;CAChC,IAAI;EACF,OAAO,MAAM,GAAG;CAClB,UAAU;EACR,UAAU,MAAM,YAAY,IAAI,IAAI,OAAO;CAC7C;AACF;;AAGA,SAAgB,eAAe,SAA+B;CAC5D,OAAO,OAAO,YAAY,OAAO,QAAQ,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC;AAC/F"}
|
package/dist/utils/ulid.d.mts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import __tsdown_shims_path from 'node:path';
|
|
2
2
|
import __tsdown_shims_url from 'node:url';
|
|
3
|
-
//#region src/utils/ulid.d.ts
|
|
4
3
|
/** Generate a sortable, collision-resistant ULID. */
|
|
5
4
|
declare function ulid(): string;
|
|
6
5
|
/** Convert a name to a URL-safe slug of at most 63 characters. */
|
|
7
6
|
declare function slugify(value: string): string;
|
|
8
|
-
//#endregion
|
|
9
7
|
export { slugify, ulid };
|
|
10
8
|
//# sourceMappingURL=ulid.d.mts.map
|
package/dist/utils/ulid.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import "node:path";
|
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { randomBytes } from "node:crypto";
|
|
5
|
-
|
|
5
|
+
// src/utils/ulid.ts
|
|
6
6
|
/** Generate a sortable, collision-resistant ULID. */
|
|
7
7
|
function ulid() {
|
|
8
8
|
return encodeTime(Date.now()) + encodeRandom(randomBytes(10));
|
|
@@ -37,7 +37,6 @@ function encodeRandom(bytes) {
|
|
|
37
37
|
if (bits > 0) out += CROCKFORD.charAt(buffer << 5 - bits & 31);
|
|
38
38
|
return out;
|
|
39
39
|
}
|
|
40
|
-
//#endregion
|
|
41
40
|
export { slugify, ulid };
|
|
42
41
|
|
|
43
42
|
//# sourceMappingURL=ulid.mjs.map
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import "node:path";
|
|
2
|
+
import "node:url";
|
|
3
|
+
import.meta.url;
|
|
4
|
+
import "node:buffer";
|
|
5
|
+
import { crc32, inflateRawSync } from "node:zlib";
|
|
6
|
+
// src/utils/zip-read.ts
|
|
7
|
+
/** A malformed, unsafe, or over-limit archive. */
|
|
8
|
+
var ZipFormatError = class extends Error {
|
|
9
|
+
name = "ZipFormatError";
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Index the file entries of `archive` by name (directories are skipped).
|
|
13
|
+
*
|
|
14
|
+
* @throws {ZipFormatError} On malformed, unsafe, or over-limit archives.
|
|
15
|
+
*/
|
|
16
|
+
function readZip(archive, limits) {
|
|
17
|
+
const end = findEndOfCentralDirectory(archive);
|
|
18
|
+
const count = archive.readUInt16LE(end + 10);
|
|
19
|
+
if (count > limits.maxEntries) throw new ZipFormatError(`Archive has more than ${limits.maxEntries} entries`);
|
|
20
|
+
const records = readCentralDirectory(archive, archive.readUInt32LE(end + 16), count);
|
|
21
|
+
if (records.reduce((sum, record) => sum + record.size, 0) > limits.maxTotalBytes) throw new ZipFormatError(`Archive expands beyond ${limits.maxTotalBytes} bytes`);
|
|
22
|
+
return indexEntries(archive, records, limits.maxEntryBytes);
|
|
23
|
+
}
|
|
24
|
+
const EOCD_SIGNATURE = 101010256;
|
|
25
|
+
const CENTRAL_SIGNATURE = 33639248;
|
|
26
|
+
const LOCAL_SIGNATURE = 67324752;
|
|
27
|
+
const EOCD_SIZE = 22;
|
|
28
|
+
const MAX_COMMENT = 65535;
|
|
29
|
+
const STORE = 0;
|
|
30
|
+
const DEFLATE = 8;
|
|
31
|
+
function fail(message) {
|
|
32
|
+
throw new ZipFormatError(message);
|
|
33
|
+
}
|
|
34
|
+
function findEndOfCentralDirectory(archive) {
|
|
35
|
+
const floor = Math.max(0, archive.length - EOCD_SIZE - MAX_COMMENT);
|
|
36
|
+
for (let at = archive.length - EOCD_SIZE; at >= floor; at -= 1) if (archive.readUInt32LE(at) === EOCD_SIGNATURE) {
|
|
37
|
+
assertSingleDisk(archive, at);
|
|
38
|
+
return at;
|
|
39
|
+
}
|
|
40
|
+
return fail("Not a zip archive (no end of central directory)");
|
|
41
|
+
}
|
|
42
|
+
function assertSingleDisk(archive, end) {
|
|
43
|
+
const multiDisk = archive.readUInt16LE(end + 4) !== 0 || archive.readUInt16LE(end + 6) !== 0;
|
|
44
|
+
const entriesMismatch = archive.readUInt16LE(end + 8) !== archive.readUInt16LE(end + 10);
|
|
45
|
+
if (multiDisk || entriesMismatch || archive.readUInt32LE(end + 16) === 4294967295) fail("Multi-disk and zip64 archives are not supported");
|
|
46
|
+
}
|
|
47
|
+
function readCentralDirectory(archive, start, count) {
|
|
48
|
+
const records = [];
|
|
49
|
+
let at = start;
|
|
50
|
+
for (let index = 0; index < count; index += 1) {
|
|
51
|
+
const { record, next } = readCentralRecord(archive, at);
|
|
52
|
+
records.push(record);
|
|
53
|
+
at = next;
|
|
54
|
+
}
|
|
55
|
+
return records;
|
|
56
|
+
}
|
|
57
|
+
function readCentralRecord(archive, at) {
|
|
58
|
+
assertRange(archive, at, 46);
|
|
59
|
+
if (archive.readUInt32LE(at) !== CENTRAL_SIGNATURE) fail("Corrupt central directory");
|
|
60
|
+
const nameLength = archive.readUInt16LE(at + 28);
|
|
61
|
+
const extras = archive.readUInt16LE(at + 30) + archive.readUInt16LE(at + 32);
|
|
62
|
+
assertRange(archive, at + 46, nameLength);
|
|
63
|
+
return {
|
|
64
|
+
record: {
|
|
65
|
+
name: archive.toString("utf8", at + 46, at + 46 + nameLength),
|
|
66
|
+
method: archive.readUInt16LE(at + 10),
|
|
67
|
+
flags: archive.readUInt16LE(at + 8),
|
|
68
|
+
crc: archive.readUInt32LE(at + 16),
|
|
69
|
+
compressedSize: archive.readUInt32LE(at + 20),
|
|
70
|
+
size: archive.readUInt32LE(at + 24),
|
|
71
|
+
localOffset: archive.readUInt32LE(at + 42)
|
|
72
|
+
},
|
|
73
|
+
next: at + 46 + nameLength + extras
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function assertRange(archive, start, length) {
|
|
77
|
+
if (start < 0 || start + length > archive.length) fail("Truncated zip archive");
|
|
78
|
+
}
|
|
79
|
+
/** Whether an entry name could escape an extraction root or confuse lookups. */
|
|
80
|
+
function isUnsafeEntryName(name) {
|
|
81
|
+
return name.length === 0 || name.startsWith("/") || name.includes("\\") || name.includes("\0") || /^[a-z]:/iu.test(name) || name.split("/").some((segment) => segment === ".." || segment === ".");
|
|
82
|
+
}
|
|
83
|
+
function indexEntries(archive, records, maxEntryBytes) {
|
|
84
|
+
const entries = /* @__PURE__ */ new Map();
|
|
85
|
+
for (const record of records) {
|
|
86
|
+
if (record.name.endsWith("/")) continue;
|
|
87
|
+
validateRecord(record, maxEntryBytes);
|
|
88
|
+
if (entries.has(record.name)) fail(`Duplicate zip entry: ${record.name}`);
|
|
89
|
+
entries.set(record.name, {
|
|
90
|
+
name: record.name,
|
|
91
|
+
size: record.size,
|
|
92
|
+
read: () => extract(archive, record)
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return entries;
|
|
96
|
+
}
|
|
97
|
+
function validateRecord(record, maxEntryBytes) {
|
|
98
|
+
if (isUnsafeEntryName(record.name)) fail(`Unsafe zip entry name: ${record.name}`);
|
|
99
|
+
if (record.flags % 2 === 1) fail(`Encrypted zip entries are not supported: ${record.name}`);
|
|
100
|
+
if (record.method !== STORE && record.method !== DEFLATE) fail(`Unsupported compression method ${record.method}: ${record.name}`);
|
|
101
|
+
if (record.size > maxEntryBytes) fail(`Zip entry exceeds ${maxEntryBytes} bytes: ${record.name}`);
|
|
102
|
+
}
|
|
103
|
+
function extract(archive, record) {
|
|
104
|
+
const at = record.localOffset;
|
|
105
|
+
assertRange(archive, at, 30);
|
|
106
|
+
if (archive.readUInt32LE(at) !== LOCAL_SIGNATURE) fail(`Corrupt local header: ${record.name}`);
|
|
107
|
+
const raw = entryData(archive, record);
|
|
108
|
+
const data = record.method === STORE ? raw : inflate(raw, record);
|
|
109
|
+
if (data.length !== record.size || crc32(data) !== record.crc) fail(`Zip entry failed integrity check: ${record.name}`);
|
|
110
|
+
return data;
|
|
111
|
+
}
|
|
112
|
+
/** Compressed bytes of an entry, located through its local header. */
|
|
113
|
+
function entryData(archive, record) {
|
|
114
|
+
const at = record.localOffset;
|
|
115
|
+
const start = at + 30 + archive.readUInt16LE(at + 26) + archive.readUInt16LE(at + 28);
|
|
116
|
+
assertRange(archive, start, record.compressedSize);
|
|
117
|
+
return archive.subarray(start, start + record.compressedSize);
|
|
118
|
+
}
|
|
119
|
+
function inflate(raw, record) {
|
|
120
|
+
try {
|
|
121
|
+
return inflateRawSync(raw, { maxOutputLength: record.size + 1 });
|
|
122
|
+
} catch {
|
|
123
|
+
return fail(`Zip entry failed to inflate: ${record.name}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export { ZipFormatError, isUnsafeEntryName, readZip };
|
|
127
|
+
|
|
128
|
+
//# sourceMappingURL=zip-read.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip-read.mjs","names":[],"sources":["../../src/utils/zip-read.ts"],"sourcesContent":["/**\n * Defensive in-memory zip reader for untrusted archives.\n *\n * Reads the central directory of a buffered archive and inflates entries\n * lazily, enforcing entry-count, per-entry and total size limits before any\n * decompression (zip-bomb guard) and verifying each entry's CRC. Entry names\n * that could traverse paths are rejected outright. Supports STORE and\n * DEFLATE; rejects encryption, multi-disk and zip64 archives.\n */\nimport { Buffer } from \"node:buffer\";\nimport { crc32, inflateRawSync } from \"node:zlib\";\n\n/** Limits applied while reading an archive. */\nexport interface ZipReadLimits {\n /** Maximum number of entries in the central directory. */\n maxEntries: number;\n /** Maximum uncompressed size of one entry, in bytes. */\n maxEntryBytes: number;\n /** Maximum combined uncompressed size of all entries, in bytes. */\n maxTotalBytes: number;\n}\n\n/** One file in an archive; `read()` inflates and CRC-checks it. */\nexport interface ZipEntry {\n name: string;\n size: number;\n read: () => Buffer;\n}\n\n/** A malformed, unsafe, or over-limit archive. */\nexport class ZipFormatError extends Error {\n override readonly name = \"ZipFormatError\";\n}\n\n/**\n * Index the file entries of `archive` by name (directories are skipped).\n *\n * @throws {ZipFormatError} On malformed, unsafe, or over-limit archives.\n */\nexport function readZip(archive: Buffer, limits: ZipReadLimits): Map<string, ZipEntry> {\n const end = findEndOfCentralDirectory(archive);\n const count = archive.readUInt16LE(end + 10);\n if (count > limits.maxEntries) {\n throw new ZipFormatError(`Archive has more than ${limits.maxEntries} entries`);\n }\n const records = readCentralDirectory(archive, archive.readUInt32LE(end + 16), count);\n const total = records.reduce((sum, record) => sum + record.size, 0);\n if (total > limits.maxTotalBytes) {\n throw new ZipFormatError(`Archive expands beyond ${limits.maxTotalBytes} bytes`);\n }\n return indexEntries(archive, records, limits.maxEntryBytes);\n}\n\n/** Central-directory fields needed to extract an entry. */\ninterface CentralRecord {\n name: string;\n method: number;\n flags: number;\n crc: number;\n compressedSize: number;\n size: number;\n localOffset: number;\n}\n\nconst EOCD_SIGNATURE = 0x06_05_4b_50;\nconst CENTRAL_SIGNATURE = 0x02_01_4b_50;\nconst LOCAL_SIGNATURE = 0x04_03_4b_50;\nconst EOCD_SIZE = 22;\nconst MAX_COMMENT = 0xff_ff;\nconst STORE = 0;\nconst DEFLATE = 8;\n\nfunction fail(message: string): never {\n throw new ZipFormatError(message);\n}\n\nfunction findEndOfCentralDirectory(archive: Buffer): number {\n const floor = Math.max(0, archive.length - EOCD_SIZE - MAX_COMMENT);\n for (let at = archive.length - EOCD_SIZE; at >= floor; at -= 1) {\n if (archive.readUInt32LE(at) === EOCD_SIGNATURE) {\n assertSingleDisk(archive, at);\n return at;\n }\n }\n return fail(\"Not a zip archive (no end of central directory)\");\n}\n\nfunction assertSingleDisk(archive: Buffer, end: number): void {\n const multiDisk = archive.readUInt16LE(end + 4) !== 0 || archive.readUInt16LE(end + 6) !== 0;\n const entriesMismatch = archive.readUInt16LE(end + 8) !== archive.readUInt16LE(end + 10);\n if (multiDisk || entriesMismatch || archive.readUInt32LE(end + 16) === 0xff_ff_ff_ff) {\n fail(\"Multi-disk and zip64 archives are not supported\");\n }\n}\n\nfunction readCentralDirectory(archive: Buffer, start: number, count: number): CentralRecord[] {\n const records: CentralRecord[] = [];\n let at = start;\n for (let index = 0; index < count; index += 1) {\n const { record, next } = readCentralRecord(archive, at);\n records.push(record);\n at = next;\n }\n return records;\n}\n\nfunction readCentralRecord(archive: Buffer, at: number): { record: CentralRecord; next: number } {\n assertRange(archive, at, 46);\n if (archive.readUInt32LE(at) !== CENTRAL_SIGNATURE) {\n fail(\"Corrupt central directory\");\n }\n const nameLength = archive.readUInt16LE(at + 28);\n const extras = archive.readUInt16LE(at + 30) + archive.readUInt16LE(at + 32);\n assertRange(archive, at + 46, nameLength);\n const record: CentralRecord = {\n name: archive.toString(\"utf8\", at + 46, at + 46 + nameLength),\n method: archive.readUInt16LE(at + 10),\n flags: archive.readUInt16LE(at + 8),\n crc: archive.readUInt32LE(at + 16),\n compressedSize: archive.readUInt32LE(at + 20),\n size: archive.readUInt32LE(at + 24),\n localOffset: archive.readUInt32LE(at + 42),\n };\n return { record, next: at + 46 + nameLength + extras };\n}\n\nfunction assertRange(archive: Buffer, start: number, length: number): void {\n if (start < 0 || start + length > archive.length) {\n fail(\"Truncated zip archive\");\n }\n}\n\n/** Whether an entry name could escape an extraction root or confuse lookups. */\nexport function isUnsafeEntryName(name: string): boolean {\n return (\n name.length === 0 ||\n name.startsWith(\"/\") ||\n name.includes(\"\\\\\") ||\n name.includes(\"\\0\") ||\n /^[a-z]:/iu.test(name) ||\n name.split(\"/\").some((segment) => segment === \"..\" || segment === \".\")\n );\n}\n\nfunction indexEntries(\n archive: Buffer,\n records: CentralRecord[],\n maxEntryBytes: number,\n): Map<string, ZipEntry> {\n const entries = new Map<string, ZipEntry>();\n for (const record of records) {\n if (record.name.endsWith(\"/\")) {\n continue;\n }\n validateRecord(record, maxEntryBytes);\n if (entries.has(record.name)) {\n fail(`Duplicate zip entry: ${record.name}`);\n }\n entries.set(record.name, {\n name: record.name,\n size: record.size,\n read: () => extract(archive, record),\n });\n }\n return entries;\n}\n\nfunction validateRecord(record: CentralRecord, maxEntryBytes: number): void {\n if (isUnsafeEntryName(record.name)) {\n fail(`Unsafe zip entry name: ${record.name}`);\n }\n if (record.flags % 2 === 1) {\n fail(`Encrypted zip entries are not supported: ${record.name}`);\n }\n if (record.method !== STORE && record.method !== DEFLATE) {\n fail(`Unsupported compression method ${record.method}: ${record.name}`);\n }\n if (record.size > maxEntryBytes) {\n fail(`Zip entry exceeds ${maxEntryBytes} bytes: ${record.name}`);\n }\n}\n\nfunction extract(archive: Buffer, record: CentralRecord): Buffer {\n const at = record.localOffset;\n assertRange(archive, at, 30);\n if (archive.readUInt32LE(at) !== LOCAL_SIGNATURE) {\n fail(`Corrupt local header: ${record.name}`);\n }\n const raw = entryData(archive, record);\n const data = record.method === STORE ? raw : inflate(raw, record);\n if (data.length !== record.size || crc32(data) !== record.crc) {\n fail(`Zip entry failed integrity check: ${record.name}`);\n }\n return data;\n}\n\n/** Compressed bytes of an entry, located through its local header. */\nfunction entryData(archive: Buffer, record: CentralRecord): Buffer {\n const at = record.localOffset;\n const start = at + 30 + archive.readUInt16LE(at + 26) + archive.readUInt16LE(at + 28);\n assertRange(archive, start, record.compressedSize);\n return archive.subarray(start, start + record.compressedSize);\n}\n\nfunction inflate(raw: Buffer, record: CentralRecord): Buffer {\n try {\n // Cap output at the declared size (+1 so overruns are detectable, not truncated).\n return inflateRawSync(raw, { maxOutputLength: record.size + 1 });\n } catch {\n return fail(`Zip entry failed to inflate: ${record.name}`);\n }\n}\n"],"mappings":";;;;;;;AA8BA,IAAa,iBAAb,cAAoC,MAAM;CACxC,OAAyB;AAC3B;;;;;;AAOA,SAAgB,QAAQ,SAAiB,QAA8C;CACrF,MAAM,MAAM,0BAA0B,OAAO;CAC7C,MAAM,QAAQ,QAAQ,aAAa,MAAM,EAAE;CAC3C,IAAI,QAAQ,OAAO,YACjB,MAAM,IAAI,eAAe,yBAAyB,OAAO,WAAW,SAAS;CAE/E,MAAM,UAAU,qBAAqB,SAAS,QAAQ,aAAa,MAAM,EAAE,GAAG,KAAK;CAEnF,IADc,QAAQ,QAAQ,KAAK,WAAW,MAAM,OAAO,MAAM,CACzD,IAAI,OAAO,eACjB,MAAM,IAAI,eAAe,0BAA0B,OAAO,cAAc,OAAO;CAEjF,OAAO,aAAa,SAAS,SAAS,OAAO,aAAa;AAC5D;AAaA,MAAM,iBAAiB;AACvB,MAAM,oBAAoB;AAC1B,MAAM,kBAAkB;AACxB,MAAM,YAAY;AAClB,MAAM,cAAc;AACpB,MAAM,QAAQ;AACd,MAAM,UAAU;AAEhB,SAAS,KAAK,SAAwB;CACpC,MAAM,IAAI,eAAe,OAAO;AAClC;AAEA,SAAS,0BAA0B,SAAyB;CAC1D,MAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,SAAS,YAAY,WAAW;CAClE,KAAK,IAAI,KAAK,QAAQ,SAAS,WAAW,MAAM,OAAO,MAAM,GAC3D,IAAI,QAAQ,aAAa,EAAE,MAAM,gBAAgB;EAC/C,iBAAiB,SAAS,EAAE;EAC5B,OAAO;CACT;CAEF,OAAO,KAAK,iDAAiD;AAC/D;AAEA,SAAS,iBAAiB,SAAiB,KAAmB;CAC5D,MAAM,YAAY,QAAQ,aAAa,MAAM,CAAC,MAAM,KAAK,QAAQ,aAAa,MAAM,CAAC,MAAM;CAC3F,MAAM,kBAAkB,QAAQ,aAAa,MAAM,CAAC,MAAM,QAAQ,aAAa,MAAM,EAAE;CACvF,IAAI,aAAa,mBAAmB,QAAQ,aAAa,MAAM,EAAE,MAAM,YACrE,KAAK,iDAAiD;AAE1D;AAEA,SAAS,qBAAqB,SAAiB,OAAe,OAAgC;CAC5F,MAAM,UAA2B,CAAC;CAClC,IAAI,KAAK;CACT,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAAG;EAC7C,MAAM,EAAE,QAAQ,SAAS,kBAAkB,SAAS,EAAE;EACtD,QAAQ,KAAK,MAAM;EACnB,KAAK;CACP;CACA,OAAO;AACT;AAEA,SAAS,kBAAkB,SAAiB,IAAqD;CAC/F,YAAY,SAAS,IAAI,EAAE;CAC3B,IAAI,QAAQ,aAAa,EAAE,MAAM,mBAC/B,KAAK,2BAA2B;CAElC,MAAM,aAAa,QAAQ,aAAa,KAAK,EAAE;CAC/C,MAAM,SAAS,QAAQ,aAAa,KAAK,EAAE,IAAI,QAAQ,aAAa,KAAK,EAAE;CAC3E,YAAY,SAAS,KAAK,IAAI,UAAU;CAUxC,OAAO;EAAE,QAAA;GARP,MAAM,QAAQ,SAAS,QAAQ,KAAK,IAAI,KAAK,KAAK,UAAU;GAC5D,QAAQ,QAAQ,aAAa,KAAK,EAAE;GACpC,OAAO,QAAQ,aAAa,KAAK,CAAC;GAClC,KAAK,QAAQ,aAAa,KAAK,EAAE;GACjC,gBAAgB,QAAQ,aAAa,KAAK,EAAE;GAC5C,MAAM,QAAQ,aAAa,KAAK,EAAE;GAClC,aAAa,QAAQ,aAAa,KAAK,EAAE;EAE7B;EAAG,MAAM,KAAK,KAAK,aAAa;CAAO;AACvD;AAEA,SAAS,YAAY,SAAiB,OAAe,QAAsB;CACzE,IAAI,QAAQ,KAAK,QAAQ,SAAS,QAAQ,QACxC,KAAK,uBAAuB;AAEhC;;AAGA,SAAgB,kBAAkB,MAAuB;CACvD,OACE,KAAK,WAAW,KAChB,KAAK,WAAW,GAAG,KACnB,KAAK,SAAS,IAAI,KAClB,KAAK,SAAS,IAAI,KAClB,YAAY,KAAK,IAAI,KACrB,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM,YAAY,YAAY,QAAQ,YAAY,GAAG;AAEzE;AAEA,SAAS,aACP,SACA,SACA,eACuB;CACvB,MAAM,0BAAU,IAAI,IAAsB;CAC1C,KAAK,MAAM,UAAU,SAAS;EAC5B,IAAI,OAAO,KAAK,SAAS,GAAG,GAC1B;EAEF,eAAe,QAAQ,aAAa;EACpC,IAAI,QAAQ,IAAI,OAAO,IAAI,GACzB,KAAK,wBAAwB,OAAO,MAAM;EAE5C,QAAQ,IAAI,OAAO,MAAM;GACvB,MAAM,OAAO;GACb,MAAM,OAAO;GACb,YAAY,QAAQ,SAAS,MAAM;EACrC,CAAC;CACH;CACA,OAAO;AACT;AAEA,SAAS,eAAe,QAAuB,eAA6B;CAC1E,IAAI,kBAAkB,OAAO,IAAI,GAC/B,KAAK,0BAA0B,OAAO,MAAM;CAE9C,IAAI,OAAO,QAAQ,MAAM,GACvB,KAAK,4CAA4C,OAAO,MAAM;CAEhE,IAAI,OAAO,WAAW,SAAS,OAAO,WAAW,SAC/C,KAAK,kCAAkC,OAAO,OAAO,IAAI,OAAO,MAAM;CAExE,IAAI,OAAO,OAAO,eAChB,KAAK,qBAAqB,cAAc,UAAU,OAAO,MAAM;AAEnE;AAEA,SAAS,QAAQ,SAAiB,QAA+B;CAC/D,MAAM,KAAK,OAAO;CAClB,YAAY,SAAS,IAAI,EAAE;CAC3B,IAAI,QAAQ,aAAa,EAAE,MAAM,iBAC/B,KAAK,yBAAyB,OAAO,MAAM;CAE7C,MAAM,MAAM,UAAU,SAAS,MAAM;CACrC,MAAM,OAAO,OAAO,WAAW,QAAQ,MAAM,QAAQ,KAAK,MAAM;CAChE,IAAI,KAAK,WAAW,OAAO,QAAQ,MAAM,IAAI,MAAM,OAAO,KACxD,KAAK,qCAAqC,OAAO,MAAM;CAEzD,OAAO;AACT;;AAGA,SAAS,UAAU,SAAiB,QAA+B;CACjE,MAAM,KAAK,OAAO;CAClB,MAAM,QAAQ,KAAK,KAAK,QAAQ,aAAa,KAAK,EAAE,IAAI,QAAQ,aAAa,KAAK,EAAE;CACpF,YAAY,SAAS,OAAO,OAAO,cAAc;CACjD,OAAO,QAAQ,SAAS,OAAO,QAAQ,OAAO,cAAc;AAC9D;AAEA,SAAS,QAAQ,KAAa,QAA+B;CAC3D,IAAI;EAEF,OAAO,eAAe,KAAK,EAAE,iBAAiB,OAAO,OAAO,EAAE,CAAC;CACjE,QAAQ;EACN,OAAO,KAAK,gCAAgC,OAAO,MAAM;CAC3D;AACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import __tsdown_shims_path from 'node:path';
|
|
2
|
+
import __tsdown_shims_url from 'node:url';
|
|
3
|
+
import { Buffer } from "node:buffer";
|
|
4
|
+
/** One file to add to an archive; a `data` function is called lazily when the entry is written. */
|
|
5
|
+
interface ZipSource {
|
|
6
|
+
name: string;
|
|
7
|
+
data: Buffer | (() => Promise<Buffer>);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Stream a zip archive for `sources`, yielding header/data chunks in order.
|
|
11
|
+
*
|
|
12
|
+
* @throws When the archive would need zip64 (more than 65535 entries or 4 GiB).
|
|
13
|
+
*/
|
|
14
|
+
declare function zipStream(sources: Iterable<ZipSource> | AsyncIterable<ZipSource>): AsyncGenerator<Buffer>;
|
|
15
|
+
export { ZipSource, zipStream };
|
|
16
|
+
//# sourceMappingURL=zip-write.d.mts.map
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import "node:path";
|
|
2
|
+
import "node:url";
|
|
3
|
+
import.meta.url;
|
|
4
|
+
import { Buffer } from "node:buffer";
|
|
5
|
+
import { crc32 } from "node:zlib";
|
|
6
|
+
// src/utils/zip-write.ts
|
|
7
|
+
/**
|
|
8
|
+
* Minimal streaming zip writer (STORE method, no zip64).
|
|
9
|
+
*
|
|
10
|
+
* Baseline exports are PNGs — already deflated — so entries are stored
|
|
11
|
+
* uncompressed. Entries are produced one at a time, so memory stays bounded
|
|
12
|
+
* by the largest single entry rather than the whole archive.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Stream a zip archive for `sources`, yielding header/data chunks in order.
|
|
16
|
+
*
|
|
17
|
+
* @throws When the archive would need zip64 (more than 65535 entries or 4 GiB).
|
|
18
|
+
*/
|
|
19
|
+
async function* zipStream(sources) {
|
|
20
|
+
const central = [];
|
|
21
|
+
let offset = 0;
|
|
22
|
+
for await (const source of sources) {
|
|
23
|
+
const data = typeof source.data === "function" ? await source.data() : source.data;
|
|
24
|
+
const record = entryRecord(source.name, data);
|
|
25
|
+
central.push(centralHeader(record, offset));
|
|
26
|
+
yield* [localHeader(record), data];
|
|
27
|
+
offset = checkedSize(offset + 30 + record.name.length + data.length);
|
|
28
|
+
}
|
|
29
|
+
yield* trailer(central, offset);
|
|
30
|
+
}
|
|
31
|
+
const MAX_U32 = 4294967295;
|
|
32
|
+
const MAX_ENTRIES = 65535;
|
|
33
|
+
/** General-purpose flag bit 11: file names are UTF-8. */
|
|
34
|
+
const UTF8_FLAG = 2048;
|
|
35
|
+
/** 1980-01-01 in DOS date format — fixed so archives are byte-reproducible. */
|
|
36
|
+
const DOS_DATE = 33;
|
|
37
|
+
const VERSION = 20;
|
|
38
|
+
function entryRecord(name, data) {
|
|
39
|
+
return {
|
|
40
|
+
name: Buffer.from(name, "utf8"),
|
|
41
|
+
crc: crc32(data),
|
|
42
|
+
size: checkedSize(data.length)
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function checkedSize(size) {
|
|
46
|
+
if (size > MAX_U32) throw new Error("Archive exceeds 4 GiB (zip64 is not supported)");
|
|
47
|
+
return size;
|
|
48
|
+
}
|
|
49
|
+
function header(size, fields, name) {
|
|
50
|
+
const out = Buffer.alloc(size);
|
|
51
|
+
for (const [offset, width, value] of fields) if (width === 2) out.writeUInt16LE(value, offset);
|
|
52
|
+
else out.writeUInt32LE(value, offset);
|
|
53
|
+
return name ? Buffer.concat([out, name]) : out;
|
|
54
|
+
}
|
|
55
|
+
function localHeader(record) {
|
|
56
|
+
return header(30, [
|
|
57
|
+
[
|
|
58
|
+
0,
|
|
59
|
+
4,
|
|
60
|
+
67324752
|
|
61
|
+
],
|
|
62
|
+
[
|
|
63
|
+
4,
|
|
64
|
+
2,
|
|
65
|
+
VERSION
|
|
66
|
+
],
|
|
67
|
+
[
|
|
68
|
+
6,
|
|
69
|
+
2,
|
|
70
|
+
UTF8_FLAG
|
|
71
|
+
],
|
|
72
|
+
[
|
|
73
|
+
12,
|
|
74
|
+
2,
|
|
75
|
+
DOS_DATE
|
|
76
|
+
],
|
|
77
|
+
[
|
|
78
|
+
14,
|
|
79
|
+
4,
|
|
80
|
+
record.crc
|
|
81
|
+
],
|
|
82
|
+
[
|
|
83
|
+
18,
|
|
84
|
+
4,
|
|
85
|
+
record.size
|
|
86
|
+
],
|
|
87
|
+
[
|
|
88
|
+
22,
|
|
89
|
+
4,
|
|
90
|
+
record.size
|
|
91
|
+
],
|
|
92
|
+
[
|
|
93
|
+
26,
|
|
94
|
+
2,
|
|
95
|
+
record.name.length
|
|
96
|
+
]
|
|
97
|
+
], record.name);
|
|
98
|
+
}
|
|
99
|
+
function centralHeader(record, offset) {
|
|
100
|
+
return header(46, [
|
|
101
|
+
[
|
|
102
|
+
0,
|
|
103
|
+
4,
|
|
104
|
+
33639248
|
|
105
|
+
],
|
|
106
|
+
[
|
|
107
|
+
4,
|
|
108
|
+
2,
|
|
109
|
+
VERSION
|
|
110
|
+
],
|
|
111
|
+
[
|
|
112
|
+
6,
|
|
113
|
+
2,
|
|
114
|
+
VERSION
|
|
115
|
+
],
|
|
116
|
+
[
|
|
117
|
+
8,
|
|
118
|
+
2,
|
|
119
|
+
UTF8_FLAG
|
|
120
|
+
],
|
|
121
|
+
[
|
|
122
|
+
14,
|
|
123
|
+
2,
|
|
124
|
+
DOS_DATE
|
|
125
|
+
],
|
|
126
|
+
[
|
|
127
|
+
16,
|
|
128
|
+
4,
|
|
129
|
+
record.crc
|
|
130
|
+
],
|
|
131
|
+
[
|
|
132
|
+
20,
|
|
133
|
+
4,
|
|
134
|
+
record.size
|
|
135
|
+
],
|
|
136
|
+
[
|
|
137
|
+
24,
|
|
138
|
+
4,
|
|
139
|
+
record.size
|
|
140
|
+
],
|
|
141
|
+
[
|
|
142
|
+
28,
|
|
143
|
+
2,
|
|
144
|
+
record.name.length
|
|
145
|
+
],
|
|
146
|
+
[
|
|
147
|
+
42,
|
|
148
|
+
4,
|
|
149
|
+
offset
|
|
150
|
+
]
|
|
151
|
+
], record.name);
|
|
152
|
+
}
|
|
153
|
+
function* trailer(central, offset) {
|
|
154
|
+
if (central.length > MAX_ENTRIES) throw new Error("Archive exceeds 65535 entries (zip64 is not supported)");
|
|
155
|
+
const directory = Buffer.concat(central);
|
|
156
|
+
yield directory;
|
|
157
|
+
yield header(22, [
|
|
158
|
+
[
|
|
159
|
+
0,
|
|
160
|
+
4,
|
|
161
|
+
101010256
|
|
162
|
+
],
|
|
163
|
+
[
|
|
164
|
+
8,
|
|
165
|
+
2,
|
|
166
|
+
central.length
|
|
167
|
+
],
|
|
168
|
+
[
|
|
169
|
+
10,
|
|
170
|
+
2,
|
|
171
|
+
central.length
|
|
172
|
+
],
|
|
173
|
+
[
|
|
174
|
+
12,
|
|
175
|
+
4,
|
|
176
|
+
directory.length
|
|
177
|
+
],
|
|
178
|
+
[
|
|
179
|
+
16,
|
|
180
|
+
4,
|
|
181
|
+
checkedSize(offset)
|
|
182
|
+
]
|
|
183
|
+
]);
|
|
184
|
+
}
|
|
185
|
+
export { zipStream };
|
|
186
|
+
|
|
187
|
+
//# sourceMappingURL=zip-write.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip-write.mjs","names":[],"sources":["../../src/utils/zip-write.ts"],"sourcesContent":["/**\n * Minimal streaming zip writer (STORE method, no zip64).\n *\n * Baseline exports are PNGs — already deflated — so entries are stored\n * uncompressed. Entries are produced one at a time, so memory stays bounded\n * by the largest single entry rather than the whole archive.\n */\nimport { Buffer } from \"node:buffer\";\nimport { crc32 } from \"node:zlib\";\n\n/** One file to add to an archive; a `data` function is called lazily when the entry is written. */\nexport interface ZipSource {\n name: string;\n data: Buffer | (() => Promise<Buffer>);\n}\n\n/**\n * Stream a zip archive for `sources`, yielding header/data chunks in order.\n *\n * @throws When the archive would need zip64 (more than 65535 entries or 4 GiB).\n */\nexport async function* zipStream(\n sources: Iterable<ZipSource> | AsyncIterable<ZipSource>,\n): AsyncGenerator<Buffer> {\n const central: Buffer[] = [];\n let offset = 0;\n for await (const source of sources) {\n const data = typeof source.data === \"function\" ? await source.data() : source.data;\n const record = entryRecord(source.name, data);\n central.push(centralHeader(record, offset));\n yield* [localHeader(record), data];\n offset = checkedSize(offset + 30 + record.name.length + data.length);\n }\n yield* trailer(central, offset);\n}\n\n/** Header fields shared by the local and central records of an entry. */\ninterface EntryRecord {\n name: Buffer;\n crc: number;\n size: number;\n}\n\nconst MAX_U32 = 0xff_ff_ff_ff;\nconst MAX_ENTRIES = 0xff_ff;\n/** General-purpose flag bit 11: file names are UTF-8. */\nconst UTF8_FLAG = 0x08_00;\n/** 1980-01-01 in DOS date format — fixed so archives are byte-reproducible. */\nconst DOS_DATE = 0x00_21;\nconst VERSION = 20;\n\nfunction entryRecord(name: string, data: Buffer): EntryRecord {\n return { name: Buffer.from(name, \"utf8\"), crc: crc32(data), size: checkedSize(data.length) };\n}\n\nfunction checkedSize(size: number): number {\n if (size > MAX_U32) {\n throw new Error(\"Archive exceeds 4 GiB (zip64 is not supported)\");\n }\n return size;\n}\n\n/** `[offset, width, value]` triples for a fixed-size header. */\ntype Fields = readonly (readonly [offset: number, width: 2 | 4, value: number])[];\n\nfunction header(size: number, fields: Fields, name?: Buffer): Buffer {\n const out = Buffer.alloc(size);\n for (const [offset, width, value] of fields) {\n if (width === 2) {\n out.writeUInt16LE(value, offset);\n } else {\n out.writeUInt32LE(value, offset);\n }\n }\n return name ? Buffer.concat([out, name]) : out;\n}\n\nfunction localHeader(record: EntryRecord): Buffer {\n return header(\n 30,\n [\n [0, 4, 0x04_03_4b_50],\n [4, 2, VERSION],\n [6, 2, UTF8_FLAG],\n [12, 2, DOS_DATE],\n [14, 4, record.crc],\n [18, 4, record.size],\n [22, 4, record.size],\n [26, 2, record.name.length],\n ],\n record.name,\n );\n}\n\nfunction centralHeader(record: EntryRecord, offset: number): Buffer {\n return header(\n 46,\n [\n [0, 4, 0x02_01_4b_50],\n [4, 2, VERSION],\n [6, 2, VERSION],\n [8, 2, UTF8_FLAG],\n [14, 2, DOS_DATE],\n [16, 4, record.crc],\n [20, 4, record.size],\n [24, 4, record.size],\n [28, 2, record.name.length],\n [42, 4, offset],\n ],\n record.name,\n );\n}\n\nfunction* trailer(central: Buffer[], offset: number): Generator<Buffer> {\n if (central.length > MAX_ENTRIES) {\n throw new Error(\"Archive exceeds 65535 entries (zip64 is not supported)\");\n }\n const directory = Buffer.concat(central);\n yield directory;\n yield header(22, [\n [0, 4, 0x06_05_4b_50],\n [8, 2, central.length],\n [10, 2, central.length],\n [12, 4, directory.length],\n [16, 4, checkedSize(offset)],\n ]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAqBA,gBAAuB,UACrB,SACwB;CACxB,MAAM,UAAoB,CAAC;CAC3B,IAAI,SAAS;CACb,WAAW,MAAM,UAAU,SAAS;EAClC,MAAM,OAAO,OAAO,OAAO,SAAS,aAAa,MAAM,OAAO,KAAK,IAAI,OAAO;EAC9E,MAAM,SAAS,YAAY,OAAO,MAAM,IAAI;EAC5C,QAAQ,KAAK,cAAc,QAAQ,MAAM,CAAC;EAC1C,OAAO,CAAC,YAAY,MAAM,GAAG,IAAI;EACjC,SAAS,YAAY,SAAS,KAAK,OAAO,KAAK,SAAS,KAAK,MAAM;CACrE;CACA,OAAO,QAAQ,SAAS,MAAM;AAChC;AASA,MAAM,UAAU;AAChB,MAAM,cAAc;;AAEpB,MAAM,YAAY;;AAElB,MAAM,WAAW;AACjB,MAAM,UAAU;AAEhB,SAAS,YAAY,MAAc,MAA2B;CAC5D,OAAO;EAAE,MAAM,OAAO,KAAK,MAAM,MAAM;EAAG,KAAK,MAAM,IAAI;EAAG,MAAM,YAAY,KAAK,MAAM;CAAE;AAC7F;AAEA,SAAS,YAAY,MAAsB;CACzC,IAAI,OAAO,SACT,MAAM,IAAI,MAAM,gDAAgD;CAElE,OAAO;AACT;AAKA,SAAS,OAAO,MAAc,QAAgB,MAAuB;CACnE,MAAM,MAAM,OAAO,MAAM,IAAI;CAC7B,KAAK,MAAM,CAAC,QAAQ,OAAO,UAAU,QACnC,IAAI,UAAU,GACZ,IAAI,cAAc,OAAO,MAAM;MAE/B,IAAI,cAAc,OAAO,MAAM;CAGnC,OAAO,OAAO,OAAO,OAAO,CAAC,KAAK,IAAI,CAAC,IAAI;AAC7C;AAEA,SAAS,YAAY,QAA6B;CAChD,OAAO,OACL,IACA;EACE;GAAC;GAAG;GAAG;EAAa;EACpB;GAAC;GAAG;GAAG;EAAO;EACd;GAAC;GAAG;GAAG;EAAS;EAChB;GAAC;GAAI;GAAG;EAAQ;EAChB;GAAC;GAAI;GAAG,OAAO;EAAG;EAClB;GAAC;GAAI;GAAG,OAAO;EAAI;EACnB;GAAC;GAAI;GAAG,OAAO;EAAI;EACnB;GAAC;GAAI;GAAG,OAAO,KAAK;EAAM;CAC5B,GACA,OAAO,IACT;AACF;AAEA,SAAS,cAAc,QAAqB,QAAwB;CAClE,OAAO,OACL,IACA;EACE;GAAC;GAAG;GAAG;EAAa;EACpB;GAAC;GAAG;GAAG;EAAO;EACd;GAAC;GAAG;GAAG;EAAO;EACd;GAAC;GAAG;GAAG;EAAS;EAChB;GAAC;GAAI;GAAG;EAAQ;EAChB;GAAC;GAAI;GAAG,OAAO;EAAG;EAClB;GAAC;GAAI;GAAG,OAAO;EAAI;EACnB;GAAC;GAAI;GAAG,OAAO;EAAI;EACnB;GAAC;GAAI;GAAG,OAAO,KAAK;EAAM;EAC1B;GAAC;GAAI;GAAG;EAAM;CAChB,GACA,OAAO,IACT;AACF;AAEA,UAAU,QAAQ,SAAmB,QAAmC;CACtE,IAAI,QAAQ,SAAS,aACnB,MAAM,IAAI,MAAM,wDAAwD;CAE1E,MAAM,YAAY,OAAO,OAAO,OAAO;CACvC,MAAM;CACN,MAAM,OAAO,IAAI;EACf;GAAC;GAAG;GAAG;EAAa;EACpB;GAAC;GAAG;GAAG,QAAQ;EAAM;EACrB;GAAC;GAAI;GAAG,QAAQ;EAAM;EACtB;GAAC;GAAI;GAAG,UAAU;EAAM;EACxB;GAAC;GAAI;GAAG,YAAY,MAAM;EAAC;CAC7B,CAAC;AACH"}
|
package/dist/utils.d.mts
CHANGED
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
import __tsdown_shims_path from 'node:path';
|
|
2
2
|
import __tsdown_shims_url from 'node:url';
|
|
3
3
|
import { KeyUsed, SecretInput, SecretKeys, UndecryptableCredentialError, decrypt, decryptCredential, decryptWithKey, encrypt } from "./utils/encrypt.mjs";
|
|
4
|
+
import { Env, detectPublicBaseUrl, normalizeOrigin } from "./utils/public-origin.mjs";
|
|
4
5
|
import { hmacSha256, randomToken, sha256, timingSafeEqualString } from "./utils/hash.mjs";
|
|
5
|
-
import { HttpError, HttpRequestOptions, HttpTextOptions, httpJson, httpText } from "./utils/http.mjs";
|
|
6
|
-
import { baselinePath, diffPath, screenshotPath, storybookDir, storybookZipPath } from "./paths.mjs";
|
|
6
|
+
import { HttpError, HttpRequestOptions, HttpTextOptions, httpBytes, httpJson, httpStatus, httpText } from "./utils/http.mjs";
|
|
7
|
+
import { baselinePath, catalogPath, contentDir, contentPath, designRenderPath, diffPath, isContentPath, modeSegment, publishedGzipPath, screenshotPath, storybookDir, storybookZipPath } from "./paths.mjs";
|
|
8
|
+
import { AdaptiveConcurrency, AdaptiveOptions, Observation, isTimeoutError } from "./utils/adaptive-concurrency.mjs";
|
|
9
|
+
import { detectCaptureEnvironment, systemFontsHash } from "./utils/environment.mjs";
|
|
10
|
+
import { RetryConnectOptions, isRetryableConnectError, retryConnect } from "./utils/connect-retry.mjs";
|
|
11
|
+
import { BrowserProbe, FONT_PROBE_FAMILIES, ProbeControl, ProbeOutcome, boundedProbe, inPageProbe, remoteEnvironment } from "./utils/remote-environment.mjs";
|
|
12
|
+
import { storybookBase } from "./utils/storybook-url.mjs";
|
|
13
|
+
import { DEFAULT_STORYBOOK_URL_TTL, MAX_STORYBOOK_URL_TTL, MIN_CAPTURES_PER_SLICE, MIN_STORYBOOK_URL_TTL, MIN_STORYBOOK_URL_TTL_OVERRIDE, PER_CAPTURE_BUDGET_MS, STORYBOOK_TOKEN_PREFIX, STORYBOOK_TOKEN_SOURCE, STORYBOOK_URL_TTL_GRACE, SignStorybookTokenInput, StorybookTokenClaims, StorybookTokenFailure, StorybookTokenPurpose, StorybookTokenResult, assertStorybookUrlTtl, signStorybookToken, storybookTokenPath, storybookUrlTtl, storybookUrlTtlOverrideError, verifyStorybookToken } from "./utils/storybook-token.mjs";
|
|
14
|
+
import { SessionGate, createSessionGate, sessionGateFor } from "./utils/session-gate.mjs";
|
|
15
|
+
import { storeScreenshot } from "./utils/screenshot-store.mjs";
|
|
16
|
+
import { PageLimiter, PageLimiterOptions, createPageLimiter } from "./utils/page-limiter.mjs";
|
|
17
|
+
import { mapAdaptive } from "./utils/map-adaptive.mjs";
|
|
18
|
+
import { chunk, mapLimit } from "./utils/map-limit.mjs";
|
|
19
|
+
import { CaptureHostSummary, DEFAULT_RECYCLE_BROWSER_EVERY, HostResources, describeCaptureHost, describeSizing, detectResources, engineWeight, maxPageConcurrency, recommendedBuildConcurrency, recommendedNavigationTimeoutMs, recommendedPageConcurrency } from "./utils/resources.mjs";
|
|
7
20
|
import { MIME_TYPES, mimeFor } from "./utils/mime.mjs";
|
|
8
21
|
import { isBlockedTarget, isPathSafe, isSafeSegment } from "./utils/path-security.mjs";
|
|
9
22
|
import { redactSecrets, sanitizeErrorText } from "./utils/redact.mjs";
|
|
10
23
|
import { TimingMap, addTiming, roundedTimings, runWithTimings, timed } from "./utils/timing.mjs";
|
|
11
24
|
import { slugify, ulid } from "./utils/ulid.mjs";
|
|
12
|
-
|
|
25
|
+
import { ZipSource, zipStream } from "./utils/zip-write.mjs";
|
|
26
|
+
export { AdaptiveConcurrency, type AdaptiveOptions, type BrowserProbe, type CaptureHostSummary, DEFAULT_RECYCLE_BROWSER_EVERY, DEFAULT_STORYBOOK_URL_TTL, type Env, FONT_PROBE_FAMILIES, type HostResources, HttpError, type HttpRequestOptions, type HttpTextOptions, type KeyUsed, MAX_STORYBOOK_URL_TTL, MIME_TYPES, MIN_CAPTURES_PER_SLICE, MIN_STORYBOOK_URL_TTL, MIN_STORYBOOK_URL_TTL_OVERRIDE, type Observation, PER_CAPTURE_BUDGET_MS, type PageLimiter, type PageLimiterOptions, type ProbeControl, type ProbeOutcome, type RetryConnectOptions, STORYBOOK_TOKEN_PREFIX, STORYBOOK_TOKEN_SOURCE, STORYBOOK_URL_TTL_GRACE, type SecretInput, type SecretKeys, type SessionGate, type SignStorybookTokenInput, type StorybookTokenClaims, type StorybookTokenFailure, type StorybookTokenPurpose, type StorybookTokenResult, type TimingMap, UndecryptableCredentialError, type ZipSource, addTiming, assertStorybookUrlTtl, baselinePath, boundedProbe, catalogPath, chunk, contentDir, contentPath, createPageLimiter, createSessionGate, decrypt, decryptCredential, decryptWithKey, describeCaptureHost, describeSizing, designRenderPath, detectCaptureEnvironment, detectPublicBaseUrl, detectResources, diffPath, encrypt, engineWeight, hmacSha256, httpBytes, httpJson, httpStatus, httpText, inPageProbe, isBlockedTarget, isContentPath, isPathSafe, isRetryableConnectError, isSafeSegment, isTimeoutError, mapAdaptive, mapLimit, maxPageConcurrency, mimeFor, modeSegment, normalizeOrigin, publishedGzipPath, randomToken, recommendedBuildConcurrency, recommendedNavigationTimeoutMs, recommendedPageConcurrency, redactSecrets, remoteEnvironment, retryConnect, roundedTimings, runWithTimings, sanitizeErrorText, screenshotPath, sessionGateFor, sha256, signStorybookToken, slugify, storeScreenshot, storybookBase, storybookDir, storybookTokenPath, storybookUrlTtl, storybookUrlTtlOverrideError, storybookZipPath, systemFontsHash, timed, timingSafeEqualString, ulid, verifyStorybookToken, zipStream };
|
package/dist/utils.mjs
CHANGED
|
@@ -1,13 +1,27 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
+
import { hmacSha256, randomToken, sha256, timingSafeEqualString } from "./utils/hash.mjs";
|
|
5
|
+
import { DEFAULT_STORYBOOK_URL_TTL, MAX_STORYBOOK_URL_TTL, MIN_CAPTURES_PER_SLICE, MIN_STORYBOOK_URL_TTL, MIN_STORYBOOK_URL_TTL_OVERRIDE, PER_CAPTURE_BUDGET_MS, STORYBOOK_TOKEN_PREFIX, STORYBOOK_TOKEN_SOURCE, STORYBOOK_URL_TTL_GRACE, assertStorybookUrlTtl, signStorybookToken, storybookTokenPath, storybookUrlTtl, storybookUrlTtlOverrideError, verifyStorybookToken } from "./utils/storybook-token.mjs";
|
|
4
6
|
import { redactSecrets, sanitizeErrorText } from "./utils/redact.mjs";
|
|
7
|
+
import { isRetryableConnectError, retryConnect } from "./utils/connect-retry.mjs";
|
|
5
8
|
import { UndecryptableCredentialError, decrypt, decryptCredential, decryptWithKey, encrypt } from "./utils/encrypt.mjs";
|
|
6
9
|
import { slugify, ulid } from "./utils/ulid.mjs";
|
|
7
|
-
import {
|
|
10
|
+
import { HttpError, httpBytes, httpJson, httpStatus, httpText } from "./utils/http.mjs";
|
|
8
11
|
import { addTiming, roundedTimings, runWithTimings, timed } from "./utils/timing.mjs";
|
|
9
12
|
import { isBlockedTarget, isPathSafe, isSafeSegment } from "./utils/path-security.mjs";
|
|
10
|
-
import { baselinePath, diffPath, screenshotPath, storybookDir, storybookZipPath } from "./paths.mjs";
|
|
11
|
-
import {
|
|
13
|
+
import { baselinePath, catalogPath, contentDir, contentPath, designRenderPath, diffPath, isContentPath, modeSegment, publishedGzipPath, screenshotPath, storybookDir, storybookZipPath } from "./paths.mjs";
|
|
14
|
+
import { storeScreenshot } from "./utils/screenshot-store.mjs";
|
|
15
|
+
import { chunk, mapLimit } from "./utils/map-limit.mjs";
|
|
16
|
+
import { DEFAULT_RECYCLE_BROWSER_EVERY, describeCaptureHost, describeSizing, detectResources, engineWeight, maxPageConcurrency, recommendedBuildConcurrency, recommendedNavigationTimeoutMs, recommendedPageConcurrency } from "./utils/resources.mjs";
|
|
17
|
+
import { detectPublicBaseUrl, normalizeOrigin } from "./utils/public-origin.mjs";
|
|
18
|
+
import { zipStream } from "./utils/zip-write.mjs";
|
|
19
|
+
import { AdaptiveConcurrency, isTimeoutError } from "./utils/adaptive-concurrency.mjs";
|
|
20
|
+
import { detectCaptureEnvironment, systemFontsHash } from "./utils/environment.mjs";
|
|
21
|
+
import { FONT_PROBE_FAMILIES, boundedProbe, inPageProbe, remoteEnvironment } from "./utils/remote-environment.mjs";
|
|
22
|
+
import { storybookBase } from "./utils/storybook-url.mjs";
|
|
23
|
+
import { createSessionGate, sessionGateFor } from "./utils/session-gate.mjs";
|
|
24
|
+
import { mapAdaptive } from "./utils/map-adaptive.mjs";
|
|
25
|
+
import { createPageLimiter } from "./utils/page-limiter.mjs";
|
|
12
26
|
import { MIME_TYPES, mimeFor } from "./utils/mime.mjs";
|
|
13
|
-
export { HttpError, MIME_TYPES, UndecryptableCredentialError, addTiming, baselinePath, decrypt, decryptCredential, decryptWithKey, diffPath, encrypt, hmacSha256, httpJson, httpText, isBlockedTarget, isPathSafe, isSafeSegment, mimeFor, randomToken, redactSecrets, roundedTimings, runWithTimings, sanitizeErrorText, screenshotPath, sha256, slugify, storybookDir, storybookZipPath, timed, timingSafeEqualString, ulid };
|
|
27
|
+
export { AdaptiveConcurrency, DEFAULT_RECYCLE_BROWSER_EVERY, DEFAULT_STORYBOOK_URL_TTL, FONT_PROBE_FAMILIES, HttpError, MAX_STORYBOOK_URL_TTL, MIME_TYPES, MIN_CAPTURES_PER_SLICE, MIN_STORYBOOK_URL_TTL, MIN_STORYBOOK_URL_TTL_OVERRIDE, PER_CAPTURE_BUDGET_MS, STORYBOOK_TOKEN_PREFIX, STORYBOOK_TOKEN_SOURCE, STORYBOOK_URL_TTL_GRACE, UndecryptableCredentialError, addTiming, assertStorybookUrlTtl, baselinePath, boundedProbe, catalogPath, chunk, contentDir, contentPath, createPageLimiter, createSessionGate, decrypt, decryptCredential, decryptWithKey, describeCaptureHost, describeSizing, designRenderPath, detectCaptureEnvironment, detectPublicBaseUrl, detectResources, diffPath, encrypt, engineWeight, hmacSha256, httpBytes, httpJson, httpStatus, httpText, inPageProbe, isBlockedTarget, isContentPath, isPathSafe, isRetryableConnectError, isSafeSegment, isTimeoutError, mapAdaptive, mapLimit, maxPageConcurrency, mimeFor, modeSegment, normalizeOrigin, publishedGzipPath, randomToken, recommendedBuildConcurrency, recommendedNavigationTimeoutMs, recommendedPageConcurrency, redactSecrets, remoteEnvironment, retryConnect, roundedTimings, runWithTimings, sanitizeErrorText, screenshotPath, sessionGateFor, sha256, signStorybookToken, slugify, storeScreenshot, storybookBase, storybookDir, storybookTokenPath, storybookUrlTtl, storybookUrlTtlOverrideError, storybookZipPath, systemFontsHash, timed, timingSafeEqualString, ulid, verifyStorybookToken, zipStream };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@storyshelf/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "StoryShelf core: adapter interfaces, models, capture pipeline, diff, and retention (no HTTP).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"chromatic-alternative",
|
|
@@ -27,9 +27,6 @@
|
|
|
27
27
|
"dist"
|
|
28
28
|
],
|
|
29
29
|
"type": "module",
|
|
30
|
-
"engines": {
|
|
31
|
-
"node": ">=24"
|
|
32
|
-
},
|
|
33
30
|
"sideEffects": false,
|
|
34
31
|
"types": "./dist/index.d.mts",
|
|
35
32
|
"exports": {
|
|
@@ -49,22 +46,14 @@
|
|
|
49
46
|
"source": "./src/adapters/database.ts",
|
|
50
47
|
"default": "./dist/adapter/database.mjs"
|
|
51
48
|
},
|
|
49
|
+
"./adapter/design": {
|
|
50
|
+
"source": "./src/adapters/design.ts",
|
|
51
|
+
"default": "./dist/adapter/design.mjs"
|
|
52
|
+
},
|
|
52
53
|
"./adapter/email-sender": {
|
|
53
54
|
"source": "./src/adapters/email-sender.ts",
|
|
54
55
|
"default": "./dist/adapter/email-sender.mjs"
|
|
55
56
|
},
|
|
56
|
-
"./adapter/git-host": {
|
|
57
|
-
"source": "./src/adapters/git-host/index.ts",
|
|
58
|
-
"default": "./dist/adapter/git-host.mjs"
|
|
59
|
-
},
|
|
60
|
-
"./adapter/git-host/comments": {
|
|
61
|
-
"source": "./src/adapters/git-host/comments.ts",
|
|
62
|
-
"default": "./dist/adapter/git-host/comments.mjs"
|
|
63
|
-
},
|
|
64
|
-
"./adapter/git-host/helpers": {
|
|
65
|
-
"source": "./src/adapters/git-host/helpers.ts",
|
|
66
|
-
"default": "./dist/adapter/git-host/helpers.mjs"
|
|
67
|
-
},
|
|
68
57
|
"./adapter/metadata": {
|
|
69
58
|
"source": "./src/adapters/metadata.ts",
|
|
70
59
|
"default": "./dist/adapter/metadata.mjs"
|
|
@@ -73,6 +62,10 @@
|
|
|
73
62
|
"source": "./src/adapters/notifier/index.ts",
|
|
74
63
|
"default": "./dist/adapter/notifier.mjs"
|
|
75
64
|
},
|
|
65
|
+
"./adapter/oauth": {
|
|
66
|
+
"source": "./src/adapters/oauth.ts",
|
|
67
|
+
"default": "./dist/adapter/oauth.mjs"
|
|
68
|
+
},
|
|
76
69
|
"./adapter/setup": {
|
|
77
70
|
"source": "./src/adapters/setup.ts",
|
|
78
71
|
"default": "./dist/adapter/setup.mjs"
|
|
@@ -85,6 +78,10 @@
|
|
|
85
78
|
"source": "./src/adapters/webhook-events.ts",
|
|
86
79
|
"default": "./dist/adapter/webhook-events.mjs"
|
|
87
80
|
},
|
|
81
|
+
"./ai": {
|
|
82
|
+
"source": "./src/ai.ts",
|
|
83
|
+
"default": "./dist/ai.mjs"
|
|
84
|
+
},
|
|
88
85
|
"./auth": {
|
|
89
86
|
"source": "./src/auth.ts",
|
|
90
87
|
"default": "./dist/auth.mjs"
|
|
@@ -101,6 +98,10 @@
|
|
|
101
98
|
"source": "./src/diff/index.ts",
|
|
102
99
|
"default": "./dist/diff.mjs"
|
|
103
100
|
},
|
|
101
|
+
"./insights": {
|
|
102
|
+
"source": "./src/insights/index.ts",
|
|
103
|
+
"default": "./dist/insights.mjs"
|
|
104
|
+
},
|
|
104
105
|
"./logger": {
|
|
105
106
|
"source": "./src/logger.ts",
|
|
106
107
|
"default": "./dist/logger.mjs"
|
|
@@ -157,19 +158,20 @@
|
|
|
157
158
|
"./adapter/capture-queue": "./dist/adapter/capture-queue.mjs",
|
|
158
159
|
"./adapter/capture-runner": "./dist/adapter/capture-runner.mjs",
|
|
159
160
|
"./adapter/database": "./dist/adapter/database.mjs",
|
|
161
|
+
"./adapter/design": "./dist/adapter/design.mjs",
|
|
160
162
|
"./adapter/email-sender": "./dist/adapter/email-sender.mjs",
|
|
161
|
-
"./adapter/git-host": "./dist/adapter/git-host.mjs",
|
|
162
|
-
"./adapter/git-host/comments": "./dist/adapter/git-host/comments.mjs",
|
|
163
|
-
"./adapter/git-host/helpers": "./dist/adapter/git-host/helpers.mjs",
|
|
164
163
|
"./adapter/metadata": "./dist/adapter/metadata.mjs",
|
|
165
164
|
"./adapter/notifier": "./dist/adapter/notifier.mjs",
|
|
165
|
+
"./adapter/oauth": "./dist/adapter/oauth.mjs",
|
|
166
166
|
"./adapter/setup": "./dist/adapter/setup.mjs",
|
|
167
167
|
"./adapter/storage": "./dist/adapter/storage.mjs",
|
|
168
168
|
"./adapter/webhook-events": "./dist/adapter/webhook-events.mjs",
|
|
169
|
+
"./ai": "./dist/ai.mjs",
|
|
169
170
|
"./auth": "./dist/auth.mjs",
|
|
170
171
|
"./capture": "./dist/capture.mjs",
|
|
171
172
|
"./config": "./dist/config.mjs",
|
|
172
173
|
"./diff": "./dist/diff.mjs",
|
|
174
|
+
"./insights": "./dist/insights.mjs",
|
|
173
175
|
"./logger": "./dist/logger.mjs",
|
|
174
176
|
"./models": "./dist/models.mjs",
|
|
175
177
|
"./orm": "./dist/orm.mjs",
|
|
@@ -195,30 +197,37 @@
|
|
|
195
197
|
"prepublishOnly": "nub run build",
|
|
196
198
|
"test": "vitest run",
|
|
197
199
|
"test:coverage": "vitest run --coverage",
|
|
198
|
-
"test:watch": "vitest"
|
|
200
|
+
"test:watch": "vitest",
|
|
201
|
+
"test:flake": "vitest run --repeats=20 --maxWorkers=1 --no-file-parallelism src/utils/map-limit.test.ts src/utils/session-gate.test.ts src/utils/page-limiter.test.ts src/utils/adaptive-concurrency.test.ts src/capture/rediff.test.ts src/models/build.test.ts src/models/design-credentials.test.ts"
|
|
199
202
|
},
|
|
200
203
|
"dependencies": {
|
|
201
204
|
"@opentelemetry/api": "^1.9.0",
|
|
202
|
-
"@storyshelf/affected": "0.
|
|
203
|
-
"
|
|
205
|
+
"@storyshelf/affected": "0.8.0",
|
|
206
|
+
"@storyshelf/image": "0.8.0",
|
|
207
|
+
"axe-core": "4.13.0",
|
|
208
|
+
"drizzle-orm": "^0.45.4",
|
|
204
209
|
"pino": "^10.3.1",
|
|
205
|
-
"pixelmatch": "^7.1.0",
|
|
206
|
-
"pngjs": "^7.0.0",
|
|
207
210
|
"unzipper": "0.12.5",
|
|
208
|
-
"zod": "^4.
|
|
211
|
+
"zod": "^4.6.7"
|
|
209
212
|
},
|
|
210
213
|
"devDependencies": {
|
|
214
|
+
"@types/jsdom": "^30.0.0",
|
|
211
215
|
"@types/node": "^26.0.0",
|
|
212
216
|
"@types/pngjs": "^6.0.5",
|
|
213
217
|
"@types/unzipper": "0.10.11",
|
|
214
218
|
"@vitest/coverage-v8": "^4.0.0",
|
|
215
219
|
"adm-zip": "^0.6.1",
|
|
220
|
+
"jsdom": "^30.0.1",
|
|
216
221
|
"oxfmt": "^0.65.0",
|
|
217
222
|
"oxlint": "^1.80.0",
|
|
218
223
|
"oxlint-tsgolint": "^7.0.2001",
|
|
224
|
+
"pngjs": "^7.0.0",
|
|
219
225
|
"tsdown": "^0.22.14",
|
|
220
226
|
"typescript": "^7.0.2",
|
|
221
|
-
"vitest": "^5.0.
|
|
227
|
+
"vitest": "^5.0.5"
|
|
228
|
+
},
|
|
229
|
+
"engines": {
|
|
230
|
+
"node": ">=24"
|
|
222
231
|
},
|
|
223
232
|
"jsr": {
|
|
224
233
|
"runtimeCompat": {
|