@crvouga/atlas 0.4.0 → 0.6.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/CHANGELOG.md +13 -1
- package/README.md +191 -611
- package/dist/bun/src/driver.d.ts +41 -7
- package/dist/bun/src/driver.js +47 -6
- package/dist/bun/src/index.d.ts +8 -0
- package/dist/bun/src/index.js +8 -0
- package/dist/core/src/cli.d.ts +14 -1
- package/dist/core/src/cli.js +35 -1
- package/dist/core/src/config.d.ts +77 -4
- package/dist/core/src/config.js +110 -17
- package/dist/core/src/events/cloudevents.d.ts +54 -9
- package/dist/core/src/events/cloudevents.js +60 -9
- package/dist/core/src/graph.d.ts +21 -0
- package/dist/core/src/graph.js +26 -0
- package/dist/core/src/index.d.ts +11 -0
- package/dist/core/src/index.js +11 -0
- package/dist/core/src/lint.d.ts +30 -0
- package/dist/core/src/lint.js +13 -0
- package/dist/core/src/plan.d.ts +39 -1
- package/dist/core/src/plan.js +28 -1
- package/dist/core/src/privacy.d.ts +29 -2
- package/dist/core/src/privacy.js +19 -2
- package/dist/core/src/report/formats.d.ts +34 -4
- package/dist/core/src/report/formats.js +24 -4
- package/dist/core/src/report/markdown.d.ts +15 -0
- package/dist/core/src/report/markdown.js +8 -0
- package/dist/core/src/run/clients.d.ts +44 -5
- package/dist/core/src/run/clients.js +46 -2
- package/dist/core/src/run/execute.d.ts +75 -16
- package/dist/core/src/run/execute.js +71 -18
- package/dist/core/src/run/frames.d.ts +13 -4
- package/dist/core/src/run/frames.js +19 -4
- package/dist/core/src/run/http.d.ts +34 -1
- package/dist/core/src/run/http.js +14 -1
- package/dist/core/src/run/types.d.ts +76 -3
- package/dist/core/src/run/types.js +19 -3
- package/dist/core/src/signals.d.ts +49 -5
- package/dist/core/src/signals.js +22 -5
- package/dist/core/src/spec/compose.d.ts +23 -1
- package/dist/core/src/spec/compose.js +10 -1
- package/dist/core/src/spec/index.d.ts +9 -1
- package/dist/core/src/spec/index.js +9 -1
- package/dist/core/src/spec/load.d.ts +22 -1
- package/dist/core/src/spec/load.js +31 -1
- package/dist/core/src/spec/parse.d.ts +16 -2
- package/dist/core/src/spec/parse.js +25 -2
- package/dist/core/src/spec/scxml.d.ts +25 -4
- package/dist/core/src/spec/scxml.js +36 -4
- package/dist/core/src/spec/types.d.ts +52 -1
- package/dist/core/src/spec/types.js +24 -0
- package/dist/detox/src/index.d.ts +54 -11
- package/dist/detox/src/index.js +45 -7
- package/dist/playwright/src/driver.d.ts +39 -3
- package/dist/playwright/src/driver.js +27 -3
- package/dist/playwright/src/index.d.ts +10 -0
- package/dist/playwright/src/index.js +10 -0
- package/dist/playwright/src/media.d.ts +50 -4
- package/dist/playwright/src/media.js +55 -4
- package/dist/playwright/src/signals.d.ts +44 -5
- package/dist/playwright/src/signals.js +29 -5
- package/dist/reports/src/attachment-files.d.ts +44 -0
- package/dist/reports/src/attachment-files.js +121 -0
- package/dist/reports/src/attachment-response.d.ts +31 -0
- package/dist/reports/src/attachment-response.js +55 -0
- package/dist/reports/src/aws-credentials.d.ts +48 -0
- package/dist/reports/src/aws-credentials.js +221 -0
- package/dist/reports/src/browser-navigation.d.ts +14 -0
- package/dist/reports/src/browser-navigation.js +7 -0
- package/dist/reports/src/bundle.d.ts +34 -2
- package/dist/reports/src/bundle.js +38 -2
- package/dist/reports/src/catalog.d.ts +34 -3
- package/dist/reports/src/catalog.js +17 -3
- package/dist/reports/src/cli-stores.d.ts +36 -0
- package/dist/reports/src/cli-stores.js +73 -0
- package/dist/reports/src/clock.d.ts +7 -2
- package/dist/reports/src/clock.js +5 -2
- package/dist/reports/src/completion-order.d.ts +18 -5
- package/dist/reports/src/completion-order.js +18 -5
- package/dist/reports/src/compose.d.ts +80 -0
- package/dist/reports/src/compose.js +117 -0
- package/dist/reports/src/copy-store.d.ts +29 -0
- package/dist/reports/src/copy-store.js +52 -0
- package/dist/reports/src/directory-outline.d.ts +38 -0
- package/dist/reports/src/directory-outline.js +103 -0
- package/dist/reports/src/directory-store.d.ts +20 -0
- package/dist/reports/src/directory-store.js +166 -0
- package/dist/reports/src/doctor.d.ts +29 -0
- package/dist/reports/src/doctor.js +85 -0
- package/dist/reports/src/effective-delta.d.ts +34 -0
- package/dist/reports/src/effective-delta.js +25 -0
- package/dist/reports/src/evidence-detail.d.ts +64 -0
- package/dist/reports/src/evidence-detail.js +92 -0
- package/dist/reports/src/evidence-live.d.ts +35 -5
- package/dist/reports/src/evidence-live.js +18 -2
- package/dist/reports/src/evidence-types.d.ts +68 -1
- package/dist/reports/src/evidence-types.js +5 -1
- package/dist/reports/src/evidence-view.d.ts +43 -4
- package/dist/reports/src/evidence-view.js +13 -2
- package/dist/reports/src/explorer-types.d.ts +40 -3
- package/dist/reports/src/explorer-types.js +8 -0
- package/dist/reports/src/explorer-versions.d.ts +9 -1
- package/dist/reports/src/explorer-versions.js +18 -1
- package/dist/reports/src/export-evidence.d.ts +16 -1
- package/dist/reports/src/export-evidence.js +52 -1
- package/dist/reports/src/fetcher.d.ts +27 -3
- package/dist/reports/src/fetcher.js +11 -3
- package/dist/reports/src/format-date.d.ts +6 -0
- package/dist/reports/src/format-date.js +6 -0
- package/dist/reports/src/format.d.ts +16 -0
- package/dist/reports/src/format.js +10 -0
- package/dist/reports/src/frames.d.ts +36 -3
- package/dist/reports/src/frames.js +22 -3
- package/dist/reports/src/hash.d.ts +18 -0
- package/dist/reports/src/hash.js +13 -0
- package/dist/reports/src/host.d.ts +29 -0
- package/dist/reports/src/host.js +64 -0
- package/dist/reports/src/html-frame.d.ts +5 -6
- package/dist/reports/src/html-frame.js +12 -1
- package/dist/reports/src/http-store.d.ts +56 -0
- package/dist/reports/src/http-store.js +148 -0
- package/dist/reports/src/http.d.ts +7 -0
- package/dist/reports/src/http.js +6 -0
- package/dist/reports/src/ingest.d.ts +54 -0
- package/dist/reports/src/ingest.js +210 -0
- package/dist/reports/src/init.d.ts +40 -0
- package/dist/reports/src/init.js +369 -0
- package/dist/reports/src/junit.d.ts +33 -6
- package/dist/reports/src/junit.js +87 -21
- package/dist/reports/src/keyboard.d.ts +20 -0
- package/dist/reports/src/keyboard.js +11 -0
- package/dist/reports/src/keys.d.ts +21 -3
- package/dist/reports/src/keys.js +21 -3
- package/dist/reports/src/layer-axes.d.ts +35 -5
- package/dist/reports/src/layer-axes.js +25 -5
- package/dist/reports/src/layer-catalog.d.ts +28 -1
- package/dist/reports/src/layer-catalog.js +18 -1
- package/dist/reports/src/layer-merge.d.ts +98 -9
- package/dist/reports/src/layer-merge.js +147 -31
- package/dist/reports/src/layer-source.d.ts +18 -0
- package/dist/reports/src/layer-source.js +11 -0
- package/dist/reports/src/layer-store.d.ts +42 -0
- package/dist/reports/src/layer-store.js +63 -5
- package/dist/reports/src/layer-types.d.ts +32 -1
- package/dist/reports/src/layers-route.d.ts +47 -4
- package/dist/reports/src/layers-route.js +86 -7
- package/dist/reports/src/live-reporter.d.ts +34 -0
- package/dist/reports/src/live-reporter.js +122 -0
- package/dist/reports/src/media-types.d.ts +11 -0
- package/dist/reports/src/media-types.js +22 -0
- package/dist/reports/src/namespace-guard.d.ts +10 -1
- package/dist/reports/src/namespace-guard.js +10 -1
- package/dist/reports/src/navigation.d.ts +12 -0
- package/dist/reports/src/navigation.js +7 -0
- package/dist/reports/src/object-io.d.ts +11 -4
- package/dist/reports/src/object-io.js +4 -4
- package/dist/reports/src/object-store-conformance.d.ts +27 -0
- package/dist/reports/src/object-store-conformance.js +87 -0
- package/dist/reports/src/object-store.d.ts +33 -24
- package/dist/reports/src/object-store.js +17 -24
- package/dist/reports/src/parse-with.d.ts +16 -0
- package/dist/reports/src/parse-with.js +14 -0
- package/dist/reports/src/performance-part.d.ts +25 -1
- package/dist/reports/src/performance-part.js +15 -1
- package/dist/reports/src/performance.d.ts +22 -2
- package/dist/reports/src/performance.js +12 -2
- package/dist/reports/src/persist.d.ts +12 -3
- package/dist/reports/src/persist.js +12 -3
- package/dist/reports/src/phone.d.ts +18 -1
- package/dist/reports/src/phone.js +18 -1
- package/dist/reports/src/protocol.d.ts +26 -4
- package/dist/reports/src/protocol.js +15 -4
- package/dist/reports/src/publication.d.ts +21 -1
- package/dist/reports/src/publication.js +21 -1
- package/dist/reports/src/publish-checks.d.ts +35 -0
- package/dist/reports/src/publish-checks.js +122 -0
- package/dist/reports/src/publish.d.ts +42 -9
- package/dist/reports/src/publish.js +36 -7
- package/dist/reports/src/read.d.ts +46 -16
- package/dist/reports/src/read.js +38 -14
- package/dist/reports/src/recording-bundle.d.ts +13 -2
- package/dist/reports/src/recording-bundle.js +4 -2
- package/dist/reports/src/recording-keys.d.ts +15 -1
- package/dist/reports/src/recording-keys.js +15 -1
- package/dist/reports/src/remote-report.d.ts +28 -7
- package/dist/reports/src/remote-report.js +15 -7
- package/dist/reports/src/report-cli.d.ts +51 -0
- package/dist/reports/src/report-cli.js +486 -0
- package/dist/reports/src/report-index.d.ts +99 -0
- package/dist/reports/src/report-index.js +337 -0
- package/dist/reports/src/report-loader.d.ts +10 -0
- package/dist/reports/src/report-loader.js +6 -0
- package/dist/reports/src/report-parts.d.ts +29 -3
- package/dist/reports/src/report-parts.js +37 -3
- package/dist/reports/src/report-status.d.ts +48 -0
- package/dist/reports/src/report-status.js +156 -0
- package/dist/reports/src/report-types.d.ts +73 -0
- package/dist/reports/src/report-types.js +3 -0
- package/dist/reports/src/reporter.d.ts +67 -0
- package/dist/reports/src/reporter.js +128 -0
- package/dist/reports/src/reports-explorer-route.d.ts +541 -0
- package/dist/reports/src/reports-explorer-route.js +11 -0
- package/dist/reports/src/reports-list-route.d.ts +9 -0
- package/dist/reports/src/reports-list-route.js +9 -0
- package/dist/reports/src/reports-route.d.ts +561 -22
- package/dist/reports/src/reports-route.js +11 -3
- package/dist/reports/src/reports-store.d.ts +19 -2
- package/dist/reports/src/reports-store.js +10 -2
- package/dist/reports/src/resilient-cache.d.ts +14 -1
- package/dist/reports/src/resilient-cache.js +8 -1
- package/dist/reports/src/retention.d.ts +17 -1
- package/dist/reports/src/retention.js +5 -1
- package/dist/reports/src/run-bundle.d.ts +63 -0
- package/dist/reports/src/run-bundle.js +159 -0
- package/dist/reports/src/s3-store.d.ts +79 -0
- package/dist/reports/src/s3-store.js +295 -0
- package/dist/reports/src/scenario.d.ts +14 -4
- package/dist/reports/src/scenario.js +5 -4
- package/dist/reports/src/sigv4.d.ts +72 -0
- package/dist/reports/src/sigv4.js +96 -0
- package/dist/reports/src/snapshot-bundle.d.ts +24 -1
- package/dist/reports/src/snapshot-bundle.js +27 -2
- package/dist/reports/src/snapshot-surface.d.ts +20 -9
- package/dist/reports/src/snapshot-surface.js +32 -19
- package/dist/reports/src/source-content.d.ts +23 -0
- package/dist/reports/src/source-content.js +30 -1
- package/dist/reports/src/source-entries.d.ts +13 -0
- package/dist/reports/src/source-entries.js +6 -0
- package/dist/reports/src/source-part.d.ts +15 -0
- package/dist/reports/src/source-part.js +8 -0
- package/dist/reports/src/source-reader.d.ts +11 -0
- package/dist/reports/src/source-reader.js +5 -0
- package/dist/reports/src/spec-evidence.d.ts +12 -2
- package/dist/reports/src/spec-evidence.js +6 -2
- package/dist/reports/src/spec-inventory.d.ts +15 -1
- package/dist/reports/src/spec-inventory.js +22 -1
- package/dist/reports/src/spec-link.d.ts +28 -0
- package/dist/reports/src/spec-link.js +70 -0
- package/dist/reports/src/spec-set.d.ts +63 -0
- package/dist/reports/src/spec-set.js +177 -0
- package/dist/reports/src/status.d.ts +10 -0
- package/dist/reports/src/status.js +5 -0
- package/dist/reports/src/store-prefix.d.ts +28 -0
- package/dist/reports/src/store-prefix.js +22 -0
- package/dist/reports/src/store-url.d.ts +89 -0
- package/dist/reports/src/store-url.js +160 -0
- package/dist/reports/src/test-catalog-entity.d.ts +11 -0
- package/dist/reports/src/test-catalog-entity.js +6 -0
- package/dist/reports/src/types.d.ts +6 -1
- package/dist/reports/src/use-report-nav.d.ts +35 -0
- package/dist/reports/src/use-report-nav.js +12 -0
- package/dist/runners/src/codecept.d.ts +14 -0
- package/dist/runners/src/codecept.js +16 -0
- package/dist/runners/src/jest.d.ts +50 -0
- package/dist/runners/src/jest.js +52 -0
- package/dist/runners/src/mocha.d.ts +40 -0
- package/dist/runners/src/mocha.js +39 -0
- package/dist/runners/src/node-test.d.ts +28 -0
- package/dist/runners/src/node-test.js +44 -0
- package/dist/runners/src/publish.d.ts +30 -0
- package/dist/runners/src/publish.js +68 -0
- package/dist/schema/src/api.d.ts +800 -0
- package/dist/schema/src/api.js +201 -0
- package/dist/schema/src/cli-results.d.ts +210 -0
- package/dist/schema/src/cli-results.js +124 -0
- package/dist/schema/src/common.d.ts +53 -0
- package/dist/schema/src/common.js +42 -0
- package/dist/schema/src/index.d.ts +16 -0
- package/dist/schema/src/index.js +16 -0
- package/dist/schema/src/layer.d.ts +2273 -0
- package/dist/schema/src/layer.js +462 -0
- package/dist/schema/src/live-run.d.ts +123 -0
- package/dist/schema/src/live-run.js +30 -0
- package/dist/schema/src/manifest.d.ts +97 -2
- package/dist/schema/src/manifest.js +84 -0
- package/dist/schema/src/project.d.ts +20 -0
- package/dist/schema/src/project.js +10 -0
- package/dist/schema/src/report-sources.d.ts +29 -0
- package/dist/schema/src/report-sources.js +27 -1
- package/dist/schema/src/runs-index.d.ts +17 -1
- package/dist/schema/src/runs-index.js +15 -0
- package/dist/schema/src/server-config.d.ts +177 -0
- package/dist/schema/src/server-config.js +85 -0
- package/dist/schema/src/spec.d.ts +69 -0
- package/dist/schema/src/spec.js +58 -0
- package/dist/server/src/app.d.ts +72 -0
- package/dist/server/src/app.js +557 -0
- package/dist/server/src/auth.d.ts +41 -0
- package/dist/server/src/auth.js +59 -0
- package/dist/server/src/config.d.ts +83 -0
- package/dist/server/src/config.js +204 -0
- package/dist/server/src/dev.d.ts +12 -0
- package/dist/server/src/dev.js +89 -0
- package/dist/server/src/events.d.ts +29 -0
- package/dist/server/src/events.js +101 -0
- package/dist/server/src/host.d.ts +30 -0
- package/dist/server/src/host.js +115 -0
- package/dist/server/src/index.d.ts +18 -0
- package/dist/server/src/index.js +18 -0
- package/dist/server/src/live-runs.d.ts +52 -0
- package/dist/server/src/live-runs.js +229 -0
- package/dist/server/src/llms.d.ts +19 -0
- package/dist/server/src/llms.js +63 -0
- package/dist/server/src/main.d.ts +30 -0
- package/dist/server/src/main.js +114 -0
- package/dist/server/src/openapi.d.ts +56 -0
- package/dist/server/src/openapi.js +438 -0
- package/dist/server/src/problem.d.ts +8 -0
- package/dist/server/src/problem.js +39 -0
- package/dist/server/src/projects.d.ts +3 -0
- package/dist/server/src/projects.js +154 -0
- package/dist/server/src/settings-page.d.ts +9 -0
- package/dist/server/src/settings-page.js +93 -0
- package/dist/server/src/settings.d.ts +23 -0
- package/dist/server/src/settings.js +72 -0
- package/dist/server/src/site.d.ts +15 -0
- package/dist/server/src/site.js +78 -0
- package/dist/server/src/store-api.d.ts +28 -0
- package/dist/server/src/store-api.js +180 -0
- package/dist/server/src/validate.d.ts +71 -0
- package/dist/server/src/validate.js +197 -0
- package/dist/vitest/src/index.d.ts +27 -5
- package/dist/vitest/src/index.js +18 -5
- package/dist/webdriver/src/driver.d.ts +63 -11
- package/dist/webdriver/src/driver.js +57 -6
- package/dist/webdriver/src/index.d.ts +8 -0
- package/dist/webdriver/src/index.js +1 -0
- package/dist/webdriver/src/protocol.d.ts +75 -6
- package/dist/webdriver/src/protocol.js +79 -6
- package/docs/agents.md +137 -0
- package/docs/deploying.md +345 -0
- package/docs/dogfooding.md +175 -0
- package/docs/extending.md +242 -0
- package/docs/integrating.md +485 -0
- package/docs/reference/bun.md +141 -0
- package/docs/reference/cli.md +148 -0
- package/docs/reference/core.md +2432 -0
- package/docs/reference/detox.md +150 -0
- package/docs/reference/http-api.md +799 -0
- package/docs/reference/playwright.md +303 -0
- package/docs/reference/reports.md +7152 -0
- package/docs/reference/runners.md +169 -0
- package/docs/reference/schema.md +1762 -0
- package/docs/reference/server.md +825 -0
- package/docs/reference/vitest.md +45 -0
- package/docs/reference/webdriver.md +330 -0
- package/docs/report-backends.md +144 -0
- package/docs/report-contract.md +400 -0
- package/docs/reporting-issues.md +160 -0
- package/docs/runners.md +69 -0
- package/docs/server.md +321 -0
- package/docs/statecharts.md +643 -0
- package/llms-full.txt +4114 -0
- package/llms.txt +49 -0
- package/package.json +61 -11
- package/packages/core/README.md +2 -1
- package/packages/reports/README.md +65 -0
- package/packages/reports/STORAGE.md +4 -0
- package/packages/runners/README.md +6 -0
- package/packages/runners/compat/codecept.cjs +2 -0
- package/packages/runners/compat/jest.cjs +2 -0
- package/packages/runners/compat/mocha.cjs +2 -0
- package/packages/schema/README.md +14 -0
- package/packages/schema/schemas/atlas-change.schema.json +4 -0
- package/packages/schema/schemas/check-detail.schema.json +1032 -0
- package/packages/schema/schemas/checks-result.schema.json +26 -0
- package/packages/schema/schemas/command-error.schema.json +35 -0
- package/packages/schema/schemas/doctor-result.schema.json +60 -0
- package/packages/schema/schemas/effective-delta.schema.json +490 -0
- package/packages/schema/schemas/effective-evidence.schema.json +471 -0
- package/packages/schema/schemas/evidence-page.schema.json +271 -0
- package/packages/schema/schemas/hello-event.schema.json +26 -0
- package/packages/schema/schemas/init-plan.schema.json +347 -0
- package/packages/schema/schemas/layer-rows.schema.json +199 -0
- package/packages/schema/schemas/layer.schema.json +2888 -0
- package/packages/schema/schemas/live-run-start.schema.json +42 -0
- package/packages/schema/schemas/live-run-update.schema.json +93 -0
- package/packages/schema/schemas/live-run.schema.json +225 -0
- package/packages/schema/schemas/merge-result.schema.json +40 -0
- package/packages/schema/schemas/outline.schema.json +62 -0
- package/packages/schema/schemas/problem.schema.json +37 -0
- package/packages/schema/schemas/project-slug.schema.json +8 -0
- package/packages/schema/schemas/project.schema.json +22 -0
- package/packages/schema/schemas/projects.schema.json +33 -0
- package/packages/schema/schemas/publish-checks.schema.json +1413 -0
- package/packages/schema/schemas/publish-result.schema.json +168 -0
- package/packages/schema/schemas/ready.schema.json +68 -0
- package/packages/schema/schemas/report-event.schema.json +100 -0
- package/packages/schema/schemas/report-status.schema.json +370 -0
- package/packages/schema/schemas/server-config.schema.json +208 -0
- package/packages/schema/schemas/server-editable-settings.schema.json +132 -0
- package/packages/schema/schemas/server-info.schema.json +114 -0
- package/packages/schema/schemas/server-settings-snapshot.schema.json +285 -0
- package/packages/schema/schemas/spec-set.schema.json +103 -0
- package/packages/schema/schemas/store-listing.schema.json +29 -0
- package/packages/schema/schemas/store-write-result.schema.json +28 -0
- package/packages/schema/schemas/stream-result.schema.json +59 -0
- package/packages/server/README.md +43 -0
- package/packages/server/openapi.json +11021 -0
- package/packages/visualizer/README.md +32 -11
- package/packages/visualizer/bin/atlas-client.mjs +176 -0
- package/packages/visualizer/bin/atlas-visualizer.mjs +2 -175
- package/packages/visualizer/src/app/AppShell.tsx +32 -16
- package/packages/visualizer/src/app/report-sources.tsx +7 -4
- package/packages/visualizer/src/app/router.tsx +3 -3
- package/packages/visualizer/src/components/ActivityIndicator.module.css +4 -0
- package/packages/visualizer/src/components/ActivityIndicator.tsx +6 -0
- package/packages/visualizer/src/components/Header.module.css +101 -192
- package/packages/visualizer/src/components/Header.tsx +88 -13
- package/packages/visualizer/src/components/ProjectPicker.tsx +64 -0
- package/packages/visualizer/src/data/adapters/adapter.ts +5 -17
- package/packages/visualizer/src/data/adapters/index.ts +10 -1
- package/packages/visualizer/src/data/adapters/report-backend.test.ts +3 -2
- package/packages/visualizer/src/data/adapters/report-backend.ts +1 -1
- package/packages/visualizer/src/data/queries.ts +14 -7
- package/packages/visualizer/src/evidence/api.ts +16 -3
- package/packages/visualizer/src/evidence/artifacts.module.css +213 -0
- package/packages/visualizer/src/evidence/artifacts.tsx +272 -0
- package/packages/visualizer/src/evidence/check-detail.tsx +21 -4
- package/packages/visualizer/src/evidence/document-page.tsx +6 -2
- package/packages/visualizer/src/evidence/evidence-context.tsx +79 -12
- package/packages/visualizer/src/evidence/evidence.module.css +11 -1
- package/packages/visualizer/src/evidence/feature-page.tsx +7 -3
- package/packages/visualizer/src/evidence/model-page.tsx +6 -2
- package/packages/visualizer/src/evidence/project-home.tsx +45 -0
- package/packages/visualizer/src/evidence/recording-page.tsx +4 -1
- package/packages/visualizer/src/evidence/spec-index.tsx +2 -1
- package/packages/visualizer/src/evidence/spec-page.tsx +23 -16
- package/packages/visualizer/src/evidence/test-filter.tsx +21 -0
- package/packages/visualizer/src/find/Finder.tsx +1 -7
- package/packages/visualizer/src/find/open.ts +4 -0
- package/packages/visualizer/src/live/live-query.ts +21 -0
- package/packages/visualizer/src/live/live-runs.tsx +69 -0
- package/packages/visualizer/src/live/live-stream.ts +225 -0
- package/packages/visualizer/src/live/report-progress.ts +62 -0
- package/packages/visualizer/src/live/test-progress.tsx +34 -0
- package/packages/visualizer/src/runtime.ts +35 -0
- package/packages/visualizer/src/state/ui-store.ts +3 -2
- package/packages/visualizer/src/views/ChartPage.tsx +2 -0
- package/packages/visualizer/src/views/ChartTests.tsx +43 -0
- package/packages/visualizer/src/views/SidePanel.tsx +2 -0
- package/packages/visualizer/vite/atlas-files.test.ts +4 -4
- package/packages/visualizer/vite/atlas-files.ts +1 -5
- package/packages/visualizer/vite/atlas-server-proxy.ts +37 -0
- package/packages/visualizer/vite.config.ts +11 -3
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
# Reference: playwright
|
|
2
|
+
|
|
3
|
+
The Playwright driver for statechart runs. Import path `@crvouga/atlas/playwright`.
|
|
4
|
+
|
|
5
|
+
> Generated from the doc comments of `packages/playwright/src` by `bun run docs`. Do not edit: change the comment next to the code.
|
|
6
|
+
|
|
7
|
+
### Playwright driver
|
|
8
|
+
|
|
9
|
+
Source: `packages/playwright/src/driver.ts`
|
|
10
|
+
|
|
11
|
+
`playwrightDriver()` is the core `Driver` that runs a statechart's paths against a web app (or a React Native app
|
|
12
|
+
on the web) in Chromium. Each path attempt gets its own browser context and page; the `PlaywrightContext` it passes
|
|
13
|
+
to event and state implementations carries the page and paced user actions. Screens are recognised by signals
|
|
14
|
+
(`signals.ts`), and screenshots, clips and touch overlay come from `media.ts`.
|
|
15
|
+
|
|
16
|
+
See docs/statecharts.md
|
|
17
|
+
|
|
18
|
+
#### `PlaywrightContext`
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
export type PlaywrightContext = SignalContext & {
|
|
22
|
+
page: Page;
|
|
23
|
+
context: BrowserContext;
|
|
24
|
+
browser: Browser;
|
|
25
|
+
/** Paced taps and typing, logged to the step's timeline and shown by the touch overlay in videos. */
|
|
26
|
+
user: UserActions;
|
|
27
|
+
};
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
What every Playwright event and recogniser receives for one path attempt. It is a
|
|
31
|
+
`SignalContext` too, so implementations written against signals run here unchanged.
|
|
32
|
+
|
|
33
|
+
#### `PlaywrightDriverOptions`
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
export type PlaywrightDriverOptions = {
|
|
37
|
+
/** Where `goto` paths resolve; the implementation's setup decides where to open. */
|
|
38
|
+
baseUrl?: string | (() => string | Promise<string>);
|
|
39
|
+
/** Browser context options; a 390×844 phone at device scale factor 3 with touch by default. */
|
|
40
|
+
device?: BrowserContextOptions;
|
|
41
|
+
/** Options for `chromium.launch`. */
|
|
42
|
+
launch?: LaunchOptions;
|
|
43
|
+
/** Override the pacing used in showcase mode. */
|
|
44
|
+
pacing?: Partial<Pacing>;
|
|
45
|
+
/** Install Playwright's fake clock before the app loads, so time events can jump it. */
|
|
46
|
+
clock?: boolean;
|
|
47
|
+
/** Save a Playwright trace for failed attempts (default true). */
|
|
48
|
+
traceOnFailure?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Which attempts record a trace: `retry` (default) traces only the retry of a failed path, which
|
|
51
|
+
* keeps first attempts fast; `always` traces every attempt so even a first failure has one.
|
|
52
|
+
*/
|
|
53
|
+
trace?: 'retry' | 'always';
|
|
54
|
+
/** Called after the page is created and before the implementation's setup. */
|
|
55
|
+
onPage?: (page: Page) => Promise<void>;
|
|
56
|
+
/** Browser contexts open at once (one per worker); unlimited when omitted. */
|
|
57
|
+
concurrency?: number;
|
|
58
|
+
};
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Options of `playwrightDriver`; every field is optional.
|
|
62
|
+
|
|
63
|
+
#### `playwrightDriver`
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
export function playwrightDriver(options: PlaywrightDriverOptions = {}): Driver<PlaywrightContext>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Drives a web app (or a React Native app on the web) in Chromium with Playwright, for `atlas run`. Pass it in the
|
|
70
|
+
config as `driver: () => playwrightDriver(options)`. The browser launches on first use (and again if it was
|
|
71
|
+
disconnected) and is shared by every context; each path attempt opens a fresh context from `options.device`
|
|
72
|
+
(default `PHONE`). Screenshots are taken at the device's physical resolution; clips are recorded at that
|
|
73
|
+
resolution too and encoded with FFmpeg as H.264 MP4. FFmpeg must be on the PATH: each screenshot also writes a
|
|
74
|
+
WebP thumbnail with it, so without FFmpeg no screenshot is recorded (the run goes on). A Playwright trace is
|
|
75
|
+
kept only for a failed attempt that was traced (see `trace`), and `dispose` closes the browser.
|
|
76
|
+
|
|
77
|
+
See /statecharts.md
|
|
78
|
+
|
|
79
|
+
**Example**
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
import { defineConfig } from '@crvouga/atlas';
|
|
83
|
+
import { playwrightDriver, screen, text } from '@crvouga/atlas/playwright';
|
|
84
|
+
|
|
85
|
+
export default defineConfig({
|
|
86
|
+
specs: './specs',
|
|
87
|
+
driver: () => playwrightDriver({ clock: true }),
|
|
88
|
+
implementation: {
|
|
89
|
+
async setup({ page }) { await page.goto('http://127.0.0.1:4317'); },
|
|
90
|
+
events: {
|
|
91
|
+
// one entry per event of the spec
|
|
92
|
+
},
|
|
93
|
+
states: { 'No todos': screen({ all: [text('Nothing to do yet')] }) }
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Playwright driver entry point (`@crvouga/atlas/playwright`)
|
|
99
|
+
|
|
100
|
+
Source: `packages/playwright/src/index.ts`. Import: `@crvouga/atlas/playwright`
|
|
101
|
+
|
|
102
|
+
Re-exports the Playwright driver for statechart runs (`playwrightDriver`), the helpers an implementation uses to
|
|
103
|
+
recognise screens and tap or type (`screen`, `recognize`, `locate`, the signal constructors and `UserActions`), and
|
|
104
|
+
the media tools (`captureScreen`, `ScreencastRecorder`, `ffmpeg`, `PHONE` and the pacing presets). Needs the
|
|
105
|
+
`playwright` package; clips and thumbnails need FFmpeg on the PATH.
|
|
106
|
+
|
|
107
|
+
See docs/statecharts.md
|
|
108
|
+
|
|
109
|
+
### Playwright screenshots, clips and paced actions
|
|
110
|
+
|
|
111
|
+
Source: `packages/playwright/src/media.ts`
|
|
112
|
+
|
|
113
|
+
The media side of the Playwright driver: `UserActions` taps and types like a person (pausing, and drawing a touch
|
|
114
|
+
indicator in showcase videos) while logging each action to the step's timeline; `captureScreen` takes a settled,
|
|
115
|
+
deterministic screenshot at device resolution plus a WebP thumbnail; `ScreencastRecorder` records an H.264 clip at
|
|
116
|
+
device resolution; `ffmpeg` runs the `ffmpeg` binary, which must be on the PATH for thumbnails and clips.
|
|
117
|
+
|
|
118
|
+
See docs/statecharts.md
|
|
119
|
+
|
|
120
|
+
#### `Pacing`
|
|
121
|
+
|
|
122
|
+
```ts
|
|
123
|
+
export type Pacing = {
|
|
124
|
+
moveMs: number;
|
|
125
|
+
pauseBeforeTapMs: number;
|
|
126
|
+
typeDelayMs: number;
|
|
127
|
+
holdAfterMs: number;
|
|
128
|
+
holdBeforeMs: number;
|
|
129
|
+
};
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Pauses, in milliseconds, that make a showcase video readable: how long the touch indicator takes to glide to a tap
|
|
133
|
+
target, the pause before the tap, the delay between typed characters, and the holds after and before a step.
|
|
134
|
+
|
|
135
|
+
#### `SHOWCASE_PACING`
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
export const SHOWCASE_PACING: Pacing
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
The default pacing of showcase mode: a visible glide and pauses, so a person can follow the clip.
|
|
142
|
+
|
|
143
|
+
#### `FAST_PACING`
|
|
144
|
+
|
|
145
|
+
```ts
|
|
146
|
+
export const FAST_PACING: Pacing
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
No pauses at all; the pacing of fast mode.
|
|
150
|
+
|
|
151
|
+
#### `PHONE`
|
|
152
|
+
|
|
153
|
+
```ts
|
|
154
|
+
export const PHONE = …
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
The default `device` of `playwrightDriver`: a 390 by 844 CSS pixel viewport at device scale factor 3 (screenshots
|
|
158
|
+
are 1170 by 2532 pixels), a mobile user agent and touch.
|
|
159
|
+
|
|
160
|
+
#### `UserActions`
|
|
161
|
+
|
|
162
|
+
```ts
|
|
163
|
+
export class UserActions
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Taps and typing a person would do, paced for showcase videos and logged to the step timeline. Provided to event
|
|
167
|
+
implementations as `user` on the `PlaywrightContext`. `showTouches` turns on the touch indicator (showcase mode).
|
|
168
|
+
|
|
169
|
+
- `static async install(page: Page)` — Registers the touch indicator overlay to be added to every page load, so it exists before the app's scripts run. Call it once per page, before navigating.
|
|
170
|
+
- `async tap(target: Locator | Signal, label: string)` — Taps the centre of a locator or a signal (resolved with `locate`). Waits up to 15 s for it to be visible, scrolls it into view, logs a `tap` entry labelled `label` to the timeline, then clicks (10 s timeout). In showcase mode the touch indicator glides there first. Throws when the target has no position on screen.
|
|
171
|
+
- `async type(target: Locator | Signal, text: string, label: string)` — Taps `target`, clears it, then types `text` one character at a time, `pacing.typeDelayMs` apart. Logs a `tap` and a `type` entry labelled `label` to the timeline.
|
|
172
|
+
- `async hold(ms: number)` — Waits `ms` milliseconds; does nothing when `ms` is zero or less.
|
|
173
|
+
- `async hideTouches()` — Hides the touch indicator, so a screenshot does not show it.
|
|
174
|
+
- `async showTouchLayer()` — Shows the touch indicator again after `hideTouches`.
|
|
175
|
+
|
|
176
|
+
#### `ScreenshotFiles`
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
export type ScreenshotFiles = { png: string; webp?: string };
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
The files `captureScreen` wrote: the full-size PNG and its WebP thumbnail.
|
|
183
|
+
|
|
184
|
+
#### `captureScreen`
|
|
185
|
+
|
|
186
|
+
```ts
|
|
187
|
+
export async function captureScreen(
|
|
188
|
+
page: Page,
|
|
189
|
+
driver: UserActions,
|
|
190
|
+
file: string,
|
|
191
|
+
mask: Locator[] = []
|
|
192
|
+
): Promise<ScreenshotFiles>
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Takes a settled, deterministic screenshot at device resolution, with the touch layer hidden: waits for the network to
|
|
196
|
+
go quiet (up to 5 s) and for fonts, disables animations and hides the caret. Writes the PNG to `file` (creating its
|
|
197
|
+
folder) and a 400 px wide WebP thumbnail beside it with FFmpeg. `mask` lists locators to paint over. Rejects when
|
|
198
|
+
FFmpeg is missing or fails.
|
|
199
|
+
|
|
200
|
+
#### `ffmpeg`
|
|
201
|
+
|
|
202
|
+
```ts
|
|
203
|
+
export function ffmpeg(args: string[])
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Runs `ffmpeg` with `args` and resolves when it exits with code 0. Rejects with the spawn error when `ffmpeg` is not
|
|
207
|
+
on the PATH, or with `ffmpeg <code>: <stderr>` when it fails.
|
|
208
|
+
|
|
209
|
+
#### `ScreencastRecorder`
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
export class ScreencastRecorder
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Records a clip of a page at its physical resolution (1170×2532 for the default `PHONE`). Chrome's screencast, and
|
|
216
|
+
Playwright's built-in video that rides on it, only deliver CSS-pixel frames (390×844) and
|
|
217
|
+
upscale them, so text goes soft. Instead this loops device-scale JPEG captures (about 20 fps
|
|
218
|
+
here), keeps each frame's own timestamp, and encodes H.264 at 30 fps, holding each frame for as
|
|
219
|
+
long as it was on screen. The first frame becomes the poster.
|
|
220
|
+
|
|
221
|
+
- `async start(workDirectory: string)` — Begins capturing frames of the page into `workDirectory`, which is emptied first. Call `stop` to encode them.
|
|
222
|
+
- `async stop(output: string)` — Stops capturing and encodes the frames to the MP4 file `output` (the poster is written beside it, with `.mp4` replaced by `.poster.webp`), then deletes the work directory. Resolves to `{ video, poster, durationMs }`, or `null` when no frame was captured.
|
|
223
|
+
|
|
224
|
+
### Playwright signal helpers
|
|
225
|
+
|
|
226
|
+
Source: `packages/playwright/src/signals.ts`
|
|
227
|
+
|
|
228
|
+
Maps the driver-neutral `Signal` values (test ID, role, label, text, CSS) to Playwright locators, and builds state
|
|
229
|
+
recognisers from them: `recognize` evaluates a UI signature, `checkSignals` verifies quoted spec text is on screen,
|
|
230
|
+
and `screen` wraps both into a `StateImplementation` for any context that exposes `page`. Also re-exports the
|
|
231
|
+
signal constructors so an implementation imports everything from `@crvouga/atlas/playwright`. Visibility always
|
|
232
|
+
means the first visible match.
|
|
233
|
+
|
|
234
|
+
See docs/statecharts.md
|
|
235
|
+
|
|
236
|
+
#### `locate`
|
|
237
|
+
|
|
238
|
+
```ts
|
|
239
|
+
export function locate(page: Page, signal: Signal): Locator
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Resolves a `Signal` to a Playwright locator for the first visible match, using Playwright's own role, label and
|
|
243
|
+
text rules (text matches are substrings unless `exact`).
|
|
244
|
+
|
|
245
|
+
#### `SignatureSpec`
|
|
246
|
+
|
|
247
|
+
```ts
|
|
248
|
+
export type SignatureSpec = { all?: Signal[]; any?: Signal[]; none?: Signal[] };
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
A state's UI signature: every `all` signal visible, at least one `any` signal visible (when `any` is given), and no
|
|
252
|
+
`none` signal visible.
|
|
253
|
+
|
|
254
|
+
#### `recognize`
|
|
255
|
+
|
|
256
|
+
```ts
|
|
257
|
+
export async function recognize(page: Page, spec: SignatureSpec): Promise<RecognizerResult>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Recognises a state from its UI signature on `page`: every `all` signal visible, one `any` signal visible (when `any`
|
|
261
|
+
is given), no `none` signal visible. Returns `matched` plus one entry per signal with what was expected and whether
|
|
262
|
+
it
|
|
263
|
+
was visible, which the report shows when the state is not recognised. A signal that cannot be evaluated counts as not
|
|
264
|
+
visible.
|
|
265
|
+
|
|
266
|
+
#### `checkSignals`
|
|
267
|
+
|
|
268
|
+
```ts
|
|
269
|
+
export async function checkSignals(page: Page, checks: { check: string; signal: Signal }[]): Promise<CheckResult[]>
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Checks that each quoted piece of the spec (`check`) is visible on screen; returns one result per check, with
|
|
273
|
+
`expected` and `actual` filled in.
|
|
274
|
+
|
|
275
|
+
#### `screen`
|
|
276
|
+
|
|
277
|
+
```ts
|
|
278
|
+
export function screen<C extends { page: Page }>(
|
|
279
|
+
spec: SignatureSpec & {
|
|
280
|
+
checks?: { check: string; signal: Signal }[];
|
|
281
|
+
transient?: boolean;
|
|
282
|
+
sameAs?: string;
|
|
283
|
+
lookIn?: (ctx: C) => Promise<void>;
|
|
284
|
+
settle?: (ctx: C) => Promise<void>;
|
|
285
|
+
}
|
|
286
|
+
): StateImplementation<C>
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Builds a state implementation from a UI signature, for a context that exposes `page` (the `PlaywrightContext`). The
|
|
290
|
+
state is recognised as `recognize` describes; `checks` become the state's `meta.checks` results. The other fields
|
|
291
|
+
(`lookIn`, `settle`, `transient`, `sameAs`) pass through to the `StateImplementation`.
|
|
292
|
+
|
|
293
|
+
See /statecharts.md
|
|
294
|
+
|
|
295
|
+
**Example**
|
|
296
|
+
|
|
297
|
+
```ts
|
|
298
|
+
import { role, screen, text } from '@crvouga/atlas/playwright';
|
|
299
|
+
|
|
300
|
+
const states = {
|
|
301
|
+
'No todos': screen({ all: [text('Nothing to do yet')], none: [role('listitem')] })
|
|
302
|
+
};
|
|
303
|
+
```
|