@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.
- package/.turbo/turbo-lint.log +1 -1
- package/CHANGELOG.md +174 -0
- package/README.md +31 -7
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +23 -9
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/rules/ast.d.ts +39 -9
- package/dist/rules/ast.d.ts.map +1 -1
- package/dist/rules/ast.js +227 -53
- package/dist/rules/ast.js.map +1 -1
- package/dist/rules/context-no-surface-types.js +1 -1
- package/dist/rules/context-no-surface-types.js.map +1 -1
- package/dist/rules/follow-declarations.d.ts +13 -0
- package/dist/rules/follow-declarations.d.ts.map +1 -0
- package/dist/rules/follow-declarations.js +264 -0
- package/dist/rules/follow-declarations.js.map +1 -0
- package/dist/rules/implementation-returns-result.d.ts +1 -1
- package/dist/rules/implementation-returns-result.d.ts.map +1 -1
- package/dist/rules/implementation-returns-result.js +52 -6
- package/dist/rules/implementation-returns-result.js.map +1 -1
- package/dist/rules/index.d.ts +4 -8
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +10 -8
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/no-direct-impl-in-route.d.ts +4 -4
- package/dist/rules/no-direct-impl-in-route.d.ts.map +1 -1
- package/dist/rules/no-direct-impl-in-route.js +15 -14
- package/dist/rules/no-direct-impl-in-route.js.map +1 -1
- package/dist/rules/no-direct-implementation-call.d.ts +3 -3
- package/dist/rules/no-direct-implementation-call.js +7 -7
- package/dist/rules/no-direct-implementation-call.js.map +1 -1
- package/dist/rules/no-sync-result-assumption.d.ts +1 -1
- package/dist/rules/no-sync-result-assumption.js +5 -5
- package/dist/rules/no-sync-result-assumption.js.map +1 -1
- package/dist/rules/no-throw-in-detour-target.js +2 -2
- package/dist/rules/no-throw-in-detour-target.js.map +1 -1
- package/dist/rules/no-throw-in-implementation.d.ts +1 -1
- package/dist/rules/no-throw-in-implementation.js +3 -3
- package/dist/rules/no-throw-in-implementation.js.map +1 -1
- package/dist/rules/service-declarations.d.ts +14 -0
- package/dist/rules/service-declarations.d.ts.map +1 -0
- package/dist/rules/service-declarations.js +343 -0
- package/dist/rules/service-declarations.js.map +1 -0
- package/dist/rules/service-exists.d.ts +6 -0
- package/dist/rules/service-exists.d.ts.map +1 -0
- package/dist/rules/service-exists.js +89 -0
- package/dist/rules/service-exists.js.map +1 -0
- package/dist/rules/specs.d.ts +1 -1
- package/dist/rules/specs.d.ts.map +1 -1
- package/dist/rules/specs.js +2 -2
- package/dist/rules/specs.js.map +1 -1
- package/dist/rules/types.d.ts +2 -0
- package/dist/rules/types.d.ts.map +1 -1
- package/dist/trails/context-no-surface-types.trail.d.ts +13 -0
- package/dist/trails/context-no-surface-types.trail.d.ts.map +1 -0
- package/dist/trails/context-no-surface-types.trail.js +21 -0
- package/dist/trails/context-no-surface-types.trail.js.map +1 -0
- package/dist/trails/follow-declarations.trail.d.ts +13 -0
- package/dist/trails/follow-declarations.trail.d.ts.map +1 -0
- package/dist/trails/follow-declarations.trail.js +22 -0
- package/dist/trails/follow-declarations.trail.js.map +1 -0
- package/dist/trails/implementation-returns-result.trail.d.ts +13 -0
- package/dist/trails/implementation-returns-result.trail.d.ts.map +1 -0
- package/dist/trails/implementation-returns-result.trail.js +20 -0
- package/dist/trails/implementation-returns-result.trail.js.map +1 -0
- package/dist/trails/index.d.ts +16 -0
- package/dist/trails/index.d.ts.map +1 -0
- package/dist/trails/index.js +15 -0
- package/dist/trails/index.js.map +1 -0
- package/dist/trails/no-direct-impl-in-route.trail.d.ts +13 -0
- package/dist/trails/no-direct-impl-in-route.trail.d.ts.map +1 -0
- package/dist/trails/no-direct-impl-in-route.trail.js +22 -0
- package/dist/trails/no-direct-impl-in-route.trail.js.map +1 -0
- package/dist/trails/no-direct-implementation-call.trail.d.ts +13 -0
- package/dist/trails/no-direct-implementation-call.trail.d.ts.map +1 -0
- package/dist/trails/no-direct-implementation-call.trail.js +16 -0
- package/dist/trails/no-direct-implementation-call.trail.js.map +1 -0
- package/dist/trails/no-sync-result-assumption.trail.d.ts +13 -0
- package/dist/trails/no-sync-result-assumption.trail.d.ts.map +1 -0
- package/dist/trails/no-sync-result-assumption.trail.js +19 -0
- package/dist/trails/no-sync-result-assumption.trail.js.map +1 -0
- package/dist/trails/no-throw-in-detour-target.trail.d.ts +15 -0
- package/dist/trails/no-throw-in-detour-target.trail.d.ts.map +1 -0
- package/dist/trails/no-throw-in-detour-target.trail.js +20 -0
- package/dist/trails/no-throw-in-detour-target.trail.js.map +1 -0
- package/dist/trails/no-throw-in-implementation.trail.d.ts +13 -0
- package/dist/trails/no-throw-in-implementation.trail.d.ts.map +1 -0
- package/dist/trails/no-throw-in-implementation.trail.js +20 -0
- package/dist/trails/no-throw-in-implementation.trail.js.map +1 -0
- package/dist/trails/prefer-schema-inference.trail.d.ts +13 -0
- package/dist/trails/prefer-schema-inference.trail.d.ts.map +1 -0
- package/dist/trails/prefer-schema-inference.trail.js +21 -0
- package/dist/trails/prefer-schema-inference.trail.js.map +1 -0
- package/dist/trails/run.d.ts +17 -0
- package/dist/trails/run.d.ts.map +1 -0
- package/dist/trails/run.js +39 -0
- package/dist/trails/run.js.map +1 -0
- package/dist/trails/schema.d.ts +53 -0
- package/dist/trails/schema.d.ts.map +1 -0
- package/dist/trails/schema.js +42 -0
- package/dist/trails/schema.js.map +1 -0
- package/dist/trails/service-declarations.trail.d.ts +13 -0
- package/dist/trails/service-declarations.trail.d.ts.map +1 -0
- package/dist/trails/service-declarations.trail.js +25 -0
- package/dist/trails/service-declarations.trail.js.map +1 -0
- package/dist/trails/service-exists.trail.d.ts +15 -0
- package/dist/trails/service-exists.trail.d.ts.map +1 -0
- package/dist/trails/service-exists.trail.js +27 -0
- package/dist/trails/service-exists.trail.js.map +1 -0
- package/dist/trails/topo.d.ts +3 -0
- package/dist/trails/topo.d.ts.map +1 -0
- package/dist/trails/topo.js +5 -0
- package/dist/trails/topo.js.map +1 -0
- package/dist/trails/valid-describe-refs.trail.d.ts +15 -0
- package/dist/trails/valid-describe-refs.trail.d.ts.map +1 -0
- package/dist/trails/valid-describe-refs.trail.js +18 -0
- package/dist/trails/valid-describe-refs.trail.js.map +1 -0
- package/dist/trails/valid-detour-refs.trail.d.ts +15 -0
- package/dist/trails/valid-detour-refs.trail.d.ts.map +1 -0
- package/dist/trails/valid-detour-refs.trail.js +24 -0
- package/dist/trails/valid-detour-refs.trail.js.map +1 -0
- package/dist/trails/wrap-rule.d.ts +29 -0
- package/dist/trails/wrap-rule.d.ts.map +1 -0
- package/dist/trails/wrap-rule.js +47 -0
- package/dist/trails/wrap-rule.js.map +1 -0
- package/package.json +5 -4
- package/src/__tests__/cli.test.ts +7 -7
- package/src/__tests__/drift.test.ts +1 -1
- package/src/__tests__/follow-declarations.test.ts +303 -0
- package/src/__tests__/implementation-returns-result.test.ts +60 -6
- package/src/__tests__/no-direct-implementation-call.test.ts +8 -8
- package/src/__tests__/no-sync-result-assumption.test.ts +6 -6
- package/src/__tests__/no-throw-in-detour-target.test.ts +6 -6
- package/src/__tests__/prefer-schema-inference.test.ts +4 -4
- package/src/__tests__/rules.test.ts +59 -20
- package/src/__tests__/service-declarations.test.ts +318 -0
- package/src/__tests__/service-exists.test.ts +122 -0
- package/src/__tests__/trails.test.ts +19 -0
- package/src/__tests__/valid-describe-refs.test.ts +4 -4
- package/src/__tests__/wrap-rule.test.ts +41 -0
- package/src/cli.ts +37 -9
- package/src/index.ts +25 -0
- package/src/rules/ast.ts +292 -63
- package/src/rules/context-no-surface-types.ts +1 -1
- package/src/rules/follow-declarations.ts +380 -0
- package/src/rules/implementation-returns-result.ts +63 -6
- package/src/rules/index.ts +10 -8
- package/src/rules/no-direct-impl-in-route.ts +20 -16
- package/src/rules/no-direct-implementation-call.ts +7 -7
- package/src/rules/no-sync-result-assumption.ts +5 -5
- package/src/rules/no-throw-in-detour-target.ts +2 -2
- package/src/rules/no-throw-in-implementation.ts +3 -3
- package/src/rules/service-declarations.ts +618 -0
- package/src/rules/service-exists.ts +177 -0
- package/src/rules/specs.ts +5 -5
- package/src/rules/types.ts +2 -0
- package/src/trails/context-no-surface-types.trail.ts +21 -0
- package/src/trails/follow-declarations.trail.ts +22 -0
- package/src/trails/implementation-returns-result.trail.ts +20 -0
- package/src/trails/index.ts +16 -0
- package/src/trails/no-direct-impl-in-route.trail.ts +22 -0
- package/src/trails/no-direct-implementation-call.trail.ts +16 -0
- package/src/trails/no-sync-result-assumption.trail.ts +19 -0
- package/src/trails/no-throw-in-detour-target.trail.ts +20 -0
- package/src/trails/no-throw-in-implementation.trail.ts +20 -0
- package/src/trails/prefer-schema-inference.trail.ts +21 -0
- package/src/trails/run.ts +53 -0
- package/src/trails/schema.ts +50 -0
- package/src/trails/service-declarations.trail.ts +25 -0
- package/src/trails/service-exists.trail.ts +27 -0
- package/src/trails/topo.ts +6 -0
- package/src/trails/valid-describe-refs.trail.ts +18 -0
- package/src/trails/valid-detour-refs.trail.ts +24 -0
- package/src/trails/wrap-rule.ts +92 -0
- 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
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
/**
|
|
58
|
-
export const
|
|
59
|
-
|
|
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
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
|
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", { ... })
|
|
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', '
|
|
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
|
|
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
|
-
|
|
92
|
-
if (
|
|
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
|
-
|
|
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
|
|
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
|
-
//
|
|
278
|
+
// Run body extraction
|
|
146
279
|
// ---------------------------------------------------------------------------
|
|
147
|
-
/**
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
|
289
|
+
return bodies;
|
|
155
290
|
}
|
|
156
291
|
for (const prop of properties) {
|
|
157
|
-
if (prop.type === 'Property' && prop.key?.name ===
|
|
158
|
-
|
|
292
|
+
if (prop.type === 'Property' && prop.key?.name === 'run' && prop.value) {
|
|
293
|
+
bodies.push(prop.value);
|
|
159
294
|
}
|
|
160
295
|
}
|
|
161
|
-
return
|
|
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
|
package/dist/rules/ast.js.map
CHANGED
|
@@ -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;
|
|
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 (!/\
|
|
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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGrD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,SAAS;IACT,MAAM;IACN,SAAS;IACT,2BAA2B;IAC3B,WAAW;IACX,YAAY;IACZ,mBAAmB;IACnB,KAAK;CACN,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,SAAS;IACT,UAAU;IACV,cAAc;IACd,YAAY;IACZ,oBAAoB;IACpB,iBAAiB;IACjB,gBAAgB;CACjB,CAAC,CAAC;AAaH,MAAM,QAAQ,GAAG,CACf,QAAgB,EAChB,UAAkB,EAClB,IAAa,EACb,OAAe,EACG,EAAE,CAAC,CAAC;IACtB,QAAQ;IACR,IAAI,EAAE,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC;IAC1C,OAAO;IACP,IAAI,EAAE,0BAA0B;IAChC,QAAQ,EAAE,OAAO;CAClB,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,CAC1B,UAAsC,EAClB,EAAE;IACtB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;QACrD,IAAI,IAAI,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,IAAa,EAAiB,EAAE;IAC3D,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAA4C,CAAC;IACzE,OAAO,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,8BAA8B,GAAG,CACrC,IAAa,EACb,QAAgB,EAChB,UAAkB,EACY,EAAE;IAChC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAEvB,CAAC;IACd,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,QAAQ,CACb,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,+BAA+B,QAAQ,kCAAkC,CAC1E,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CACrB,IAAa,EACb,QAAgB,EAChB,UAAkB,EACY,EAAE;IAChC,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,OAAO,QAAQ,CACb,QAAQ,EACR,UAAU,EACV,IAAI,EACJ,sCAAsC,UAAU,kCAAkC,CACnF,CAAC;IACJ,CAAC;IAED,OAAO,8BAA8B,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAe;IAC/C,KAAK,CAAC,UAAkB,EAAE,QAAgB;QACxC,IAAI,CAAC,
|
|
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"}
|