@storyshelf/core 0.7.0 → 0.9.0-next-d2cc082
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/capture-queue.d.mts +0 -2
- package/dist/adapter/capture-runner.d.mts +10 -4
- package/dist/adapter/capture-runner.mjs +7 -2
- package/dist/adapter/database.d.mts +63 -3
- package/dist/adapter/database.mjs +4 -3
- package/dist/adapter/database.mjs.map +1 -1
- package/dist/adapter/design.d.mts +0 -2
- package/dist/adapter/design.mjs +1 -2
- package/dist/adapter/email-sender.d.mts +0 -2
- package/dist/adapter/metadata.d.mts +0 -2
- package/dist/adapter/oauth.d.mts +0 -2
- package/dist/adapter/setup.d.mts +0 -2
- package/dist/adapter/setup.mjs +1 -2
- package/dist/adapter/storage.d.mts +1 -3
- package/dist/adapter/webhook-events.d.mts +0 -2
- package/dist/adapter/webhook-events.mjs +12 -13
- package/dist/adapter/webhook-events.mjs.map +1 -1
- package/dist/adapters/capture-target-offers.d.mts +0 -2
- package/dist/adapters/capture-target-offers.mjs +1 -2
- package/dist/adapters/capture-target.d.mts +0 -2
- package/dist/adapters/capture-target.mjs +1 -2
- package/dist/adapters/notifier/build-comment.d.mts +0 -2
- package/dist/adapters/notifier/build-comment.mjs +1 -2
- package/dist/adapters/notifier/build-state.d.mts +0 -2
- package/dist/adapters/notifier/build-state.mjs +1 -2
- package/dist/adapters/notifier/events.d.mts +0 -2
- package/dist/adapters/notifier/events.mjs +1 -2
- package/dist/adapters/notifier/format.d.mts +0 -2
- package/dist/adapters/notifier/format.mjs +1 -2
- package/dist/adapters/notifier/provider.d.mts +0 -2
- package/dist/adapters/notifier/provider.mjs +1 -2
- package/dist/adapters/notifier/state.d.mts +0 -2
- package/dist/adapters/notifier/state.mjs +1 -2
- package/dist/adapters/notifier/types.d.mts +0 -2
- package/dist/adapters/remote-browser.d.mts +120 -31
- package/dist/adapters/remote-browser.mjs +134 -34
- package/dist/adapters/remote-browser.mjs.map +1 -1
- 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/remote-sizing.d.mts +44 -0
- package/dist/adapters/remote-sizing.mjs +53 -0
- package/dist/adapters/remote-sizing.mjs.map +1 -0
- package/dist/adapters/render-runs.d.mts +0 -2
- package/dist/adapters/render-runs.mjs +1 -2
- package/dist/adapters/setup-runner.d.mts +0 -2
- package/dist/adapters/setup-runner.mjs +1 -2
- package/dist/adapters/sources.d.mts +0 -2
- package/dist/adapters/sources.mjs +1 -2
- package/dist/adapters/validate.d.mts +0 -2
- package/dist/adapters/validate.mjs +2 -2
- package/dist/adapters/validate.mjs.map +1 -1
- package/dist/ai.d.mts +0 -2
- package/dist/ai.mjs +1 -2
- 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 +0 -2
- package/dist/capture/a11y/axe-source.mjs +1 -2
- package/dist/capture/a11y/in-page.d.mts +1 -3
- package/dist/capture/a11y/in-page.mjs +3 -4
- package/dist/capture/a11y/in-page.mjs.map +1 -1
- package/dist/capture/a11y/map.d.mts +0 -2
- package/dist/capture/a11y/map.mjs +1 -2
- package/dist/capture/a11y/options.d.mts +0 -2
- package/dist/capture/a11y/options.mjs +1 -2
- package/dist/capture/adapter.d.mts +5 -2
- package/dist/capture/adapter.mjs +1 -2
- package/dist/capture/adapter.mjs.map +1 -1
- package/dist/capture/affected.d.mts +0 -2
- package/dist/capture/affected.mjs +1 -2
- package/dist/capture/attempt-logger.mjs +1 -2
- package/dist/capture/browsers.d.mts +0 -2
- package/dist/capture/browsers.mjs +1 -2
- package/dist/capture/build-state/deliver.d.mts +0 -2
- package/dist/capture/build-state/deliver.mjs +1 -2
- package/dist/capture/build-state/notify-job.d.mts +0 -2
- package/dist/capture/build-state/notify-job.mjs +1 -2
- package/dist/capture/build-state/publisher.d.mts +0 -2
- package/dist/capture/build-state/publisher.mjs +1 -2
- package/dist/capture/build-state/resume.d.mts +0 -2
- package/dist/capture/build-state/resume.mjs +1 -2
- package/dist/capture/build-state/types.d.mts +1 -3
- package/dist/capture/catalog/catalogue.d.mts +0 -2
- package/dist/capture/catalog/catalogue.mjs +1 -2
- package/dist/capture/catalog/components.d.mts +0 -2
- package/dist/capture/catalog/components.mjs +1 -2
- package/dist/capture/catalog/history.d.mts +0 -2
- package/dist/capture/catalog/history.mjs +1 -2
- package/dist/capture/catalog/hook.d.mts +0 -2
- package/dist/capture/catalog/hook.mjs +1 -2
- package/dist/capture/catalog/index.d.mts +2 -2
- package/dist/capture/catalog/load.d.mts +0 -2
- package/dist/capture/catalog/load.mjs +1 -2
- package/dist/capture/catalog/parse.d.mts +0 -2
- package/dist/capture/catalog/parse.mjs +1 -2
- package/dist/capture/catalog/read.d.mts +6 -3
- package/dist/capture/catalog/read.mjs +14 -8
- package/dist/capture/catalog/read.mjs.map +1 -1
- package/dist/capture/catalog/types.d.mts +0 -2
- 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 +1 -3
- package/dist/capture/consumer/capture-handler.mjs +1 -2
- package/dist/capture/consumer/idle.d.mts +0 -2
- package/dist/capture/consumer/idle.mjs +1 -2
- package/dist/capture/consumer/index.d.mts +0 -2
- package/dist/capture/consumer/index.mjs +1 -2
- package/dist/capture/consumer/loop.mjs +1 -2
- package/dist/capture/consumer/metrics.d.mts +0 -2
- package/dist/capture/consumer/metrics.mjs +1 -2
- package/dist/capture/consumer/retry.d.mts +0 -2
- package/dist/capture/consumer/retry.mjs +1 -2
- package/dist/capture/consumer/run-job.mjs +1 -2
- package/dist/capture/consumer/startup.mjs +1 -2
- package/dist/capture/consumer/types.d.mts +0 -2
- package/dist/capture/crash-failure.d.mts +0 -2
- package/dist/capture/crash-failure.mjs +1 -2
- package/dist/capture/db-queue/cadence.d.mts +0 -2
- package/dist/capture/db-queue/cadence.mjs +1 -2
- package/dist/capture/db-queue/claim.d.mts +0 -2
- package/dist/capture/db-queue/claim.mjs +20 -4
- package/dist/capture/db-queue/claim.mjs.map +1 -1
- package/dist/capture/db-queue/clock.mjs +1 -2
- package/dist/capture/db-queue/codec.mjs +1 -2
- package/dist/capture/db-queue/index.d.mts +0 -2
- package/dist/capture/db-queue/index.mjs +3 -3
- package/dist/capture/db-queue/index.mjs.map +1 -1
- package/dist/capture/db-queue/keeper.d.mts +0 -2
- package/dist/capture/db-queue/keeper.mjs +1 -2
- package/dist/capture/db-queue/lease.mjs +1 -2
- package/dist/capture/db-queue/lifecycle.mjs +1 -2
- package/dist/capture/db-queue/operations.mjs +1 -2
- package/dist/capture/db-queue/poll-loop.d.mts +0 -2
- package/dist/capture/db-queue/poll-loop.mjs +1 -2
- package/dist/capture/db-queue/poll.d.mts +0 -2
- package/dist/capture/db-queue/poll.mjs +1 -2
- package/dist/capture/db-queue/timers.d.mts +0 -2
- package/dist/capture/db-queue/timers.mjs +1 -2
- package/dist/capture/db-queue/types.d.mts +0 -2
- package/dist/capture/db-queue/types.mjs +1 -2
- package/dist/capture/db-queue/types.mjs.map +1 -1
- package/dist/capture/db-queue/wake.mjs +1 -2
- package/dist/capture/design.mjs +1 -2
- package/dist/capture/diff-record.mjs +1 -2
- package/dist/capture/dispatch.d.mts +1 -3
- package/dist/capture/dispatch.mjs +17 -5
- package/dist/capture/dispatch.mjs.map +1 -1
- package/dist/capture/enrich.mjs +1 -2
- package/dist/capture/failure-sets.mjs +1 -2
- package/dist/capture/fingerprint.d.mts +19 -8
- package/dist/capture/fingerprint.mjs +43 -14
- package/dist/capture/fingerprint.mjs.map +1 -1
- package/dist/capture/forked/channel.d.mts +0 -2
- package/dist/capture/forked/child.d.mts +0 -2
- package/dist/capture/forked/child.mjs +1 -2
- package/dist/capture/forked/crash-tracker.mjs +1 -2
- package/dist/capture/forked/decision.d.mts +0 -2
- package/dist/capture/forked/decision.mjs +1 -2
- package/dist/capture/forked/exit.mjs +1 -2
- package/dist/capture/forked/fork.d.mts +0 -2
- package/dist/capture/forked/fork.mjs +1 -2
- package/dist/capture/forked/forked-capture.d.mts +0 -2
- package/dist/capture/forked/forked-capture.mjs +1 -2
- package/dist/capture/forked/lease-book.mjs +1 -2
- package/dist/capture/forked/protocol.d.mts +0 -2
- package/dist/capture/forked/protocol.mjs +1 -2
- package/dist/capture/forked/runs.mjs +1 -2
- 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 +1 -2
- package/dist/capture/job-lease.d.mts +0 -2
- package/dist/capture/job-lease.mjs +1 -2
- package/dist/capture/matrix.mjs +4 -4
- package/dist/capture/matrix.mjs.map +1 -1
- package/dist/capture/modes.d.mts +0 -2
- package/dist/capture/modes.mjs +2 -3
- package/dist/capture/modes.mjs.map +1 -1
- package/dist/capture/orchestrator.d.mts +0 -2
- package/dist/capture/orchestrator.mjs +2 -3
- package/dist/capture/pipeline.d.mts +0 -2
- package/dist/capture/pipeline.mjs +44 -10
- package/dist/capture/pipeline.mjs.map +1 -1
- package/dist/capture/progress.d.mts +0 -2
- package/dist/capture/progress.mjs +1 -2
- package/dist/capture/publish/accept.d.mts +0 -2
- package/dist/capture/publish/accept.mjs +1 -2
- package/dist/capture/publish/complete.d.mts +1 -3
- package/dist/capture/publish/complete.mjs +1 -2
- package/dist/capture/publish/extract.d.mts +0 -2
- package/dist/capture/publish/extract.mjs +6 -5
- package/dist/capture/publish/extract.mjs.map +1 -1
- package/dist/capture/publish/handler.d.mts +1 -3
- package/dist/capture/publish/handler.mjs +1 -2
- package/dist/capture/publish/index.d.mts +2 -1
- 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 +0 -2
- package/dist/capture/publish/limits.mjs +1 -2
- package/dist/capture/publish/published.d.mts +0 -2
- package/dist/capture/publish/published.mjs +1 -2
- package/dist/capture/publish/run.d.mts +1 -3
- package/dist/capture/publish/run.mjs +1 -2
- package/dist/capture/rediff.d.mts +1 -3
- package/dist/capture/rediff.mjs +19 -6
- package/dist/capture/rediff.mjs.map +1 -1
- package/dist/capture/render.mjs +1 -2
- package/dist/capture/render.mjs.map +1 -1
- package/dist/capture/scratch.d.mts +0 -2
- package/dist/capture/scratch.mjs +2 -4
- package/dist/capture/scratch.mjs.map +1 -1
- package/dist/capture/shard-plan.mjs +1 -2
- package/dist/capture/shards/context.mjs +3 -3
- package/dist/capture/shards/context.mjs.map +1 -1
- package/dist/capture/shards/execute.mjs +4 -3
- package/dist/capture/shards/execute.mjs.map +1 -1
- package/dist/capture/shards/fan-out.mjs +1 -2
- package/dist/capture/shards/history.mjs +1 -2
- package/dist/capture/shards/reduce.mjs +1 -2
- package/dist/capture/sizing.d.mts +0 -2
- package/dist/capture/sizing.mjs +1 -2
- package/dist/capture/skip-checks.mjs +1 -2
- package/dist/capture/statics.d.mts +0 -2
- package/dist/capture/statics.mjs +2 -4
- package/dist/capture/statics.mjs.map +1 -1
- package/dist/capture/storybook-urls.d.mts +0 -2
- package/dist/capture/storybook-urls.mjs +3 -3
- package/dist/capture/storybook-urls.mjs.map +1 -1
- package/dist/capture/storybook.d.mts +0 -2
- package/dist/capture/storybook.mjs +8 -4
- package/dist/capture/storybook.mjs.map +1 -1
- package/dist/capture/target.mjs +1 -2
- package/dist/capture/targets.d.mts +0 -2
- package/dist/capture/targets.mjs +1 -2
- package/dist/capture/tests.d.mts +0 -2
- package/dist/capture/tests.mjs +13 -3
- package/dist/capture/tests.mjs.map +1 -1
- package/dist/capture/token-chunks.mjs +24 -7
- package/dist/capture/token-chunks.mjs.map +1 -1
- package/dist/capture.d.mts +5 -2
- package/dist/capture.mjs +5 -2
- package/dist/config.d.mts +16 -3
- package/dist/config.mjs +6 -3
- package/dist/config.mjs.map +1 -1
- package/dist/diff.d.mts +0 -2
- package/dist/diff.mjs +1 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/insights/budget.d.mts +0 -2
- package/dist/insights/budget.mjs +1 -2
- package/dist/insights/envelope.d.mts +0 -2
- package/dist/insights/envelope.mjs +1 -2
- package/dist/insights/evidence-health.d.mts +0 -2
- package/dist/insights/evidence-health.mjs +1 -2
- package/dist/insights/evidence.d.mts +0 -2
- package/dist/insights/evidence.mjs +1 -2
- package/dist/insights/hash.d.mts +0 -2
- package/dist/insights/hash.mjs +1 -2
- package/dist/insights/limits.d.mts +0 -2
- package/dist/insights/limits.mjs +1 -2
- package/dist/insights/prompts/v1.d.mts +0 -2
- package/dist/insights/prompts/v1.mjs +1 -2
- package/dist/insights/redact.d.mts +0 -2
- package/dist/insights/redact.mjs +1 -2
- package/dist/insights/text.mjs +1 -2
- package/dist/logger.d.mts +0 -2
- package/dist/logger.mjs +1 -2
- package/dist/models/ai-budget-alert.d.mts +0 -2
- package/dist/models/ai-budget-alert.mjs +1 -2
- package/dist/models/ai-usage.d.mts +0 -2
- package/dist/models/ai-usage.mjs +1 -2
- 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 +0 -2
- package/dist/models/baseline-archive.mjs +1 -2
- 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 +0 -2
- package/dist/models/baseline-export.mjs +1 -2
- package/dist/models/baseline-import.mjs +1 -2
- 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 +1 -2
- package/dist/models/baseline-transfer.mjs +30 -2
- package/dist/models/baseline-transfer.mjs.map +1 -1
- package/dist/models/baseline.d.mts +5 -2
- package/dist/models/baseline.mjs +91 -12
- package/dist/models/baseline.mjs.map +1 -1
- package/dist/models/build-component.d.mts +0 -2
- package/dist/models/build-component.mjs +1 -2
- package/dist/models/build-review-status.d.mts +0 -2
- package/dist/models/build-review-status.mjs +1 -2
- package/dist/models/build-review.d.mts +0 -2
- package/dist/models/build-review.mjs +1 -2
- package/dist/models/build.d.mts +1 -3
- package/dist/models/build.mjs +14 -15
- package/dist/models/build.mjs.map +1 -1
- package/dist/models/capture-attempt.d.mts +0 -2
- package/dist/models/capture-attempt.mjs +1 -2
- package/dist/models/capture-job.d.mts +0 -2
- package/dist/models/capture-job.mjs +1 -2
- package/dist/models/capture-log.d.mts +0 -2
- package/dist/models/capture-log.mjs +1 -2
- package/dist/models/capture-shard.d.mts +0 -2
- package/dist/models/capture-shard.mjs +1 -2
- package/dist/models/changeset.d.mts +0 -2
- package/dist/models/changeset.mjs +1 -2
- package/dist/models/columns.mjs +1 -2
- package/dist/models/comment.d.mts +0 -2
- package/dist/models/comment.mjs +1 -2
- package/dist/models/component.d.mts +0 -2
- package/dist/models/component.mjs +1 -2
- package/dist/models/connections.d.mts +0 -2
- package/dist/models/connections.mjs +1 -2
- package/dist/models/content-ref.d.mts +0 -2
- package/dist/models/content-ref.mjs +1 -2
- package/dist/models/credentials.d.mts +0 -2
- package/dist/models/credentials.mjs +1 -2
- package/dist/models/design-credentials.d.mts +0 -2
- package/dist/models/design-credentials.mjs +1 -2
- package/dist/models/design-health.d.mts +16 -3
- package/dist/models/design-health.mjs +21 -3
- package/dist/models/design-health.mjs.map +1 -1
- package/dist/models/design-nodes.d.mts +11 -4
- package/dist/models/design-nodes.mjs +18 -3
- package/dist/models/design-nodes.mjs.map +1 -1
- package/dist/models/design-renders.mjs +1 -2
- package/dist/models/design-resolve.d.mts +0 -2
- package/dist/models/design-resolve.mjs +1 -2
- package/dist/models/design.d.mts +0 -2
- package/dist/models/design.mjs +1 -2
- package/dist/models/inherited-ratio.d.mts +0 -2
- package/dist/models/inherited-ratio.mjs +1 -2
- package/dist/models/insight.d.mts +0 -2
- package/dist/models/insight.mjs +1 -2
- package/dist/models/label.d.mts +0 -2
- package/dist/models/label.mjs +1 -2
- package/dist/models/member.d.mts +0 -2
- package/dist/models/member.mjs +1 -2
- package/dist/models/notification-channel.d.mts +0 -2
- package/dist/models/notification-channel.mjs +1 -2
- package/dist/models/notification-subscription.d.mts +0 -2
- package/dist/models/notification-subscription.mjs +1 -2
- package/dist/models/project-group-mapping.d.mts +0 -2
- package/dist/models/project-group-mapping.mjs +1 -2
- package/dist/models/project.d.mts +0 -2
- package/dist/models/project.mjs +1 -2
- package/dist/models/public-origin.d.mts +0 -2
- package/dist/models/public-origin.mjs +1 -2
- package/dist/models/review-switch-off.d.mts +0 -2
- package/dist/models/review-switch-off.mjs +1 -2
- package/dist/models/site-settings.d.mts +0 -2
- package/dist/models/site-settings.mjs +1 -2
- package/dist/models/snapshot.d.mts +3 -2
- package/dist/models/snapshot.mjs +4 -2
- package/dist/models/snapshot.mjs.map +1 -1
- package/dist/models/token.d.mts +0 -2
- package/dist/models/token.mjs +1 -2
- package/dist/models/usage.d.mts +0 -2
- package/dist/models/usage.mjs +1 -2
- package/dist/models/user.d.mts +0 -2
- package/dist/models/user.mjs +1 -2
- package/dist/models/webhook.d.mts +0 -2
- package/dist/models/webhook.mjs +1 -2
- package/dist/models.d.mts +6 -3
- package/dist/models.mjs +6 -3
- package/dist/options.d.mts +0 -2
- package/dist/options.mjs +2 -4
- package/dist/options.mjs.map +1 -1
- package/dist/paths.d.mts +3 -3
- package/dist/paths.mjs +7 -3
- package/dist/paths.mjs.map +1 -1
- package/dist/retention/ai.d.mts +1 -3
- package/dist/retention/ai.mjs +0 -1
- package/dist/retention/pending.mjs +1 -2
- 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 +0 -2
- package/dist/retention/screenshot-sweep.mjs +1 -2
- package/dist/retention.d.mts +0 -2
- package/dist/retention.mjs +5 -2
- package/dist/retention.mjs.map +1 -1
- package/dist/schema/baseline.d.mts +2 -2
- package/dist/schema/build-component.d.mts +0 -2
- package/dist/schema/build-review.d.mts +0 -2
- package/dist/schema/build.d.mts +0 -2
- package/dist/schema/capture-attempt.d.mts +0 -2
- package/dist/schema/capture-job.d.mts +0 -2
- package/dist/schema/capture-shard.d.mts +0 -2
- package/dist/schema/comment.d.mts +0 -2
- package/dist/schema/connection.d.mts +0 -2
- package/dist/schema/content-ref.d.mts +0 -2
- package/dist/schema/design.d.mts +2 -2
- package/dist/schema/insight.d.mts +0 -2
- package/dist/schema/label.d.mts +0 -2
- package/dist/schema/member.d.mts +0 -2
- package/dist/schema/notification.d.mts +0 -2
- package/dist/schema/project-group-mapping.d.mts +0 -2
- package/dist/schema/project.d.mts +0 -2
- package/dist/schema/site-setting.d.mts +0 -2
- package/dist/schema/snapshot.d.mts +5 -2
- package/dist/schema/token.d.mts +0 -2
- package/dist/schema/usage.d.mts +0 -2
- package/dist/schema/user.d.mts +0 -2
- package/dist/schema/webhook.d.mts +0 -2
- package/dist/schema.d.mts +4 -6
- package/dist/serverless.d.mts +0 -2
- package/dist/serverless.mjs +1 -2
- 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 +0 -2
- 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 +0 -2
- package/dist/test-helpers/deferred.mjs +1 -2
- package/dist/test-helpers/design-contract.d.mts +0 -2
- package/dist/test-helpers/design-contract.mjs +1 -2
- 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 +7 -2
- package/dist/test-helpers/fake-database.mjs.map +1 -1
- package/dist/test-helpers/fake-design.d.mts +0 -2
- package/dist/test-helpers/fake-design.mjs +1 -2
- package/dist/test-helpers/fake-notifier.d.mts +0 -2
- package/dist/test-helpers/fake-notifier.mjs +1 -2
- 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 +6 -2
- package/dist/test-helpers/fake-tables.mjs.map +1 -1
- package/dist/test-helpers/manual-clock.d.mts +0 -2
- package/dist/test-helpers/manual-clock.mjs +1 -2
- package/dist/test-helpers/notifier-contract.d.mts +0 -2
- package/dist/test-helpers/notifier-contract.mjs +1 -2
- package/dist/test-helpers/queue-contract.d.mts +0 -2
- package/dist/test-helpers/queue-contract.mjs +1 -2
- package/dist/test-helpers/queue-multi-instance.d.mts +0 -2
- package/dist/test-helpers/queue-multi-instance.mjs +1 -2
- package/dist/test-helpers/runner-contract.d.mts +0 -2
- package/dist/test-helpers/runner-contract.mjs +1 -2
- package/dist/test-helpers/sql-chunks.mjs +2 -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 +1 -2
- package/dist/test-helpers.d.mts +2 -1
- package/dist/test-helpers.mjs +2 -1
- package/dist/tracing.mjs +36 -6
- package/dist/tracing.mjs.map +1 -1
- package/dist/types.d.mts +0 -2
- package/dist/types.mjs +1 -2
- package/dist/urls.d.mts +0 -2
- package/dist/urls.mjs +1 -2
- package/dist/utils/adaptive-concurrency.d.mts +0 -2
- package/dist/utils/adaptive-concurrency.mjs +1 -2
- package/dist/utils/connect-retry.d.mts +2 -2
- package/dist/utils/connect-retry.mjs +2 -3
- package/dist/utils/connect-retry.mjs.map +1 -1
- package/dist/utils/encrypt.d.mts +0 -2
- package/dist/utils/encrypt.mjs +1 -2
- package/dist/utils/environment.d.mts +0 -2
- package/dist/utils/environment.mjs +1 -2
- package/dist/utils/hash.d.mts +0 -2
- package/dist/utils/hash.mjs +1 -2
- package/dist/utils/http.d.mts +13 -3
- package/dist/utils/http.mjs +79 -17
- package/dist/utils/http.mjs.map +1 -1
- package/dist/utils/map-adaptive.d.mts +0 -2
- package/dist/utils/map-adaptive.mjs +1 -2
- package/dist/utils/map-limit.d.mts +0 -2
- package/dist/utils/map-limit.mjs +1 -2
- package/dist/utils/mime.d.mts +0 -2
- package/dist/utils/mime.mjs +1 -2
- package/dist/utils/page-limiter.d.mts +0 -2
- package/dist/utils/page-limiter.mjs +1 -2
- 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 +0 -2
- package/dist/utils/public-origin.mjs +1 -2
- package/dist/utils/redact.d.mts +0 -2
- package/dist/utils/redact.mjs +1 -2
- package/dist/utils/remote-environment.d.mts +40 -3
- package/dist/utils/remote-environment.mjs +52 -3
- package/dist/utils/remote-environment.mjs.map +1 -1
- package/dist/utils/resources.d.mts +0 -2
- package/dist/utils/resources.mjs +1 -2
- package/dist/utils/screenshot-store.d.mts +0 -2
- package/dist/utils/screenshot-store.mjs +1 -2
- package/dist/utils/session-gate.d.mts +7 -6
- package/dist/utils/session-gate.mjs +28 -12
- package/dist/utils/session-gate.mjs.map +1 -1
- package/dist/utils/storybook-token.d.mts +11 -3
- package/dist/utils/storybook-token.mjs +10 -9
- package/dist/utils/storybook-token.mjs.map +1 -1
- package/dist/utils/storybook-url.d.mts +0 -2
- package/dist/utils/storybook-url.mjs +1 -2
- package/dist/utils/timing.d.mts +0 -2
- package/dist/utils/timing.mjs +1 -2
- package/dist/utils/ulid.d.mts +0 -2
- package/dist/utils/ulid.mjs +1 -2
- package/dist/utils/zip-read.mjs +1 -2
- package/dist/utils/zip-write.d.mts +0 -2
- package/dist/utils/zip-write.mjs +1 -2
- package/dist/utils.d.mts +5 -5
- package/dist/utils.mjs +5 -5
- package/package.json +6 -15
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import __tsdown_shims_path from 'node:path';
|
|
2
2
|
import __tsdown_shims_url from 'node:url';
|
|
3
3
|
import { Adapter } from "./metadata.mjs";
|
|
4
|
-
//#region src/adapters/capture-queue.d.ts
|
|
5
4
|
/** Lifecycle status of a queued capture job. */
|
|
6
5
|
type JobStatus = "queued" | "running" | "completed" | "failed" | "cancelled";
|
|
7
6
|
/** Observable state of a single capture queue entry. */
|
|
@@ -116,6 +115,5 @@ interface PollableCaptureQueue extends CaptureQueue {
|
|
|
116
115
|
*/
|
|
117
116
|
inspect?(job: PollableJob): Promise<LeaseRenewal>;
|
|
118
117
|
}
|
|
119
|
-
//#endregion
|
|
120
118
|
export { CaptureJob, CaptureQueue, JobStatus, LeaseRenewal, PollableCaptureQueue, PollableJob, QueueEntry };
|
|
121
119
|
//# sourceMappingURL=capture-queue.d.mts.map
|
|
@@ -3,12 +3,17 @@ import __tsdown_shims_url from 'node:url';
|
|
|
3
3
|
import { StoryEntry, StoryParameters, StorySourceAdapter, Viewport } from "../capture/adapter.mjs";
|
|
4
4
|
import { BROWSER_NAMES, BrowserName, CaptureTarget, DEFAULT_BROWSER, ParsedTarget, RunnerTarget, TARGET_NAME_PATTERN, TargetLaunchError, TargetReach, TargetStatus, engineOf, isBrowserName, isCaptureTarget, parseTarget, tryParseTarget, unavailableReason } from "../adapters/capture-target.mjs";
|
|
5
5
|
import { TargetOffers, createTargetOffers } from "../adapters/capture-target-offers.mjs";
|
|
6
|
-
import { RemoteBrowser, RemoteConnection, RemoteOptions, RemoteProtocol, RemoteSupport, RemoteTarget, defineRemote,
|
|
6
|
+
import { RemoteBrowser, RemoteConnectContext, RemoteConnection, RemoteLeaseOutcome, RemoteLeasedConnection, RemoteOptions, RemoteProtocol, RemotePurpose, RemoteReleaseInfo, RemoteSupport, RemoteTarget, defineRemote, hasSchemeFor, isRemoteBrowser, remoteTargetsOf, scrubConnection } from "../adapters/remote-browser.mjs";
|
|
7
|
+
import { HeldConnection } from "../adapters/remote-lease-held.mjs";
|
|
8
|
+
import { RemoteConnectError, RemoteConnectErrorOptions } from "../adapters/remote-lease-error.mjs";
|
|
9
|
+
import { onRemoteShutdown, shutdownRemote } from "../adapters/remote-lease-shutdown.mjs";
|
|
10
|
+
import { ConnectLeasedContext, ConnectLeasedOptions, connectLeased } from "../adapters/remote-lease.mjs";
|
|
11
|
+
import { RemoteSizing, UNVERIFIED_NOTE, logRemoteSizing, remoteSizingOf } from "../adapters/remote-sizing.mjs";
|
|
12
|
+
import { PoolLease, RefCounted, RefCountedOptions, refCounted } from "../adapters/remote-pool.mjs";
|
|
7
13
|
import { RenderRuns } from "../adapters/render-runs.mjs";
|
|
8
14
|
import { Adapter } from "./metadata.mjs";
|
|
9
15
|
import { JobStatus } from "./capture-queue.mjs";
|
|
10
16
|
import { Logger } from "pino";
|
|
11
|
-
//#region src/adapters/capture-runner.d.ts
|
|
12
17
|
/**
|
|
13
18
|
* The rendering environment a runner captured in. Two captures with the same environment (and
|
|
14
19
|
* engine and viewport) should produce identical pixels; a different one explains a visual diff
|
|
@@ -119,6 +124,8 @@ interface CaptureRunner extends Adapter<{
|
|
|
119
124
|
* build (its shards) can be in flight in one process. Absent, the build id is used.
|
|
120
125
|
*/
|
|
121
126
|
runId?: string | undefined;
|
|
127
|
+
/** The shard's 1-based position in the build's plan, for a remote service that routes per shard. */
|
|
128
|
+
shardIndex?: number | undefined;
|
|
122
129
|
/** Root of the already-extracted Storybook build. */
|
|
123
130
|
storybookDir: string;
|
|
124
131
|
/** Stories to render. */
|
|
@@ -202,6 +209,5 @@ interface CaptureRunner extends Adapter<{
|
|
|
202
209
|
*/
|
|
203
210
|
cancel(buildId: string, runId?: string): Promise<void>;
|
|
204
211
|
}
|
|
205
|
-
|
|
206
|
-
export { BROWSER_NAMES, type BrowserName, CaptureEnvironment, CaptureRunner, type CaptureTarget, DEFAULT_BROWSER, type JobStatus, type ParsedTarget, type RemoteBrowser, type RemoteConnection, type RemoteOptions, type RemoteProtocol, type RemoteSupport, type RemoteTarget, RenderFailure, RenderResult, RenderRuns, RenderedSnapshot, type RunnerTarget, type StoryEntry, type StorySourceAdapter, TARGET_NAME_PATTERN, TargetLaunchError, type TargetOffers, type TargetReach, type TargetStatus, TestOutcome, type Viewport, createTargetOffers, defineRemote, engineOf, isBrowserName, isCaptureTarget, isRemoteBrowser, parseTarget, reachOf, remoteTargetsOf, scrubConnection, tryParseTarget, unavailableReason };
|
|
212
|
+
export { BROWSER_NAMES, type BrowserName, CaptureEnvironment, CaptureRunner, type CaptureTarget, type ConnectLeasedContext, type ConnectLeasedOptions, DEFAULT_BROWSER, type HeldConnection, type JobStatus, type ParsedTarget, type PoolLease, type RefCounted, type RefCountedOptions, type RemoteBrowser, type RemoteConnectContext, RemoteConnectError, type RemoteConnectErrorOptions, type RemoteConnection, type RemoteLeaseOutcome, type RemoteLeasedConnection, type RemoteOptions, type RemoteProtocol, type RemotePurpose, type RemoteReleaseInfo, type RemoteSizing, type RemoteSupport, type RemoteTarget, RenderFailure, RenderResult, RenderRuns, RenderedSnapshot, type RunnerTarget, type StoryEntry, type StorySourceAdapter, TARGET_NAME_PATTERN, TargetLaunchError, type TargetOffers, type TargetReach, type TargetStatus, TestOutcome, UNVERIFIED_NOTE, type Viewport, connectLeased, createTargetOffers, defineRemote, engineOf, hasSchemeFor, isBrowserName, isCaptureTarget, isRemoteBrowser, logRemoteSizing, onRemoteShutdown, parseTarget, refCounted, remoteSizingOf, remoteTargetsOf, scrubConnection, shutdownRemote, tryParseTarget, unavailableReason };
|
|
207
213
|
//# sourceMappingURL=capture-runner.d.mts.map
|
|
@@ -3,6 +3,11 @@ import "node:url";
|
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { BROWSER_NAMES, DEFAULT_BROWSER, TARGET_NAME_PATTERN, TargetLaunchError, engineOf, isBrowserName, isCaptureTarget, parseTarget, tryParseTarget, unavailableReason } from "../adapters/capture-target.mjs";
|
|
5
5
|
import { createTargetOffers } from "../adapters/capture-target-offers.mjs";
|
|
6
|
-
import { defineRemote,
|
|
6
|
+
import { defineRemote, hasSchemeFor, isRemoteBrowser, remoteTargetsOf, scrubConnection } from "../adapters/remote-browser.mjs";
|
|
7
|
+
import { RemoteConnectError } from "../adapters/remote-lease-error.mjs";
|
|
8
|
+
import { onRemoteShutdown, shutdownRemote } from "../adapters/remote-lease-shutdown.mjs";
|
|
9
|
+
import { connectLeased } from "../adapters/remote-lease.mjs";
|
|
10
|
+
import { UNVERIFIED_NOTE, logRemoteSizing, remoteSizingOf } from "../adapters/remote-sizing.mjs";
|
|
11
|
+
import { refCounted } from "../adapters/remote-pool.mjs";
|
|
7
12
|
import { RenderRuns } from "../adapters/render-runs.mjs";
|
|
8
|
-
export { BROWSER_NAMES, DEFAULT_BROWSER, RenderRuns, TARGET_NAME_PATTERN, TargetLaunchError, createTargetOffers, defineRemote, engineOf, isBrowserName, isCaptureTarget, isRemoteBrowser, parseTarget,
|
|
13
|
+
export { BROWSER_NAMES, DEFAULT_BROWSER, RemoteConnectError, RenderRuns, TARGET_NAME_PATTERN, TargetLaunchError, UNVERIFIED_NOTE, connectLeased, createTargetOffers, defineRemote, engineOf, hasSchemeFor, isBrowserName, isCaptureTarget, isRemoteBrowser, logRemoteSizing, onRemoteShutdown, parseTarget, refCounted, remoteSizingOf, remoteTargetsOf, scrubConnection, shutdownRemote, tryParseTarget, unavailableReason };
|
|
@@ -2,7 +2,8 @@ import __tsdown_shims_path from 'node:path';
|
|
|
2
2
|
import __tsdown_shims_url from 'node:url';
|
|
3
3
|
import { Adapter, AdapterMetadata } from "./metadata.mjs";
|
|
4
4
|
import { SQL, Table } from "drizzle-orm";
|
|
5
|
-
|
|
5
|
+
/** A fenced reference write lost its generation race and should be retried. */
|
|
6
|
+
declare class ReferenceGenerationConflict extends Error {}
|
|
6
7
|
/** Type-safe table map enforced on every DatabaseAdapter. */
|
|
7
8
|
interface Tables {
|
|
8
9
|
projects: Table;
|
|
@@ -74,6 +75,57 @@ interface TxStore {
|
|
|
74
75
|
/** Count rows matching an optional where condition. */
|
|
75
76
|
count(table: Table, where?: SQL): Promise<number>;
|
|
76
77
|
}
|
|
78
|
+
/** An owner of durable protection for a build. Historical comparisons are not build owners. */
|
|
79
|
+
interface BuildReferenceOwner {
|
|
80
|
+
type: "baseline" | "investigation";
|
|
81
|
+
id: string;
|
|
82
|
+
projectId: string;
|
|
83
|
+
}
|
|
84
|
+
/** One owner's complete new reference set for an atomic multi-owner mutation. */
|
|
85
|
+
interface BuildReferenceChange {
|
|
86
|
+
owner: BuildReferenceOwner;
|
|
87
|
+
buildIds: readonly string[];
|
|
88
|
+
}
|
|
89
|
+
/** A complete owner reference replacement guarded by its last observed generation. */
|
|
90
|
+
interface FencedBuildReferenceChange extends BuildReferenceChange {
|
|
91
|
+
expectedGeneration: number;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* An explicit database capability; an ordinary transaction does not establish this contract.
|
|
95
|
+
* Implementations serialize admissions, reference changes, and deletion claims across processes.
|
|
96
|
+
* Their tests must use independent connections, including promotion/purge and pin/purge races.
|
|
97
|
+
*/
|
|
98
|
+
interface BuildReferenceLifecycle {
|
|
99
|
+
/** Return the durable generation for an owner, or zero before its first reference mutation.
|
|
100
|
+
* This is a snapshot: callers must pass it to a fenced mutation, which rechecks atomically. */
|
|
101
|
+
referenceGeneration(owner: BuildReferenceOwner): Promise<number>;
|
|
102
|
+
/** Atomically fence and replace multiple owners, or roll back all owners and domain writes. */
|
|
103
|
+
replaceManyFencedReferences<T>(changes: readonly FencedBuildReferenceChange[], writeDomain: (tx: TxStore) => Promise<T>): Promise<{
|
|
104
|
+
result: T;
|
|
105
|
+
generations: number[];
|
|
106
|
+
}>;
|
|
107
|
+
/** Compare and advance an owner's durable generation with its reference and domain writes.
|
|
108
|
+
* Generation zero denotes an owner with no earlier mutations. A stale generation rejects the
|
|
109
|
+
* whole transaction. Generations survive release so an old worker cannot release a newer pin. */
|
|
110
|
+
replaceFencedReferences<T>(owner: BuildReferenceOwner, expectedGeneration: number, buildIds: readonly string[], writeDomain: (tx: TxStore) => Promise<T>): Promise<{
|
|
111
|
+
result: T;
|
|
112
|
+
generation: number;
|
|
113
|
+
}>;
|
|
114
|
+
/**
|
|
115
|
+
* Atomically replace one owner's complete reference set and make its domain writes. Both old and
|
|
116
|
+
* new builds must be locked in stable order, checked for project ownership and availability,
|
|
117
|
+
* and committed with the domain mutation. Unknown or tombstoned builds reject admission.
|
|
118
|
+
*/
|
|
119
|
+
replaceReferences<T>(owner: BuildReferenceOwner, buildIds: readonly string[], writeDomain: (tx: TxStore) => Promise<T>): Promise<T>;
|
|
120
|
+
/** Atomically replace several owners' reference sets and the shared domain writes. */
|
|
121
|
+
replaceManyReferences<T>(changes: readonly BuildReferenceChange[], writeDomain: (tx: TxStore) => Promise<T>): Promise<T>;
|
|
122
|
+
/**
|
|
123
|
+
* In the same concurrency domain as admissions, irreversibly tombstone a build only if no
|
|
124
|
+
* protecting reference remains. Existing tombstones are resumable and never become available.
|
|
125
|
+
* Storage deletion must happen after this operation commits, outside database locks.
|
|
126
|
+
*/
|
|
127
|
+
claimDeletion(projectId: string, buildId: string): Promise<"claimed" | "protected" | "deleting" | "missing">;
|
|
128
|
+
}
|
|
77
129
|
/** Database-specific metadata: the family plus what the backing platform can carry. */
|
|
78
130
|
interface DatabaseAdapterMetadata {
|
|
79
131
|
readonly category: "database";
|
|
@@ -86,12 +138,21 @@ interface DatabaseAdapterMetadata {
|
|
|
86
138
|
}
|
|
87
139
|
/** Database abstraction over Drizzle tables, agnostic of dialect and driver. */
|
|
88
140
|
interface DatabaseAdapter extends Adapter<DatabaseAdapterMetadata> {
|
|
141
|
+
/**
|
|
142
|
+
* Present only when the adapter implements the cross-process retention safety contract.
|
|
143
|
+
* `transact` by itself is not evidence of this capability.
|
|
144
|
+
*/
|
|
145
|
+
readonly buildReferenceLifecycle?: BuildReferenceLifecycle;
|
|
89
146
|
/** Table handles for this adapter's dialect, enforced with type safety. */
|
|
90
147
|
readonly tables: Tables;
|
|
91
148
|
/** Insert a row and return the inserted record. */
|
|
92
149
|
insert<T extends Table>(table: T, values: T["$inferInsert"]): Promise<T["$inferSelect"]>;
|
|
93
150
|
/** Update a row by id and return the updated record. */
|
|
94
151
|
update<T extends Table>(table: T, id: string, values: Partial<T["$inferInsert"]>): Promise<T["$inferSelect"]>;
|
|
152
|
+
/** Atomically update a row only while `where` matches; return the current row, or null if absent.
|
|
153
|
+
* Custom adapters must implement the condition in the same database statement as the update.
|
|
154
|
+
*/
|
|
155
|
+
updateWhere<T extends Table>(table: T, id: string, values: Partial<T["$inferInsert"]>, where: SQL): Promise<T["$inferSelect"] | null>;
|
|
95
156
|
/** Fetch a single row by id, or null if not found. */
|
|
96
157
|
get<T extends Table>(table: T, id: string): Promise<T["$inferSelect"] | null>;
|
|
97
158
|
/** Delete a row by id. */
|
|
@@ -118,6 +179,5 @@ interface DrizzleAdapterOptions {
|
|
|
118
179
|
/** Cheap liveness probe (e.g. `SELECT 1`); omitted when the driver has none. */
|
|
119
180
|
ping?: () => Promise<void> | void;
|
|
120
181
|
}
|
|
121
|
-
|
|
122
|
-
export { DatabaseAdapter, DatabaseAdapterMetadata, DrizzleAdapterOptions, ListOptions, MAX_LIST_LIMIT, REQUIRED_TABLE_KEYS, Tables, TxStore, clampListLimit };
|
|
182
|
+
export { BuildReferenceChange, BuildReferenceLifecycle, BuildReferenceOwner, DatabaseAdapter, DatabaseAdapterMetadata, DrizzleAdapterOptions, FencedBuildReferenceChange, ListOptions, MAX_LIST_LIMIT, REQUIRED_TABLE_KEYS, ReferenceGenerationConflict, Tables, TxStore, clampListLimit };
|
|
123
183
|
//# sourceMappingURL=database.d.mts.map
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
-
|
|
4
|
+
// src/adapters/database.ts
|
|
5
|
+
/** A fenced reference write lost its generation race and should be retried. */
|
|
6
|
+
var ReferenceGenerationConflict = class extends Error {};
|
|
5
7
|
/** Table keys every DatabaseAdapter must expose (contract + validation share this). */
|
|
6
8
|
const REQUIRED_TABLE_KEYS = [
|
|
7
9
|
"projects",
|
|
@@ -24,7 +26,6 @@ function clampListLimit(limit) {
|
|
|
24
26
|
if (!Number.isFinite(limit)) return MAX_LIST_LIMIT;
|
|
25
27
|
return Math.min(Math.max(Math.floor(limit), 1), MAX_LIST_LIMIT);
|
|
26
28
|
}
|
|
27
|
-
|
|
28
|
-
export { MAX_LIST_LIMIT, REQUIRED_TABLE_KEYS, clampListLimit };
|
|
29
|
+
export { MAX_LIST_LIMIT, REQUIRED_TABLE_KEYS, ReferenceGenerationConflict, clampListLimit };
|
|
29
30
|
|
|
30
31
|
//# sourceMappingURL=database.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.mjs","names":[],"sources":["../../src/adapters/database.ts"],"sourcesContent":["/**\n * Database adapter interface: query builders over explicitly typed tables.\n *\n * Canonical home of the database contract — {@link DatabaseAdapter},\n * {@link Tables}, {@link TxStore}, {@link ListOptions}, and\n * {@link DrizzleAdapterOptions}. Driver machinery lives in the database\n * packages (`@storyshelf/db-sqlite`, `@storyshelf/db-postgres`).\n */\nimport type { SQL } from \"drizzle-orm\";\nimport type { Table } from \"drizzle-orm\";\nimport type { Adapter, AdapterMetadata } from \"./metadata.ts\";\n\n/** Type-safe table map enforced on every DatabaseAdapter. */\nexport interface Tables {\n projects: Table;\n builds: Table;\n captureAttempts: Table;\n captureLogs: Table;\n captureShards: Table;\n captureJobs: Table;\n buildComponents: Table;\n buildReviews: Table;\n siteSettings: Table;\n snapshots: Table;\n baselines: Table;\n comments: Table;\n labelTypes: Table;\n buildLabels: Table;\n projectLinks: Table;\n designLinks: Table;\n designCredentials: Table;\n userConnections: Table;\n designNodes: Table;\n buildPackageUsage: Table;\n tokens: Table;\n webhooks: Table;\n insights: Table;\n aiUsage: Table;\n aiBudgetAlerts: Table;\n notificationChannels: Table;\n notificationSubscriptions: Table;\n users: Table;\n userInviteTokens: Table;\n projectMembers: Table;\n projectGroupMappings: Table;\n contentRefs: Table;\n}\n\n/** Table keys every DatabaseAdapter must expose (contract + validation share this). */\nexport const REQUIRED_TABLE_KEYS = [\n \"projects\",\n \"builds\",\n \"snapshots\",\n \"baselines\",\n \"comments\",\n \"labelTypes\",\n \"buildLabels\",\n \"tokens\",\n \"webhooks\",\n \"users\",\n \"projectMembers\",\n];\n\n/** Largest page any adapter serves in one list call. */\nexport const MAX_LIST_LIMIT = 1000;\n\n/** Clamp a list limit into [1, MAX_LIST_LIMIT]; undefined stays undefined. */\nexport function clampListLimit(limit?: number): number | undefined {\n if (limit === undefined) {\n return undefined;\n }\n if (!Number.isFinite(limit)) {\n return MAX_LIST_LIMIT;\n }\n return Math.min(Math.max(Math.floor(limit), 1), MAX_LIST_LIMIT);\n}\n\n/** Options that narrow and page a list query. */\nexport interface ListOptions {\n /** SQL WHERE condition. */\n where?: SQL;\n /** SQL ORDER BY condition. */\n orderBy?: SQL;\n /** Maximum number of rows to return. */\n limit?: number;\n /** Number of rows to skip. */\n offset?: number;\n}\n\n/**\n * Transactional CRUD subset available inside {@link DatabaseAdapter.transact}.\n * Mirrors the adapter surface minus metadata, lifecycle, and raw `all`\n * (opaque to transactions on some drivers).\n */\nexport interface TxStore {\n /** Insert a row and return the inserted record. */\n insert<T extends Table>(table: T, values: T[\"$inferInsert\"]): Promise<T[\"$inferSelect\"]>;\n /** Update a row by id and return the updated record. */\n update<T extends Table>(\n table: T,\n id: string,\n values: Partial<T[\"$inferInsert\"]>,\n ): Promise<T[\"$inferSelect\"]>;\n /** Fetch a single row by id, or null if not found. */\n get<T extends Table>(table: T, id: string): Promise<T[\"$inferSelect\"] | null>;\n /** Delete a row by id. */\n remove(table: Table, id: string): Promise<void>;\n /** List rows matching the given options. */\n list<T extends Table>(table: T, opts?: ListOptions): Promise<T[\"$inferSelect\"][]>;\n /** Count rows matching an optional where condition. */\n count(table: Table, where?: SQL): Promise<number>;\n}\n\n/** Database-specific metadata: the family plus what the backing platform can carry. */\nexport interface DatabaseAdapterMetadata {\n readonly category: \"database\";\n /**\n * `false` when the database cannot back a deployment with `testing` (ADR 0006, decision 3): it\n * is reachable only from a platform that ends the process after each request (Cloudflare D1).\n * Unset means it can.\n */\n readonly supportsTesting?: boolean;\n}\n\n/** Database abstraction over Drizzle tables, agnostic of dialect and driver. */\nexport interface DatabaseAdapter extends Adapter<DatabaseAdapterMetadata> {\n /** Table handles for this adapter's dialect, enforced with type safety. */\n readonly tables: Tables;\n /** Insert a row and return the inserted record. */\n insert<T extends Table>(table: T, values: T[\"$inferInsert\"]): Promise<T[\"$inferSelect\"]>;\n /** Update a row by id and return the updated record. */\n update<T extends Table>(\n table: T,\n id: string,\n values: Partial<T[\"$inferInsert\"]>,\n ): Promise<T[\"$inferSelect\"]>;\n /** Fetch a single row by id, or null if not found. */\n get<T extends Table>(table: T, id: string): Promise<T[\"$inferSelect\"] | null>;\n /** Delete a row by id. */\n remove(table: Table, id: string): Promise<void>;\n /** List rows matching the given options. */\n list<T extends Table>(table: T, opts?: ListOptions): Promise<T[\"$inferSelect\"][]>;\n /** Count rows matching an optional where condition. */\n count(table: Table, where?: SQL): Promise<number>;\n /** Run an arbitrary SQL query and return typed rows. */\n all<T>(query: SQL): Promise<T[]>;\n /**\n * Run `fn` inside a transaction when the driver supports one.\n * Commits on resolve, rolls back on throw. Drivers without transaction\n * support omit this; callers must use `?.` and accept sequential execution.\n */\n transact?<R>(fn: (tx: TxStore) => Promise<R>): Promise<R>;\n}\n\n/** Driver-supplied identity plus lifecycle hooks. */\nexport interface DrizzleAdapterOptions {\n metadata: AdapterMetadata & DatabaseAdapterMetadata;\n tables: Tables;\n migrate: () => Promise<void> | void;\n close: () => Promise<void> | void;\n /** Cheap liveness probe (e.g. `SELECT 1`); omitted when the driver has none. */\n ping?: () => Promise<void> | void;\n}\n"],"mappings":";;;;;AAiDA,MAAa,sBAAsB;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAa,iBAAiB;;AAG9B,SAAgB,eAAe,OAAoC;CACjE,IAAI,UAAU,KAAA,GACZ;CAEF,IAAI,CAAC,OAAO,SAAS,KAAK,GACxB,OAAO;CAET,OAAO,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,KAAK,GAAG,CAAC,GAAG,cAAc;AAChE"}
|
|
1
|
+
{"version":3,"file":"database.mjs","names":[],"sources":["../../src/adapters/database.ts"],"sourcesContent":["/**\n * Database adapter interface: query builders over explicitly typed tables.\n *\n * Canonical home of the database contract — {@link DatabaseAdapter},\n * {@link Tables}, {@link TxStore}, {@link ListOptions}, and\n * {@link DrizzleAdapterOptions}. Driver machinery lives in the database\n * packages (`@storyshelf/db-sqlite`, `@storyshelf/db-postgres`).\n */\nimport type { SQL } from \"drizzle-orm\";\nimport type { Table } from \"drizzle-orm\";\nimport type { Adapter, AdapterMetadata } from \"./metadata.ts\";\n\n/** A fenced reference write lost its generation race and should be retried. */\nexport class ReferenceGenerationConflict extends Error {}\n\n/** Type-safe table map enforced on every DatabaseAdapter. */\nexport interface Tables {\n projects: Table;\n builds: Table;\n captureAttempts: Table;\n captureLogs: Table;\n captureShards: Table;\n captureJobs: Table;\n buildComponents: Table;\n buildReviews: Table;\n siteSettings: Table;\n snapshots: Table;\n baselines: Table;\n comments: Table;\n labelTypes: Table;\n buildLabels: Table;\n projectLinks: Table;\n designLinks: Table;\n designCredentials: Table;\n userConnections: Table;\n designNodes: Table;\n buildPackageUsage: Table;\n tokens: Table;\n webhooks: Table;\n insights: Table;\n aiUsage: Table;\n aiBudgetAlerts: Table;\n notificationChannels: Table;\n notificationSubscriptions: Table;\n users: Table;\n userInviteTokens: Table;\n projectMembers: Table;\n projectGroupMappings: Table;\n contentRefs: Table;\n}\n\n/** Table keys every DatabaseAdapter must expose (contract + validation share this). */\nexport const REQUIRED_TABLE_KEYS = [\n \"projects\",\n \"builds\",\n \"snapshots\",\n \"baselines\",\n \"comments\",\n \"labelTypes\",\n \"buildLabels\",\n \"tokens\",\n \"webhooks\",\n \"users\",\n \"projectMembers\",\n];\n\n/** Largest page any adapter serves in one list call. */\nexport const MAX_LIST_LIMIT = 1000;\n\n/** Clamp a list limit into [1, MAX_LIST_LIMIT]; undefined stays undefined. */\nexport function clampListLimit(limit?: number): number | undefined {\n if (limit === undefined) {\n return undefined;\n }\n if (!Number.isFinite(limit)) {\n return MAX_LIST_LIMIT;\n }\n return Math.min(Math.max(Math.floor(limit), 1), MAX_LIST_LIMIT);\n}\n\n/** Options that narrow and page a list query. */\nexport interface ListOptions {\n /** SQL WHERE condition. */\n where?: SQL;\n /** SQL ORDER BY condition. */\n orderBy?: SQL;\n /** Maximum number of rows to return. */\n limit?: number;\n /** Number of rows to skip. */\n offset?: number;\n}\n\n/**\n * Transactional CRUD subset available inside {@link DatabaseAdapter.transact}.\n * Mirrors the adapter surface minus metadata, lifecycle, and raw `all`\n * (opaque to transactions on some drivers).\n */\nexport interface TxStore {\n /** Insert a row and return the inserted record. */\n insert<T extends Table>(table: T, values: T[\"$inferInsert\"]): Promise<T[\"$inferSelect\"]>;\n /** Update a row by id and return the updated record. */\n update<T extends Table>(\n table: T,\n id: string,\n values: Partial<T[\"$inferInsert\"]>,\n ): Promise<T[\"$inferSelect\"]>;\n /** Fetch a single row by id, or null if not found. */\n get<T extends Table>(table: T, id: string): Promise<T[\"$inferSelect\"] | null>;\n /** Delete a row by id. */\n remove(table: Table, id: string): Promise<void>;\n /** List rows matching the given options. */\n list<T extends Table>(table: T, opts?: ListOptions): Promise<T[\"$inferSelect\"][]>;\n /** Count rows matching an optional where condition. */\n count(table: Table, where?: SQL): Promise<number>;\n}\n\n/** An owner of durable protection for a build. Historical comparisons are not build owners. */\nexport interface BuildReferenceOwner {\n type: \"baseline\" | \"investigation\";\n id: string;\n projectId: string;\n}\n\n/** One owner's complete new reference set for an atomic multi-owner mutation. */\nexport interface BuildReferenceChange {\n owner: BuildReferenceOwner;\n buildIds: readonly string[];\n}\n\n/** A complete owner reference replacement guarded by its last observed generation. */\nexport interface FencedBuildReferenceChange extends BuildReferenceChange {\n expectedGeneration: number;\n}\n\n/**\n * An explicit database capability; an ordinary transaction does not establish this contract.\n * Implementations serialize admissions, reference changes, and deletion claims across processes.\n * Their tests must use independent connections, including promotion/purge and pin/purge races.\n */\nexport interface BuildReferenceLifecycle {\n /** Return the durable generation for an owner, or zero before its first reference mutation.\n * This is a snapshot: callers must pass it to a fenced mutation, which rechecks atomically. */\n referenceGeneration(owner: BuildReferenceOwner): Promise<number>;\n /** Atomically fence and replace multiple owners, or roll back all owners and domain writes. */\n replaceManyFencedReferences<T>(\n changes: readonly FencedBuildReferenceChange[],\n writeDomain: (tx: TxStore) => Promise<T>,\n ): Promise<{ result: T; generations: number[] }>;\n /** Compare and advance an owner's durable generation with its reference and domain writes.\n * Generation zero denotes an owner with no earlier mutations. A stale generation rejects the\n * whole transaction. Generations survive release so an old worker cannot release a newer pin. */\n replaceFencedReferences<T>(\n owner: BuildReferenceOwner,\n expectedGeneration: number,\n buildIds: readonly string[],\n writeDomain: (tx: TxStore) => Promise<T>,\n ): Promise<{ result: T; generation: number }>;\n /**\n * Atomically replace one owner's complete reference set and make its domain writes. Both old and\n * new builds must be locked in stable order, checked for project ownership and availability,\n * and committed with the domain mutation. Unknown or tombstoned builds reject admission.\n */\n replaceReferences<T>(\n owner: BuildReferenceOwner,\n buildIds: readonly string[],\n writeDomain: (tx: TxStore) => Promise<T>,\n ): Promise<T>;\n /** Atomically replace several owners' reference sets and the shared domain writes. */\n replaceManyReferences<T>(\n changes: readonly BuildReferenceChange[],\n writeDomain: (tx: TxStore) => Promise<T>,\n ): Promise<T>;\n /**\n * In the same concurrency domain as admissions, irreversibly tombstone a build only if no\n * protecting reference remains. Existing tombstones are resumable and never become available.\n * Storage deletion must happen after this operation commits, outside database locks.\n */\n claimDeletion(\n projectId: string,\n buildId: string,\n ): Promise<\"claimed\" | \"protected\" | \"deleting\" | \"missing\">;\n}\n\n/** Database-specific metadata: the family plus what the backing platform can carry. */\nexport interface DatabaseAdapterMetadata {\n readonly category: \"database\";\n /**\n * `false` when the database cannot back a deployment with `testing` (ADR 0006, decision 3): it\n * is reachable only from a platform that ends the process after each request (Cloudflare D1).\n * Unset means it can.\n */\n readonly supportsTesting?: boolean;\n}\n\n/** Database abstraction over Drizzle tables, agnostic of dialect and driver. */\nexport interface DatabaseAdapter extends Adapter<DatabaseAdapterMetadata> {\n /**\n * Present only when the adapter implements the cross-process retention safety contract.\n * `transact` by itself is not evidence of this capability.\n */\n readonly buildReferenceLifecycle?: BuildReferenceLifecycle;\n /** Table handles for this adapter's dialect, enforced with type safety. */\n readonly tables: Tables;\n /** Insert a row and return the inserted record. */\n insert<T extends Table>(table: T, values: T[\"$inferInsert\"]): Promise<T[\"$inferSelect\"]>;\n /** Update a row by id and return the updated record. */\n update<T extends Table>(\n table: T,\n id: string,\n values: Partial<T[\"$inferInsert\"]>,\n ): Promise<T[\"$inferSelect\"]>;\n /** Atomically update a row only while `where` matches; return the current row, or null if absent.\n * Custom adapters must implement the condition in the same database statement as the update.\n */\n updateWhere<T extends Table>(\n table: T,\n id: string,\n values: Partial<T[\"$inferInsert\"]>,\n where: SQL,\n ): Promise<T[\"$inferSelect\"] | null>;\n /** Fetch a single row by id, or null if not found. */\n get<T extends Table>(table: T, id: string): Promise<T[\"$inferSelect\"] | null>;\n /** Delete a row by id. */\n remove(table: Table, id: string): Promise<void>;\n /** List rows matching the given options. */\n list<T extends Table>(table: T, opts?: ListOptions): Promise<T[\"$inferSelect\"][]>;\n /** Count rows matching an optional where condition. */\n count(table: Table, where?: SQL): Promise<number>;\n /** Run an arbitrary SQL query and return typed rows. */\n all<T>(query: SQL): Promise<T[]>;\n /**\n * Run `fn` inside a transaction when the driver supports one.\n * Commits on resolve, rolls back on throw. Drivers without transaction\n * support omit this; callers must use `?.` and accept sequential execution.\n */\n transact?<R>(fn: (tx: TxStore) => Promise<R>): Promise<R>;\n}\n\n/** Driver-supplied identity plus lifecycle hooks. */\nexport interface DrizzleAdapterOptions {\n metadata: AdapterMetadata & DatabaseAdapterMetadata;\n tables: Tables;\n migrate: () => Promise<void> | void;\n close: () => Promise<void> | void;\n /** Cheap liveness probe (e.g. `SELECT 1`); omitted when the driver has none. */\n ping?: () => Promise<void> | void;\n}\n"],"mappings":";;;;;AAaA,IAAa,8BAAb,cAAiD,MAAM,CAAC;;AAuCxD,MAAa,sBAAsB;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAa,iBAAiB;;AAG9B,SAAgB,eAAe,OAAoC;CACjE,IAAI,UAAU,KAAA,GACZ;CAEF,IAAI,CAAC,OAAO,SAAS,KAAK,GACxB,OAAO;CAET,OAAO,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,KAAK,GAAG,CAAC,GAAG,cAAc;AAChE"}
|
|
@@ -4,7 +4,6 @@ import { Logger } from "../logger.mjs";
|
|
|
4
4
|
import { OAuthClient } from "./oauth.mjs";
|
|
5
5
|
import { Adapter, AdapterMetadata } from "./metadata.mjs";
|
|
6
6
|
import { Buffer } from "node:buffer";
|
|
7
|
-
//#region src/adapters/design.d.ts
|
|
8
7
|
/** Design-provider metadata: identity plus the copy the settings UI shows for its credential. */
|
|
9
8
|
interface DesignAdapterMetadata extends AdapterMetadata {
|
|
10
9
|
readonly category: "design";
|
|
@@ -80,6 +79,5 @@ declare function parseDesignUrl(providers: readonly DesignProvider[], raw: strin
|
|
|
80
79
|
provider: DesignProvider;
|
|
81
80
|
ref: DesignRef;
|
|
82
81
|
} | null;
|
|
83
|
-
//#endregion
|
|
84
82
|
export { DesignAdapterMetadata, DesignAuthType, DesignCallOptions, DesignClient, DesignMeta, DesignProvider, DesignRef, DesignState, InvalidDesignUrlError, parseDesignUrl };
|
|
85
83
|
//# sourceMappingURL=design.d.mts.map
|
package/dist/adapter/design.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
-
|
|
4
|
+
// src/adapters/design.ts
|
|
5
5
|
/** Thrown when a design link is not accepted by any configured provider. */
|
|
6
6
|
var InvalidDesignUrlError = class extends Error {
|
|
7
7
|
value;
|
|
@@ -22,7 +22,6 @@ function parseDesignUrl(providers, raw) {
|
|
|
22
22
|
}
|
|
23
23
|
return null;
|
|
24
24
|
}
|
|
25
|
-
//#endregion
|
|
26
25
|
export { InvalidDesignUrlError, parseDesignUrl };
|
|
27
26
|
|
|
28
27
|
//# sourceMappingURL=design.mjs.map
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import __tsdown_shims_path from 'node:path';
|
|
2
2
|
import __tsdown_shims_url from 'node:url';
|
|
3
3
|
import { Adapter } from "./metadata.mjs";
|
|
4
|
-
//#region src/adapters/email-sender.d.ts
|
|
5
4
|
/** A single email message (transport-agnostic). */
|
|
6
5
|
interface EmailMessage {
|
|
7
6
|
to: string;
|
|
@@ -22,6 +21,5 @@ interface EmailSender extends Adapter<{
|
|
|
22
21
|
}> {
|
|
23
22
|
send(message: EmailMessage): Promise<void>;
|
|
24
23
|
}
|
|
25
|
-
//#endregion
|
|
26
24
|
export { EmailMessage, EmailSender };
|
|
27
25
|
//# sourceMappingURL=email-sender.d.mts.map
|
|
@@ -2,7 +2,6 @@ import __tsdown_shims_path from 'node:path';
|
|
|
2
2
|
import __tsdown_shims_url from 'node:url';
|
|
3
3
|
import { Logger } from "../logger.mjs";
|
|
4
4
|
import { ShelfConfig } from "../config.mjs";
|
|
5
|
-
//#region src/adapters/metadata.d.ts
|
|
6
5
|
/**
|
|
7
6
|
* Adapter family — which concern an adapter supplies.
|
|
8
7
|
*
|
|
@@ -77,6 +76,5 @@ interface Adapter<Extra extends object = Record<string, unknown>> {
|
|
|
77
76
|
*/
|
|
78
77
|
setLogger?(logger: Logger): void;
|
|
79
78
|
}
|
|
80
|
-
//#endregion
|
|
81
79
|
export { Adapter, AdapterCategory, AdapterHealth, AdapterLifecycle, AdapterMetadata, AdapterSetupContext };
|
|
82
80
|
//# sourceMappingURL=metadata.d.mts.map
|
package/dist/adapter/oauth.d.mts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import __tsdown_shims_path from 'node:path';
|
|
2
2
|
import __tsdown_shims_url from 'node:url';
|
|
3
|
-
//#region src/adapters/oauth.d.ts
|
|
4
3
|
/**
|
|
5
4
|
* Service-neutral OAuth 2 contract for "connect your own account" flows. Any
|
|
6
5
|
* adapter that talks to a third party on behalf of a user (design tools,
|
|
@@ -47,6 +46,5 @@ interface OAuthConnectable {
|
|
|
47
46
|
/** Present only when the operator configured OAuth for the service. */
|
|
48
47
|
readonly oauth?: OAuthClient;
|
|
49
48
|
}
|
|
50
|
-
//#endregion
|
|
51
49
|
export { OAuthClient, OAuthConnectable, OAuthTokens };
|
|
52
50
|
//# sourceMappingURL=oauth.d.mts.map
|
package/dist/adapter/setup.d.mts
CHANGED
|
@@ -10,7 +10,6 @@ import { AdapterSetupContext } from "./metadata.mjs";
|
|
|
10
10
|
import { bindAdapterLoggers, collectSetups, collectTeardowns, runAdapterSetups, runAdapterTeardowns } from "../adapters/setup-runner.mjs";
|
|
11
11
|
import { validateAdapter, validateAdapterSources, validateAuth, validateBootAssembly } from "../adapters/validate.mjs";
|
|
12
12
|
import { adapterSourcesOf } from "../adapters/sources.mjs";
|
|
13
|
-
//#region src/adapters/setup.d.ts
|
|
14
13
|
/** Adapters that can take part in lifecycle runs. */
|
|
15
14
|
interface AdapterSetupSources {
|
|
16
15
|
database: DatabaseAdapter;
|
|
@@ -55,6 +54,5 @@ declare class AdapterLifecycleError extends Error {
|
|
|
55
54
|
readonly failures: AdapterSetupFailure[];
|
|
56
55
|
constructor(phase: LifecyclePhase, failures: AdapterSetupFailure[]);
|
|
57
56
|
}
|
|
58
|
-
//#endregion
|
|
59
57
|
export { AdapterLifecycleError, AdapterSetupFailure, AdapterSetupResult, AdapterSetupSources, HookEntry, LifecyclePhase, adapterSourcesOf, bindAdapterLoggers, collectSetups, collectTeardowns, runAdapterSetups, runAdapterTeardowns, validateAdapter, validateAdapterSources, validateAuth, validateBootAssembly };
|
|
60
58
|
//# sourceMappingURL=setup.d.mts.map
|
package/dist/adapter/setup.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import.meta.url;
|
|
|
4
4
|
import { bindAdapterLoggers, collectSetups, collectTeardowns, runAdapterSetups, runAdapterTeardowns } from "../adapters/setup-runner.mjs";
|
|
5
5
|
import { validateAdapter, validateAdapterSources, validateAuth, validateBootAssembly } from "../adapters/validate.mjs";
|
|
6
6
|
import { adapterSourcesOf } from "../adapters/sources.mjs";
|
|
7
|
-
|
|
7
|
+
// src/adapters/setup.ts
|
|
8
8
|
/**
|
|
9
9
|
* Thrown when an `app.lifecycle.setup()` or `teardown()` run finishes with failures.
|
|
10
10
|
*
|
|
@@ -24,7 +24,6 @@ var AdapterLifecycleError = class extends Error {
|
|
|
24
24
|
this.failures = failures;
|
|
25
25
|
}
|
|
26
26
|
};
|
|
27
|
-
//#endregion
|
|
28
27
|
export { AdapterLifecycleError, adapterSourcesOf, bindAdapterLoggers, collectSetups, collectTeardowns, runAdapterSetups, runAdapterTeardowns, validateAdapter, validateAdapterSources, validateAuth, validateBootAssembly };
|
|
29
28
|
|
|
30
29
|
//# sourceMappingURL=setup.mjs.map
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import __tsdown_shims_path from 'node:path';
|
|
2
2
|
import __tsdown_shims_url from 'node:url';
|
|
3
3
|
import { Adapter } from "./metadata.mjs";
|
|
4
|
-
import { Readable } from "node:stream";
|
|
5
4
|
import { Buffer } from "node:buffer";
|
|
6
|
-
|
|
5
|
+
import { Readable } from "node:stream";
|
|
7
6
|
/** Blob storage abstraction for screenshots, diffs and Storybook archives. */
|
|
8
7
|
interface StorageAdapter extends Adapter<{
|
|
9
8
|
readonly category: "storage";
|
|
@@ -29,6 +28,5 @@ interface StorageAdapter extends Adapter<{
|
|
|
29
28
|
*/
|
|
30
29
|
readStream(path: string): Promise<Readable>;
|
|
31
30
|
}
|
|
32
|
-
//#endregion
|
|
33
31
|
export { StorageAdapter };
|
|
34
32
|
//# sourceMappingURL=storage.d.mts.map
|
|
@@ -4,7 +4,6 @@ import { DatabaseAdapter } from "./database.mjs";
|
|
|
4
4
|
import { SecretInput } from "../utils/encrypt.mjs";
|
|
5
5
|
import { WebhookTables } from "../models/webhook.mjs";
|
|
6
6
|
import { Logger } from "pino";
|
|
7
|
-
//#region src/adapters/webhook-events.d.ts
|
|
8
7
|
/**
|
|
9
8
|
* Deliver an event to every subscribed webhook of a project.
|
|
10
9
|
*
|
|
@@ -24,6 +23,5 @@ interface WebhookEvent {
|
|
|
24
23
|
data: Record<string, unknown>;
|
|
25
24
|
timestamp: string;
|
|
26
25
|
}
|
|
27
|
-
//#endregion
|
|
28
26
|
export { WebhookEvent, emitWebhookEvent };
|
|
29
27
|
//# sourceMappingURL=webhook-events.d.mts.map
|
|
@@ -3,9 +3,8 @@ import "node:url";
|
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { hmacSha256 } from "../utils/hash.mjs";
|
|
5
5
|
import { WebhookModel } from "../models/webhook.mjs";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const WEBHOOK_TIMEOUT_MS = 1e4;
|
|
6
|
+
import { httpStatus } from "../utils/http.mjs";
|
|
7
|
+
// src/adapters/webhook-events.ts
|
|
9
8
|
/**
|
|
10
9
|
* Deliver an event to every subscribed webhook of a project.
|
|
11
10
|
*
|
|
@@ -42,7 +41,7 @@ async function deliverToWebhook(webhookModel, webhook, eventPayload, logger) {
|
|
|
42
41
|
return;
|
|
43
42
|
}
|
|
44
43
|
try {
|
|
45
|
-
await sendWebhook(webhook.url, plaintext, eventPayload);
|
|
44
|
+
await sendWebhook(webhook.url, plaintext, eventPayload, logger);
|
|
46
45
|
logger?.info({
|
|
47
46
|
webhookId: webhook.id,
|
|
48
47
|
host: hostOf(webhook.url)
|
|
@@ -63,21 +62,21 @@ function hostOf(url) {
|
|
|
63
62
|
return "[invalid-url]";
|
|
64
63
|
}
|
|
65
64
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
65
|
+
/**
|
|
66
|
+
* POST one event through `httpStatus` (default timeout and retry policy). The signature covers the
|
|
67
|
+
* exact body string, and `json` serializes the event with the same `JSON.stringify`.
|
|
68
|
+
*/
|
|
69
|
+
async function sendWebhook(url, secret, event, logger) {
|
|
70
|
+
await httpStatus(url, {
|
|
70
71
|
method: "POST",
|
|
72
|
+
json: event,
|
|
71
73
|
headers: {
|
|
72
|
-
"Content-Type": "application/json",
|
|
73
74
|
"X-StoryShelf-Event": event.event,
|
|
74
|
-
"X-StoryShelf-Signature":
|
|
75
|
+
"X-StoryShelf-Signature": hmacSha256(secret, JSON.stringify(event))
|
|
75
76
|
},
|
|
76
|
-
|
|
77
|
-
signal: AbortSignal.timeout(WEBHOOK_TIMEOUT_MS)
|
|
77
|
+
...logger ? { logger } : {}
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
|
-
//#endregion
|
|
81
80
|
export { emitWebhookEvent };
|
|
82
81
|
|
|
83
82
|
//# sourceMappingURL=webhook-events.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-events.mjs","names":[],"sources":["../../src/adapters/webhook-events.ts"],"sourcesContent":["import type { Logger } from \"pino\";\nimport { WebhookModel, type WebhookTables } from \"../models/webhook.ts\";\nimport type { Webhook } from \"../schema/webhook.ts\";\nimport type { SecretInput } from \"../utils/encrypt.ts\";\nimport { hmacSha256 } from \"../utils/hash.ts\";\nimport
|
|
1
|
+
{"version":3,"file":"webhook-events.mjs","names":[],"sources":["../../src/adapters/webhook-events.ts"],"sourcesContent":["import type { Logger } from \"pino\";\nimport { WebhookModel, type WebhookTables } from \"../models/webhook.ts\";\nimport type { Webhook } from \"../schema/webhook.ts\";\nimport type { SecretInput } from \"../utils/encrypt.ts\";\nimport { hmacSha256 } from \"../utils/hash.ts\";\nimport { httpStatus } from \"../utils/http.ts\";\nimport type { DatabaseAdapter } from \"./database.ts\";\n\n/**\n * Deliver an event to every subscribed webhook of a project.\n *\n * @param db - Database adapter for loading subscriptions.\n * @param tables - Webhook table handles.\n * @param projectId - Project whose webhooks receive the event.\n * @param event - Event name (e.g. \"baseline:created\").\n * @param data - Event payload.\n * @param secret - Server secret for decrypting webhook secrets (in memory only).\n * @param logger - Optional logger for per-delivery outcomes.\n */\nexport async function emitWebhookEvent(\n db: DatabaseAdapter,\n tables: WebhookTables,\n projectId: string,\n event: string,\n data: Record<string, unknown>,\n secret: SecretInput,\n logger?: Logger,\n): Promise<void> {\n const webhookModel = new WebhookModel(db, tables, secret);\n const webhooks = await webhookModel.list(projectId);\n const eventPayload: WebhookEvent = {\n event,\n projectId,\n data,\n timestamp: new Date().toISOString(),\n };\n\n await Promise.allSettled(\n webhooks.map(async (webhook) => {\n const events = WebhookModel.eventsOf(webhook);\n if (events.length > 0 && !events.includes(event)) {\n return;\n }\n await deliverToWebhook(webhookModel, webhook, eventPayload, logger);\n }),\n );\n}\n\n/** Decrypt, send, and log one webhook delivery (failures stay non-fatal). */\nasync function deliverToWebhook(\n webhookModel: WebhookModel,\n webhook: Webhook,\n eventPayload: WebhookEvent,\n logger: Logger | undefined,\n): Promise<void> {\n let plaintext: string;\n try {\n plaintext = webhookModel.decryptSecret(webhook);\n } catch {\n // Undecryptable secret (e.g. rotated server SECRET) — skip, don't leak\n logger?.warn({ webhookId: webhook.id }, \"skipping webhook with undecryptable secret\");\n return;\n }\n try {\n // A non-2xx answer throws HttpError, so only a delivery the subscriber accepted is \"delivered\".\n await sendWebhook(webhook.url, plaintext, eventPayload, logger);\n logger?.info({ webhookId: webhook.id, host: hostOf(webhook.url) }, \"webhook delivered\");\n } catch (error) {\n // Webhook delivery failures are non-fatal\n logger?.warn(\n { webhookId: webhook.id, host: hostOf(webhook.url), err: error },\n \"webhook delivery failed\",\n );\n }\n}\n\n/** Outbound webhook payload delivered to subscribers. */\nexport interface WebhookEvent {\n event: string;\n projectId: string;\n data: Record<string, unknown>;\n timestamp: string;\n}\n\n/** Hostname of a webhook URL for logs (never the full URL — may carry secrets). */\nfunction hostOf(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return \"[invalid-url]\";\n }\n}\n\n/**\n * POST one event through `httpStatus` (default timeout and retry policy). The signature covers the\n * exact body string, and `json` serializes the event with the same `JSON.stringify`.\n */\nasync function sendWebhook(\n url: string,\n secret: string,\n event: WebhookEvent,\n logger: Logger | undefined,\n): Promise<void> {\n await httpStatus(url, {\n method: \"POST\",\n json: event,\n headers: {\n \"X-StoryShelf-Event\": event.event,\n \"X-StoryShelf-Signature\": hmacSha256(secret, JSON.stringify(event)),\n },\n ...(logger ? { logger } : {}),\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAmBA,eAAsB,iBACpB,IACA,QACA,WACA,OACA,MACA,QACA,QACe;CACf,MAAM,eAAe,IAAI,aAAa,IAAI,QAAQ,MAAM;CACxD,MAAM,WAAW,MAAM,aAAa,KAAK,SAAS;CAClD,MAAM,eAA6B;EACjC;EACA;EACA;EACA,4BAAW,IAAI,KAAK,EAAA,CAAE,YAAY;CACpC;CAEA,MAAM,QAAQ,WACZ,SAAS,IAAI,OAAO,YAAY;EAC9B,MAAM,SAAS,aAAa,SAAS,OAAO;EAC5C,IAAI,OAAO,SAAS,KAAK,CAAC,OAAO,SAAS,KAAK,GAC7C;EAEF,MAAM,iBAAiB,cAAc,SAAS,cAAc,MAAM;CACpE,CAAC,CACH;AACF;;AAGA,eAAe,iBACb,cACA,SACA,cACA,QACe;CACf,IAAI;CACJ,IAAI;EACF,YAAY,aAAa,cAAc,OAAO;CAChD,QAAQ;EAEN,QAAQ,KAAK,EAAE,WAAW,QAAQ,GAAG,GAAG,4CAA4C;EACpF;CACF;CACA,IAAI;EAEF,MAAM,YAAY,QAAQ,KAAK,WAAW,cAAc,MAAM;EAC9D,QAAQ,KAAK;GAAE,WAAW,QAAQ;GAAI,MAAM,OAAO,QAAQ,GAAG;EAAE,GAAG,mBAAmB;CACxF,SAAS,OAAO;EAEd,QAAQ,KACN;GAAE,WAAW,QAAQ;GAAI,MAAM,OAAO,QAAQ,GAAG;GAAG,KAAK;EAAM,GAC/D,yBACF;CACF;AACF;;AAWA,SAAS,OAAO,KAAqB;CACnC,IAAI;EACF,OAAO,IAAI,IAAI,GAAG,CAAC,CAAC;CACtB,QAAQ;EACN,OAAO;CACT;AACF;;;;;AAMA,eAAe,YACb,KACA,QACA,OACA,QACe;CACf,MAAM,WAAW,KAAK;EACpB,QAAQ;EACR,MAAM;EACN,SAAS;GACP,sBAAsB,MAAM;GAC5B,0BAA0B,WAAW,QAAQ,KAAK,UAAU,KAAK,CAAC;EACpE;EACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;CAC7B,CAAC;AACH"}
|
|
@@ -2,7 +2,6 @@ import __tsdown_shims_path from 'node:path';
|
|
|
2
2
|
import __tsdown_shims_url from 'node:url';
|
|
3
3
|
import { CaptureTarget, RunnerTarget } from "./capture-target.mjs";
|
|
4
4
|
import { AdapterLifecycle } from "../adapter/metadata.mjs";
|
|
5
|
-
//#region src/adapters/capture-target-offers.d.ts
|
|
6
5
|
/** A runner's live target list. */
|
|
7
6
|
interface TargetOffers {
|
|
8
7
|
/** First declared target: what a project with no `browsers` setting resolves to. */
|
|
@@ -23,6 +22,5 @@ interface TargetOffers {
|
|
|
23
22
|
* without `lifecycle.setup` behaves as before and a failed launch still marks its target.
|
|
24
23
|
*/
|
|
25
24
|
declare function createTargetOffers(declared: readonly RunnerTarget[]): TargetOffers;
|
|
26
|
-
//#endregion
|
|
27
25
|
export { TargetOffers, createTargetOffers };
|
|
28
26
|
//# sourceMappingURL=capture-target-offers.d.mts.map
|
|
@@ -2,7 +2,7 @@ import "node:path";
|
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { TargetLaunchError } from "./capture-target.mjs";
|
|
5
|
-
|
|
5
|
+
// src/adapters/capture-target-offers.ts
|
|
6
6
|
/**
|
|
7
7
|
* What a runner offers right now, shared by the runners (ADR 0007): the targets it declared, whether
|
|
8
8
|
* each can render, and the lifecycle that keeps that honest. A launch failure marks its target
|
|
@@ -52,7 +52,6 @@ function createTargetOffers(declared) {
|
|
|
52
52
|
})
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
|
-
//#endregion
|
|
56
55
|
export { createTargetOffers };
|
|
57
56
|
|
|
58
57
|
//# sourceMappingURL=capture-target-offers.mjs.map
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import __tsdown_shims_path from 'node:path';
|
|
2
2
|
import __tsdown_shims_url from 'node:url';
|
|
3
|
-
//#region src/adapters/capture-target.d.ts
|
|
4
3
|
/**
|
|
5
4
|
* Capture targets (ADR 0007, decision 3): what a project names to render on. A target is a rendering
|
|
6
5
|
* engine (`chromium`) or a remote one, `<engine>@<name>` (`chromium@grid`), which has its own
|
|
@@ -66,6 +65,5 @@ declare class TargetLaunchError extends Error {
|
|
|
66
65
|
transient?: boolean;
|
|
67
66
|
});
|
|
68
67
|
}
|
|
69
|
-
//#endregion
|
|
70
68
|
export { BROWSER_NAMES, BrowserName, CaptureTarget, DEFAULT_BROWSER, ParsedTarget, RunnerTarget, TARGET_NAME_PATTERN, TargetLaunchError, TargetReach, TargetStatus, engineOf, isBrowserName, isCaptureTarget, parseTarget, tryParseTarget, unavailableReason };
|
|
71
69
|
//# sourceMappingURL=capture-target.d.mts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
-
|
|
4
|
+
// src/adapters/capture-target.ts
|
|
5
5
|
/** Engine names accepted for capture rendering (Chromium default). */
|
|
6
6
|
const BROWSER_NAMES = [
|
|
7
7
|
"chromium",
|
|
@@ -70,7 +70,6 @@ var TargetLaunchError = class extends Error {
|
|
|
70
70
|
this.transient = options?.transient ?? false;
|
|
71
71
|
}
|
|
72
72
|
};
|
|
73
|
-
//#endregion
|
|
74
73
|
export { BROWSER_NAMES, DEFAULT_BROWSER, TARGET_NAME_PATTERN, TargetLaunchError, engineOf, isBrowserName, isCaptureTarget, parseTarget, tryParseTarget, unavailableReason };
|
|
75
74
|
|
|
76
75
|
//# sourceMappingURL=capture-target.mjs.map
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import __tsdown_shims_path from 'node:path';
|
|
2
2
|
import __tsdown_shims_url from 'node:url';
|
|
3
3
|
import { DesiredStatus } from "./build-state.mjs";
|
|
4
|
-
//#region src/adapters/notifier/build-comment.d.ts
|
|
5
4
|
/** Inputs of {@link buildCommentMarkdown}. */
|
|
6
5
|
interface BuildCommentInput {
|
|
7
6
|
buildUrl: string;
|
|
@@ -19,6 +18,5 @@ interface BuildCommentInput {
|
|
|
19
18
|
}
|
|
20
19
|
/** Comment body (below the idempotency marker): links to the build, the Storybook and a summary. */
|
|
21
20
|
declare function buildCommentMarkdown(input: BuildCommentInput): string;
|
|
22
|
-
//#endregion
|
|
23
21
|
export { BuildCommentInput, buildCommentMarkdown };
|
|
24
22
|
//# sourceMappingURL=build-comment.d.mts.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "node:path";
|
|
2
2
|
import "node:url";
|
|
3
3
|
import.meta.url;
|
|
4
|
-
|
|
4
|
+
// src/adapters/notifier/build-comment.ts
|
|
5
5
|
const LABEL = {
|
|
6
6
|
testing: "Visual tests",
|
|
7
7
|
review: "Review",
|
|
@@ -18,7 +18,6 @@ function buildCommentMarkdown(input) {
|
|
|
18
18
|
if (input.storybookUrl !== void 0) lines.push(`- Storybook: [Open the published Storybook](${input.storybookUrl})`);
|
|
19
19
|
return lines.join("\n");
|
|
20
20
|
}
|
|
21
|
-
//#endregion
|
|
22
21
|
export { buildCommentMarkdown };
|
|
23
22
|
|
|
24
23
|
//# sourceMappingURL=build-comment.mjs.map
|
|
@@ -2,7 +2,6 @@ import __tsdown_shims_path from 'node:path';
|
|
|
2
2
|
import __tsdown_shims_url from 'node:url';
|
|
3
3
|
import { NotifierState, StateAnnotation } from "./types.mjs";
|
|
4
4
|
import { UrlBuilder } from "../../urls.mjs";
|
|
5
|
-
//#region src/adapters/notifier/build-state.d.ts
|
|
6
5
|
/** Most per-snapshot annotations a build state carries; the rest are counted (`omitted`). */
|
|
7
6
|
declare const MAX_ANNOTATIONS = 200;
|
|
8
7
|
/** Names of the statuses below a channel's prefix. */
|
|
@@ -94,6 +93,5 @@ interface BuildStateSet {
|
|
|
94
93
|
}
|
|
95
94
|
/** Statuses and comment for a build; empty without a real commit (no SHA or a local identity). */
|
|
96
95
|
declare function statusesForBuild(input: BuildStateInput): BuildStateSet;
|
|
97
|
-
//#endregion
|
|
98
96
|
export { BuildStateBuild, BuildStateChange, BuildStateFlags, BuildStateInput, BuildStateSet, DesiredComment, DesiredStatus, MAX_ANNOTATIONS, PublishingState, StatusName, statusesForBuild };
|
|
99
97
|
//# sourceMappingURL=build-state.d.mts.map
|
|
@@ -3,7 +3,7 @@ import "node:url";
|
|
|
3
3
|
import.meta.url;
|
|
4
4
|
import { buildCommentMarkdown } from "./build-comment.mjs";
|
|
5
5
|
import { LOCAL_SHA_PREFIX } from "@storyshelf/affected";
|
|
6
|
-
|
|
6
|
+
// src/adapters/notifier/build-state.ts
|
|
7
7
|
/**
|
|
8
8
|
* The states a build's git channels show, as one pure function of the build (ADR 0014, decision 5).
|
|
9
9
|
* It reads no clock, database or provider: callers hand it the build, the channel's prefix and the
|
|
@@ -212,7 +212,6 @@ function approvedText(build) {
|
|
|
212
212
|
function plural(count, noun) {
|
|
213
213
|
return `${String(count)} ${noun}${count === 1 ? "" : "s"}`;
|
|
214
214
|
}
|
|
215
|
-
//#endregion
|
|
216
215
|
export { MAX_ANNOTATIONS, statusesForBuild };
|
|
217
216
|
|
|
218
217
|
//# sourceMappingURL=build-state.mjs.map
|
|
@@ -3,7 +3,6 @@ import __tsdown_shims_url from 'node:url';
|
|
|
3
3
|
import { Logger } from "../../logger.mjs";
|
|
4
4
|
import { ChannelOutcome, NotificationBrand, NotificationChannel, NotificationEvent, SystemNotification } from "./types.mjs";
|
|
5
5
|
import { NotifierProvider } from "./provider.mjs";
|
|
6
|
-
//#region src/adapters/notifier/events.d.ts
|
|
7
6
|
/** Options for project-event fan-out (inline best-effort, non-fatal). */
|
|
8
7
|
interface EmitNotificationsOptions {
|
|
9
8
|
notifiers?: NotifierProvider[];
|
|
@@ -23,6 +22,5 @@ declare function emitNotifications(event: NotificationEvent, options?: EmitNotif
|
|
|
23
22
|
* (e.g. `sys:user-created`, `sys:capture-failed`, `sys:purge-completed`).
|
|
24
23
|
*/
|
|
25
24
|
declare function emitSystemNotification(event: SystemNotification, options?: EmitNotificationsOptions): Promise<void>;
|
|
26
|
-
//#endregion
|
|
27
25
|
export { EmitNotificationsOptions, emitNotifications, emitSystemNotification };
|
|
28
26
|
//# sourceMappingURL=events.d.mts.map
|
|
@@ -4,7 +4,7 @@ import.meta.url;
|
|
|
4
4
|
import { sanitizeErrorText } from "../../utils/redact.mjs";
|
|
5
5
|
import { formatNotification, formatSystemNotification } from "./format.mjs";
|
|
6
6
|
import { isStateProvider } from "./provider.mjs";
|
|
7
|
-
|
|
7
|
+
// src/adapters/notifier/events.ts
|
|
8
8
|
/** Check an event against a channel's allowlist (empty = all). */
|
|
9
9
|
function subscribed(channel, event) {
|
|
10
10
|
if (!channel.enabled) return false;
|
|
@@ -73,7 +73,6 @@ async function emitSystemNotification(event, options = {}) {
|
|
|
73
73
|
await deliverReported(options, channel, formatted, "system notification failed");
|
|
74
74
|
}));
|
|
75
75
|
}
|
|
76
|
-
//#endregion
|
|
77
76
|
export { emitNotifications, emitSystemNotification };
|
|
78
77
|
|
|
79
78
|
//# sourceMappingURL=events.mjs.map
|