@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
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { isDraftId } from '@ontrails/core';
|
|
2
|
+
|
|
1
3
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
+
collectNamedResourceIds,
|
|
5
|
+
collectResourceDefinitionIds,
|
|
4
6
|
extractFirstStringArg,
|
|
5
7
|
findConfigProperty,
|
|
6
8
|
findTrailDefinitions,
|
|
@@ -18,18 +20,18 @@ import type {
|
|
|
18
20
|
WardenDiagnostic,
|
|
19
21
|
} from './types.js';
|
|
20
22
|
|
|
21
|
-
const
|
|
23
|
+
const isResourceCall = (node: AstNode): boolean =>
|
|
22
24
|
node.type === 'CallExpression' &&
|
|
23
25
|
identifierName((node as unknown as { callee?: AstNode }).callee) ===
|
|
24
|
-
'
|
|
26
|
+
'resource';
|
|
25
27
|
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
if (!
|
|
28
|
+
const getResourceElements = (config: AstNode): readonly AstNode[] => {
|
|
29
|
+
const resourcesProp = findConfigProperty(config, 'resources');
|
|
30
|
+
if (!resourcesProp) {
|
|
29
31
|
return [];
|
|
30
32
|
}
|
|
31
33
|
|
|
32
|
-
const arrayNode =
|
|
34
|
+
const arrayNode = resourcesProp.value;
|
|
33
35
|
if (!arrayNode || (arrayNode as AstNode).type !== 'ArrayExpression') {
|
|
34
36
|
return [];
|
|
35
37
|
}
|
|
@@ -40,93 +42,93 @@ const getProvisionElements = (config: AstNode): readonly AstNode[] => {
|
|
|
40
42
|
return elements ?? [];
|
|
41
43
|
};
|
|
42
44
|
|
|
43
|
-
const
|
|
45
|
+
const extractDeclaredResourceId = (
|
|
44
46
|
element: AstNode,
|
|
45
|
-
|
|
47
|
+
resourceIdsByName: ReadonlyMap<string, string>
|
|
46
48
|
): string | null => {
|
|
47
49
|
if (element.type === 'Identifier') {
|
|
48
50
|
const name = identifierName(element);
|
|
49
|
-
return name ? (
|
|
51
|
+
return name ? (resourceIdsByName.get(name) ?? null) : null;
|
|
50
52
|
}
|
|
51
53
|
|
|
52
54
|
if (isStringLiteral(element)) {
|
|
53
55
|
return getStringValue(element);
|
|
54
56
|
}
|
|
55
57
|
|
|
56
|
-
return
|
|
58
|
+
return isResourceCall(element) ? extractFirstStringArg(element) : null;
|
|
57
59
|
};
|
|
58
60
|
|
|
59
|
-
const
|
|
61
|
+
const extractDeclaredResourceIds = (
|
|
60
62
|
config: AstNode,
|
|
61
|
-
|
|
63
|
+
resourceIdsByName: ReadonlyMap<string, string>
|
|
62
64
|
): readonly string[] => [
|
|
63
65
|
...new Set(
|
|
64
|
-
|
|
65
|
-
const id =
|
|
66
|
+
getResourceElements(config).flatMap((element) => {
|
|
67
|
+
const id = extractDeclaredResourceId(element, resourceIdsByName);
|
|
66
68
|
return id ? [id] : [];
|
|
67
69
|
})
|
|
68
70
|
),
|
|
69
71
|
];
|
|
70
72
|
|
|
71
|
-
const
|
|
73
|
+
const buildMissingResourceDiagnostic = (
|
|
72
74
|
trailId: string,
|
|
73
|
-
|
|
75
|
+
resourceId: string,
|
|
74
76
|
filePath: string,
|
|
75
77
|
line: number
|
|
76
78
|
): WardenDiagnostic => ({
|
|
77
79
|
filePath,
|
|
78
80
|
line,
|
|
79
|
-
message: `Trail "${trailId}" declares
|
|
80
|
-
rule: '
|
|
81
|
+
message: `Trail "${trailId}" declares resource "${resourceId}" which is not defined in the project.`,
|
|
82
|
+
rule: 'resource-exists',
|
|
81
83
|
severity: 'error',
|
|
82
84
|
});
|
|
83
85
|
|
|
84
|
-
const
|
|
86
|
+
const reportMissingResources = (
|
|
85
87
|
def: { id: string; config: AstNode; start: number },
|
|
86
88
|
sourceCode: string,
|
|
87
|
-
|
|
89
|
+
resourceIdsByName: ReadonlyMap<string, string>,
|
|
88
90
|
filePath: string,
|
|
89
|
-
|
|
91
|
+
knownResourceIds: ReadonlySet<string>,
|
|
90
92
|
diagnostics: WardenDiagnostic[]
|
|
91
93
|
): void => {
|
|
92
94
|
const line = offsetToLine(sourceCode, def.start);
|
|
93
|
-
for (const
|
|
95
|
+
for (const resourceId of extractDeclaredResourceIds(
|
|
94
96
|
def.config,
|
|
95
|
-
|
|
97
|
+
resourceIdsByName
|
|
96
98
|
)) {
|
|
97
|
-
if (!
|
|
99
|
+
if (!knownResourceIds.has(resourceId) && !isDraftId(resourceId)) {
|
|
98
100
|
diagnostics.push(
|
|
99
|
-
|
|
101
|
+
buildMissingResourceDiagnostic(def.id, resourceId, filePath, line)
|
|
100
102
|
);
|
|
101
103
|
}
|
|
102
104
|
}
|
|
103
105
|
};
|
|
104
106
|
|
|
105
|
-
const
|
|
107
|
+
const buildResourceDiagnostics = (
|
|
106
108
|
ast: AstNode,
|
|
107
109
|
sourceCode: string,
|
|
108
110
|
filePath: string,
|
|
109
|
-
|
|
111
|
+
knownResourceIds: ReadonlySet<string>
|
|
110
112
|
): readonly WardenDiagnostic[] => {
|
|
111
113
|
const diagnostics: WardenDiagnostic[] = [];
|
|
112
|
-
const
|
|
114
|
+
const resourceIdsByName = collectNamedResourceIds(ast);
|
|
113
115
|
for (const def of findTrailDefinitions(ast)) {
|
|
114
|
-
|
|
116
|
+
reportMissingResources(
|
|
115
117
|
def,
|
|
116
118
|
sourceCode,
|
|
117
|
-
|
|
119
|
+
resourceIdsByName,
|
|
118
120
|
filePath,
|
|
119
|
-
|
|
121
|
+
knownResourceIds,
|
|
120
122
|
diagnostics
|
|
121
123
|
);
|
|
122
124
|
}
|
|
123
125
|
return diagnostics;
|
|
124
126
|
};
|
|
125
127
|
|
|
126
|
-
const
|
|
128
|
+
const checkResourcesExist = (
|
|
127
129
|
sourceCode: string,
|
|
128
130
|
filePath: string,
|
|
129
|
-
|
|
131
|
+
knownResourceIds: ReadonlySet<string>
|
|
130
132
|
): readonly WardenDiagnostic[] => {
|
|
131
133
|
if (isTestFile(filePath)) {
|
|
132
134
|
return [];
|
|
@@ -137,27 +139,22 @@ const checkProvisionsExist = (
|
|
|
137
139
|
return [];
|
|
138
140
|
}
|
|
139
141
|
|
|
140
|
-
return
|
|
141
|
-
ast,
|
|
142
|
-
sourceCode,
|
|
143
|
-
filePath,
|
|
144
|
-
knownProvisionIds
|
|
145
|
-
);
|
|
142
|
+
return buildResourceDiagnostics(ast, sourceCode, filePath, knownResourceIds);
|
|
146
143
|
};
|
|
147
144
|
|
|
148
145
|
/**
|
|
149
|
-
* Checks that all declared
|
|
146
|
+
* Checks that all declared resources resolve to known resource definitions.
|
|
150
147
|
*/
|
|
151
|
-
export const
|
|
148
|
+
export const resourceExists: ProjectAwareWardenRule = {
|
|
152
149
|
check(sourceCode: string, filePath: string): readonly WardenDiagnostic[] {
|
|
153
150
|
const ast = parse(filePath, sourceCode);
|
|
154
151
|
if (!ast) {
|
|
155
152
|
return [];
|
|
156
153
|
}
|
|
157
|
-
return
|
|
154
|
+
return checkResourcesExist(
|
|
158
155
|
sourceCode,
|
|
159
156
|
filePath,
|
|
160
|
-
|
|
157
|
+
collectResourceDefinitionIds(ast)
|
|
161
158
|
);
|
|
162
159
|
},
|
|
163
160
|
checkWithContext(
|
|
@@ -166,17 +163,17 @@ export const provisionExists: ProjectAwareWardenRule = {
|
|
|
166
163
|
context: ProjectContext
|
|
167
164
|
): readonly WardenDiagnostic[] {
|
|
168
165
|
const ast = parse(filePath, sourceCode);
|
|
169
|
-
const
|
|
170
|
-
?
|
|
166
|
+
const localResourceIds = ast
|
|
167
|
+
? collectResourceDefinitionIds(ast)
|
|
171
168
|
: new Set<string>();
|
|
172
|
-
return
|
|
169
|
+
return checkResourcesExist(
|
|
173
170
|
sourceCode,
|
|
174
171
|
filePath,
|
|
175
|
-
context.
|
|
172
|
+
context.knownResourceIds ?? localResourceIds
|
|
176
173
|
);
|
|
177
174
|
},
|
|
178
175
|
description:
|
|
179
|
-
'Ensure every
|
|
180
|
-
name: '
|
|
176
|
+
'Ensure every resource declared on a trail resolves to a known resource definition.',
|
|
177
|
+
name: 'resource-exists',
|
|
181
178
|
severity: 'error',
|
|
182
179
|
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import {
|
|
2
|
+
extractFirstStringArg,
|
|
3
|
+
identifierName,
|
|
4
|
+
offsetToLine,
|
|
5
|
+
parse,
|
|
6
|
+
walk,
|
|
7
|
+
} from './ast.js';
|
|
8
|
+
import type { AstNode } from './ast.js';
|
|
9
|
+
import { isTestFile } from './scan.js';
|
|
10
|
+
import type { WardenDiagnostic, WardenRule } from './types.js';
|
|
11
|
+
|
|
12
|
+
const isResourceCall = (node: AstNode): boolean =>
|
|
13
|
+
node.type === 'CallExpression' &&
|
|
14
|
+
identifierName((node as unknown as { callee?: AstNode }).callee) ===
|
|
15
|
+
'resource';
|
|
16
|
+
|
|
17
|
+
const buildDiagnostic = (
|
|
18
|
+
resourceId: string,
|
|
19
|
+
filePath: string,
|
|
20
|
+
line: number
|
|
21
|
+
): WardenDiagnostic => ({
|
|
22
|
+
filePath,
|
|
23
|
+
line,
|
|
24
|
+
message: `Resource "${resourceId}" is invalid because resource ids may not contain ":".`,
|
|
25
|
+
rule: 'resource-id-grammar',
|
|
26
|
+
severity: 'error',
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export const resourceIdGrammar: WardenRule = {
|
|
30
|
+
check(sourceCode: string, filePath: string): readonly WardenDiagnostic[] {
|
|
31
|
+
if (isTestFile(filePath)) {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const ast = parse(filePath, sourceCode);
|
|
36
|
+
if (!ast) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const diagnostics: WardenDiagnostic[] = [];
|
|
41
|
+
walk(ast, (node) => {
|
|
42
|
+
if (!isResourceCall(node)) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const resourceId = extractFirstStringArg(node);
|
|
47
|
+
if (!resourceId || !resourceId.includes(':')) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
diagnostics.push(
|
|
52
|
+
buildDiagnostic(
|
|
53
|
+
resourceId,
|
|
54
|
+
filePath,
|
|
55
|
+
offsetToLine(sourceCode, node.start)
|
|
56
|
+
)
|
|
57
|
+
);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
return diagnostics;
|
|
61
|
+
},
|
|
62
|
+
description: 'Ensure resource ids do not contain the ":" scope separator.',
|
|
63
|
+
name: 'resource-id-grammar',
|
|
64
|
+
severity: 'error',
|
|
65
|
+
};
|
package/src/rules/specs.ts
CHANGED
|
@@ -31,7 +31,11 @@ export interface SchemaFieldInfo {
|
|
|
31
31
|
readonly required: boolean;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
// Match `trail(...)` / `signal(...)` declaration sites, not method calls.
|
|
35
|
+
// The negative lookbehind excludes `foo.signal(...)`, `foo?.signal(...)`, and
|
|
36
|
+
// similar member-expression call sites (including optional chaining with
|
|
37
|
+
// whitespace) where `signal` / `trail` is a property name, not a factory.
|
|
38
|
+
const TRAIL_LIKE_PATTERN = /(?<![.?])\b(trail|signal)\s*\(/g;
|
|
35
39
|
|
|
36
40
|
const PROPERTY_PATTERN =
|
|
37
41
|
/^(?:readonly\s+)?(?:(["'`])([^"'`]+)\1|([A-Za-z_$][\w$]*))\s*:\s*([\s\S]+)$/;
|
package/src/rules/types.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { Topo } from '@ontrails/core';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Severity level for warden diagnostics.
|
|
3
5
|
*/
|
|
@@ -43,12 +45,39 @@ export interface WardenRule {
|
|
|
43
45
|
* Options for cross-file rules that need knowledge of all trail IDs in a project.
|
|
44
46
|
*/
|
|
45
47
|
export interface ProjectContext {
|
|
48
|
+
/** All known contour names in the project. */
|
|
49
|
+
readonly knownContourIds?: ReadonlySet<string>;
|
|
50
|
+
/** Store table IDs used with the CRUD factory across the project. */
|
|
51
|
+
readonly crudTableIds?: ReadonlySet<string>;
|
|
46
52
|
/** All known trail IDs in the project */
|
|
47
53
|
readonly knownTrailIds: ReadonlySet<string>;
|
|
48
|
-
/**
|
|
49
|
-
readonly
|
|
50
|
-
/** All
|
|
51
|
-
readonly
|
|
54
|
+
/** Declared contour references keyed by source contour name. */
|
|
55
|
+
readonly contourReferencesByName?: ReadonlyMap<string, readonly string[]>;
|
|
56
|
+
/** All known resource IDs in the project */
|
|
57
|
+
readonly knownResourceIds?: ReadonlySet<string>;
|
|
58
|
+
/** All known signal IDs in the project */
|
|
59
|
+
readonly knownSignalIds?: ReadonlySet<string>;
|
|
60
|
+
/** All trail IDs referenced by declared crosses arrays across the project. */
|
|
61
|
+
readonly crossTargetTrailIds?: ReadonlySet<string>;
|
|
62
|
+
/** Signal IDs referenced by trail `on` arrays across the project. */
|
|
63
|
+
readonly onTargetSignalIds?: ReadonlySet<string>;
|
|
64
|
+
/** Store table IDs used with reconcile trails across the project. */
|
|
65
|
+
readonly reconcileTableIds?: ReadonlySet<string>;
|
|
66
|
+
/** Normalized trail intents by trail ID across the project. */
|
|
67
|
+
readonly trailIntentsById?: ReadonlyMap<string, 'destroy' | 'read' | 'write'>;
|
|
68
|
+
/**
|
|
69
|
+
* CRUD operation coverage per entity aggregated across the project.
|
|
70
|
+
*
|
|
71
|
+
* Keys are stable entity IDs (authored contour names, `imported:<local>`
|
|
72
|
+
* sentinels for contours imported from another module, or store-table IDs
|
|
73
|
+
* produced by `deriveStoreTableId`). Values are the set of CRUD operations
|
|
74
|
+
* (`create`, `read`, `update`, `delete`, `list`) observed for that entity.
|
|
75
|
+
*
|
|
76
|
+
* Enables cross-file completeness evaluation so one-file-per-operation
|
|
77
|
+
* layouts (e.g. separate `create.ts`, `read.ts`) do not trip file-scoped
|
|
78
|
+
* coverage warnings.
|
|
79
|
+
*/
|
|
80
|
+
readonly crudCoverageByEntity?: ReadonlyMap<string, ReadonlySet<string>>;
|
|
52
81
|
}
|
|
53
82
|
|
|
54
83
|
/**
|
|
@@ -62,3 +91,27 @@ export interface ProjectAwareWardenRule extends WardenRule {
|
|
|
62
91
|
context: ProjectContext
|
|
63
92
|
) => readonly WardenDiagnostic[];
|
|
64
93
|
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* A topo-aware warden rule inspects the compiled runtime trail graph —
|
|
97
|
+
* actual `Trail` objects with resolved types, accessor shapes, detour
|
|
98
|
+
* declarations, `pattern` field values, and other runtime-only data that
|
|
99
|
+
* is unavailable to AST-based rules.
|
|
100
|
+
*
|
|
101
|
+
* Unlike `WardenRule` and `ProjectAwareWardenRule`, which analyze source
|
|
102
|
+
* code on a per-file basis, a `TopoAwareWardenRule` runs once per topo
|
|
103
|
+
* and returns diagnostics spanning the whole graph. A rule file must
|
|
104
|
+
* implement exactly one of the three rule kinds.
|
|
105
|
+
*/
|
|
106
|
+
export interface TopoAwareWardenRule {
|
|
107
|
+
/** Unique rule identifier */
|
|
108
|
+
readonly name: string;
|
|
109
|
+
/** Default severity */
|
|
110
|
+
readonly severity: WardenSeverity;
|
|
111
|
+
/** Human-readable description of what the rule enforces */
|
|
112
|
+
readonly description: string;
|
|
113
|
+
/** Run the rule against the resolved topo and return any diagnostics */
|
|
114
|
+
readonly checkTopo: (
|
|
115
|
+
topo: Topo
|
|
116
|
+
) => readonly WardenDiagnostic[] | Promise<readonly WardenDiagnostic[]>;
|
|
117
|
+
}
|