@velum-labs/routekit-eval-setup 1.3.2 → 1.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/dist/adapters/authoring-responses-request.d.ts +5 -0
- package/dist/adapters/authoring-responses-request.js +38 -0
- package/dist/adapters/evaluation-evidence-freshness.d.ts +7 -0
- package/dist/adapters/evaluation-evidence-freshness.js +76 -0
- package/dist/adapters/git-task-history.d.ts +67 -0
- package/dist/adapters/git-task-history.js +171 -0
- package/dist/adapters/integrated-repository-history.d.ts +21 -0
- package/dist/adapters/integrated-repository-history.js +175 -0
- package/dist/adapters/repository-command-diagnostic.d.ts +8 -0
- package/dist/adapters/repository-command-diagnostic.js +46 -0
- package/dist/adapters/repository-command-evidence.d.ts +13 -0
- package/dist/adapters/repository-command-evidence.js +102 -0
- package/dist/adapters/repository-command-runner.d.ts +238 -0
- package/dist/adapters/repository-command-runner.js +1483 -0
- package/dist/adapters/repository-import-context.d.ts +47 -0
- package/dist/adapters/repository-import-context.js +469 -0
- package/dist/adapters/repository-node-test-reporter.d.ts +3 -0
- package/dist/adapters/repository-node-test-reporter.js +27 -0
- package/dist/adapters/repository-review-evidence.d.ts +39 -0
- package/dist/adapters/repository-review-evidence.js +632 -0
- package/dist/adapters/repository-seed-selection.d.ts +7 -0
- package/dist/adapters/repository-seed-selection.js +79 -0
- package/dist/adapters/repository-solution-edits.d.ts +49 -0
- package/dist/adapters/repository-solution-edits.js +136 -0
- package/dist/adapters/repository-vitest-phase-adapter.d.ts +8 -0
- package/dist/adapters/repository-vitest-phase-adapter.js +310 -0
- package/dist/adapters/repository-vitest-reporter.d.ts +24 -0
- package/dist/adapters/repository-vitest-reporter.js +314 -0
- package/dist/adapters/strict-authoring-schema.d.ts +5 -0
- package/dist/adapters/strict-authoring-schema.js +158 -0
- package/dist/adapters/test-discovery.d.ts +30 -0
- package/dist/adapters/test-discovery.js +124 -0
- package/dist/adapters/typescript-repository-index.d.ts +51 -0
- package/dist/adapters/typescript-repository-index.js +226 -0
- package/dist/agentic-capabilities-protocol.d.ts +1373 -0
- package/dist/agentic-capabilities-protocol.js +786 -0
- package/dist/case-checkpoint-store.d.ts +29 -0
- package/dist/case-checkpoint-store.js +133 -0
- package/dist/case-pipeline-protocol-v2.d.ts +184 -0
- package/dist/case-pipeline-protocol-v2.js +193 -0
- package/dist/case-pipeline-protocol.d.ts +2626 -0
- package/dist/case-pipeline-protocol.js +371 -0
- package/dist/effect-api.d.ts +74 -10
- package/dist/effect-api.js +56 -6
- package/dist/errors.d.ts +31 -0
- package/dist/errors.js +10 -0
- package/dist/eval-capability-execution-envelope.d.ts +64 -0
- package/dist/eval-capability-execution-envelope.js +98 -0
- package/dist/eval-capability-policy.d.ts +90 -0
- package/dist/eval-capability-policy.js +107 -0
- package/dist/eval-event-log.d.ts +140 -0
- package/dist/eval-event-log.js +220 -0
- package/dist/evaluation-authoring-policy.d.ts +18 -0
- package/dist/evaluation-authoring-policy.js +19 -0
- package/dist/evaluation-authoring-validation.d.ts +22 -0
- package/dist/evaluation-authoring-validation.js +72 -0
- package/dist/evaluation-evidence.d.ts +20 -0
- package/dist/evaluation-evidence.js +319 -0
- package/dist/evaluation-grader-calibration-protocol.d.ts +108 -0
- package/dist/evaluation-grader-calibration-protocol.js +80 -0
- package/dist/evaluation-grader-calibration.d.ts +18 -0
- package/dist/evaluation-grader-calibration.js +334 -0
- package/dist/evaluation-grading-policy.d.ts +24 -0
- package/dist/evaluation-grading-policy.js +54 -0
- package/dist/evaluation-proposal-policy.d.ts +4 -0
- package/dist/evaluation-proposal-policy.js +91 -0
- package/dist/evaluation-source-retrieval.d.ts +68 -0
- package/dist/evaluation-source-retrieval.js +513 -0
- package/dist/evaluation-structure-policy.d.ts +29 -0
- package/dist/evaluation-structure-policy.js +138 -0
- package/dist/index.d.ts +124 -17
- package/dist/index.js +69 -11
- package/dist/inspection.js +2 -3
- package/dist/project-artifacts.d.ts +7 -2
- package/dist/project-artifacts.js +49 -136
- package/dist/project-authoring.d.ts +66 -5
- package/dist/project-authoring.js +783 -109
- package/dist/project-contracts.d.ts +419 -84
- package/dist/project-contracts.js +160 -52
- package/dist/project-store.js +2 -1
- package/dist/project-workflow.d.ts +5 -4
- package/dist/project-workflow.js +154 -35
- package/dist/repository-adversary-protocol.d.ts +64 -0
- package/dist/repository-adversary-protocol.js +105 -0
- package/dist/repository-behavior-protocol.d.ts +188 -0
- package/dist/repository-behavior-protocol.js +202 -0
- package/dist/repository-benchmark-protocol.d.ts +487 -0
- package/dist/repository-benchmark-protocol.js +96 -0
- package/dist/repository-execution-protocol.d.ts +150 -0
- package/dist/repository-execution-protocol.js +38 -0
- package/dist/repository-fixture-instructions.d.ts +3 -0
- package/dist/repository-fixture-instructions.js +91 -0
- package/dist/repository-fixture-protocol.d.ts +79 -0
- package/dist/repository-fixture-protocol.js +79 -0
- package/dist/repository-foundry-plan-protocol.d.ts +118 -0
- package/dist/repository-foundry-plan-protocol.js +296 -0
- package/dist/repository-foundry-progress-protocol.d.ts +52 -0
- package/dist/repository-foundry-progress-protocol.js +52 -0
- package/dist/repository-improvement-protocol.d.ts +100 -0
- package/dist/repository-improvement-protocol.js +106 -0
- package/dist/repository-language-model-protocol.d.ts +43 -0
- package/dist/repository-language-model-protocol.js +146 -0
- package/dist/repository-oracle-coverage-protocol.d.ts +18 -0
- package/dist/repository-oracle-coverage-protocol.js +39 -0
- package/dist/repository-oracle-execution-binding.d.ts +27 -0
- package/dist/repository-oracle-execution-binding.js +59 -0
- package/dist/repository-oracle-protocol.d.ts +230 -0
- package/dist/repository-oracle-protocol.js +156 -0
- package/dist/repository-oracle-scope-policy.d.ts +22 -0
- package/dist/repository-oracle-scope-policy.js +92 -0
- package/dist/repository-quality-policy.d.ts +15 -0
- package/dist/repository-quality-policy.js +357 -0
- package/dist/repository-routing-benchmark-protocol.d.ts +176 -0
- package/dist/repository-routing-benchmark-protocol.js +103 -0
- package/dist/repository-routing-model-protocol.d.ts +36 -0
- package/dist/repository-routing-model-protocol.js +89 -0
- package/dist/repository-routing-plan-protocol.d.ts +112 -0
- package/dist/repository-routing-plan-protocol.js +58 -0
- package/dist/repository-routing-quality-policy.d.ts +9 -0
- package/dist/repository-routing-quality-policy.js +191 -0
- package/dist/repository-seed-qualification-progress-protocol.d.ts +205 -0
- package/dist/repository-seed-qualification-progress-protocol.js +28 -0
- package/dist/repository-semantic-calibration-protocol.d.ts +768 -0
- package/dist/repository-semantic-calibration-protocol.js +276 -0
- package/dist/repository-semantic-calibration.d.ts +163 -0
- package/dist/repository-semantic-calibration.js +581 -0
- package/dist/repository-specification-contract-facts-protocol.d.ts +224 -0
- package/dist/repository-specification-contract-facts-protocol.js +276 -0
- package/dist/repository-specification-critique-protocol.d.ts +189 -0
- package/dist/repository-specification-critique-protocol.js +103 -0
- package/dist/repository-task-family-protocol.d.ts +24 -0
- package/dist/repository-task-family-protocol.js +37 -0
- package/dist/repository-task-seed-protocol.d.ts +384 -0
- package/dist/repository-task-seed-protocol.js +236 -0
- package/dist/repository-trajectory-protocol.d.ts +20 -0
- package/dist/repository-trajectory-protocol.js +42 -0
- package/dist/service.js +1 -1
- package/dist/services/adversary/service.d.ts +64 -0
- package/dist/services/adversary/service.js +330 -0
- package/dist/services/benchmark-compiler/service.d.ts +450 -0
- package/dist/services/benchmark-compiler/service.js +9 -0
- package/dist/services/budgeted-model/service.d.ts +118 -0
- package/dist/services/budgeted-model/service.js +460 -0
- package/dist/services/case-authoring/service.d.ts +163 -0
- package/dist/services/case-authoring/service.js +1456 -0
- package/dist/services/case-finalization/service.d.ts +283 -0
- package/dist/services/case-finalization/service.js +370 -0
- package/dist/services/case-generation/service.d.ts +619 -0
- package/dist/services/case-generation/service.js +2628 -0
- package/dist/services/case-pipeline/service.d.ts +31 -0
- package/dist/services/case-pipeline/service.js +485 -0
- package/dist/services/case-pipeline-v2/service.d.ts +70 -0
- package/dist/services/case-pipeline-v2/service.js +477 -0
- package/dist/services/command-observability/service.d.ts +13 -0
- package/dist/services/command-observability/service.js +3 -0
- package/dist/services/dimension-labeling/service.d.ts +77 -0
- package/dist/services/dimension-labeling/service.js +188 -0
- package/dist/services/eval-candidate/service.d.ts +208 -0
- package/dist/services/eval-candidate/service.js +64 -0
- package/dist/services/eval-capabilities/service.d.ts +183 -0
- package/dist/services/eval-capabilities/service.js +1433 -0
- package/dist/services/eval-environment/service.d.ts +173 -0
- package/dist/services/eval-environment/service.js +127 -0
- package/dist/services/evidence-reconstruction/service.d.ts +36 -0
- package/dist/services/evidence-reconstruction/service.js +145 -0
- package/dist/services/fixture-builder/service.d.ts +62 -0
- package/dist/services/fixture-builder/service.js +36 -0
- package/dist/services/fixture-validation/service.d.ts +75 -0
- package/dist/services/fixture-validation/service.js +295 -0
- package/dist/services/foundry/service.d.ts +831 -0
- package/dist/services/foundry/service.js +442 -0
- package/dist/services/foundry-progress/service.d.ts +62 -0
- package/dist/services/foundry-progress/service.js +149 -0
- package/dist/services/foundry-v2/service.d.ts +54 -0
- package/dist/services/foundry-v2/service.js +28 -0
- package/dist/services/grounded-authoring/service.d.ts +126 -0
- package/dist/services/grounded-authoring/service.js +822 -0
- package/dist/services/historical-case/service.d.ts +722 -0
- package/dist/services/historical-case/service.js +177 -0
- package/dist/services/improvement-loop/service.d.ts +59 -0
- package/dist/services/improvement-loop/service.js +176 -0
- package/dist/services/language-model/service.d.ts +52 -0
- package/dist/services/language-model/service.js +194 -0
- package/dist/services/oracle-builder/service.d.ts +146 -0
- package/dist/services/oracle-builder/service.js +513 -0
- package/dist/services/oracle-coverage/service.d.ts +28 -0
- package/dist/services/oracle-coverage/service.js +50 -0
- package/dist/services/oracle-coverage-witness/service.d.ts +130 -0
- package/dist/services/oracle-coverage-witness/service.js +538 -0
- package/dist/services/pipeline-challenge/service.d.ts +551 -0
- package/dist/services/pipeline-challenge/service.js +427 -0
- package/dist/services/pipeline-controls/service.d.ts +130 -0
- package/dist/services/pipeline-controls/service.js +483 -0
- package/dist/services/pipeline-oracle/service.d.ts +8 -0
- package/dist/services/pipeline-oracle/service.js +256 -0
- package/dist/services/pipeline-seed/service.d.ts +298 -0
- package/dist/services/pipeline-seed/service.js +428 -0
- package/dist/services/pipeline-spec/service.d.ts +103 -0
- package/dist/services/pipeline-spec/service.js +619 -0
- package/dist/services/pipeline-tournament/service.d.ts +258 -0
- package/dist/services/pipeline-tournament/service.js +476 -0
- package/dist/services/quality-gate/service.d.ts +233 -0
- package/dist/services/quality-gate/service.js +136 -0
- package/dist/services/repository-bundle/service.d.ts +33 -0
- package/dist/services/repository-bundle/service.js +114 -0
- package/dist/services/repository-model/service.d.ts +105 -0
- package/dist/services/repository-model/service.js +250 -0
- package/dist/services/repository-public-artifact/service.d.ts +133 -0
- package/dist/services/repository-public-artifact/service.js +330 -0
- package/dist/services/routing-benchmark/service.d.ts +362 -0
- package/dist/services/routing-benchmark/service.js +96 -0
- package/dist/services/specification-critic/service.d.ts +92 -0
- package/dist/services/specification-critic/service.js +172 -0
- package/dist/services/task-family/service.d.ts +40 -0
- package/dist/services/task-family/service.js +55 -0
- package/dist/services/task-seed/service.d.ts +906 -0
- package/dist/services/task-seed/service.js +1406 -0
- package/dist/services/task-specification/service.d.ts +27 -0
- package/dist/services/task-specification/service.js +40 -0
- package/dist/services/trajectory-policy/service.d.ts +110 -0
- package/dist/services/trajectory-policy/service.js +216 -0
- package/dist/test/agentic-capabilities-protocol.test.d.ts +1 -0
- package/dist/test/agentic-capabilities-protocol.test.js +570 -0
- package/dist/test/agentic-capabilities.test.d.ts +1 -0
- package/dist/test/agentic-capabilities.test.js +1461 -0
- package/dist/test/agentic-environment.test.d.ts +1 -0
- package/dist/test/agentic-environment.test.js +213 -0
- package/dist/test/case-pipeline-foundation.test.d.ts +1 -0
- package/dist/test/case-pipeline-foundation.test.js +535 -0
- package/dist/test/case-pipeline-protocol-v2.test.d.ts +1 -0
- package/dist/test/case-pipeline-protocol-v2.test.js +124 -0
- package/dist/test/case-pipeline-v2.test.d.ts +1 -0
- package/dist/test/case-pipeline-v2.test.js +286 -0
- package/dist/test/case-pipeline.test.d.ts +1 -0
- package/dist/test/case-pipeline.test.js +851 -0
- package/dist/test/eval-capability-policy.test.d.ts +1 -0
- package/dist/test/eval-capability-policy.test.js +50 -0
- package/dist/test/eval-event-log.test.d.ts +1 -0
- package/dist/test/eval-event-log.test.js +125 -0
- package/dist/test/evaluation-evidence-freshness.test.d.ts +1 -0
- package/dist/test/evaluation-evidence-freshness.test.js +44 -0
- package/dist/test/evaluation-evidence.test.d.ts +1 -0
- package/dist/test/evaluation-evidence.test.js +230 -0
- package/dist/test/evaluation-grader-calibration.test.d.ts +1 -0
- package/dist/test/evaluation-grader-calibration.test.js +373 -0
- package/dist/test/evaluation-proposal-digest.test.d.ts +1 -0
- package/dist/test/evaluation-proposal-digest.test.js +187 -0
- package/dist/test/evaluation-source-retrieval.test.d.ts +1 -0
- package/dist/test/evaluation-source-retrieval.test.js +237 -0
- package/dist/test/evaluation-structure-policy.test.d.ts +1 -0
- package/dist/test/evaluation-structure-policy.test.js +196 -0
- package/dist/test/fixtures/repository-resource-panel.d.ts +39 -0
- package/dist/test/fixtures/repository-resource-panel.js +111 -0
- package/dist/test/fixtures/vitest-boundary-panel.d.ts +84 -0
- package/dist/test/fixtures/vitest-boundary-panel.js +120 -0
- package/dist/test/fixtures/vitest-phase-panel.d.ts +135 -0
- package/dist/test/fixtures/vitest-phase-panel.js +213 -0
- package/dist/test/fixtures/vitest-reporter-results.d.ts +76 -0
- package/dist/test/fixtures/vitest-reporter-results.js +94 -0
- package/dist/test/grounded-authoring.test.d.ts +1 -0
- package/dist/test/grounded-authoring.test.js +565 -0
- package/dist/test/integrated-repository-history.test.d.ts +1 -0
- package/dist/test/integrated-repository-history.test.js +227 -0
- package/dist/test/project-authoring.test.js +593 -43
- package/dist/test/project-workflow.test.js +419 -40
- package/dist/test/repository-authoring-artifacts.test.d.ts +1 -0
- package/dist/test/repository-authoring-artifacts.test.js +185 -0
- package/dist/test/repository-bundle.test.d.ts +1 -0
- package/dist/test/repository-bundle.test.js +52 -0
- package/dist/test/repository-case-generation.test.d.ts +1 -0
- package/dist/test/repository-case-generation.test.js +3465 -0
- package/dist/test/repository-command-diagnostic.test.d.ts +1 -0
- package/dist/test/repository-command-diagnostic.test.js +55 -0
- package/dist/test/repository-command-signals.test.d.ts +1 -0
- package/dist/test/repository-command-signals.test.js +124 -0
- package/dist/test/repository-fixture-scope-coverage.test.d.ts +1 -0
- package/dist/test/repository-fixture-scope-coverage.test.js +127 -0
- package/dist/test/repository-fixture-validation.test.d.ts +1 -0
- package/dist/test/repository-fixture-validation.test.js +362 -0
- package/dist/test/repository-foundry-progress.test.d.ts +1 -0
- package/dist/test/repository-foundry-progress.test.js +110 -0
- package/dist/test/repository-foundry-quality.test.d.ts +1 -0
- package/dist/test/repository-foundry-quality.test.js +1138 -0
- package/dist/test/repository-import-context.test.d.ts +1 -0
- package/dist/test/repository-import-context.test.js +354 -0
- package/dist/test/repository-model-authoring.test.d.ts +1 -0
- package/dist/test/repository-model-authoring.test.js +544 -0
- package/dist/test/repository-model.test.d.ts +1 -0
- package/dist/test/repository-model.test.js +2195 -0
- package/dist/test/repository-node-test-reporter.test.d.ts +1 -0
- package/dist/test/repository-node-test-reporter.test.js +104 -0
- package/dist/test/repository-oracle-concurrency.test.d.ts +1 -0
- package/dist/test/repository-oracle-concurrency.test.js +542 -0
- package/dist/test/repository-oracle-coverage-witness.test.d.ts +1 -0
- package/dist/test/repository-oracle-coverage-witness.test.js +511 -0
- package/dist/test/repository-oracle-coverage.test.d.ts +1 -0
- package/dist/test/repository-oracle-coverage.test.js +168 -0
- package/dist/test/repository-oracle-evidence.test.d.ts +1 -0
- package/dist/test/repository-oracle-evidence.test.js +185 -0
- package/dist/test/repository-oracle-plan.test.d.ts +1 -0
- package/dist/test/repository-oracle-plan.test.js +176 -0
- package/dist/test/repository-overlay-isolation.test.d.ts +1 -0
- package/dist/test/repository-overlay-isolation.test.js +85 -0
- package/dist/test/repository-preparation-cache.test.d.ts +1 -0
- package/dist/test/repository-preparation-cache.test.js +414 -0
- package/dist/test/repository-public-artifact.test.d.ts +1 -0
- package/dist/test/repository-public-artifact.test.js +273 -0
- package/dist/test/repository-qualification-diagnostics.test.d.ts +1 -0
- package/dist/test/repository-qualification-diagnostics.test.js +524 -0
- package/dist/test/repository-reference-authoring.test.d.ts +1 -0
- package/dist/test/repository-reference-authoring.test.js +1633 -0
- package/dist/test/repository-review-evidence-v2.test.d.ts +1 -0
- package/dist/test/repository-review-evidence-v2.test.js +183 -0
- package/dist/test/repository-review-evidence.test.d.ts +1 -0
- package/dist/test/repository-review-evidence.test.js +124 -0
- package/dist/test/repository-seed-exclusions.test.d.ts +1 -0
- package/dist/test/repository-seed-exclusions.test.js +96 -0
- package/dist/test/repository-seed-selection.test.d.ts +1 -0
- package/dist/test/repository-seed-selection.test.js +504 -0
- package/dist/test/repository-semantic-calibration.test.d.ts +1 -0
- package/dist/test/repository-semantic-calibration.test.js +688 -0
- package/dist/test/repository-solution-edits.test.d.ts +1 -0
- package/dist/test/repository-solution-edits.test.js +377 -0
- package/dist/test/repository-specification-budget.test.d.ts +1 -0
- package/dist/test/repository-specification-budget.test.js +171 -0
- package/dist/test/repository-specification-contract-checkpoint.test.d.ts +1 -0
- package/dist/test/repository-specification-contract-checkpoint.test.js +228 -0
- package/dist/test/repository-specification-contract-facts.test.d.ts +1 -0
- package/dist/test/repository-specification-contract-facts.test.js +177 -0
- package/dist/test/repository-trajectory-authoring.test.d.ts +1 -0
- package/dist/test/repository-trajectory-authoring.test.js +176 -0
- package/dist/test/repository-valid-control-plan.test.d.ts +1 -0
- package/dist/test/repository-valid-control-plan.test.js +45 -0
- package/dist/test/repository-vitest-phase.test.d.ts +1 -0
- package/dist/test/repository-vitest-phase.test.js +848 -0
- package/dist/test/repository-vitest-reporter.test.d.ts +1 -0
- package/dist/test/repository-vitest-reporter.test.js +158 -0
- package/dist/test/repository-workspace-build.test.d.ts +1 -0
- package/dist/test/repository-workspace-build.test.js +160 -0
- package/dist/test/strict-authoring-schema.test.d.ts +1 -0
- package/dist/test/strict-authoring-schema.test.js +169 -0
- package/package.json +48 -6
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// These are ordinary framework boundary regressions and causal controls, not
|
|
2
|
+
// generated benchmark cases or production grading authority.
|
|
3
|
+
const hookPass = ["module-enter", "before-all-enter", "before-all-return", "body-enter", "body-return",
|
|
4
|
+
"after-each-enter", "after-each-return", "after-all-enter", "after-all-return"];
|
|
5
|
+
export const VITEST_BOUNDARY_CASES = [
|
|
6
|
+
{ id: "edge-hooks-clean", kind: "hooks", bodyOk: true, expected: "pass", events: hookPass, taskState: "passed" },
|
|
7
|
+
{ id: "edge-hooks-body-only", kind: "hooks", bodyOk: false, expected: "fail",
|
|
8
|
+
events: hookPass.filter(phase => phase !== "body-return"), taskState: "failed" },
|
|
9
|
+
{ id: "edge-before-all", kind: "hooks", bodyOk: true, hookFailure: "before-all", expected: "unknown",
|
|
10
|
+
events: ["module-enter", "before-all-enter", "after-all-enter", "after-all-return"], taskState: "skipped" },
|
|
11
|
+
{ id: "edge-after-each", kind: "hooks", bodyOk: true, hookFailure: "after-each", expected: "unknown",
|
|
12
|
+
events: hookPass.filter(phase => phase !== "after-each-return"), taskState: "failed" },
|
|
13
|
+
{ id: "edge-after-all", kind: "hooks", bodyOk: true, hookFailure: "after-all", expected: "unknown",
|
|
14
|
+
events: hookPass.filter(phase => phase !== "after-all-return"), taskState: "passed" },
|
|
15
|
+
{ id: "edge-import-ok", kind: "import-ok", expected: "pass",
|
|
16
|
+
events: ["module-enter", "imported-module-enter", "import-return", "body-enter", "body-return"], taskState: "passed" },
|
|
17
|
+
{ id: "edge-import-error", kind: "import-error", expected: "unknown",
|
|
18
|
+
events: ["module-enter", "imported-module-enter", "import-rejected"], taskState: "none" },
|
|
19
|
+
{ id: "edge-syntax-error", kind: "syntax-error", expected: "unknown",
|
|
20
|
+
events: ["module-enter", "import-rejected"], taskState: "none" },
|
|
21
|
+
{ id: "edge-no-tests", kind: "no-tests", expected: "unknown",
|
|
22
|
+
events: ["module-enter"], taskState: "none" },
|
|
23
|
+
{ id: "edge-all-skipped", kind: "all-skipped", expected: "unknown",
|
|
24
|
+
events: ["module-enter"], taskState: "skipped" }
|
|
25
|
+
];
|
|
26
|
+
export const VITEST_COLLECTION_FAILURE_CASES = VITEST_BOUNDARY_CASES.filter(scenario => scenario.kind === "import-error" || scenario.kind === "syntax-error");
|
|
27
|
+
export const REPOSITORY_BOUNDARY_EVENTS_SOURCE = String.raw `
|
|
28
|
+
import { appendFileSync, mkdirSync, readFileSync } from "node:fs";
|
|
29
|
+
const identity = JSON.parse(readFileSync("identity.json", "utf8"));
|
|
30
|
+
const sequences = new Map();
|
|
31
|
+
export function phase(scenario, name, diagnostic) {
|
|
32
|
+
const sequence = sequences.get(scenario) ?? 0;
|
|
33
|
+
sequences.set(scenario, sequence + 1);
|
|
34
|
+
mkdirSync("phases", { recursive: true });
|
|
35
|
+
appendFileSync("phases/" + scenario + ".jsonl", JSON.stringify({
|
|
36
|
+
runId: identity.runId, scenario, sequence, phase: name,
|
|
37
|
+
process: { pid: process.pid, parentPid: process.ppid, checkout: process.cwd(),
|
|
38
|
+
home: process.env.HOME, temporary: process.env.TMPDIR },
|
|
39
|
+
...(diagnostic === undefined ? {} : { diagnostic })
|
|
40
|
+
}) + "\n");
|
|
41
|
+
}
|
|
42
|
+
export const diagnostic = error => ({
|
|
43
|
+
name: typeof error?.name === "string" ? error.name : "UnknownError",
|
|
44
|
+
message: typeof error?.message === "string" ? error.message : String(error),
|
|
45
|
+
...(typeof error?.code === "string" ? { code: error.code } : {}),
|
|
46
|
+
...(typeof error?.id === "string" ? { id: error.id } : {})
|
|
47
|
+
});
|
|
48
|
+
`;
|
|
49
|
+
const registerSource = String.raw `
|
|
50
|
+
import assert from "node:assert/strict";
|
|
51
|
+
import { afterAll, afterEach, beforeAll, test } from "vitest";
|
|
52
|
+
import { diagnostic, phase } from "./edge-events.mjs";
|
|
53
|
+
export async function register(scenario) {
|
|
54
|
+
const event = (name, detail) => phase(scenario.id, name, detail);
|
|
55
|
+
event("module-enter");
|
|
56
|
+
if (scenario.kind === "no-tests") return;
|
|
57
|
+
if (scenario.kind === "hooks") {
|
|
58
|
+
beforeAll(() => {
|
|
59
|
+
event("before-all-enter");
|
|
60
|
+
assert.notEqual(scenario.hookFailure, "before-all", "beforeAll sentinel assertion");
|
|
61
|
+
event("before-all-return");
|
|
62
|
+
});
|
|
63
|
+
afterEach(() => {
|
|
64
|
+
event("after-each-enter");
|
|
65
|
+
assert.notEqual(scenario.hookFailure, "after-each", "afterEach sentinel assertion");
|
|
66
|
+
event("after-each-return");
|
|
67
|
+
});
|
|
68
|
+
afterAll(() => {
|
|
69
|
+
event("after-all-enter");
|
|
70
|
+
assert.notEqual(scenario.hookFailure, "after-all", "afterAll sentinel assertion");
|
|
71
|
+
event("after-all-return");
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
if (scenario.kind === "import-ok" || scenario.kind === "import-error" || scenario.kind === "syntax-error") {
|
|
75
|
+
try {
|
|
76
|
+
const module = scenario.kind === "import-ok" ? await import("./edge-import-valid.mjs")
|
|
77
|
+
: scenario.kind === "import-error" ? await import("./edge-import-throws.mjs")
|
|
78
|
+
: await import("./edge-import-syntax-bad.mjs");
|
|
79
|
+
assert.equal(module.value, "routekit-import-syntax-control");
|
|
80
|
+
event("import-return");
|
|
81
|
+
} catch (error) {
|
|
82
|
+
event("import-rejected", diagnostic(error));
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const body = () => {
|
|
87
|
+
event("body-enter");
|
|
88
|
+
assert.notEqual(scenario.bodyOk, false, "body sentinel assertion");
|
|
89
|
+
event("body-return");
|
|
90
|
+
};
|
|
91
|
+
if (scenario.kind === "all-skipped") test.skip("boundary " + scenario.id, body);
|
|
92
|
+
else test("boundary " + scenario.id, body);
|
|
93
|
+
}
|
|
94
|
+
`;
|
|
95
|
+
export const VITEST_BOUNDARY_FILES = {
|
|
96
|
+
"test/edge-events.mjs": REPOSITORY_BOUNDARY_EVENTS_SOURCE,
|
|
97
|
+
"test/edge-register.mjs": registerSource,
|
|
98
|
+
"test/edge-import-valid.mjs": String.raw `
|
|
99
|
+
import { phase } from "./edge-events.mjs";
|
|
100
|
+
phase("edge-import-ok", "imported-module-enter");
|
|
101
|
+
export const value = "routekit-import-syntax-control";
|
|
102
|
+
`,
|
|
103
|
+
"test/edge-import-throws.mjs": String.raw `
|
|
104
|
+
import { phase } from "./edge-events.mjs";
|
|
105
|
+
phase("edge-import-error", "imported-module-enter");
|
|
106
|
+
const error = new Error("routekit fixture import failed before test registration");
|
|
107
|
+
error.name = "RouteKitFixtureImportError";
|
|
108
|
+
error.code = "ROUTEKIT_FIXTURE_IMPORT_FAILURE";
|
|
109
|
+
throw error;
|
|
110
|
+
`,
|
|
111
|
+
"test/edge-import-syntax-bad.mjs": String.raw `
|
|
112
|
+
import { phase } from "./edge-events.mjs";
|
|
113
|
+
phase("edge-syntax-error", "malformed-module-enter");
|
|
114
|
+
export const = "routekit-import-syntax-control";
|
|
115
|
+
`,
|
|
116
|
+
...Object.fromEntries(VITEST_BOUNDARY_CASES.map(scenario => [
|
|
117
|
+
`test/${scenario.id}.test.mjs`,
|
|
118
|
+
`import { register } from "./edge-register.mjs";\nawait register(${JSON.stringify(scenario)});\n`
|
|
119
|
+
]))
|
|
120
|
+
};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
export declare const VITEST_PHASE_CASES: readonly [{
|
|
2
|
+
readonly id: "positive";
|
|
3
|
+
readonly bodyOk: true;
|
|
4
|
+
readonly cleanupOk: true;
|
|
5
|
+
readonly expected: "pass";
|
|
6
|
+
readonly events: string[];
|
|
7
|
+
}, {
|
|
8
|
+
readonly id: "body-only";
|
|
9
|
+
readonly bodyOk: false;
|
|
10
|
+
readonly cleanupOk: true;
|
|
11
|
+
readonly expected: "fail";
|
|
12
|
+
readonly events: string[];
|
|
13
|
+
}, {
|
|
14
|
+
readonly id: "cleanup-only";
|
|
15
|
+
readonly bodyOk: true;
|
|
16
|
+
readonly cleanupOk: false;
|
|
17
|
+
readonly expected: "unknown";
|
|
18
|
+
readonly events: readonly ["body-enter", "body-return", "cleanup-enter"];
|
|
19
|
+
}, {
|
|
20
|
+
readonly id: "mixed";
|
|
21
|
+
readonly bodyOk: false;
|
|
22
|
+
readonly cleanupOk: false;
|
|
23
|
+
readonly expected: "unknown";
|
|
24
|
+
readonly events: readonly ["body-enter", "cleanup-enter"];
|
|
25
|
+
}, {
|
|
26
|
+
readonly id: "mixed-runtime-cleanup";
|
|
27
|
+
readonly bodyOk: false;
|
|
28
|
+
readonly cleanupOk: true;
|
|
29
|
+
readonly cleanupRuntime: true;
|
|
30
|
+
readonly expected: "unknown";
|
|
31
|
+
readonly events: readonly ["body-enter", "cleanup-enter"];
|
|
32
|
+
}, {
|
|
33
|
+
readonly id: "global-finished-empty";
|
|
34
|
+
readonly bodyOk: false;
|
|
35
|
+
readonly cleanupOk: true;
|
|
36
|
+
readonly cleanupEmpty: true;
|
|
37
|
+
readonly expected: "unknown";
|
|
38
|
+
readonly events: readonly ["body-enter", "cleanup-enter"];
|
|
39
|
+
}, {
|
|
40
|
+
readonly id: "global-failed-empty-late";
|
|
41
|
+
readonly bodyOk: false;
|
|
42
|
+
readonly cleanupOk: true;
|
|
43
|
+
readonly failedFromFinished: true;
|
|
44
|
+
readonly expected: "unknown";
|
|
45
|
+
readonly events: readonly [...string[], "failed-cleanup-enter"];
|
|
46
|
+
}, {
|
|
47
|
+
readonly id: "fixture-init";
|
|
48
|
+
readonly bodyOk: true;
|
|
49
|
+
readonly cleanupOk: true;
|
|
50
|
+
readonly fixture: "setup-error";
|
|
51
|
+
readonly expected: "unknown";
|
|
52
|
+
readonly events: readonly ["fixture-setup-enter"];
|
|
53
|
+
}, {
|
|
54
|
+
readonly id: "fixture-teardown";
|
|
55
|
+
readonly bodyOk: true;
|
|
56
|
+
readonly cleanupOk: true;
|
|
57
|
+
readonly fixture: "cleanup-error";
|
|
58
|
+
readonly expected: "unknown";
|
|
59
|
+
readonly events: readonly ["fixture-setup-enter", "fixture-setup-return", "body-enter", "body-return", "fixture-cleanup-enter", "cleanup-enter", "cleanup-return"];
|
|
60
|
+
}, {
|
|
61
|
+
readonly id: "fixture-clean";
|
|
62
|
+
readonly bodyOk: true;
|
|
63
|
+
readonly cleanupOk: true;
|
|
64
|
+
readonly fixture: "clean";
|
|
65
|
+
readonly expected: "unknown";
|
|
66
|
+
readonly events: readonly ["fixture-setup-enter", "fixture-setup-return", "body-enter", "body-return", "fixture-cleanup-enter", "fixture-cleanup-return", "cleanup-enter", "cleanup-return"];
|
|
67
|
+
}, {
|
|
68
|
+
readonly id: "returned-hook-cleanup";
|
|
69
|
+
readonly bodyOk: true;
|
|
70
|
+
readonly cleanupOk: true;
|
|
71
|
+
readonly returnedHook: true;
|
|
72
|
+
readonly expected: "unknown";
|
|
73
|
+
readonly events: readonly ["hook-setup-enter", "hook-setup-return", "body-enter", "body-return", "hook-cleanup-enter", "cleanup-enter", "cleanup-return"];
|
|
74
|
+
}, {
|
|
75
|
+
readonly id: "before-each-setup";
|
|
76
|
+
readonly bodyOk: true;
|
|
77
|
+
readonly cleanupOk: true;
|
|
78
|
+
readonly beforeEachFailure: true;
|
|
79
|
+
readonly expected: "unknown";
|
|
80
|
+
readonly events: readonly ["hook-setup-enter"];
|
|
81
|
+
}, {
|
|
82
|
+
readonly id: "unobserved-nested";
|
|
83
|
+
readonly bodyOk: true;
|
|
84
|
+
readonly cleanupOk: true;
|
|
85
|
+
readonly nested: true;
|
|
86
|
+
readonly expected: "unknown";
|
|
87
|
+
readonly events: string[];
|
|
88
|
+
}, {
|
|
89
|
+
readonly id: "expected-failure";
|
|
90
|
+
readonly bodyOk: false;
|
|
91
|
+
readonly cleanupOk: true;
|
|
92
|
+
readonly expectedFailure: true;
|
|
93
|
+
readonly expected: "unknown";
|
|
94
|
+
readonly events: string[];
|
|
95
|
+
}, {
|
|
96
|
+
readonly id: "recovered-retry";
|
|
97
|
+
readonly bodyOk: true;
|
|
98
|
+
readonly cleanupOk: true;
|
|
99
|
+
readonly retry: true;
|
|
100
|
+
readonly expected: "unknown";
|
|
101
|
+
readonly events: readonly string[];
|
|
102
|
+
}, {
|
|
103
|
+
readonly id: "repeated-pass";
|
|
104
|
+
readonly bodyOk: true;
|
|
105
|
+
readonly cleanupOk: true;
|
|
106
|
+
readonly repeat: true;
|
|
107
|
+
readonly expected: "unknown";
|
|
108
|
+
readonly events: readonly string[];
|
|
109
|
+
}];
|
|
110
|
+
export declare const VITEST_PHASE_TIMEOUT_CASES: readonly [{
|
|
111
|
+
readonly id: "returned-hook-short-local-timeout";
|
|
112
|
+
readonly bodyOk: true;
|
|
113
|
+
readonly cleanupOk: true;
|
|
114
|
+
readonly returnedHookTimeout: true;
|
|
115
|
+
readonly cleanupTimeoutMs: 25;
|
|
116
|
+
readonly cleanupDelayMs: 250;
|
|
117
|
+
readonly hookTimeoutMs: 1000;
|
|
118
|
+
readonly expected: "unknown";
|
|
119
|
+
readonly events: readonly ["hook-setup-enter", "hook-setup-return", "body-enter", "body-return", "hook-cleanup-enter", "hook-cleanup-abort", "cleanup-enter", "cleanup-return"];
|
|
120
|
+
}, {
|
|
121
|
+
readonly id: "returned-hook-long-local-timeout";
|
|
122
|
+
readonly bodyOk: true;
|
|
123
|
+
readonly cleanupOk: true;
|
|
124
|
+
readonly returnedHookTimeout: true;
|
|
125
|
+
readonly cleanupTimeoutMs: 1000;
|
|
126
|
+
readonly cleanupDelayMs: 250;
|
|
127
|
+
readonly hookTimeoutMs: 25;
|
|
128
|
+
readonly expected: "pass";
|
|
129
|
+
readonly events: readonly ["hook-setup-enter", "hook-setup-return", "body-enter", "body-return", "hook-cleanup-enter", "hook-cleanup-return", "cleanup-enter", "cleanup-return"];
|
|
130
|
+
}];
|
|
131
|
+
export declare const VITEST_PHASE_REGISTER_SOURCE: string;
|
|
132
|
+
export declare const VITEST_PHASE_READER_SOURCE: string;
|
|
133
|
+
export declare const VITEST_PHASE_STOCK_READER_SOURCE: string;
|
|
134
|
+
export declare const VITEST_PHASE_VERSIONS_SOURCE: string;
|
|
135
|
+
export declare const VITEST_PHASE_CUSTOM_RUNNER_SOURCE: string;
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
// Executable regression fixtures, not production phase authority. Only the
|
|
2
|
+
// test harness reads these causal event files, after real runner execution.
|
|
3
|
+
const clean = ["body-enter", "body-return", "cleanup-enter", "cleanup-return"];
|
|
4
|
+
const failedBody = ["body-enter", "cleanup-enter", "cleanup-return"];
|
|
5
|
+
export const VITEST_PHASE_CASES = [
|
|
6
|
+
{ id: "positive", bodyOk: true, cleanupOk: true, expected: "pass", events: clean },
|
|
7
|
+
{ id: "body-only", bodyOk: false, cleanupOk: true, expected: "fail", events: failedBody },
|
|
8
|
+
{ id: "cleanup-only", bodyOk: true, cleanupOk: false, expected: "unknown",
|
|
9
|
+
events: ["body-enter", "body-return", "cleanup-enter"] },
|
|
10
|
+
{ id: "mixed", bodyOk: false, cleanupOk: false, expected: "unknown",
|
|
11
|
+
events: ["body-enter", "cleanup-enter"] },
|
|
12
|
+
{ id: "mixed-runtime-cleanup", bodyOk: false, cleanupOk: true, cleanupRuntime: true,
|
|
13
|
+
expected: "unknown", events: ["body-enter", "cleanup-enter"] },
|
|
14
|
+
{ id: "global-finished-empty", bodyOk: false, cleanupOk: true, cleanupEmpty: true,
|
|
15
|
+
expected: "unknown", events: ["body-enter", "cleanup-enter"] },
|
|
16
|
+
{ id: "global-failed-empty-late", bodyOk: false, cleanupOk: true, failedFromFinished: true,
|
|
17
|
+
expected: "unknown", events: [...failedBody, "failed-cleanup-enter"] },
|
|
18
|
+
{ id: "fixture-init", bodyOk: true, cleanupOk: true, fixture: "setup-error", expected: "unknown",
|
|
19
|
+
events: ["fixture-setup-enter"] },
|
|
20
|
+
{ id: "fixture-teardown", bodyOk: true, cleanupOk: true, fixture: "cleanup-error", expected: "unknown",
|
|
21
|
+
events: ["fixture-setup-enter", "fixture-setup-return", "body-enter", "body-return",
|
|
22
|
+
"fixture-cleanup-enter", "cleanup-enter", "cleanup-return"] },
|
|
23
|
+
{ id: "fixture-clean", bodyOk: true, cleanupOk: true, fixture: "clean", expected: "unknown",
|
|
24
|
+
events: ["fixture-setup-enter", "fixture-setup-return", "body-enter", "body-return",
|
|
25
|
+
"fixture-cleanup-enter", "fixture-cleanup-return", "cleanup-enter", "cleanup-return"] },
|
|
26
|
+
{ id: "returned-hook-cleanup", bodyOk: true, cleanupOk: true, returnedHook: true, expected: "unknown",
|
|
27
|
+
events: ["hook-setup-enter", "hook-setup-return", "body-enter", "body-return", "hook-cleanup-enter",
|
|
28
|
+
"cleanup-enter", "cleanup-return"] },
|
|
29
|
+
{ id: "before-each-setup", bodyOk: true, cleanupOk: true, beforeEachFailure: true, expected: "unknown",
|
|
30
|
+
events: ["hook-setup-enter"] },
|
|
31
|
+
{ id: "unobserved-nested", bodyOk: true, cleanupOk: true, nested: true, expected: "unknown", events: clean },
|
|
32
|
+
{ id: "expected-failure", bodyOk: false, cleanupOk: true, expectedFailure: true, expected: "unknown",
|
|
33
|
+
events: failedBody },
|
|
34
|
+
{ id: "recovered-retry", bodyOk: true, cleanupOk: true, retry: true, expected: "unknown",
|
|
35
|
+
events: [...failedBody, ...clean] },
|
|
36
|
+
{ id: "repeated-pass", bodyOk: true, cleanupOk: true, repeat: true, expected: "unknown",
|
|
37
|
+
events: [...clean, ...clean] }
|
|
38
|
+
];
|
|
39
|
+
// Paired against uninstrumented Vitest in a separate replay of the same fixture
|
|
40
|
+
// commit. The shorter local timeout must still fire, and the longer local
|
|
41
|
+
// timeout must not be silently replaced with the global default.
|
|
42
|
+
export const VITEST_PHASE_TIMEOUT_CASES = [
|
|
43
|
+
{ id: "returned-hook-short-local-timeout", bodyOk: true, cleanupOk: true,
|
|
44
|
+
returnedHookTimeout: true, cleanupTimeoutMs: 25, cleanupDelayMs: 250, hookTimeoutMs: 1000,
|
|
45
|
+
expected: "unknown", events: ["hook-setup-enter", "hook-setup-return", "body-enter", "body-return",
|
|
46
|
+
"hook-cleanup-enter", "hook-cleanup-abort", "cleanup-enter", "cleanup-return"] },
|
|
47
|
+
{ id: "returned-hook-long-local-timeout", bodyOk: true, cleanupOk: true,
|
|
48
|
+
returnedHookTimeout: true, cleanupTimeoutMs: 1000, cleanupDelayMs: 250, hookTimeoutMs: 25,
|
|
49
|
+
expected: "pass", events: ["hook-setup-enter", "hook-setup-return", "body-enter", "body-return",
|
|
50
|
+
"hook-cleanup-enter", "hook-cleanup-return", "cleanup-enter", "cleanup-return"] }
|
|
51
|
+
];
|
|
52
|
+
export const VITEST_PHASE_REGISTER_SOURCE = String.raw `
|
|
53
|
+
import assert from "node:assert/strict";
|
|
54
|
+
import { appendFileSync, mkdirSync, readFileSync } from "node:fs";
|
|
55
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
56
|
+
import { beforeEach, describe, onTestFailed, onTestFinished, test } from "vitest";
|
|
57
|
+
const identity = JSON.parse(readFileSync("identity.json", "utf8"));
|
|
58
|
+
export function register(scenario) {
|
|
59
|
+
let sequence = 0;
|
|
60
|
+
let attempts = 0;
|
|
61
|
+
const phase = (name, error) => {
|
|
62
|
+
mkdirSync("phases", { recursive: true });
|
|
63
|
+
appendFileSync("phases/" + scenario.id + ".jsonl", JSON.stringify({
|
|
64
|
+
runId: identity.runId, scenario: scenario.id, sequence: sequence++, phase: name,
|
|
65
|
+
...(error === undefined ? {} : { error: {
|
|
66
|
+
name: error.name, message: error.message, stack: error.stack
|
|
67
|
+
} })
|
|
68
|
+
}) + "\n");
|
|
69
|
+
};
|
|
70
|
+
if (scenario.beforeEachFailure) beforeEach(() => {
|
|
71
|
+
phase("hook-setup-enter");
|
|
72
|
+
assert.equal(false, true, "setup assertion");
|
|
73
|
+
});
|
|
74
|
+
if (scenario.returnedHook) beforeEach(() => {
|
|
75
|
+
phase("hook-setup-enter");
|
|
76
|
+
phase("hook-setup-return");
|
|
77
|
+
return () => {
|
|
78
|
+
phase("hook-cleanup-enter");
|
|
79
|
+
assert.equal(false, true, "returned cleanup assertion");
|
|
80
|
+
phase("hook-cleanup-return");
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
if (scenario.returnedHookTimeout) beforeEach(({ signal }) => {
|
|
84
|
+
phase("hook-setup-enter");
|
|
85
|
+
signal.addEventListener("abort", () => phase("hook-cleanup-abort", signal.reason), { once: true });
|
|
86
|
+
phase("hook-setup-return");
|
|
87
|
+
return async () => {
|
|
88
|
+
phase("hook-cleanup-enter");
|
|
89
|
+
await delay(scenario.cleanupDelayMs, undefined, { signal });
|
|
90
|
+
phase("hook-cleanup-return");
|
|
91
|
+
};
|
|
92
|
+
}, scenario.cleanupTimeoutMs);
|
|
93
|
+
const body = () => {
|
|
94
|
+
phase("body-enter");
|
|
95
|
+
onTestFinished(() => {
|
|
96
|
+
phase("cleanup-enter");
|
|
97
|
+
if (scenario.cleanupRuntime) throw new TypeError("cleanup runtime error");
|
|
98
|
+
if (scenario.cleanupEmpty) throw [];
|
|
99
|
+
assert.equal(scenario.cleanupOk, true, "cleanup assertion");
|
|
100
|
+
if (scenario.failedFromFinished) onTestFailed(() => {
|
|
101
|
+
phase("failed-cleanup-enter");
|
|
102
|
+
throw [];
|
|
103
|
+
});
|
|
104
|
+
phase("cleanup-return");
|
|
105
|
+
});
|
|
106
|
+
const bodyOk = scenario.retry ? attempts++ > 0 : scenario.bodyOk;
|
|
107
|
+
assert.equal(bodyOk, true, "behavioral assertion");
|
|
108
|
+
phase("body-return");
|
|
109
|
+
};
|
|
110
|
+
const registerTest = () => {
|
|
111
|
+
if (scenario.fixture) {
|
|
112
|
+
const extended = test.extend({
|
|
113
|
+
resource: async ({}, use) => {
|
|
114
|
+
phase("fixture-setup-enter");
|
|
115
|
+
assert.notEqual(scenario.fixture, "setup-error", "fixture setup assertion");
|
|
116
|
+
phase("fixture-setup-return");
|
|
117
|
+
await use(true);
|
|
118
|
+
phase("fixture-cleanup-enter");
|
|
119
|
+
assert.notEqual(scenario.fixture, "cleanup-error", "fixture teardown assertion");
|
|
120
|
+
phase("fixture-cleanup-return");
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
extended("phase " + scenario.id, ({ resource }) => { assert.equal(resource, true); body(); });
|
|
124
|
+
} else if (scenario.expectedFailure) test.fails("phase " + scenario.id, body);
|
|
125
|
+
else if (scenario.retry) test("phase " + scenario.id, { retry: 1 }, body);
|
|
126
|
+
else if (scenario.repeat) test("phase " + scenario.id, { repeats: 1 }, body);
|
|
127
|
+
else test("phase " + scenario.id, body);
|
|
128
|
+
};
|
|
129
|
+
if (scenario.nested) describe("deliberately unsupported collector", registerTest);
|
|
130
|
+
else registerTest();
|
|
131
|
+
}
|
|
132
|
+
`;
|
|
133
|
+
export const VITEST_PHASE_READER_SOURCE = String.raw `
|
|
134
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
135
|
+
const scenario = process.argv[2];
|
|
136
|
+
const path = "phases/" + scenario + ".jsonl";
|
|
137
|
+
const events = existsSync(path) ? readFileSync(path, "utf8").trim().split("\n").filter(Boolean).map(JSON.parse) : [];
|
|
138
|
+
console.log("ROUTEKIT_PHASE_CAUSAL_CONTROL " + JSON.stringify({
|
|
139
|
+
...JSON.parse(readFileSync("identity.json", "utf8")), scenario, events,
|
|
140
|
+
customRunnerImported: existsSync("custom-runner-imported")
|
|
141
|
+
}));
|
|
142
|
+
`;
|
|
143
|
+
// The stock JSON report is a causal comparison only, never semantic evidence.
|
|
144
|
+
// Its invocation intentionally uses the uninstrumented pinned Vitest CLI.
|
|
145
|
+
export const VITEST_PHASE_STOCK_READER_SOURCE = String.raw `
|
|
146
|
+
import "./read-phases.mjs";
|
|
147
|
+
import { readFileSync } from "node:fs";
|
|
148
|
+
const scenario = process.argv[2];
|
|
149
|
+
console.log("ROUTEKIT_STOCK_VITEST_CONTROL " + JSON.stringify({
|
|
150
|
+
...JSON.parse(readFileSync("identity.json", "utf8")), scenario,
|
|
151
|
+
report: JSON.parse(readFileSync("stock-" + scenario + ".json", "utf8"))
|
|
152
|
+
}));
|
|
153
|
+
`;
|
|
154
|
+
export const VITEST_PHASE_VERSIONS_SOURCE = String.raw `
|
|
155
|
+
import assert from "node:assert/strict";
|
|
156
|
+
import { execFileSync } from "node:child_process";
|
|
157
|
+
import { accessSync, constants, readFileSync, realpathSync, statSync } from "node:fs";
|
|
158
|
+
import { createRequire } from "node:module";
|
|
159
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
160
|
+
const checkout = realpathSync(process.cwd());
|
|
161
|
+
const localFile = path => {
|
|
162
|
+
const actual = realpathSync(path);
|
|
163
|
+
const local = relative(checkout, actual);
|
|
164
|
+
assert.equal(local === ".." || local.startsWith(".." + sep) || isAbsolute(local), false,
|
|
165
|
+
"pinned runtime files and launchers must belong to the isolated checkout");
|
|
166
|
+
assert.equal(statSync(actual).isFile(), true, "pinned runtime paths must be files");
|
|
167
|
+
return actual;
|
|
168
|
+
};
|
|
169
|
+
const require = createRequire(import.meta.url);
|
|
170
|
+
const vitestPath = localFile(require.resolve("vitest/package.json"));
|
|
171
|
+
const fromVitest = createRequire(vitestPath);
|
|
172
|
+
const runnerPath = localFile(fromVitest.resolve("@vitest/runner/package.json"));
|
|
173
|
+
const vitePath = localFile(fromVitest.resolve("vite/package.json"));
|
|
174
|
+
const version = path => JSON.parse(readFileSync(path, "utf8")).version;
|
|
175
|
+
const versions = {
|
|
176
|
+
vitest: version(vitestPath),
|
|
177
|
+
runner: version(runnerPath),
|
|
178
|
+
vite: version(vitePath)
|
|
179
|
+
};
|
|
180
|
+
assert.deepEqual(versions, { vitest: "3.2.7", runner: "3.2.7", vite: "7.3.6" });
|
|
181
|
+
for (const [name, manifestPath] of [["vite", vitePath], ["vitest", vitestPath]]) {
|
|
182
|
+
const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
|
|
183
|
+
const declaredEntry = typeof manifest.bin === "string" ? manifest.bin : manifest.bin?.[name];
|
|
184
|
+
assert.equal(typeof declaredEntry, "string", name + " must declare its executable");
|
|
185
|
+
const entry = localFile(resolve(dirname(manifestPath), declaredEntry));
|
|
186
|
+
const launcher = localFile(join(checkout, "node_modules", ".bin",
|
|
187
|
+
name + (process.platform === "win32" ? ".cmd" : "")));
|
|
188
|
+
accessSync(launcher, constants.X_OK);
|
|
189
|
+
// Frozen installs need truthful hasBin metadata. A package/version check
|
|
190
|
+
// alone can pass while pnpm exec falls back to the workspace's binary.
|
|
191
|
+
// Observe the actual Node entrypoint, not a shim comment or version text.
|
|
192
|
+
const proof = "ROUTEKIT_PINNED_EXECUTABLE " + name;
|
|
193
|
+
const preload = 'import { realpathSync } from "node:fs";\n' +
|
|
194
|
+
'let entry; try { entry = process.argv[1] && realpathSync(process.argv[1]); } catch {}\n' +
|
|
195
|
+
'if (entry === ' + JSON.stringify(entry) + ') process.stdout.write(' +
|
|
196
|
+
JSON.stringify(proof + "\n") + ');\n';
|
|
197
|
+
const output = execFileSync("corepack", ["pnpm@11.15.1", "exec", name, "--version"], {
|
|
198
|
+
cwd: checkout,
|
|
199
|
+
env: { ...process.env, NODE_OPTIONS: "--import=data:text/javascript;base64," +
|
|
200
|
+
Buffer.from(preload).toString("base64") },
|
|
201
|
+
encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], maxBuffer: 65536
|
|
202
|
+
});
|
|
203
|
+
assert.equal(output.split("\n").filter(line => line === proof).length, 1,
|
|
204
|
+
name + " must execute its checkout-local pinned entrypoint");
|
|
205
|
+
}
|
|
206
|
+
console.log("ROUTEKIT_PINNED_VITEST_RUNTIME " + JSON.stringify(versions));
|
|
207
|
+
`;
|
|
208
|
+
// This module must never execute when the host refuses a configured runner.
|
|
209
|
+
export const VITEST_PHASE_CUSTOM_RUNNER_SOURCE = String.raw `
|
|
210
|
+
import { writeFileSync } from "node:fs";
|
|
211
|
+
writeFileSync("custom-runner-imported", "unsafe runner executed");
|
|
212
|
+
export default class CustomRunner { constructor() { throw new Error("must not instantiate"); } }
|
|
213
|
+
`;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export declare const VITEST_REPORTER_RESULTS: readonly [{
|
|
2
|
+
readonly name: "test/pass.test.js";
|
|
3
|
+
readonly expected: "pass";
|
|
4
|
+
readonly exitCode: 0;
|
|
5
|
+
readonly stdout: "ROUTEKIT_VITEST_EVIDENCE_V1 {\"version\":1,\"complete\":true,\"starts\":1,\"ends\":1,\"reason\":\"passed\",\"eventIntegrity\":true,\"unfinishedHooks\":false,\"completedTestIds\":[\"-2123656795_0\"],\"unhandledErrors\":[],\"modules\":[{\"id\":\"-2123656795\",\"state\":\"passed\",\"errors\":[],\"hooks\":[],\"suites\":[],\"tests\":[{\"id\":\"-2123656795_0\",\"name\":\"asserted success\",\"state\":\"passed\",\"errors\":[],\"hooks\":[],\"diagnostic\":{\"retryCount\":0,\"repeatCount\":0,\"flaky\":false,\"duration\":0.49945799999998997}}]}]}\n";
|
|
6
|
+
}, {
|
|
7
|
+
readonly name: "test/assertion.test.js";
|
|
8
|
+
readonly expected: "fail";
|
|
9
|
+
readonly exitCode: 1;
|
|
10
|
+
readonly stdout: "ROUTEKIT_VITEST_EVIDENCE_V1 {\"version\":1,\"complete\":true,\"starts\":1,\"ends\":1,\"reason\":\"failed\",\"eventIntegrity\":true,\"unfinishedHooks\":false,\"completedTestIds\":[\"1562894588_0\"],\"unhandledErrors\":[],\"modules\":[{\"id\":\"1562894588\",\"state\":\"failed\",\"errors\":[],\"hooks\":[],\"suites\":[],\"tests\":[{\"id\":\"1562894588_0\",\"name\":\"body assertion\",\"state\":\"failed\",\"errors\":[{\"name\":\"AssertionError\"}],\"hooks\":[],\"diagnostic\":{\"retryCount\":0,\"repeatCount\":0,\"flaky\":false,\"duration\":3.3549999999999898}}]}]}\n";
|
|
11
|
+
}, {
|
|
12
|
+
readonly name: "test/runtime.test.js";
|
|
13
|
+
readonly expected: "unknown";
|
|
14
|
+
readonly exitCode: 1;
|
|
15
|
+
readonly stdout: "ROUTEKIT_VITEST_EVIDENCE_V1 {\"version\":1,\"complete\":true,\"starts\":1,\"ends\":1,\"reason\":\"failed\",\"eventIntegrity\":true,\"unfinishedHooks\":false,\"completedTestIds\":[\"2121496722_0\"],\"unhandledErrors\":[],\"modules\":[{\"id\":\"2121496722\",\"state\":\"failed\",\"errors\":[],\"hooks\":[],\"suites\":[],\"tests\":[{\"id\":\"2121496722_0\",\"name\":\"body runtime error\",\"state\":\"failed\",\"errors\":[{\"name\":\"TypeError\"}],\"hooks\":[],\"diagnostic\":{\"retryCount\":0,\"repeatCount\":0,\"flaky\":false,\"duration\":1.7253749999999997}}]}]}\n";
|
|
16
|
+
}, {
|
|
17
|
+
readonly name: "test/before_each.test.js";
|
|
18
|
+
readonly expected: "unknown";
|
|
19
|
+
readonly exitCode: 1;
|
|
20
|
+
readonly stdout: "ROUTEKIT_VITEST_EVIDENCE_V1 {\"version\":1,\"complete\":true,\"starts\":1,\"ends\":1,\"reason\":\"failed\",\"eventIntegrity\":true,\"unfinishedHooks\":true,\"completedTestIds\":[\"2072471803_0\"],\"unhandledErrors\":[],\"modules\":[{\"id\":\"2072471803\",\"state\":\"failed\",\"errors\":[],\"hooks\":[],\"suites\":[],\"tests\":[{\"id\":\"2072471803_0\",\"name\":\"beforeEach assertion\",\"state\":\"failed\",\"errors\":[{\"name\":\"AssertionError\"}],\"hooks\":[\"run\"],\"diagnostic\":{\"retryCount\":0,\"repeatCount\":0,\"flaky\":false,\"duration\":3.4626250000000027}}]}]}\n";
|
|
21
|
+
}, {
|
|
22
|
+
readonly name: "test/after_each.test.js";
|
|
23
|
+
readonly expected: "unknown";
|
|
24
|
+
readonly exitCode: 1;
|
|
25
|
+
readonly stdout: "ROUTEKIT_VITEST_EVIDENCE_V1 {\"version\":1,\"complete\":true,\"starts\":1,\"ends\":1,\"reason\":\"failed\",\"eventIntegrity\":true,\"unfinishedHooks\":true,\"completedTestIds\":[\"-282103976_0\"],\"unhandledErrors\":[],\"modules\":[{\"id\":\"-282103976\",\"state\":\"failed\",\"errors\":[],\"hooks\":[],\"suites\":[],\"tests\":[{\"id\":\"-282103976_0\",\"name\":\"afterEach assertion\",\"state\":\"failed\",\"errors\":[{\"name\":\"AssertionError\"}],\"hooks\":[\"run\"],\"diagnostic\":{\"retryCount\":0,\"repeatCount\":0,\"flaky\":false,\"duration\":3.2887079999999997}}]}]}\n";
|
|
26
|
+
}, {
|
|
27
|
+
readonly name: "test/before_all.test.js";
|
|
28
|
+
readonly expected: "unknown";
|
|
29
|
+
readonly exitCode: 1;
|
|
30
|
+
readonly stdout: "ROUTEKIT_VITEST_EVIDENCE_V1 {\"version\":1,\"complete\":true,\"starts\":1,\"ends\":1,\"reason\":\"failed\",\"eventIntegrity\":true,\"unfinishedHooks\":true,\"completedTestIds\":[\"-532777803_0\"],\"unhandledErrors\":[],\"modules\":[{\"id\":\"-532777803\",\"state\":\"failed\",\"errors\":[{\"name\":\"AssertionError\"}],\"hooks\":[\"run\"],\"suites\":[],\"tests\":[{\"id\":\"-532777803_0\",\"name\":\"beforeAll assertion\",\"state\":\"skipped\",\"errors\":[],\"hooks\":[],\"diagnostic\":null}]}]}\n";
|
|
31
|
+
}, {
|
|
32
|
+
readonly name: "test/after_all.test.js";
|
|
33
|
+
readonly expected: "unknown";
|
|
34
|
+
readonly exitCode: 1;
|
|
35
|
+
readonly stdout: "ROUTEKIT_VITEST_EVIDENCE_V1 {\"version\":1,\"complete\":true,\"starts\":1,\"ends\":1,\"reason\":\"failed\",\"eventIntegrity\":true,\"unfinishedHooks\":true,\"completedTestIds\":[\"-193089864_0\"],\"unhandledErrors\":[],\"modules\":[{\"id\":\"-193089864\",\"state\":\"failed\",\"errors\":[{\"name\":\"AssertionError\"}],\"hooks\":[\"run\"],\"suites\":[],\"tests\":[{\"id\":\"-193089864_0\",\"name\":\"afterAll assertion\",\"state\":\"passed\",\"errors\":[],\"hooks\":[],\"diagnostic\":{\"retryCount\":0,\"repeatCount\":0,\"flaky\":false,\"duration\":0.4870829999999984}}]}]}\n";
|
|
36
|
+
}, {
|
|
37
|
+
readonly name: "test/import_error.test.js";
|
|
38
|
+
readonly expected: "unknown";
|
|
39
|
+
readonly exitCode: 1;
|
|
40
|
+
readonly stdout: "ROUTEKIT_VITEST_EVIDENCE_V1 {\"version\":1,\"complete\":true,\"starts\":1,\"ends\":1,\"reason\":\"failed\",\"eventIntegrity\":true,\"unfinishedHooks\":false,\"completedTestIds\":[],\"unhandledErrors\":[],\"modules\":[{\"id\":\"-1876038526\",\"state\":\"failed\",\"errors\":[{\"name\":\"Error\"}],\"hooks\":[],\"suites\":[],\"tests\":[]}]}\n";
|
|
41
|
+
}, {
|
|
42
|
+
readonly name: "test/mixed.test.js";
|
|
43
|
+
readonly expected: "unknown";
|
|
44
|
+
readonly exitCode: 1;
|
|
45
|
+
readonly stdout: "ROUTEKIT_VITEST_EVIDENCE_V1 {\"version\":1,\"complete\":true,\"starts\":1,\"ends\":1,\"reason\":\"failed\",\"eventIntegrity\":true,\"unfinishedHooks\":false,\"completedTestIds\":[\"-1962563979_0\",\"-1962563979_1\"],\"unhandledErrors\":[],\"modules\":[{\"id\":\"-1962563979\",\"state\":\"failed\",\"errors\":[],\"hooks\":[],\"suites\":[],\"tests\":[{\"id\":\"-1962563979_0\",\"name\":\"assertion\",\"state\":\"failed\",\"errors\":[{\"name\":\"AssertionError\"}],\"hooks\":[],\"diagnostic\":{\"retryCount\":0,\"repeatCount\":0,\"flaky\":false,\"duration\":3.106250000000003}},{\"id\":\"-1962563979_1\",\"name\":\"runtime\",\"state\":\"failed\",\"errors\":[{\"name\":\"TypeError\"}],\"hooks\":[],\"diagnostic\":{\"retryCount\":0,\"repeatCount\":0,\"flaky\":false,\"duration\":0.1493329999999986}}]}]}\n";
|
|
46
|
+
}, {
|
|
47
|
+
readonly name: "test/retry.test.js";
|
|
48
|
+
readonly expected: "unknown";
|
|
49
|
+
readonly exitCode: 0;
|
|
50
|
+
readonly stdout: "ROUTEKIT_VITEST_EVIDENCE_V1 {\"version\":1,\"complete\":true,\"starts\":1,\"ends\":1,\"reason\":\"passed\",\"eventIntegrity\":true,\"unfinishedHooks\":false,\"completedTestIds\":[\"1385381922_0\"],\"unhandledErrors\":[],\"modules\":[{\"id\":\"1385381922\",\"state\":\"passed\",\"errors\":[],\"hooks\":[],\"suites\":[],\"tests\":[{\"id\":\"1385381922_0\",\"name\":\"retried body\",\"state\":\"passed\",\"errors\":[{\"name\":\"AssertionError\"}],\"hooks\":[],\"diagnostic\":{\"retryCount\":1,\"repeatCount\":0,\"flaky\":true,\"duration\":4.030708000000004}}]}]}\n";
|
|
51
|
+
}, {
|
|
52
|
+
readonly name: "test/skipped.test.js";
|
|
53
|
+
readonly expected: "unknown";
|
|
54
|
+
readonly exitCode: 0;
|
|
55
|
+
readonly stdout: "ROUTEKIT_VITEST_EVIDENCE_V1 {\"version\":1,\"complete\":true,\"starts\":1,\"ends\":1,\"reason\":\"passed\",\"eventIntegrity\":true,\"unfinishedHooks\":false,\"completedTestIds\":[\"436221930_0\"],\"unhandledErrors\":[],\"modules\":[{\"id\":\"436221930\",\"state\":\"skipped\",\"errors\":[],\"hooks\":[],\"suites\":[],\"tests\":[{\"id\":\"436221930_0\",\"name\":\"skipped\",\"state\":\"skipped\",\"errors\":[],\"hooks\":[],\"diagnostic\":null}]}]}\n";
|
|
56
|
+
}, {
|
|
57
|
+
readonly name: "hook-attribution/successful-hooks-assertion.test.js";
|
|
58
|
+
readonly expected: "fail";
|
|
59
|
+
readonly exitCode: 1;
|
|
60
|
+
readonly stdout: "ROUTEKIT_VITEST_EVIDENCE_V1 {\"version\":1,\"complete\":true,\"starts\":1,\"ends\":1,\"reason\":\"failed\",\"eventIntegrity\":true,\"unfinishedHooks\":false,\"completedTestIds\":[\"-496486493_0\"],\"unhandledErrors\":[],\"modules\":[{\"id\":\"-496486493\",\"state\":\"failed\",\"errors\":[],\"hooks\":[],\"suites\":[],\"tests\":[{\"id\":\"-496486493_0\",\"name\":\"body assertion with healthy hooks\",\"state\":\"failed\",\"errors\":[{\"name\":\"AssertionError\"}],\"hooks\":[\"pass\",\"pass\"],\"diagnostic\":{\"retryCount\":0,\"repeatCount\":0,\"flaky\":false,\"duration\":3.904875000000004}}]}]}\n";
|
|
61
|
+
}, {
|
|
62
|
+
readonly name: "hook-attribution/successful-hooks-pass.test.js";
|
|
63
|
+
readonly expected: "pass";
|
|
64
|
+
readonly exitCode: 0;
|
|
65
|
+
readonly stdout: "ROUTEKIT_VITEST_EVIDENCE_V1 {\"version\":1,\"complete\":true,\"starts\":1,\"ends\":1,\"reason\":\"passed\",\"eventIntegrity\":true,\"unfinishedHooks\":false,\"completedTestIds\":[\"-1264882018_0\"],\"unhandledErrors\":[],\"modules\":[{\"id\":\"-1264882018\",\"state\":\"passed\",\"errors\":[],\"hooks\":[],\"suites\":[],\"tests\":[{\"id\":\"-1264882018_0\",\"name\":\"body success with healthy hooks\",\"state\":\"passed\",\"errors\":[],\"hooks\":[\"pass\",\"pass\"],\"diagnostic\":{\"retryCount\":0,\"repeatCount\":0,\"flaky\":false,\"duration\":0.6971669999999932}}]}]}\n";
|
|
66
|
+
}, {
|
|
67
|
+
readonly name: "hook-attribution/nested-before-all.test.js";
|
|
68
|
+
readonly expected: "unknown";
|
|
69
|
+
readonly exitCode: 1;
|
|
70
|
+
readonly stdout: "ROUTEKIT_VITEST_EVIDENCE_V1 {\"version\":1,\"complete\":true,\"starts\":1,\"ends\":1,\"reason\":\"failed\",\"eventIntegrity\":true,\"unfinishedHooks\":true,\"completedTestIds\":[\"747178342_0_0_0\"],\"unhandledErrors\":[],\"modules\":[{\"id\":\"747178342\",\"state\":\"failed\",\"errors\":[],\"hooks\":[],\"suites\":[{\"id\":\"747178342_0\",\"state\":\"failed\",\"errors\":[],\"hooks\":[]},{\"id\":\"747178342_0_0\",\"state\":\"failed\",\"errors\":[{\"name\":\"AssertionError\"}],\"hooks\":[\"run\"]}],\"tests\":[{\"id\":\"747178342_0_0_0\",\"name\":\"unreached body\",\"state\":\"skipped\",\"errors\":[],\"hooks\":[],\"diagnostic\":null}]}]}\n";
|
|
71
|
+
}, {
|
|
72
|
+
readonly name: "hook-attribution/unhandled-error.test.js";
|
|
73
|
+
readonly expected: "unknown";
|
|
74
|
+
readonly exitCode: 1;
|
|
75
|
+
readonly stdout: "ROUTEKIT_VITEST_EVIDENCE_V1 {\"version\":1,\"complete\":true,\"starts\":1,\"ends\":1,\"reason\":\"passed\",\"eventIntegrity\":true,\"unfinishedHooks\":false,\"completedTestIds\":[\"-1575706821_0\"],\"unhandledErrors\":[{\"name\":\"Error\"}],\"modules\":[{\"id\":\"-1575706821\",\"state\":\"passed\",\"errors\":[],\"hooks\":[],\"suites\":[],\"tests\":[{\"id\":\"-1575706821_0\",\"name\":\"apparently successful body\",\"state\":\"passed\",\"errors\":[],\"hooks\":[],\"diagnostic\":{\"retryCount\":0,\"repeatCount\":0,\"flaky\":false,\"duration\":12.362875000000003}}]}]}\n";
|
|
76
|
+
}];
|