@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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"capture-runner.mjs","names":[],"sources":["../../src/adapters/capture-runner.ts"],"sourcesContent":["/**\n * Capture-runner adapter interface: render story screenshots for a build.\n */\nimport type { Logger } from \"pino\";\nimport type { StoryEntry, StorySourceAdapter, Viewport } from \"../capture/adapter.ts\";\nimport type { Adapter } from \"./metadata.ts\";\n\nexport type { JobStatus } from \"./capture-queue.ts\";\nexport type { StoryEntry, StorySourceAdapter, Viewport } from \"../capture/adapter.ts\";\n\n/** A screenshot produced by a capture renderer. */\nexport interface RenderedSnapshot {\n /** The rendered story (echoed back from the render request). */\n story: StoryEntry;\n /** Viewport name the screenshot was captured at. */\n viewportName: string;\n /** Exact viewport dimensions captured at; falls back to the project list lookup in the pipeline. */\n viewport?: Viewport;\n /** PNG screenshot bytes. */\n screenshot: Buffer;\n}\n\n/** A story/viewport that a renderer could not capture. */\nexport interface RenderFailure {\n /** Story that failed to render. */\n storyId: string;\n /** Viewport that failed to render. */\n viewportName: string;\n /** Error message. */\n error: string;\n}\n\n/** The outcome of a render request. */\nexport interface RenderResult {\n /** Screenshots the renderer produced successfully. */\n captures: RenderedSnapshot[];\n /** Story/viewport pairs the renderer could not capture. */\n failures: RenderFailure[];\n}\n\n/**\n * A pure capture renderer.\n *\n * Adapters implementing `CaptureRunner` render screenshots from an\n * already-extracted Storybook directory and return PNG buffers. They are\n * intentionally pure: they perform **no** database, storage, or build-state\n * management. Loading the build, extracting the uploaded archive, persisting\n * snapshots/baselines/diffs, and advancing build status are the capture\n * orchestrator's job (see `capture/orchestrator.ts`), keeping every adapter\n * implementation free of server concerns.\n */\nexport type BrowserName = \"chromium\" | \"firefox\" | \"webkit\" | \"chrome\";\n\n/** Browser names accepted for capture rendering (Chromium default). */\nexport const BROWSER_NAMES = [\"chromium\", \"firefox\", \"webkit\", \"chrome\"] as const;\n\nexport interface CaptureRunner extends Adapter<{\n readonly category: \"capture-runner\";\n readonly supportedBrowsers?: readonly BrowserName[];\n}> {\n /**\n * Render configured viewports for the given stories of an extracted\n * Storybook and return the screenshot buffers.\n *\n * @param input - Render request with the extracted Storybook directory.\n */\n render(input: {\n /** Build being captured, used to correlate cancels with in-flight work. */\n buildId: string;\n /** Root of the already-extracted Storybook build. */\n storybookDir: string;\n /** Stories to render. */\n stories: StoryEntry[];\n /** Viewports to capture. */\n viewports: Viewport[];\n /** Optional logger for render-time diagnostics. */\n logger?: Logger;\n /** Whether to execute Storybook play functions before screenshot. */\n executePlay?: boolean;\n /** Timeout for play function execution in ms. */\n playTimeoutMs?: number;\n /** Whether to run a11y checks (axe) before screenshot; annotated as non-blocking. */\n runA11y?: boolean;\n /** Browser to use for rendering (chromium default). */\n browser?: BrowserName;\n /**\n * Test/extension seam: override the story source adapter (defaults to\n * `StorybookAdapter`). Only the renderer uses it; discovery stays the\n * orchestrator's job.\n */\n adapter?: StorySourceAdapter;\n }): Promise<RenderResult>;\n\n /** Cancel a pending or in-flight render for a build. */\n cancel(buildId: string): Promise<void>;\n}\n"],"mappings":";;;;;AAsDA,MAAa,gBAAgB;CAAC;CAAY;CAAW;CAAU;AAAQ"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import __tsdown_shims_path from 'node:path';
|
|
2
|
-
import __tsdown_shims_url from 'node:url';
|
|
3
|
-
import { Logger } from "pino";
|
|
4
|
-
//#region src/adapters/git-host/comments.d.ts
|
|
5
|
-
/** A review thread (PR or MR) hosting a single StoryShelf comment. */
|
|
6
|
-
interface ReviewThread {
|
|
7
|
-
/** List existing comments as id/body pairs. */
|
|
8
|
-
list(): Promise<{
|
|
9
|
-
id: string | number;
|
|
10
|
-
body: string;
|
|
11
|
-
}[]>;
|
|
12
|
-
/** Replace the body of an existing comment, returning its id. */
|
|
13
|
-
update(id: string | number, body: string): Promise<string>;
|
|
14
|
-
/** Create a comment, returning its id. */
|
|
15
|
-
create(body: string): Promise<string>;
|
|
16
|
-
}
|
|
17
|
-
/** Dependencies for an idempotent review-comment upsert. */
|
|
18
|
-
interface UpsertReviewCommentOptions {
|
|
19
|
-
/** Canonical build/review URL — anchors the idempotency marker. */
|
|
20
|
-
url: string;
|
|
21
|
-
/** Markdown body appended below the marker. */
|
|
22
|
-
markdown: string;
|
|
23
|
-
/** Known thread number, skipping the lookup when provided. */
|
|
24
|
-
prNumber?: number;
|
|
25
|
-
/** Commit SHA used for the thread lookup and log context. */
|
|
26
|
-
sha: string;
|
|
27
|
-
logger?: Logger;
|
|
28
|
-
/** Resolve the thread number for the commit (PR number or MR iid). */
|
|
29
|
-
resolveNumber: () => Promise<number | undefined>;
|
|
30
|
-
/** Open the thread's comment store once the number is known. */
|
|
31
|
-
thread: (number: number) => ReviewThread;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Create or update the single StoryShelf review comment for a build,
|
|
35
|
-
* idempotent via the url marker. Returns the comment id, or `""` when no
|
|
36
|
-
* review thread exists for the commit.
|
|
37
|
-
*/
|
|
38
|
-
declare function upsertReviewComment(opts: UpsertReviewCommentOptions): Promise<string>;
|
|
39
|
-
//#endregion
|
|
40
|
-
export { ReviewThread, UpsertReviewCommentOptions, upsertReviewComment };
|
|
41
|
-
//# sourceMappingURL=comments.d.mts.map
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import "node:path";
|
|
2
|
-
import "node:url";
|
|
3
|
-
import.meta.url;
|
|
4
|
-
import { commentMarker } from "./helpers.mjs";
|
|
5
|
-
//#region src/adapters/git-host/comments.ts
|
|
6
|
-
/** Resolve the thread number, preferring the explicit value. */
|
|
7
|
-
async function resolveThreadNumber(opts) {
|
|
8
|
-
return opts.prNumber ?? await opts.resolveNumber();
|
|
9
|
-
}
|
|
10
|
-
/** Update the marked comment if present, else create it. */
|
|
11
|
-
async function findOrCreateComment(thread, marker, body, prNumber, logger) {
|
|
12
|
-
const existing = (await thread.list()).find((comment) => comment.body.includes(marker));
|
|
13
|
-
if (existing) {
|
|
14
|
-
const id = await thread.update(existing.id, body);
|
|
15
|
-
logger?.info({
|
|
16
|
-
prNumber,
|
|
17
|
-
commentId: id
|
|
18
|
-
}, "review comment updated");
|
|
19
|
-
return id;
|
|
20
|
-
}
|
|
21
|
-
const id = await thread.create(body);
|
|
22
|
-
logger?.info({
|
|
23
|
-
prNumber,
|
|
24
|
-
commentId: id
|
|
25
|
-
}, "review comment created");
|
|
26
|
-
return id;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Create or update the single StoryShelf review comment for a build,
|
|
30
|
-
* idempotent via the url marker. Returns the comment id, or `""` when no
|
|
31
|
-
* review thread exists for the commit.
|
|
32
|
-
*/
|
|
33
|
-
async function upsertReviewComment(opts) {
|
|
34
|
-
const marker = commentMarker(opts.url);
|
|
35
|
-
const body = `${marker}\n${opts.markdown}`;
|
|
36
|
-
const number = await resolveThreadNumber(opts);
|
|
37
|
-
if (number === void 0) {
|
|
38
|
-
opts.logger?.debug({ sha: opts.sha }, "no review thread found for comment, skipping");
|
|
39
|
-
return "";
|
|
40
|
-
}
|
|
41
|
-
try {
|
|
42
|
-
return await findOrCreateComment(opts.thread(number), marker, body, number, opts.logger);
|
|
43
|
-
} catch (error) {
|
|
44
|
-
opts.logger?.error({
|
|
45
|
-
err: error,
|
|
46
|
-
prNumber: number
|
|
47
|
-
}, "failed to upsert review comment");
|
|
48
|
-
throw error;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
//#endregion
|
|
52
|
-
export { upsertReviewComment };
|
|
53
|
-
|
|
54
|
-
//# sourceMappingURL=comments.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"comments.mjs","names":[],"sources":["../../../src/adapters/git-host/comments.ts"],"sourcesContent":["import type { Logger } from \"pino\";\nimport { commentMarker } from \"./helpers.ts\";\n\n/** A review thread (PR or MR) hosting a single StoryShelf comment. */\nexport interface ReviewThread {\n /** List existing comments as id/body pairs. */\n list(): Promise<{ id: string | number; body: string }[]>;\n /** Replace the body of an existing comment, returning its id. */\n update(id: string | number, body: string): Promise<string>;\n /** Create a comment, returning its id. */\n create(body: string): Promise<string>;\n}\n\n/** Dependencies for an idempotent review-comment upsert. */\nexport interface UpsertReviewCommentOptions {\n /** Canonical build/review URL — anchors the idempotency marker. */\n url: string;\n /** Markdown body appended below the marker. */\n markdown: string;\n /** Known thread number, skipping the lookup when provided. */\n prNumber?: number;\n /** Commit SHA used for the thread lookup and log context. */\n sha: string;\n logger?: Logger;\n /** Resolve the thread number for the commit (PR number or MR iid). */\n resolveNumber: () => Promise<number | undefined>;\n /** Open the thread's comment store once the number is known. */\n thread: (number: number) => ReviewThread;\n}\n\n/** Resolve the thread number, preferring the explicit value. */\nasync function resolveThreadNumber(opts: UpsertReviewCommentOptions): Promise<number | undefined> {\n return opts.prNumber ?? (await opts.resolveNumber());\n}\n\n/** Update the marked comment if present, else create it. */\nasync function findOrCreateComment(\n thread: ReviewThread,\n marker: string,\n body: string,\n prNumber: number,\n logger?: Logger,\n): Promise<string> {\n const existing = (await thread.list()).find((comment) => comment.body.includes(marker));\n if (existing) {\n const id = await thread.update(existing.id, body);\n logger?.info({ prNumber, commentId: id }, \"review comment updated\");\n return id;\n }\n const id = await thread.create(body);\n logger?.info({ prNumber, commentId: id }, \"review comment created\");\n return id;\n}\n\n/**\n * Create or update the single StoryShelf review comment for a build,\n * idempotent via the url marker. Returns the comment id, or `\"\"` when no\n * review thread exists for the commit.\n */\nexport async function upsertReviewComment(opts: UpsertReviewCommentOptions): Promise<string> {\n const marker = commentMarker(opts.url);\n const body = `${marker}\\n${opts.markdown}`;\n const number = await resolveThreadNumber(opts);\n if (number === undefined) {\n opts.logger?.debug({ sha: opts.sha }, \"no review thread found for comment, skipping\");\n return \"\";\n }\n try {\n return await findOrCreateComment(opts.thread(number), marker, body, number, opts.logger);\n } catch (error) {\n opts.logger?.error({ err: error, prNumber: number }, \"failed to upsert review comment\");\n throw error;\n }\n}\n"],"mappings":";;;;;;AA+BA,eAAe,oBAAoB,MAA+D;CAChG,OAAO,KAAK,YAAa,MAAM,KAAK,cAAc;AACpD;;AAGA,eAAe,oBACb,QACA,QACA,MACA,UACA,QACiB;CACjB,MAAM,YAAY,MAAM,OAAO,KAAK,EAAA,CAAG,MAAM,YAAY,QAAQ,KAAK,SAAS,MAAM,CAAC;CACtF,IAAI,UAAU;EACZ,MAAM,KAAK,MAAM,OAAO,OAAO,SAAS,IAAI,IAAI;EAChD,QAAQ,KAAK;GAAE;GAAU,WAAW;EAAG,GAAG,wBAAwB;EAClE,OAAO;CACT;CACA,MAAM,KAAK,MAAM,OAAO,OAAO,IAAI;CACnC,QAAQ,KAAK;EAAE;EAAU,WAAW;CAAG,GAAG,wBAAwB;CAClE,OAAO;AACT;;;;;;AAOA,eAAsB,oBAAoB,MAAmD;CAC3F,MAAM,SAAS,cAAc,KAAK,GAAG;CACrC,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK;CAChC,MAAM,SAAS,MAAM,oBAAoB,IAAI;CAC7C,IAAI,WAAW,KAAA,GAAW;EACxB,KAAK,QAAQ,MAAM,EAAE,KAAK,KAAK,IAAI,GAAG,8CAA8C;EACpF,OAAO;CACT;CACA,IAAI;EACF,OAAO,MAAM,oBAAoB,KAAK,OAAO,MAAM,GAAG,QAAQ,MAAM,QAAQ,KAAK,MAAM;CACzF,SAAS,OAAO;EACd,KAAK,QAAQ,MAAM;GAAE,KAAK;GAAO,UAAU;EAAO,GAAG,iCAAiC;EACtF,MAAM;CACR;AACF"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import __tsdown_shims_path from 'node:path';
|
|
2
|
-
import __tsdown_shims_url from 'node:url';
|
|
3
|
-
import { CheckStatus } from "../git-host.mjs";
|
|
4
|
-
//#region src/adapters/git-host/helpers.d.ts
|
|
5
|
-
/** Human description for a check status — shared across GitHub/GitLab. */
|
|
6
|
-
declare function describeStatus(status: CheckStatus): string;
|
|
7
|
-
/** Markdown comment body helpers — single comment per build, idempotent via marker. */
|
|
8
|
-
declare function commentMarker(url: string): string;
|
|
9
|
-
/** Build the Markdown body for a StoryShelf status comment. */
|
|
10
|
-
declare function buildCommentMarkdown(status: CheckStatus, url: string, context: string): string;
|
|
11
|
-
//#endregion
|
|
12
|
-
export { buildCommentMarkdown, commentMarker, describeStatus };
|
|
13
|
-
//# sourceMappingURL=helpers.d.mts.map
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import "node:path";
|
|
2
|
-
import "node:url";
|
|
3
|
-
import.meta.url;
|
|
4
|
-
//#region src/adapters/git-host/helpers.ts
|
|
5
|
-
/** Human description for a check status — shared across GitHub/GitLab. */
|
|
6
|
-
function describeStatus(status) {
|
|
7
|
-
switch (status) {
|
|
8
|
-
case "pending": return "Visual tests pending";
|
|
9
|
-
case "success": return "Visual tests passed";
|
|
10
|
-
case "failure": return "Visual changes detected or tests failed";
|
|
11
|
-
default: return "Visual changes detected or tests failed";
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
/** Markdown comment body helpers — single comment per build, idempotent via marker. */
|
|
15
|
-
function commentMarker(url) {
|
|
16
|
-
return `<!-- storyshelf:${url} -->`;
|
|
17
|
-
}
|
|
18
|
-
/** Build the Markdown body for a StoryShelf status comment. */
|
|
19
|
-
function buildCommentMarkdown(status, url, context) {
|
|
20
|
-
switch (status) {
|
|
21
|
-
case "pending": return `Visual tests pending for \`${context}\` — [View build](${url})`;
|
|
22
|
-
case "success": return `Visual tests passed for \`${context}\` — [View build](${url})`;
|
|
23
|
-
case "failure": return `Visual changes detected for \`${context}\` — [View build](${url})`;
|
|
24
|
-
default: return `Visual tests for \`${context}\` — [View build](${url})`;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
//#endregion
|
|
28
|
-
export { buildCommentMarkdown, commentMarker, describeStatus };
|
|
29
|
-
|
|
30
|
-
//# sourceMappingURL=helpers.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.mjs","names":[],"sources":["../../../src/adapters/git-host/helpers.ts"],"sourcesContent":["import type { CheckStatus } from \"./index.ts\";\n\n/** Human description for a check status — shared across GitHub/GitLab. */\nexport function describeStatus(status: CheckStatus): string {\n switch (status) {\n case \"pending\": {\n return \"Visual tests pending\";\n }\n case \"success\": {\n return \"Visual tests passed\";\n }\n case \"failure\": {\n return \"Visual changes detected or tests failed\";\n }\n default: {\n return \"Visual changes detected or tests failed\";\n }\n }\n}\n\n/** Markdown comment body helpers — single comment per build, idempotent via marker. */\nexport function commentMarker(url: string): string {\n return `<!-- storyshelf:${url} -->`;\n}\n\n/** Build the Markdown body for a StoryShelf status comment. */\nexport function buildCommentMarkdown(status: CheckStatus, url: string, context: string): string {\n switch (status) {\n case \"pending\": {\n return `Visual tests pending for \\`${context}\\` — [View build](${url})`;\n }\n case \"success\": {\n return `Visual tests passed for \\`${context}\\` — [View build](${url})`;\n }\n case \"failure\": {\n return `Visual changes detected for \\`${context}\\` — [View build](${url})`;\n }\n default: {\n return `Visual tests for \\`${context}\\` — [View build](${url})`;\n }\n }\n}\n"],"mappings":";;;;;AAGA,SAAgB,eAAe,QAA6B;CAC1D,QAAQ,QAAR;EACE,KAAK,WACH,OAAO;EAET,KAAK,WACH,OAAO;EAET,KAAK,WACH,OAAO;EAET,SACE,OAAO;CAEX;AACF;;AAGA,SAAgB,cAAc,KAAqB;CACjD,OAAO,mBAAmB,IAAI;AAChC;;AAGA,SAAgB,qBAAqB,QAAqB,KAAa,SAAyB;CAC9F,QAAQ,QAAR;EACE,KAAK,WACH,OAAO,8BAA8B,QAAQ,oBAAoB,IAAI;EAEvE,KAAK,WACH,OAAO,6BAA6B,QAAQ,oBAAoB,IAAI;EAEtE,KAAK,WACH,OAAO,iCAAiC,QAAQ,oBAAoB,IAAI;EAE1E,SACE,OAAO,sBAAsB,QAAQ,oBAAoB,IAAI;CAEjE;AACF"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import __tsdown_shims_path from 'node:path';
|
|
2
|
-
import __tsdown_shims_url from 'node:url';
|
|
3
|
-
import { Adapter, GitAdapterMetadata } from "./metadata.mjs";
|
|
4
|
-
import { Logger } from "pino";
|
|
5
|
-
//#region src/adapters/git-host/index.d.ts
|
|
6
|
-
/** Status of a git-host provider check. */
|
|
7
|
-
type CheckStatus = "pending" | "success" | "failure";
|
|
8
|
-
/** Descriptor — registered at startup, validates per-project config. */
|
|
9
|
-
interface GitHostProvider extends Adapter<GitAdapterMetadata> {
|
|
10
|
-
/** Create a configured instance bound to a project config + decrypted token. */
|
|
11
|
-
create(opts: {
|
|
12
|
-
config: unknown;
|
|
13
|
-
token: string;
|
|
14
|
-
logger?: Logger;
|
|
15
|
-
}): GitHostAdapter;
|
|
16
|
-
}
|
|
17
|
-
/** Runtime — bound to a project config + token, posts statuses/comments. */
|
|
18
|
-
interface GitHostAdapter extends Adapter<GitAdapterMetadata> {
|
|
19
|
-
/** Set the status of a commit. */
|
|
20
|
-
setStatus(opts: {
|
|
21
|
-
context: string;
|
|
22
|
-
gitSha: string;
|
|
23
|
-
status: CheckStatus;
|
|
24
|
-
url: string;
|
|
25
|
-
}): Promise<void>;
|
|
26
|
-
/** Whether the branch/sha is already merged — gate to skip capture. */
|
|
27
|
-
isMerged?(opts: {
|
|
28
|
-
sha: string;
|
|
29
|
-
branch: string;
|
|
30
|
-
}): Promise<boolean>;
|
|
31
|
-
/** Create or update a single PR comment per build (idempotent via url marker). */
|
|
32
|
-
upsertComment?(opts: {
|
|
33
|
-
prNumber?: number;
|
|
34
|
-
sha: string;
|
|
35
|
-
url: string;
|
|
36
|
-
status: CheckStatus;
|
|
37
|
-
markdown: string;
|
|
38
|
-
}): Promise<string>;
|
|
39
|
-
}
|
|
40
|
-
//#endregion
|
|
41
|
-
export { CheckStatus, GitHostAdapter, GitHostProvider };
|
|
42
|
-
//# sourceMappingURL=git-host.d.mts.map
|
package/dist/capture/queue.d.mts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import __tsdown_shims_path from 'node:path';
|
|
2
|
-
import __tsdown_shims_url from 'node:url';
|
|
3
|
-
import { CaptureJob, CaptureQueue, QueueEntry } from "../adapter/capture-queue.mjs";
|
|
4
|
-
import { Logger } from "pino";
|
|
5
|
-
//#region src/capture/queue.d.ts
|
|
6
|
-
/** Options for the in-process capture queue. */
|
|
7
|
-
interface InMemoryCaptureQueueOptions {
|
|
8
|
-
concurrency: number;
|
|
9
|
-
runJob: (job: CaptureJob) => Promise<void>;
|
|
10
|
-
logger?: Logger;
|
|
11
|
-
}
|
|
12
|
-
/** In-process capture queue with bounded concurrency. */
|
|
13
|
-
declare class InMemoryCaptureQueue implements CaptureQueue {
|
|
14
|
-
private readonly options;
|
|
15
|
-
readonly metadata: {
|
|
16
|
-
readonly name: "In-Memory Queue";
|
|
17
|
-
readonly version: string;
|
|
18
|
-
readonly description: "In-process capture queue";
|
|
19
|
-
readonly kind: "memory";
|
|
20
|
-
readonly category: "capture-queue";
|
|
21
|
-
};
|
|
22
|
-
private readonly entries;
|
|
23
|
-
private running;
|
|
24
|
-
private readonly waiting;
|
|
25
|
-
private readonly inFlight;
|
|
26
|
-
constructor(options: InMemoryCaptureQueueOptions);
|
|
27
|
-
enqueue(job: CaptureJob): Promise<void>;
|
|
28
|
-
status(buildId: string): Promise<QueueEntry | null>;
|
|
29
|
-
active(): Promise<QueueEntry[]>;
|
|
30
|
-
recent(limit: number): Promise<QueueEntry[]>;
|
|
31
|
-
private process;
|
|
32
|
-
private log;
|
|
33
|
-
private track;
|
|
34
|
-
private acquire;
|
|
35
|
-
}
|
|
36
|
-
//#endregion
|
|
37
|
-
export { InMemoryCaptureQueue, InMemoryCaptureQueueOptions };
|
|
38
|
-
//# sourceMappingURL=queue.d.mts.map
|
package/dist/capture/queue.mjs
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import "node:path";
|
|
2
|
-
import "node:url";
|
|
3
|
-
import.meta.url;
|
|
4
|
-
//#region src/capture/queue.ts
|
|
5
|
-
/** In-process capture queue with bounded concurrency. */
|
|
6
|
-
var InMemoryCaptureQueue = class {
|
|
7
|
-
options;
|
|
8
|
-
metadata = {
|
|
9
|
-
name: "In-Memory Queue",
|
|
10
|
-
version: globalThis.__PKG_VERSION__ ?? "0.0.0",
|
|
11
|
-
description: "In-process capture queue",
|
|
12
|
-
kind: "memory",
|
|
13
|
-
category: "capture-queue"
|
|
14
|
-
};
|
|
15
|
-
entries = /* @__PURE__ */ new Map();
|
|
16
|
-
running = 0;
|
|
17
|
-
waiting = [];
|
|
18
|
-
inFlight = /* @__PURE__ */ new Map();
|
|
19
|
-
constructor(options) {
|
|
20
|
-
this.options = options;
|
|
21
|
-
}
|
|
22
|
-
async enqueue(job) {
|
|
23
|
-
const entry = this.track(job.buildId);
|
|
24
|
-
this.log(job)?.info("capture queued");
|
|
25
|
-
this.inFlight.set(job.buildId, this.process(job, entry));
|
|
26
|
-
await Promise.resolve();
|
|
27
|
-
}
|
|
28
|
-
async status(buildId) {
|
|
29
|
-
return await Promise.resolve(this.entries.get(buildId) ?? null);
|
|
30
|
-
}
|
|
31
|
-
async active() {
|
|
32
|
-
return await Promise.resolve([...this.entries.values()].filter((entry) => entry.status === "queued" || entry.status === "running").toSorted((a, b) => a.queuedAt.localeCompare(b.queuedAt)));
|
|
33
|
-
}
|
|
34
|
-
async recent(limit) {
|
|
35
|
-
return await Promise.resolve([...this.entries.values()].toSorted((a, b) => b.queuedAt.localeCompare(a.queuedAt)).slice(0, limit));
|
|
36
|
-
}
|
|
37
|
-
async process(job, entry) {
|
|
38
|
-
const log = this.log(job);
|
|
39
|
-
await this.acquire();
|
|
40
|
-
entry.status = "running";
|
|
41
|
-
entry.startedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
42
|
-
log?.info("capture started");
|
|
43
|
-
try {
|
|
44
|
-
await this.options.runJob(job);
|
|
45
|
-
} catch (error) {
|
|
46
|
-
entry.status = "failed";
|
|
47
|
-
entry.finishedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
48
|
-
entry.error = error instanceof Error ? error.message : "Capture failed";
|
|
49
|
-
log?.error({ err: error }, "capture failed");
|
|
50
|
-
} finally {
|
|
51
|
-
this.running -= 1;
|
|
52
|
-
this.waiting.shift()?.();
|
|
53
|
-
if (entry.status !== "failed") {
|
|
54
|
-
entry.status = "completed";
|
|
55
|
-
entry.finishedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
56
|
-
log?.info("capture completed");
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
log(job) {
|
|
61
|
-
return this.options.logger?.child({
|
|
62
|
-
buildId: job.buildId,
|
|
63
|
-
reqId: job.reqId
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
track(buildId) {
|
|
67
|
-
const existing = this.entries.get(buildId);
|
|
68
|
-
if (existing) {
|
|
69
|
-
existing.status = "queued";
|
|
70
|
-
existing.queuedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
71
|
-
existing.startedAt = void 0;
|
|
72
|
-
existing.finishedAt = void 0;
|
|
73
|
-
existing.error = void 0;
|
|
74
|
-
return existing;
|
|
75
|
-
}
|
|
76
|
-
const entry = {
|
|
77
|
-
buildId,
|
|
78
|
-
status: "queued",
|
|
79
|
-
queuedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
80
|
-
};
|
|
81
|
-
this.entries.set(buildId, entry);
|
|
82
|
-
return entry;
|
|
83
|
-
}
|
|
84
|
-
async acquire() {
|
|
85
|
-
if (this.running < this.options.concurrency) {
|
|
86
|
-
this.running += 1;
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
await new Promise((resolve) => {
|
|
90
|
-
this.waiting.push(resolve);
|
|
91
|
-
});
|
|
92
|
-
await this.acquire();
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
//#endregion
|
|
96
|
-
export { InMemoryCaptureQueue };
|
|
97
|
-
|
|
98
|
-
//# sourceMappingURL=queue.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"queue.mjs","names":[],"sources":["../../src/capture/queue.ts"],"sourcesContent":["import type { Logger } from \"pino\";\nimport type { CaptureJob, CaptureQueue, QueueEntry } from \"../adapters/capture-queue.ts\";\n\ndeclare const __PKG_VERSION__: string | undefined;\n\n/** Options for the in-process capture queue. */\nexport interface InMemoryCaptureQueueOptions {\n concurrency: number;\n runJob: (job: CaptureJob) => Promise<void>;\n logger?: Logger;\n}\n/** In-process capture queue with bounded concurrency. */\nexport class InMemoryCaptureQueue implements CaptureQueue {\n readonly metadata = {\n name: \"In-Memory Queue\",\n version: (globalThis as unknown as { __PKG_VERSION__?: string }).__PKG_VERSION__ ?? \"0.0.0\",\n description: \"In-process capture queue\",\n kind: \"memory\",\n category: \"capture-queue\",\n } as const;\n\n private readonly entries = new Map<string, QueueEntry>();\n private running = 0;\n private readonly waiting: (() => void)[] = [];\n private readonly inFlight = new Map<string, Promise<void>>();\n\n constructor(private readonly options: InMemoryCaptureQueueOptions) {}\n\n async enqueue(job: CaptureJob): Promise<void> {\n const entry = this.track(job.buildId);\n this.log(job)?.info(\"capture queued\");\n this.inFlight.set(job.buildId, this.process(job, entry));\n await Promise.resolve();\n }\n\n async status(buildId: string): Promise<QueueEntry | null> {\n return await Promise.resolve(this.entries.get(buildId) ?? null);\n }\n\n async active(): Promise<QueueEntry[]> {\n return await Promise.resolve(\n [...this.entries.values()]\n .filter((entry) => entry.status === \"queued\" || entry.status === \"running\")\n .toSorted((a, b) => a.queuedAt.localeCompare(b.queuedAt)),\n );\n }\n\n async recent(limit: number): Promise<QueueEntry[]> {\n return await Promise.resolve(\n [...this.entries.values()]\n .toSorted((a, b) => b.queuedAt.localeCompare(a.queuedAt))\n .slice(0, limit),\n );\n }\n\n private async process(job: CaptureJob, entry: QueueEntry): Promise<void> {\n const log = this.log(job);\n await this.acquire();\n entry.status = \"running\";\n entry.startedAt = new Date().toISOString();\n log?.info(\"capture started\");\n try {\n await this.options.runJob(job);\n } catch (error) {\n entry.status = \"failed\";\n entry.finishedAt = new Date().toISOString();\n entry.error = error instanceof Error ? error.message : \"Capture failed\";\n log?.error({ err: error }, \"capture failed\");\n } finally {\n this.running -= 1;\n this.waiting.shift()?.();\n if (entry.status !== \"failed\") {\n entry.status = \"completed\";\n entry.finishedAt = new Date().toISOString();\n log?.info(\"capture completed\");\n }\n }\n }\n\n private log(job: CaptureJob): Logger | undefined {\n return this.options.logger?.child({ buildId: job.buildId, reqId: job.reqId });\n }\n\n private track(buildId: string): QueueEntry {\n const existing = this.entries.get(buildId);\n if (existing) {\n existing.status = \"queued\";\n existing.queuedAt = new Date().toISOString();\n existing.startedAt = undefined;\n existing.finishedAt = undefined;\n existing.error = undefined;\n return existing;\n }\n const entry: QueueEntry = { buildId, status: \"queued\", queuedAt: new Date().toISOString() };\n this.entries.set(buildId, entry);\n return entry;\n }\n\n private async acquire(): Promise<void> {\n if (this.running < this.options.concurrency) {\n this.running += 1;\n return;\n }\n await new Promise<void>((resolve) => {\n this.waiting.push(resolve);\n });\n await this.acquire();\n }\n}\n"],"mappings":";;;;;AAYA,IAAa,uBAAb,MAA0D;CAc3B;CAb7B,WAAoB;EAClB,MAAM;EACN,SAAU,WAAuD,mBAAmB;EACpF,aAAa;EACb,MAAM;EACN,UAAU;CACZ;CAEA,0BAA2B,IAAI,IAAwB;CACvD,UAAkB;CAClB,UAA2C,CAAC;CAC5C,2BAA4B,IAAI,IAA2B;CAE3D,YAAY,SAAuD;EAAtC,KAAA,UAAA;CAAuC;CAEpE,MAAM,QAAQ,KAAgC;EAC5C,MAAM,QAAQ,KAAK,MAAM,IAAI,OAAO;EACpC,KAAK,IAAI,GAAG,CAAC,EAAE,KAAK,gBAAgB;EACpC,KAAK,SAAS,IAAI,IAAI,SAAS,KAAK,QAAQ,KAAK,KAAK,CAAC;EACvD,MAAM,QAAQ,QAAQ;CACxB;CAEA,MAAM,OAAO,SAA6C;EACxD,OAAO,MAAM,QAAQ,QAAQ,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;CAChE;CAEA,MAAM,SAAgC;EACpC,OAAO,MAAM,QAAQ,QACnB,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,CAAC,CACvB,QAAQ,UAAU,MAAM,WAAW,YAAY,MAAM,WAAW,SAAS,CAAC,CAC1E,UAAU,GAAG,MAAM,EAAE,SAAS,cAAc,EAAE,QAAQ,CAAC,CAC5D;CACF;CAEA,MAAM,OAAO,OAAsC;EACjD,OAAO,MAAM,QAAQ,QACnB,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,CAAC,CACvB,UAAU,GAAG,MAAM,EAAE,SAAS,cAAc,EAAE,QAAQ,CAAC,CAAC,CACxD,MAAM,GAAG,KAAK,CACnB;CACF;CAEA,MAAc,QAAQ,KAAiB,OAAkC;EACvE,MAAM,MAAM,KAAK,IAAI,GAAG;EACxB,MAAM,KAAK,QAAQ;EACnB,MAAM,SAAS;EACf,MAAM,6BAAY,IAAI,KAAK,EAAA,CAAE,YAAY;EACzC,KAAK,KAAK,iBAAiB;EAC3B,IAAI;GACF,MAAM,KAAK,QAAQ,OAAO,GAAG;EAC/B,SAAS,OAAO;GACd,MAAM,SAAS;GACf,MAAM,8BAAa,IAAI,KAAK,EAAA,CAAE,YAAY;GAC1C,MAAM,QAAQ,iBAAiB,QAAQ,MAAM,UAAU;GACvD,KAAK,MAAM,EAAE,KAAK,MAAM,GAAG,gBAAgB;EAC7C,UAAU;GACR,KAAK,WAAW;GAChB,KAAK,QAAQ,MAAM,CAAC,GAAG;GACvB,IAAI,MAAM,WAAW,UAAU;IAC7B,MAAM,SAAS;IACf,MAAM,8BAAa,IAAI,KAAK,EAAA,CAAE,YAAY;IAC1C,KAAK,KAAK,mBAAmB;GAC/B;EACF;CACF;CAEA,IAAY,KAAqC;EAC/C,OAAO,KAAK,QAAQ,QAAQ,MAAM;GAAE,SAAS,IAAI;GAAS,OAAO,IAAI;EAAM,CAAC;CAC9E;CAEA,MAAc,SAA6B;EACzC,MAAM,WAAW,KAAK,QAAQ,IAAI,OAAO;EACzC,IAAI,UAAU;GACZ,SAAS,SAAS;GAClB,SAAS,4BAAW,IAAI,KAAK,EAAA,CAAE,YAAY;GAC3C,SAAS,YAAY,KAAA;GACrB,SAAS,aAAa,KAAA;GACtB,SAAS,QAAQ,KAAA;GACjB,OAAO;EACT;EACA,MAAM,QAAoB;GAAE;GAAS,QAAQ;GAAU,2BAAU,IAAI,KAAK,EAAA,CAAE,YAAY;EAAE;EAC1F,KAAK,QAAQ,IAAI,SAAS,KAAK;EAC/B,OAAO;CACT;CAEA,MAAc,UAAyB;EACrC,IAAI,KAAK,UAAU,KAAK,QAAQ,aAAa;GAC3C,KAAK,WAAW;GAChB;EACF;EACA,MAAM,IAAI,SAAe,YAAY;GACnC,KAAK,QAAQ,KAAK,OAAO;EAC3B,CAAC;EACD,MAAM,KAAK,QAAQ;CACrB;AACF"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import __tsdown_shims_path from 'node:path';
|
|
2
|
-
import __tsdown_shims_url from 'node:url';
|
|
3
|
-
import { DispatchDeps } from "./dispatch.mjs";
|
|
4
|
-
//#region src/capture/recovery.d.ts
|
|
5
|
-
/** Error recorded on attempts that a restart cut short; also the requeue-once marker. */
|
|
6
|
-
declare const INTERRUPTED_ERROR = "Interrupted by server restart";
|
|
7
|
-
/** Outcome of one recovery sweep. */
|
|
8
|
-
interface RecoveryResult {
|
|
9
|
-
requeued: string[];
|
|
10
|
-
failed: string[];
|
|
11
|
-
}
|
|
12
|
-
/** Inputs for {@link recoverStuckCaptures}. */
|
|
13
|
-
interface RecoveryDeps {
|
|
14
|
-
deps: DispatchDeps;
|
|
15
|
-
enqueue: (buildId: string) => Promise<void>;
|
|
16
|
-
}
|
|
17
|
-
/** Requeue (once) or fail every build still `capturing`; call once at boot, before serving jobs. */
|
|
18
|
-
declare function recoverStuckCaptures(recovery: RecoveryDeps): Promise<RecoveryResult>;
|
|
19
|
-
//#endregion
|
|
20
|
-
export { INTERRUPTED_ERROR, RecoveryDeps, RecoveryResult, recoverStuckCaptures };
|
|
21
|
-
//# sourceMappingURL=recovery.d.mts.map
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import "node:path";
|
|
2
|
-
import "node:url";
|
|
3
|
-
import.meta.url;
|
|
4
|
-
import { BuildModel } from "../models/build.mjs";
|
|
5
|
-
import { CaptureAttemptModel } from "../models/capture-attempt.mjs";
|
|
6
|
-
import { ProjectModel } from "../models/project.mjs";
|
|
7
|
-
import { postStatusesForBuild } from "./status-fanout.mjs";
|
|
8
|
-
import { eq, getTableColumns } from "drizzle-orm";
|
|
9
|
-
//#region src/capture/recovery.ts
|
|
10
|
-
/**
|
|
11
|
-
* Boot-time recovery for builds left in `capturing` by a server restart.
|
|
12
|
-
*
|
|
13
|
-
* Policy: requeue once. The interrupted attempt is closed with
|
|
14
|
-
* {@link INTERRUPTED_ERROR}; a build with no earlier interrupted attempt goes back to `pending`
|
|
15
|
-
* and is re-enqueued, otherwise it is marked `failed` for manual retry. A build is failed instead
|
|
16
|
-
* when the run before the interrupted one was itself interrupted, so a crash loop stops after
|
|
17
|
-
* one requeue while manual retries stay unrestricted. In-process queues only: remote queues redeliver on their own.
|
|
18
|
-
*/
|
|
19
|
-
/** Error recorded on attempts that a restart cut short; also the requeue-once marker. */
|
|
20
|
-
const INTERRUPTED_ERROR = "Interrupted by server restart";
|
|
21
|
-
/** Requeue (once) or fail every build still `capturing`; call once at boot, before serving jobs. */
|
|
22
|
-
async function recoverStuckCaptures(recovery) {
|
|
23
|
-
const { deps } = recovery;
|
|
24
|
-
const stuck = await deps.db.list(deps.tables.builds, { where: eq(getTableColumns(deps.tables.builds)["status"], "capturing") });
|
|
25
|
-
const outcomes = await Promise.all(stuck.map(async (build) => await recoverBuild(recovery, build)));
|
|
26
|
-
const result = {
|
|
27
|
-
requeued: stuck.filter((_, index) => outcomes[index]).map((build) => build.id),
|
|
28
|
-
failed: stuck.filter((_, index) => !outcomes[index]).map((build) => build.id)
|
|
29
|
-
};
|
|
30
|
-
if (stuck.length > 0) deps.logger.warn({
|
|
31
|
-
requeued: result.requeued,
|
|
32
|
-
failed: result.failed
|
|
33
|
-
}, "recovered builds interrupted by restart");
|
|
34
|
-
return result;
|
|
35
|
-
}
|
|
36
|
-
/** Recover one build; returns true when it was requeued. */
|
|
37
|
-
async function recoverBuild(recovery, build) {
|
|
38
|
-
const { deps } = recovery;
|
|
39
|
-
const attempts = new CaptureAttemptModel(deps.db, deps.tables);
|
|
40
|
-
const history = await attempts.listByBuild(build.id);
|
|
41
|
-
const open = history.filter((a) => a.status === "queued" || a.status === "running");
|
|
42
|
-
const lastClosed = history.findLast((a) => !open.includes(a));
|
|
43
|
-
await Promise.all(open.map(async (a) => await attempts.markFinished(a.id, "failed", INTERRUPTED_ERROR)));
|
|
44
|
-
return lastClosed?.error === "Interrupted by server restart" ? await failInterrupted(deps, build) : await requeueInterrupted(recovery, build);
|
|
45
|
-
}
|
|
46
|
-
async function failInterrupted(deps, build) {
|
|
47
|
-
await new BuildModel(deps.db, deps.tables).setStatus(build.id, "failed");
|
|
48
|
-
await postFailure(deps, build);
|
|
49
|
-
deps.logger.error({ buildId: build.id }, "build interrupted by restart again; marked failed for manual retry");
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
async function requeueInterrupted(recovery, build) {
|
|
53
|
-
const { deps } = recovery;
|
|
54
|
-
await new BuildModel(deps.db, deps.tables).setStatus(build.id, "pending");
|
|
55
|
-
await recovery.enqueue(build.id);
|
|
56
|
-
deps.logger.warn({ buildId: build.id }, "build interrupted by restart; requeued once");
|
|
57
|
-
return true;
|
|
58
|
-
}
|
|
59
|
-
/** Replace the lingering pending git status with a failure. */
|
|
60
|
-
async function postFailure(deps, build) {
|
|
61
|
-
const project = await new ProjectModel(deps.db, deps.tables).get(build.projectId);
|
|
62
|
-
if (!project) return;
|
|
63
|
-
await postStatusesForBuild({
|
|
64
|
-
db: deps.db,
|
|
65
|
-
tables: deps.tables,
|
|
66
|
-
project,
|
|
67
|
-
sha: build.gitSha,
|
|
68
|
-
status: "failure",
|
|
69
|
-
url: `/projects/${project.slug}/builds/${build.id}`,
|
|
70
|
-
providers: deps.gitHosts,
|
|
71
|
-
secret: deps.secret,
|
|
72
|
-
logger: deps.logger
|
|
73
|
-
}).catch((error) => {
|
|
74
|
-
deps.logger.error({
|
|
75
|
-
err: error,
|
|
76
|
-
buildId: build.id
|
|
77
|
-
}, "failed to post failure status");
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
//#endregion
|
|
81
|
-
export { INTERRUPTED_ERROR, recoverStuckCaptures };
|
|
82
|
-
|
|
83
|
-
//# sourceMappingURL=recovery.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.mjs","names":[],"sources":["../../src/capture/recovery.ts"],"sourcesContent":["/**\n * Boot-time recovery for builds left in `capturing` by a server restart.\n *\n * Policy: requeue once. The interrupted attempt is closed with\n * {@link INTERRUPTED_ERROR}; a build with no earlier interrupted attempt goes back to `pending`\n * and is re-enqueued, otherwise it is marked `failed` for manual retry. A build is failed instead\n * when the run before the interrupted one was itself interrupted, so a crash loop stops after\n * one requeue while manual retries stay unrestricted. In-process queues only: remote queues redeliver on their own.\n */\nimport { eq, getTableColumns } from \"drizzle-orm\";\nimport type { SQLWrapper } from \"drizzle-orm\";\nimport { BuildModel } from \"../models/build.ts\";\nimport { CaptureAttemptModel } from \"../models/capture-attempt.ts\";\nimport { ProjectModel } from \"../models/project.ts\";\nimport type { Build } from \"../schema/build.ts\";\nimport type { DispatchDeps } from \"./dispatch.ts\";\nimport { postStatusesForBuild } from \"./status-fanout.ts\";\n\n/** Error recorded on attempts that a restart cut short; also the requeue-once marker. */\nexport const INTERRUPTED_ERROR = \"Interrupted by server restart\";\n\n/** Outcome of one recovery sweep. */\nexport interface RecoveryResult {\n requeued: string[];\n failed: string[];\n}\n\n/** Inputs for {@link recoverStuckCaptures}. */\nexport interface RecoveryDeps {\n deps: DispatchDeps;\n enqueue: (buildId: string) => Promise<void>;\n}\n\n/** Requeue (once) or fail every build still `capturing`; call once at boot, before serving jobs. */\nexport async function recoverStuckCaptures(recovery: RecoveryDeps): Promise<RecoveryResult> {\n const { deps } = recovery;\n const stuck = (await deps.db.list(deps.tables.builds, {\n where: eq(getTableColumns(deps.tables.builds)[\"status\"] as unknown as SQLWrapper, \"capturing\"),\n })) as unknown as Build[];\n const outcomes = await Promise.all(\n stuck.map(async (build) => await recoverBuild(recovery, build)),\n );\n const result: RecoveryResult = {\n requeued: stuck.filter((_, index) => outcomes[index]).map((build) => build.id),\n failed: stuck.filter((_, index) => !outcomes[index]).map((build) => build.id),\n };\n if (stuck.length > 0) {\n deps.logger.warn(\n { requeued: result.requeued, failed: result.failed },\n \"recovered builds interrupted by restart\",\n );\n }\n return result;\n}\n\n/** Recover one build; returns true when it was requeued. */\nasync function recoverBuild(recovery: RecoveryDeps, build: Build): Promise<boolean> {\n const { deps } = recovery;\n const attempts = new CaptureAttemptModel(deps.db, deps.tables);\n const history = await attempts.listByBuild(build.id);\n const open = history.filter((a) => a.status === \"queued\" || a.status === \"running\");\n // Requeue-once: the run before the interrupted one was itself interrupted => crash loop.\n const lastClosed = history.findLast((a) => !open.includes(a));\n await Promise.all(\n open.map(async (a) => await attempts.markFinished(a.id, \"failed\", INTERRUPTED_ERROR)),\n );\n return lastClosed?.error === INTERRUPTED_ERROR\n ? await failInterrupted(deps, build)\n : await requeueInterrupted(recovery, build);\n}\n\nasync function failInterrupted(deps: DispatchDeps, build: Build): Promise<false> {\n await new BuildModel(deps.db, deps.tables).setStatus(build.id, \"failed\");\n await postFailure(deps, build);\n deps.logger.error(\n { buildId: build.id },\n \"build interrupted by restart again; marked failed for manual retry\",\n );\n return false;\n}\n\nasync function requeueInterrupted(recovery: RecoveryDeps, build: Build): Promise<true> {\n const { deps } = recovery;\n await new BuildModel(deps.db, deps.tables).setStatus(build.id, \"pending\");\n await recovery.enqueue(build.id);\n deps.logger.warn({ buildId: build.id }, \"build interrupted by restart; requeued once\");\n return true;\n}\n\n/** Replace the lingering pending git status with a failure. */\nasync function postFailure(deps: DispatchDeps, build: Build): Promise<void> {\n const project = await new ProjectModel(deps.db, deps.tables).get(build.projectId);\n if (!project) {\n return;\n }\n await postStatusesForBuild({\n db: deps.db,\n tables: deps.tables,\n project,\n sha: build.gitSha,\n status: \"failure\",\n url: `/projects/${project.slug}/builds/${build.id}`,\n providers: deps.gitHosts,\n secret: deps.secret,\n logger: deps.logger,\n }).catch((error: unknown) => {\n deps.logger.error({ err: error, buildId: build.id }, \"failed to post failure status\");\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA,MAAa,oBAAoB;;AAejC,eAAsB,qBAAqB,UAAiD;CAC1F,MAAM,EAAE,SAAS;CACjB,MAAM,QAAS,MAAM,KAAK,GAAG,KAAK,KAAK,OAAO,QAAQ,EACpD,OAAO,GAAG,gBAAgB,KAAK,OAAO,MAAM,CAAC,CAAC,WAAoC,WAAW,EAC/F,CAAC;CACD,MAAM,WAAW,MAAM,QAAQ,IAC7B,MAAM,IAAI,OAAO,UAAU,MAAM,aAAa,UAAU,KAAK,CAAC,CAChE;CACA,MAAM,SAAyB;EAC7B,UAAU,MAAM,QAAQ,GAAG,UAAU,SAAS,MAAM,CAAC,CAAC,KAAK,UAAU,MAAM,EAAE;EAC7E,QAAQ,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,MAAM,CAAC,CAAC,KAAK,UAAU,MAAM,EAAE;CAC9E;CACA,IAAI,MAAM,SAAS,GACjB,KAAK,OAAO,KACV;EAAE,UAAU,OAAO;EAAU,QAAQ,OAAO;CAAO,GACnD,yCACF;CAEF,OAAO;AACT;;AAGA,eAAe,aAAa,UAAwB,OAAgC;CAClF,MAAM,EAAE,SAAS;CACjB,MAAM,WAAW,IAAI,oBAAoB,KAAK,IAAI,KAAK,MAAM;CAC7D,MAAM,UAAU,MAAM,SAAS,YAAY,MAAM,EAAE;CACnD,MAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE,WAAW,YAAY,EAAE,WAAW,SAAS;CAElF,MAAM,aAAa,QAAQ,UAAU,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC;CAC5D,MAAM,QAAQ,IACZ,KAAK,IAAI,OAAO,MAAM,MAAM,SAAS,aAAa,EAAE,IAAI,UAAU,iBAAiB,CAAC,CACtF;CACA,OAAO,YAAY,UAAA,kCACf,MAAM,gBAAgB,MAAM,KAAK,IACjC,MAAM,mBAAmB,UAAU,KAAK;AAC9C;AAEA,eAAe,gBAAgB,MAAoB,OAA8B;CAC/E,MAAM,IAAI,WAAW,KAAK,IAAI,KAAK,MAAM,CAAC,CAAC,UAAU,MAAM,IAAI,QAAQ;CACvE,MAAM,YAAY,MAAM,KAAK;CAC7B,KAAK,OAAO,MACV,EAAE,SAAS,MAAM,GAAG,GACpB,oEACF;CACA,OAAO;AACT;AAEA,eAAe,mBAAmB,UAAwB,OAA6B;CACrF,MAAM,EAAE,SAAS;CACjB,MAAM,IAAI,WAAW,KAAK,IAAI,KAAK,MAAM,CAAC,CAAC,UAAU,MAAM,IAAI,SAAS;CACxE,MAAM,SAAS,QAAQ,MAAM,EAAE;CAC/B,KAAK,OAAO,KAAK,EAAE,SAAS,MAAM,GAAG,GAAG,6CAA6C;CACrF,OAAO;AACT;;AAGA,eAAe,YAAY,MAAoB,OAA6B;CAC1E,MAAM,UAAU,MAAM,IAAI,aAAa,KAAK,IAAI,KAAK,MAAM,CAAC,CAAC,IAAI,MAAM,SAAS;CAChF,IAAI,CAAC,SACH;CAEF,MAAM,qBAAqB;EACzB,IAAI,KAAK;EACT,QAAQ,KAAK;EACb;EACA,KAAK,MAAM;EACX,QAAQ;EACR,KAAK,aAAa,QAAQ,KAAK,UAAU,MAAM;EAC/C,WAAW,KAAK;EAChB,QAAQ,KAAK;EACb,QAAQ,KAAK;CACf,CAAC,CAAC,CAAC,OAAO,UAAmB;EAC3B,KAAK,OAAO,MAAM;GAAE,KAAK;GAAO,SAAS,MAAM;EAAG,GAAG,+BAA+B;CACtF,CAAC;AACH"}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import "node:path";
|
|
2
|
-
import "node:url";
|
|
3
|
-
import.meta.url;
|
|
4
|
-
import { buildCommentMarkdown } from "../adapter/git-host/helpers.mjs";
|
|
5
|
-
import { StatusConfigModel } from "../models/status-config.mjs";
|
|
6
|
-
import { LOCAL_SHA_PREFIX } from "@storyshelf/affected";
|
|
7
|
-
//#region src/capture/status-fanout.ts
|
|
8
|
-
/** Post build check statuses (and review comments) to every configured git provider. */
|
|
9
|
-
async function postStatusesForBuild(opts) {
|
|
10
|
-
if (opts.providers.length === 0) return;
|
|
11
|
-
if (opts.sha.startsWith(LOCAL_SHA_PREFIX)) {
|
|
12
|
-
opts.logger?.info({ sha: opts.sha }, "skipping git provider status for synthetic local identity");
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
const model = new StatusConfigModel(opts.db, opts.tables, opts.secret);
|
|
16
|
-
const rows = await model.list(opts.project.id);
|
|
17
|
-
const ctx = `storyshelf/${opts.project.slug}`;
|
|
18
|
-
await Promise.allSettled(rows.map(async (row) => {
|
|
19
|
-
const provider = opts.providers.find((p) => p.metadata.kind === row.provider);
|
|
20
|
-
if (!provider) {
|
|
21
|
-
opts.logger?.warn({ provider: row.provider }, "no provider registered for status config");
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
let parsed;
|
|
25
|
-
try {
|
|
26
|
-
parsed = JSON.parse(row.config);
|
|
27
|
-
provider.metadata.schema.parse(parsed);
|
|
28
|
-
} catch (error) {
|
|
29
|
-
opts.logger?.warn({
|
|
30
|
-
err: error,
|
|
31
|
-
provider: row.provider
|
|
32
|
-
}, "invalid status config");
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
let token;
|
|
36
|
-
try {
|
|
37
|
-
token = model.decryptToken(row);
|
|
38
|
-
} catch (error) {
|
|
39
|
-
opts.logger?.warn({ err: error }, "failed to decrypt status token");
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
const adapter = provider.create({
|
|
43
|
-
config: parsed,
|
|
44
|
-
token,
|
|
45
|
-
logger: opts.logger
|
|
46
|
-
});
|
|
47
|
-
await adapter.setStatus({
|
|
48
|
-
context: ctx,
|
|
49
|
-
gitSha: opts.sha,
|
|
50
|
-
status: opts.status,
|
|
51
|
-
url: opts.url
|
|
52
|
-
});
|
|
53
|
-
if (adapter.upsertComment) {
|
|
54
|
-
const markdown = buildCommentMarkdown(opts.status, opts.url, ctx);
|
|
55
|
-
await adapter.upsertComment({
|
|
56
|
-
sha: opts.sha,
|
|
57
|
-
url: opts.url,
|
|
58
|
-
status: opts.status,
|
|
59
|
-
markdown
|
|
60
|
-
}).catch((error) => {
|
|
61
|
-
opts.logger?.warn({
|
|
62
|
-
err: error,
|
|
63
|
-
provider: row.provider
|
|
64
|
-
}, "failed to upsert comment");
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
}));
|
|
68
|
-
}
|
|
69
|
-
//#endregion
|
|
70
|
-
export { postStatusesForBuild };
|
|
71
|
-
|
|
72
|
-
//# sourceMappingURL=status-fanout.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status-fanout.mjs","names":[],"sources":["../../src/capture/status-fanout.ts"],"sourcesContent":["import { LOCAL_SHA_PREFIX } from \"@storyshelf/affected\";\nimport type { Logger } from \"pino\";\nimport type { DatabaseAdapter } from \"../adapters/database.ts\";\nimport { buildCommentMarkdown } from \"../adapters/git-host/helpers.ts\";\nimport type { CheckStatus, GitHostProvider } from \"../adapters/git-host/index.ts\";\nimport { StatusConfigModel, type StatusConfigTables } from \"../models/status-config.ts\";\nimport type { Project } from \"../schema/project.ts\";\nimport type { SecretInput } from \"../utils/encrypt.ts\";\n\n/** Post build check statuses (and review comments) to every configured git provider. */\nasync function postStatusesForBuild(opts: {\n db: DatabaseAdapter;\n tables: StatusConfigTables;\n project: Project;\n sha: string;\n status: CheckStatus;\n url: string;\n providers: GitHostProvider[];\n secret: SecretInput;\n logger?: Logger;\n}): Promise<void> {\n if (opts.providers.length === 0) {\n return;\n }\n if (opts.sha.startsWith(LOCAL_SHA_PREFIX)) {\n opts.logger?.info(\n { sha: opts.sha },\n \"skipping git provider status for synthetic local identity\",\n );\n return;\n }\n const model = new StatusConfigModel(opts.db, opts.tables, opts.secret);\n const rows = await model.list(opts.project.id);\n const ctx = `storyshelf/${opts.project.slug}`;\n await Promise.allSettled(\n rows.map(async (row) => {\n const provider = opts.providers.find((p) => p.metadata.kind === row.provider);\n if (!provider) {\n opts.logger?.warn({ provider: row.provider }, \"no provider registered for status config\");\n return;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(row.config);\n provider.metadata.schema.parse(parsed);\n } catch (error: unknown) {\n opts.logger?.warn({ err: error, provider: row.provider }, \"invalid status config\");\n return;\n }\n let token: string;\n try {\n token = model.decryptToken(row);\n } catch (error: unknown) {\n opts.logger?.warn({ err: error }, \"failed to decrypt status token\");\n return;\n }\n const adapter = provider.create({ config: parsed, token, logger: opts.logger });\n await adapter.setStatus({\n context: ctx,\n gitSha: opts.sha,\n status: opts.status,\n url: opts.url,\n });\n if (adapter.upsertComment) {\n const markdown = buildCommentMarkdown(opts.status, opts.url, ctx);\n await adapter\n .upsertComment({ sha: opts.sha, url: opts.url, status: opts.status, markdown })\n .catch((error: unknown) => {\n opts.logger?.warn({ err: error, provider: row.provider }, \"failed to upsert comment\");\n });\n }\n }),\n );\n}\n\nexport { postStatusesForBuild };\n"],"mappings":";;;;;;;;AAUA,eAAe,qBAAqB,MAUlB;CAChB,IAAI,KAAK,UAAU,WAAW,GAC5B;CAEF,IAAI,KAAK,IAAI,WAAW,gBAAgB,GAAG;EACzC,KAAK,QAAQ,KACX,EAAE,KAAK,KAAK,IAAI,GAChB,2DACF;EACA;CACF;CACA,MAAM,QAAQ,IAAI,kBAAkB,KAAK,IAAI,KAAK,QAAQ,KAAK,MAAM;CACrE,MAAM,OAAO,MAAM,MAAM,KAAK,KAAK,QAAQ,EAAE;CAC7C,MAAM,MAAM,cAAc,KAAK,QAAQ;CACvC,MAAM,QAAQ,WACZ,KAAK,IAAI,OAAO,QAAQ;EACtB,MAAM,WAAW,KAAK,UAAU,MAAM,MAAM,EAAE,SAAS,SAAS,IAAI,QAAQ;EAC5E,IAAI,CAAC,UAAU;GACb,KAAK,QAAQ,KAAK,EAAE,UAAU,IAAI,SAAS,GAAG,0CAA0C;GACxF;EACF;EACA,IAAI;EACJ,IAAI;GACF,SAAS,KAAK,MAAM,IAAI,MAAM;GAC9B,SAAS,SAAS,OAAO,MAAM,MAAM;EACvC,SAAS,OAAgB;GACvB,KAAK,QAAQ,KAAK;IAAE,KAAK;IAAO,UAAU,IAAI;GAAS,GAAG,uBAAuB;GACjF;EACF;EACA,IAAI;EACJ,IAAI;GACF,QAAQ,MAAM,aAAa,GAAG;EAChC,SAAS,OAAgB;GACvB,KAAK,QAAQ,KAAK,EAAE,KAAK,MAAM,GAAG,gCAAgC;GAClE;EACF;EACA,MAAM,UAAU,SAAS,OAAO;GAAE,QAAQ;GAAQ;GAAO,QAAQ,KAAK;EAAO,CAAC;EAC9E,MAAM,QAAQ,UAAU;GACtB,SAAS;GACT,QAAQ,KAAK;GACb,QAAQ,KAAK;GACb,KAAK,KAAK;EACZ,CAAC;EACD,IAAI,QAAQ,eAAe;GACzB,MAAM,WAAW,qBAAqB,KAAK,QAAQ,KAAK,KAAK,GAAG;GAChE,MAAM,QACH,cAAc;IAAE,KAAK,KAAK;IAAK,KAAK,KAAK;IAAK,QAAQ,KAAK;IAAQ;GAAS,CAAC,CAAC,CAC9E,OAAO,UAAmB;IACzB,KAAK,QAAQ,KAAK;KAAE,KAAK;KAAO,UAAU,IAAI;IAAS,GAAG,0BAA0B;GACtF,CAAC;EACL;CACF,CAAC,CACH;AACF"}
|
package/dist/diff/engine.d.mts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import __tsdown_shims_path from 'node:path';
|
|
2
|
-
import __tsdown_shims_url from 'node:url';
|
|
3
|
-
import { DiffOptions, DiffResult } from "./options.mjs";
|
|
4
|
-
//#region src/diff/engine.d.ts
|
|
5
|
-
/**
|
|
6
|
-
* Compare baseline and current screenshots, returning pass/fail and a diff image.
|
|
7
|
-
*
|
|
8
|
-
* @param baseline - Baseline PNG buffer.
|
|
9
|
-
* @param current - Current capture PNG buffer.
|
|
10
|
-
* @param options - Pixel threshold and ratio limits.
|
|
11
|
-
* @returns The diff result with pixel counts and an optional overlay image.
|
|
12
|
-
*/
|
|
13
|
-
declare function diffImages(baseline: Buffer, current: Buffer, options: DiffOptions): DiffResult;
|
|
14
|
-
//#endregion
|
|
15
|
-
export { diffImages };
|
|
16
|
-
//# sourceMappingURL=engine.d.mts.map
|