@ontrails/warden 1.0.0-beta.14 → 1.0.0-beta.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +149 -0
- package/README.md +77 -34
- package/bin/warden.ts +22 -0
- package/package.json +26 -6
- package/src/ast.ts +28 -0
- package/src/cli.ts +1169 -116
- package/src/command.ts +927 -0
- package/src/config.ts +184 -0
- package/src/drift.ts +76 -34
- package/src/formatters.ts +54 -7
- package/src/guide.ts +234 -0
- package/src/index.ts +151 -38
- package/src/project-context.ts +163 -0
- package/src/resolve.ts +530 -0
- package/src/rules/activation-orphan.ts +97 -0
- package/src/rules/ast.ts +2884 -124
- 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 +51 -3
- package/src/rules/draft-visible-debt.ts +40 -15
- package/src/rules/error-mapping-completeness.ts +288 -0
- package/src/rules/example-valid.ts +401 -0
- package/src/rules/fires-declarations.ts +758 -0
- package/src/rules/implementation-returns-result.ts +1042 -122
- package/src/rules/incomplete-accessor-for-standard-op.ts +272 -0
- package/src/rules/incomplete-crud.ts +580 -0
- package/src/rules/index.ts +156 -19
- package/src/rules/intent-propagation.ts +127 -0
- package/src/rules/layer-field-name-drift.ts +96 -0
- package/src/rules/metadata.ts +508 -0
- package/src/rules/missing-reconcile.ts +98 -0
- package/src/rules/missing-visibility.ts +110 -0
- package/src/rules/no-dev-permit-in-source.ts +99 -0
- package/src/rules/no-direct-implementation-call.ts +1 -1
- package/src/rules/no-legacy-layer-imports.ts +193 -0
- package/src/rules/no-native-error-result.ts +111 -0
- package/src/rules/no-sync-result-assumption.ts +1131 -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/owner-projection-parity.ts +146 -0
- package/src/rules/permit-governance.ts +25 -0
- package/src/rules/public-internal-deep-imports.ts +517 -0
- package/src/rules/public-output-schema.ts +29 -0
- package/src/rules/public-union-output-discriminants.ts +150 -0
- package/src/rules/read-intent-fires.ts +187 -0
- package/src/rules/reference-exists.ts +98 -0
- package/src/rules/registry-names.ts +113 -0
- package/src/rules/resolved-import-boundary.ts +146 -0
- package/src/rules/{provision-declarations.ts → resource-declarations.ts} +208 -138
- package/src/rules/{provision-exists.ts → resource-exists.ts} +46 -51
- package/src/rules/resource-id-grammar.ts +65 -0
- package/src/rules/scan.ts +0 -26
- package/src/rules/scheduled-destroy-intent.ts +44 -0
- package/src/rules/signal-graph-coaching.ts +191 -0
- package/src/rules/specs.ts +5 -1
- package/src/rules/static-resource-accessor-preference.ts +657 -0
- package/src/rules/types.ts +187 -7
- package/src/rules/unmaterialized-activation-source.ts +84 -0
- package/src/rules/unreachable-detour-shadowing.ts +344 -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/rules/webhook-route-collision.ts +243 -0
- package/src/trails/activation-orphan.trail.ts +81 -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 +23 -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 +56 -8
- package/src/trails/intent-propagation.trail.ts +30 -0
- package/src/trails/layer-field-name-drift.trail.ts +39 -0
- package/src/trails/missing-reconcile.trail.ts +33 -0
- package/src/trails/missing-visibility.trail.ts +22 -0
- package/src/trails/no-dev-permit-in-source.trail.ts +16 -0
- package/src/trails/no-legacy-layer-imports.trail.ts +35 -0
- package/src/trails/no-native-error-result.trail.ts +18 -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/owner-projection-parity.trail.ts +26 -0
- package/src/trails/permit-governance.trail.ts +51 -0
- package/src/trails/public-internal-deep-imports.trail.ts +94 -0
- package/src/trails/public-output-schema.trail.ts +55 -0
- package/src/trails/public-union-output-discriminants.trail.ts +33 -0
- package/src/trails/read-intent-fires.trail.ts +20 -0
- package/src/trails/reference-exists.trail.ts +25 -0
- package/src/trails/resolved-import-boundary.trail.ts +109 -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 +133 -24
- package/src/trails/scheduled-destroy-intent.trail.ts +56 -0
- package/src/trails/schema.ts +122 -4
- package/src/trails/signal-graph-coaching.trail.ts +74 -0
- package/src/trails/static-resource-accessor-preference.trail.ts +25 -0
- package/src/trails/unmaterialized-activation-source.trail.ts +69 -0
- 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/webhook-route-collision.trail.ts +50 -0
- package/src/trails/wrap-rule.ts +133 -14
- package/src/workspaces.ts +238 -0
- package/.turbo/turbo-build.log +0 -1
- package/.turbo/turbo-lint.log +0 -3
- package/.turbo/turbo-typecheck.log +0 -1
- package/dist/cli.d.ts +0 -46
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -247
- package/dist/cli.js.map +0 -1
- package/dist/draft.d.ts +0 -5
- package/dist/draft.d.ts.map +0 -1
- package/dist/draft.js +0 -16
- package/dist/draft.js.map +0 -1
- package/dist/drift.d.ts +0 -29
- package/dist/drift.d.ts.map +0 -1
- package/dist/drift.js +0 -61
- package/dist/drift.js.map +0 -1
- package/dist/formatters.d.ts +0 -30
- package/dist/formatters.d.ts.map +0 -1
- package/dist/formatters.js +0 -98
- package/dist/formatters.js.map +0 -1
- package/dist/index.d.ts +0 -37
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -38
- package/dist/index.js.map +0 -1
- package/dist/rules/ast.d.ts +0 -82
- package/dist/rules/ast.d.ts.map +0 -1
- package/dist/rules/ast.js +0 -363
- package/dist/rules/ast.js.map +0 -1
- package/dist/rules/context-no-surface-types.d.ts +0 -12
- package/dist/rules/context-no-surface-types.d.ts.map +0 -1
- package/dist/rules/context-no-surface-types.js +0 -96
- package/dist/rules/context-no-surface-types.js.map +0 -1
- package/dist/rules/context-no-trailhead-types.d.ts +0 -12
- package/dist/rules/context-no-trailhead-types.d.ts.map +0 -1
- package/dist/rules/context-no-trailhead-types.js +0 -96
- package/dist/rules/context-no-trailhead-types.js.map +0 -1
- package/dist/rules/cross-declarations.d.ts +0 -13
- package/dist/rules/cross-declarations.d.ts.map +0 -1
- package/dist/rules/cross-declarations.js +0 -264
- package/dist/rules/cross-declarations.js.map +0 -1
- package/dist/rules/draft-file-marking.d.ts +0 -6
- package/dist/rules/draft-file-marking.d.ts.map +0 -1
- package/dist/rules/draft-file-marking.js +0 -65
- package/dist/rules/draft-file-marking.js.map +0 -1
- package/dist/rules/draft-visible-debt.d.ts +0 -12
- package/dist/rules/draft-visible-debt.d.ts.map +0 -1
- package/dist/rules/draft-visible-debt.js +0 -45
- package/dist/rules/draft-visible-debt.js.map +0 -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/implementation-returns-result.d.ts +0 -13
- package/dist/rules/implementation-returns-result.d.ts.map +0 -1
- package/dist/rules/implementation-returns-result.js +0 -277
- package/dist/rules/implementation-returns-result.js.map +0 -1
- package/dist/rules/index.d.ts +0 -20
- package/dist/rules/index.d.ts.map +0 -1
- package/dist/rules/index.js +0 -49
- package/dist/rules/index.js.map +0 -1
- package/dist/rules/no-direct-impl-in-route.d.ts +0 -12
- package/dist/rules/no-direct-impl-in-route.d.ts.map +0 -1
- package/dist/rules/no-direct-impl-in-route.js +0 -47
- package/dist/rules/no-direct-impl-in-route.js.map +0 -1
- package/dist/rules/no-direct-implementation-call.d.ts +0 -12
- package/dist/rules/no-direct-implementation-call.d.ts.map +0 -1
- package/dist/rules/no-direct-implementation-call.js +0 -39
- package/dist/rules/no-direct-implementation-call.js.map +0 -1
- package/dist/rules/no-sync-result-assumption.d.ts +0 -6
- package/dist/rules/no-sync-result-assumption.d.ts.map +0 -1
- package/dist/rules/no-sync-result-assumption.js +0 -98
- package/dist/rules/no-sync-result-assumption.js.map +0 -1
- package/dist/rules/no-throw-in-detour-target.d.ts +0 -12
- package/dist/rules/no-throw-in-detour-target.d.ts.map +0 -1
- package/dist/rules/no-throw-in-detour-target.js +0 -87
- package/dist/rules/no-throw-in-detour-target.js.map +0 -1
- package/dist/rules/no-throw-in-implementation.d.ts +0 -9
- package/dist/rules/no-throw-in-implementation.d.ts.map +0 -1
- package/dist/rules/no-throw-in-implementation.js +0 -34
- package/dist/rules/no-throw-in-implementation.js.map +0 -1
- package/dist/rules/prefer-schema-inference.d.ts +0 -7
- package/dist/rules/prefer-schema-inference.d.ts.map +0 -1
- package/dist/rules/prefer-schema-inference.js +0 -86
- package/dist/rules/prefer-schema-inference.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 -90
- package/dist/rules/provision-exists.js.map +0 -1
- package/dist/rules/scan.d.ts +0 -8
- package/dist/rules/scan.d.ts.map +0 -1
- package/dist/rules/scan.js +0 -32
- package/dist/rules/scan.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/rules/specs.d.ts +0 -29
- package/dist/rules/specs.d.ts.map +0 -1
- package/dist/rules/specs.js +0 -192
- package/dist/rules/specs.js.map +0 -1
- package/dist/rules/structure.d.ts +0 -13
- package/dist/rules/structure.d.ts.map +0 -1
- package/dist/rules/structure.js +0 -142
- package/dist/rules/structure.js.map +0 -1
- package/dist/rules/types.d.ts +0 -54
- package/dist/rules/types.d.ts.map +0 -1
- package/dist/rules/types.js +0 -2
- package/dist/rules/types.js.map +0 -1
- package/dist/rules/valid-describe-refs.d.ts +0 -7
- package/dist/rules/valid-describe-refs.d.ts.map +0 -1
- package/dist/rules/valid-describe-refs.js +0 -51
- package/dist/rules/valid-describe-refs.js.map +0 -1
- package/dist/rules/valid-detour-refs.d.ts +0 -6
- package/dist/rules/valid-detour-refs.d.ts.map +0 -1
- package/dist/rules/valid-detour-refs.js +0 -117
- package/dist/rules/valid-detour-refs.js.map +0 -1
- package/dist/trails/context-no-surface-types.trail.d.ts +0 -13
- package/dist/trails/context-no-surface-types.trail.d.ts.map +0 -1
- package/dist/trails/context-no-surface-types.trail.js +0 -21
- package/dist/trails/context-no-surface-types.trail.js.map +0 -1
- package/dist/trails/context-no-trailhead-types.trail.d.ts +0 -13
- package/dist/trails/context-no-trailhead-types.trail.d.ts.map +0 -1
- package/dist/trails/context-no-trailhead-types.trail.js +0 -21
- package/dist/trails/context-no-trailhead-types.trail.js.map +0 -1
- package/dist/trails/cross-declarations.trail.d.ts +0 -13
- package/dist/trails/cross-declarations.trail.d.ts.map +0 -1
- package/dist/trails/cross-declarations.trail.js +0 -22
- package/dist/trails/cross-declarations.trail.js.map +0 -1
- package/dist/trails/follow-declarations.trail.d.ts +0 -13
- 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/implementation-returns-result.trail.d.ts +0 -13
- package/dist/trails/implementation-returns-result.trail.d.ts.map +0 -1
- package/dist/trails/implementation-returns-result.trail.js +0 -20
- package/dist/trails/implementation-returns-result.trail.js.map +0 -1
- package/dist/trails/index.d.ts +0 -16
- package/dist/trails/index.d.ts.map +0 -1
- package/dist/trails/index.js +0 -15
- package/dist/trails/index.js.map +0 -1
- package/dist/trails/no-direct-impl-in-route.trail.d.ts +0 -13
- package/dist/trails/no-direct-impl-in-route.trail.d.ts.map +0 -1
- package/dist/trails/no-direct-impl-in-route.trail.js +0 -22
- package/dist/trails/no-direct-impl-in-route.trail.js.map +0 -1
- package/dist/trails/no-direct-implementation-call.trail.d.ts +0 -13
- package/dist/trails/no-direct-implementation-call.trail.d.ts.map +0 -1
- package/dist/trails/no-direct-implementation-call.trail.js +0 -16
- package/dist/trails/no-direct-implementation-call.trail.js.map +0 -1
- package/dist/trails/no-sync-result-assumption.trail.d.ts +0 -13
- package/dist/trails/no-sync-result-assumption.trail.d.ts.map +0 -1
- package/dist/trails/no-sync-result-assumption.trail.js +0 -19
- package/dist/trails/no-sync-result-assumption.trail.js.map +0 -1
- package/dist/trails/no-throw-in-detour-target.trail.d.ts +0 -15
- package/dist/trails/no-throw-in-detour-target.trail.d.ts.map +0 -1
- package/dist/trails/no-throw-in-detour-target.trail.js +0 -20
- package/dist/trails/no-throw-in-detour-target.trail.js.map +0 -1
- package/dist/trails/no-throw-in-implementation.trail.d.ts +0 -13
- package/dist/trails/no-throw-in-implementation.trail.d.ts.map +0 -1
- package/dist/trails/no-throw-in-implementation.trail.js +0 -20
- package/dist/trails/no-throw-in-implementation.trail.js.map +0 -1
- package/dist/trails/prefer-schema-inference.trail.d.ts +0 -13
- package/dist/trails/prefer-schema-inference.trail.d.ts.map +0 -1
- package/dist/trails/prefer-schema-inference.trail.js +0 -21
- package/dist/trails/prefer-schema-inference.trail.js.map +0 -1
- package/dist/trails/provision-declarations.trail.d.ts +0 -13
- package/dist/trails/provision-declarations.trail.d.ts.map +0 -1
- package/dist/trails/provision-declarations.trail.js +0 -25
- 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 +0 -27
- package/dist/trails/provision-exists.trail.js.map +0 -1
- package/dist/trails/run.d.ts +0 -17
- package/dist/trails/run.d.ts.map +0 -1
- package/dist/trails/run.js +0 -39
- package/dist/trails/run.js.map +0 -1
- package/dist/trails/schema.d.ts +0 -53
- package/dist/trails/schema.d.ts.map +0 -1
- package/dist/trails/schema.js +0 -42
- package/dist/trails/schema.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/dist/trails/topo.d.ts +0 -3
- package/dist/trails/topo.d.ts.map +0 -1
- package/dist/trails/topo.js +0 -5
- package/dist/trails/topo.js.map +0 -1
- package/dist/trails/valid-describe-refs.trail.d.ts +0 -15
- package/dist/trails/valid-describe-refs.trail.d.ts.map +0 -1
- package/dist/trails/valid-describe-refs.trail.js +0 -18
- package/dist/trails/valid-describe-refs.trail.js.map +0 -1
- package/dist/trails/valid-detour-refs.trail.d.ts +0 -15
- package/dist/trails/valid-detour-refs.trail.d.ts.map +0 -1
- package/dist/trails/valid-detour-refs.trail.js +0 -24
- package/dist/trails/valid-detour-refs.trail.js.map +0 -1
- package/dist/trails/wrap-rule.d.ts +0 -29
- package/dist/trails/wrap-rule.d.ts.map +0 -1
- package/dist/trails/wrap-rule.js +0 -47
- package/dist/trails/wrap-rule.js.map +0 -1
- package/src/__tests__/cli.test.ts +0 -311
- package/src/__tests__/cross-declarations.test.ts +0 -303
- package/src/__tests__/drift.test.ts +0 -144
- package/src/__tests__/formatters.test.ts +0 -157
- package/src/__tests__/implementation-returns-result.test.ts +0 -129
- package/src/__tests__/no-direct-implementation-call.test.ts +0 -83
- package/src/__tests__/no-sync-result-assumption.test.ts +0 -85
- package/src/__tests__/no-throw-in-detour-target.test.ts +0 -78
- package/src/__tests__/prefer-schema-inference.test.ts +0 -84
- package/src/__tests__/provision-declarations.test.ts +0 -318
- package/src/__tests__/provision-exists.test.ts +0 -122
- package/src/__tests__/rules.test.ts +0 -227
- package/src/__tests__/trails.test.ts +0 -19
- package/src/__tests__/valid-describe-refs.test.ts +0 -60
- package/src/__tests__/wrap-rule.test.ts +0 -41
- package/src/rules/no-direct-impl-in-route.ts +0 -81
- package/src/rules/no-throw-in-detour-target.ts +0 -150
- package/src/rules/valid-detour-refs.ts +0 -189
- package/src/trails/no-direct-impl-in-route.trail.ts +0 -22
- package/src/trails/no-throw-in-detour-target.trail.ts +0 -20
- package/src/trails/valid-detour-refs.trail.ts +0 -24
- package/tsconfig.json +0 -9
- package/tsconfig.tsbuildinfo +0 -1
package/dist/rules/ast.js
DELETED
|
@@ -1,363 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared AST utilities for warden rules.
|
|
3
|
-
*
|
|
4
|
-
* Uses oxc-parser for native-speed TypeScript parsing. Provides a lightweight
|
|
5
|
-
* walker and helpers for finding trail implementation bodies.
|
|
6
|
-
*/
|
|
7
|
-
import { parseSync } from 'oxc-parser';
|
|
8
|
-
// ---------------------------------------------------------------------------
|
|
9
|
-
// Parser
|
|
10
|
-
// ---------------------------------------------------------------------------
|
|
11
|
-
/** Parse TypeScript source into an AST. Returns null on parse failure. */
|
|
12
|
-
export const parse = (filePath, sourceCode) => {
|
|
13
|
-
try {
|
|
14
|
-
const result = parseSync(filePath, sourceCode, { sourceType: 'module' });
|
|
15
|
-
return result.program;
|
|
16
|
-
}
|
|
17
|
-
catch {
|
|
18
|
-
return null;
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
const walkChildren = (node, visit, recurse) => {
|
|
22
|
-
for (const val of Object.values(node)) {
|
|
23
|
-
if (Array.isArray(val)) {
|
|
24
|
-
for (const item of val) {
|
|
25
|
-
recurse(item, visit);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
else if (val && typeof val === 'object' && val.type) {
|
|
29
|
-
recurse(val, visit);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
/** Walk an AST node tree, calling `visit` on every node. */
|
|
34
|
-
export const walk = (node, visit) => {
|
|
35
|
-
if (!node || typeof node !== 'object') {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
const n = node;
|
|
39
|
-
if (n.type) {
|
|
40
|
-
visit(n);
|
|
41
|
-
}
|
|
42
|
-
walkChildren(n, visit, walk);
|
|
43
|
-
};
|
|
44
|
-
const NESTED_SCOPE_TYPES = new Set([
|
|
45
|
-
'ArrowFunctionExpression',
|
|
46
|
-
'FunctionExpression',
|
|
47
|
-
'FunctionDeclaration',
|
|
48
|
-
]);
|
|
49
|
-
const walkScopeInner = (node, visit) => {
|
|
50
|
-
if (!node || typeof node !== 'object') {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
const n = node;
|
|
54
|
-
if (n.type) {
|
|
55
|
-
visit(n);
|
|
56
|
-
if (NESTED_SCOPE_TYPES.has(n.type)) {
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
walkChildren(n, visit, walkScopeInner);
|
|
61
|
-
};
|
|
62
|
-
/**
|
|
63
|
-
* Walk an AST node tree without descending into nested function scopes.
|
|
64
|
-
* The root node is always traversed; only inner function boundaries are skipped.
|
|
65
|
-
* Useful for provision-access analysis where inner functions may shadow
|
|
66
|
-
* the trail context parameter name.
|
|
67
|
-
*/
|
|
68
|
-
export const walkScope = (node, visit) => {
|
|
69
|
-
if (!node || typeof node !== 'object') {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
const n = node;
|
|
73
|
-
if (n.type) {
|
|
74
|
-
visit(n);
|
|
75
|
-
}
|
|
76
|
-
walkChildren(n, visit, walkScopeInner);
|
|
77
|
-
};
|
|
78
|
-
// ---------------------------------------------------------------------------
|
|
79
|
-
// Helpers
|
|
80
|
-
// ---------------------------------------------------------------------------
|
|
81
|
-
/** Find the byte offset's line number (1-based) in source code. */
|
|
82
|
-
export const offsetToLine = (sourceCode, offset) => {
|
|
83
|
-
let line = 1;
|
|
84
|
-
for (let i = 0; i < offset && i < sourceCode.length; i += 1) {
|
|
85
|
-
if (sourceCode[i] === '\n') {
|
|
86
|
-
line += 1;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return line;
|
|
90
|
-
};
|
|
91
|
-
/** Get the name of an Identifier node, or null. */
|
|
92
|
-
export const identifierName = (node) => {
|
|
93
|
-
if (node?.type !== 'Identifier') {
|
|
94
|
-
return null;
|
|
95
|
-
}
|
|
96
|
-
return node.name ?? null;
|
|
97
|
-
};
|
|
98
|
-
/** Check if a node is a string literal. */
|
|
99
|
-
export const isStringLiteral = (node) => {
|
|
100
|
-
if (!node) {
|
|
101
|
-
return false;
|
|
102
|
-
}
|
|
103
|
-
if (node.type === 'StringLiteral') {
|
|
104
|
-
return true;
|
|
105
|
-
}
|
|
106
|
-
if (node.type === 'Literal') {
|
|
107
|
-
return typeof node.value === 'string';
|
|
108
|
-
}
|
|
109
|
-
return false;
|
|
110
|
-
};
|
|
111
|
-
/** Extract the string value from a string literal node. */
|
|
112
|
-
export const getStringValue = (node) => {
|
|
113
|
-
const val = node.value;
|
|
114
|
-
return typeof val === 'string' ? val : null;
|
|
115
|
-
};
|
|
116
|
-
/** Extract a string literal value, or null when the node is not a string. */
|
|
117
|
-
export const extractStringLiteral = (node) => node && isStringLiteral(node) ? getStringValue(node) : null;
|
|
118
|
-
export const findStringLiterals = (ast, predicate) => {
|
|
119
|
-
const matches = [];
|
|
120
|
-
walk(ast, (node) => {
|
|
121
|
-
if (!isStringLiteral(node)) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
const value = getStringValue(node);
|
|
125
|
-
if (value === null) {
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
if (predicate && !predicate(value, node)) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
matches.push({
|
|
132
|
-
end: node.end,
|
|
133
|
-
node,
|
|
134
|
-
start: node.start,
|
|
135
|
-
value,
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
return matches;
|
|
139
|
-
};
|
|
140
|
-
/** Extract the first string argument from a CallExpression. */
|
|
141
|
-
export const extractFirstStringArg = (node) => {
|
|
142
|
-
if (node.type !== 'CallExpression') {
|
|
143
|
-
return null;
|
|
144
|
-
}
|
|
145
|
-
const args = node['arguments'];
|
|
146
|
-
const [firstArg] = args ?? [];
|
|
147
|
-
return extractStringLiteral(firstArg);
|
|
148
|
-
};
|
|
149
|
-
const isProvisionCall = (node) => !!node &&
|
|
150
|
-
node.type === 'CallExpression' &&
|
|
151
|
-
identifierName(node.callee) ===
|
|
152
|
-
'provision';
|
|
153
|
-
const extractBindingName = (node) => {
|
|
154
|
-
if (!node) {
|
|
155
|
-
return null;
|
|
156
|
-
}
|
|
157
|
-
if (node.type === 'Identifier') {
|
|
158
|
-
return identifierName(node);
|
|
159
|
-
}
|
|
160
|
-
if (node.type === 'AssignmentPattern') {
|
|
161
|
-
return identifierName(node.left);
|
|
162
|
-
}
|
|
163
|
-
return null;
|
|
164
|
-
};
|
|
165
|
-
/** Collect `const foo = provision('id', ...)` bindings from a parsed file. */
|
|
166
|
-
export const collectNamedProvisionIds = (ast) => {
|
|
167
|
-
const ids = new Map();
|
|
168
|
-
walk(ast, (node) => {
|
|
169
|
-
if (node.type !== 'VariableDeclarator') {
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
const { id, init } = node;
|
|
173
|
-
if (!isProvisionCall(init)) {
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
const name = extractBindingName(id);
|
|
177
|
-
const provisionId = init ? extractFirstStringArg(init) : null;
|
|
178
|
-
if (name && provisionId) {
|
|
179
|
-
ids.set(name, provisionId);
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
return ids;
|
|
183
|
-
};
|
|
184
|
-
/** Collect all inline `provision('id', ...)` definition IDs from a parsed file. */
|
|
185
|
-
export const collectProvisionDefinitionIds = (ast) => {
|
|
186
|
-
const ids = new Set();
|
|
187
|
-
walk(ast, (node) => {
|
|
188
|
-
if (!isProvisionCall(node)) {
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
const id = extractFirstStringArg(node);
|
|
192
|
-
if (id) {
|
|
193
|
-
ids.add(id);
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
return ids;
|
|
197
|
-
};
|
|
198
|
-
/** Backward-compatible aliases while the migration is in flight. */
|
|
199
|
-
export const collectNamedServiceIds = collectNamedProvisionIds;
|
|
200
|
-
/** Backward-compatible aliases while the migration is in flight. */
|
|
201
|
-
export const collectServiceDefinitionIds = collectProvisionDefinitionIds;
|
|
202
|
-
// ---------------------------------------------------------------------------
|
|
203
|
-
// Config property extraction helpers
|
|
204
|
-
// ---------------------------------------------------------------------------
|
|
205
|
-
/** Find a Property node by key name inside an ObjectExpression config. */
|
|
206
|
-
export const findConfigProperty = (config, propertyName) => {
|
|
207
|
-
if (config.type !== 'ObjectExpression') {
|
|
208
|
-
return null;
|
|
209
|
-
}
|
|
210
|
-
const properties = config['properties'];
|
|
211
|
-
if (!properties) {
|
|
212
|
-
return null;
|
|
213
|
-
}
|
|
214
|
-
for (const prop of properties) {
|
|
215
|
-
if (prop.type === 'Property' && prop.key?.name === propertyName) {
|
|
216
|
-
return prop;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
return null;
|
|
220
|
-
};
|
|
221
|
-
/**
|
|
222
|
-
* Find all `trail("id", { ... })`, `trail({ id: "x", ... })`, and
|
|
223
|
-
* `signal("id", { ... })` call sites.
|
|
224
|
-
*
|
|
225
|
-
* Returns the trail ID, kind, and config object node for each definition.
|
|
226
|
-
*/
|
|
227
|
-
const TRAIL_CALLEE_NAMES = new Set(['trail', 'signal']);
|
|
228
|
-
const getTrailCalleeName = (node) => {
|
|
229
|
-
if (node.type !== 'CallExpression') {
|
|
230
|
-
return null;
|
|
231
|
-
}
|
|
232
|
-
const callee = node['callee'];
|
|
233
|
-
if (!callee || callee.type !== 'Identifier') {
|
|
234
|
-
return null;
|
|
235
|
-
}
|
|
236
|
-
const { name } = callee;
|
|
237
|
-
return name && TRAIL_CALLEE_NAMES.has(name) ? name : null;
|
|
238
|
-
};
|
|
239
|
-
/** Extract args from a trail() call, handling both two-arg and single-object forms. */
|
|
240
|
-
const extractTrailArgs = (node) => {
|
|
241
|
-
const args = node['arguments'];
|
|
242
|
-
if (!args || args.length === 0) {
|
|
243
|
-
return null;
|
|
244
|
-
}
|
|
245
|
-
const [firstArg, secondArg] = args;
|
|
246
|
-
if (!firstArg) {
|
|
247
|
-
return null;
|
|
248
|
-
}
|
|
249
|
-
// Two-arg form: trail('id', { ... })
|
|
250
|
-
if (secondArg && firstArg.type !== 'ObjectExpression') {
|
|
251
|
-
return { configArg: secondArg, idArg: firstArg };
|
|
252
|
-
}
|
|
253
|
-
// Single-object form: trail({ id: 'x', ... })
|
|
254
|
-
return firstArg.type === 'ObjectExpression'
|
|
255
|
-
? { configArg: firstArg, idArg: null }
|
|
256
|
-
: null;
|
|
257
|
-
};
|
|
258
|
-
/** Extract the string value from an `id` property inside a config ObjectExpression. */
|
|
259
|
-
const extractIdFromConfig = (config) => {
|
|
260
|
-
const idProp = findConfigProperty(config, 'id');
|
|
261
|
-
if (!idProp || !idProp.value) {
|
|
262
|
-
return null;
|
|
263
|
-
}
|
|
264
|
-
const val = idProp.value.value;
|
|
265
|
-
return typeof val === 'string' ? val : null;
|
|
266
|
-
};
|
|
267
|
-
const extractTrailId = (trailArgs) => {
|
|
268
|
-
if (trailArgs.idArg) {
|
|
269
|
-
return trailArgs.idArg.value ?? null;
|
|
270
|
-
}
|
|
271
|
-
return extractIdFromConfig(trailArgs.configArg);
|
|
272
|
-
};
|
|
273
|
-
const extractTrailDefinition = (node) => {
|
|
274
|
-
const calleeName = getTrailCalleeName(node);
|
|
275
|
-
if (!calleeName) {
|
|
276
|
-
return null;
|
|
277
|
-
}
|
|
278
|
-
const trailArgs = extractTrailArgs(node);
|
|
279
|
-
if (!trailArgs) {
|
|
280
|
-
return null;
|
|
281
|
-
}
|
|
282
|
-
const trailId = extractTrailId(trailArgs);
|
|
283
|
-
if (!trailId) {
|
|
284
|
-
return null;
|
|
285
|
-
}
|
|
286
|
-
return {
|
|
287
|
-
config: trailArgs.configArg,
|
|
288
|
-
id: trailId,
|
|
289
|
-
kind: calleeName,
|
|
290
|
-
start: node.start,
|
|
291
|
-
};
|
|
292
|
-
};
|
|
293
|
-
export const findTrailDefinitions = (ast) => {
|
|
294
|
-
const definitions = [];
|
|
295
|
-
walk(ast, (node) => {
|
|
296
|
-
const def = extractTrailDefinition(node);
|
|
297
|
-
if (def) {
|
|
298
|
-
definitions.push(def);
|
|
299
|
-
}
|
|
300
|
-
});
|
|
301
|
-
return definitions;
|
|
302
|
-
};
|
|
303
|
-
// ---------------------------------------------------------------------------
|
|
304
|
-
// Blaze body extraction
|
|
305
|
-
// ---------------------------------------------------------------------------
|
|
306
|
-
/**
|
|
307
|
-
* Extract top-level `blaze:` property values from an ObjectExpression's direct properties.
|
|
308
|
-
*
|
|
309
|
-
* Does not recurse into nested objects, so `meta: { blaze: ... }` is ignored.
|
|
310
|
-
*/
|
|
311
|
-
const extractBlazeFromConfig = (config) => {
|
|
312
|
-
const bodies = [];
|
|
313
|
-
const properties = config['properties'];
|
|
314
|
-
if (!properties) {
|
|
315
|
-
return bodies;
|
|
316
|
-
}
|
|
317
|
-
for (const prop of properties) {
|
|
318
|
-
if (prop.type === 'Property' && prop.key?.name === 'blaze' && prop.value) {
|
|
319
|
-
bodies.push(prop.value);
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
return bodies;
|
|
323
|
-
};
|
|
324
|
-
/**
|
|
325
|
-
* Find `blaze:` property values.
|
|
326
|
-
*
|
|
327
|
-
* When given an ObjectExpression (trail config), returns only its direct `blaze:`
|
|
328
|
-
* properties. When given a full AST, finds trail definitions first and extracts
|
|
329
|
-
* `blaze:` from each config — in both cases ignoring nested `blaze:` properties
|
|
330
|
-
* (e.g. `meta: { blaze: ... }`).
|
|
331
|
-
*/
|
|
332
|
-
export const findBlazeBodies = (node) => {
|
|
333
|
-
if (node.type === 'ObjectExpression') {
|
|
334
|
-
return extractBlazeFromConfig(node);
|
|
335
|
-
}
|
|
336
|
-
// Full AST — find trail definitions and extract blaze from their configs
|
|
337
|
-
const bodies = [];
|
|
338
|
-
for (const def of findTrailDefinitions(node)) {
|
|
339
|
-
bodies.push(...extractBlazeFromConfig(def.config));
|
|
340
|
-
}
|
|
341
|
-
return bodies;
|
|
342
|
-
};
|
|
343
|
-
// ---------------------------------------------------------------------------
|
|
344
|
-
// Misc helpers
|
|
345
|
-
// ---------------------------------------------------------------------------
|
|
346
|
-
/** Check if a node is a call to `.blaze()` on some object. */
|
|
347
|
-
export const isBlazeCall = (node) => {
|
|
348
|
-
if (node.type !== 'CallExpression') {
|
|
349
|
-
return false;
|
|
350
|
-
}
|
|
351
|
-
const callee = node['callee'];
|
|
352
|
-
if (!callee) {
|
|
353
|
-
return false;
|
|
354
|
-
}
|
|
355
|
-
if (callee.type !== 'StaticMemberExpression' &&
|
|
356
|
-
callee.type !== 'MemberExpression') {
|
|
357
|
-
return false;
|
|
358
|
-
}
|
|
359
|
-
const prop = callee.property;
|
|
360
|
-
return (prop?.type === 'Identifier' &&
|
|
361
|
-
prop.name === 'blaze');
|
|
362
|
-
};
|
|
363
|
-
//# sourceMappingURL=ast.js.map
|
package/dist/rules/ast.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/rules/ast.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Detects imports of surface-specific modules and types in trail files.
|
|
3
|
-
*
|
|
4
|
-
* Uses AST parsing for accurate detection — no false positives from
|
|
5
|
-
* imports in comments or strings.
|
|
6
|
-
*/
|
|
7
|
-
import type { WardenRule } from './types.js';
|
|
8
|
-
/**
|
|
9
|
-
* Detects imports of surface-specific types in trail implementation files.
|
|
10
|
-
*/
|
|
11
|
-
export declare const contextNoSurfaceTypes: WardenRule;
|
|
12
|
-
//# sourceMappingURL=context-no-surface-types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-no-surface-types.d.ts","sourceRoot":"","sources":["../../src/rules/context-no-surface-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AAgH/D;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,UA0BnC,CAAC"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Detects imports of surface-specific modules and types in trail files.
|
|
3
|
-
*
|
|
4
|
-
* Uses AST parsing for accurate detection — no false positives from
|
|
5
|
-
* imports in comments or strings.
|
|
6
|
-
*/
|
|
7
|
-
import { offsetToLine, parse, walk } from './ast.js';
|
|
8
|
-
const SURFACE_MODULES = new Set([
|
|
9
|
-
'express',
|
|
10
|
-
'hono',
|
|
11
|
-
'fastify',
|
|
12
|
-
'@modelcontextprotocol/sdk',
|
|
13
|
-
'node:http',
|
|
14
|
-
'node:https',
|
|
15
|
-
'@hono/node-server',
|
|
16
|
-
'koa',
|
|
17
|
-
]);
|
|
18
|
-
const SURFACE_TYPE_NAMES = new Set([
|
|
19
|
-
'Request',
|
|
20
|
-
'Response',
|
|
21
|
-
'NextFunction',
|
|
22
|
-
'McpSession',
|
|
23
|
-
'McpCallToolRequest',
|
|
24
|
-
'IncomingMessage',
|
|
25
|
-
'ServerResponse',
|
|
26
|
-
]);
|
|
27
|
-
const makeDiag = (filePath, sourceCode, node, message) => ({
|
|
28
|
-
filePath,
|
|
29
|
-
line: offsetToLine(sourceCode, node.start),
|
|
30
|
-
message,
|
|
31
|
-
rule: 'context-no-surface-types',
|
|
32
|
-
severity: 'error',
|
|
33
|
-
});
|
|
34
|
-
const findSurfaceTypeName = (specifiers) => {
|
|
35
|
-
for (const spec of specifiers) {
|
|
36
|
-
const name = spec.imported?.name ?? spec.local?.name;
|
|
37
|
-
if (name && SURFACE_TYPE_NAMES.has(name)) {
|
|
38
|
-
return name;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return undefined;
|
|
42
|
-
};
|
|
43
|
-
const getImportModuleName = (node) => {
|
|
44
|
-
if (node.type !== 'ImportDeclaration') {
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
const source = node['source'];
|
|
48
|
-
return source?.value ?? null;
|
|
49
|
-
};
|
|
50
|
-
const checkSpecifiersForSurfaceTypes = (node, filePath, sourceCode) => {
|
|
51
|
-
const specifiers = node['specifiers'];
|
|
52
|
-
if (!specifiers) {
|
|
53
|
-
return undefined;
|
|
54
|
-
}
|
|
55
|
-
const typeName = findSurfaceTypeName(specifiers);
|
|
56
|
-
if (!typeName) {
|
|
57
|
-
return undefined;
|
|
58
|
-
}
|
|
59
|
-
return makeDiag(filePath, sourceCode, node, `Do not import surface type "${typeName}" in trail implementation files.`);
|
|
60
|
-
};
|
|
61
|
-
const classifyImport = (node, filePath, sourceCode) => {
|
|
62
|
-
const moduleName = getImportModuleName(node);
|
|
63
|
-
if (!moduleName) {
|
|
64
|
-
return undefined;
|
|
65
|
-
}
|
|
66
|
-
if (SURFACE_MODULES.has(moduleName)) {
|
|
67
|
-
return makeDiag(filePath, sourceCode, node, `Do not import from surface module "${moduleName}" in trail implementation files.`);
|
|
68
|
-
}
|
|
69
|
-
return checkSpecifiersForSurfaceTypes(node, filePath, sourceCode);
|
|
70
|
-
};
|
|
71
|
-
/**
|
|
72
|
-
* Detects imports of surface-specific types in trail implementation files.
|
|
73
|
-
*/
|
|
74
|
-
export const contextNoSurfaceTypes = {
|
|
75
|
-
check(sourceCode, filePath) {
|
|
76
|
-
if (!/\btrail\s*\(/.test(sourceCode)) {
|
|
77
|
-
return [];
|
|
78
|
-
}
|
|
79
|
-
const ast = parse(filePath, sourceCode);
|
|
80
|
-
if (!ast) {
|
|
81
|
-
return [];
|
|
82
|
-
}
|
|
83
|
-
const diagnostics = [];
|
|
84
|
-
walk(ast, (node) => {
|
|
85
|
-
const diag = classifyImport(node, filePath, sourceCode);
|
|
86
|
-
if (diag) {
|
|
87
|
-
diagnostics.push(diag);
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
return diagnostics;
|
|
91
|
-
},
|
|
92
|
-
description: 'Disallow surface-specific type imports (Request, Response, McpSession, etc.) in trail implementation files.',
|
|
93
|
-
name: 'context-no-surface-types',
|
|
94
|
-
severity: 'error',
|
|
95
|
-
};
|
|
96
|
-
//# sourceMappingURL=context-no-surface-types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-no-surface-types.js","sourceRoot":"","sources":["../../src/rules/context-no-surface-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Detects imports of trailhead-specific modules and types in trail files.
|
|
3
|
-
*
|
|
4
|
-
* Uses AST parsing for accurate detection — no false positives from
|
|
5
|
-
* imports in comments or strings.
|
|
6
|
-
*/
|
|
7
|
-
import type { WardenRule } from './types.js';
|
|
8
|
-
/**
|
|
9
|
-
* Detects imports of trailhead-specific types in trail implementation files.
|
|
10
|
-
*/
|
|
11
|
-
export declare const contextNoTrailheadTypes: WardenRule;
|
|
12
|
-
//# sourceMappingURL=context-no-trailhead-types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-no-trailhead-types.d.ts","sourceRoot":"","sources":["../../src/rules/context-no-trailhead-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AAgH/D;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,UA0BrC,CAAC"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Detects imports of trailhead-specific modules and types in trail files.
|
|
3
|
-
*
|
|
4
|
-
* Uses AST parsing for accurate detection — no false positives from
|
|
5
|
-
* imports in comments or strings.
|
|
6
|
-
*/
|
|
7
|
-
import { offsetToLine, parse, walk } from './ast.js';
|
|
8
|
-
const SURFACE_MODULES = new Set([
|
|
9
|
-
'express',
|
|
10
|
-
'hono',
|
|
11
|
-
'fastify',
|
|
12
|
-
'@modelcontextprotocol/sdk',
|
|
13
|
-
'node:http',
|
|
14
|
-
'node:https',
|
|
15
|
-
'@hono/node-server',
|
|
16
|
-
'koa',
|
|
17
|
-
]);
|
|
18
|
-
const SURFACE_TYPE_NAMES = new Set([
|
|
19
|
-
'Request',
|
|
20
|
-
'Response',
|
|
21
|
-
'NextFunction',
|
|
22
|
-
'McpSession',
|
|
23
|
-
'McpCallToolRequest',
|
|
24
|
-
'IncomingMessage',
|
|
25
|
-
'ServerResponse',
|
|
26
|
-
]);
|
|
27
|
-
const makeDiag = (filePath, sourceCode, node, message) => ({
|
|
28
|
-
filePath,
|
|
29
|
-
line: offsetToLine(sourceCode, node.start),
|
|
30
|
-
message,
|
|
31
|
-
rule: 'context-no-trailhead-types',
|
|
32
|
-
severity: 'error',
|
|
33
|
-
});
|
|
34
|
-
const findSurfaceTypeName = (specifiers) => {
|
|
35
|
-
for (const spec of specifiers) {
|
|
36
|
-
const name = spec.imported?.name ?? spec.local?.name;
|
|
37
|
-
if (name && SURFACE_TYPE_NAMES.has(name)) {
|
|
38
|
-
return name;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return undefined;
|
|
42
|
-
};
|
|
43
|
-
const getImportModuleName = (node) => {
|
|
44
|
-
if (node.type !== 'ImportDeclaration') {
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
const source = node['source'];
|
|
48
|
-
return source?.value ?? null;
|
|
49
|
-
};
|
|
50
|
-
const checkSpecifiersForSurfaceTypes = (node, filePath, sourceCode) => {
|
|
51
|
-
const specifiers = node['specifiers'];
|
|
52
|
-
if (!specifiers) {
|
|
53
|
-
return undefined;
|
|
54
|
-
}
|
|
55
|
-
const typeName = findSurfaceTypeName(specifiers);
|
|
56
|
-
if (!typeName) {
|
|
57
|
-
return undefined;
|
|
58
|
-
}
|
|
59
|
-
return makeDiag(filePath, sourceCode, node, `Do not import trailhead type "${typeName}" in trail implementation files.`);
|
|
60
|
-
};
|
|
61
|
-
const classifyImport = (node, filePath, sourceCode) => {
|
|
62
|
-
const moduleName = getImportModuleName(node);
|
|
63
|
-
if (!moduleName) {
|
|
64
|
-
return undefined;
|
|
65
|
-
}
|
|
66
|
-
if (SURFACE_MODULES.has(moduleName)) {
|
|
67
|
-
return makeDiag(filePath, sourceCode, node, `Do not import from trailhead module "${moduleName}" in trail implementation files.`);
|
|
68
|
-
}
|
|
69
|
-
return checkSpecifiersForSurfaceTypes(node, filePath, sourceCode);
|
|
70
|
-
};
|
|
71
|
-
/**
|
|
72
|
-
* Detects imports of trailhead-specific types in trail implementation files.
|
|
73
|
-
*/
|
|
74
|
-
export const contextNoTrailheadTypes = {
|
|
75
|
-
check(sourceCode, filePath) {
|
|
76
|
-
if (!/\btrail\s*\(/.test(sourceCode)) {
|
|
77
|
-
return [];
|
|
78
|
-
}
|
|
79
|
-
const ast = parse(filePath, sourceCode);
|
|
80
|
-
if (!ast) {
|
|
81
|
-
return [];
|
|
82
|
-
}
|
|
83
|
-
const diagnostics = [];
|
|
84
|
-
walk(ast, (node) => {
|
|
85
|
-
const diag = classifyImport(node, filePath, sourceCode);
|
|
86
|
-
if (diag) {
|
|
87
|
-
diagnostics.push(diag);
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
return diagnostics;
|
|
91
|
-
},
|
|
92
|
-
description: 'Disallow trailhead-specific type imports (Request, Response, McpSession, etc.) in trail implementation files.',
|
|
93
|
-
name: 'context-no-trailhead-types',
|
|
94
|
-
severity: 'error',
|
|
95
|
-
};
|
|
96
|
-
//# sourceMappingURL=context-no-trailhead-types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context-no-trailhead-types.js","sourceRoot":"","sources":["../../src/rules/context-no-trailhead-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Validates that `ctx.cross()` calls match the declared `crosses` array.
|
|
3
|
-
*
|
|
4
|
-
* Statically analyzes trail `blaze` functions to find `ctx.cross('trailId', ...)`
|
|
5
|
-
* calls and compares them against the `crosses: [...]` declaration in the trail
|
|
6
|
-
* config. Reports errors for undeclared crossings and warnings for unused ones.
|
|
7
|
-
*/
|
|
8
|
-
import type { WardenRule } from './types.js';
|
|
9
|
-
/**
|
|
10
|
-
* Validates that `ctx.cross()` calls align with declared `crosses` arrays.
|
|
11
|
-
*/
|
|
12
|
-
export declare const crossDeclarations: WardenRule;
|
|
13
|
-
//# sourceMappingURL=cross-declarations.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cross-declarations.d.ts","sourceRoot":"","sources":["../../src/rules/cross-declarations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AAsV/D;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAuB/B,CAAC"}
|