@gfdelarue/testkit 0.4.4 → 0.5.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 +752 -462
- package/bin/testkit-windows-owner-arm64.exe +0 -0
- package/bin/testkit-windows-owner-x64.exe +0 -0
- package/dist/app/bugs/categories.js +1 -1
- package/dist/app/bugs/ci-report.js +2 -2
- package/dist/app/bugs/ci-summary.js +3 -3
- package/dist/app/bugs/draft.js +4 -4
- package/dist/app/bugs/facts.js +2 -2
- package/dist/app/bugs/file.js +1 -1
- package/dist/app/bugs/gate.js +1 -1
- package/dist/app/bugs/guide.js +3 -3
- package/dist/app/bugs/issue.js +4 -4
- package/dist/app/bugs/known-failures.js +1 -1
- package/dist/app/bugs/record.js +2 -2
- package/dist/app/bugs/run-reading.js +1 -1
- package/dist/app/bugs/supplied-reproduce.js +1 -0
- package/dist/app/campaigns/campaign.js +1 -1
- package/dist/app/cleanup/index.js +1 -1
- package/dist/app/db-schema/prepare.js +1 -1
- package/dist/app/destroy/index.js +1 -1
- package/dist/app/discover/index.js +2 -2
- package/dist/app/doctor/index.js +1 -1
- package/dist/app/environments/config-driven.js +1 -0
- package/dist/app/environments/environment-file.js +1 -0
- package/dist/app/environments/file-setup.js +1 -0
- package/dist/app/environments/routing.js +1 -0
- package/dist/app/environments/static-values.js +1 -0
- package/dist/app/environments/supplied-input.js +1 -0
- package/dist/app/environments/supplied.js +1 -0
- package/dist/app/environments/task-databases.js +2 -0
- package/dist/app/file-selection.js +1 -1
- package/dist/app/inspect/artifacts.js +1 -1
- package/dist/app/inspect/index.js +1 -1
- package/dist/app/lint/index.js +1 -1
- package/dist/app/lint/native.js +1 -1
- package/dist/app/lint/options.js +1 -1
- package/dist/app/lint/rules/data.js +1 -1
- package/dist/app/lint/rules/engine-imports.js +1 -1
- package/dist/app/lint/rules/syntax.js +1 -1
- package/dist/app/lint/rules/unit.js +1 -1
- package/dist/app/lint/shared.js +1 -1
- package/dist/app/package-inspection.js +1 -1
- package/dist/app/reports/files.js +1 -0
- package/dist/app/reports/prepare.js +2 -0
- package/dist/app/reports/publish.js +1 -0
- package/dist/app/run/caller-redaction.js +1 -0
- package/dist/app/run/engine-evidence-persistence.js +1 -1
- package/dist/app/run/engine-execution-failures.js +1 -1
- package/dist/app/run/engine-execution-reporting.js +1 -1
- package/dist/app/run/engine-execution.js +1 -1
- package/dist/app/run/engine-orchestration.js +1 -1
- package/dist/app/run/environment.js +1 -0
- package/dist/app/run/failure-details.js +1 -1
- package/dist/app/run/live-run.js +1 -1
- package/dist/app/run/orchestrator.js +1 -1
- package/dist/app/run/planning.js +1 -1
- package/dist/app/run/request.js +1 -1
- package/dist/app/run/results.js +1 -1
- package/dist/app/run/run-events.js +1 -1
- package/dist/app/run/run-finalization.js +1 -1
- package/dist/app/run/runtime-fixtures.js +1 -1
- package/dist/app/run/scheduler/estimates.js +1 -1
- package/dist/app/run/scheduler/identity.js +1 -1
- package/dist/app/run/scheduler/index.js +1 -1
- package/dist/app/run/scheduler/locks.js +1 -0
- package/dist/app/run/selection.js +1 -1
- package/dist/app/run/setup/runtime-node-setup-protocol.js +1 -1
- package/dist/app/run/setup/runtime-node-setup-worker.js +1 -1
- package/dist/app/run/setup/runtime-node-setup.js +2 -2
- package/dist/app/run/task-batches.js +1 -1
- package/dist/app/run/task-leases.js +1 -0
- package/dist/app/run/worker-loop.js +1 -1
- package/dist/app/status/runs.js +1 -1
- package/dist/app/tracker/index.js +1 -1
- package/dist/app/typecheck/index.js +4 -4
- package/dist/cli/command-catalog.js +1 -1
- package/dist/cli/command-flags.js +1 -1
- package/dist/cli/command-registry.js +1 -1
- package/dist/cli/commands/artifacts.js +2 -2
- package/dist/cli/commands/bug/file.js +2 -2
- package/dist/cli/commands/bug/record.js +2 -2
- package/dist/cli/commands/discover.js +1 -1
- package/dist/cli/commands/report/prepare.js +5 -0
- package/dist/cli/commands/report/publish.js +2 -0
- package/dist/cli/commands/run.js +2 -2
- package/dist/cli/commands/typecheck.js +1 -1
- package/dist/cli/commands/workspace.js +1 -1
- package/dist/cli/framework/errors.js +1 -1
- package/dist/cli/framework/execute.js +7 -6
- package/dist/cli/framework/parser.js +1 -1
- package/dist/cli/json-errors.js +1 -1
- package/dist/cli/operations/run/operation.js +2 -2
- package/dist/cli/renderers/bug/text.js +1 -1
- package/dist/cli/renderers/discover/report.js +1 -1
- package/dist/cli/renderers/doctor/text.js +1 -1
- package/dist/cli/renderers/run/events.js +2 -2
- package/dist/cli/renderers/run/formatting.js +1 -1
- package/dist/cli/renderers/run/status.js +1 -1
- package/dist/cli/renderers/run/text-reporter.js +24 -22
- package/dist/cli/terminal/colors.js +1 -1
- package/dist/cli/terminal/layout.js +2 -2
- package/dist/config/authoring/http-methods.js +1 -1
- package/dist/config/authoring/index.js +1 -1
- package/dist/config/authoring/preset-env.js +1 -1
- package/dist/config/loader/config-loader.js +1 -1
- package/dist/config/loader/database.js +1 -1
- package/dist/config/loader/decode-execution.js +1 -1
- package/dist/config/loader/dependencies.js +1 -1
- package/dist/config/loader/discover-tests.js +1 -1
- package/dist/config/loader/discovery-summary.js +1 -1
- package/dist/config/loader/discovery.js +2 -2
- package/dist/config/loader/env.js +1 -1
- package/dist/config/loader/execution-model.js +1 -1
- package/dist/config/loader/file-metadata.js +1 -1
- package/dist/config/loader/groups.js +1 -0
- package/dist/config/loader/index.js +1 -1
- package/dist/config/loader/load.js +1 -1
- package/dist/config/loader/managed-configs.js +1 -1
- package/dist/config/loader/owned-discovery.js +1 -0
- package/dist/config/loader/path-policy.js +1 -1
- package/dist/config/loader/runtime-isolation.js +1 -1
- package/dist/config/loader/runtime.js +1 -1
- package/dist/config/loader/skip-config.js +1 -1
- package/dist/config/loader/task-policy.js +1 -0
- package/dist/config/loader/test-selection.js +1 -1
- package/dist/config/loader/validation.js +1 -1
- package/dist/database/activity-gate.js +1 -1
- package/dist/database/admin.js +2 -2
- package/dist/database/bindings.js +1 -0
- package/dist/database/cleanup.js +1 -1
- package/dist/database/docker-metadata.js +3 -3
- package/dist/database/docker.js +3 -3
- package/dist/database/index.js +1 -1
- package/dist/database/lifecycle-cleanup.js +1 -1
- package/dist/database/local-postgres.js +1 -1
- package/dist/database/naming.js +1 -1
- package/dist/database/postgres/connection-check.js +1 -0
- package/dist/database/postgres/protocol.js +2 -0
- package/dist/database/schema-operations.js +1 -1
- package/dist/database/schema-source.js +3 -3
- package/dist/database/source-schema-env.js +1 -0
- package/dist/database/source-url.js +2 -2
- package/dist/database/state-files.js +1 -1
- package/dist/database/state.js +1 -1
- package/dist/database/steps.js +3 -3
- package/dist/domain/file-timeout.js +1 -1
- package/dist/domain/identifiers.js +1 -1
- package/dist/domain/operation-display.js +1 -1
- package/dist/domain/retired-test-types.js +1 -0
- package/dist/domain/runtime-isolation-contract.js +1 -1
- package/dist/domain/suite-selection.js +1 -1
- package/dist/domain/test-outcomes.js +1 -1
- package/dist/domain/test-types.js +1 -1
- package/dist/engines/adapters/evidence-files.js +1 -1
- package/dist/engines/adapters/evidence-identity.js +1 -1
- package/dist/engines/adapters/execution.js +1 -1
- package/dist/engines/adapters/json-bounds.js +2 -0
- package/dist/engines/adapters/native-report.js +1 -1
- package/dist/engines/api/execution-scope.js +1 -1
- package/dist/engines/api/execution.js +1 -1
- package/dist/engines/api/index.js +1 -1
- package/dist/engines/api/runtime-artifact.js +1 -1
- package/dist/engines/bundle-cache.js +1 -1
- package/dist/engines/catalog.js +1 -1
- package/dist/engines/contracts/environment-values.js +1 -0
- package/dist/engines/contracts/fixture-manifest.js +1 -1
- package/dist/engines/definitions.js +1 -1
- package/dist/engines/environment/handles.js +1 -0
- package/dist/engines/environment/index.js +1 -0
- package/dist/engines/factory.js +1 -1
- package/dist/engines/installations/node-vitest.js +1 -1
- package/dist/engines/installations/package-resolution.js +1 -1
- package/dist/engines/installations/playwright-resolution-child.js +1 -1
- package/dist/engines/installations/playwright.js +1 -1
- package/dist/engines/managed-module-resolution-policy-input.js +1 -1
- package/dist/engines/managed-module-resolution-policy.js +1 -1
- package/dist/engines/managed-module-resolution.js +2 -2
- package/dist/engines/manager.js +1 -1
- package/dist/engines/node-vitest/adapter/adapter.js +1 -1
- package/dist/engines/node-vitest/adapter/driver.js +2 -0
- package/dist/engines/node-vitest/adapter/evidence.js +2 -2
- package/dist/engines/node-vitest/adapter/failure-details.js +4 -2
- package/dist/engines/node-vitest/adapter/reporter.js +1 -1
- package/dist/engines/node-vitest/adapter/workspace.js +31 -192
- package/dist/engines/node-vitest/inventory/index.js +2 -0
- package/dist/engines/node-vitest/inventory/list-files.js +3 -0
- package/dist/engines/node-vitest/runtime/contract/index.js +1 -1
- package/dist/engines/node-vitest/runtime/data/http.js +1 -1
- package/dist/engines/node-vitest/runtime/data/index.js +1 -1
- package/dist/engines/node-vitest/runtime/data/report.js +5 -6
- package/dist/engines/node-vitest/runtime/data/scenario.js +2 -2
- package/dist/engines/node-vitest/runtime/runtime-input.js +1 -1
- package/dist/engines/node-vitest/selection.js +1 -0
- package/dist/engines/playwright/adapter/adapter.js +1 -1
- package/dist/engines/playwright/adapter/config.js +4 -4
- package/dist/engines/playwright/adapter/evidence-validation.js +1 -1
- package/dist/engines/playwright/adapter/evidence.js +1 -1
- package/dist/engines/playwright/adapter/reporter.js +1 -1
- package/dist/engines/playwright/runtime/config-file.js +1 -1
- package/dist/engines/playwright/runtime/config.js +1 -1
- package/dist/engines/playwright/runtime/runtime-input.js +43 -20
- package/dist/engines/runtime-input-file.js +1 -1
- package/dist/environment/lifecycle-artifacts.js +1 -1
- package/dist/environment/lifecycle-controller.js +1 -1
- package/dist/environment/lifecycle.js +1 -1
- package/dist/environment/ports.js +1 -0
- package/dist/environment/ready-environment.js +1 -1
- package/dist/environment/run-environment.js +1 -1
- package/dist/environment/run-stopping.js +1 -1
- package/dist/environment/runtime-contexts.js +1 -1
- package/dist/environment/runtime-manager.js +1 -1
- package/dist/environment/runtime-planning.js +1 -1
- package/dist/environment/runtime-preparation.js +1 -1
- package/dist/environment/services.js +3 -1
- package/dist/environment/state.js +1 -1
- package/dist/environment/template.js +1 -1
- package/dist/evidence/artifact-config.js +1 -1
- package/dist/evidence/artifact-validation.js +1 -1
- package/dist/evidence/artifacts.js +2 -2
- package/dist/evidence/bundles.js +1 -1
- package/dist/evidence/environment-record.js +1 -0
- package/dist/evidence/index.js +1 -1
- package/dist/evidence/logs.js +2 -2
- package/dist/evidence/operation-timings.js +1 -1
- package/dist/evidence/read-fields.js +1 -1
- package/dist/evidence/read-run.js +1 -1
- package/dist/evidence/reading.js +1 -1
- package/dist/evidence/redaction.js +4 -0
- package/dist/evidence/reporting.js +1 -1
- package/dist/evidence/run-model.js +1 -0
- package/dist/evidence/storage.js +2 -2
- package/dist/evidence/timing.js +1 -1
- package/dist/kernel/error-serialization.js +1 -1
- package/dist/kernel/redaction-targets.js +1 -0
- package/dist/kernel/redaction.js +4 -1
- package/dist/kernel/unknown-values.js +1 -1
- package/dist/process/environment.js +1 -1
- package/dist/process/execa-bundle.json +3 -3
- package/dist/process/files/json-file.js +1 -1
- package/dist/process/files/paths.js +1 -1
- package/dist/process/host/metadata.js +1 -1
- package/dist/process/host/platform.js +1 -1
- package/dist/process/host-process.js +1 -1
- package/dist/process/index.js +1 -1
- package/dist/process/lifecycle-fence.js +1 -1
- package/dist/process/locks.js +4 -4
- package/dist/process/port-listener.js +2 -0
- package/dist/process/process-group.js +1 -1
- package/dist/process/process-identity.js +1 -1
- package/dist/process/process.js +33 -33
- package/dist/process/readiness.js +1 -1
- package/dist/process/ready-deadline.js +1 -0
- package/dist/process/recovery.js +1 -1
- package/dist/process/runs/manifest.js +1 -1
- package/dist/process/runs/ownership.js +1 -1
- package/dist/process/runs/product-state.js +1 -1
- package/dist/process/runs/stop.js +1 -1
- package/dist/process/service-processes.js +1 -1
- package/dist/process/stoppable-settlement.js +1 -0
- package/dist/process/url-redaction.js +1 -0
- package/dist/process/windows-cli-owner.js +3 -3
- package/dist/process/windows-native.js +1 -1
- package/dist/repo/ci-environment.js +1 -1
- package/dist/repo/fingerprint-policy.js +1 -1
- package/dist/repo/managed-git.js +1 -1
- package/dist/repo/physical-tree.js +1 -1
- package/dist/repo/publish-directory.js +3 -0
- package/dist/repo/state.js +4 -4
- package/dist/steps/build-config.js +1 -1
- package/dist/steps/configured-step-testkit-modules.js +1 -1
- package/dist/steps/configured-steps.js +1 -1
- package/dist/steps/environment.js +1 -1
- package/dist/steps/index.js +1 -1
- package/dist/steps/run.js +2 -2
- package/dist/toolchains/archive.js +1 -1
- package/dist/toolchains/index.js +3 -3
- package/dist/toolchains/node-provisioning.js +2 -2
- package/dist/toolchains/semver.js +1 -1
- package/dist/toolchains/vitest/index.js +1 -1
- package/dist/tracker/redaction.js +1 -2
- package/dist/{config/runtime/build-assets.d.ts → types/config-build-assets.d.ts} +5 -3
- package/dist/{database/steps.d.ts → types/config-database-steps.d.ts} +7 -7
- package/dist/{config/runtime/next-runtime-tsconfig.d.ts → types/config-next-runtime-tsconfig.d.ts} +5 -3
- package/dist/types/config.d.ts +501 -0
- package/dist/types/drizzle.d.ts +13 -0
- package/dist/{config/runtime/env/index.d.ts → types/env.d.ts} +22 -20
- package/dist/types/environment.d.ts +40 -0
- package/dist/types/index.d.ts +21 -0
- package/dist/types/node-vitest-contract.d.ts +75 -0
- package/dist/types/node-vitest-data.d.ts +407 -0
- package/dist/types/playwright.d.ts +130 -0
- package/dist/types/tooling-vitest.d.ts +13 -0
- package/dist/types/workspace.d.ts +617 -0
- package/docs/bug-records.md +83 -81
- package/docs/engines.md +213 -0
- package/docs/test-types.md +35 -33
- package/package.json +22 -29
- package/testkit-config-schema.md +403 -171
- package/dist/app/bugs/areas.d.ts +0 -38
- package/dist/app/bugs/assessment.d.ts +0 -9
- package/dist/app/bugs/categories.d.ts +0 -41
- package/dist/app/bugs/ci-report.d.ts +0 -21
- package/dist/app/bugs/ci-summary.d.ts +0 -13
- package/dist/app/bugs/draft.d.ts +0 -70
- package/dist/app/bugs/facts.d.ts +0 -48
- package/dist/app/bugs/file.d.ts +0 -45
- package/dist/app/bugs/gate.d.ts +0 -22
- package/dist/app/bugs/guide.d.ts +0 -20
- package/dist/app/bugs/issue.d.ts +0 -18
- package/dist/app/bugs/known-failures.d.ts +0 -49
- package/dist/app/bugs/record.d.ts +0 -14
- package/dist/app/bugs/run-reading.d.ts +0 -51
- package/dist/app/bugs/store.d.ts +0 -34
- package/dist/app/campaigns/brief.d.ts +0 -7
- package/dist/app/campaigns/campaign.d.ts +0 -14
- package/dist/app/campaigns/index.d.ts +0 -38
- package/dist/app/campaigns/store.d.ts +0 -5
- package/dist/app/campaigns/summary.d.ts +0 -13
- package/dist/app/cleanup/index.d.ts +0 -52
- package/dist/app/db-schema/prepare.d.ts +0 -11
- package/dist/app/db-schema/refresh.d.ts +0 -17
- package/dist/app/db-schema/verify.d.ts +0 -11
- package/dist/app/destroy/index.d.ts +0 -16
- package/dist/app/discover/index.d.ts +0 -8
- package/dist/app/doctor/index.d.ts +0 -17
- package/dist/app/file-selection.d.ts +0 -1
- package/dist/app/inspect/artifacts.d.ts +0 -30
- package/dist/app/inspect/index.d.ts +0 -112
- package/dist/app/lint/index.d.ts +0 -28
- package/dist/app/lint/native.d.ts +0 -10
- package/dist/app/lint/options.d.ts +0 -67
- package/dist/app/lint/policy.d.ts +0 -21
- package/dist/app/lint/rules/data.d.ts +0 -3
- package/dist/app/lint/rules/engine-imports.d.ts +0 -3
- package/dist/app/lint/rules/syntax.d.ts +0 -4
- package/dist/app/lint/rules/unit.d.ts +0 -3
- package/dist/app/lint/shared.d.ts +0 -36
- package/dist/app/package-inspection.d.ts +0 -20
- package/dist/app/run/endpoint-readiness.d.ts +0 -43
- package/dist/app/run/endpoint-readiness.js +0 -1
- package/dist/app/run/engine-evidence-persistence.d.ts +0 -39
- package/dist/app/run/engine-execution-cleanup.d.ts +0 -8
- package/dist/app/run/engine-execution-cleanup.js +0 -1
- package/dist/app/run/engine-execution-failures.d.ts +0 -41
- package/dist/app/run/engine-execution-observer.d.ts +0 -21
- package/dist/app/run/engine-execution-reporting.d.ts +0 -17
- package/dist/app/run/engine-execution.d.ts +0 -63
- package/dist/app/run/engine-failure-stack.d.ts +0 -1
- package/dist/app/run/engine-orchestration.d.ts +0 -49
- package/dist/app/run/failure-details.d.ts +0 -37
- package/dist/app/run/live-run.d.ts +0 -27
- package/dist/app/run/operation-progress.d.ts +0 -13
- package/dist/app/run/orchestrator.d.ts +0 -68
- package/dist/app/run/planning-types.d.ts +0 -68
- package/dist/app/run/planning.d.ts +0 -15
- package/dist/app/run/playwright-configuration.d.ts +0 -2
- package/dist/app/run/playwright-configuration.js +0 -1
- package/dist/app/run/request.d.ts +0 -30
- package/dist/app/run/results.d.ts +0 -161
- package/dist/app/run/run-events.d.ts +0 -144
- package/dist/app/run/run-finalization.d.ts +0 -52
- package/dist/app/run/run-guards.d.ts +0 -3
- package/dist/app/run/runtime-failures.d.ts +0 -18
- package/dist/app/run/runtime-fixtures.d.ts +0 -2
- package/dist/app/run/runtime-task-types.d.ts +0 -20
- package/dist/app/run/scheduler/estimates.d.ts +0 -32
- package/dist/app/run/scheduler/identity.d.ts +0 -9
- package/dist/app/run/scheduler/index.d.ts +0 -124
- package/dist/app/run/scheduler/observations.d.ts +0 -20
- package/dist/app/run/selection.d.ts +0 -10
- package/dist/app/run/setup/runtime-node-setup-errors.d.ts +0 -13
- package/dist/app/run/setup/runtime-node-setup-protocol.d.ts +0 -85
- package/dist/app/run/setup/runtime-node-setup-worker.d.ts +0 -1
- package/dist/app/run/setup/runtime-node-setup.d.ts +0 -48
- package/dist/app/run/task-batches.d.ts +0 -23
- package/dist/app/run/worker-loop.d.ts +0 -57
- package/dist/app/setup/playwright.d.ts +0 -22
- package/dist/app/status/index.d.ts +0 -9
- package/dist/app/status/model.d.ts +0 -29
- package/dist/app/status/runs.d.ts +0 -99
- package/dist/app/stop/index.d.ts +0 -14
- package/dist/app/tracker/index.d.ts +0 -8
- package/dist/app/tracker/remote.d.ts +0 -13
- package/dist/app/tracker/token.d.ts +0 -7
- package/dist/app/typecheck/index.d.ts +0 -63
- package/dist/cli/command-catalog.d.ts +0 -137
- package/dist/cli/command-flags.d.ts +0 -19
- package/dist/cli/command-registry.d.ts +0 -3
- package/dist/cli/commands/artifacts.d.ts +0 -48
- package/dist/cli/commands/bug/file.d.ts +0 -16
- package/dist/cli/commands/bug/guide.d.ts +0 -5
- package/dist/cli/commands/bug/record.d.ts +0 -9
- package/dist/cli/commands/campaign/finish.d.ts +0 -10
- package/dist/cli/commands/campaign/start.d.ts +0 -7
- package/dist/cli/commands/campaign/status.d.ts +0 -13
- package/dist/cli/commands/ci/report.d.ts +0 -15
- package/dist/cli/commands/cleanup.d.ts +0 -13
- package/dist/cli/commands/db/schema/refresh.d.ts +0 -2
- package/dist/cli/commands/db/schema/verify.d.ts +0 -2
- package/dist/cli/commands/destroy.d.ts +0 -9
- package/dist/cli/commands/discover.d.ts +0 -2
- package/dist/cli/commands/doctor.d.ts +0 -2
- package/dist/cli/commands/guard/unsafe-entrypoint.d.ts +0 -2
- package/dist/cli/commands/lint.d.ts +0 -2
- package/dist/cli/commands/run/status.d.ts +0 -5
- package/dist/cli/commands/run/stop.d.ts +0 -7
- package/dist/cli/commands/run.d.ts +0 -9
- package/dist/cli/commands/setup/playwright.d.ts +0 -2
- package/dist/cli/commands/status.d.ts +0 -5
- package/dist/cli/commands/stop.d.ts +0 -12
- package/dist/cli/commands/typecheck.d.ts +0 -2
- package/dist/cli/commands/workspace.d.ts +0 -2
- package/dist/cli/entrypoint.d.ts +0 -1
- package/dist/cli/framework/command.d.ts +0 -21
- package/dist/cli/framework/definitions.d.ts +0 -100
- package/dist/cli/framework/errors.d.ts +0 -6
- package/dist/cli/framework/execute.d.ts +0 -14
- package/dist/cli/framework/help.d.ts +0 -11
- package/dist/cli/framework/index.d.ts +0 -3
- package/dist/cli/framework/parser.d.ts +0 -6
- package/dist/cli/index.d.ts +0 -4
- package/dist/cli/json-errors.d.ts +0 -3
- package/dist/cli/operations/db/schema/refresh/operation.d.ts +0 -7
- package/dist/cli/operations/db/schema/verify/operation.d.ts +0 -7
- package/dist/cli/operations/run/operation.d.ts +0 -24
- package/dist/cli/process-signal.d.ts +0 -1
- package/dist/cli/renderers/bug/text.d.ts +0 -8
- package/dist/cli/renderers/campaign/text.d.ts +0 -2
- package/dist/cli/renderers/ci/text.d.ts +0 -2
- package/dist/cli/renderers/cleanup/format.d.ts +0 -14
- package/dist/cli/renderers/db-schema/text.d.ts +0 -4
- package/dist/cli/renderers/destroy/text.d.ts +0 -4
- package/dist/cli/renderers/discover/report.d.ts +0 -7
- package/dist/cli/renderers/discover/text.d.ts +0 -3
- package/dist/cli/renderers/doctor/text.d.ts +0 -2
- package/dist/cli/renderers/lint/text.d.ts +0 -2
- package/dist/cli/renderers/run/events.d.ts +0 -8
- package/dist/cli/renderers/run/failure.d.ts +0 -8
- package/dist/cli/renderers/run/formatting.d.ts +0 -79
- package/dist/cli/renderers/run/status.d.ts +0 -6
- package/dist/cli/renderers/run/text-reporter.d.ts +0 -19
- package/dist/cli/renderers/status/text.d.ts +0 -2
- package/dist/cli/renderers/stop/text.d.ts +0 -7
- package/dist/cli/renderers/typecheck/text.d.ts +0 -2
- package/dist/cli/terminal/colors.d.ts +0 -10
- package/dist/cli/terminal/layout.d.ts +0 -11
- package/dist/cli/version-drift.d.ts +0 -25
- package/dist/config/authoring/build-config-contract.d.ts +0 -27
- package/dist/config/authoring/configured-step-contract.d.ts +0 -18
- package/dist/config/authoring/http-execution-contract.d.ts +0 -70
- package/dist/config/authoring/http-methods.d.ts +0 -18
- package/dist/config/authoring/index.d.ts +0 -381
- package/dist/config/authoring/preset-env.d.ts +0 -19
- package/dist/config/authoring/runtime.d.ts +0 -64
- package/dist/config/loader/bugs.d.ts +0 -15
- package/dist/config/loader/config-loader.d.ts +0 -9
- package/dist/config/loader/database-materialization.d.ts +0 -19
- package/dist/config/loader/database-roles.d.ts +0 -2
- package/dist/config/loader/database.d.ts +0 -55
- package/dist/config/loader/decode-discovery.d.ts +0 -5
- package/dist/config/loader/decode-execution.d.ts +0 -9
- package/dist/config/loader/dependencies.d.ts +0 -7
- package/dist/config/loader/discover-tests.d.ts +0 -111
- package/dist/config/loader/discovery-summary.d.ts +0 -29
- package/dist/config/loader/discovery.d.ts +0 -54
- package/dist/config/loader/env.d.ts +0 -4
- package/dist/config/loader/execution-model.d.ts +0 -16
- package/dist/config/loader/file-metadata.d.ts +0 -19
- package/dist/config/loader/index.d.ts +0 -10
- package/dist/config/loader/load.d.ts +0 -91
- package/dist/config/loader/managed-configs.d.ts +0 -23
- package/dist/config/loader/path-policy.d.ts +0 -9
- package/dist/config/loader/paths.d.ts +0 -5
- package/dist/config/loader/runtime-isolation.d.ts +0 -44
- package/dist/config/loader/runtime.d.ts +0 -25
- package/dist/config/loader/skip-config.d.ts +0 -44
- package/dist/config/loader/test-selection.d.ts +0 -15
- package/dist/config/loader/validation.d.ts +0 -16
- package/dist/config/loader/values.d.ts +0 -4
- package/dist/config/loader/values.js +0 -1
- package/dist/database/activity-gate.d.ts +0 -22
- package/dist/database/admin.d.ts +0 -31
- package/dist/database/cleanup.d.ts +0 -36
- package/dist/database/configured-steps.d.ts +0 -27
- package/dist/database/constants.d.ts +0 -11
- package/dist/database/docker-metadata.d.ts +0 -3
- package/dist/database/docker.d.ts +0 -65
- package/dist/database/drizzle/index.d.ts +0 -13
- package/dist/database/fingerprint.d.ts +0 -12
- package/dist/database/index.d.ts +0 -39
- package/dist/database/lifecycle-cleanup.d.ts +0 -7
- package/dist/database/local-postgres.d.ts +0 -71
- package/dist/database/naming.d.ts +0 -17
- package/dist/database/postgres/index.d.ts +0 -71
- package/dist/database/progress.d.ts +0 -6
- package/dist/database/roles.d.ts +0 -19
- package/dist/database/runtime-config.d.ts +0 -16
- package/dist/database/runtime-reservations.d.ts +0 -19
- package/dist/database/schema-operations.d.ts +0 -18
- package/dist/database/schema-source.d.ts +0 -96
- package/dist/database/source-refresh-lock.d.ts +0 -8
- package/dist/database/source-url.d.ts +0 -22
- package/dist/database/state-files.d.ts +0 -13
- package/dist/database/state.d.ts +0 -26
- package/dist/database/template-steps.d.ts +0 -39
- package/dist/domain/file-timeout.d.ts +0 -28
- package/dist/domain/identifiers.d.ts +0 -9
- package/dist/domain/operation-display.d.ts +0 -10
- package/dist/domain/operation-reason.d.ts +0 -5
- package/dist/domain/postgres-route.d.ts +0 -4
- package/dist/domain/runtime-identity.d.ts +0 -1
- package/dist/domain/runtime-isolation-contract.d.ts +0 -5
- package/dist/domain/service-name.d.ts +0 -2
- package/dist/domain/suite-selection.d.ts +0 -20
- package/dist/domain/test-outcomes.d.ts +0 -3
- package/dist/domain/test-types.d.ts +0 -16
- package/dist/engines/adapters/evidence-files.d.ts +0 -32
- package/dist/engines/adapters/evidence-identity.d.ts +0 -12
- package/dist/engines/adapters/execution.d.ts +0 -42
- package/dist/engines/adapters/native-report.d.ts +0 -25
- package/dist/engines/adapters/node-startup-cache.d.ts +0 -8
- package/dist/engines/adapters/workspace.d.ts +0 -4
- package/dist/engines/api/capabilities.d.ts +0 -31
- package/dist/engines/api/capabilities.js +0 -1
- package/dist/engines/api/evidence.d.ts +0 -38
- package/dist/engines/api/execution-observer.d.ts +0 -8
- package/dist/engines/api/execution-scope.d.ts +0 -17
- package/dist/engines/api/execution.d.ts +0 -101
- package/dist/engines/api/index.d.ts +0 -5
- package/dist/engines/api/k6-runtime-input.d.ts +0 -26
- package/dist/engines/api/k6-runtime-input.js +0 -1
- package/dist/engines/api/runtime-artifact.d.ts +0 -19
- package/dist/engines/bundle-cache.d.ts +0 -32
- package/dist/engines/catalog.d.ts +0 -27
- package/dist/engines/contracts/fixture-manifest.d.ts +0 -34
- package/dist/engines/contracts/json-bounds.d.ts +0 -36
- package/dist/engines/contracts/json-bounds.js +0 -2
- package/dist/engines/contracts/k6-repository-configuration.d.ts +0 -12
- package/dist/engines/contracts/k6-repository-configuration.js +0 -1
- package/dist/engines/contracts/test-context.d.ts +0 -15
- package/dist/engines/contracts/test-context.js +0 -1
- package/dist/engines/definitions.d.ts +0 -22
- package/dist/engines/factory.d.ts +0 -6
- package/dist/engines/generated-performance.d.ts +0 -1
- package/dist/engines/installation-catalog.d.ts +0 -27
- package/dist/engines/installation-catalog.js +0 -1
- package/dist/engines/installations/k6.d.ts +0 -98
- package/dist/engines/installations/k6.js +0 -1
- package/dist/engines/installations/node-vitest.d.ts +0 -33
- package/dist/engines/installations/package-requirements.d.ts +0 -28
- package/dist/engines/installations/package-resolution.d.ts +0 -51
- package/dist/engines/installations/playwright-resolution-child.d.ts +0 -1
- package/dist/engines/installations/playwright.d.ts +0 -75
- package/dist/engines/installations/types.d.ts +0 -10
- package/dist/engines/k6/adapter/bundle.d.ts +0 -25
- package/dist/engines/k6/adapter/bundle.js +0 -112
- package/dist/engines/k6/adapter/evidence.d.ts +0 -15
- package/dist/engines/k6/adapter/evidence.js +0 -4
- package/dist/engines/k6/adapter/executor.d.ts +0 -13
- package/dist/engines/k6/adapter/executor.js +0 -1
- package/dist/engines/k6/adapter/index.d.ts +0 -1
- package/dist/engines/k6/adapter/index.js +0 -1
- package/dist/engines/k6/adapter/input.d.ts +0 -21
- package/dist/engines/k6/adapter/input.js +0 -1
- package/dist/engines/k6/adapter/native-summary.d.ts +0 -11
- package/dist/engines/k6/adapter/native-summary.js +0 -1
- package/dist/engines/k6/adapter/repository-configuration.d.ts +0 -2
- package/dist/engines/k6/adapter/repository-configuration.js +0 -1
- package/dist/engines/k6/authoring-type-paths.d.ts +0 -3
- package/dist/engines/k6/authoring-type-paths.js +0 -1
- package/dist/engines/k6/runtime/ambient-types/bundle-manifest.json +0 -146
- package/dist/engines/k6/runtime/ambient-types/k6/LICENSE +0 -21
- package/dist/engines/k6/runtime/ambient-types/k6/browser/index.d.ts +0 -6332
- package/dist/engines/k6/runtime/ambient-types/k6/crypto/index.d.ts +0 -218
- package/dist/engines/k6/runtime/ambient-types/k6/data/index.d.ts +0 -16
- package/dist/engines/k6/runtime/ambient-types/k6/encoding/index.d.ts +0 -46
- package/dist/engines/k6/runtime/ambient-types/k6/execution/index.d.ts +0 -127
- package/dist/engines/k6/runtime/ambient-types/k6/experimental/csv/index.d.ts +0 -96
- package/dist/engines/k6/runtime/ambient-types/k6/experimental/fs/index.d.ts +0 -104
- package/dist/engines/k6/runtime/ambient-types/k6/experimental/redis/index.d.ts +0 -821
- package/dist/engines/k6/runtime/ambient-types/k6/experimental/streams/index.d.ts +0 -198
- package/dist/engines/k6/runtime/ambient-types/k6/global.d.ts +0 -83
- package/dist/engines/k6/runtime/ambient-types/k6/html/index.d.ts +0 -1325
- package/dist/engines/k6/runtime/ambient-types/k6/http/index.d.ts +0 -806
- package/dist/engines/k6/runtime/ambient-types/k6/index.d.ts +0 -126
- package/dist/engines/k6/runtime/ambient-types/k6/metrics/index.d.ts +0 -66
- package/dist/engines/k6/runtime/ambient-types/k6/net/grpc/index.d.ts +0 -247
- package/dist/engines/k6/runtime/ambient-types/k6/options/index.d.ts +0 -459
- package/dist/engines/k6/runtime/ambient-types/k6/package.json +0 -79
- package/dist/engines/k6/runtime/ambient-types/k6/secrets/index.d.ts +0 -36
- package/dist/engines/k6/runtime/ambient-types/k6/timers/index.d.ts +0 -47
- package/dist/engines/k6/runtime/ambient-types/k6/websockets/index.d.ts +0 -324
- package/dist/engines/k6/runtime/ambient-types/k6/ws/index.d.ts +0 -283
- package/dist/engines/k6/runtime/ambient-types/xk6-sql/LICENSE +0 -201
- package/dist/engines/k6/runtime/ambient-types/xk6-sql/index.d.ts +0 -397
- package/dist/engines/k6/runtime/ambient-types/xk6-sql/package.json +0 -15
- package/dist/engines/k6/runtime/artifacts.d.ts +0 -2
- package/dist/engines/k6/runtime/artifacts.js +0 -1
- package/dist/engines/k6/runtime/checks.d.ts +0 -17
- package/dist/engines/k6/runtime/checks.js +0 -1
- package/dist/engines/k6/runtime/dal-fixtures.d.ts +0 -24
- package/dist/engines/k6/runtime/dal-fixtures.js +0 -1
- package/dist/engines/k6/runtime/dal-suite.d.ts +0 -24
- package/dist/engines/k6/runtime/dal-suite.js +0 -1
- package/dist/engines/k6/runtime/dal.d.ts +0 -10
- package/dist/engines/k6/runtime/dal.js +0 -1
- package/dist/engines/k6/runtime/fixtures.d.ts +0 -3
- package/dist/engines/k6/runtime/fixtures.js +0 -1
- package/dist/engines/k6/runtime/http-assertions.d.ts +0 -19
- package/dist/engines/k6/runtime/http-assertions.js +0 -1
- package/dist/engines/k6/runtime/http-checks.d.ts +0 -19
- package/dist/engines/k6/runtime/http-checks.js +0 -1
- package/dist/engines/k6/runtime/http-suite-runtime.d.ts +0 -103
- package/dist/engines/k6/runtime/http-suite-runtime.js +0 -1
- package/dist/engines/k6/runtime/http.d.ts +0 -15
- package/dist/engines/k6/runtime/http.js +0 -1
- package/dist/engines/k6/runtime/index.d.ts +0 -11
- package/dist/engines/k6/runtime/index.js +0 -1
- package/dist/engines/k6/runtime/input.d.ts +0 -3
- package/dist/engines/k6/runtime/input.js +0 -1
- package/dist/engines/k6/runtime/k6-repository-configuration.d.ts +0 -9
- package/dist/engines/k6/runtime/k6-repository-configuration.js +0 -1
- package/dist/engines/k6/runtime/node-setup.d.ts +0 -13
- package/dist/engines/k6/runtime/node-setup.js +0 -1
- package/dist/engines/k6/runtime/runtime-globals.d.ts +0 -10
- package/dist/engines/k6/runtime/runtime.d.ts +0 -54
- package/dist/engines/k6/runtime/runtime.js +0 -1
- package/dist/engines/k6/runtime/shared/assertion-details.d.ts +0 -19
- package/dist/engines/k6/runtime/shared/assertion-details.js +0 -2
- package/dist/engines/k6/runtime/shared/db-normalization.d.ts +0 -19
- package/dist/engines/k6/runtime/shared/db-normalization.js +0 -1
- package/dist/engines/k6/runtime/shared/error-body.d.ts +0 -3
- package/dist/engines/k6/runtime/shared/error-body.js +0 -1
- package/dist/engines/k6/runtime/shared/file-data.d.ts +0 -1
- package/dist/engines/k6/runtime/shared/file-data.js +0 -1
- package/dist/engines/k6/runtime/shared/fixture-engine.d.ts +0 -8
- package/dist/engines/k6/runtime/shared/fixture-engine.js +0 -2
- package/dist/engines/k6/runtime/shared/http-check-plan.d.ts +0 -29
- package/dist/engines/k6/runtime/shared/http-check-plan.js +0 -1
- package/dist/engines/k6/runtime/shared/http-parsing.d.ts +0 -10
- package/dist/engines/k6/runtime/shared/http-parsing.js +0 -3
- package/dist/engines/k6/runtime/shared/ordering.d.ts +0 -2
- package/dist/engines/k6/runtime/shared/ordering.js +0 -1
- package/dist/engines/k6/runtime/shared/properties.d.ts +0 -1
- package/dist/engines/k6/runtime/shared/properties.js +0 -1
- package/dist/engines/k6/runtime/suite.d.ts +0 -4
- package/dist/engines/k6/runtime/suite.js +0 -1
- package/dist/engines/k6/runtime/types.d.ts +0 -244
- package/dist/engines/k6/runtime/types.js +0 -1
- package/dist/engines/k6/runtime/xk6-sql-driver-postgres.d.ts +0 -7
- package/dist/engines/k6/runtime/xk6-sql-driver-postgres.js +0 -1
- package/dist/engines/managed-module-resolution-policy-input.d.ts +0 -9
- package/dist/engines/managed-module-resolution-policy.d.ts +0 -25
- package/dist/engines/managed-module-resolution.d.ts +0 -13
- package/dist/engines/manager.d.ts +0 -25
- package/dist/engines/node-vitest/adapter/adapter.d.ts +0 -16
- package/dist/engines/node-vitest/adapter/consumer-typescript-paths.d.ts +0 -17
- package/dist/engines/node-vitest/adapter/consumer-typescript-paths.js +0 -3
- package/dist/engines/node-vitest/adapter/evidence.d.ts +0 -33
- package/dist/engines/node-vitest/adapter/failure-details.d.ts +0 -3
- package/dist/engines/node-vitest/adapter/index.d.ts +0 -1
- package/dist/engines/node-vitest/adapter/reporter.d.ts +0 -7
- package/dist/engines/node-vitest/adapter/resolution.d.ts +0 -12
- package/dist/engines/node-vitest/adapter/resolution.js +0 -1
- package/dist/engines/node-vitest/adapter/workspace.d.ts +0 -19
- package/dist/engines/node-vitest/runtime/contract/index.d.ts +0 -64
- package/dist/engines/node-vitest/runtime/data/http.d.ts +0 -4
- package/dist/engines/node-vitest/runtime/data/index.d.ts +0 -8
- package/dist/engines/node-vitest/runtime/data/primitives.d.ts +0 -1
- package/dist/engines/node-vitest/runtime/data/report.d.ts +0 -3
- package/dist/engines/node-vitest/runtime/data/runner.d.ts +0 -4
- package/dist/engines/node-vitest/runtime/data/scenario.d.ts +0 -12
- package/dist/engines/node-vitest/runtime/data/types.d.ts +0 -412
- package/dist/engines/node-vitest/runtime/runtime-input.d.ts +0 -64
- package/dist/engines/playwright/adapter/adapter.d.ts +0 -18
- package/dist/engines/playwright/adapter/attachments.d.ts +0 -26
- package/dist/engines/playwright/adapter/config.d.ts +0 -45
- package/dist/engines/playwright/adapter/evidence-validation.d.ts +0 -12
- package/dist/engines/playwright/adapter/evidence.d.ts +0 -32
- package/dist/engines/playwright/adapter/failure-details.d.ts +0 -2
- package/dist/engines/playwright/adapter/index.d.ts +0 -3
- package/dist/engines/playwright/adapter/reporter.d.ts +0 -12
- package/dist/engines/playwright/runtime/config-file.d.ts +0 -2
- package/dist/engines/playwright/runtime/config.d.ts +0 -24
- package/dist/engines/playwright/runtime/index.d.ts +0 -4
- package/dist/engines/playwright/runtime/runtime-input.d.ts +0 -36
- package/dist/engines/playwright/runtime/sandbox.d.ts +0 -84
- package/dist/engines/runtime-input-file.d.ts +0 -27
- package/dist/environment/lifecycle-artifacts.d.ts +0 -7
- package/dist/environment/lifecycle-controller.d.ts +0 -70
- package/dist/environment/lifecycle.d.ts +0 -29
- package/dist/environment/maintenance.d.ts +0 -68
- package/dist/environment/planning-types.d.ts +0 -35
- package/dist/environment/readiness.d.ts +0 -12
- package/dist/environment/readiness.js +0 -1
- package/dist/environment/ready-environment.d.ts +0 -19
- package/dist/environment/run-environment.d.ts +0 -38
- package/dist/environment/run-stopping.d.ts +0 -13
- package/dist/environment/runtime-contexts.d.ts +0 -33
- package/dist/environment/runtime-manager.d.ts +0 -95
- package/dist/environment/runtime-planning.d.ts +0 -16
- package/dist/environment/runtime-preparation.d.ts +0 -30
- package/dist/environment/runtime-service.d.ts +0 -18
- package/dist/environment/services.d.ts +0 -48
- package/dist/environment/state.d.ts +0 -18
- package/dist/environment/status-runtime.d.ts +0 -53
- package/dist/environment/template.d.ts +0 -180
- package/dist/evidence/artifact-config.d.ts +0 -14
- package/dist/evidence/artifact-validation.d.ts +0 -5
- package/dist/evidence/artifacts.d.ts +0 -75
- package/dist/evidence/bundles.d.ts +0 -27
- package/dist/evidence/ci-provenance.d.ts +0 -9
- package/dist/evidence/contracts.d.ts +0 -154
- package/dist/evidence/file-evidence.d.ts +0 -23
- package/dist/evidence/finalization.d.ts +0 -9
- package/dist/evidence/index.d.ts +0 -8
- package/dist/evidence/logs.d.ts +0 -31
- package/dist/evidence/operation-timings.d.ts +0 -60
- package/dist/evidence/read-bundle.d.ts +0 -4
- package/dist/evidence/read-fields.d.ts +0 -22
- package/dist/evidence/read-provenance.d.ts +0 -2
- package/dist/evidence/read-redaction.d.ts +0 -2
- package/dist/evidence/read-retention.d.ts +0 -2
- package/dist/evidence/read-run.d.ts +0 -2
- package/dist/evidence/reading.d.ts +0 -28
- package/dist/evidence/reporting-types.d.ts +0 -330
- package/dist/evidence/reporting.d.ts +0 -3
- package/dist/evidence/secure-file-copy.d.ts +0 -24
- package/dist/evidence/setup-progress.d.ts +0 -63
- package/dist/evidence/step-output.d.ts +0 -16
- package/dist/evidence/storage-inventory.d.ts +0 -27
- package/dist/evidence/storage.d.ts +0 -27
- package/dist/evidence/timing.d.ts +0 -23
- package/dist/file.d.ts +0 -11
- package/dist/index.d.ts +0 -4
- package/dist/kernel/error-serialization.d.ts +0 -38
- package/dist/kernel/redaction.d.ts +0 -2
- package/dist/kernel/unknown-values.d.ts +0 -6
- package/dist/kernel/work-metrics.d.ts +0 -6
- package/dist/process/capture-output.d.ts +0 -7
- package/dist/process/command-shell.d.ts +0 -1
- package/dist/process/environment-overlay.d.ts +0 -17
- package/dist/process/environment.d.ts +0 -33
- package/dist/process/files/contained-path.d.ts +0 -8
- package/dist/process/files/directory-status.d.ts +0 -14
- package/dist/process/files/dotenv.d.ts +0 -2
- package/dist/process/files/file-snapshot.d.ts +0 -34
- package/dist/process/files/json-file.d.ts +0 -12
- package/dist/process/files/paths.d.ts +0 -1
- package/dist/process/files/product-dir.d.ts +0 -1
- package/dist/process/files/temp-dir.d.ts +0 -11
- package/dist/process/host/metadata.d.ts +0 -6
- package/dist/process/host/platform.d.ts +0 -57
- package/dist/process/host-command.d.ts +0 -4
- package/dist/process/host-inspection-command.d.ts +0 -13
- package/dist/process/host-process.d.ts +0 -19
- package/dist/process/index.d.ts +0 -9
- package/dist/process/lifecycle-fence.d.ts +0 -11
- package/dist/process/locks.d.ts +0 -28
- package/dist/process/process-contracts.d.ts +0 -78
- package/dist/process/process-group.d.ts +0 -12
- package/dist/process/process-identity.d.ts +0 -27
- package/dist/process/process-limits.d.ts +0 -6
- package/dist/process/process.d.ts +0 -12
- package/dist/process/readiness.d.ts +0 -37
- package/dist/process/recovery.d.ts +0 -3
- package/dist/process/runs/inspection.d.ts +0 -5
- package/dist/process/runs/manifest.d.ts +0 -86
- package/dist/process/runs/ownership.d.ts +0 -11
- package/dist/process/runs/product-state.d.ts +0 -2
- package/dist/process/runs/schema.d.ts +0 -3
- package/dist/process/runs/stop.d.ts +0 -19
- package/dist/process/runtime-socket.d.ts +0 -4
- package/dist/process/service-processes.d.ts +0 -13
- package/dist/process/shutdown.d.ts +0 -10
- package/dist/process/windows-cli-owner.d.ts +0 -2
- package/dist/process/windows-native.d.ts +0 -6
- package/dist/process/windows-process-identity.d.ts +0 -4
- package/dist/repo/ci-environment.d.ts +0 -7
- package/dist/repo/fingerprint-policy.d.ts +0 -15
- package/dist/repo/git-path.d.ts +0 -2
- package/dist/repo/history.d.ts +0 -17
- package/dist/repo/managed-git.d.ts +0 -10
- package/dist/repo/metadata.d.ts +0 -3
- package/dist/repo/physical-tree.d.ts +0 -37
- package/dist/repo/remote.d.ts +0 -6
- package/dist/repo/state.d.ts +0 -26
- package/dist/repo/tree-listing.d.ts +0 -10
- package/dist/steps/build-config.d.ts +0 -35
- package/dist/steps/configured-step-testkit-modules.d.ts +0 -19
- package/dist/steps/configured-steps.d.ts +0 -51
- package/dist/steps/environment.d.ts +0 -84
- package/dist/steps/index.d.ts +0 -2
- package/dist/steps/module-runner.d.ts +0 -1
- package/dist/steps/run.d.ts +0 -36
- package/dist/toolchains/archive.d.ts +0 -53
- package/dist/toolchains/esbuild.d.ts +0 -9
- package/dist/toolchains/host-node-support.d.ts +0 -3
- package/dist/toolchains/index.d.ts +0 -114
- package/dist/toolchains/managed-node-releases.d.ts +0 -28
- package/dist/toolchains/node-cache.d.ts +0 -20
- package/dist/toolchains/node-integrity.d.ts +0 -18
- package/dist/toolchains/node-provisioning.d.ts +0 -29
- package/dist/toolchains/semver.d.ts +0 -13
- package/dist/toolchains/shared-operation.d.ts +0 -11
- package/dist/toolchains/timeouts.d.ts +0 -1
- package/dist/toolchains/vitest/index.d.ts +0 -13
- package/dist/tracker/gitea.d.ts +0 -14
- package/dist/tracker/github.d.ts +0 -14
- package/dist/tracker/http.d.ts +0 -33
- package/dist/tracker/index.d.ts +0 -4
- package/dist/tracker/redaction.d.ts +0 -4
- package/dist/tracker/requests.d.ts +0 -17
- package/dist/tracker/responses.d.ts +0 -24
- package/dist/tracker/types.d.ts +0 -51
- package/docs/engine-architecture.md +0 -654
- /package/dist/engines/{k6/runtime/runtime-globals.js → api/profiles.js} +0 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{asUnknownRecord as c}from"../../kernel/unknown-values.js";import
|
|
1
|
+
import{asUnknownRecord as c}from"../../kernel/unknown-values.js";import d from"node:fs";import{inspectArtifacts as p}from"../../app/inspect/artifacts.js";import{selectedGroup as l}from"../command-flags.js";export default function m({args:i,flags:e,json:n,log:o,notice:s}){const r=p({dir:e.dir,mode:e.list?"runs":e.verify?"verify":"artifacts",file:i.file||null,runId:e.run||null,group:l(e,s),kind:e.kind,includePayload:n||e.format==="text"});if(r.mode==="runs"){const{runs:t}=r;if(n)return{ok:!0,runs:t};t.length===0&&o("No immutable Testkit runs found.");for(const u of t)o(`${u.runId} ${u.status||"unknown"} ${u.finishedAt||u.startedAt||"unknown-time"}`);return{ok:!0,count:t.length}}const a=r.runId;if(r.mode==="verify"){const{verification:t}=r;return t.ok||(process.exitCode=1),n?{ok:t.ok,verification:t}:(o(t.ok?`Verified ${a??"unknown"}: ${String(t.checkedFiles)} files (${t.manifestDigest??"unknown-digest"})`:`Integrity verification failed for ${a??"unknown"}: ${t.errors.join("; ")}`),{ok:t.ok,verification:t})}const{entries:f}=r;if(n)return{ok:!0,runId:a,artifacts:f.map(t=>({file:t.file.path,group:t.group.name,suite:{engineId:t.suite.engineId,name:t.suite.name,profileId:t.suite.profileId,testType:t.suite.testType},ref:t.artifactRef,payload:t.payload}))};if(e.format==="text")o(h(f));else for(const t of k(f))o(t);return{ok:!0,runId:a,count:f.length}}function k(i){if(i.length===0)return["No artifacts matched."];const e=[];for(const n of i)e.push(`${n.artifactRef.name}${n.artifactRef.kind?` [${n.artifactRef.kind}]`:""}`),n.artifactRef.summary&&e.push(` ${n.artifactRef.summary}`),e.push(` ${n.artifactRef.path}`);return e}function h(i){return i.length===0?"No artifacts matched.":i.map(e=>$(e)).join(`
|
|
2
2
|
|
|
3
|
-
`)}function
|
|
3
|
+
`)}function $(i){if(typeof i.payload?.text=="string")return i.payload.text.trimEnd();const e=c(i.payload?.data);return typeof e?.text=="string"?e.text.trimEnd():i.artifactRef.contentType==="application/json"&&d.existsSync(i.absolutePath)?d.readFileSync(i.absolutePath,"utf8").trimEnd():JSON.stringify(i.payload?.data??i.payload??null,null,2)}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{fileBug as
|
|
2
|
-
`)),{ok:!0,created:!0,...
|
|
1
|
+
import{bugRerun as c,fileBug as p,prepareBugFiling as f}from"../../../app/bugs/file.js";import{readRunArtifact as l}from"../../../app/bugs/run-reading.js";import{buildRunRequest as m}from"../../../app/run/request.js";import{executeRunRequest as v}from"../../operations/run/operation.js";import{renderAlreadyFiledBug as w,renderBugFileResult as R,renderBugFileRun as y}from"../../renderers/bug/text.js";export default async function b({args:o,flags:e,json:t,log:i}){const n={baseUrl:e["base-url"],database:e.database,endpoint:e.endpoint,env:e.env,envFrom:e["env-from"],environmentFile:e["environment-file"]},r=await f({cwd:process.cwd(),dir:e.dir,env:process.env,id:o.id,supplied:n});if(r.status==="already-filed")return t||i(w(r.issue)),{ok:!0,created:!1,draft:r.draft,issue:r.issue};t||i(y(r));const u=await c(r,e,n),d=await m({allowEmpty:!1,dir:e.dir,file:u.files,ignoreSkipRules:!1,skipSchemaSourceVerify:!1,supplied:n,vitest:u.ready.draft.vitest},null,process.cwd(),process.cwd(),process.env),s=await v(d,{json:t,outputMode:"compact"}),a=await p(u.ready,l(s.runArtifact,r.checkout.productPath));return t||i(R(a).join(`
|
|
2
|
+
`)),{ok:!0,created:!0,...a}}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{recordBug as n}from"../../../app/bugs/record.js";import{renderBugRecordResult as u}from"../../renderers/bug/text.js";export default async function
|
|
2
|
-
`)),{ok:!0,...
|
|
1
|
+
import{recordBug as n}from"../../../app/bugs/record.js";import{renderBugRecordResult as u}from"../../renderers/bug/text.js";export default async function d({args:t,flags:r,json:i,log:o}){const e=await n({dir:r.dir,file:t.file,vitest:r});return i||o(u(e).join(`
|
|
2
|
+
`)),{ok:!0,...e}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{executeDiscoverOperation as
|
|
1
|
+
import{executeDiscoverOperation as n}from"../../app/discover/index.js";import{renderDiscoverResult as p}from"../renderers/discover/text.js";import{selectedGroup as c}from"../command-flags.js";export default async function d({flags:t,json:o,log:u,notice:e}){const r=await n({diagnostics:t.strict?"error":"report",dir:t.dir,file:t.file||[],group:c(t,e),notice:e,output:t.output,runnableOnly:t["runnable-only"],suite:t.suite||[],type:t.type||[],vitest:t},process.cwd());if(!o)for(const i of p(r,{outputMode:t["output-mode"]}))u(i);return r}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{prepareReport as o}from"../../../app/reports/prepare.js";export default function s({args:i,flags:e,json:n,log:t}){const r=o({directory:i.directory,...e});return n||(t(`Prepared ${r.directory}
|
|
2
|
+
${r.files.join(`
|
|
3
|
+
`)}
|
|
4
|
+
Write and review the narrative before publication.`),r.instructions&&t(`Drafting instructions from ${r.instructions.path}:
|
|
5
|
+
${r.instructions.text}`)),{ok:!0,...r}}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{publishReport as n}from"../../../app/reports/publish.js";export default async function s({args:i,flags:r,json:t,log:o}){const e=await n({directory:i.directory,repository:r.repository,branch:r.branch,path:r.path,dir:r.dir,message:r.message});return t||o(`${e.changed?"Published":"Already published"} ${String(e.files)} files at ${e.revision}
|
|
2
|
+
${e.url}`),{ok:!0,...e}}
|
package/dist/cli/commands/run.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{applyKnownFailures as
|
|
2
|
-
`)),c(
|
|
1
|
+
import{applyKnownFailures as m,loadBugPolicy as l}from"../../app/bugs/gate.js";import{buildRunRequest as a}from"../../app/run/request.js";import{selectedGroup as w}from"../command-flags.js";import{executeRunRequest as y}from"../operations/run/operation.js";import{renderKnownFailures as k}from"../renderers/bug/text.js";export default async function v({args:n,flags:e,json:u,log:p,notice:i,setExitCode:c}){const d=w(e,i),t=await a({dir:e.dir,group:d??void 0,taskConcurrency:e["task-concurrency"],workers:e.workers,fileTimeoutSeconds:e["file-timeout-seconds"],type:e.type,suite:e.suite,file:e.file,allowEmpty:e["allow-empty"],ignoreSkipRules:e["ignore-skip-rules"],skipSchemaSourceVerify:e["skip-schema-source-verify"],supplied:{baseUrl:e["base-url"],database:e.database,endpoint:e.endpoint,env:e.env,envFrom:e["env-from"],environmentFile:e["environment-file"]},vitest:e},n.type||null,process.cwd(),process.cwd());t.ownershipNotice!==null&&i(t.ownershipNotice);const s=await l(t.productDir),o=await y(t,{outputMode:e["output-mode"]||"compact",json:u,debug:e.debug}),r=await m({env:process.env,exitCode:o.exitCode,failedOutsideTests:o.failure!==void 0,policy:s,productDir:t.productDir,run:o.runArtifact});return r.knownFailures!==null&&(o.outputMode==="compact"||o.outputMode==="debug")&&p(k(r.knownFailures).join(`
|
|
2
|
+
`)),c(r.exitCode),r.knownFailures===null?o:{...o,...r}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{runTestkitTypecheck as
|
|
1
|
+
import{runTestkitTypecheck as s,TestkitTypecheckError as u}from"../../app/typecheck/index.js";import{runWithCliProcessSignal as f}from"../process-signal.js";import{renderTypecheckResult as m}from"../renderers/typecheck/text.js";export default async function p({flags:r,json:i,log:e,notice:n}){const o=await f(t=>s({dir:r.dir,notice:n,signal:t,vitest:r})).catch(t=>{if(!i&&t instanceof u)for(const c of[t.result.stdout,t.result.stderr])c.trim()&&e(c.trimEnd());throw t});if(!i)for(const t of m(o))e(t);return o}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{inspectWorkspace as
|
|
1
|
+
import{inspectWorkspace as a}from"../../app/inspect/index.js";import{selectedGroup as u}from"../command-flags.js";export default async function l({flags:r,json:e,log:t,notice:i}){const s=await a({dir:r.dir,group:u(r,i),notice:i,status:!r["no-status"],targetLimit:r["target-limit"]});if(!e&&(t(`${s.product.name} \xB7 Testkit workspace`),s.discovery&&t(` ${String(s.discovery.summary.groups)} groups \xB7 ${String(s.discovery.summary.suites)} suites \xB7 ${String(s.discovery.summary.files)} files`),s.runs.live?t(` live ${s.runs.live.status} \xB7 ${String(s.runs.live.files.passed)}/${String(s.runs.live.files.total)} files complete`):s.runs.latest&&t(` latest ${s.runs.latest.status} \xB7 ${String(s.runs.latest.files.passed)}/${String(s.runs.latest.files.total)} files passed`),s.warnings.length>0))for(const n of s.warnings)t(` warning: ${n}`);return s}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export class CliUsageError extends Error{exitCode=2;constructor(
|
|
1
|
+
import{isPropertyContainer as r}from"../../kernel/unknown-values.js";export class CliUsageError extends Error{exitCode=2;constructor(e){super(e),this.name="CliUsageError"}}export function commandExitCode(t){if(!r(t))return 1;const e=Reflect.get(t,"exitCode");return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0&&e<=255?e:1}export function errorMessage(t){if(r(t)){const e=Reflect.get(t,"message");if(typeof e=="string"&&e.length>0)return e}return String(t)}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import{serializeCliError as g,writeStandardOutput as m}from"../json-errors.js";import{CliUsageError as
|
|
2
|
-
`)},
|
|
3
|
-
`)
|
|
4
|
-
`),e.
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import{serializeCliError as g,writeStandardOutput as m}from"../json-errors.js";import{CliUsageError as c,commandExitCode as p,errorMessage as h}from"./errors.js";import{renderCommandHelp as C,renderRootHelp as x,renderTopicHelp as S,renderVersion as E}from"./help.js";import{parseCommandArguments as O}from"./parser.js";export async function executeCliArguments(t,i){const e=H;if(t.length===1&&l(t[0])){await e.writeStandardOutput(x(i.identity,i.registrations));return}if(t.length===1&&$(t[0])){await e.writeStandardOutput(E(i.identity));return}let r;try{r=y(t,i)}catch(n){const o=F(t,i.registrations);if(o){await e.writeStandardOutput(S(o,i.registrations));return}await f(n,!1,e);return}if(w(r.argv,l)){await e.writeStandardOutput(C(r.registration,i.registrations));return}const a=r.registration.enableJsonFlag===!0&&w(r.argv,n=>n==="--json");try{const n=O(r.argv,r.registration.flags,r.registration.args,r.registration.enableJsonFlag===!0);await i.beforeAction?.(r.registration.id);const o=await r.registration.load(),d=new Set,u=await o.default({...n,json:a,log(s=""){e.writeStandardOutput(`${s}
|
|
2
|
+
`)},notice(s){d.has(s)||(d.add(s),e.writeStandardError(`Notice: ${s}
|
|
3
|
+
`))},setExitCode:e.setExitCode});a&&u!==void 0&&await e.writeStandardOutput(`${JSON.stringify(u,null,2)}
|
|
4
|
+
`)}catch(n){await f(n,a,e)}}function y(t,{registrations:i,removedCommands:e}){const a=i.filter(n=>n.id.every((o,d)=>t[d]===o)).sort((n,o)=>o.id.length-n.id.length).at(0);if(!a){const n=t.filter(o=>!o.startsWith("-")).at(0);throw n?new c(e?.get(n)??`Unknown command: ${n}`):new c("A Testkit command is required")}return{registration:a,argv:t.slice(a.id.length)}}async function f(t,i,e){const r=p(t);if(i){await e.writeStandardOutput(`${JSON.stringify({error:g(t)},null,2)}
|
|
5
|
+
`),e.setExitCode(r);return}e.setExitCode(r);const a=t instanceof c?`
|
|
6
|
+
Run "testkit --help" to see available commands and options.`:"";e.writeStandardError(`Error: ${h(t)}${a}
|
|
7
|
+
`)}function l(t){return t==="--help"||t==="-h"}function $(t){return t==="--version"||t==="-v"}function F(t,i){const e=t.findIndex(l);if(e<1)return null;const r=t.slice(0,e);return i.some(a=>a.id.length>r.length&&r.every((n,o)=>a.id[o]===n))?r:null}function w(t,i){const e=t.indexOf("--");return(e<0?t:t.slice(0,e)).some(i)}const H={setExitCode(t){process.exitCode=t},writeStandardError(t){process.stderr.write(t)},writeStandardOutput:m};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./definitions.js";import{CliUsageError as l}from"./errors.js";export function parseCommandArguments(n,t,e,i){const
|
|
1
|
+
import"./definitions.js";import{CliUsageError as l}from"./errors.js";export function parseCommandArguments(n,t,e,i){const s=t??{},o=y(s),a=q(s),r=new Set,f=[];let c=!1;for(let u=0;u<n.length;u+=1){const d=n[u];if(c){f.push(d);continue}if(d==="--"){c=!0;continue}if(d==="--json"){if(!i)throw g(d);continue}if(d.startsWith("--")){u=m(n,u,{aliases:o,definitions:s,flags:a,seenFlags:r});continue}if(d.startsWith("-")&&d!=="-"){u=v(n,u,{aliases:o,definitions:s,flags:a,seenFlags:r});continue}f.push(d)}return E(s,a),{args:j(f,e??{}),flags:a}}function m(n,t,e){const i=n[t],s=i.indexOf("="),o=i.slice(2,s<0?void 0:s),a=k(o,e.definitions);if(!a)throw g(`--${o}`);const{definition:r,name:f,negated:c}=a;if(r.kind==="boolean"){if(s>=0)throw new l(`Boolean flag --${o} does not take a value`);if(c&&!r.allowNo)throw g(`--${o}`);return h(f,r,e.seenFlags),e.flags[f]=!c,t}if(c)throw g(`--${o}`);const w=s<0?null:i.slice(s+1),u=p(n,t,`--${f}`,w,r);return h(f,r,e.seenFlags),$(e.flags,f,r,u.values),u.index}function v(n,t,e){const i=n[t],s=i.slice(1,2),o=e.aliases.get(s);if(!o)throw g(`-${s}`);const a=e.definitions[o],r=i.slice(2);if(a.kind==="boolean"){if(r.startsWith("="))throw new l(`Boolean flag -${s} does not take a value`);if(r.length>0)throw g(i);return h(o,a,e.seenFlags),e.flags[o]=!0,t}const f=r.length===0?null:r.startsWith("=")?r.slice(1):r,c=p(n,t,`-${s}`,f,a);return h(o,a,e.seenFlags),$(e.flags,o,a,c.values),c.index}function p(n,t,e,i,s){const o=[];let a=t;if(i!==null){if(i.length===0)throw new l(`Flag ${e} requires a value`);o.push(i)}else{const r=n.at(t+1);if(r===void 0||F(r,s))throw new l(`Flag ${e} requires a value`);o.push(r),a+=1}if(s.multiple)for(;;){const r=n.at(a+1);if(r===void 0||F(r,s))break;o.push(r),a+=1}return{index:a,values:o}}function $(n,t,e,i){if(e.multiple){const o=n[t];if(o!==void 0&&!Array.isArray(o))throw new Error(`Invalid internal default for multiple flag --${t}`);const a=o??[];for(const r of i)a.push(b(t,e,r));n[t]=a;return}const s=i.at(0);if(s===void 0)throw new Error(`Missing parsed value for --${t}`);n[t]=b(t,e,s)}function k(n,t){if(Object.hasOwn(t,n))return{definition:t[n],name:n,negated:!1};if(!n.startsWith("no-"))return null;const e=n.slice(3);return Object.hasOwn(t,e)?{definition:t[e],name:e,negated:!0}:null}function h(n,t,e){if(!t.multiple&&e.has(n))throw new l(`Flag --${n} can only be specified once`);e.add(n)}function F(n,t){return n==="-"||t.kind==="integer"&&/^-\d+$/u.test(n)?!1:n.startsWith("-")}function b(n,t,e){if(t.kind==="integer"){if(!/^-?\d+$/u.test(e))throw new l(`Expected --${n} to be an integer; received ${JSON.stringify(e)}`);const i=Number(e);if(!Number.isSafeInteger(i))throw new l(`Expected --${n} to be a safe integer; received ${JSON.stringify(e)}`);return i}return O(e,t.options,`--${n}`),e}function j(n,t){const e=Object.entries(t);if(n.length>e.length)throw new l(`Unexpected argument ${JSON.stringify(n[e.length])}`);const i={};for(const[s,[o,a]]of e.entries()){const r=n.at(s);if(r===void 0){if(a.required)throw new l(`Missing required argument ${o}`);i[o]=void 0;continue}a.check?.(r),O(r,a.options,o),i[o]=r}return i}function O(n,t,e){if(!(!t||t.includes(n)))throw new l(`Expected ${e} to be one of: ${t.join(", ")}; received ${JSON.stringify(n)}`)}function q(n){const t={};for(const[e,i]of Object.entries(n))t[e]=i.default;return t}function y(n){const t=new Map;for(const[e,i]of Object.entries(n)){if(!i.char)continue;if(!/^[A-Za-z0-9]$/u.test(i.char))throw new Error(`Invalid short flag alias for --${e}: ${i.char}`);const s=t.get(i.char);if(s)throw new Error(`Duplicate short flag alias -${i.char} for --${s} and --${e}`);t.set(i.char,e)}return t}function E(n,t){const e=Object.entries(n).filter(([i,s])=>s.required&&t[i]===void 0).map(([i])=>`--${i}`);if(e.length>0)throw new l(`Missing required flag${e.length===1?"":"s"}: ${e.join(", ")}`)}function g(n){return new l(`Unknown flag: ${n}`)}
|
package/dist/cli/json-errors.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{serializeError as
|
|
1
|
+
import{hasErrorCode as i,serializeError as n}from"../kernel/error-serialization.js";export function serializeCliError(r){return n(r)}export function writeStandardOutput(r){return new Promise((o,s)=>{const e=t=>{t?i(t,"EPIPE")?o():s(t):(process.stdout.off("error",e),o())};process.stdout.once("error",e),process.stdout.write(r,e)})}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{runAll as
|
|
2
|
-
`),{outputMode:
|
|
1
|
+
import{runAll as l}from"../../../app/run/orchestrator.js";export async function executeRunRequest(n,{outputMode:e="compact",json:u=!1,debug:c=!1,environments:o,terminal:a={}}={}){const r=a.stdout||process.stdout,t=resolveRunOutputMode(e,u,c),d=t==="json"?()=>{}:t==="events"?(await import("../../renderers/run/events.js")).createRunEventsListener({stdout:r}):(await import("../../renderers/run/text-reporter.js")).createRunTextListener({outputMode:t,stdout:r});if(n.supplied!==null&&o?.supplied!==void 0)throw new Error("Supplied values came from both the run request and its caller; pass them in one place");const i=n.supplied===null?o:{...o,supplied:n.supplied},p=await l(n.groups,n.typeValues,n.suiteSelectors,{debug:t==="debug",onEvent:d,productDir:n.productDir,...i===void 0?{}:{environments:i},...n.runOptions},n.services),s=p.runArtifact.archive.runId;return(t==="compact"||t==="debug")&&r.write(`Run ID: ${s}
|
|
2
|
+
`),{outputMode:t,runId:s,...p}}export function resolveRunOutputMode(n,e,u){return e?"json":u?"debug":n==="debug"||n==="events"||n==="json"?n:"compact"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{formatShare as s}from"../../../app/campaigns/brief.js";const i=12,a=20;export function renderBugRecordResult(e){return[`Recorded ${e.draft.id}`,`Draft: ${e.path}`,...e.redactedFields.length===0?[]:[`Redacted secrets in: ${e.redactedFields.join(", ")}`],...e.replaced?["Replaced the earlier draft for this test."]:[],...e.unreadableDrafts.map(n=>`Testkit cannot read ${n.file}: ${n.problem}`),`Next: commit and push the test, then run \`testkit bug file ${e.draft.id}\`.`]}export function renderAlreadyFiledBug(e){return`Already filed as #${String(e.number)}: ${e.url}`}export function renderBugFileRun(e){return`Running ${e.draft.test.file} at ${e.filing.foundAt.slice(0,i)}. Testkit files the bug when the test fails.`}export function renderBugFileResult(e){return[`Filed #${String(e.issue.number)}: ${e.issue.url}`,e.area===null?"Area: none, because testkit.config.ts has no areas":`Area: ${e.area.id}, ${s(e.area.share)} of source bytes`,e.introducedBy===null?"Introduced by: unknown, because this shallow clone stops before the commit that wrote the faulty lines":`Introduced by: ${e.introducedBy.slice(0,i)}`,`Draft: ${e.path}`]}export function renderKnownFailures(e){const n=e.known.length,t=n-a;return[...e.trackerProblem===null?[]:[`Testkit could not read the open bugs, so every failure counts as new: ${e.trackerProblem}`],e.new.length===0?`Known failures: ${String(n)}. Every failing test has an open bug, so the run passes.`:`New failures: ${String(e.new.length)}. Known failures: ${String(n)}. The run fails on the new failures.`,...e.known.slice(0,a).map(({failure:r,issue:o})=>` #${String(o.issue)} ${r.file}: ${r.title??"failed without naming a test"}`),...t>0?[` and ${String(t)} more`]:[]]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{TEST_TYPE_ORDER as
|
|
1
|
+
import{TEST_TYPE_ORDER as j,formatTestTypeLabel as D}from"../../../domain/test-types.js";import{bold as l,colorDiagnosticSeverity as M,colorService as R,colorTypeBadge as N,statusLabel as w,dim as d}from"../../terminal/colors.js";const B=j,m="\u251C\u2500\u2500 ",y="\u2514\u2500\u2500 ",L="\u2502 ",b=" ";export function buildDiscoveryReportLines(s,e={}){return(e.outputMode||"compact")==="verbose"?O(s):A(s)}function A(s){const e=[];e.push(`${i(l("Summary"))} ${String(s.summary.files)} files \xB7 ${String(s.summary.activeFiles)} active \xB7 ${String(s.summary.skippedFiles)} skipped \xB7 ${String(s.summary.suites)} suites \xB7 ${String(s.summary.groups)} groups`),P(e,s.diagnostics);const t=G(s.suites),n=new Map(s.files.map(o=>[o.path,o]));for(const o of s.groups){e.push(""),e.push(`${i(R(o.name))} ${i(d(`(${String(o.fileCount)} files${o.uses.length>0?` \xB7 uses ${o.uses.join(", ")}`:""})`))}`);const u=t.get(o.name)||new Map,r=H([...u.keys()]);for(let c=0;c<r.length;c+=1){const S=r[c],T=c===r.length-1,F=T?y:m,k=T?b:L,$=u.get(S)||[];e.push(`${F}${V(S)}`);for(let f=0;f<$.length;f+=1){const a=$[f],C=f===$.length-1,I=C?y:m,x=C?b:L;e.push(`${k}${I}${i(l(a.suiteLabel))} ${i(d(`(${String(a.fileCount)} files \xB7 ${a.engineId} \xB7 ${a.profileId})`))}`);const g=a.filePaths.flatMap(p=>n.get(p)??[]).sort(Y);for(let p=0;p<g.length;p+=1){const h=g[p],_=p===g.length-1?y:m,E=h.skipped?`${i(w("SKIP"))} ${h.skipReason||""}`:"";e.push(`${k}${x}${_}${h.displayName}${E?` ${E}`:""}`)}}}}return e}function O(s){const e=[];e.push(`${i(l("Summary"))} ${JSON.stringify(s.summary)}`),s.configFile&&e.push(`config ${s.configFile}`),P(e,s.diagnostics);for(const t of s.groups){e.push(""),e.push(i(R(t.name))),e.push(` roots ${t.roots.join(", ")}`),t.uses.length>0&&e.push(` uses ${t.uses.join(", ")}`),e.push(` files ${String(t.fileCount)} \xB7 active ${String(t.activeFileCount)} \xB7 skipped ${String(t.skippedFileCount)}`);const n=s.suites.filter(o=>o.group===t.name).sort(v);for(const o of n){e.push(` suite ${[o.testType,o.name].filter(Boolean).join(":")} engine=${o.engineId} profile=${o.profileId} ${i(d(`${String(o.fileCount)} files`))}`),o.locks.length>0&&e.push(` locks ${o.locks.join(", ")}`);for(const u of s.files.filter(r=>o.filePaths.includes(r.path)))e.push(` ${u.displayName}`),e.push(` path ${u.path}`),e.push(` id ${u.id}`),e.push(` status ${u.skipped?"skipped":"active"}`),u.skipReason&&e.push(` skipReason ${u.skipReason}`),u.locks.length>0&&e.push(` locks ${u.locks.join(", ")}`)}}return e}function P(s,e=[]){if(e.length!==0){s.push(""),s.push(i(l("Diagnostics")));for(const t of e){const n=t.path?` ${t.path}`:"";s.push(` ${i(M(t.severity))} ${t.code}${n}`),s.push(` ${t.message}`)}}}function G(s){const e=new Map;for(const t of s){let n=e.get(t.group);n||(n=new Map,e.set(t.group,n));const o=n.get(t.testType)||[];o.push(t),n.set(t.testType,o.sort(v))}return e}function H(s){const e=t=>t===void 0?B.length:B.indexOf(t);return[...s].sort((t,n)=>e(t)-e(n))}function V(s){return s===void 0?"Vitest":`${i(N(s.toUpperCase()))} ${D(s)}`}function v(s,e){return s.suiteLabel.localeCompare(e.suiteLabel)||s.name.localeCompare(e.name)}function Y(s,e){return s.displayName.localeCompare(e.displayName)||s.path.localeCompare(e.path)}function i(s){return String(s)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function renderDoctorResult(e){const n=[`testkit doctor ${e.ok?"passed":"failed"} for ${e.productDir}`];for(const
|
|
1
|
+
import{isUnknownRecord as s}from"../../../kernel/unknown-values.js";export function renderDoctorResult(e){const n=[`testkit doctor ${e.ok?"passed":"failed"} for ${e.productDir}`];for(const o of e.checks){n.push(`${o.level.toUpperCase()} ${o.code} ${o.message}`);for(const t of o.details?.slice(0,5)??[]){const r=i(t);r&&n.push(r)}}return n}function i(e){if(!s(e)||typeof e.ruleId!="string")return null;const n=typeof e.file=="string"?e.file:"unknown",o=typeof e.line=="number"?String(e.line):"?",t=typeof e.message=="string"?e.message:"";return` ${e.ruleId} ${n}:${o} ${t}`}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export function createRunEventsListener(
|
|
2
|
-
`)}return r=>{switch(r.type){case"run.
|
|
1
|
+
export function createRunEventsListener(a={}){const{stdout:o=process.stdout}=a;function s(r,i){const u=JSON.stringify({...i,type:r});if(typeof u!="string")throw new Error(`Unable to serialize run event ${r}`);o.write(`${u}
|
|
2
|
+
`)}return r=>{switch(r.type){case"run.group_plans":s(r.type,{groups:r.groups});return;case"run.total_files":s(r.type,{total:r.total});return;case"run.phase_started":s(r.type,{label:r.label});return;case"run.toolchain_resolved":s(r.type,{service:r.service,runtimeLabel:r.runtimeLabel,summary:r.summary});return;case"run.setup_finished":s(r.type,{service:r.operation.serviceName,stage:r.operation.stage,status:r.operation.status,summary:r.operation.summary||null,durationMs:r.operation.durationMs??null,error:r.operation.error||null});return;case"run.operation_finished":case"run.operation_progress":case"run.operation_started":s(r.type,{operation:r.operation});return;case"run.local_service_starting":s(r.type,{service:r.service,runtimeLabel:r.runtimeLabel,command:r.command});return;case"run.group_skipped":s(r.type,{group:r.group,reason:r.reason});return;case"run.task_planned_skip":s(r.type,{group:r.group,file:r.file,testType:r.testType,engineId:r.engineId,profileId:r.profileId,reason:r.reason});return;case"run.task_started":s(r.type,{group:r.group,file:r.file,suite:r.suite,testType:r.testType,engineId:r.engineId,profileId:r.profileId});return;case"run.task_finished":s(r.type,{group:r.group,file:r.file,suite:r.suite,testType:r.testType,engineId:r.engineId,profileId:r.profileId,outcome:r.outcome});return;case"run.error":s(r.type,{message:r.message});return;case"run.runtime_error":s(r.type,{group:r.group,file:r.file,message:r.message});return;case"run.debug":s(r.type,{line:r.line});return;case"run.summary":s(r.type,{results:r.results,durationMs:r.durationMs,runStatus:r.runStatus});return;case"run.warning":return}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{sanitizeErrorMessage as
|
|
1
|
+
import{sanitizeErrorMessage as c}from"../../../kernel/error-serialization.js";export function formatDuration(e){const t=Math.max(0,Math.round(e/1e3)),i=Math.floor(t/60),r=t%60;return i===0?`${String(r)}s`:`${String(i)}m ${String(r).padStart(2,"0")}s`}function x(e){const t=e.skippedSuiteCount||0,i=e.completedSuiteCount-e.failedSuiteCount-t,r=e.suiteCount-e.completedSuiteCount;let s=`${String(i)}/${String(e.suiteCount)} suites passed`;return(e.totalFileCount||0)>0&&(s+=`, ${String(e.passedFileCount)}/${String(e.totalFileCount)} files passed`),t>0?s+=`, ${String(t)} ${f(t,"suite","suites")} skipped`:(e.skippedFileCount||0)>0&&(s+=`, ${String(e.skippedFileCount)} ${f(e.skippedFileCount,"file","files")} skipped`),r>0?s+=`, ${String(r)} ${f(r,"suite","suites")} not run`:(e.notRunFileCount||0)>0&&(s+=`, ${String(e.notRunFileCount)} ${f(e.notRunFileCount,"file","files")} not run`),s}function A(e){return e.reduce((t,i)=>Math.max(t,i.name.length),4)}export function buildRunSummaryData(e,t,i=null){const r=M(e),s=L(e);return{result:i==="failed"||i==="interrupted"||r.failedServices>0||r.infraFailedServices>0?"FAILED":"PASSED",totalServices:r.totalServices,failedServices:r.failedServices,infraFailedServices:r.infraFailedServices,blockedByRuntimeServices:r.blockedByRuntimeServices,passed:r.passedFiles,failed:r.failedFiles,skipped:r.skippedFiles,notRun:r.notRunFiles,files:r.totalFiles,duration:formatDuration(t),serviceErrors:s}}export function buildDebugRunSummaryLines(e,t,i=null){const r=e.length,s=e.filter(n=>!n.skipped),u=e.filter(n=>n.skipped),d=s.filter(n=>n.failed),p=s.filter(n=>n.infraFailed),m=s.filter(n=>!n.failed&&!n.infraFailed),C=s.reduce((n,o)=>n+o.suiteCount,0),h=s.reduce((n,o)=>n+o.completedSuiteCount,0),S=s.reduce((n,o)=>n+(o.skippedSuiteCount||0),0),R=s.reduce((n,o)=>n+o.failedSuiteCount,0),E=h-R-S,g=s.reduce((n,o)=>n+(o.totalFileCount||0),0),D=s.reduce((n,o)=>n+(o.passedFileCount||0),0),$=s.reduce((n,o)=>n+(o.skippedFileCount||0),0),a=["","\u2550\u2550 Summary \u2550\u2550",[`groups ${String(m.length)}/${String(s.length)} passed`,`suites ${String(E)}/${String(C)} passed`,g>0?`files ${String(D)}/${String(g)} passed`:null,S>0?`suites ${String(S)} skipped`:null,$>0?`files ${String($)} skipped`:null,u.length>0?`${String(u.length)} skipped`:null,`duration ${formatDuration(t)}`].filter(Boolean).join(" \xB7 ")];for(const n of e){const o=j(n)?"SKIP":n.failed?"FAIL":n.infraFailed?"INFRA":"PASS",b=n.skipped?"no matching suites":x(n);if(a.push(`${o.padEnd(4)} ${n.name.padEnd(A(e))} ${b} \xB7 ${formatDuration(n.durationMs)}`),!(!n.failed&&!n.infraFailed)){for(const l of n.suites.filter(F=>F.failed)){const F=l.failedFiles.length>0?` (${l.failedFiles.join(", ")})`:"",y=[l.testType,l.name].filter(Boolean).join(":");a.push(` - ${y}${F} \xB7 ${formatDuration(l.durationMs)}`),l.error&&a.push(` ${l.error}`)}for(const l of n.errors)a.push(` - error: ${l}`)}}return i==="failed"||i==="interrupted"||d.length>0||p.length>0?(a.push("",d.length===0&&p.length===0?"Result: FAILED (run gate)":`Result: FAILED (${I({failedServices:d.length,infraFailedServices:p.length,totalServices:r})})`),a):(a.push("","Result: PASSED"),a)}export function buildFailurePresentation(e){const t=P(e.failureDetails||[]),i=t[0]||null,r=t.map(u=>c((u.message||u.title).trim())),s=[];for(const u of t.slice(1)){const d=v(u.message||u.title,220);d&&!s.includes(d)&&s.push(d)}return{primary:v(B(e,{error:e.suiteError||null},i,r),240),details:s}}function M(e){const t=e.filter(i=>!i.skipped);return{totalServices:e.length,failedServices:t.filter(i=>i.failed).length,infraFailedServices:t.filter(i=>i.infraFailed).length,blockedByRuntimeServices:t.filter(i=>i.blockedByRuntime).length,totalFiles:t.reduce((i,r)=>i+(r.totalFileCount||0),0),passedFiles:t.reduce((i,r)=>i+(r.passedFileCount||0),0),failedFiles:t.reduce((i,r)=>i+(r.failedFileCount||0),0),skippedFiles:t.reduce((i,r)=>i+(r.skippedFileCount||0),0),notRunFiles:t.reduce((i,r)=>i+(r.notRunFileCount||0),0)}}function I(e){const t=[`${String(e.failedServices)}/${String(e.totalServices)} groups failed`];return(e.infraFailedServices||0)>0&&t.push(`${String(e.infraFailedServices)} infra-blocked`),t.join(", ")}function B(e,t,i,r){if(i?.message)return c(i.message.trim());const s=c(e.error||"");return s||(r.length>0?r[0]:s||c(t.error||"Failed"))}function P(e){return[...e].sort((t,i)=>k(t)-k(i)||(t.key||"").localeCompare(i.key||""))}function k(e){return e.location||e.stack?3:e.message?4:5}function v(e,t=180){return e.replace(/\s+/g," ").trim().slice(0,t)}function L(e){return e.reduce((t,i)=>t+i.errors.length,0)}function f(e,t,i){return e===1?t:i}function j(e){return e.skipped?!0:!e.failed&&(e.skippedSuiteCount||0)>0&&(e.skippedSuiteCount||0)===e.suiteCount&&(e.notRunFileCount||0)===0}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{describeLiveArtifactState as c,latestOperation as l}from"../../../app/status/runs.js";import{formatOperationSummary as m}from"../../../domain/operation-display.js";import{asUnknownRecord as a,displayString as
|
|
1
|
+
import{describeLiveArtifactState as c,latestOperation as l}from"../../../app/status/runs.js";import{formatOperationSummary as m}from"../../../domain/operation-display.js";import{asUnknownRecord as a,displayString as u}from"../../../kernel/unknown-values.js";export function renderRunStatusLines(s){const t=["Testkit Run Status",` product: ${s.productDir}`],r=s.runs??[];if(r.length===0)t.push(" local runs: none");else{t.push(" local runs:");for(const n of r)t.push(` ${String(n.runId)}: ${n.active?"active":n.terminal?"terminal":"stale"} pid=${String(n.pid)} status=${n.status||"unknown"}`)}const o=a(s.live),i=o?a(o.operation):null,p=o?a(o.timings):null,e=l(i?[i]:p?.operations??[]);if(o){const n=c({...s,live:o});t.push(" live artifact:"),t.push(` run: ${n.runId} status=${n.status}`),n.reason&&t.push(` reason: ${n.reason}`),e&&t.push(` operation: ${formatStatusOperation(e)}`)}return t}export function formatStatusOperation(s={}){const t=a(s)??{},r=m(t),o=u(t.name,"operation"),i=u(t.status,"unknown");return`${o} ${i}${r?` - ${r}`:""}`}
|
|
@@ -1,23 +1,25 @@
|
|
|
1
|
-
import k from"node:path";import{buildDebugRunSummaryLines as
|
|
2
|
-
`);return;case"run.phase_started"
|
|
3
|
-
`);return;case"run.operation_finished":{if(!
|
|
4
|
-
`);return}case"run.local_service_starting":if(
|
|
5
|
-
`);return;case"run.
|
|
6
|
-
`);return;case"run.task_planned_skip":e.write(`${
|
|
7
|
-
`);return;case"run.task_started":if(
|
|
8
|
-
`);return;case"run.task_finished":{u+=1;const i=r.outcome,
|
|
9
|
-
`),
|
|
10
|
-
`)}return}case"run.
|
|
11
|
-
`),e.write(` ${
|
|
12
|
-
`);return;case"run.
|
|
13
|
-
`)
|
|
1
|
+
import k from"node:path";import{buildDebugRunSummaryLines as I,buildRunSummaryData as F,formatDuration as p}from"./formatting.js";import{formatOperationSummary as T,isNeutralOperationStatus as A,isSuccessfulOperationStatus as M,operationStatusLabel as O}from"../../../domain/operation-display.js";import{boldRed as m,colorSectionLine as P,dim as c,statusLabel as a}from"../../terminal/colors.js";import{getTerminalWidth as D}from"../../terminal/layout.js";import{renderFailureBlock as U}from"./failure.js";export function createRunTextListener(t={}){const{outputMode:n="compact",stdout:e=process.stdout}=t;let u=0,s=0;return r=>{switch(r.type){case"run.total_files":s=r.total;return;case"run.debug":e.write(`${r.line}
|
|
2
|
+
`);return;case"run.phase_started":$(n,e,r.label);return;case"run.toolchain_resolved":g(n,e,r.service,r.runtimeLabel,r.summary);return;case"run.setup_finished":S(n,e,r.operation);return;case"run.operation_started":case"run.operation_progress":if(!w(n,r.operation))return;e.write(`${a("RUN")} INFRA ${b(r.operation)}
|
|
3
|
+
`);return;case"run.operation_finished":{if(!w(n,r.operation,{finished:!0}))return;const i=O(r.operation.status);e.write(`${a(i)} INFRA ${b(r.operation)}
|
|
4
|
+
`);return}case"run.local_service_starting":if(n!=="debug")return;e.write(`Starting ${r.runtimeLabel}:${r.service}: ${r.command}
|
|
5
|
+
`);return;case"run.group_skipped":e.write(`${a("SKIP")} ${r.group} ${r.reason}
|
|
6
|
+
`);return;case"run.task_planned_skip":e.write(`${a("SKIP")} ${f(r.group,r.testType,h(r.file))} ${c("0s")} ${l(r.reason||"skipped")}
|
|
7
|
+
`);return;case"run.task_started":if(n!=="debug")return;e.write(`${a("RUN")} ${f(r.targetName,r.testType,r.file)}
|
|
8
|
+
`);return;case"run.task_finished":{u+=1;const i=r.outcome,o=i.status==="not_run"?"NOT RUN":i.status==="skipped"||i.status==="cancelled"||i.status==="interrupted"?"SKIP":i.status==="failed"?"FAIL":"PASS",d=p(i.durationMs||0),y=i.status==="not_run"||i.status==="cancelled"||i.status==="interrupted"?` ${c(l(i.reason||"not run"))}`:"",L=n==="compact"&&s>0?`${c(`[${String(u)}/${String(s)}]`)} `:"";if(e.write(`${L}${a(o)} ${f(r.group,r.testType,h(r.file))} ${c(d)}${y}
|
|
9
|
+
`),o==="FAIL"){const N=U({engineId:r.engineId,file:r.file,profileId:r.profileId,serviceName:r.group,testType:r.testType},i,{width:D(e,100)});for(const R of N)e.write(`${R}
|
|
10
|
+
`)}return}case"run.error":e.write(`${a("FAIL")} run error
|
|
11
|
+
`),e.write(` ${m(l(r.message))}
|
|
12
|
+
`);return;case"run.runtime_error":e.write(`${a("FAIL")} ${r.group} runtime error
|
|
13
|
+
`),e.write(` ${m(l(r.message||"runtime error"))}
|
|
14
|
+
`);return;case"run.summary":x(n,e,r.results,r.durationMs,r.runStatus);return;case"run.group_plans":case"run.warning":return}}}export function createTextStepProgressReporter(t={}){const{debug:n=!1,stdout:e=process.stdout}=t,u=n?"debug":"compact";return{outputMode:u,phaseStarted(s){$(u,e,s)},setupOperationFinished(s){s&&S(u,e,s)},toolchainResolved(s,r){g(u,e,s.serviceName,s.runtimeLabel,r)},writeDebugLine(s=""){e.write(`${s}
|
|
15
|
+
`)}}}function $(t,n,e){t==="debug"&&n.write(`
|
|
14
16
|
\u2500\u2500 ${e} \u2500\u2500
|
|
15
|
-
`)}function
|
|
16
|
-
`)}function
|
|
17
|
-
`);return}if(t==="compact"&&
|
|
18
|
-
`)}}function
|
|
19
|
-
`);for(const d of
|
|
20
|
-
`);return}const r=
|
|
21
|
-
`),
|
|
22
|
-
`);for(const[
|
|
23
|
-
`)}function l(t){return(t??"").replace(/\s+/g," ").trim().slice(0,180)}function
|
|
17
|
+
`)}function g(t,n,e,u,s){t==="debug"&&n.write(`[testkit] ${u}:${e} toolchain ${s}
|
|
18
|
+
`)}function S(t,n,e){if(e.status==="cached")return;const u=p(e.durationMs||0);if(e.status==="failed"){const s=l(e.error||e.summary||e.stage);n.write(`${a("FAIL")} SETUP ${e.serviceName} ${e.stage} ${c(u)} ${m(s)}
|
|
19
|
+
`);return}if(t==="compact"&&K(e)&&(e.durationMs||0)>=5e3){const s=l(e.summary||e.stage);n.write(`${a("RUN")} SETUP ${e.serviceName} ${s} ${c(u)}
|
|
20
|
+
`)}}function x(t,n,e,u,s){if(t==="debug"){const o=I(e,u,s);n.write(`
|
|
21
|
+
`);for(const d of o)n.write(`${P(d)}
|
|
22
|
+
`);return}const r=F(e,u,s),i=[["Result",r.result],["Passed",String(r.passed)],["Failed",String(r.failed)],["Skipped",String(r.skipped)],["Not run",String(r.notRun)],["Files",String(r.files)]];r.serviceErrors>0&&i.push(["Runtime errors",String(r.serviceErrors)]),i.push(["Duration",r.duration]),n.write(`
|
|
23
|
+
`),n.write(`Summary
|
|
24
|
+
`);for(const[o,d]of i)n.write(`${o}: ${d}
|
|
25
|
+
`)}function l(t){return(t??"").replace(/\s+/g," ").trim().slice(0,180)}function h(t){return t.split(k.sep).join("/")}function K(t){return t.kind==="database-template"||t.kind==="runtime-prepare"}function w(t,n,{finished:e=!1}={}){return t==="debug"?!0:E(n)?e?M(n.status)?(n.durationMs||0)>=5e3:!A(n.status):!0:!1}function E(t){return t.kind==="runtime"}function b(t){const n=t.scope??{},e=j(t.name||t.kind||"operation"),u=_(n.serviceName),s=_(n.graphKey),r=[u?`service=${u}`:"",s?`graph=${s}`:""].filter(Boolean).join(" "),i=l(T(t)),o=t.durationMs==null?B(t.startedAt):p(t.durationMs||0);return[e,r?c(r):"",i?l(i):"",o?c(o):""].filter(Boolean).join(" ")}function _(t){return typeof t=="string"?t:""}function j(t){return t.replace(/^testkit\./,"").replaceAll("_","-")}function B(t){const n=Date.parse(t||"");return Number.isFinite(n)?p(Math.max(0,Date.now()-n)):""}function f(t,n,e){return n===void 0?`${t} ${e}`:`${t} ${n} ${e}`}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createColors as
|
|
1
|
+
import t from"node:tty";import{createColors as n}from"picocolors";const{FORCE_COLOR:o,NO_COLOR:u}=process.env,e=n(o===void 0?!u&&t.isatty(1):!["0","false"].includes(o));export function statusLabel(r){return r==="PASS"?e.green("PASS"):r==="FAIL"?e.red("FAIL"):r==="SKIP"?e.yellow("SKIP"):r==="NOT RUN"?e.yellow("NOT RUN"):r==="RUN"?e.cyan("RUN"):r}export function dim(r){return e.dim(r)}export function bold(r){return e.bold(r)}export function boldRed(r){return e.bold(e.red(r))}export function colorService(r){return e.cyan(e.bold(r))}export function colorTypeBadge(r){return r==="PW"?e.blue(e.bold(r)):r}export function colorDiagnosticSeverity(r){return r==="error"?e.red(e.bold("ERR")):r==="warning"?e.yellow(e.bold("WARN")):e.dim("INFO")}export function colorSectionLine(r){return r==="Case store issues:"||r==="Diagnosis:"?e.bold(r):/^Summary: /.test(r)?r.replace("Summary:",e.bold("Summary:")):/^Result: PASSED\b/.test(r)?r.replace("PASSED",e.green("PASSED")):/^Result: FAILED\b/.test(r)?r.replace("FAILED",e.red("FAILED")):r}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import u from"string-width";import s from"wrap-ansi";export function getTerminalWidth(r=process.stdout,t=100){const n=Number(r.columns);return Number.isFinite(n)&&n>0?n:t}export function
|
|
2
|
-
`)}export function renderIndentedBlock(r,{width:t,indent:n=" "}){const e=
|
|
1
|
+
import u from"string-width";import s from"wrap-ansi";export function getTerminalWidth(r=process.stdout,t=100){const n=Number(r.columns);return Number.isFinite(n)&&n>0?n:t}export function wrapText(r,t){return t<=0?[r]:s(r,t,{hard:!0,trim:!1,wordWrap:!0}).split(`
|
|
2
|
+
`)}export function renderIndentedBlock(r,{width:t,indent:n=" "}){const e=u(n),o=Math.max(12,t-e);return wrapText(r,o).map(i=>`${n}${i}`)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function
|
|
1
|
+
export function createHttpMethods(T){return{post:(t,e,...p)=>T("POST",t,e,...p),put:(t,e,...p)=>T("PUT",t,e,...p),patch:(t,e,...p)=>T("PATCH",t,e,...p),get:(t,...e)=>T("GET",t,void 0,...e),delete:(t,e,...p)=>T("DELETE",t,e,...p)}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{clearRepoConfig as
|
|
1
|
+
import{clearRepoConfig as I,getRepoConfig as O,registerRepoConfig as $}from"./runtime.js";import{normalizeDatabaseEnvToken as b,normalizeNextPresetEnv as N,normalizePresetEnv as A}from"./preset-env.js";const P=String;export function defineConfig(e){return e||{}}function F(e={}){return{...e,...e.maxConnections?{maxConnections:e.maxConnections}:{},...e.reservedConnections?{reservedConnections:e.reservedConnections}:{},...e.runtimeConnections?{runtimeConnections:e.runtimeConnections}:{}}}function v(e,n="baseUrl"){const t=b(e,"service name",!1);return`{${b(n,"endpoint field",!1)}:${t}}`}function R(e={}){const n=E(e.migrate),t=E(e.seed),r=E(e.verify);return{inputs:Array.isArray(e.inputs)?[...e.inputs]:void 0,migrate:n,seed:t,verify:r}}function z(e,n={}){return{kind:"command",run:e,...U(n)}}function _(e,n={}){return{kind:"sql-file",path:e,...U(n)}}function u(e,n={}){return{kind:"module",target:e,...U(n)}}function U(e={}){return{...e.cwd!==void 0?{cwd:e.cwd}:{},...e.inputs!==void 0?{inputs:[...e.inputs]}:{},...e.args!==void 0?{args:e.args}:{}}}function q(e,n={}){if(typeof e!="string"||e.trim().length===0)throw new Error("database.schema.fromEnv(...) requires a non-empty env var name");return{kind:"env",env:e.trim(),...n}}function f(e){return`@gfdelarue/testkit/config/database-steps#${e}`}function M(e={}){return u(f("verifySeed"),{args:e})}function V(e={}){return u(f("verifyRows"),{args:e})}function X(e={}){return u(f("runSql"),{args:e})}function G(e={}){return u(f("seedRows"),{args:e})}function H(e={}){return u(f("materializePostgresBinding"),{args:e})}function L(e={}){return u(f("updateRows"),{args:e})}function W(){return{kind:"now"}}function J(e){return{kind:"env",name:b(e,"database.values.env(...) name",!1)}}function K(e){return{kind:"json",value:e}}function Q(e){return{kind:"postgres-connection-from-env",prefix:b(e,"database.values.postgresConnectionFromEnv(...) prefix",!1)}}function Y(e={}){const{discovery:n,envFiles:t,template:r,inputs:s,migrate:o,seed:a,verify:d,...c}=e,i=r||D(e)?R({inputs:s,migrate:o,seed:a,verify:d,...r||{}}):void 0;return{discovery:n||{roots:[".testkit-fixture"]},envFiles:t,local:!1,database:F(i?{...c,template:i}:c)}}function D(e={}){return["inputs","migrate","seed","verify"].some(n=>Object.prototype.hasOwnProperty.call(e,n))}function B(e={}){return{...e}}function Z(e={}){return{kind:"tsc",cwd:e.cwd,entry:e.entry||"src/index.ts",tsconfig:e.tsconfig||"tsconfig.json",outDir:e.outDir||"dist",inputs:Array.isArray(e.inputs)?[...e.inputs]:void 0}}function ee(e={}){return{kind:"next",cwd:e.cwd,distDir:e.distDir||"dist",tsconfig:e.tsconfig||"tsconfig.json",inputs:Array.isArray(e.inputs)?[...e.inputs]:void 0}}function ne(e={}){const{baseUrl:n,build:t,buildInputs:r,cwd:s=".",entry:o="src/index.ts",env:a,envFiles:d,outDir:c="dist",port:i,readyPath:g="/health",readyTimeoutMs:S,shutdownTimeoutMs:p,readyUrl:h,runtime:m,start:C,toolchain:k,tsconfig:T="tsconfig.json",...l}=e,y=A(a),x=n||"http://127.0.0.1:{port}",w=t===void 0?Z({cwd:s,entry:o,tsconfig:T,outDir:c,inputs:r}):t,j=C||re(w,o);return{...l,envFiles:d,runtime:{...m||{},build:w,toolchain:k??m?.toolchain},local:{cwd:s,start:j,...i===void 0?{}:{port:i},baseUrl:x,readyUrl:h??`${x}${g}`,readyTimeoutMs:S,...p===void 0?{}:{shutdownTimeoutMs:p},env:y}}}function te(e={}){const{api:n,baseUrl:t,build:r,buildInputs:s,cwd:o=".",dependsOn:a,env:d,envFiles:c,mode:i="dev",port:g,readyTimeoutMs:S,shutdownTimeoutMs:p,readyUrl:h,runtime:m,start:C,toolchain:k,...T}=e,l={...N({api:n}),...A(d)},y=t||"http://127.0.0.1:{port}",x=r===void 0?i==="start"?ee({cwd:o,inputs:s}):null:r,w=C||(i==="start"?"{bin:next} start --port {port}":"{bin:next} dev -p {port}");return{...T,envFiles:c,dependsOn:Array.isArray(a)?[...a]:a,runtime:{...m||{},build:x,toolchain:k??m?.toolchain},local:{cwd:o,start:w,...g===void 0?{}:{port:g},baseUrl:y,readyUrl:h??y,readyTimeoutMs:S,...p===void 0?{}:{shutdownTimeoutMs:p},env:i==="start"?{NEXT_DIST_DIR:l.NEXT_DIST_DIR||".next-testkit/{runtimeId}/dist",NEXT_TSCONFIG_PATH:l.NEXT_TSCONFIG_PATH||".next-testkit/{runtimeId}/tsconfig.json",...l}:l}}}export const app={node:ne,next:te},database={schema:{fromEnv:q},steps:{materializePostgresBinding:H,runSql:X,seedRows:G,updateRows:L,verifyRows:V,verifySeed:M},values:{env:J,json:K,now:W,postgresConnectionFromEnv:Q},postgres(e={}){const{template:n,sourceSchema:t,inputs:r,migrate:s,seed:o,verify:a,...d}=e,c=t===void 0?d:{...d,sourceSchema:t},i=n||D(e)?R({inputs:r,migrate:s,seed:o,verify:a,...n||{}}):void 0;return F(i?{...c,template:i}:c)},fixture:Y},endpoint={baseUrl(e){return v(e,"baseUrl")},readyUrl(e){return v(e,"readyUrl")},publicBaseUrl(e){return v(e,"publicBaseUrl")},privateBaseUrl(e){return v(e,"privateBaseUrl")},serviceContextUrl(e){return v(e,"serviceContextUrl")}},step={command:z,module:u,sqlFile:_},presets={nodeNext(e={}){const n=e.workers;if(e.taskConcurrency!=null&&n!=null&&e.taskConcurrency!==n)throw new Error("presets.nodeNext taskConcurrency and workers must match when both are provided.");return{execution:{taskConcurrency:e.taskConcurrency??n??1,fileTimeoutSeconds:e.fileTimeoutSeconds??120},toolchains:{node:B({install:e.install??"download",...e.node?{node:e.node}:{},...e.npm?{npm:e.npm}:{}})}}}},toolchain={node:B};export{I as clearRepoConfig,O as getRepoConfig,$ as registerRepoConfig};function re(e,n){return e?.kind==="tsc"?`node {prepareDir}/${ie(n||e.entry||"src/index.ts",e.outDir||"dist")}`:`{bin:tsx} ${n||"src/index.ts"}`}function E(e){return e==null?[]:(Array.isArray(e)?e:[e]).map(t=>typeof t=="string"?z(t):t)}function ie(e,n){const r=P(e||"src/index.ts").replaceAll("\\","/").replace(/\.[cm]?[jt]sx?$/i,".js"),s=r.startsWith("src/")?r.slice(4):r;return`${n}/${s}`.replace(/\/+/g,"/")}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const i=String;export function normalizePresetEnv(e){if(!e)return{};if(!o(e))throw new Error("Preset env must be an object");const t=new Set(["values","databases"]),n=Object.keys(e).filter(a=>!t.has(a));if(n.length>0)throw new Error(`Preset env only supports "values" and "databases". Received unexpected key(s): ${n.join(", ")}`);const
|
|
1
|
+
import{isUnknownRecord as o}from"../../kernel/unknown-values.js";const i=String;export function normalizePresetEnv(e){if(!e)return{};if(!o(e))throw new Error("Preset env must be an object");const t=new Set(["values","databases"]),n=Object.keys(e).filter(a=>!t.has(a));if(n.length>0)throw new Error(`Preset env only supports "values" and "databases". Received unexpected key(s): ${n.join(", ")}`);const r=o(e.values)?e.values:{},s=o(e.databases)?e.databases:{};return{...c(s),...r}}export function normalizeDatabaseEnvToken(e,t,n=!0){const r=i(e||"").trim(),s=n?r.replace(/[^A-Za-z0-9]+/g,"_").replace(/^_+|_+$/g,""):r;if(!s)throw new Error(`${t} must be a non-empty string`);return s}export function normalizeNextPresetEnv({api:e}={}){const t={};if(e){const n=typeof e=="string"?e:e.baseUrl;n&&(t.NEXT_PUBLIC_API_URL=n)}return t}function c(e){const t={};for(const[n,r]of Object.entries(e)){if(!o(r))throw new Error(`env.databases.${n} must be an object`);const s=normalizeDatabaseEnvToken(r.prefix,`env.databases.${n}.prefix`),a=normalizeDatabaseEnvToken(r.service,`env.databases.${n}.service`,!1);t[`${s}_DATABASE_HOST`]=`{dbHost:${a}}`,t[`${s}_DATABASE_PORT`]=`{dbPort:${a}}`,t[`${s}_DATABASE_NAME`]=`{dbName:${a}}`,t[`${s}_DATABASE_USER`]=`{dbUser:${a}}`,t[`${s}_DATABASE_PASSWORD`]=`{dbPassword:${a}}`,t[`${s}_DATABASE_SSL`]=`{dbSsl:${a}}`}return t}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import m from"node:crypto";import o from"node:fs";import
|
|
1
|
+
import m from"node:crypto";import{isUnknownRecord as c}from"../../kernel/unknown-values.js";import o from"node:fs";import i from"node:path";import{fileURLToPath as d,pathToFileURL as p}from"node:url";import{buildWithEsbuildRetry as h}from"../../toolchains/esbuild.js";const u=i.resolve(i.dirname(d(import.meta.url)),"..","..",".."),k=i.join(u,"dist","index.js"),j=i.join(u,"dist","config","authoring","index.js"),w=new Set(["/environment","/node-vitest/data","/node-vitest/contract","/playwright"]),y=["testkit.config.ts","testkit.config.mts","testkit.config.mjs","testkit.config.js"];export function findConfigFile(t){for(const n of y){const e=i.join(t,n);if(o.existsSync(e))return e}return null}export async function loadTestkitConfig(t,n={}){const e=findConfigFile(t);if(!e)return{config:{},configFile:null};const r=i.join(t,".testkit","_config");o.mkdirSync(r,{recursive:!0});const s=b(e),a=i.join(r,`config-${s.slice(0,12)}.mjs`);await h({absWorkingDir:t,bundle:!0,entryPoints:[e],format:"esm",legalComments:"none",outfile:a,platform:"node",sourcemap:"inline",target:"es2020",plugins:[C()]});const l=[s,n.importCacheSalt||""].filter(Boolean).join("-"),g=await import(`${p(a).href}?v=${l}`),f=S(g);if(!c(f))throw new Error(`testkit config file must export an object: ${i.basename(e)}`);return{config:f,configFile:e}}function b(t){const n=o.readFileSync(t,"utf8");return m.createHash("sha256").update(t).update("\0").update(n).digest("hex")}function C(){return{name:"testkit-config-alias",setup(t){t.onResolve({filter:/^@gfdelarue\/testkit(?:\/.*)?$/},n=>({namespace:"file",path:E(n.path)}))}}}function E(t){const n=t.slice(18);if(!n)return k;if(n==="/config")return j;throw w.has(n)?new Error(`testkit.config.ts may not import engine authoring module "${t}". Use repository config helpers from @gfdelarue/testkit/config instead.`):new Error(`Unsupported @gfdelarue/testkit import "${t}" while loading testkit config`)}function S(t){if(c(t))return t.default||t.config||{}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{normalizeDatabaseBinding as u}from"./decode-execution.js";import{normalizeDatabaseRoles as m}from"./database-roles.js";import{materializeDatabaseConfig as b}from"./database-materialization.js";import"./execution-model.js";import{normalizeConfiguredInputs as d,normalizeConfiguredSteps as i}from"../../steps/configured-steps.js";export function normalizeDatabaseConfig(e,r){if(s(e.databaseFrom))return;const t=e.database;if(!s(t))return;const o=n(t,"user"),a=b({user:typeof o=="string"?o:void 0}).user;return{...g(t),binding:u(f(n(t,"binding"),"per-runtime"),`Service "${r}" database.binding`),maxConnections:c(n(t,"maxConnections"),`Service "${r}" database.maxConnections`),reservedConnections:p(n(t,"reservedConnections"),`Service "${r}" database.reservedConnections`),runtimeConnections:c(n(t,"runtimeConnections"),`Service "${r}" database.runtimeConnections`),reset:n(t,"reset")!==!1,roles:m(n(t,"roles"),r,a),sourceSchema:l(n(t,"sourceSchema"),r),template:normalizeDatabaseTemplateConfig(n(t,"template"),r),serviceName:r}}function c(e,r){if(e==null)return;const t=Number(e);if(!Number.isInteger(t)||t<=0)throw new Error(`${r} must be a positive integer`);return t}function p(e,r){if(e==null)return;const t=Number(e);if(!Number.isInteger(t)||t<0)throw new Error(`${r} must be a non-negative integer`);return t}export function normalizeDatabaseTemplateConfig(e,r){if(e==null)return{inputs:[],migrate:[],seed:[],verify:[]};if(typeof e!="object")throw new Error(`Service "${r}" database.template must be an object`);if(Object.prototype.hasOwnProperty.call(e,"schema"))throw new Error(`Service "${r}" database.template.schema has been removed. Configure database.sourceSchema instead.`);return{inputs:d(n(e,"inputs"),`Service "${r}" database.template`),migrate:i(n(e,"migrate"),`Service "${r}" database.template.migrate`),seed:i(n(e,"seed"),`Service "${r}" database.template.seed`),verify:i(n(e,"verify"),`Service "${r}" database.template.verify`)}}function l(e,r){if(e===!1||e===null)return null;if(e===void 0)return{kind:"auto",refresh:{mode:"auto"},unavailable:"auto",verify:!0};if(typeof e!="object"||Array.isArray(e))throw new Error(`Service "${r}" database.sourceSchema must be an object or false`);const t=f(n(e,"kind"),"env");if(t!=="env")throw new Error(`Service "${r}" database.sourceSchema.kind must be "env"`);if(Object.prototype.hasOwnProperty.call(e,"cachePath"))throw new Error(`Service "${r}" database.sourceSchema.cachePath has been removed. Testkit now manages commit-scoped source schema caches automatically.`);const o=n(e,"env");if(typeof o!="string"||o.trim().length===0)throw new Error(`Service "${r}" database.sourceSchema.env must be a non-empty string`);return{kind:t,env:o.trim(),refresh:h(n(e,"refresh"),r),unavailable:y(n(e,"unavailable"),r),verify:n(e,"verify")!==!1}}function h(e,r){if(e==null||e==="auto")return{mode:"auto"};if(e==="always")return{mode:"always"};if(typeof e=="object"&&!Array.isArray(e)){const t=n(e,"ttlSeconds");if(typeof t!="number"||!Number.isInteger(t)||t<0)throw new Error(`Service "${r}" database.sourceSchema.refresh.ttlSeconds must be a non-negative integer`);return{mode:"ttl",ttlSeconds:t}}throw new Error(`Service "${r}" database.sourceSchema.refresh must be "auto", "always", or { ttlSeconds }`)}function y(e,r){if(e==null||e==="auto")return"auto";if(e==="fail"||e==="warn-cache")return e;throw new Error(`Service "${r}" database.sourceSchema.unavailable must be "auto", "fail", or "warn-cache"`)}function s(e){return!!e}function f(e,r){return s(e)?e:r}function
|
|
1
|
+
import{normalizeDatabaseBinding as u}from"./decode-execution.js";import{normalizeDatabaseRoles as m}from"./database-roles.js";import{materializeDatabaseConfig as b}from"./database-materialization.js";import"./execution-model.js";import{normalizeConfiguredInputs as d,normalizeConfiguredSteps as i}from"../../steps/configured-steps.js";import{readDynamicProperty as n}from"../../kernel/unknown-values.js";export function normalizeDatabaseConfig(e,r){if(s(e.databaseFrom))return;const t=e.database;if(!s(t))return;const o=n(t,"user"),a=b({user:typeof o=="string"?o:void 0}).user;return{...g(t),binding:u(f(n(t,"binding"),"per-runtime"),`Service "${r}" database.binding`),maxConnections:c(n(t,"maxConnections"),`Service "${r}" database.maxConnections`),reservedConnections:p(n(t,"reservedConnections"),`Service "${r}" database.reservedConnections`),runtimeConnections:c(n(t,"runtimeConnections"),`Service "${r}" database.runtimeConnections`),reset:n(t,"reset")!==!1,roles:m(n(t,"roles"),r,a),sourceSchema:l(n(t,"sourceSchema"),r),template:normalizeDatabaseTemplateConfig(n(t,"template"),r),serviceName:r}}function c(e,r){if(e==null)return;const t=Number(e);if(!Number.isInteger(t)||t<=0)throw new Error(`${r} must be a positive integer`);return t}function p(e,r){if(e==null)return;const t=Number(e);if(!Number.isInteger(t)||t<0)throw new Error(`${r} must be a non-negative integer`);return t}export function normalizeDatabaseTemplateConfig(e,r){if(e==null)return{inputs:[],migrate:[],seed:[],verify:[]};if(typeof e!="object")throw new Error(`Service "${r}" database.template must be an object`);if(Object.prototype.hasOwnProperty.call(e,"schema"))throw new Error(`Service "${r}" database.template.schema has been removed. Configure database.sourceSchema instead.`);return{inputs:d(n(e,"inputs"),`Service "${r}" database.template`),migrate:i(n(e,"migrate"),`Service "${r}" database.template.migrate`),seed:i(n(e,"seed"),`Service "${r}" database.template.seed`),verify:i(n(e,"verify"),`Service "${r}" database.template.verify`)}}function l(e,r){if(e===!1||e===null)return null;if(e===void 0)return{kind:"auto",refresh:{mode:"auto"},unavailable:"auto",verify:!0};if(typeof e!="object"||Array.isArray(e))throw new Error(`Service "${r}" database.sourceSchema must be an object or false`);const t=f(n(e,"kind"),"env");if(t!=="env")throw new Error(`Service "${r}" database.sourceSchema.kind must be "env"`);if(Object.prototype.hasOwnProperty.call(e,"cachePath"))throw new Error(`Service "${r}" database.sourceSchema.cachePath has been removed. Testkit now manages commit-scoped source schema caches automatically.`);const o=n(e,"env");if(typeof o!="string"||o.trim().length===0)throw new Error(`Service "${r}" database.sourceSchema.env must be a non-empty string`);return{kind:t,env:o.trim(),refresh:h(n(e,"refresh"),r),unavailable:y(n(e,"unavailable"),r),verify:n(e,"verify")!==!1}}function h(e,r){if(e==null||e==="auto")return{mode:"auto"};if(e==="always")return{mode:"always"};if(typeof e=="object"&&!Array.isArray(e)){const t=n(e,"ttlSeconds");if(typeof t!="number"||!Number.isInteger(t)||t<0)throw new Error(`Service "${r}" database.sourceSchema.refresh.ttlSeconds must be a non-negative integer`);return{mode:"ttl",ttlSeconds:t}}throw new Error(`Service "${r}" database.sourceSchema.refresh must be "auto", "always", or { ttlSeconds }`)}function y(e,r){if(e==null||e==="auto")return"auto";if(e==="fail"||e==="warn-cache")return e;throw new Error(`Service "${r}" database.sourceSchema.unavailable must be "auto", "fail", or "warn-cache"`)}function s(e){return!!e}function f(e,r){return s(e)?e:r}function g(e){const r={};if(typeof e=="string"){for(let t=0;t<e.length;t+=1)Object.defineProperty(r,String(t),{configurable:!0,enumerable:!0,value:e[t],writable:!0});return r}if(e===null||typeof e!="object"&&typeof e!="function")return r;for(const t of Reflect.ownKeys(e))if(Object.getOwnPropertyDescriptor(e,t)?.enumerable){const a=Reflect.get(e,t);Object.defineProperty(r,t,{configurable:!0,enumerable:!0,value:a,writable:!0})}return r}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{DEFAULT_FILE_TIMEOUT_SECONDS as
|
|
1
|
+
import{DEFAULT_FILE_TIMEOUT_SECONDS as u,normalizeFileTimeoutSeconds as a,normalizePositiveInteger as c}from"../../domain/file-timeout.js";export function parseTaskConcurrencyOptions(e,n){return i(e,n,"--task-concurrency","--workers")??null}export function normalizeRuntimeInstances(e,n="runtime.instances"){return c(e,n)}export function normalizeRuntimeMaxConcurrentTasks(e,n="runtime.maxConcurrentTasks"){return e==null?Number.POSITIVE_INFINITY:c(e,n)}export function normalizeDatabaseBinding(e,n="database.binding"){const r=String(e).trim();if(r!=="shared"&&r!=="per-runtime")throw new Error(`Invalid ${n} value "${String(e)}". Expected one of: shared, per-runtime.`);return r}export function resolveExecutionConfig({cli:e={},repo:n={}}={}){const r=i(n.taskConcurrency,n.workers);return{taskConcurrency:i(e.taskConcurrency,e.workers,"--task-concurrency","--workers")??r??1,fileTimeoutSeconds:a(e.fileTimeoutSeconds??n.fileTimeoutSeconds??u)}}export function normalizeExecutionConfig(e={}){const n=new Set(["workers","taskConcurrency","fileTimeoutSeconds"]),r=Object.keys(e).filter(o=>!n.has(o));if(r.length>0)throw new Error(`execution received unexpected key(s): ${r.join(", ")}`);return{taskConcurrency:i(e.taskConcurrency,e.workers)??1,fileTimeoutSeconds:a(e.fileTimeoutSeconds??u)}}function i(e,n,r="execution.taskConcurrency",t="execution.workers"){const o=e==null?void 0:c(e,r),s=n==null?void 0:c(n,t);if(o!==void 0&&s!==void 0&&o!==s)throw new Error(`${r} and ${t} must match when both are provided.`);return o??s}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function resolveRuntimeConfigs(o,
|
|
1
|
+
export function resolveRuntimeClosure(s,o){const n=new Map;for(const t of s)for(const r of resolveRuntimeConfigs(t,o))n.set(r.name,r);return[...n.values()]}export function resolveRuntimeConfigs(s,o){const n=[],t=new Set,r=new Set,a=e=>{if(!r.has(e.name)){if(t.has(e.name))throw new Error(`Dependency cycle detected involving "${e.name}"`);t.add(e.name);for(const d of e.testkit.dependsOn||[]){const u=o.get(d);if(!u)throw new Error(`Service "${e.name}" depends on unknown service "${d}"`);a(u)}t.delete(e.name),r.add(e.name),n.push(e)}};return a(s),n}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import g from"path";import{randomUUID as z}from"node:crypto";import{loadConfigContext as D,resolveProductDir as A}from"./load.js";import{discoverProject as B,hasDiscoveryErrors as H,buildDiscoveryErrorFromDiagnostics as L}from"./discovery.js";import{loadTestkitConfig as V}from"./config-loader.js";import{TEST_TYPE_ORDER as _,isRunType as U}from"../../domain/test-types.js";import"../../domain/identifiers.js";import{DEFAULT_RUNTIME_ISOLATION_POLICY as q,resolveRuntimeIsolationPolicy as G}from"./runtime-isolation.js";import{resolveEngineProfile as Y}from"../../engines/catalog.js";import{readTestFileMetadata as K}from"./file-metadata.js";import{normalizeDiscoveryConfig as J}from"./decode-discovery.js";import"./path-policy.js";import{buildDiscoverySummary as Q,emptyDiscoverySummary as W}from"./discovery-summary.js";import{matchesSelectedTypes as X,matchesSuiteSelectors as k,normalizeTypeValues as Z,parseSuiteSelectors as ee}from"../../domain/suite-selection.js";import{errorMessage as P}from"../../kernel/error-serialization.js";import{isObjectRecord as E,readObjectRecord as I,readProperty as f}from"./values.js";const ie=9,C=String;export async function discoverTests(e={}){return(await loadDiscoveryContext(e)).discovery}export async function loadDiscoveredConfigContext(e={}){const i=await D({dir:e.dir,configImportCacheSalt:z()}),{discovery:t}=await loadDiscoveryContext({dir:i.productDir,diagnostics:"error"},i);return{context:i,discovery:t}}export async function loadDiscoveryContext(e={},i){const t=i?.productDir??A(process.cwd(),e.dir),o=le(e);if(i&&o.diagnosticsMode==="error"&&H(i.discovery.diagnostics))throw L(i.discovery.diagnostics);const r=i?{config:i.config,configFile:i.configFile,diagnostics:[]}:await te(t,o.diagnosticsMode),s={schemaVersion:ie,source:"testkit-discovery",product:{name:g.basename(t),directory:t},configFile:r.configFile?g.relative(t,r.configFile)||g.basename(r.configFile):null,filters:{service:o.serviceFilter,types:o.typeValues,suiteSelectors:o.suiteSelectors.map(n=>n.raw),fileNames:o.fileNames,runnableOnly:o.runnableOnly,diagnostics:o.diagnosticsMode},services:[],suites:[],files:[],diagnostics:[...r.diagnostics],summary:W()};if(!r.config)return{discovery:R(s),context:null};const a=ue(r.config),l=fe(a.services),p=i?.discovery??B(t,l,{strict:o.diagnosticsMode==="error",discovery:a.discovery}),v={project:p,fileMetadataByPath:new Map(i?.configs.flatMap(n=>[...n.testkit.fileMetadataByPath])??[])};s.diagnostics.push(...p.diagnostics),ae(o.serviceFilter,a.services,p);let y=i??null;try{y=i??await D({dir:t,preparedDiscovery:v,configContext:{config:r.config,configFile:r.configFile},discoveryOptions:{strict:o.diagnosticsMode==="error"}})}catch(n){if(o.diagnosticsMode==="error")throw n;s.diagnostics.push({code:"config_invalid",severity:"error",message:P(n)})}const h=ne({productDir:t,rawDiscovery:p,explicitServices:a.services,configs:y?.configs??[],fileMetadataByPath:v.fileMetadataByPath,filters:o});return{discovery:R({...s,...h}),context:y}}export function formatDisplayName(e){return C(e||"").split(/[-_/]+/g).filter(Boolean).map(i=>i.replace(/^\w/,t=>t.toUpperCase())).join(" ")}export function testTypeContract(e,i,t){const o=Y(e,i);if(o.id!==t)throw new Error(`Discovery profile mismatch for ${e}: metadata resolved ${t}, catalog resolved ${o.id}`);return e==="data"?{authoringApi:"@gfdelarue/testkit/node-vitest/data",executionHost:o.capabilities.executionHost,summary:"Data suites use the node-vitest engine and record Testkit data evidence; they are not raw Vitest or service-namespace tests."}:e==="contract"?{authoringApi:"@gfdelarue/testkit/node-vitest/contract",executionHost:o.capabilities.executionHost,summary:"Contract suites use the node-vitest engine for Node-backed service/runtime contracts without data-flow evidence requirements."}:i==="k6"?{authoringApi:"@gfdelarue/testkit/k6",executionHost:o.capabilities.executionHost}:i==="playwright"?{authoringApi:"@gfdelarue/testkit/playwright",executionHost:o.capabilities.executionHost}:{executionHost:o.capabilities.executionHost}}async function te(e,i){try{const t=await V(e),{config:o,configFile:r}=oe(t);return{config:o,configFile:r,diagnostics:[]}}catch(t){if(i==="error")throw t;return{config:null,configFile:null,diagnostics:[{code:"config_invalid",severity:"error",message:P(t)}]}}}function oe(e){if(!E(e))throw new Error("testkit config loader must return an object");const i=f(e,"config"),t=f(e,"configFile");if(!E(i)){const o=typeof t=="string"?g.basename(t):"testkit config file";throw new Error(`testkit config file must export an object: ${o}`)}if(t!==null&&typeof t!="string")throw new Error("testkit config loader returned an invalid config path");return{config:i,configFile:t}}function ne({configs:e,fileMetadataByPath:i,productDir:t,rawDiscovery:o,explicitServices:r,filters:s}){const a=new Map(e.map(n=>[n.name,n])),l=new Map,p=new Map,v=[],y=new Set([...Object.keys(r),...Object.keys(o.services),...a.keys()]);for(const n of y){if(s.serviceFilter&&n!==s.serviceFilter)continue;const c=a.get(n),u=o.services[n],d=r[n];l.set(n,{name:n,discovered:c!==void 0||!!u,localCwd:c?c.testkit.local?.cwd||".":d?.localCwd||u?.inferredLocalCwd||".",dependsOn:[...c?.testkit.dependsOn??d?.dependsOn??[]],suiteCount:0,fileCount:0,activeFileCount:0,skippedFileCount:0})}for(const n of o.files){const c=n.testType;if(!X(c,s.typeValues)||!k(c,n.suiteName,s.suiteSelectors)||s.serviceFilter&&n.serviceName!==s.serviceFilter||s.fileNameSet.size>0&&!s.fileNameSet.has(n.filePath))continue;const u=i.get(n.filePath)??K(t,n.filePath);i.set(n.filePath,u);const d=a.get(n.serviceName),m=d?.suites[c]?.find($=>$.name===n.suiteName);if(d&&(!m||m.testType!==c||m.engineId!==u.engineId||m.profileId!==u.profileId))throw new Error(`Normalized suite ${n.serviceName}/${c}:${n.suiteName} conflicts with file ${n.filePath}`);const S=d&&(u.skipReason||d.testkit.skip?.fileReasonByPath.get(n.filePath)||me(d,c,n.suiteName))||null;if(s.runnableOnly&&S)continue;const j=d?[...new Set([...ge(d,c,n.suiteName),...d.testkit.requirements.fileLocksByPath.get(n.filePath)||[],...u.locks])].sort():[],x=l.get(n.serviceName)?.dependsOn||[],w=re({serviceName:n.serviceName,suiteName:n.suiteName,testType:c,filePath:n.filePath,engineId:u.engineId,profileId:u.profileId,skipReason:S,locks:j,runtimeIsolation:d&&m?G(d,m,n.filePath):q,dependsOn:x});v.push(w);const F=[n.serviceName,c,n.suiteName].join("|"),O=p.get(F);O?O.files.push(w):p.set(F,{serviceName:n.serviceName,testType:c,suiteName:n.suiteName,files:[w]})}const h=[...p.values()].map(n=>se(n.serviceName,n.testType,n.suiteName,n.files,l.get(n.serviceName)?.dependsOn||[]));for(const n of h){const c=l.get(n.service)||{name:n.service,discovered:!0,localCwd:o.services[n.service]?.inferredLocalCwd||".",dependsOn:[...r[n.service]?.dependsOn||[]],suiteCount:0,fileCount:0,activeFileCount:0,skippedFileCount:0};c.suiteCount+=1,c.fileCount+=n.fileCount,c.activeFileCount+=n.activeFileCount,c.skippedFileCount+=n.skippedFileCount,l.set(n.service,c)}return{services:[...l.values()].sort((n,c)=>n.name.localeCompare(c.name)),suites:h.sort(he),files:v.sort(Ce)}}function re(e){const i=testTypeContract(e.testType,e.engineId,e.profileId);return{id:ye(e.serviceName,e.testType,e.engineId,e.profileId,e.filePath),path:e.filePath,displayName:fileDisplayName(e.filePath),service:e.serviceName,suiteName:e.suiteName,groupLabel:formatDisplayName(e.suiteName),testType:e.testType,engineId:e.engineId,profileId:e.profileId,skipped:!!e.skipReason,skipReason:e.skipReason,locks:e.locks,runtimeIsolation:e.runtimeIsolation,dependsOn:[...e.dependsOn],contract:i}}function se(e,i,t,o,r){const s=ce(e,i,t,o),a=o.filter(l=>l.skipped).length;return{id:ve(e,i,s.engineId,s.profileId,t),service:e,name:t,displayName:formatDisplayName(t),testType:i,engineId:s.engineId,profileId:s.profileId,groupLabel:formatDisplayName(t),fileCount:o.length,activeFileCount:o.length-a,skippedFileCount:a,dependsOn:[...r],locks:[...new Set(o.flatMap(l=>l.locks))].sort(),filePaths:o.map(l=>l.path),contract:s.contract}}function ce(e,i,t,o){const r=o[0];for(const s of o.slice(1))if(s.engineId!==r.engineId||s.profileId!==r.profileId)throw new Error(`Discovery suite ${e}/${i}:${t} mixes engine profiles ${r.engineId}/${r.profileId} and ${s.engineId}/${s.profileId}`);return{contract:r.contract,engineId:r.engineId,profileId:r.profileId}}function R(e){return{...e,diagnostics:e.diagnostics.sort(we),summary:Q({diagnostics:e.diagnostics,files:e.files,serviceCount:e.services.length,suiteCount:e.suites.length})}}function ae(e,i,t){if(!e)return;const o=new Set([...Object.keys(i),...Object.keys(t.services),...Object.keys(t.suitesByService)]);if(o.has(e))return;const r=[...o].sort((s,a)=>s.localeCompare(a)).join(", ");throw new Error(r.length>0?`Service "${e}" not found. Available: ${r}`:`Service "${e}" not found.`)}function le(e){const i=de(Z(b(e.type))),t=ee(b(e.suite)),o=b(e.file).map(N);return{typeValues:i,suiteSelectors:t,fileNames:o,fileNameSet:new Set(o),serviceFilter:e.service||null,runnableOnly:!!e.runnableOnly,diagnosticsMode:e.diagnostics==="error"?"error":"report"}}function de(e){const i=[];for(const t of e){if(!U(t))throw new Error(`Discovery produced unsupported test type "${t}".`);i.push(t)}return i}function ue(e){const i=I(f(e,"services")),t={};for(const[o,r]of Object.entries(i)){const s=I(r),a=I(f(s,"local"));t[o]={dependsOn:pe(f(s,"dependsOn")),discovery:M(f(s,"discovery")),localCwd:N(f(a,"cwd")||"."),localDisabled:f(s,"local")===!1}}return{discovery:M(f(e,"discovery")),services:t}}function fe(e){const i={};for(const[t,o]of Object.entries(e))o&&(i[t]={discovery:o.discovery,local:o.localDisabled?!1:{baseUrl:"",cwd:o.localCwd,env:{},start:""}});return i}function M(e){try{return J(e,{allowRoots:!0})}catch{return{}}}function pe(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function me(e,i,t){for(const o of e.testkit.skip?.suites||[])if(k(i,t,[o.selector]))return o.reason;return null}function ge(e,i,t){const o=new Set;for(const r of e.testkit.requirements.suites)if(k(i,t,[r.selector]))for(const s of r.locks)o.add(s);return[...o].sort()}function b(e){return Array.isArray(e)?e.filter(t=>t!=null).map(t=>C(t)):e==null||e===""?[]:[C(e)]}function N(e){return C(e).split(g.sep).join("/").replace(/^\.\/+/,"")}export function fileDisplayName(e){const i=new RegExp(`\\.(${_.join("|")})\\.testkit\\.ts$`),t=g.posix.basename(e).replace(i,"");return formatDisplayName(t)}function ve(e,i,t,o,r){return[e,i,t,o,r].join("|")}function ye(e,i,t,o,r){return[e,i,t,o,N(r)].join("|")}function he(e,i){return e.service.localeCompare(i.service)||e.testType.localeCompare(i.testType)||e.name.localeCompare(i.name)}function Ce(e,i){return e.service.localeCompare(i.service)||e.testType.localeCompare(i.testType)||e.suiteName.localeCompare(i.suiteName)||e.path.localeCompare(i.path)}function we(e,i){return T(e.severity)-T(i.severity)||e.code.localeCompare(i.code)||(e.path||"").localeCompare(i.path||"")}function T(e){return e==="error"?1:2}
|
|
1
|
+
import m from"path";import{randomUUID as j}from"node:crypto";import{isUnknownRecord as D,readDynamicProperty as S}from"../../kernel/unknown-values.js";import{loadConfigContext as P,resolveProductDir as z}from"./load.js";import{hasDiscoveryErrors as B,buildDiscoveryErrorFromDiagnostics as V}from"./discovery.js";import{discoverOwnedTests as _}from"./owned-discovery.js";import{loadTestkitConfig as x}from"./config-loader.js";import{TEST_TYPE_ORDER as A,isRunType as L}from"../../domain/test-types.js";import"../../domain/identifiers.js";import{DEFAULT_RUNTIME_ISOLATION_POLICY as U,resolveRuntimeIsolationPolicy as q}from"./runtime-isolation.js";import{resolveExecutionProfile as Y}from"../../engines/catalog.js";import{readTestFileMetadata as G}from"./file-metadata.js";import{buildDiscoverySummary as K,emptyDiscoverySummary as H}from"./discovery-summary.js";import{matchesSelectedTypes as J,matchesSuiteSelectors as w,normalizeTypeValues as Q,parseSuiteSelectors as W,suiteKey as E}from"../../domain/suite-selection.js";import{errorMessage as b}from"../../kernel/error-serialization.js";const X=10,h=String;export async function discoverTests(e={}){return(await loadDiscoveryContext(e)).discovery}export async function loadDiscoveredConfigContext(e={}){const i=await P({...e,configImportCacheSalt:j()}),{discovery:o}=await loadDiscoveryContext({dir:i.productDir,diagnostics:"error"},i);return{context:i,discovery:o}}export async function loadDiscoveryContext(e={},i){const o=i?.productDir??z(process.cwd(),e.dir),n=se(e);if(i&&n.diagnosticsMode==="error"&&B(i.discovery.diagnostics))throw V(i.discovery.diagnostics);const r=i?{config:i.config,configFile:i.configFile,diagnostics:[]}:await Z(o,n.diagnosticsMode),a={schemaVersion:X,source:"testkit-discovery",product:{name:m.basename(o),directory:o},configFile:r.configFile?m.relative(o,r.configFile)||m.basename(r.configFile):null,filters:{group:n.groupFilter,types:n.typeValues,suiteSelectors:n.suiteSelectors.map(t=>t.raw),fileNames:n.fileNames,runnableOnly:n.runnableOnly,diagnostics:n.diagnosticsMode},groups:[],suites:[],files:[],diagnostics:[...r.diagnostics],summary:H()};if(!r.config)return{discovery:T(a),context:null,notice:null};const c=i?{groups:i.groups,notice:i.ownershipNotice,plainFiles:[],problems:[],project:i.discovery}:await _(o,r.config,{selection:e.vitest,strict:n.diagnosticsMode==="error"}),p=c.project,d={owned:c,fileMetadataByPath:new Map(i?.groups.flatMap(t=>[...t.testkit.fileMetadataByPath])??[])};a.diagnostics.push(...p.diagnostics),re(n.groupFilter,c.groups);let f=i??null;try{f=i??await P({dir:o,preparedDiscovery:d,configContext:{config:r.config,configFile:r.configFile},discoveryOptions:{strict:n.diagnosticsMode==="error"}})}catch(t){if(n.diagnosticsMode==="error")throw t;a.diagnostics.push({code:"config_invalid",severity:"error",message:b(t)})}const y=ie({productDir:o,rawDiscovery:p,declarations:c.groups,groups:f?.groups??[],fileMetadataByPath:d.fileMetadataByPath,filters:n});return{discovery:T({...a,...y}),context:f,notice:c.notice}}export function formatDisplayName(e){return h(e||"").split(/[-_/]+/g).filter(Boolean).map(i=>i.replace(/^\w/,o=>o.toUpperCase())).join(" ")}export function testTypeContract(e,i,o){return Y({engineId:i,profileId:o,testType:e}),e==="data"?{authoringApi:"@gfdelarue/testkit/node-vitest/data",summary:"Data suites use the node-vitest engine and record Testkit data evidence; they are not raw Vitest or service-namespace tests."}:e==="contract"?{authoringApi:"@gfdelarue/testkit/node-vitest/contract",summary:"Contract suites use the node-vitest engine for Node-backed service/runtime contracts without data-flow evidence requirements."}:i==="playwright"?{authoringApi:"@gfdelarue/testkit/playwright"}:{}}async function Z(e,i){try{const o=await x(e),{config:n,configFile:r}=ee(o);return{config:n,configFile:r,diagnostics:[]}}catch(o){if(i==="error")throw o;return{config:null,configFile:null,diagnostics:[{code:"config_invalid",severity:"error",message:b(o)}]}}}function ee(e){if(!D(e))throw new Error("testkit config loader must return an object");const i=S(e,"config"),o=S(e,"configFile");if(!D(i)){const n=typeof o=="string"?m.basename(o):"testkit config file";throw new Error(`testkit config file must export an object: ${n}`)}if(o!==null&&typeof o!="string")throw new Error("testkit config loader returned an invalid config path");return{config:i,configFile:o}}function ie({declarations:e,fileMetadataByPath:i,filters:o,groups:n,productDir:r,rawDiscovery:a}){const c=new Map(n.map(t=>[t.name,t])),p=new Map,d=new Map,f=[];for(const t of e)o.groupFilter&&t.name!==o.groupFilter||p.set(t.name,{name:t.name,roots:[...t.roots],uses:[...t.uses],source:t.source,suiteCount:0,fileCount:0,activeFileCount:0,skippedFileCount:0});for(const t of a.files){const s=t.testType;if(!J(s,o.typeValues)||!w(s,t.suiteName,o.suiteSelectors)||o.groupFilter&&t.serviceName!==o.groupFilter||o.fileNameSet.size>0&&!o.fileNameSet.has(t.filePath))continue;const u=i.get(t.filePath)??G(r,t.filePath);i.set(t.filePath,u);const l=c.get(t.serviceName),g=l?.suites.find(F=>F.testType===s&&F.name===t.suiteName);if(l&&(!g||g.engineId!==u.engineId||g.profileId!==u.profileId))throw new Error(`Normalized suite ${t.serviceName}/${E({name:t.suiteName,testType:s})} conflicts with file ${t.filePath}`);const I=l&&(u.skipReason||l.testkit.skip?.fileReasonByPath.get(t.filePath)||ce(l,s,t.suiteName))||null;if(o.runnableOnly&&I)continue;const O=l?[...new Set([...le(l,s,t.suiteName),...l.testkit.requirements.fileLocksByPath.get(t.filePath)||[],...u.locks])].sort():[],v=oe({groupName:t.serviceName,suiteName:t.suiteName,testType:s,filePath:t.filePath,engineId:u.engineId,profileId:u.profileId,skipReason:I,locks:O,runtimeIsolation:l&&g?q(l,g,t.filePath):U});f.push(v);const k=[t.serviceName,s??"",t.suiteName].join("|"),N=d.get(k);N?N.files.push(v):d.set(k,{groupName:t.serviceName,testType:s,suiteName:t.suiteName,files:[v]})}const y=[...d.values()].map(t=>te(t.groupName,t.testType,t.suiteName,t.files));for(const t of y){const s=p.get(t.group);if(s===void 0)throw new Error(`Discovered suite ${t.id} belongs to no declared group`);s.suiteCount+=1,s.fileCount+=t.fileCount,s.activeFileCount+=t.activeFileCount,s.skippedFileCount+=t.skippedFileCount}return{groups:[...p.values()].sort((t,s)=>t.name.localeCompare(s.name)),suites:y.sort(ue),files:f.sort(pe)}}function oe(e){const i=testTypeContract(e.testType,e.engineId,e.profileId);return{id:R(e.groupName,e.testType,e.engineId,e.profileId,M(e.filePath)),path:e.filePath,displayName:fileDisplayName(e.filePath),group:e.groupName,suiteName:e.suiteName,suiteLabel:formatDisplayName(e.suiteName),...e.testType===void 0?{}:{testType:e.testType},engineId:e.engineId,profileId:e.profileId,skipped:!!e.skipReason,skipReason:e.skipReason,locks:e.locks,runtimeIsolation:e.runtimeIsolation,contract:i}}function te(e,i,o,n){const r=ne(e,i,o,n),a=n.filter(c=>c.skipped).length;return{id:R(e,i,r.engineId,r.profileId,o),group:e,name:o,displayName:formatDisplayName(o),...i===void 0?{}:{testType:i},engineId:r.engineId,profileId:r.profileId,suiteLabel:formatDisplayName(o),fileCount:n.length,activeFileCount:n.length-a,skippedFileCount:a,locks:[...new Set(n.flatMap(c=>c.locks))].sort(),filePaths:n.map(c=>c.path),contract:r.contract}}function ne(e,i,o,n){const r=n[0];for(const a of n.slice(1))if(a.engineId!==r.engineId||a.profileId!==r.profileId)throw new Error(`Discovery suite ${e}/${E({name:o,testType:i})} mixes engine profiles ${r.engineId}/${r.profileId} and ${a.engineId}/${a.profileId}`);return{contract:r.contract,engineId:r.engineId,profileId:r.profileId}}function T(e){return{...e,diagnostics:e.diagnostics.sort(de),summary:K({diagnostics:e.diagnostics,files:e.files,groupCount:e.groups.length,suiteCount:e.suites.length})}}function re(e,i){if(!e||i.some(n=>n.name===e))return;const o=i.map(n=>n.name).sort((n,r)=>n.localeCompare(r)).join(", ");throw new Error(`Group "${e}" not found. Available: ${o}`)}function se(e){const i=ae(Q(C(e.type))),o=W(C(e.suite)),n=C(e.file).map(M);return{typeValues:i,suiteSelectors:o,fileNames:n,fileNameSet:new Set(n),groupFilter:e.group||null,runnableOnly:!!e.runnableOnly,diagnosticsMode:e.diagnostics==="error"?"error":"report"}}function ae(e){const i=[];for(const o of e){if(!L(o))throw new Error(`Discovery produced unsupported test type "${o}".`);i.push(o)}return i}function ce(e,i,o){for(const n of e.testkit.skip?.suites||[])if(w(i,o,[n.selector]))return n.reason;return null}function le(e,i,o){const n=new Set;for(const r of e.testkit.requirements.suites)if(w(i,o,[r.selector]))for(const a of r.locks)n.add(a);return[...n].sort()}function C(e){return Array.isArray(e)?e.filter(o=>o!=null).map(o=>h(o)):e==null||e===""?[]:[h(e)]}function M(e){return h(e).split(m.sep).join("/").replace(/^\.\/+/,"")}export function fileDisplayName(e){const i=new RegExp(`\\.(${A.join("|")})\\.testkit\\.ts$`),o=m.posix.basename(e).replace(i,"");return formatDisplayName(o)}function R(e,i,o,n,r){return[e,...i===void 0?[]:[i],o,n,r].join("|")}function ue(e,i){return e.group.localeCompare(i.group)||(e.testType??"").localeCompare(i.testType??"")||e.name.localeCompare(i.name)}function pe(e,i){return e.group.localeCompare(i.group)||(e.testType??"").localeCompare(i.testType??"")||e.suiteName.localeCompare(i.suiteName)||e.path.localeCompare(i.path)}function de(e,i){return $(e.severity)-$(i.severity)||e.code.localeCompare(i.code)||(e.path||"").localeCompare(i.path||"")}function $(e){return e==="error"?1:2}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function buildDiscoverySummary(s){const i={},r={};for(const e of s.files)i[e.
|
|
1
|
+
export function buildDiscoverySummary(s){const i={},r={};for(const e of s.files)i[e.group]=(i[e.group]||0)+1,e.testType!==void 0&&(r[e.testType]=(r[e.testType]||0)+1);return{activeFiles:s.files.filter(e=>!e.skipped).length,byGroup:i,byTestType:r,diagnostics:{errors:s.diagnostics.filter(e=>e.severity==="error").length,warnings:s.diagnostics.filter(e=>e.severity==="warning").length},files:s.files.length,groups:s.groupCount,skippedFiles:s.files.filter(e=>e.skipped).length,suites:s.suiteCount}}export function emptyDiscoverySummary(){return{activeFiles:0,byGroup:{},byTestType:{},diagnostics:{errors:0,warnings:0},files:0,groups:0,skippedFiles:0,suites:0}}
|