@ontrails/warden 1.0.0-beta.1 → 1.0.0-beta.11

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.
Files changed (179) hide show
  1. package/.turbo/turbo-lint.log +1 -1
  2. package/CHANGELOG.md +174 -0
  3. package/README.md +31 -7
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +23 -9
  6. package/dist/cli.js.map +1 -1
  7. package/dist/index.d.ts +6 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +6 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/rules/ast.d.ts +39 -9
  12. package/dist/rules/ast.d.ts.map +1 -1
  13. package/dist/rules/ast.js +227 -53
  14. package/dist/rules/ast.js.map +1 -1
  15. package/dist/rules/context-no-surface-types.js +1 -1
  16. package/dist/rules/context-no-surface-types.js.map +1 -1
  17. package/dist/rules/follow-declarations.d.ts +13 -0
  18. package/dist/rules/follow-declarations.d.ts.map +1 -0
  19. package/dist/rules/follow-declarations.js +264 -0
  20. package/dist/rules/follow-declarations.js.map +1 -0
  21. package/dist/rules/implementation-returns-result.d.ts +1 -1
  22. package/dist/rules/implementation-returns-result.d.ts.map +1 -1
  23. package/dist/rules/implementation-returns-result.js +52 -6
  24. package/dist/rules/implementation-returns-result.js.map +1 -1
  25. package/dist/rules/index.d.ts +4 -8
  26. package/dist/rules/index.d.ts.map +1 -1
  27. package/dist/rules/index.js +10 -8
  28. package/dist/rules/index.js.map +1 -1
  29. package/dist/rules/no-direct-impl-in-route.d.ts +4 -4
  30. package/dist/rules/no-direct-impl-in-route.d.ts.map +1 -1
  31. package/dist/rules/no-direct-impl-in-route.js +15 -14
  32. package/dist/rules/no-direct-impl-in-route.js.map +1 -1
  33. package/dist/rules/no-direct-implementation-call.d.ts +3 -3
  34. package/dist/rules/no-direct-implementation-call.js +7 -7
  35. package/dist/rules/no-direct-implementation-call.js.map +1 -1
  36. package/dist/rules/no-sync-result-assumption.d.ts +1 -1
  37. package/dist/rules/no-sync-result-assumption.js +5 -5
  38. package/dist/rules/no-sync-result-assumption.js.map +1 -1
  39. package/dist/rules/no-throw-in-detour-target.js +2 -2
  40. package/dist/rules/no-throw-in-detour-target.js.map +1 -1
  41. package/dist/rules/no-throw-in-implementation.d.ts +1 -1
  42. package/dist/rules/no-throw-in-implementation.js +3 -3
  43. package/dist/rules/no-throw-in-implementation.js.map +1 -1
  44. package/dist/rules/service-declarations.d.ts +14 -0
  45. package/dist/rules/service-declarations.d.ts.map +1 -0
  46. package/dist/rules/service-declarations.js +343 -0
  47. package/dist/rules/service-declarations.js.map +1 -0
  48. package/dist/rules/service-exists.d.ts +6 -0
  49. package/dist/rules/service-exists.d.ts.map +1 -0
  50. package/dist/rules/service-exists.js +89 -0
  51. package/dist/rules/service-exists.js.map +1 -0
  52. package/dist/rules/specs.d.ts +1 -1
  53. package/dist/rules/specs.d.ts.map +1 -1
  54. package/dist/rules/specs.js +2 -2
  55. package/dist/rules/specs.js.map +1 -1
  56. package/dist/rules/types.d.ts +2 -0
  57. package/dist/rules/types.d.ts.map +1 -1
  58. package/dist/trails/context-no-surface-types.trail.d.ts +13 -0
  59. package/dist/trails/context-no-surface-types.trail.d.ts.map +1 -0
  60. package/dist/trails/context-no-surface-types.trail.js +21 -0
  61. package/dist/trails/context-no-surface-types.trail.js.map +1 -0
  62. package/dist/trails/follow-declarations.trail.d.ts +13 -0
  63. package/dist/trails/follow-declarations.trail.d.ts.map +1 -0
  64. package/dist/trails/follow-declarations.trail.js +22 -0
  65. package/dist/trails/follow-declarations.trail.js.map +1 -0
  66. package/dist/trails/implementation-returns-result.trail.d.ts +13 -0
  67. package/dist/trails/implementation-returns-result.trail.d.ts.map +1 -0
  68. package/dist/trails/implementation-returns-result.trail.js +20 -0
  69. package/dist/trails/implementation-returns-result.trail.js.map +1 -0
  70. package/dist/trails/index.d.ts +16 -0
  71. package/dist/trails/index.d.ts.map +1 -0
  72. package/dist/trails/index.js +15 -0
  73. package/dist/trails/index.js.map +1 -0
  74. package/dist/trails/no-direct-impl-in-route.trail.d.ts +13 -0
  75. package/dist/trails/no-direct-impl-in-route.trail.d.ts.map +1 -0
  76. package/dist/trails/no-direct-impl-in-route.trail.js +22 -0
  77. package/dist/trails/no-direct-impl-in-route.trail.js.map +1 -0
  78. package/dist/trails/no-direct-implementation-call.trail.d.ts +13 -0
  79. package/dist/trails/no-direct-implementation-call.trail.d.ts.map +1 -0
  80. package/dist/trails/no-direct-implementation-call.trail.js +16 -0
  81. package/dist/trails/no-direct-implementation-call.trail.js.map +1 -0
  82. package/dist/trails/no-sync-result-assumption.trail.d.ts +13 -0
  83. package/dist/trails/no-sync-result-assumption.trail.d.ts.map +1 -0
  84. package/dist/trails/no-sync-result-assumption.trail.js +19 -0
  85. package/dist/trails/no-sync-result-assumption.trail.js.map +1 -0
  86. package/dist/trails/no-throw-in-detour-target.trail.d.ts +15 -0
  87. package/dist/trails/no-throw-in-detour-target.trail.d.ts.map +1 -0
  88. package/dist/trails/no-throw-in-detour-target.trail.js +20 -0
  89. package/dist/trails/no-throw-in-detour-target.trail.js.map +1 -0
  90. package/dist/trails/no-throw-in-implementation.trail.d.ts +13 -0
  91. package/dist/trails/no-throw-in-implementation.trail.d.ts.map +1 -0
  92. package/dist/trails/no-throw-in-implementation.trail.js +20 -0
  93. package/dist/trails/no-throw-in-implementation.trail.js.map +1 -0
  94. package/dist/trails/prefer-schema-inference.trail.d.ts +13 -0
  95. package/dist/trails/prefer-schema-inference.trail.d.ts.map +1 -0
  96. package/dist/trails/prefer-schema-inference.trail.js +21 -0
  97. package/dist/trails/prefer-schema-inference.trail.js.map +1 -0
  98. package/dist/trails/run.d.ts +17 -0
  99. package/dist/trails/run.d.ts.map +1 -0
  100. package/dist/trails/run.js +39 -0
  101. package/dist/trails/run.js.map +1 -0
  102. package/dist/trails/schema.d.ts +53 -0
  103. package/dist/trails/schema.d.ts.map +1 -0
  104. package/dist/trails/schema.js +42 -0
  105. package/dist/trails/schema.js.map +1 -0
  106. package/dist/trails/service-declarations.trail.d.ts +13 -0
  107. package/dist/trails/service-declarations.trail.d.ts.map +1 -0
  108. package/dist/trails/service-declarations.trail.js +25 -0
  109. package/dist/trails/service-declarations.trail.js.map +1 -0
  110. package/dist/trails/service-exists.trail.d.ts +15 -0
  111. package/dist/trails/service-exists.trail.d.ts.map +1 -0
  112. package/dist/trails/service-exists.trail.js +27 -0
  113. package/dist/trails/service-exists.trail.js.map +1 -0
  114. package/dist/trails/topo.d.ts +3 -0
  115. package/dist/trails/topo.d.ts.map +1 -0
  116. package/dist/trails/topo.js +5 -0
  117. package/dist/trails/topo.js.map +1 -0
  118. package/dist/trails/valid-describe-refs.trail.d.ts +15 -0
  119. package/dist/trails/valid-describe-refs.trail.d.ts.map +1 -0
  120. package/dist/trails/valid-describe-refs.trail.js +18 -0
  121. package/dist/trails/valid-describe-refs.trail.js.map +1 -0
  122. package/dist/trails/valid-detour-refs.trail.d.ts +15 -0
  123. package/dist/trails/valid-detour-refs.trail.d.ts.map +1 -0
  124. package/dist/trails/valid-detour-refs.trail.js +24 -0
  125. package/dist/trails/valid-detour-refs.trail.js.map +1 -0
  126. package/dist/trails/wrap-rule.d.ts +29 -0
  127. package/dist/trails/wrap-rule.d.ts.map +1 -0
  128. package/dist/trails/wrap-rule.js +47 -0
  129. package/dist/trails/wrap-rule.js.map +1 -0
  130. package/package.json +5 -4
  131. package/src/__tests__/cli.test.ts +7 -7
  132. package/src/__tests__/drift.test.ts +1 -1
  133. package/src/__tests__/follow-declarations.test.ts +303 -0
  134. package/src/__tests__/implementation-returns-result.test.ts +60 -6
  135. package/src/__tests__/no-direct-implementation-call.test.ts +8 -8
  136. package/src/__tests__/no-sync-result-assumption.test.ts +6 -6
  137. package/src/__tests__/no-throw-in-detour-target.test.ts +6 -6
  138. package/src/__tests__/prefer-schema-inference.test.ts +4 -4
  139. package/src/__tests__/rules.test.ts +59 -20
  140. package/src/__tests__/service-declarations.test.ts +318 -0
  141. package/src/__tests__/service-exists.test.ts +122 -0
  142. package/src/__tests__/trails.test.ts +19 -0
  143. package/src/__tests__/valid-describe-refs.test.ts +4 -4
  144. package/src/__tests__/wrap-rule.test.ts +41 -0
  145. package/src/cli.ts +37 -9
  146. package/src/index.ts +25 -0
  147. package/src/rules/ast.ts +292 -63
  148. package/src/rules/context-no-surface-types.ts +1 -1
  149. package/src/rules/follow-declarations.ts +380 -0
  150. package/src/rules/implementation-returns-result.ts +63 -6
  151. package/src/rules/index.ts +10 -8
  152. package/src/rules/no-direct-impl-in-route.ts +20 -16
  153. package/src/rules/no-direct-implementation-call.ts +7 -7
  154. package/src/rules/no-sync-result-assumption.ts +5 -5
  155. package/src/rules/no-throw-in-detour-target.ts +2 -2
  156. package/src/rules/no-throw-in-implementation.ts +3 -3
  157. package/src/rules/service-declarations.ts +618 -0
  158. package/src/rules/service-exists.ts +177 -0
  159. package/src/rules/specs.ts +5 -5
  160. package/src/rules/types.ts +2 -0
  161. package/src/trails/context-no-surface-types.trail.ts +21 -0
  162. package/src/trails/follow-declarations.trail.ts +22 -0
  163. package/src/trails/implementation-returns-result.trail.ts +20 -0
  164. package/src/trails/index.ts +16 -0
  165. package/src/trails/no-direct-impl-in-route.trail.ts +22 -0
  166. package/src/trails/no-direct-implementation-call.trail.ts +16 -0
  167. package/src/trails/no-sync-result-assumption.trail.ts +19 -0
  168. package/src/trails/no-throw-in-detour-target.trail.ts +20 -0
  169. package/src/trails/no-throw-in-implementation.trail.ts +20 -0
  170. package/src/trails/prefer-schema-inference.trail.ts +21 -0
  171. package/src/trails/run.ts +53 -0
  172. package/src/trails/schema.ts +50 -0
  173. package/src/trails/service-declarations.trail.ts +25 -0
  174. package/src/trails/service-exists.trail.ts +27 -0
  175. package/src/trails/topo.ts +6 -0
  176. package/src/trails/valid-describe-refs.trail.ts +18 -0
  177. package/src/trails/valid-detour-refs.trail.ts +24 -0
  178. package/src/trails/wrap-rule.ts +92 -0
  179. package/tsconfig.tsbuildinfo +1 -1
package/dist/rules/ast.js CHANGED
@@ -18,9 +18,18 @@ export const parse = (filePath, sourceCode) => {
18
18
  return null;
19
19
  }
20
20
  };
21
- // ---------------------------------------------------------------------------
22
- // Walker
23
- // ---------------------------------------------------------------------------
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
+ };
24
33
  /** Walk an AST node tree, calling `visit` on every node. */
25
34
  export const walk = (node, visit) => {
26
35
  if (!node || typeof node !== 'object') {
@@ -30,16 +39,41 @@ export const walk = (node, visit) => {
30
39
  if (n.type) {
31
40
  visit(n);
32
41
  }
33
- for (const val of Object.values(n)) {
34
- if (Array.isArray(val)) {
35
- for (const item of val) {
36
- walk(item, visit);
37
- }
38
- }
39
- else if (val && typeof val === 'object' && val.type) {
40
- walk(val, visit);
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;
41
58
  }
42
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 service-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);
43
77
  };
44
78
  // ---------------------------------------------------------------------------
45
79
  // Helpers
@@ -54,24 +88,117 @@ export const offsetToLine = (sourceCode, offset) => {
54
88
  }
55
89
  return line;
56
90
  };
57
- /** Find all `implementation:` property values in an AST. */
58
- export const findImplementationBodies = (ast) => {
59
- const bodies = [];
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
+ /** Extract the first string argument from a CallExpression. */
119
+ export const extractFirstStringArg = (node) => {
120
+ if (node.type !== 'CallExpression') {
121
+ return null;
122
+ }
123
+ const args = node['arguments'];
124
+ const [firstArg] = args ?? [];
125
+ return extractStringLiteral(firstArg);
126
+ };
127
+ const isServiceCall = (node) => !!node &&
128
+ node.type === 'CallExpression' &&
129
+ identifierName(node.callee) ===
130
+ 'service';
131
+ const extractBindingName = (node) => {
132
+ if (!node) {
133
+ return null;
134
+ }
135
+ if (node.type === 'Identifier') {
136
+ return identifierName(node);
137
+ }
138
+ if (node.type === 'AssignmentPattern') {
139
+ return identifierName(node.left);
140
+ }
141
+ return null;
142
+ };
143
+ /** Collect `const foo = service('id', ...)` bindings from a parsed file. */
144
+ export const collectNamedServiceIds = (ast) => {
145
+ const ids = new Map();
60
146
  walk(ast, (node) => {
61
- if (node.type === 'Property' &&
62
- node.key?.name === 'implementation' &&
63
- node.value) {
64
- bodies.push(node.value);
147
+ if (node.type !== 'VariableDeclarator') {
148
+ return;
149
+ }
150
+ const { id, init } = node;
151
+ if (!isServiceCall(init)) {
152
+ return;
153
+ }
154
+ const name = extractBindingName(id);
155
+ const serviceId = init ? extractFirstStringArg(init) : null;
156
+ if (name && serviceId) {
157
+ ids.set(name, serviceId);
65
158
  }
66
159
  });
67
- return bodies;
160
+ return ids;
161
+ };
162
+ /** Collect all inline `service('id', ...)` definition IDs from a parsed file. */
163
+ export const collectServiceDefinitionIds = (ast) => {
164
+ const ids = new Set();
165
+ walk(ast, (node) => {
166
+ if (!isServiceCall(node)) {
167
+ return;
168
+ }
169
+ const id = extractFirstStringArg(node);
170
+ if (id) {
171
+ ids.add(id);
172
+ }
173
+ });
174
+ return ids;
175
+ };
176
+ // ---------------------------------------------------------------------------
177
+ // Config property extraction helpers
178
+ // ---------------------------------------------------------------------------
179
+ /** Find a Property node by key name inside an ObjectExpression config. */
180
+ export const findConfigProperty = (config, propertyName) => {
181
+ if (config.type !== 'ObjectExpression') {
182
+ return null;
183
+ }
184
+ const properties = config['properties'];
185
+ if (!properties) {
186
+ return null;
187
+ }
188
+ for (const prop of properties) {
189
+ if (prop.type === 'Property' && prop.key?.name === propertyName) {
190
+ return prop;
191
+ }
192
+ }
193
+ return null;
68
194
  };
69
195
  /**
70
- * Find all `trail("id", { ... })` and `hike("id", { ... })` call sites.
196
+ * Find all `trail("id", { ... })`, `trail({ id: "x", ... })`, and
197
+ * `event("id", { ... })` call sites.
71
198
  *
72
199
  * Returns the trail ID, kind, and config object node for each definition.
73
200
  */
74
- const TRAIL_CALLEE_NAMES = new Set(['trail', 'hike']);
201
+ const TRAIL_CALLEE_NAMES = new Set(['trail', 'event']);
75
202
  const getTrailCalleeName = (node) => {
76
203
  if (node.type !== 'CallExpression') {
77
204
  return null;
@@ -83,16 +210,39 @@ const getTrailCalleeName = (node) => {
83
210
  const { name } = callee;
84
211
  return name && TRAIL_CALLEE_NAMES.has(name) ? name : null;
85
212
  };
213
+ /** Extract args from a trail() call, handling both two-arg and single-object forms. */
86
214
  const extractTrailArgs = (node) => {
87
215
  const args = node['arguments'];
88
- if (!args || args.length < 2) {
216
+ if (!args || args.length === 0) {
217
+ return null;
218
+ }
219
+ const [firstArg, secondArg] = args;
220
+ if (!firstArg) {
89
221
  return null;
90
222
  }
91
- const [idArg, configArg] = args;
92
- if (!idArg || !configArg) {
223
+ // Two-arg form: trail('id', { ... })
224
+ if (secondArg && firstArg.type !== 'ObjectExpression') {
225
+ return { configArg: secondArg, idArg: firstArg };
226
+ }
227
+ // Single-object form: trail({ id: 'x', ... })
228
+ return firstArg.type === 'ObjectExpression'
229
+ ? { configArg: firstArg, idArg: null }
230
+ : null;
231
+ };
232
+ /** Extract the string value from an `id` property inside a config ObjectExpression. */
233
+ const extractIdFromConfig = (config) => {
234
+ const idProp = findConfigProperty(config, 'id');
235
+ if (!idProp || !idProp.value) {
93
236
  return null;
94
237
  }
95
- return { configArg, idArg };
238
+ const val = idProp.value.value;
239
+ return typeof val === 'string' ? val : null;
240
+ };
241
+ const extractTrailId = (trailArgs) => {
242
+ if (trailArgs.idArg) {
243
+ return trailArgs.idArg.value ?? null;
244
+ }
245
+ return extractIdFromConfig(trailArgs.configArg);
96
246
  };
97
247
  const extractTrailDefinition = (node) => {
98
248
  const calleeName = getTrailCalleeName(node);
@@ -103,7 +253,7 @@ const extractTrailDefinition = (node) => {
103
253
  if (!trailArgs) {
104
254
  return null;
105
255
  }
106
- const trailId = trailArgs.idArg.value;
256
+ const trailId = extractTrailId(trailArgs);
107
257
  if (!trailId) {
108
258
  return null;
109
259
  }
@@ -114,23 +264,6 @@ const extractTrailDefinition = (node) => {
114
264
  start: node.start,
115
265
  };
116
266
  };
117
- /** Check if a node is a call to `.implementation()` on some object. */
118
- export const isImplementationCall = (node) => {
119
- if (node.type !== 'CallExpression') {
120
- return false;
121
- }
122
- const callee = node['callee'];
123
- if (!callee) {
124
- return false;
125
- }
126
- if (callee.type !== 'StaticMemberExpression' &&
127
- callee.type !== 'MemberExpression') {
128
- return false;
129
- }
130
- const prop = callee.property;
131
- return (prop?.type === 'Identifier' &&
132
- prop.name === 'implementation');
133
- };
134
267
  export const findTrailDefinitions = (ast) => {
135
268
  const definitions = [];
136
269
  walk(ast, (node) => {
@@ -142,22 +275,63 @@ export const findTrailDefinitions = (ast) => {
142
275
  return definitions;
143
276
  };
144
277
  // ---------------------------------------------------------------------------
145
- // Config property extraction helpers
278
+ // Run body extraction
146
279
  // ---------------------------------------------------------------------------
147
- /** Find a Property node by key name inside an ObjectExpression config. */
148
- export const findConfigProperty = (config, propertyName) => {
149
- if (config.type !== 'ObjectExpression') {
150
- return null;
151
- }
280
+ /**
281
+ * Extract top-level `run:` property values from an ObjectExpression's direct properties.
282
+ *
283
+ * Does not recurse into nested objects, so `metadata: { run: ... }` is ignored.
284
+ */
285
+ const extractRunFromConfig = (config) => {
286
+ const bodies = [];
152
287
  const properties = config['properties'];
153
288
  if (!properties) {
154
- return null;
289
+ return bodies;
155
290
  }
156
291
  for (const prop of properties) {
157
- if (prop.type === 'Property' && prop.key?.name === propertyName) {
158
- return prop;
292
+ if (prop.type === 'Property' && prop.key?.name === 'run' && prop.value) {
293
+ bodies.push(prop.value);
159
294
  }
160
295
  }
161
- return null;
296
+ return bodies;
297
+ };
298
+ /**
299
+ * Find `run:` property values.
300
+ *
301
+ * When given an ObjectExpression (trail config), returns only its direct `run:`
302
+ * properties. When given a full AST, finds trail definitions first and extracts
303
+ * `run:` from each config — in both cases ignoring nested `run:` properties
304
+ * (e.g. `metadata: { run: ... }`).
305
+ */
306
+ export const findRunBodies = (node) => {
307
+ if (node.type === 'ObjectExpression') {
308
+ return extractRunFromConfig(node);
309
+ }
310
+ // Full AST — find trail definitions and extract run from their configs
311
+ const bodies = [];
312
+ for (const def of findTrailDefinitions(node)) {
313
+ bodies.push(...extractRunFromConfig(def.config));
314
+ }
315
+ return bodies;
316
+ };
317
+ // ---------------------------------------------------------------------------
318
+ // Misc helpers
319
+ // ---------------------------------------------------------------------------
320
+ /** Check if a node is a call to `.run()` on some object. */
321
+ export const isRunCall = (node) => {
322
+ if (node.type !== 'CallExpression') {
323
+ return false;
324
+ }
325
+ const callee = node['callee'];
326
+ if (!callee) {
327
+ return false;
328
+ }
329
+ if (callee.type !== 'StaticMemberExpression' &&
330
+ callee.type !== 'MemberExpression') {
331
+ return false;
332
+ }
333
+ const prop = callee.property;
334
+ return (prop?.type === 'Identifier' &&
335
+ prop.name === 'run');
162
336
  };
163
337
  //# sourceMappingURL=ast.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/rules/ast.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAgBvC,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAE,UAAkB,EAAkB,EAAE;IAC5E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzE,OAAO,MAAM,CAAC,OAA6B,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,4DAA4D;AAC5D,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,IAAa,EAAE,KAA8B,EAAQ,EAAE;IAC1E,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IACD,MAAM,CAAC,GAAG,IAAe,CAAC;IAC1B,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACX,KAAK,CAAC,CAAC,CAAC,CAAC;IACX,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAK,GAAe,CAAC,IAAI,EAAE,CAAC;YACnE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,mEAAmE;AACnE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,UAAkB,EAAE,MAAc,EAAU,EAAE;IACzE,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,4DAA4D;AAC5D,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,GAAY,EAAa,EAAE;IAClE,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;QACjB,IACE,IAAI,CAAC,IAAI,KAAK,UAAU;YACxB,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,gBAAgB;YACnC,IAAI,CAAC,KAAK,EACV,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAaF;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAEtD,MAAM,kBAAkB,GAAG,CAAC,IAAa,EAAiB,EAAE;IAC1D,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAwB,CAAC;IACrD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAsC,CAAC;IACxD,OAAO,IAAI,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CACvB,IAAa,EACkC,EAAE;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAmC,CAAC;IACjE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,IAAa,EAA0B,EAAE;IACvE,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAI,SAAS,CAAC,KAAuC,CAAC,KAAK,CAAC;IACzE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,MAAM,EAAE,SAAS,CAAC,SAAS;QAC3B,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC;AACJ,CAAC,CAAC;AAEF,uEAAuE;AACvE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAa,EAAW,EAAE;IAC7D,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAwB,CAAC;IACrD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IACE,MAAM,CAAC,IAAI,KAAK,wBAAwB;QACxC,MAAM,CAAC,IAAI,KAAK,kBAAkB,EAClC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAI,MAA4C,CAAC,QAAQ,CAAC;IACpE,OAAO,CACL,IAAI,EAAE,IAAI,KAAK,YAAY;QAC1B,IAAoC,CAAC,IAAI,KAAK,gBAAgB,CAChE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAY,EAAqB,EAAE;IACtE,MAAM,WAAW,GAAsB,EAAE,CAAC;IAE1C,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;QACjB,MAAM,GAAG,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,GAAG,EAAE,CAAC;YACR,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEF,8EAA8E;AAC9E,qCAAqC;AACrC,8EAA8E;AAE9E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,MAAe,EACf,YAAoB,EACJ,EAAE;IAClB,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAmC,CAAC;IAC1E,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
1
+ {"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/rules/ast.ts"],"names":[],"mappings":"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"}
@@ -73,7 +73,7 @@ const classifyImport = (node, filePath, sourceCode) => {
73
73
  */
74
74
  export const contextNoSurfaceTypes = {
75
75
  check(sourceCode, filePath) {
76
- if (!/\b(?:trail|hike)\s*\(/.test(sourceCode)) {
76
+ if (!/\btrail\s*\(/.test(sourceCode)) {
77
77
  return [];
78
78
  }
79
79
  const ast = parse(filePath, sourceCode);
@@ -1 +1 @@
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
+ {"version":3,"file":"context-no-surface-types.js","sourceRoot":"","sources":["../../src/rules/context-no-surface-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Validates that `ctx.follow()` calls match the declared `follow` array.
3
+ *
4
+ * Statically analyzes trail run functions to find `ctx.follow('trailId', ...)`
5
+ * calls and compares them against the `follow: [...]` declaration in the trail
6
+ * config. Reports errors for undeclared follows and warnings for unused ones.
7
+ */
8
+ import type { WardenRule } from './types.js';
9
+ /**
10
+ * Validates that `ctx.follow()` calls align with declared `follow` arrays.
11
+ */
12
+ export declare const followDeclarations: WardenRule;
13
+ //# sourceMappingURL=follow-declarations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-declarations.d.ts","sourceRoot":"","sources":["../../src/rules/follow-declarations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AA+U/D;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,UAuBhC,CAAC"}