@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
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import __tsdown_shims_path from 'node:path';
|
|
2
|
+
import __tsdown_shims_url from 'node:url';
|
|
3
|
+
import { CatalogEntry } from "./types.mjs";
|
|
4
|
+
/**
|
|
5
|
+
* Entries of a parsed index document, or null when it is not an index. Test entries (Storybook 10
|
|
6
|
+
* `subtype: "test"`) are left out, as capture leaves them out; entries without an id or title are
|
|
7
|
+
* skipped, never an error.
|
|
8
|
+
*/
|
|
9
|
+
declare function parseStorybookIndex(document: unknown): CatalogEntry[] | null;
|
|
10
|
+
/** Parse the text of an index file; null when it is not JSON or not an index. */
|
|
11
|
+
declare function parseStorybookIndexText(text: string): CatalogEntry[] | null;
|
|
12
|
+
export { parseStorybookIndex, parseStorybookIndexText };
|
|
13
|
+
//# sourceMappingURL=parse.d.mts.map
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import "node:path";
|
|
2
|
+
import "node:url";
|
|
3
|
+
import.meta.url;
|
|
4
|
+
import { normalizeImportPath } from "../../models/design-resolve.mjs";
|
|
5
|
+
// src/capture/catalog/parse.ts
|
|
6
|
+
/** Storybook index to catalog entries: `index.json` (v4/v5), `stories.json` (v3 and older). */
|
|
7
|
+
/**
|
|
8
|
+
* Entries of a parsed index document, or null when it is not an index. Test entries (Storybook 10
|
|
9
|
+
* `subtype: "test"`) are left out, as capture leaves them out; entries without an id or title are
|
|
10
|
+
* skipped, never an error.
|
|
11
|
+
*/
|
|
12
|
+
function parseStorybookIndex(document) {
|
|
13
|
+
if (typeof document !== "object" || document === null) return null;
|
|
14
|
+
const record = document;
|
|
15
|
+
const table = [record.entries, record.stories].find((value) => isRecord(value));
|
|
16
|
+
if (!table) return null;
|
|
17
|
+
return Object.values(table).flatMap((raw) => {
|
|
18
|
+
const entry = toEntry(raw);
|
|
19
|
+
return entry ? [entry] : [];
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/** Parse the text of an index file; null when it is not JSON or not an index. */
|
|
23
|
+
function parseStorybookIndexText(text) {
|
|
24
|
+
try {
|
|
25
|
+
return parseStorybookIndex(JSON.parse(text));
|
|
26
|
+
} catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function isRecord(value) {
|
|
31
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
32
|
+
}
|
|
33
|
+
function str(value) {
|
|
34
|
+
return typeof value === "string" && value !== "" ? value : void 0;
|
|
35
|
+
}
|
|
36
|
+
/** One raw entry; every field is optional on old Storybooks, so each is read defensively. */
|
|
37
|
+
function toEntry(raw) {
|
|
38
|
+
if (!isRecord(raw) || raw["subtype"] === "test") return null;
|
|
39
|
+
const id = str(raw["id"]);
|
|
40
|
+
const title = str(raw["title"]) ?? str(raw["kind"]);
|
|
41
|
+
if (!id || !title) return null;
|
|
42
|
+
const importPath = str(raw["importPath"]);
|
|
43
|
+
const tags = raw["tags"];
|
|
44
|
+
return {
|
|
45
|
+
id,
|
|
46
|
+
title,
|
|
47
|
+
name: str(raw["name"]) ?? str(raw["story"]) ?? id,
|
|
48
|
+
importPath: importPath ? normalizeImportPath(importPath) : "",
|
|
49
|
+
type: raw["type"] === "docs" ? "docs" : "story",
|
|
50
|
+
tags: Array.isArray(tags) ? tags.filter((tag) => typeof tag === "string") : []
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export { parseStorybookIndex, parseStorybookIndexText };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=parse.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.mjs","names":[],"sources":["../../../src/capture/catalog/parse.ts"],"sourcesContent":["/** Storybook index to catalog entries: `index.json` (v4/v5), `stories.json` (v3 and older). */\nimport { normalizeImportPath } from \"../../models/design-resolve.ts\";\nimport type { CatalogEntry } from \"./types.ts\";\n\n/**\n * Entries of a parsed index document, or null when it is not an index. Test entries (Storybook 10\n * `subtype: \"test\"`) are left out, as capture leaves them out; entries without an id or title are\n * skipped, never an error.\n */\nexport function parseStorybookIndex(document: unknown): CatalogEntry[] | null {\n if (typeof document !== \"object\" || document === null) {\n return null;\n }\n const record = document as { entries?: unknown; stories?: unknown };\n const table = [record.entries, record.stories].find((value) => isRecord(value));\n if (!table) {\n return null;\n }\n return Object.values(table).flatMap((raw) => {\n const entry = toEntry(raw);\n return entry ? [entry] : [];\n });\n}\n\n/** Parse the text of an index file; null when it is not JSON or not an index. */\nexport function parseStorybookIndexText(text: string): CatalogEntry[] | null {\n try {\n return parseStorybookIndex(JSON.parse(text));\n } catch {\n return null;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction str(value: unknown): string | undefined {\n return typeof value === \"string\" && value !== \"\" ? value : undefined;\n}\n\n/** One raw entry; every field is optional on old Storybooks, so each is read defensively. */\nfunction toEntry(raw: unknown): CatalogEntry | null {\n if (!isRecord(raw) || raw[\"subtype\"] === \"test\") {\n return null;\n }\n const id = str(raw[\"id\"]);\n const title = str(raw[\"title\"]) ?? str(raw[\"kind\"]);\n if (!id || !title) {\n return null;\n }\n const importPath = str(raw[\"importPath\"]);\n const tags = raw[\"tags\"];\n return {\n id,\n title,\n name: str(raw[\"name\"]) ?? str(raw[\"story\"]) ?? id,\n importPath: importPath ? normalizeImportPath(importPath) : \"\",\n type: raw[\"type\"] === \"docs\" ? \"docs\" : \"story\",\n tags: Array.isArray(tags) ? tags.filter((tag): tag is string => typeof tag === \"string\") : [],\n };\n}\n"],"mappings":";;;;;;;;;;;AASA,SAAgB,oBAAoB,UAA0C;CAC5E,IAAI,OAAO,aAAa,YAAY,aAAa,MAC/C,OAAO;CAET,MAAM,SAAS;CACf,MAAM,QAAQ,CAAC,OAAO,SAAS,OAAO,OAAO,CAAC,CAAC,MAAM,UAAU,SAAS,KAAK,CAAC;CAC9E,IAAI,CAAC,OACH,OAAO;CAET,OAAO,OAAO,OAAO,KAAK,CAAC,CAAC,SAAS,QAAQ;EAC3C,MAAM,QAAQ,QAAQ,GAAG;EACzB,OAAO,QAAQ,CAAC,KAAK,IAAI,CAAC;CAC5B,CAAC;AACH;;AAGA,SAAgB,wBAAwB,MAAqC;CAC3E,IAAI;EACF,OAAO,oBAAoB,KAAK,MAAM,IAAI,CAAC;CAC7C,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,IAAI,OAAoC;CAC/C,OAAO,OAAO,UAAU,YAAY,UAAU,KAAK,QAAQ,KAAA;AAC7D;;AAGA,SAAS,QAAQ,KAAmC;CAClD,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,eAAe,QACvC,OAAO;CAET,MAAM,KAAK,IAAI,IAAI,KAAK;CACxB,MAAM,QAAQ,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO;CAClD,IAAI,CAAC,MAAM,CAAC,OACV,OAAO;CAET,MAAM,aAAa,IAAI,IAAI,aAAa;CACxC,MAAM,OAAO,IAAI;CACjB,OAAO;EACL;EACA;EACA,MAAM,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI,QAAQ,KAAK;EAC/C,YAAY,aAAa,oBAAoB,UAAU,IAAI;EAC3D,MAAM,IAAI,YAAY,SAAS,SAAS;EACxC,MAAM,MAAM,QAAQ,IAAI,IAAI,KAAK,QAAQ,QAAuB,OAAO,QAAQ,QAAQ,IAAI,CAAC;CAC9F;AACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import __tsdown_shims_path from 'node:path';
|
|
2
|
+
import __tsdown_shims_url from 'node:url';
|
|
3
|
+
import { StorageAdapter } from "../../adapter/storage.mjs";
|
|
4
|
+
/**
|
|
5
|
+
* A file of a build's published Storybook by its path inside the build, or null when it is gone.
|
|
6
|
+
* Content-addressed builds answer through their manifest; older ones from the per-build copy.
|
|
7
|
+
*/
|
|
8
|
+
declare function readPublishedFile(storage: StorageAdapter, projectId: string, buildId: string, rel: string): Promise<Buffer | null>;
|
|
9
|
+
/** Published bytes and, for content-addressed files, their manifest identity. */
|
|
10
|
+
declare function readPublishedFileInfo(storage: StorageAdapter, projectId: string, buildId: string, rel: string): Promise<{
|
|
11
|
+
bytes: Buffer;
|
|
12
|
+
contentHash?: string;
|
|
13
|
+
} | null>;
|
|
14
|
+
export { readPublishedFile, readPublishedFileInfo };
|
|
15
|
+
//# sourceMappingURL=read.d.mts.map
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { posix } from "node:path";
|
|
2
|
+
import "node:url";
|
|
3
|
+
import.meta.url;
|
|
4
|
+
import { storybookDir } from "../../paths.mjs";
|
|
5
|
+
// src/capture/catalog/read.ts
|
|
6
|
+
/** Reading a published build's files from storage. */
|
|
7
|
+
/**
|
|
8
|
+
* A file of a build's published Storybook by its path inside the build, or null when it is gone.
|
|
9
|
+
* Content-addressed builds answer through their manifest; older ones from the per-build copy.
|
|
10
|
+
*/
|
|
11
|
+
async function readPublishedFile(storage, projectId, buildId, rel) {
|
|
12
|
+
return (await readPublishedFileInfo(storage, projectId, buildId, rel))?.bytes ?? null;
|
|
13
|
+
}
|
|
14
|
+
/** Published bytes and, for content-addressed files, their manifest identity. */
|
|
15
|
+
async function readPublishedFileInfo(storage, projectId, buildId, rel) {
|
|
16
|
+
const dir = storybookDir(projectId, buildId);
|
|
17
|
+
const viaManifest = await readViaManifest(storage, dir, rel);
|
|
18
|
+
if (viaManifest) return viaManifest;
|
|
19
|
+
const legacy = posix.join(dir, rel);
|
|
20
|
+
return await storage.exists(legacy) ? { bytes: await storage.read(legacy) } : null;
|
|
21
|
+
}
|
|
22
|
+
async function readViaManifest(storage, dir, rel) {
|
|
23
|
+
try {
|
|
24
|
+
const manifestPath = posix.join(dir, "manifest.json");
|
|
25
|
+
if (!await storage.exists(manifestPath)) return null;
|
|
26
|
+
const hash = JSON.parse((await storage.read(manifestPath)).toString("utf8"))[rel];
|
|
27
|
+
if (!hash) return null;
|
|
28
|
+
const path = `content/${hash}`;
|
|
29
|
+
return await storage.exists(path) ? {
|
|
30
|
+
bytes: await storage.read(path),
|
|
31
|
+
contentHash: hash
|
|
32
|
+
} : null;
|
|
33
|
+
} catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export { readPublishedFile, readPublishedFileInfo };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=read.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.mjs","names":[],"sources":["../../../src/capture/catalog/read.ts"],"sourcesContent":["/** Reading a published build's files from storage. */\nimport { posix } from \"node:path\";\nimport type { StorageAdapter } from \"../../adapters/storage.ts\";\nimport { storybookDir } from \"../../utils/paths.ts\";\n\n/**\n * A file of a build's published Storybook by its path inside the build, or null when it is gone.\n * Content-addressed builds answer through their manifest; older ones from the per-build copy.\n */\nexport async function readPublishedFile(\n storage: StorageAdapter,\n projectId: string,\n buildId: string,\n rel: string,\n): Promise<Buffer | null> {\n return (await readPublishedFileInfo(storage, projectId, buildId, rel))?.bytes ?? null;\n}\n\n/** Published bytes and, for content-addressed files, their manifest identity. */\nexport async function readPublishedFileInfo(\n storage: StorageAdapter,\n projectId: string,\n buildId: string,\n rel: string,\n): Promise<{ bytes: Buffer; contentHash?: string } | null> {\n const dir = storybookDir(projectId, buildId);\n const viaManifest = await readViaManifest(storage, dir, rel);\n if (viaManifest) {\n return viaManifest;\n }\n const legacy = posix.join(dir, rel);\n return (await storage.exists(legacy)) ? { bytes: await storage.read(legacy) } : null;\n}\n\nasync function readViaManifest(\n storage: StorageAdapter,\n dir: string,\n rel: string,\n): Promise<{ bytes: Buffer; contentHash: string } | null> {\n try {\n const manifestPath = posix.join(dir, \"manifest.json\");\n if (!(await storage.exists(manifestPath))) {\n return null;\n }\n const manifest = JSON.parse((await storage.read(manifestPath)).toString(\"utf8\")) as Record<\n string,\n string\n >;\n const hash = manifest[rel];\n if (!hash) return null;\n const path = `content/${hash}`;\n return (await storage.exists(path))\n ? { bytes: await storage.read(path), contentHash: hash }\n : null;\n } catch {\n // an unreadable manifest falls back to the per-build copy\n return null;\n }\n}\n"],"mappings":";;;;;;;;;;AASA,eAAsB,kBACpB,SACA,WACA,SACA,KACwB;CACxB,QAAQ,MAAM,sBAAsB,SAAS,WAAW,SAAS,GAAG,EAAA,EAAI,SAAS;AACnF;;AAGA,eAAsB,sBACpB,SACA,WACA,SACA,KACyD;CACzD,MAAM,MAAM,aAAa,WAAW,OAAO;CAC3C,MAAM,cAAc,MAAM,gBAAgB,SAAS,KAAK,GAAG;CAC3D,IAAI,aACF,OAAO;CAET,MAAM,SAAS,MAAM,KAAK,KAAK,GAAG;CAClC,OAAQ,MAAM,QAAQ,OAAO,MAAM,IAAK,EAAE,OAAO,MAAM,QAAQ,KAAK,MAAM,EAAE,IAAI;AAClF;AAEA,eAAe,gBACb,SACA,KACA,KACwD;CACxD,IAAI;EACF,MAAM,eAAe,MAAM,KAAK,KAAK,eAAe;EACpD,IAAI,CAAE,MAAM,QAAQ,OAAO,YAAY,GACrC,OAAO;EAMT,MAAM,OAJW,KAAK,OAAO,MAAM,QAAQ,KAAK,YAAY,EAAA,CAAG,SAAS,MAAM,CAI1D,CAAC,CAAC;EACtB,IAAI,CAAC,MAAM,OAAO;EAClB,MAAM,OAAO,WAAW;EACxB,OAAQ,MAAM,QAAQ,OAAO,IAAI,IAC7B;GAAE,OAAO,MAAM,QAAQ,KAAK,IAAI;GAAG,aAAa;EAAK,IACrD;CACN,QAAQ;EAEN,OAAO;CACT;AACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import __tsdown_shims_path from 'node:path';
|
|
2
|
+
import __tsdown_shims_url from 'node:url';
|
|
3
|
+
/** Shapes of the persisted catalog (ADR 0006, decision 9). */
|
|
4
|
+
/** One Storybook index entry, kept compact: story and docs entries, never test entries. */
|
|
5
|
+
interface CatalogEntry {
|
|
6
|
+
id: string;
|
|
7
|
+
title: string;
|
|
8
|
+
name: string;
|
|
9
|
+
/** Story file without a leading `./`; empty when the index carries none. */
|
|
10
|
+
importPath: string;
|
|
11
|
+
type: "story" | "docs";
|
|
12
|
+
tags: string[];
|
|
13
|
+
}
|
|
14
|
+
/** A build's catalog as stored in `catalog.json`. */
|
|
15
|
+
interface Catalog {
|
|
16
|
+
/** Format version of the file. */
|
|
17
|
+
v: 1;
|
|
18
|
+
entries: CatalogEntry[];
|
|
19
|
+
}
|
|
20
|
+
/** The entries of one story file, with what `build_components` stores of them. */
|
|
21
|
+
interface CatalogComponent {
|
|
22
|
+
importPath: string;
|
|
23
|
+
title: string;
|
|
24
|
+
/** Story entries; docs entries are not counted. */
|
|
25
|
+
storyCount: number;
|
|
26
|
+
/** SHA-256 over the component's entries, so two builds compare with one string. */
|
|
27
|
+
hash: string;
|
|
28
|
+
entries: CatalogEntry[];
|
|
29
|
+
}
|
|
30
|
+
export { Catalog, CatalogComponent, CatalogEntry };
|
|
31
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import __tsdown_shims_path from 'node:path';
|
|
2
|
+
import __tsdown_shims_url from 'node:url';
|
|
3
|
+
import "../adapter/database.mjs";
|
|
4
|
+
import "../adapter/storage.mjs";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
declare const referenceSchema: z.ZodObject<{
|
|
7
|
+
version: z.ZodLiteral<1>;
|
|
8
|
+
baselineId: z.ZodString;
|
|
9
|
+
baselineVersion: z.ZodString;
|
|
10
|
+
branch: z.ZodString;
|
|
11
|
+
defaultBranch: z.ZodBoolean;
|
|
12
|
+
sourceBuildId: z.ZodNullable<z.ZodString>;
|
|
13
|
+
sourceSnapshotId: z.ZodNullable<z.ZodString>;
|
|
14
|
+
imageSha256: z.ZodString;
|
|
15
|
+
baselineFingerprint: z.ZodNullable<z.ZodString>;
|
|
16
|
+
captureFingerprint: z.ZodNullable<z.ZodString>;
|
|
17
|
+
mode: z.ZodNullable<z.ZodString>;
|
|
18
|
+
target: z.ZodString;
|
|
19
|
+
width: z.ZodNullable<z.ZodNumber>;
|
|
20
|
+
height: z.ZodNullable<z.ZodNumber>;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
type ComparisonReference = z.infer<typeof referenceSchema>;
|
|
23
|
+
declare function parseComparisonReference(raw: string | null | undefined): ComparisonReference | null;
|
|
24
|
+
/** Reject paths outside the consuming build's dedicated comparison directory. */
|
|
25
|
+
declare function isComparisonImagePath(path: string, projectId: string, buildId: string): boolean;
|
|
26
|
+
export { ComparisonReference, isComparisonImagePath, parseComparisonReference };
|
|
27
|
+
//# sourceMappingURL=comparison-reference.d.mts.map
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import "node:path";
|
|
2
|
+
import "node:url";
|
|
3
|
+
import.meta.url;
|
|
4
|
+
import "../adapters/capture-target.mjs";
|
|
5
|
+
import { ulid } from "../utils/ulid.mjs";
|
|
6
|
+
import { SnapshotModel } from "../models/snapshot.mjs";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
import { createHash } from "node:crypto";
|
|
9
|
+
// src/capture/comparison-reference.ts
|
|
10
|
+
/** Freeze a baseline image under the consuming build so it survives baseline movement. */
|
|
11
|
+
const referenceSchema = z.object({
|
|
12
|
+
version: z.literal(1),
|
|
13
|
+
baselineId: z.string(),
|
|
14
|
+
baselineVersion: z.string(),
|
|
15
|
+
branch: z.string(),
|
|
16
|
+
defaultBranch: z.boolean(),
|
|
17
|
+
sourceBuildId: z.string().nullable(),
|
|
18
|
+
sourceSnapshotId: z.string().nullable(),
|
|
19
|
+
imageSha256: z.string().regex(/^[a-f0-9]{64}$/u),
|
|
20
|
+
baselineFingerprint: z.string().nullable(),
|
|
21
|
+
captureFingerprint: z.string().nullable(),
|
|
22
|
+
mode: z.string().nullable(),
|
|
23
|
+
target: z.string(),
|
|
24
|
+
width: z.number().int().positive().nullable(),
|
|
25
|
+
height: z.number().int().positive().nullable()
|
|
26
|
+
});
|
|
27
|
+
async function freezeComparison(storage, projectId, buildId, baseline, settings) {
|
|
28
|
+
const image = await storage.read(baseline.screenshotPath);
|
|
29
|
+
const comparisonImagePath = `${projectId}/builds/${buildId}/comparisons/${ulid()}.png`;
|
|
30
|
+
const reference = {
|
|
31
|
+
version: 1,
|
|
32
|
+
baselineId: baseline.id,
|
|
33
|
+
baselineVersion: baseline.updatedAt,
|
|
34
|
+
branch: baseline.branch,
|
|
35
|
+
defaultBranch: baseline.branch === settings.defaultBranch,
|
|
36
|
+
sourceBuildId: baseline.sourceBuildId ?? null,
|
|
37
|
+
sourceSnapshotId: settings.sourceSnapshotId,
|
|
38
|
+
imageSha256: createHash("sha256").update(image).digest("hex"),
|
|
39
|
+
baselineFingerprint: baseline.fingerprint ?? null,
|
|
40
|
+
captureFingerprint: settings.captureFingerprint ?? null,
|
|
41
|
+
mode: settings.mode,
|
|
42
|
+
target: settings.target,
|
|
43
|
+
width: settings.width,
|
|
44
|
+
height: settings.height
|
|
45
|
+
};
|
|
46
|
+
await storage.write(comparisonImagePath, image);
|
|
47
|
+
return {
|
|
48
|
+
comparisonImagePath,
|
|
49
|
+
comparisonMetadata: JSON.stringify(reference)
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function parseComparisonReference(raw) {
|
|
53
|
+
if (!raw) return null;
|
|
54
|
+
try {
|
|
55
|
+
const parsed = referenceSchema.safeParse(JSON.parse(raw));
|
|
56
|
+
return parsed.success ? parsed.data : null;
|
|
57
|
+
} catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Reject paths outside the consuming build's dedicated comparison directory. */
|
|
62
|
+
function isComparisonImagePath(path, projectId, buildId) {
|
|
63
|
+
const prefix = `${projectId}/builds/${buildId}/comparisons/`;
|
|
64
|
+
return path.startsWith(prefix) && /^[0-9A-HJKMNP-TV-Z]{26}\.png$/u.test(path.slice(prefix.length));
|
|
65
|
+
}
|
|
66
|
+
/** Identify a rendering snapshot only when its stored identity and image are provable. */
|
|
67
|
+
async function sourceSnapshotId(db, baseline) {
|
|
68
|
+
if (!baseline.sourceBuildId || !baseline.snapshotId) return null;
|
|
69
|
+
const snapshot = await new SnapshotModel(db).get(baseline.snapshotId);
|
|
70
|
+
if (!snapshot || snapshot.inherited || snapshot.buildId !== baseline.sourceBuildId || snapshot.projectId !== baseline.projectId || snapshot.storyId !== baseline.storyId || snapshot.viewportName !== baseline.viewportName || (snapshot.browser ?? "chromium") !== (baseline.browser ?? "chromium") || snapshot.screenshotPath !== baseline.screenshotPath) return null;
|
|
71
|
+
return snapshot.id;
|
|
72
|
+
}
|
|
73
|
+
export { freezeComparison, isComparisonImagePath, parseComparisonReference, sourceSnapshotId };
|
|
74
|
+
|
|
75
|
+
//# sourceMappingURL=comparison-reference.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comparison-reference.mjs","names":[],"sources":["../../src/capture/comparison-reference.ts"],"sourcesContent":["/** Freeze a baseline image under the consuming build so it survives baseline movement. */\nimport { createHash } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { DEFAULT_BROWSER } from \"../adapters/capture-runner.ts\";\nimport type { DatabaseAdapter } from \"../adapters/database.ts\";\nimport type { StorageAdapter } from \"../adapters/storage.ts\";\nimport { SnapshotModel } from \"../models/snapshot.ts\";\nimport type { Baseline } from \"../schema/baseline.ts\";\nimport { ulid } from \"../utils/ulid.ts\";\n\nconst referenceSchema = z.object({\n version: z.literal(1),\n baselineId: z.string(),\n baselineVersion: z.string(),\n branch: z.string(),\n defaultBranch: z.boolean(),\n sourceBuildId: z.string().nullable(),\n sourceSnapshotId: z.string().nullable(),\n imageSha256: z.string().regex(/^[a-f0-9]{64}$/u),\n baselineFingerprint: z.string().nullable(),\n captureFingerprint: z.string().nullable(),\n mode: z.string().nullable(),\n target: z.string(),\n width: z.number().int().positive().nullable(),\n height: z.number().int().positive().nullable(),\n});\nexport type ComparisonReference = z.infer<typeof referenceSchema>;\nexport interface ComparisonSettings {\n defaultBranch: string;\n mode: string | null;\n target: string;\n width: number | null;\n height: number | null;\n captureFingerprint: string | null;\n sourceSnapshotId: string | null;\n}\n\nexport async function freezeComparison(\n storage: StorageAdapter,\n projectId: string,\n buildId: string,\n baseline: Baseline,\n settings: ComparisonSettings,\n): Promise<{ comparisonImagePath: string; comparisonMetadata: string }> {\n const image = await storage.read(baseline.screenshotPath);\n const comparisonImagePath = `${projectId}/builds/${buildId}/comparisons/${ulid()}.png`;\n const reference: ComparisonReference = {\n version: 1,\n baselineId: baseline.id,\n baselineVersion: baseline.updatedAt,\n branch: baseline.branch,\n defaultBranch: baseline.branch === settings.defaultBranch,\n sourceBuildId: baseline.sourceBuildId ?? null,\n sourceSnapshotId: settings.sourceSnapshotId,\n imageSha256: createHash(\"sha256\").update(image).digest(\"hex\"),\n baselineFingerprint: baseline.fingerprint ?? null,\n captureFingerprint: settings.captureFingerprint ?? null,\n mode: settings.mode,\n target: settings.target,\n width: settings.width,\n height: settings.height,\n };\n await storage.write(comparisonImagePath, image);\n return { comparisonImagePath, comparisonMetadata: JSON.stringify(reference) };\n}\n\nexport function parseComparisonReference(\n raw: string | null | undefined,\n): ComparisonReference | null {\n if (!raw) return null;\n try {\n const parsed = referenceSchema.safeParse(JSON.parse(raw));\n return parsed.success ? parsed.data : null;\n } catch {\n return null;\n }\n}\n\n/** Reject paths outside the consuming build's dedicated comparison directory. */\nexport function isComparisonImagePath(path: string, projectId: string, buildId: string): boolean {\n const prefix = `${projectId}/builds/${buildId}/comparisons/`;\n return (\n path.startsWith(prefix) && /^[0-9A-HJKMNP-TV-Z]{26}\\.png$/u.test(path.slice(prefix.length))\n );\n}\n\n/** Identify a rendering snapshot only when its stored identity and image are provable. */\nexport async function sourceSnapshotId(\n db: DatabaseAdapter,\n baseline: Baseline,\n): Promise<string | null> {\n if (!baseline.sourceBuildId || !baseline.snapshotId) return null;\n const snapshot = await new SnapshotModel(db).get(baseline.snapshotId);\n if (\n !snapshot ||\n snapshot.inherited ||\n snapshot.buildId !== baseline.sourceBuildId ||\n snapshot.projectId !== baseline.projectId ||\n snapshot.storyId !== baseline.storyId ||\n snapshot.viewportName !== baseline.viewportName ||\n (snapshot.browser ?? DEFAULT_BROWSER) !== (baseline.browser ?? DEFAULT_BROWSER) ||\n snapshot.screenshotPath !== baseline.screenshotPath\n )\n return null;\n return snapshot.id;\n}\n"],"mappings":";;;;;;;;;;AAUA,MAAM,kBAAkB,EAAE,OAAO;CAC/B,SAAS,EAAE,QAAQ,CAAC;CACpB,YAAY,EAAE,OAAO;CACrB,iBAAiB,EAAE,OAAO;CAC1B,QAAQ,EAAE,OAAO;CACjB,eAAe,EAAE,QAAQ;CACzB,eAAe,EAAE,OAAO,CAAC,CAAC,SAAS;CACnC,kBAAkB,EAAE,OAAO,CAAC,CAAC,SAAS;CACtC,aAAa,EAAE,OAAO,CAAC,CAAC,MAAM,iBAAiB;CAC/C,qBAAqB,EAAE,OAAO,CAAC,CAAC,SAAS;CACzC,oBAAoB,EAAE,OAAO,CAAC,CAAC,SAAS;CACxC,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS;CAC1B,QAAQ,EAAE,OAAO;CACjB,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS;CAC5C,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS;AAC/C,CAAC;AAYD,eAAsB,iBACpB,SACA,WACA,SACA,UACA,UACsE;CACtE,MAAM,QAAQ,MAAM,QAAQ,KAAK,SAAS,cAAc;CACxD,MAAM,sBAAsB,GAAG,UAAU,UAAU,QAAQ,eAAe,KAAK,EAAE;CACjF,MAAM,YAAiC;EACrC,SAAS;EACT,YAAY,SAAS;EACrB,iBAAiB,SAAS;EAC1B,QAAQ,SAAS;EACjB,eAAe,SAAS,WAAW,SAAS;EAC5C,eAAe,SAAS,iBAAiB;EACzC,kBAAkB,SAAS;EAC3B,aAAa,WAAW,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,KAAK;EAC5D,qBAAqB,SAAS,eAAe;EAC7C,oBAAoB,SAAS,sBAAsB;EACnD,MAAM,SAAS;EACf,QAAQ,SAAS;EACjB,OAAO,SAAS;EAChB,QAAQ,SAAS;CACnB;CACA,MAAM,QAAQ,MAAM,qBAAqB,KAAK;CAC9C,OAAO;EAAE;EAAqB,oBAAoB,KAAK,UAAU,SAAS;CAAE;AAC9E;AAEA,SAAgB,yBACd,KAC4B;CAC5B,IAAI,CAAC,KAAK,OAAO;CACjB,IAAI;EACF,MAAM,SAAS,gBAAgB,UAAU,KAAK,MAAM,GAAG,CAAC;EACxD,OAAO,OAAO,UAAU,OAAO,OAAO;CACxC,QAAQ;EACN,OAAO;CACT;AACF;;AAGA,SAAgB,sBAAsB,MAAc,WAAmB,SAA0B;CAC/F,MAAM,SAAS,GAAG,UAAU,UAAU,QAAQ;CAC9C,OACE,KAAK,WAAW,MAAM,KAAK,iCAAiC,KAAK,KAAK,MAAM,OAAO,MAAM,CAAC;AAE9F;;AAGA,eAAsB,iBACpB,IACA,UACwB;CACxB,IAAI,CAAC,SAAS,iBAAiB,CAAC,SAAS,YAAY,OAAO;CAC5D,MAAM,WAAW,MAAM,IAAI,cAAc,EAAE,CAAC,CAAC,IAAI,SAAS,UAAU;CACpE,IACE,CAAC,YACD,SAAS,aACT,SAAS,YAAY,SAAS,iBAC9B,SAAS,cAAc,SAAS,aAChC,SAAS,YAAY,SAAS,WAC9B,SAAS,iBAAiB,SAAS,iBAClC,SAAS,WAAA,iBAAiC,SAAS,WAAA,eACpD,SAAS,mBAAmB,SAAS,gBAErC,OAAO;CACT,OAAO,SAAS;AAClB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import __tsdown_shims_path from 'node:path';
|
|
2
|
+
import __tsdown_shims_url from 'node:url';
|
|
3
|
+
import { Logger } from "../../logger.mjs";
|
|
4
|
+
import { CaptureRunner } from "../../adapter/capture-runner.mjs";
|
|
5
|
+
import { DatabaseAdapter } from "../../adapter/database.mjs";
|
|
6
|
+
import { DesignProvider } from "../../adapter/design.mjs";
|
|
7
|
+
import { NotifierProvider } from "../../adapters/notifier/provider.mjs";
|
|
8
|
+
import { StorageAdapter } from "../../adapter/storage.mjs";
|
|
9
|
+
import { ShelfConfig } from "../../config.mjs";
|
|
10
|
+
import { SecretInput } from "../../utils/encrypt.mjs";
|
|
11
|
+
import { CaptureJobOptions, ShardJob } from "../orchestrator.mjs";
|
|
12
|
+
import { BuildStatePublisher } from "../build-state/types.mjs";
|
|
13
|
+
import { DispatchDeps } from "../dispatch.mjs";
|
|
14
|
+
import { KindHandler } from "./types.mjs";
|
|
15
|
+
/** What the capture handler needs: the same adapters the server's own capture setup uses. */
|
|
16
|
+
interface CaptureHandlerOptions {
|
|
17
|
+
/** Database adapter; its own `tables` are used (never a dialect's defaults). */
|
|
18
|
+
db: DatabaseAdapter;
|
|
19
|
+
storage: StorageAdapter;
|
|
20
|
+
/** Pure renderer; `cancel` is called when a job's lease is lost or the job is cancelled. */
|
|
21
|
+
runner: CaptureRunner;
|
|
22
|
+
/** Scratch directory for Storybook extraction. */
|
|
23
|
+
scratchDir: string;
|
|
24
|
+
logger: Logger;
|
|
25
|
+
/** Puts a shard job on the queue; sharding needs it. Defaults to the consumed queue's `enqueue`. */
|
|
26
|
+
enqueue: (job: ShardJob) => Promise<void>;
|
|
27
|
+
/** Notifier providers; `state` channels (git hosts) get the build statuses. */
|
|
28
|
+
notifiers?: NotifierProvider[];
|
|
29
|
+
/**
|
|
30
|
+
* Shows a build's state on its git channels at every transition. Default: deliver inline through
|
|
31
|
+
* `notifiers` (a capture always has `testing` on); the app passes its queue-backed publisher.
|
|
32
|
+
*/
|
|
33
|
+
buildState?: BuildStatePublisher;
|
|
34
|
+
/** Links in statuses are absolute from `publicBaseUrl`; published Storybooks use `publishedBaseDomain`. */
|
|
35
|
+
config?: Pick<ShelfConfig, "publicBaseUrl" | "publishedBaseDomain" | "maxZipEntries" | "maxUnzippedBytes">;
|
|
36
|
+
/**
|
|
37
|
+
* The resolved public origin (ADR 0007, decision 6): status links and URL-reaching targets use it.
|
|
38
|
+
* Default: `config.publicBaseUrl`, then the platform's address, then the origin an admin stored.
|
|
39
|
+
*/
|
|
40
|
+
publicOrigin?: () => Promise<string | undefined>;
|
|
41
|
+
/** Design providers validating declared design links during capture. */
|
|
42
|
+
design?: DesignProvider[];
|
|
43
|
+
/** Server secret for webhook decryption. */
|
|
44
|
+
secret?: SecretInput;
|
|
45
|
+
viewports?: CaptureJobOptions["viewports"];
|
|
46
|
+
/** Captures per shard; unset keeps every build in one job. */
|
|
47
|
+
shardSize?: number;
|
|
48
|
+
/** Retries assumed for jobs that do not state `maxAttempts` (default 2). */
|
|
49
|
+
maxRetries?: number;
|
|
50
|
+
}
|
|
51
|
+
/** The `capture` handler: runs `createDispatchJob`'s runner, cancels through `runner.cancel`. */
|
|
52
|
+
declare function createCaptureHandler(options: CaptureHandlerOptions): KindHandler;
|
|
53
|
+
/** The dispatch dependencies the handler runs captures with; the host reuses them to write failures the pipeline never got to. */
|
|
54
|
+
declare function captureDispatchDeps(options: CaptureHandlerOptions, maxRetries: number): DispatchDeps;
|
|
55
|
+
export { CaptureHandlerOptions, captureDispatchDeps, createCaptureHandler };
|
|
56
|
+
//# sourceMappingURL=capture-handler.d.mts.map
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import "node:path";
|
|
2
|
+
import "node:url";
|
|
3
|
+
import.meta.url;
|
|
4
|
+
import { extractionLimitsOf, resolvePublishLimits } from "../publish/limits.mjs";
|
|
5
|
+
import { retriesOf } from "./retry.mjs";
|
|
6
|
+
import { createBuildStatePublisher } from "../build-state/publisher.mjs";
|
|
7
|
+
import { createPublicOriginResolver } from "../../models/public-origin.mjs";
|
|
8
|
+
import { createDispatchJob } from "../dispatch.mjs";
|
|
9
|
+
// src/capture/consumer/capture-handler.ts
|
|
10
|
+
/** Whether a polled capture job carries the minimum shape to execute. */
|
|
11
|
+
function isValidCaptureJob(job) {
|
|
12
|
+
return typeof job.buildId === "string" && job.buildId.length > 0;
|
|
13
|
+
}
|
|
14
|
+
/** The `capture` handler: runs `createDispatchJob`'s runner, cancels through `runner.cancel`. */
|
|
15
|
+
function createCaptureHandler(options) {
|
|
16
|
+
const fallbackRetries = options.maxRetries ?? 2;
|
|
17
|
+
const dispatches = /* @__PURE__ */ new Map();
|
|
18
|
+
const dispatchFor = (retries) => {
|
|
19
|
+
const existing = dispatches.get(retries);
|
|
20
|
+
if (existing !== void 0) return existing;
|
|
21
|
+
const created = createDispatchJob(captureDispatchDeps(options, retries));
|
|
22
|
+
dispatches.set(retries, created);
|
|
23
|
+
return created;
|
|
24
|
+
};
|
|
25
|
+
dispatchFor(fallbackRetries);
|
|
26
|
+
return {
|
|
27
|
+
accepts: isValidCaptureJob,
|
|
28
|
+
run: async (job, context) => {
|
|
29
|
+
await dispatchFor(retriesOf(job, fallbackRetries))(toDispatchJob(job), { touch: () => {
|
|
30
|
+
context.touch();
|
|
31
|
+
} });
|
|
32
|
+
},
|
|
33
|
+
cancel: async (job) => {
|
|
34
|
+
await options.runner.cancel(job.buildId, job.shard);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function toDispatchJob(job) {
|
|
39
|
+
return {
|
|
40
|
+
buildId: job.buildId,
|
|
41
|
+
shard: job.shard,
|
|
42
|
+
attempts: job.attempts,
|
|
43
|
+
...job.reqId === void 0 ? {} : { reqId: job.reqId },
|
|
44
|
+
...job.traceparent === void 0 ? {} : { traceparent: job.traceparent }
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/** The dispatch dependencies the handler runs captures with; the host reuses them to write failures the pipeline never got to. */
|
|
48
|
+
function captureDispatchDeps(options, maxRetries) {
|
|
49
|
+
const t = options.db.tables;
|
|
50
|
+
const publicOrigin = originOf(options);
|
|
51
|
+
const jobOptions = {
|
|
52
|
+
db: options.db,
|
|
53
|
+
tables: {
|
|
54
|
+
projects: t.projects,
|
|
55
|
+
builds: t.builds,
|
|
56
|
+
buildLabels: t.buildLabels,
|
|
57
|
+
snapshots: t.snapshots,
|
|
58
|
+
baselines: t.baselines,
|
|
59
|
+
captureAttempts: t.captureAttempts,
|
|
60
|
+
captureLogs: t.captureLogs
|
|
61
|
+
},
|
|
62
|
+
storage: options.storage,
|
|
63
|
+
runner: options.runner,
|
|
64
|
+
scratchDir: options.scratchDir,
|
|
65
|
+
limits: extractionLimitsOf(resolvePublishLimits(options.config)),
|
|
66
|
+
viewports: options.viewports,
|
|
67
|
+
logger: options.logger,
|
|
68
|
+
secret: options.secret,
|
|
69
|
+
design: options.design,
|
|
70
|
+
publicOrigin,
|
|
71
|
+
shardSize: options.shardSize,
|
|
72
|
+
enqueue: options.enqueue
|
|
73
|
+
};
|
|
74
|
+
return {
|
|
75
|
+
db: options.db,
|
|
76
|
+
tables: {
|
|
77
|
+
projects: t.projects,
|
|
78
|
+
builds: t.builds,
|
|
79
|
+
buildLabels: t.buildLabels,
|
|
80
|
+
snapshots: t.snapshots,
|
|
81
|
+
captureAttempts: t.captureAttempts,
|
|
82
|
+
captureLogs: t.captureLogs
|
|
83
|
+
},
|
|
84
|
+
jobOptions,
|
|
85
|
+
buildState: options.buildState ?? inlineBuildState(options, publicOrigin),
|
|
86
|
+
logger: options.logger,
|
|
87
|
+
maxRetries
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/** Inline delivery of captured builds' states through the handler's own adapters. */
|
|
91
|
+
function inlineBuildState(options, publicOrigin) {
|
|
92
|
+
return createBuildStatePublisher({ deps: {
|
|
93
|
+
db: options.db,
|
|
94
|
+
storage: options.storage,
|
|
95
|
+
notifiers: options.notifiers ?? [],
|
|
96
|
+
secret: options.secret,
|
|
97
|
+
config: options.config ?? {},
|
|
98
|
+
publicOrigin,
|
|
99
|
+
flags: () => ({
|
|
100
|
+
testing: true,
|
|
101
|
+
review: false
|
|
102
|
+
}),
|
|
103
|
+
logger: options.logger
|
|
104
|
+
} });
|
|
105
|
+
}
|
|
106
|
+
/** The host's origin resolver, else one built from the database and `config.publicBaseUrl`. */
|
|
107
|
+
function originOf(options) {
|
|
108
|
+
if (options.publicOrigin !== void 0) return options.publicOrigin;
|
|
109
|
+
const resolver = createPublicOriginResolver({
|
|
110
|
+
db: options.db,
|
|
111
|
+
config: options.config
|
|
112
|
+
});
|
|
113
|
+
return async () => await resolver.url();
|
|
114
|
+
}
|
|
115
|
+
export { captureDispatchDeps, createCaptureHandler, originOf };
|
|
116
|
+
|
|
117
|
+
//# sourceMappingURL=capture-handler.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-handler.mjs","names":[],"sources":["../../../src/capture/consumer/capture-handler.ts"],"sourcesContent":["/** The `capture` kind's handler: builds the existing core dispatch from the host's adapters. */\nimport type { CaptureRunner } from \"../../adapters/capture-runner.ts\";\nimport type { DatabaseAdapter } from \"../../adapters/database.ts\";\nimport type { DesignProvider } from \"../../adapters/design.ts\";\nimport type { NotifierProvider } from \"../../adapters/notifier/provider.ts\";\nimport type { StorageAdapter } from \"../../adapters/storage.ts\";\nimport type { ShelfConfig } from \"../../config.ts\";\nimport type { Logger } from \"../../logger.ts\";\nimport { createPublicOriginResolver } from \"../../models/public-origin.ts\";\nimport type { SecretInput } from \"../../utils/encrypt.ts\";\nimport { createBuildStatePublisher } from \"../build-state/publisher.ts\";\nimport type { BuildStatePublisher } from \"../build-state/types.ts\";\nimport { createDispatchJob, type CaptureDispatchJob, type DispatchDeps } from \"../dispatch.ts\";\nimport type { CaptureJobOptions, ShardJob } from \"../orchestrator.ts\";\nimport { extractionLimitsOf, resolvePublishLimits } from \"../publish/limits.ts\";\nimport { DEFAULT_MAX_RETRIES, retriesOf } from \"./retry.ts\";\nimport type { ConsumerJob, KindHandler } from \"./types.ts\";\n\n/** What the capture handler needs: the same adapters the server's own capture setup uses. */\nexport interface CaptureHandlerOptions {\n /** Database adapter; its own `tables` are used (never a dialect's defaults). */\n db: DatabaseAdapter;\n storage: StorageAdapter;\n /** Pure renderer; `cancel` is called when a job's lease is lost or the job is cancelled. */\n runner: CaptureRunner;\n /** Scratch directory for Storybook extraction. */\n scratchDir: string;\n logger: Logger;\n /** Puts a shard job on the queue; sharding needs it. Defaults to the consumed queue's `enqueue`. */\n enqueue: (job: ShardJob) => Promise<void>;\n /** Notifier providers; `state` channels (git hosts) get the build statuses. */\n notifiers?: NotifierProvider[];\n /**\n * Shows a build's state on its git channels at every transition. Default: deliver inline through\n * `notifiers` (a capture always has `testing` on); the app passes its queue-backed publisher.\n */\n buildState?: BuildStatePublisher;\n /** Links in statuses are absolute from `publicBaseUrl`; published Storybooks use `publishedBaseDomain`. */\n config?: Pick<\n ShelfConfig,\n \"publicBaseUrl\" | \"publishedBaseDomain\" | \"maxZipEntries\" | \"maxUnzippedBytes\"\n >;\n /**\n * The resolved public origin (ADR 0007, decision 6): status links and URL-reaching targets use it.\n * Default: `config.publicBaseUrl`, then the platform's address, then the origin an admin stored.\n */\n publicOrigin?: () => Promise<string | undefined>;\n /** Design providers validating declared design links during capture. */\n design?: DesignProvider[];\n /** Server secret for webhook decryption. */\n secret?: SecretInput;\n viewports?: CaptureJobOptions[\"viewports\"];\n /** Captures per shard; unset keeps every build in one job. */\n shardSize?: number;\n /** Retries assumed for jobs that do not state `maxAttempts` (default 2). */\n maxRetries?: number;\n}\n\n/** Whether a polled capture job carries the minimum shape to execute. */\nfunction isValidCaptureJob(job: ConsumerJob): boolean {\n return typeof job.buildId === \"string\" && job.buildId.length > 0;\n}\n\n/** The `capture` handler: runs `createDispatchJob`'s runner, cancels through `runner.cancel`. */\nexport function createCaptureHandler(options: CaptureHandlerOptions): KindHandler {\n const fallbackRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n // The shard rule (\"a shard's last try is its final word\") depends on the queue's retry limit,\n // which a database job states itself, so one dispatch exists per distinct limit.\n const dispatches = new Map<number, ReturnType<typeof createDispatchJob>>();\n const dispatchFor = (retries: number): ReturnType<typeof createDispatchJob> => {\n const existing = dispatches.get(retries);\n if (existing !== undefined) {\n return existing;\n }\n const created = createDispatchJob(captureDispatchDeps(options, retries));\n dispatches.set(retries, created);\n return created;\n };\n dispatchFor(fallbackRetries);\n return {\n accepts: isValidCaptureJob,\n run: async (job, context) => {\n await dispatchFor(retriesOf(job, fallbackRetries))(toDispatchJob(job), {\n touch: () => {\n context.touch();\n },\n });\n },\n cancel: async (job) => {\n await options.runner.cancel(job.buildId, job.shard);\n },\n };\n}\n\nfunction toDispatchJob(job: ConsumerJob): CaptureDispatchJob {\n return {\n buildId: job.buildId,\n shard: job.shard,\n attempts: job.attempts,\n ...(job.reqId === undefined ? {} : { reqId: job.reqId }),\n ...(job.traceparent === undefined ? {} : { traceparent: job.traceparent }),\n };\n}\n\n/** The dispatch dependencies the handler runs captures with; the host reuses them to write failures the pipeline never got to. */\nexport function captureDispatchDeps(\n options: CaptureHandlerOptions,\n maxRetries: number,\n): DispatchDeps {\n const t = options.db.tables;\n const publicOrigin = originOf(options);\n const jobOptions: CaptureJobOptions = {\n db: options.db,\n tables: {\n projects: t.projects,\n builds: t.builds,\n buildLabels: t.buildLabels,\n snapshots: t.snapshots,\n baselines: t.baselines,\n captureAttempts: t.captureAttempts,\n captureLogs: t.captureLogs,\n },\n storage: options.storage,\n runner: options.runner,\n scratchDir: options.scratchDir,\n limits: extractionLimitsOf(resolvePublishLimits(options.config)),\n viewports: options.viewports,\n logger: options.logger,\n secret: options.secret,\n design: options.design,\n publicOrigin,\n shardSize: options.shardSize,\n enqueue: options.enqueue,\n };\n return {\n db: options.db,\n tables: {\n projects: t.projects,\n builds: t.builds,\n buildLabels: t.buildLabels,\n snapshots: t.snapshots,\n captureAttempts: t.captureAttempts,\n captureLogs: t.captureLogs,\n },\n jobOptions,\n buildState: options.buildState ?? inlineBuildState(options, publicOrigin),\n logger: options.logger,\n maxRetries,\n };\n}\n\n/** Inline delivery of captured builds' states through the handler's own adapters. */\nfunction inlineBuildState(\n options: CaptureHandlerOptions,\n publicOrigin: () => Promise<string | undefined>,\n): BuildStatePublisher {\n return createBuildStatePublisher({\n deps: {\n db: options.db,\n storage: options.storage,\n notifiers: options.notifiers ?? [],\n secret: options.secret,\n config: options.config ?? {},\n publicOrigin,\n flags: () => ({ testing: true, review: false }),\n logger: options.logger,\n },\n });\n}\n\n/** The host's origin resolver, else one built from the database and `config.publicBaseUrl`. */\nexport function originOf(\n options: Pick<CaptureHandlerOptions, \"db\" | \"config\" | \"publicOrigin\">,\n): () => Promise<string | undefined> {\n if (options.publicOrigin !== undefined) {\n return options.publicOrigin;\n }\n const resolver = createPublicOriginResolver({ db: options.db, config: options.config });\n return async () => await resolver.url();\n}\n"],"mappings":";;;;;;;;;;AA2DA,SAAS,kBAAkB,KAA2B;CACpD,OAAO,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,SAAS;AACjE;;AAGA,SAAgB,qBAAqB,SAA6C;CAChF,MAAM,kBAAkB,QAAQ,cAAA;CAGhC,MAAM,6BAAa,IAAI,IAAkD;CACzE,MAAM,eAAe,YAA0D;EAC7E,MAAM,WAAW,WAAW,IAAI,OAAO;EACvC,IAAI,aAAa,KAAA,GACf,OAAO;EAET,MAAM,UAAU,kBAAkB,oBAAoB,SAAS,OAAO,CAAC;EACvE,WAAW,IAAI,SAAS,OAAO;EAC/B,OAAO;CACT;CACA,YAAY,eAAe;CAC3B,OAAO;EACL,SAAS;EACT,KAAK,OAAO,KAAK,YAAY;GAC3B,MAAM,YAAY,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,cAAc,GAAG,GAAG,EACrE,aAAa;IACX,QAAQ,MAAM;GAChB,EACF,CAAC;EACH;EACA,QAAQ,OAAO,QAAQ;GACrB,MAAM,QAAQ,OAAO,OAAO,IAAI,SAAS,IAAI,KAAK;EACpD;CACF;AACF;AAEA,SAAS,cAAc,KAAsC;CAC3D,OAAO;EACL,SAAS,IAAI;EACb,OAAO,IAAI;EACX,UAAU,IAAI;EACd,GAAI,IAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,IAAI,MAAM;EACtD,GAAI,IAAI,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,IAAI,YAAY;CAC1E;AACF;;AAGA,SAAgB,oBACd,SACA,YACc;CACd,MAAM,IAAI,QAAQ,GAAG;CACrB,MAAM,eAAe,SAAS,OAAO;CACrC,MAAM,aAAgC;EACpC,IAAI,QAAQ;EACZ,QAAQ;GACN,UAAU,EAAE;GACZ,QAAQ,EAAE;GACV,aAAa,EAAE;GACf,WAAW,EAAE;GACb,WAAW,EAAE;GACb,iBAAiB,EAAE;GACnB,aAAa,EAAE;EACjB;EACA,SAAS,QAAQ;EACjB,QAAQ,QAAQ;EAChB,YAAY,QAAQ;EACpB,QAAQ,mBAAmB,qBAAqB,QAAQ,MAAM,CAAC;EAC/D,WAAW,QAAQ;EACnB,QAAQ,QAAQ;EAChB,QAAQ,QAAQ;EAChB,QAAQ,QAAQ;EAChB;EACA,WAAW,QAAQ;EACnB,SAAS,QAAQ;CACnB;CACA,OAAO;EACL,IAAI,QAAQ;EACZ,QAAQ;GACN,UAAU,EAAE;GACZ,QAAQ,EAAE;GACV,aAAa,EAAE;GACf,WAAW,EAAE;GACb,iBAAiB,EAAE;GACnB,aAAa,EAAE;EACjB;EACA;EACA,YAAY,QAAQ,cAAc,iBAAiB,SAAS,YAAY;EACxE,QAAQ,QAAQ;EAChB;CACF;AACF;;AAGA,SAAS,iBACP,SACA,cACqB;CACrB,OAAO,0BAA0B,EAC/B,MAAM;EACJ,IAAI,QAAQ;EACZ,SAAS,QAAQ;EACjB,WAAW,QAAQ,aAAa,CAAC;EACjC,QAAQ,QAAQ;EAChB,QAAQ,QAAQ,UAAU,CAAC;EAC3B;EACA,cAAc;GAAE,SAAS;GAAM,QAAQ;EAAM;EAC7C,QAAQ,QAAQ;CAClB,EACF,CAAC;AACH;;AAGA,SAAgB,SACd,SACmC;CACnC,IAAI,QAAQ,iBAAiB,KAAA,GAC3B,OAAO,QAAQ;CAEjB,MAAM,WAAW,2BAA2B;EAAE,IAAI,QAAQ;EAAI,QAAQ,QAAQ;CAAO,CAAC;CACtF,OAAO,YAAY,MAAM,SAAS,IAAI;AACxC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import __tsdown_shims_path from 'node:path';
|
|
2
|
+
import __tsdown_shims_url from 'node:url';
|
|
3
|
+
/**
|
|
4
|
+
* Idle backoff for queues whose `poll()` returns immediately when empty (GCP Pub/Sub synchronous
|
|
5
|
+
* pull, Azure Storage Queues). Queues that long-poll (SQS, Redis, Service Bus, the IPC queue) block
|
|
6
|
+
* inside `poll()` and never trigger it. The database queue paces itself (`db-queue/cadence.ts`).
|
|
7
|
+
*/
|
|
8
|
+
/** An empty poll that returns faster than this did not long-poll. */
|
|
9
|
+
declare const MIN_BLOCKING_POLL_MS = 1000;
|
|
10
|
+
/** Sleep for consecutive fast empty polls: 250ms doubling up to 5s. */
|
|
11
|
+
declare function idleDelayMs(emptyStreak: number): number;
|
|
12
|
+
/** Whether an empty poll came back too fast to have blocked on the queue. */
|
|
13
|
+
declare function isFastEmptyPoll(elapsedMs: number): boolean;
|
|
14
|
+
export { MIN_BLOCKING_POLL_MS, idleDelayMs, isFastEmptyPoll };
|
|
15
|
+
//# sourceMappingURL=idle.d.mts.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import "node:path";
|
|
2
|
+
import "node:url";
|
|
3
|
+
import.meta.url;
|
|
4
|
+
// src/capture/consumer/idle.ts
|
|
5
|
+
/**
|
|
6
|
+
* Idle backoff for queues whose `poll()` returns immediately when empty (GCP Pub/Sub synchronous
|
|
7
|
+
* pull, Azure Storage Queues). Queues that long-poll (SQS, Redis, Service Bus, the IPC queue) block
|
|
8
|
+
* inside `poll()` and never trigger it. The database queue paces itself (`db-queue/cadence.ts`).
|
|
9
|
+
*/
|
|
10
|
+
/** An empty poll that returns faster than this did not long-poll. */
|
|
11
|
+
const MIN_BLOCKING_POLL_MS = 1e3;
|
|
12
|
+
const BASE_IDLE_MS = 250;
|
|
13
|
+
const MAX_IDLE_MS = 5e3;
|
|
14
|
+
/** Sleep for consecutive fast empty polls: 250ms doubling up to 5s. */
|
|
15
|
+
function idleDelayMs(emptyStreak) {
|
|
16
|
+
return Math.min(MAX_IDLE_MS, BASE_IDLE_MS * 2 ** Math.max(0, emptyStreak - 1));
|
|
17
|
+
}
|
|
18
|
+
/** Whether an empty poll came back too fast to have blocked on the queue. */
|
|
19
|
+
function isFastEmptyPoll(elapsedMs) {
|
|
20
|
+
return elapsedMs < MIN_BLOCKING_POLL_MS;
|
|
21
|
+
}
|
|
22
|
+
export { MIN_BLOCKING_POLL_MS, idleDelayMs, isFastEmptyPoll };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=idle.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idle.mjs","names":[],"sources":["../../../src/capture/consumer/idle.ts"],"sourcesContent":["/**\n * Idle backoff for queues whose `poll()` returns immediately when empty (GCP Pub/Sub synchronous\n * pull, Azure Storage Queues). Queues that long-poll (SQS, Redis, Service Bus, the IPC queue) block\n * inside `poll()` and never trigger it. The database queue paces itself (`db-queue/cadence.ts`).\n */\n\n/** An empty poll that returns faster than this did not long-poll. */\nexport const MIN_BLOCKING_POLL_MS = 1000;\n\nconst BASE_IDLE_MS = 250;\nconst MAX_IDLE_MS = 5000;\n\n/** Sleep for consecutive fast empty polls: 250ms doubling up to 5s. */\nexport function idleDelayMs(emptyStreak: number): number {\n return Math.min(MAX_IDLE_MS, BASE_IDLE_MS * 2 ** Math.max(0, emptyStreak - 1));\n}\n\n/** Whether an empty poll came back too fast to have blocked on the queue. */\nexport function isFastEmptyPoll(elapsedMs: number): boolean {\n return elapsedMs < MIN_BLOCKING_POLL_MS;\n}\n"],"mappings":";;;;;;;;;;AAOA,MAAa,uBAAuB;AAEpC,MAAM,eAAe;AACrB,MAAM,cAAc;;AAGpB,SAAgB,YAAY,aAA6B;CACvD,OAAO,KAAK,IAAI,aAAa,eAAe,KAAK,KAAK,IAAI,GAAG,cAAc,CAAC,CAAC;AAC/E;;AAGA,SAAgB,gBAAgB,WAA4B;CAC1D,OAAO,YAAY;AACrB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import __tsdown_shims_path from 'node:path';
|
|
2
|
+
import __tsdown_shims_url from 'node:url';
|
|
3
|
+
import { CaptureHandlerOptions, captureDispatchDeps, createCaptureHandler } from "./capture-handler.mjs";
|
|
4
|
+
import { ConsumerMetrics, DEFAULT_SAMPLE_MS, JobFinishedEvent, JobOutcome, QueueSample, sampleQueue } from "./metrics.mjs";
|
|
5
|
+
import { DEFAULT_BACKOFF_MS, DEFAULT_MAX_RETRIES, DEFAULT_WAIT_TIME_SECONDS, MAX_BACKOFF_MS, RetryConfig, backoffDelayMs, isFinalAttempt } from "./retry.mjs";
|
|
6
|
+
import { CaptureConsumer, CaptureConsumerOptions, ConsumerConfig, ConsumerJob, JobHandlers, JobRunContext, KindHandler } from "./types.mjs";
|
|
7
|
+
import { MIN_BLOCKING_POLL_MS, idleDelayMs, isFastEmptyPoll } from "./idle.mjs";
|
|
8
|
+
/** Create a consumer of `options.queue`; nothing runs until `start()`. */
|
|
9
|
+
declare function createCaptureConsumer(options: CaptureConsumerOptions): CaptureConsumer;
|
|
10
|
+
export { type CaptureConsumer, type CaptureConsumerOptions, type CaptureHandlerOptions, type ConsumerConfig, type ConsumerJob, type ConsumerMetrics, DEFAULT_BACKOFF_MS, DEFAULT_MAX_RETRIES, DEFAULT_SAMPLE_MS, DEFAULT_WAIT_TIME_SECONDS, type JobFinishedEvent, type JobHandlers, type JobOutcome, type JobRunContext, type KindHandler, MAX_BACKOFF_MS, MIN_BLOCKING_POLL_MS, type QueueSample, type RetryConfig, backoffDelayMs, captureDispatchDeps, createCaptureConsumer, createCaptureHandler, idleDelayMs, isFastEmptyPoll, isFinalAttempt, sampleQueue };
|
|
11
|
+
//# sourceMappingURL=index.d.mts.map
|