@ontrails/warden 1.0.0-beta.13 → 1.0.0-beta.15
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/.turbo/turbo-lint.log +1 -1
- package/CHANGELOG.md +30 -0
- package/README.md +31 -20
- package/dist/cli.d.ts +19 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +261 -64
- package/dist/cli.js.map +1 -1
- package/dist/draft.d.ts +5 -0
- package/dist/draft.d.ts.map +1 -0
- package/dist/draft.js +16 -0
- package/dist/draft.js.map +1 -0
- package/dist/drift.d.ts +10 -7
- package/dist/drift.d.ts.map +1 -1
- package/dist/drift.js +50 -16
- package/dist/drift.js.map +1 -1
- package/dist/formatters.d.ts +2 -1
- package/dist/formatters.d.ts.map +1 -1
- package/dist/formatters.js +15 -4
- package/dist/formatters.js.map +1 -1
- package/dist/index.d.ts +9 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -17
- package/dist/index.js.map +1 -1
- package/dist/rules/ast.d.ts +412 -7
- package/dist/rules/ast.d.ts.map +1 -1
- package/dist/rules/ast.js +1847 -102
- package/dist/rules/ast.js.map +1 -1
- package/dist/rules/circular-refs.d.ts +6 -0
- package/dist/rules/circular-refs.d.ts.map +1 -0
- package/dist/rules/circular-refs.js +83 -0
- package/dist/rules/circular-refs.js.map +1 -0
- package/dist/rules/context-no-surface-types.d.ts.map +1 -1
- package/dist/rules/context-no-surface-types.js +59 -3
- package/dist/rules/context-no-surface-types.js.map +1 -1
- package/dist/rules/contour-exists.d.ts +7 -0
- package/dist/rules/contour-exists.d.ts.map +1 -0
- package/dist/rules/contour-exists.js +113 -0
- package/dist/rules/contour-exists.js.map +1 -0
- package/dist/rules/contour-ids.d.ts +10 -0
- package/dist/rules/contour-ids.d.ts.map +1 -0
- package/dist/rules/contour-ids.js +12 -0
- package/dist/rules/contour-ids.js.map +1 -0
- package/dist/rules/cross-declarations.d.ts.map +1 -1
- package/dist/rules/cross-declarations.js +171 -57
- package/dist/rules/cross-declarations.js.map +1 -1
- package/dist/rules/dead-internal-trail.d.ts +3 -0
- package/dist/rules/dead-internal-trail.d.ts.map +1 -0
- package/dist/rules/dead-internal-trail.js +80 -0
- package/dist/rules/dead-internal-trail.js.map +1 -0
- package/dist/rules/draft-file-marking.d.ts +6 -0
- package/dist/rules/draft-file-marking.d.ts.map +1 -0
- package/dist/rules/draft-file-marking.js +87 -0
- package/dist/rules/draft-file-marking.js.map +1 -0
- package/dist/rules/draft-visible-debt.d.ts +12 -0
- package/dist/rules/draft-visible-debt.d.ts.map +1 -0
- package/dist/rules/draft-visible-debt.js +50 -0
- package/dist/rules/draft-visible-debt.js.map +1 -0
- package/dist/rules/error-mapping-completeness.d.ts +13 -0
- package/dist/rules/error-mapping-completeness.d.ts.map +1 -0
- package/dist/rules/error-mapping-completeness.js +160 -0
- package/dist/rules/error-mapping-completeness.js.map +1 -0
- package/dist/rules/example-valid.d.ts +6 -0
- package/dist/rules/example-valid.d.ts.map +1 -0
- package/dist/rules/example-valid.js +203 -0
- package/dist/rules/example-valid.js.map +1 -0
- package/dist/rules/fires-declarations.d.ts +16 -0
- package/dist/rules/fires-declarations.d.ts.map +1 -0
- package/dist/rules/fires-declarations.js +444 -0
- package/dist/rules/fires-declarations.js.map +1 -0
- package/dist/rules/implementation-returns-result.d.ts +9 -0
- package/dist/rules/implementation-returns-result.d.ts.map +1 -1
- package/dist/rules/implementation-returns-result.js +638 -76
- package/dist/rules/implementation-returns-result.js.map +1 -1
- package/dist/rules/incomplete-accessor-for-standard-op.d.ts +30 -0
- package/dist/rules/incomplete-accessor-for-standard-op.d.ts.map +1 -0
- package/dist/rules/incomplete-accessor-for-standard-op.js +226 -0
- package/dist/rules/incomplete-accessor-for-standard-op.js.map +1 -0
- package/dist/rules/incomplete-crud.d.ts +21 -0
- package/dist/rules/incomplete-crud.d.ts.map +1 -0
- package/dist/rules/incomplete-crud.js +368 -0
- package/dist/rules/incomplete-crud.js.map +1 -0
- package/dist/rules/index.d.ts +40 -7
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +91 -15
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/intent-propagation.d.ts +3 -0
- package/dist/rules/intent-propagation.d.ts.map +1 -0
- package/dist/rules/intent-propagation.js +57 -0
- package/dist/rules/intent-propagation.js.map +1 -0
- package/dist/rules/missing-reconcile.d.ts +3 -0
- package/dist/rules/missing-reconcile.d.ts.map +1 -0
- package/dist/rules/missing-reconcile.js +44 -0
- package/dist/rules/missing-reconcile.js.map +1 -0
- package/dist/rules/missing-visibility.d.ts +3 -0
- package/dist/rules/missing-visibility.d.ts.map +1 -0
- package/dist/rules/missing-visibility.js +63 -0
- package/dist/rules/missing-visibility.js.map +1 -0
- package/dist/rules/no-direct-impl-in-route.d.ts.map +1 -1
- package/dist/rules/no-direct-impl-in-route.js +0 -3
- package/dist/rules/no-direct-impl-in-route.js.map +1 -1
- package/dist/rules/no-direct-implementation-call.js +1 -1
- package/dist/rules/no-direct-implementation-call.js.map +1 -1
- package/dist/rules/no-sync-result-assumption.d.ts.map +1 -1
- package/dist/rules/no-sync-result-assumption.js +870 -61
- package/dist/rules/no-sync-result-assumption.js.map +1 -1
- package/dist/rules/no-throw-in-detour-recover.d.ts +3 -0
- package/dist/rules/no-throw-in-detour-recover.d.ts.map +1 -0
- package/dist/rules/no-throw-in-detour-recover.js +147 -0
- package/dist/rules/no-throw-in-detour-recover.js.map +1 -0
- package/dist/rules/no-throw-in-detour-target.d.ts +4 -1
- package/dist/rules/no-throw-in-detour-target.d.ts.map +1 -1
- package/dist/rules/no-throw-in-detour-target.js +6 -3
- package/dist/rules/no-throw-in-detour-target.js.map +1 -1
- package/dist/rules/no-throw-in-implementation.d.ts +4 -2
- package/dist/rules/no-throw-in-implementation.d.ts.map +1 -1
- package/dist/rules/no-throw-in-implementation.js +6 -4
- package/dist/rules/no-throw-in-implementation.js.map +1 -1
- package/dist/rules/on-references-exist.d.ts +14 -0
- package/dist/rules/on-references-exist.d.ts.map +1 -0
- package/dist/rules/on-references-exist.js +109 -0
- package/dist/rules/on-references-exist.js.map +1 -0
- package/dist/rules/orphaned-signal.d.ts +3 -0
- package/dist/rules/orphaned-signal.d.ts.map +1 -0
- package/dist/rules/orphaned-signal.js +67 -0
- package/dist/rules/orphaned-signal.js.map +1 -0
- package/dist/rules/permit-governance.d.ts +3 -0
- package/dist/rules/permit-governance.d.ts.map +1 -0
- package/dist/rules/permit-governance.js +15 -0
- package/dist/rules/permit-governance.js.map +1 -0
- package/dist/rules/reference-exists.d.ts +6 -0
- package/dist/rules/reference-exists.d.ts.map +1 -0
- package/dist/rules/reference-exists.js +47 -0
- package/dist/rules/reference-exists.js.map +1 -0
- package/dist/rules/registry-names.d.ts +8 -0
- package/dist/rules/registry-names.d.ts.map +1 -0
- package/dist/rules/registry-names.js +83 -0
- package/dist/rules/registry-names.js.map +1 -0
- package/dist/rules/resource-declarations.d.ts +14 -0
- package/dist/rules/resource-declarations.d.ts.map +1 -0
- package/dist/rules/resource-declarations.js +413 -0
- package/dist/rules/resource-declarations.js.map +1 -0
- package/dist/rules/resource-exists.d.ts +6 -0
- package/dist/rules/resource-exists.d.ts.map +1 -0
- package/dist/rules/resource-exists.js +90 -0
- package/dist/rules/resource-exists.js.map +1 -0
- package/dist/rules/resource-id-grammar.d.ts +3 -0
- package/dist/rules/resource-id-grammar.d.ts.map +1 -0
- package/dist/rules/resource-id-grammar.js +39 -0
- package/dist/rules/resource-id-grammar.js.map +1 -0
- package/dist/rules/specs.d.ts.map +1 -1
- package/dist/rules/specs.js +5 -1
- package/dist/rules/specs.js.map +1 -1
- package/dist/rules/types.d.ts +53 -4
- package/dist/rules/types.d.ts.map +1 -1
- package/dist/rules/unreachable-detour-shadowing.d.ts +3 -0
- package/dist/rules/unreachable-detour-shadowing.d.ts.map +1 -0
- package/dist/rules/unreachable-detour-shadowing.js +202 -0
- package/dist/rules/unreachable-detour-shadowing.js.map +1 -0
- package/dist/rules/valid-describe-refs.d.ts.map +1 -1
- package/dist/rules/valid-describe-refs.js +132 -16
- package/dist/rules/valid-describe-refs.js.map +1 -1
- package/dist/rules/valid-detour-contract.d.ts +3 -0
- package/dist/rules/valid-detour-contract.d.ts.map +1 -0
- package/dist/rules/valid-detour-contract.js +47 -0
- package/dist/rules/valid-detour-contract.js.map +1 -0
- package/dist/rules/valid-detour-refs.d.ts.map +1 -1
- package/dist/rules/valid-detour-refs.js +73 -82
- package/dist/rules/valid-detour-refs.js.map +1 -1
- package/dist/rules/warden-export-symmetry.d.ts +7 -0
- package/dist/rules/warden-export-symmetry.d.ts.map +1 -0
- package/dist/rules/warden-export-symmetry.js +352 -0
- package/dist/rules/warden-export-symmetry.js.map +1 -0
- package/dist/rules/warden-rules-use-ast.d.ts +17 -0
- package/dist/rules/warden-rules-use-ast.d.ts.map +1 -0
- package/dist/rules/warden-rules-use-ast.js +778 -0
- package/dist/rules/warden-rules-use-ast.js.map +1 -0
- package/dist/trails/circular-refs.trail.d.ts +24 -0
- package/dist/trails/circular-refs.trail.d.ts.map +1 -0
- package/dist/trails/circular-refs.trail.js +29 -0
- package/dist/trails/circular-refs.trail.js.map +1 -0
- package/dist/trails/context-no-surface-types.trail.d.ts +2 -2
- package/dist/trails/context-no-surface-types.trail.d.ts.map +1 -1
- package/dist/trails/context-no-trailhead-types.trail.d.ts +2 -2
- package/dist/trails/context-no-trailhead-types.trail.d.ts.map +1 -1
- package/dist/trails/contour-exists.trail.d.ts +24 -0
- package/dist/trails/contour-exists.trail.d.ts.map +1 -0
- package/dist/trails/contour-exists.trail.js +21 -0
- package/dist/trails/contour-exists.trail.js.map +1 -0
- package/dist/trails/cross-declarations.trail.d.ts +2 -2
- package/dist/trails/cross-declarations.trail.d.ts.map +1 -1
- package/dist/trails/dead-internal-trail.trail.d.ts +24 -0
- package/dist/trails/dead-internal-trail.trail.d.ts.map +1 -0
- package/dist/trails/dead-internal-trail.trail.js +26 -0
- package/dist/trails/dead-internal-trail.trail.js.map +1 -0
- package/dist/trails/{provision-declarations.trail.d.ts → draft-file-marking.trail.d.ts} +3 -3
- package/dist/trails/draft-file-marking.trail.d.ts.map +1 -0
- package/dist/trails/draft-file-marking.trail.js +16 -0
- package/dist/trails/draft-file-marking.trail.js.map +1 -0
- package/dist/trails/draft-visible-debt.trail.d.ts +13 -0
- package/dist/trails/draft-visible-debt.trail.d.ts.map +1 -0
- package/dist/trails/draft-visible-debt.trail.js +16 -0
- package/dist/trails/draft-visible-debt.trail.js.map +1 -0
- package/dist/trails/error-mapping-completeness.trail.d.ts +13 -0
- package/dist/trails/error-mapping-completeness.trail.d.ts.map +1 -0
- package/dist/trails/error-mapping-completeness.trail.js +29 -0
- package/dist/trails/error-mapping-completeness.trail.js.map +1 -0
- package/dist/trails/{follow-declarations.trail.d.ts → example-valid.trail.d.ts} +3 -3
- package/dist/trails/example-valid.trail.d.ts.map +1 -0
- package/dist/trails/example-valid.trail.js +25 -0
- package/dist/trails/example-valid.trail.js.map +1 -0
- package/dist/trails/fires-declarations.trail.d.ts +13 -0
- package/dist/trails/fires-declarations.trail.d.ts.map +1 -0
- package/dist/trails/fires-declarations.trail.js +22 -0
- package/dist/trails/fires-declarations.trail.js.map +1 -0
- package/dist/trails/implementation-returns-result.trail.d.ts +2 -2
- package/dist/trails/implementation-returns-result.trail.d.ts.map +1 -1
- package/dist/trails/incomplete-accessor-for-standard-op.trail.d.ts +12 -0
- package/dist/trails/incomplete-accessor-for-standard-op.trail.d.ts.map +1 -0
- package/dist/trails/incomplete-accessor-for-standard-op.trail.js +60 -0
- package/dist/trails/incomplete-accessor-for-standard-op.trail.js.map +1 -0
- package/dist/trails/incomplete-crud.trail.d.ts +24 -0
- package/dist/trails/incomplete-crud.trail.d.ts.map +1 -0
- package/dist/trails/incomplete-crud.trail.js +39 -0
- package/dist/trails/incomplete-crud.trail.js.map +1 -0
- package/dist/trails/index.d.ts +29 -7
- package/dist/trails/index.d.ts.map +1 -1
- package/dist/trails/index.js +28 -6
- package/dist/trails/index.js.map +1 -1
- package/dist/trails/intent-propagation.trail.d.ts +24 -0
- package/dist/trails/intent-propagation.trail.d.ts.map +1 -0
- package/dist/trails/intent-propagation.trail.js +30 -0
- package/dist/trails/intent-propagation.trail.js.map +1 -0
- package/dist/trails/missing-reconcile.trail.d.ts +24 -0
- package/dist/trails/missing-reconcile.trail.d.ts.map +1 -0
- package/dist/trails/missing-reconcile.trail.js +33 -0
- package/dist/trails/missing-reconcile.trail.js.map +1 -0
- package/dist/trails/missing-visibility.trail.d.ts +24 -0
- package/dist/trails/missing-visibility.trail.d.ts.map +1 -0
- package/dist/trails/missing-visibility.trail.js +22 -0
- package/dist/trails/missing-visibility.trail.js.map +1 -0
- package/dist/trails/no-direct-impl-in-route.trail.d.ts +2 -2
- package/dist/trails/no-direct-impl-in-route.trail.d.ts.map +1 -1
- package/dist/trails/no-direct-implementation-call.trail.d.ts +2 -2
- package/dist/trails/no-direct-implementation-call.trail.d.ts.map +1 -1
- package/dist/trails/no-sync-result-assumption.trail.d.ts +2 -2
- package/dist/trails/no-sync-result-assumption.trail.d.ts.map +1 -1
- package/dist/trails/no-throw-in-detour-recover.trail.d.ts +13 -0
- package/dist/trails/no-throw-in-detour-recover.trail.d.ts.map +1 -0
- package/dist/trails/no-throw-in-detour-recover.trail.js +24 -0
- package/dist/trails/no-throw-in-detour-recover.trail.js.map +1 -0
- package/dist/trails/no-throw-in-detour-target.trail.d.ts +13 -3
- package/dist/trails/no-throw-in-detour-target.trail.d.ts.map +1 -1
- package/dist/trails/no-throw-in-implementation.trail.d.ts +2 -2
- package/dist/trails/no-throw-in-implementation.trail.d.ts.map +1 -1
- package/dist/trails/on-references-exist.trail.d.ts +24 -0
- package/dist/trails/on-references-exist.trail.d.ts.map +1 -0
- package/dist/trails/on-references-exist.trail.js +21 -0
- package/dist/trails/on-references-exist.trail.js.map +1 -0
- package/dist/trails/orphaned-signal.trail.d.ts +24 -0
- package/dist/trails/orphaned-signal.trail.d.ts.map +1 -0
- package/dist/trails/orphaned-signal.trail.js +36 -0
- package/dist/trails/orphaned-signal.trail.js.map +1 -0
- package/dist/trails/permit-governance.trail.d.ts +12 -0
- package/dist/trails/permit-governance.trail.d.ts.map +1 -0
- package/dist/trails/permit-governance.trail.js +47 -0
- package/dist/trails/permit-governance.trail.js.map +1 -0
- package/dist/trails/prefer-schema-inference.trail.d.ts +2 -2
- package/dist/trails/prefer-schema-inference.trail.d.ts.map +1 -1
- package/dist/trails/reference-exists.trail.d.ts +24 -0
- package/dist/trails/reference-exists.trail.d.ts.map +1 -0
- package/dist/trails/reference-exists.trail.js +25 -0
- package/dist/trails/reference-exists.trail.js.map +1 -0
- package/dist/trails/resource-declarations.trail.d.ts +13 -0
- package/dist/trails/resource-declarations.trail.d.ts.map +1 -0
- package/dist/trails/{provision-declarations.trail.js → resource-declarations.trail.js} +7 -7
- package/dist/trails/resource-declarations.trail.js.map +1 -0
- package/dist/trails/resource-exists.trail.d.ts +24 -0
- package/dist/trails/resource-exists.trail.d.ts.map +1 -0
- package/dist/trails/{provision-exists.trail.js → resource-exists.trail.js} +8 -8
- package/dist/trails/resource-exists.trail.js.map +1 -0
- package/dist/trails/resource-id-grammar.trail.d.ts +13 -0
- package/dist/trails/resource-id-grammar.trail.d.ts.map +1 -0
- package/dist/trails/resource-id-grammar.trail.js +38 -0
- package/dist/trails/resource-id-grammar.trail.js.map +1 -0
- package/dist/trails/run.d.ts +25 -9
- package/dist/trails/run.d.ts.map +1 -1
- package/dist/trails/run.js +63 -19
- package/dist/trails/run.js.map +1 -1
- package/dist/trails/schema.d.ts +28 -3
- package/dist/trails/schema.d.ts.map +1 -1
- package/dist/trails/schema.js +57 -4
- package/dist/trails/schema.js.map +1 -1
- package/dist/trails/unreachable-detour-shadowing.trail.d.ts +13 -0
- package/dist/trails/unreachable-detour-shadowing.trail.d.ts.map +1 -0
- package/dist/trails/unreachable-detour-shadowing.trail.js +44 -0
- package/dist/trails/unreachable-detour-shadowing.trail.js.map +1 -0
- package/dist/trails/valid-describe-refs.trail.d.ts +12 -3
- package/dist/trails/valid-describe-refs.trail.d.ts.map +1 -1
- package/dist/trails/valid-detour-contract.trail.d.ts +12 -0
- package/dist/trails/valid-detour-contract.trail.d.ts.map +1 -0
- package/dist/trails/valid-detour-contract.trail.js +66 -0
- package/dist/trails/valid-detour-contract.trail.js.map +1 -0
- package/dist/trails/valid-detour-refs.trail.d.ts +13 -3
- package/dist/trails/valid-detour-refs.trail.d.ts.map +1 -1
- package/dist/trails/warden-export-symmetry.trail.d.ts +13 -0
- package/dist/trails/warden-export-symmetry.trail.d.ts.map +1 -0
- package/dist/trails/warden-export-symmetry.trail.js +16 -0
- package/dist/trails/warden-export-symmetry.trail.js.map +1 -0
- package/dist/trails/warden-rules-use-ast.trail.d.ts +13 -0
- package/dist/trails/warden-rules-use-ast.trail.d.ts.map +1 -0
- package/dist/trails/warden-rules-use-ast.trail.js +41 -0
- package/dist/trails/warden-rules-use-ast.trail.js.map +1 -0
- package/dist/trails/wrap-rule.d.ts +16 -2
- package/dist/trails/wrap-rule.d.ts.map +1 -1
- package/dist/trails/wrap-rule.js +71 -11
- package/dist/trails/wrap-rule.js.map +1 -1
- package/package.json +7 -4
- package/src/__tests__/ast.test.ts +613 -0
- package/src/__tests__/circular-refs.test.ts +121 -0
- package/src/__tests__/cli.test.ts +360 -32
- package/src/__tests__/contour-exists.test.ts +203 -0
- package/src/__tests__/cross-declarations.test.ts +245 -0
- package/src/__tests__/dead-internal-trail.test.ts +81 -0
- package/src/__tests__/draft-rules-context.test.ts +150 -0
- package/src/__tests__/drift.test.ts +75 -5
- package/src/__tests__/error-mapping-completeness.test.ts +56 -0
- package/src/__tests__/example-valid.test.ts +101 -0
- package/src/__tests__/fires-declarations-param-destructure.test.ts +54 -0
- package/src/__tests__/fires-declarations.test.ts +652 -0
- package/src/__tests__/formatters.test.ts +2 -2
- package/src/__tests__/implementation-returns-result.test.ts +1016 -2
- package/src/__tests__/incomplete-accessor-for-standard-op.test.ts +337 -0
- package/src/__tests__/incomplete-crud.test.ts +498 -0
- package/src/__tests__/intent-propagation.test.ts +116 -0
- package/src/__tests__/missing-reconcile.test.ts +154 -0
- package/src/__tests__/missing-visibility.test.ts +108 -0
- package/src/__tests__/no-sync-result-assumption.test.ts +870 -39
- package/src/__tests__/no-throw-in-detour-recover.test.ts +93 -0
- package/src/__tests__/no-throw-in-implementation.test.ts +88 -0
- package/src/__tests__/on-references-exist.test.ts +151 -0
- package/src/__tests__/orphaned-signal.test.ts +137 -0
- package/src/__tests__/permit-governance.test.ts +66 -0
- package/src/__tests__/reference-exists.test.ts +281 -0
- package/src/__tests__/resource-declarations.test.ts +448 -0
- package/src/__tests__/resource-exists.test.ts +122 -0
- package/src/__tests__/resource-id-grammar.test.ts +50 -0
- package/src/__tests__/rules.test.ts +17 -77
- package/src/__tests__/topo-aware-rule.test.ts +257 -0
- package/src/__tests__/trails.test.ts +2 -2
- package/src/__tests__/unreachable-detour-shadowing.test.ts +128 -0
- package/src/__tests__/valid-describe-refs.test.ts +183 -0
- package/src/__tests__/valid-detour-contract.test.ts +86 -0
- package/src/__tests__/warden-export-symmetry.test.ts +251 -0
- package/src/__tests__/warden-rules-use-ast.test.ts +468 -0
- package/src/__tests__/wrap-rule.test.ts +3 -3
- package/src/cli.ts +458 -91
- package/src/draft.ts +22 -0
- package/src/drift.ts +63 -21
- package/src/formatters.ts +15 -4
- package/src/index.ts +62 -23
- package/src/rules/ast.ts +2715 -119
- package/src/rules/circular-refs.ts +154 -0
- package/src/rules/{context-no-trailhead-types.ts → context-no-surface-types.ts} +72 -12
- package/src/rules/contour-exists.ts +251 -0
- package/src/rules/contour-ids.ts +15 -0
- package/src/rules/cross-declarations.ts +277 -69
- package/src/rules/dead-internal-trail.ts +141 -0
- package/src/rules/draft-file-marking.ts +160 -0
- package/src/rules/draft-visible-debt.ts +87 -0
- package/src/rules/error-mapping-completeness.ts +273 -0
- package/src/rules/example-valid.ts +401 -0
- package/src/rules/fires-declarations.ts +609 -0
- package/src/rules/implementation-returns-result.ts +1042 -122
- package/src/rules/incomplete-accessor-for-standard-op.ts +315 -0
- package/src/rules/incomplete-crud.ts +579 -0
- package/src/rules/index.ts +95 -16
- package/src/rules/intent-propagation.ts +142 -0
- package/src/rules/missing-reconcile.ts +98 -0
- package/src/rules/missing-visibility.ts +110 -0
- package/src/rules/no-direct-impl-in-route.ts +0 -4
- package/src/rules/no-direct-implementation-call.ts +1 -1
- package/src/rules/no-sync-result-assumption.ts +1134 -96
- package/src/rules/no-throw-in-detour-recover.ts +225 -0
- package/src/rules/no-throw-in-implementation.ts +6 -4
- package/src/rules/on-references-exist.ts +194 -0
- package/src/rules/orphaned-signal.ts +150 -0
- package/src/rules/permit-governance.ts +25 -0
- package/src/rules/reference-exists.ts +98 -0
- package/src/rules/registry-names.ts +83 -0
- package/src/rules/{provision-declarations.ts → resource-declarations.ts} +208 -138
- package/src/rules/{provision-exists.ts → resource-exists.ts} +48 -51
- package/src/rules/resource-id-grammar.ts +65 -0
- package/src/rules/specs.ts +5 -1
- package/src/rules/types.ts +57 -4
- package/src/rules/unreachable-detour-shadowing.ts +375 -0
- package/src/rules/valid-describe-refs.ts +160 -32
- package/src/rules/valid-detour-contract.ts +78 -0
- package/src/rules/warden-export-symmetry.ts +533 -0
- package/src/rules/warden-rules-use-ast.ts +996 -0
- package/src/trails/circular-refs.trail.ts +29 -0
- package/src/trails/{context-no-trailhead-types.trail.ts → context-no-surface-types.trail.ts} +4 -4
- package/src/trails/contour-exists.trail.ts +21 -0
- package/src/trails/dead-internal-trail.trail.ts +26 -0
- package/src/trails/draft-file-marking.trail.ts +16 -0
- package/src/trails/draft-visible-debt.trail.ts +16 -0
- package/src/trails/error-mapping-completeness.trail.ts +29 -0
- package/src/trails/example-valid.trail.ts +25 -0
- package/src/trails/fires-declarations.trail.ts +22 -0
- package/src/trails/incomplete-accessor-for-standard-op.trail.ts +76 -0
- package/src/trails/incomplete-crud.trail.ts +39 -0
- package/src/trails/index.ts +40 -7
- package/src/trails/intent-propagation.trail.ts +30 -0
- package/src/trails/missing-reconcile.trail.ts +33 -0
- package/src/trails/missing-visibility.trail.ts +22 -0
- package/src/trails/no-throw-in-detour-recover.trail.ts +24 -0
- package/src/trails/on-references-exist.trail.ts +21 -0
- package/src/trails/orphaned-signal.trail.ts +36 -0
- package/src/trails/permit-governance.trail.ts +51 -0
- package/src/trails/reference-exists.trail.ts +25 -0
- package/src/trails/{provision-declarations.trail.ts → resource-declarations.trail.ts} +6 -6
- package/src/trails/{provision-exists.trail.ts → resource-exists.trail.ts} +7 -7
- package/src/trails/resource-id-grammar.trail.ts +39 -0
- package/src/trails/run.ts +121 -24
- package/src/trails/schema.ts +66 -4
- package/src/trails/unreachable-detour-shadowing.trail.ts +45 -0
- package/src/trails/valid-detour-contract.trail.ts +71 -0
- package/src/trails/warden-export-symmetry.trail.ts +16 -0
- package/src/trails/warden-rules-use-ast.trail.ts +45 -0
- package/src/trails/wrap-rule.ts +104 -12
- package/tsconfig.tests.json +10 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/rules/follow-declarations.d.ts +0 -13
- package/dist/rules/follow-declarations.d.ts.map +0 -1
- package/dist/rules/follow-declarations.js +0 -264
- package/dist/rules/follow-declarations.js.map +0 -1
- package/dist/rules/provision-declarations.d.ts +0 -14
- package/dist/rules/provision-declarations.d.ts.map +0 -1
- package/dist/rules/provision-declarations.js +0 -344
- package/dist/rules/provision-declarations.js.map +0 -1
- package/dist/rules/provision-exists.d.ts +0 -6
- package/dist/rules/provision-exists.d.ts.map +0 -1
- package/dist/rules/provision-exists.js +0 -89
- package/dist/rules/provision-exists.js.map +0 -1
- package/dist/rules/service-declarations.d.ts +0 -16
- package/dist/rules/service-declarations.d.ts.map +0 -1
- package/dist/rules/service-declarations.js +0 -346
- package/dist/rules/service-declarations.js.map +0 -1
- package/dist/rules/service-exists.d.ts +0 -8
- package/dist/rules/service-exists.d.ts.map +0 -1
- package/dist/rules/service-exists.js +0 -91
- package/dist/rules/service-exists.js.map +0 -1
- package/dist/trails/follow-declarations.trail.d.ts.map +0 -1
- package/dist/trails/follow-declarations.trail.js +0 -22
- package/dist/trails/follow-declarations.trail.js.map +0 -1
- package/dist/trails/provision-declarations.trail.d.ts.map +0 -1
- package/dist/trails/provision-declarations.trail.js.map +0 -1
- package/dist/trails/provision-exists.trail.d.ts +0 -15
- package/dist/trails/provision-exists.trail.d.ts.map +0 -1
- package/dist/trails/provision-exists.trail.js.map +0 -1
- package/dist/trails/service-declarations.trail.d.ts +0 -26
- package/dist/trails/service-declarations.trail.d.ts.map +0 -1
- package/dist/trails/service-declarations.trail.js +0 -27
- package/dist/trails/service-declarations.trail.js.map +0 -1
- package/dist/trails/service-exists.trail.d.ts +0 -32
- package/dist/trails/service-exists.trail.d.ts.map +0 -1
- package/dist/trails/service-exists.trail.js +0 -29
- package/dist/trails/service-exists.trail.js.map +0 -1
- package/src/__tests__/no-throw-in-detour-target.test.ts +0 -78
- package/src/__tests__/provision-declarations.test.ts +0 -318
- package/src/__tests__/provision-exists.test.ts +0 -122
- package/src/rules/no-throw-in-detour-target.ts +0 -150
- package/src/rules/valid-detour-refs.ts +0 -187
- package/src/trails/no-throw-in-detour-target.trail.ts +0 -20
- package/src/trails/valid-detour-refs.trail.ts +0 -24
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates that registered transport error mappers cover every error category.
|
|
3
|
+
*
|
|
4
|
+
* Scans `createTransportErrorMapper(...)` calls and resolves simple object
|
|
5
|
+
* literals, identifier bindings, and object-property references in the same
|
|
6
|
+
* file so incomplete mapper registrations are caught before they ship.
|
|
7
|
+
*/
|
|
8
|
+
import type { WardenRule } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Flags `createTransportErrorMapper()` registrations that omit error categories.
|
|
11
|
+
*/
|
|
12
|
+
export declare const errorMappingCompleteness: WardenRule;
|
|
13
|
+
//# sourceMappingURL=error-mapping-completeness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-mapping-completeness.d.ts","sourceRoot":"","sources":["../../src/rules/error-mapping-completeness.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AAsN/D;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,UAmCtC,CAAC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates that registered transport error mappers cover every error category.
|
|
3
|
+
*
|
|
4
|
+
* Scans `createTransportErrorMapper(...)` calls and resolves simple object
|
|
5
|
+
* literals, identifier bindings, and object-property references in the same
|
|
6
|
+
* file so incomplete mapper registrations are caught before they ship.
|
|
7
|
+
*/
|
|
8
|
+
import { errorCategories } from '@ontrails/core';
|
|
9
|
+
import { getStringValue, identifierName, isStringLiteral, offsetToLine, parse, walk, } from './ast.js';
|
|
10
|
+
import { isTestFile } from './scan.js';
|
|
11
|
+
const MEMBER_EXPRESSION_TYPES = new Set([
|
|
12
|
+
'MemberExpression',
|
|
13
|
+
'StaticMemberExpression',
|
|
14
|
+
]);
|
|
15
|
+
const getPropertyName = (node) => {
|
|
16
|
+
if (!node) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return (identifierName(node) ??
|
|
20
|
+
(isStringLiteral(node) ? getStringValue(node) : null));
|
|
21
|
+
};
|
|
22
|
+
const collectObjectBindings = (ast) => {
|
|
23
|
+
const bindings = new Map();
|
|
24
|
+
walk(ast, (node) => {
|
|
25
|
+
if (node.type !== 'VariableDeclarator') {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const { id, init } = node;
|
|
29
|
+
const bindingName = identifierName(id);
|
|
30
|
+
if (bindingName && init?.type === 'ObjectExpression') {
|
|
31
|
+
bindings.set(bindingName, init);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return bindings;
|
|
35
|
+
};
|
|
36
|
+
const getObjectProperties = (objectNode) => objectNode.type === 'ObjectExpression'
|
|
37
|
+
? (objectNode['properties'] ?? [])
|
|
38
|
+
: [];
|
|
39
|
+
const findObjectPropertyValue = (objectNode, propertyName) => {
|
|
40
|
+
for (const property of getObjectProperties(objectNode)) {
|
|
41
|
+
if (property.type !== 'Property') {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const key = getPropertyName(property.key);
|
|
45
|
+
if (key === propertyName) {
|
|
46
|
+
return property.value ?? null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
};
|
|
51
|
+
const resolveIdentifierObject = (node, bindings) => bindings.get(node.name ?? '') ?? null;
|
|
52
|
+
const resolveMemberObject = (node, bindings, depth, resolve) => {
|
|
53
|
+
const { object, property } = node;
|
|
54
|
+
const propertyName = getPropertyName(property);
|
|
55
|
+
if (!propertyName) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const objectNode = resolve(object, bindings, depth + 1);
|
|
59
|
+
return objectNode
|
|
60
|
+
? resolve(findObjectPropertyValue(objectNode, propertyName) ?? undefined, bindings, depth + 1)
|
|
61
|
+
: null;
|
|
62
|
+
};
|
|
63
|
+
const resolveObjectExpression = function resolveObjectExpression(node, bindings, depth = 0) {
|
|
64
|
+
if (!node || depth > 4) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
if (node.type === 'ObjectExpression') {
|
|
68
|
+
return node;
|
|
69
|
+
}
|
|
70
|
+
if (node.type === 'Identifier') {
|
|
71
|
+
return resolveIdentifierObject(node, bindings);
|
|
72
|
+
}
|
|
73
|
+
return MEMBER_EXPRESSION_TYPES.has(node.type)
|
|
74
|
+
? resolveMemberObject(node, bindings, depth, resolveObjectExpression)
|
|
75
|
+
: null;
|
|
76
|
+
};
|
|
77
|
+
const addMappedCategory = (categories, property) => {
|
|
78
|
+
if (property.type === 'SpreadElement') {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
if (property.type !== 'Property') {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
const key = getPropertyName(property.key);
|
|
85
|
+
if (key) {
|
|
86
|
+
categories.add(key);
|
|
87
|
+
}
|
|
88
|
+
return true;
|
|
89
|
+
};
|
|
90
|
+
const collectMappedCategories = (mapperObject) => {
|
|
91
|
+
if (mapperObject.type !== 'ObjectExpression') {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
const categories = new Set();
|
|
95
|
+
for (const property of getObjectProperties(mapperObject)) {
|
|
96
|
+
if (!addMappedCategory(categories, property)) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return categories;
|
|
101
|
+
};
|
|
102
|
+
const createDiagnostic = (filePath, line, missingCategories) => ({
|
|
103
|
+
filePath,
|
|
104
|
+
line,
|
|
105
|
+
message: `Transport error mapper is missing mappings for: ${missingCategories.join(', ')}. Registered createTransportErrorMapper() calls must cover every ErrorCategory.`,
|
|
106
|
+
rule: 'error-mapping-completeness',
|
|
107
|
+
severity: 'error',
|
|
108
|
+
});
|
|
109
|
+
const getCallArgs = (node) => node.arguments ?? [];
|
|
110
|
+
const getCallCallee = (node) => node.callee;
|
|
111
|
+
const isMapperFactoryCall = (node) => node.type === 'CallExpression' &&
|
|
112
|
+
identifierName(getCallCallee(node)) === 'createTransportErrorMapper';
|
|
113
|
+
const findMissingCategories = (mappedCategories) => errorCategories.filter((category) => !mappedCategories.has(category));
|
|
114
|
+
const resolveMappedCategories = (node, bindings) => {
|
|
115
|
+
const [firstArg] = getCallArgs(node);
|
|
116
|
+
const mapperObject = resolveObjectExpression(firstArg, bindings);
|
|
117
|
+
return mapperObject ? collectMappedCategories(mapperObject) : null;
|
|
118
|
+
};
|
|
119
|
+
const inspectMapperCall = (node, bindings, filePath, sourceCode) => {
|
|
120
|
+
if (!isMapperFactoryCall(node)) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const mappedCategories = resolveMappedCategories(node, bindings);
|
|
124
|
+
if (!mappedCategories) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
const missingCategories = findMissingCategories(mappedCategories);
|
|
128
|
+
if (missingCategories.length === 0) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
return createDiagnostic(filePath, offsetToLine(sourceCode, node.start), missingCategories);
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* Flags `createTransportErrorMapper()` registrations that omit error categories.
|
|
135
|
+
*/
|
|
136
|
+
export const errorMappingCompleteness = {
|
|
137
|
+
check(sourceCode, filePath) {
|
|
138
|
+
if (isTestFile(filePath) ||
|
|
139
|
+
!sourceCode.includes('createTransportErrorMapper')) {
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
const ast = parse(filePath, sourceCode);
|
|
143
|
+
if (!ast) {
|
|
144
|
+
return [];
|
|
145
|
+
}
|
|
146
|
+
const bindings = collectObjectBindings(ast);
|
|
147
|
+
const diagnostics = [];
|
|
148
|
+
walk(ast, (node) => {
|
|
149
|
+
const diagnostic = inspectMapperCall(node, bindings, filePath, sourceCode);
|
|
150
|
+
if (diagnostic) {
|
|
151
|
+
diagnostics.push(diagnostic);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
return diagnostics;
|
|
155
|
+
},
|
|
156
|
+
description: 'Require registered transport error mappers to cover every ErrorCategory.',
|
|
157
|
+
name: 'error-mapping-completeness',
|
|
158
|
+
severity: 'error',
|
|
159
|
+
};
|
|
160
|
+
//# sourceMappingURL=error-mapping-completeness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-mapping-completeness.js","sourceRoot":"","sources":["../../src/rules/error-mapping-completeness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example-valid.d.ts","sourceRoot":"","sources":["../../src/rules/example-valid.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AAuX/D;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,UAQ1B,CAAC"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { contour } from '@ontrails/core';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { extractStringLiteral, findConfigProperty, findContourDefinitions, getStringValue, identifierName, offsetToLine, parse, } from './ast.js';
|
|
4
|
+
import { isTestFile } from './scan.js';
|
|
5
|
+
class UnsupportedContourEvaluationError extends Error {
|
|
6
|
+
}
|
|
7
|
+
const buildInvalidExampleDiagnostic = (contourName, message, filePath, line) => ({
|
|
8
|
+
filePath,
|
|
9
|
+
line,
|
|
10
|
+
message: `Contour "${contourName}" has invalid examples: ${message}`,
|
|
11
|
+
rule: 'example-valid',
|
|
12
|
+
severity: 'error',
|
|
13
|
+
});
|
|
14
|
+
const getPropertyName = (node) => {
|
|
15
|
+
if (typeof node !== 'object' || node === null) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const { name } = node;
|
|
19
|
+
if (typeof name === 'string') {
|
|
20
|
+
return name;
|
|
21
|
+
}
|
|
22
|
+
return extractStringLiteral(node);
|
|
23
|
+
};
|
|
24
|
+
const requireNode = (node) => {
|
|
25
|
+
if (!node) {
|
|
26
|
+
throw new UnsupportedContourEvaluationError('Missing node in contour evaluation.');
|
|
27
|
+
}
|
|
28
|
+
return node;
|
|
29
|
+
};
|
|
30
|
+
// The evaluator table is declared before `evaluateNode` so the recursive
|
|
31
|
+
// dispatch can read it at call time without any forward references. Entries
|
|
32
|
+
// are registered below once each per-type evaluator is defined.
|
|
33
|
+
const contourNodeEvaluators = new Map();
|
|
34
|
+
const evaluateNode = (node, env) => {
|
|
35
|
+
const evaluator = contourNodeEvaluators.get(node.type);
|
|
36
|
+
if (evaluator) {
|
|
37
|
+
return evaluator(node, env);
|
|
38
|
+
}
|
|
39
|
+
throw new UnsupportedContourEvaluationError(`Unsupported AST node "${node.type}" in contour evaluation.`);
|
|
40
|
+
};
|
|
41
|
+
const evaluateArrayExpression = (node, env) => {
|
|
42
|
+
const elements = node['elements'];
|
|
43
|
+
return (elements ?? []).map((element) => evaluateNode(element, env));
|
|
44
|
+
};
|
|
45
|
+
const evaluateLiteralExpression = (node) => getStringValue(node) ?? node.value;
|
|
46
|
+
const evaluateIdentifierExpression = (node, env) => {
|
|
47
|
+
const name = identifierName(node);
|
|
48
|
+
if (name === 'undefined') {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
if (name === 'z') {
|
|
52
|
+
return z;
|
|
53
|
+
}
|
|
54
|
+
if (!name || !env.has(name)) {
|
|
55
|
+
throw new UnsupportedContourEvaluationError(`Unknown identifier "${name ?? '<unknown>'}" in contour evaluation.`);
|
|
56
|
+
}
|
|
57
|
+
return env.get(name);
|
|
58
|
+
};
|
|
59
|
+
const evaluateWrappedExpression = (node, env) => evaluateNode(requireNode(node.expression), env);
|
|
60
|
+
const evaluateNullExpression = () => null;
|
|
61
|
+
const evaluateObjectExpression = (node, env) => {
|
|
62
|
+
const properties = node['properties'];
|
|
63
|
+
const value = {};
|
|
64
|
+
for (const property of properties ?? []) {
|
|
65
|
+
if (property.type !== 'Property') {
|
|
66
|
+
throw new UnsupportedContourEvaluationError(`Unsupported object property type "${property.type}".`);
|
|
67
|
+
}
|
|
68
|
+
const propertyName = getPropertyName(property.key);
|
|
69
|
+
if (!propertyName) {
|
|
70
|
+
throw new UnsupportedContourEvaluationError('Unsupported object property key in contour evaluation.');
|
|
71
|
+
}
|
|
72
|
+
value[propertyName] = evaluateNode(requireNode(property.value), env);
|
|
73
|
+
}
|
|
74
|
+
return value;
|
|
75
|
+
};
|
|
76
|
+
const evaluateCallArguments = (node, env) => (node['arguments'] ?? []).map((arg) => evaluateNode(arg, env));
|
|
77
|
+
const resolveContourFallbackOptions = (shape) => typeof shape === 'object' &&
|
|
78
|
+
shape !== null &&
|
|
79
|
+
Object.hasOwn(shape, 'id') &&
|
|
80
|
+
shape['id'] !== undefined
|
|
81
|
+
? { identity: 'id' }
|
|
82
|
+
: null;
|
|
83
|
+
const resolveContourOptions = (shape, options) => {
|
|
84
|
+
if (options === undefined) {
|
|
85
|
+
const fallbackOptions = resolveContourFallbackOptions(shape);
|
|
86
|
+
if (fallbackOptions !== null) {
|
|
87
|
+
return fallbackOptions;
|
|
88
|
+
}
|
|
89
|
+
throw new UnsupportedContourEvaluationError('Contour evaluator requires literal options, or an `id` field when options are omitted.');
|
|
90
|
+
}
|
|
91
|
+
if (typeof options !== 'object' || options === null) {
|
|
92
|
+
throw new UnsupportedContourEvaluationError('Contour evaluator requires literal options when provided.');
|
|
93
|
+
}
|
|
94
|
+
return options;
|
|
95
|
+
};
|
|
96
|
+
const evaluateContourCall = (args) => {
|
|
97
|
+
const [name, shape, options] = args;
|
|
98
|
+
if (typeof name !== 'string') {
|
|
99
|
+
throw new UnsupportedContourEvaluationError('Contour evaluator requires a literal name.');
|
|
100
|
+
}
|
|
101
|
+
return contour(name, shape, resolveContourOptions(shape, options));
|
|
102
|
+
};
|
|
103
|
+
const evaluateMemberCall = (callee, args, env) => {
|
|
104
|
+
const receiver = evaluateNode(requireNode(callee.object), env);
|
|
105
|
+
const propertyName = getPropertyName(callee.property);
|
|
106
|
+
if (!propertyName) {
|
|
107
|
+
throw new UnsupportedContourEvaluationError('Unsupported member property in contour evaluation.');
|
|
108
|
+
}
|
|
109
|
+
const method = receiver[propertyName];
|
|
110
|
+
if (typeof method !== 'function') {
|
|
111
|
+
throw new UnsupportedContourEvaluationError(`Contour evaluator could not call "${propertyName}".`);
|
|
112
|
+
}
|
|
113
|
+
return Reflect.apply(method, receiver, args);
|
|
114
|
+
};
|
|
115
|
+
const evaluateCallExpression = (node, env) => {
|
|
116
|
+
const args = evaluateCallArguments(node, env);
|
|
117
|
+
const callee = requireNode(node['callee']);
|
|
118
|
+
if (callee.type === 'Identifier') {
|
|
119
|
+
const calleeName = identifierName(callee);
|
|
120
|
+
if (calleeName !== 'contour') {
|
|
121
|
+
throw new UnsupportedContourEvaluationError(`Unsupported contour evaluator call "${calleeName ?? '<unknown>'}".`);
|
|
122
|
+
}
|
|
123
|
+
return evaluateContourCall(args);
|
|
124
|
+
}
|
|
125
|
+
if (callee.type !== 'MemberExpression' &&
|
|
126
|
+
callee.type !== 'StaticMemberExpression') {
|
|
127
|
+
throw new UnsupportedContourEvaluationError(`Unsupported callee type "${callee.type}".`);
|
|
128
|
+
}
|
|
129
|
+
return evaluateMemberCall(callee, args, env);
|
|
130
|
+
};
|
|
131
|
+
const EVALUATOR_REGISTRATIONS = [
|
|
132
|
+
['ArrayExpression', evaluateArrayExpression],
|
|
133
|
+
['BooleanLiteral', evaluateLiteralExpression],
|
|
134
|
+
['Literal', evaluateLiteralExpression],
|
|
135
|
+
['NumericLiteral', evaluateLiteralExpression],
|
|
136
|
+
['StringLiteral', evaluateLiteralExpression],
|
|
137
|
+
['CallExpression', evaluateCallExpression],
|
|
138
|
+
['Identifier', evaluateIdentifierExpression],
|
|
139
|
+
['NullLiteral', evaluateNullExpression],
|
|
140
|
+
['ObjectExpression', evaluateObjectExpression],
|
|
141
|
+
['ParenthesizedExpression', evaluateWrappedExpression],
|
|
142
|
+
['TSAsExpression', evaluateWrappedExpression],
|
|
143
|
+
['TSSatisfiesExpression', evaluateWrappedExpression],
|
|
144
|
+
];
|
|
145
|
+
for (const [type, evaluator] of EVALUATOR_REGISTRATIONS) {
|
|
146
|
+
contourNodeEvaluators.set(type, evaluator);
|
|
147
|
+
}
|
|
148
|
+
const hasExamples = (definition) => definition.options !== null &&
|
|
149
|
+
findConfigProperty(definition.options, 'examples') !== null;
|
|
150
|
+
const evaluateContourDefinition = (definition, env) => evaluateNode(definition.call, env);
|
|
151
|
+
const buildContourExampleErrorDiagnostic = (definition, error, sourceCode, filePath) => {
|
|
152
|
+
if (error instanceof UnsupportedContourEvaluationError ||
|
|
153
|
+
!hasExamples(definition) ||
|
|
154
|
+
!(error instanceof Error)) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
return buildInvalidExampleDiagnostic(definition.name, error.message, filePath, offsetToLine(sourceCode, definition.start));
|
|
158
|
+
};
|
|
159
|
+
const evaluateContourExamples = (definition, env, sourceCode, filePath) => {
|
|
160
|
+
try {
|
|
161
|
+
const value = evaluateContourDefinition(definition, env);
|
|
162
|
+
if (definition.bindingName) {
|
|
163
|
+
env.set(definition.bindingName, value);
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
return buildContourExampleErrorDiagnostic(definition, error, sourceCode, filePath);
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
const collectContourExampleDiagnostics = (definitions, sourceCode, filePath) => {
|
|
172
|
+
const diagnostics = [];
|
|
173
|
+
const env = new Map();
|
|
174
|
+
for (const definition of definitions) {
|
|
175
|
+
const diagnostic = evaluateContourExamples(definition, env, sourceCode, filePath);
|
|
176
|
+
if (diagnostic) {
|
|
177
|
+
diagnostics.push(diagnostic);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return diagnostics;
|
|
181
|
+
};
|
|
182
|
+
const checkContourExamples = (sourceCode, filePath) => {
|
|
183
|
+
if (isTestFile(filePath)) {
|
|
184
|
+
return [];
|
|
185
|
+
}
|
|
186
|
+
const ast = parse(filePath, sourceCode);
|
|
187
|
+
if (!ast) {
|
|
188
|
+
return [];
|
|
189
|
+
}
|
|
190
|
+
return collectContourExampleDiagnostics(findContourDefinitions(ast), sourceCode, filePath);
|
|
191
|
+
};
|
|
192
|
+
/**
|
|
193
|
+
* Checks that contour examples validate against their schema.
|
|
194
|
+
*/
|
|
195
|
+
export const exampleValid = {
|
|
196
|
+
check(sourceCode, filePath) {
|
|
197
|
+
return checkContourExamples(sourceCode, filePath);
|
|
198
|
+
},
|
|
199
|
+
description: 'Ensure every contour example validates against the declared contour schema.',
|
|
200
|
+
name: 'example-valid',
|
|
201
|
+
severity: 'error',
|
|
202
|
+
};
|
|
203
|
+
//# sourceMappingURL=example-valid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example-valid.js","sourceRoot":"","sources":["../../src/rules/example-valid.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validates that `ctx.fire()` calls match the declared `fires` array.
|
|
3
|
+
*
|
|
4
|
+
* Statically analyzes trail `blaze` functions to find `ctx.fire('signalId', ...)`
|
|
5
|
+
* calls and compares them against the `fires: [...]` declaration in the trail
|
|
6
|
+
* config. Reports errors for undeclared fires and warnings for unused ones.
|
|
7
|
+
*
|
|
8
|
+
* Mirrors `cross-declarations` structurally — same extraction, same reporting
|
|
9
|
+
* shape, same const-identifier resolution, same context-parameter handling.
|
|
10
|
+
*/
|
|
11
|
+
import type { WardenRule } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Validates that `ctx.fire()` calls align with declared `fires` arrays.
|
|
14
|
+
*/
|
|
15
|
+
export declare const firesDeclarations: WardenRule;
|
|
16
|
+
//# sourceMappingURL=fires-declarations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fires-declarations.d.ts","sourceRoot":"","sources":["../../src/rules/fires-declarations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgBH,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AA6iB/D;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAuB/B,CAAC"}
|