@ontrails/warden 1.0.0-beta.10 → 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 (76) hide show
  1. package/.turbo/turbo-lint.log +1 -1
  2. package/CHANGELOG.md +26 -0
  3. package/README.md +5 -2
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +23 -6
  6. package/dist/cli.js.map +1 -1
  7. package/dist/index.d.ts +3 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +3 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/rules/ast.d.ts +24 -1
  12. package/dist/rules/ast.d.ts.map +1 -1
  13. package/dist/rules/ast.js +130 -11
  14. package/dist/rules/ast.js.map +1 -1
  15. package/dist/rules/index.d.ts +2 -0
  16. package/dist/rules/index.d.ts.map +1 -1
  17. package/dist/rules/index.js +6 -0
  18. package/dist/rules/index.js.map +1 -1
  19. package/dist/rules/service-declarations.d.ts +14 -0
  20. package/dist/rules/service-declarations.d.ts.map +1 -0
  21. package/dist/rules/service-declarations.js +343 -0
  22. package/dist/rules/service-declarations.js.map +1 -0
  23. package/dist/rules/service-exists.d.ts +6 -0
  24. package/dist/rules/service-exists.d.ts.map +1 -0
  25. package/dist/rules/service-exists.js +89 -0
  26. package/dist/rules/service-exists.js.map +1 -0
  27. package/dist/rules/types.d.ts +2 -0
  28. package/dist/rules/types.d.ts.map +1 -1
  29. package/dist/trails/index.d.ts +2 -0
  30. package/dist/trails/index.d.ts.map +1 -1
  31. package/dist/trails/index.js +2 -0
  32. package/dist/trails/index.js.map +1 -1
  33. package/dist/trails/no-throw-in-detour-target.trail.d.ts +1 -0
  34. package/dist/trails/no-throw-in-detour-target.trail.d.ts.map +1 -1
  35. package/dist/trails/run.d.ts +1 -0
  36. package/dist/trails/run.d.ts.map +1 -1
  37. package/dist/trails/run.js +11 -2
  38. package/dist/trails/run.js.map +1 -1
  39. package/dist/trails/schema.d.ts +1 -0
  40. package/dist/trails/schema.d.ts.map +1 -1
  41. package/dist/trails/schema.js +4 -0
  42. package/dist/trails/schema.js.map +1 -1
  43. package/dist/trails/service-declarations.trail.d.ts +13 -0
  44. package/dist/trails/service-declarations.trail.d.ts.map +1 -0
  45. package/dist/trails/service-declarations.trail.js +25 -0
  46. package/dist/trails/service-declarations.trail.js.map +1 -0
  47. package/dist/trails/service-exists.trail.d.ts +15 -0
  48. package/dist/trails/service-exists.trail.d.ts.map +1 -0
  49. package/dist/trails/service-exists.trail.js +27 -0
  50. package/dist/trails/service-exists.trail.js.map +1 -0
  51. package/dist/trails/valid-describe-refs.trail.d.ts +1 -0
  52. package/dist/trails/valid-describe-refs.trail.d.ts.map +1 -1
  53. package/dist/trails/valid-detour-refs.trail.d.ts +1 -0
  54. package/dist/trails/valid-detour-refs.trail.d.ts.map +1 -1
  55. package/dist/trails/wrap-rule.d.ts.map +1 -1
  56. package/dist/trails/wrap-rule.js +6 -2
  57. package/dist/trails/wrap-rule.js.map +1 -1
  58. package/package.json +1 -1
  59. package/src/__tests__/service-declarations.test.ts +318 -0
  60. package/src/__tests__/service-exists.test.ts +122 -0
  61. package/src/__tests__/trails.test.ts +2 -2
  62. package/src/__tests__/wrap-rule.test.ts +41 -0
  63. package/src/cli.ts +37 -6
  64. package/src/index.ts +4 -0
  65. package/src/rules/ast.ts +168 -8
  66. package/src/rules/index.ts +6 -0
  67. package/src/rules/service-declarations.ts +618 -0
  68. package/src/rules/service-exists.ts +177 -0
  69. package/src/rules/types.ts +2 -0
  70. package/src/trails/index.ts +2 -0
  71. package/src/trails/run.ts +17 -4
  72. package/src/trails/schema.ts +4 -0
  73. package/src/trails/service-declarations.trail.ts +25 -0
  74. package/src/trails/service-exists.trail.ts +27 -0
  75. package/src/trails/wrap-rule.ts +14 -6
  76. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,343 @@
1
+ /**
2
+ * Validates that service access matches the declared `services` array.
3
+ *
4
+ * Statically analyzes trail run functions to find `db.from(ctx)` and
5
+ * `ctx.service('db.main')` calls and compares them against the declared
6
+ * `services: [...]` array in the trail config. Reports errors for undeclared
7
+ * access and warnings for unused declarations.
8
+ */
9
+ import { collectNamedServiceIds, extractFirstStringArg, findConfigProperty, findRunBodies, findTrailDefinitions, getStringValue, identifierName, isStringLiteral, offsetToLine, parse, walkScope, } from './ast.js';
10
+ import { isTestFile } from './scan.js';
11
+ const MEMBER_TYPES = new Set(['StaticMemberExpression', 'MemberExpression']);
12
+ /** Extract object and property Identifier names from a MemberExpression. */
13
+ const extractMemberPair = (callee) => {
14
+ if (!MEMBER_TYPES.has(callee.type)) {
15
+ return null;
16
+ }
17
+ const objName = identifierName(callee.object);
18
+ const propName = identifierName(callee.property);
19
+ return objName && propName ? { objName, propName } : null;
20
+ };
21
+ /** Check if a node is an inline `service('id', ...)` call. */
22
+ const isInlineServiceCall = (node) => {
23
+ if (node.type !== 'CallExpression') {
24
+ return false;
25
+ }
26
+ return (identifierName(node.callee) ===
27
+ 'service');
28
+ };
29
+ /** Get `services` array elements from a trail config. */
30
+ const getServiceElements = (config) => {
31
+ const servicesProp = findConfigProperty(config, 'services');
32
+ if (!servicesProp) {
33
+ return [];
34
+ }
35
+ const arrayNode = servicesProp.value;
36
+ if (!arrayNode || arrayNode.type !== 'ArrayExpression') {
37
+ return [];
38
+ }
39
+ const elements = arrayNode['elements'];
40
+ return elements ?? [];
41
+ };
42
+ /** Extract one declared service from a `services` array element. */
43
+ const extractDeclaredService = (element, serviceIdsByName) => {
44
+ if (element.type === 'Identifier') {
45
+ const name = identifierName(element);
46
+ return {
47
+ id: name ? (serviceIdsByName.get(name) ?? null) : null,
48
+ name,
49
+ };
50
+ }
51
+ if (isStringLiteral(element)) {
52
+ return { id: getStringValue(element), name: null };
53
+ }
54
+ if (isInlineServiceCall(element)) {
55
+ return { id: extractFirstStringArg(element), name: null };
56
+ }
57
+ return null;
58
+ };
59
+ /** Extract declared services from a trail config's `services` array. */
60
+ const extractDeclaredServices = (config, serviceIdsByName) => getServiceElements(config).flatMap((element) => {
61
+ const service = extractDeclaredService(element, serviceIdsByName);
62
+ return service ? [service] : [];
63
+ });
64
+ // ---------------------------------------------------------------------------
65
+ // Called service extraction
66
+ // ---------------------------------------------------------------------------
67
+ /** Extract the second parameter name from a run function node. */
68
+ const extractContextParamName = (runBody) => {
69
+ const params = runBody['params'];
70
+ if (!params || params.length < 2) {
71
+ return null;
72
+ }
73
+ return identifierName(params[1]);
74
+ };
75
+ /** Build the set of context parameter names to match against. */
76
+ const buildCtxNames = (body) => {
77
+ const ctxNames = new Set(['ctx', 'context']);
78
+ const paramName = extractContextParamName(body);
79
+ if (paramName) {
80
+ ctxNames.add(paramName);
81
+ }
82
+ return ctxNames;
83
+ };
84
+ /** Extract a CallExpression callee, or null. */
85
+ const extractCallCallee = (node) => {
86
+ if (node.type !== 'CallExpression') {
87
+ return null;
88
+ }
89
+ return (node.callee ??
90
+ null);
91
+ };
92
+ /** Extract the first identifier argument from a CallExpression. */
93
+ const extractFirstIdentifierArg = (node) => {
94
+ const args = node['arguments'];
95
+ const [firstArg] = args ?? [];
96
+ return identifierName(firstArg);
97
+ };
98
+ const extractCallInfo = (node) => {
99
+ const callee = extractCallCallee(node);
100
+ return callee
101
+ ? {
102
+ callee,
103
+ firstArgName: extractFirstIdentifierArg(node),
104
+ }
105
+ : null;
106
+ };
107
+ /** Extract `db.from(ctx)` object names. */
108
+ const extractFromCallName = (node, ctxNames) => {
109
+ const call = extractCallInfo(node);
110
+ const pair = call ? extractMemberPair(call.callee) : null;
111
+ return pair &&
112
+ pair.propName === 'from' &&
113
+ call?.firstArgName &&
114
+ ctxNames.has(call.firstArgName)
115
+ ? pair.objName
116
+ : null;
117
+ };
118
+ /** Check if a callee is a member-style `ctx.service(...)` call. */
119
+ const isMemberServiceCall = (callee, ctxNames) => {
120
+ const pair = extractMemberPair(callee);
121
+ return !!pair && ctxNames.has(pair.objName) && pair.propName === 'service';
122
+ };
123
+ /** Extract `ctx.service(db)` and destructured `service(db)` lookup names. */
124
+ const extractLookupServiceName = (node, ctxNames, serviceAliases) => {
125
+ const callee = extractCallCallee(node);
126
+ if (!callee) {
127
+ return null;
128
+ }
129
+ if (isMemberServiceCall(callee, ctxNames)) {
130
+ return extractFirstIdentifierArg(node);
131
+ }
132
+ if (serviceAliases.has(identifierName(callee) ?? '')) {
133
+ return extractFirstIdentifierArg(node);
134
+ }
135
+ return null;
136
+ };
137
+ /** Extract `ctx.service('id')` and destructured `service('id')` lookup IDs. */
138
+ const extractLookupServiceId = (node, ctxNames, serviceAliases) => {
139
+ const callee = extractCallCallee(node);
140
+ if (!callee) {
141
+ return null;
142
+ }
143
+ if (isMemberServiceCall(callee, ctxNames)) {
144
+ return extractFirstStringArg(node);
145
+ }
146
+ const calleeName = identifierName(callee);
147
+ const args = node['arguments'];
148
+ if (calleeName && serviceAliases.has(calleeName) && args?.length === 1) {
149
+ return extractFirstStringArg(node);
150
+ }
151
+ return null;
152
+ };
153
+ /** Collect local aliases for the service accessor (e.g. `const { service } = ctx`). */
154
+ const collectServiceAliases = (body, ctxNames) => {
155
+ const aliases = new Set();
156
+ const extractAliasNames = (pattern) => {
157
+ if (pattern?.type !== 'ObjectPattern') {
158
+ return [];
159
+ }
160
+ const properties = pattern['properties'];
161
+ return (properties ?? []).flatMap((property) => {
162
+ if (property.type !== 'Property') {
163
+ return [];
164
+ }
165
+ const keyName = identifierName(property.key);
166
+ if (keyName !== 'service') {
167
+ return [];
168
+ }
169
+ const alias = identifierName(property.value) ??
170
+ keyName;
171
+ return [alias];
172
+ });
173
+ };
174
+ walkScope(body, (node) => {
175
+ if (node.type !== 'VariableDeclarator') {
176
+ return;
177
+ }
178
+ const { id, init } = node;
179
+ const initName = identifierName(init);
180
+ if (!initName || !ctxNames.has(initName)) {
181
+ return;
182
+ }
183
+ for (const alias of extractAliasNames(id)) {
184
+ aliases.add(alias);
185
+ }
186
+ });
187
+ return aliases;
188
+ };
189
+ /** Walk run bodies and collect service access that can be resolved statically. */
190
+ const extractCalledServices = (config) => {
191
+ const fromNames = new Set();
192
+ const lookupIds = new Set();
193
+ const lookupNames = new Set();
194
+ for (const body of findRunBodies(config)) {
195
+ const ctxNames = buildCtxNames(body);
196
+ const serviceAliases = collectServiceAliases(body, ctxNames);
197
+ walkScope(body, (node) => {
198
+ const fromName = extractFromCallName(node, ctxNames);
199
+ if (fromName) {
200
+ fromNames.add(fromName);
201
+ }
202
+ const lookupId = extractLookupServiceId(node, ctxNames, serviceAliases);
203
+ if (lookupId) {
204
+ lookupIds.add(lookupId);
205
+ }
206
+ const lookupName = extractLookupServiceName(node, ctxNames, serviceAliases);
207
+ if (lookupName) {
208
+ lookupNames.add(lookupName);
209
+ }
210
+ });
211
+ }
212
+ return { fromNames, lookupIds, lookupNames };
213
+ };
214
+ // ---------------------------------------------------------------------------
215
+ // Diagnostics
216
+ // ---------------------------------------------------------------------------
217
+ const renderDeclaredService = (service) => service.name ?? service.id ?? '<unknown>';
218
+ const buildUndeclaredFromDiagnostic = (trailId, serviceName, filePath, line) => ({
219
+ filePath,
220
+ line,
221
+ message: `Trail "${trailId}": ${serviceName}.from(ctx) called but '${serviceName}' is not declared in services`,
222
+ rule: 'service-declarations',
223
+ severity: 'error',
224
+ });
225
+ const buildUndeclaredLookupDiagnostic = (trailId, serviceId, filePath, line) => ({
226
+ filePath,
227
+ line,
228
+ message: `Trail "${trailId}": ctx.service('${serviceId}') called but '${serviceId}' is not declared in services`,
229
+ rule: 'service-declarations',
230
+ severity: 'error',
231
+ });
232
+ const buildUndeclaredLookupNameDiagnostic = (trailId, serviceName, filePath, line) => ({
233
+ filePath,
234
+ line,
235
+ message: `Trail "${trailId}": ctx.service(${serviceName}) called but '${serviceName}' is not declared in services`,
236
+ rule: 'service-declarations',
237
+ severity: 'error',
238
+ });
239
+ const buildUnusedDiagnostic = (trailId, declaredService, filePath, line) => ({
240
+ filePath,
241
+ line,
242
+ message: `Trail "${trailId}": '${renderDeclaredService(declaredService)}' declared in services but never used`,
243
+ rule: 'service-declarations',
244
+ severity: 'warn',
245
+ });
246
+ // ---------------------------------------------------------------------------
247
+ // Comparison
248
+ // ---------------------------------------------------------------------------
249
+ const serviceWasUsed = (declaredService, calledServices) => {
250
+ if (declaredService.name &&
251
+ (calledServices.fromNames.has(declaredService.name) ||
252
+ calledServices.lookupNames.has(declaredService.name))) {
253
+ return true;
254
+ }
255
+ if (declaredService.id && calledServices.lookupIds.has(declaredService.id)) {
256
+ return true;
257
+ }
258
+ return false;
259
+ };
260
+ const buildDeclaredNames = (declaredServices) => new Set(declaredServices.flatMap((service) => (service.name ? [service.name] : [])));
261
+ const buildDeclaredIds = (declaredServices) => new Set(declaredServices.flatMap((service) => (service.id ? [service.id] : [])));
262
+ const reportUndeclaredFromCalls = (trailId, filePath, line, calledServices, declaredNames, diagnostics) => {
263
+ for (const serviceName of calledServices.fromNames) {
264
+ if (!declaredNames.has(serviceName)) {
265
+ diagnostics.push(buildUndeclaredFromDiagnostic(trailId, serviceName, filePath, line));
266
+ }
267
+ }
268
+ };
269
+ const reportUndeclaredLookupCalls = (trailId, filePath, line, calledServices, declaredIds, declaredNames, diagnostics) => {
270
+ for (const serviceName of calledServices.lookupNames) {
271
+ // Name-based lookup checks remain reliable even when an imported service ID
272
+ // cannot be resolved locally.
273
+ if (!declaredNames.has(serviceName)) {
274
+ diagnostics.push(buildUndeclaredLookupNameDiagnostic(trailId, serviceName, filePath, line));
275
+ }
276
+ }
277
+ for (const serviceId of calledServices.lookupIds) {
278
+ if (!declaredIds.has(serviceId)) {
279
+ diagnostics.push(buildUndeclaredLookupDiagnostic(trailId, serviceId, filePath, line));
280
+ }
281
+ }
282
+ };
283
+ const reportUnusedDeclarations = (trailId, filePath, line, declaredServices, calledServices, diagnostics) => {
284
+ for (const declaredService of declaredServices) {
285
+ if (serviceWasUsed(declaredService, calledServices)) {
286
+ continue;
287
+ }
288
+ if (declaredService.name && declaredService.id === null) {
289
+ continue;
290
+ }
291
+ diagnostics.push(buildUnusedDiagnostic(trailId, declaredService, filePath, line));
292
+ }
293
+ };
294
+ const hasNoServiceActivity = (declaredServices, calledServices) => declaredServices.length === 0 &&
295
+ calledServices.fromNames.size === 0 &&
296
+ calledServices.lookupIds.size === 0 &&
297
+ calledServices.lookupNames.size === 0;
298
+ const analyzeTrailServices = (def, sourceCode, serviceIdsByName) => {
299
+ const declaredServices = extractDeclaredServices(def.config, serviceIdsByName);
300
+ return {
301
+ calledServices: extractCalledServices(def.config),
302
+ declaredIds: buildDeclaredIds(declaredServices),
303
+ declaredNames: buildDeclaredNames(declaredServices),
304
+ declaredServices,
305
+ line: offsetToLine(sourceCode, def.start),
306
+ };
307
+ };
308
+ const checkTrailDefinition = (def, filePath, sourceCode, serviceIdsByName, diagnostics) => {
309
+ const { calledServices, declaredIds, declaredNames, declaredServices, line } = analyzeTrailServices(def, sourceCode, serviceIdsByName);
310
+ if (hasNoServiceActivity(declaredServices, calledServices)) {
311
+ return;
312
+ }
313
+ reportUndeclaredFromCalls(def.id, filePath, line, calledServices, declaredNames, diagnostics);
314
+ reportUndeclaredLookupCalls(def.id, filePath, line, calledServices, declaredIds, declaredNames, diagnostics);
315
+ reportUnusedDeclarations(def.id, filePath, line, declaredServices, calledServices, diagnostics);
316
+ };
317
+ // ---------------------------------------------------------------------------
318
+ // Rule
319
+ // ---------------------------------------------------------------------------
320
+ /**
321
+ * Validates that service access aligns with declared `services` arrays.
322
+ */
323
+ export const serviceDeclarations = {
324
+ check(sourceCode, filePath) {
325
+ if (isTestFile(filePath)) {
326
+ return [];
327
+ }
328
+ const ast = parse(filePath, sourceCode);
329
+ if (!ast) {
330
+ return [];
331
+ }
332
+ const diagnostics = [];
333
+ const serviceIdsByName = collectNamedServiceIds(ast);
334
+ for (const def of findTrailDefinitions(ast)) {
335
+ checkTrailDefinition(def, filePath, sourceCode, serviceIdsByName, diagnostics);
336
+ }
337
+ return diagnostics;
338
+ },
339
+ description: 'Ensure service.from(ctx) and ctx.service() calls match the declared services array in trail definitions.',
340
+ name: 'service-declarations',
341
+ severity: 'error',
342
+ };
343
+ //# sourceMappingURL=service-declarations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-declarations.js","sourceRoot":"","sources":["../../src/rules/service-declarations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ProjectAwareWardenRule } from './types.js';
2
+ /**
3
+ * Checks that all declared services resolve to known service definitions.
4
+ */
5
+ export declare const serviceExists: ProjectAwareWardenRule;
6
+ //# sourceMappingURL=service-exists.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-exists.d.ts","sourceRoot":"","sources":["../../src/rules/service-exists.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,sBAAsB,EAGvB,MAAM,YAAY,CAAC;AA4HpB;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,sBA+B3B,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { collectNamedServiceIds, collectServiceDefinitionIds, extractFirstStringArg, findConfigProperty, findTrailDefinitions, getStringValue, identifierName, isStringLiteral, offsetToLine, parse, } from './ast.js';
2
+ import { isTestFile } from './scan.js';
3
+ const isServiceCall = (node) => node.type === 'CallExpression' &&
4
+ identifierName(node.callee) ===
5
+ 'service';
6
+ const getServiceElements = (config) => {
7
+ const servicesProp = findConfigProperty(config, 'services');
8
+ if (!servicesProp) {
9
+ return [];
10
+ }
11
+ const arrayNode = servicesProp.value;
12
+ if (!arrayNode || arrayNode.type !== 'ArrayExpression') {
13
+ return [];
14
+ }
15
+ const elements = arrayNode['elements'];
16
+ return elements ?? [];
17
+ };
18
+ const extractDeclaredServiceId = (element, serviceIdsByName) => {
19
+ if (element.type === 'Identifier') {
20
+ const name = identifierName(element);
21
+ return name ? (serviceIdsByName.get(name) ?? null) : null;
22
+ }
23
+ if (isStringLiteral(element)) {
24
+ return getStringValue(element);
25
+ }
26
+ return isServiceCall(element) ? extractFirstStringArg(element) : null;
27
+ };
28
+ const extractDeclaredServiceIds = (config, serviceIdsByName) => [
29
+ ...new Set(getServiceElements(config).flatMap((element) => {
30
+ const id = extractDeclaredServiceId(element, serviceIdsByName);
31
+ return id ? [id] : [];
32
+ })),
33
+ ];
34
+ const buildMissingServiceDiagnostic = (trailId, serviceId, filePath, line) => ({
35
+ filePath,
36
+ line,
37
+ message: `Trail "${trailId}" declares service "${serviceId}" which is not defined in the project.`,
38
+ rule: 'service-exists',
39
+ severity: 'error',
40
+ });
41
+ const reportMissingServices = (def, sourceCode, serviceIdsByName, filePath, knownServiceIds, diagnostics) => {
42
+ const line = offsetToLine(sourceCode, def.start);
43
+ for (const serviceId of extractDeclaredServiceIds(def.config, serviceIdsByName)) {
44
+ if (!knownServiceIds.has(serviceId)) {
45
+ diagnostics.push(buildMissingServiceDiagnostic(def.id, serviceId, filePath, line));
46
+ }
47
+ }
48
+ };
49
+ const buildServiceDiagnostics = (ast, sourceCode, filePath, knownServiceIds) => {
50
+ const diagnostics = [];
51
+ const serviceIdsByName = collectNamedServiceIds(ast);
52
+ for (const def of findTrailDefinitions(ast)) {
53
+ reportMissingServices(def, sourceCode, serviceIdsByName, filePath, knownServiceIds, diagnostics);
54
+ }
55
+ return diagnostics;
56
+ };
57
+ const checkServicesExist = (sourceCode, filePath, knownServiceIds) => {
58
+ if (isTestFile(filePath)) {
59
+ return [];
60
+ }
61
+ const ast = parse(filePath, sourceCode);
62
+ if (!ast) {
63
+ return [];
64
+ }
65
+ return buildServiceDiagnostics(ast, sourceCode, filePath, knownServiceIds);
66
+ };
67
+ /**
68
+ * Checks that all declared services resolve to known service definitions.
69
+ */
70
+ export const serviceExists = {
71
+ check(sourceCode, filePath) {
72
+ const ast = parse(filePath, sourceCode);
73
+ if (!ast) {
74
+ return [];
75
+ }
76
+ return checkServicesExist(sourceCode, filePath, collectServiceDefinitionIds(ast));
77
+ },
78
+ checkWithContext(sourceCode, filePath, context) {
79
+ const ast = parse(filePath, sourceCode);
80
+ const localServiceIds = ast
81
+ ? collectServiceDefinitionIds(ast)
82
+ : new Set();
83
+ return checkServicesExist(sourceCode, filePath, context.knownServiceIds ?? localServiceIds);
84
+ },
85
+ description: 'Ensure every service declared on a trail resolves to a known service definition.',
86
+ name: 'service-exists',
87
+ severity: 'error',
88
+ };
89
+ //# sourceMappingURL=service-exists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-exists.js","sourceRoot":"","sources":["../../src/rules/service-exists.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,8 @@ export interface WardenRule {
39
39
  export interface ProjectContext {
40
40
  /** All known trail IDs in the project */
41
41
  readonly knownTrailIds: ReadonlySet<string>;
42
+ /** All known service IDs in the project */
43
+ readonly knownServiceIds?: ReadonlySet<string>;
42
44
  /** All trail IDs referenced as detour targets across the project */
43
45
  readonly detourTargetTrailIds?: ReadonlySet<string>;
44
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qBAAqB;IACrB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,sDAAsD;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uBAAuB;IACvB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,CACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,KACb,SAAS,gBAAgB,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5C,oEAAoE;IACpE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,UAAU;IACxD,8CAA8C;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,CACzB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,KACpB,SAAS,gBAAgB,EAAE,CAAC;CAClC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qBAAqB;IACrB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,sDAAsD;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uBAAuB;IACvB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,CACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,KACb,SAAS,gBAAgB,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5C,2CAA2C;IAC3C,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/C,oEAAoE;IACpE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACrD;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,UAAU;IACxD,8CAA8C;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,CACzB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,KACpB,SAAS,gBAAgB,EAAE,CAAC;CAClC"}
@@ -7,6 +7,8 @@ export { noSyncResultAssumptionTrail } from './no-sync-result-assumption.trail.j
7
7
  export { noThrowInDetourTargetTrail } from './no-throw-in-detour-target.trail.js';
8
8
  export { noThrowInImplementationTrail } from './no-throw-in-implementation.trail.js';
9
9
  export { preferSchemaInferenceTrail } from './prefer-schema-inference.trail.js';
10
+ export { serviceDeclarationsTrail } from './service-declarations.trail.js';
11
+ export { serviceExistsTrail } from './service-exists.trail.js';
10
12
  export { validDescribeRefsTrail } from './valid-describe-refs.trail.js';
11
13
  export { validDetourRefsTrail } from './valid-detour-refs.trail.js';
12
14
  export { ruleInput, ruleOutput, diagnosticSchema } from './schema.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trails/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,gCAAgC,EAAE,MAAM,0CAA0C,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,+BAA+B,EAAE,MAAM,0CAA0C,CAAC;AAC3F,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/trails/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,gCAAgC,EAAE,MAAM,0CAA0C,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,+BAA+B,EAAE,MAAM,0CAA0C,CAAC;AAC3F,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
@@ -7,6 +7,8 @@ export { noSyncResultAssumptionTrail } from './no-sync-result-assumption.trail.j
7
7
  export { noThrowInDetourTargetTrail } from './no-throw-in-detour-target.trail.js';
8
8
  export { noThrowInImplementationTrail } from './no-throw-in-implementation.trail.js';
9
9
  export { preferSchemaInferenceTrail } from './prefer-schema-inference.trail.js';
10
+ export { serviceDeclarationsTrail } from './service-declarations.trail.js';
11
+ export { serviceExistsTrail } from './service-exists.trail.js';
10
12
  export { validDescribeRefsTrail } from './valid-describe-refs.trail.js';
11
13
  export { validDetourRefsTrail } from './valid-detour-refs.trail.js';
12
14
  export { ruleInput, ruleOutput, diagnosticSchema } from './schema.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/trails/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,gCAAgC,EAAE,MAAM,0CAA0C,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,+BAA+B,EAAE,MAAM,0CAA0C,CAAC;AAC3F,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/trails/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,gCAAgC,EAAE,MAAM,0CAA0C,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,+BAA+B,EAAE,MAAM,0CAA0C,CAAC;AAC3F,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
@@ -1,6 +1,7 @@
1
1
  export declare const noThrowInDetourTargetTrail: import("@ontrails/core").Trail<{
2
2
  filePath: string;
3
3
  sourceCode: string;
4
+ knownServiceIds?: string[] | undefined;
4
5
  knownTrailIds?: string[] | undefined;
5
6
  }, {
6
7
  diagnostics: {
@@ -1 +1 @@
1
- {"version":3,"file":"no-throw-in-detour-target.trail.d.ts","sourceRoot":"","sources":["../../src/trails/no-throw-in-detour-target.trail.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,0BAA0B;;;;;;;;;;;;EAgBrC,CAAC"}
1
+ {"version":3,"file":"no-throw-in-detour-target.trail.d.ts","sourceRoot":"","sources":["../../src/trails/no-throw-in-detour-target.trail.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;EAgBrC,CAAC"}
@@ -11,6 +11,7 @@ import type { WardenDiagnostic } from '../rules/types.js';
11
11
  * silently skipped so that one broken rule does not block the rest.
12
12
  */
13
13
  export declare const runWardenTrails: (filePath: string, sourceCode: string, options?: {
14
+ readonly knownServiceIds?: readonly string[];
14
15
  readonly knownTrailIds?: readonly string[];
15
16
  }) => Promise<readonly WardenDiagnostic[]>;
16
17
  //# sourceMappingURL=run.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/trails/run.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAChB,YAAY,MAAM,EAClB,UAAU;IAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,KACvD,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAiBrC,CAAC"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/trails/run.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAChB,YAAY,MAAM,EAClB,UAAU;IACR,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C,KACA,OAAO,CAAC,SAAS,gBAAgB,EAAE,CA2BrC,CAAC"}
@@ -14,8 +14,17 @@ import { wardenTopo } from './topo.js';
14
14
  export const runWardenTrails = async (filePath, sourceCode, options) => {
15
15
  const allDiagnostics = [];
16
16
  for (const id of wardenTopo.ids()) {
17
- const input = options?.knownTrailIds
18
- ? { filePath, knownTrailIds: options.knownTrailIds, sourceCode }
17
+ const input = options?.knownTrailIds || options?.knownServiceIds
18
+ ? {
19
+ filePath,
20
+ ...(options?.knownServiceIds
21
+ ? { knownServiceIds: options.knownServiceIds }
22
+ : {}),
23
+ ...(options?.knownTrailIds
24
+ ? { knownTrailIds: options.knownTrailIds }
25
+ : {}),
26
+ sourceCode,
27
+ }
19
28
  : { filePath, sourceCode };
20
29
  const result = await dispatch(wardenTopo, id, input);
21
30
  if (result.isOk()) {
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/trails/run.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,QAAgB,EAChB,UAAkB,EAClB,OAAwD,EAClB,EAAE;IACxC,MAAM,cAAc,GAAuB,EAAE,CAAC;IAE9C,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,OAAO,EAAE,aAAa;YAClC,CAAC,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE;YAChE,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,KAAmB,CAAC;YACnD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC5B,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/trails/run.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,QAAgB,EAChB,UAAkB,EAClB,OAGC,EACqC,EAAE;IACxC,MAAM,cAAc,GAAuB,EAAE,CAAC;IAE9C,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;QAClC,MAAM,KAAK,GACT,OAAO,EAAE,aAAa,IAAI,OAAO,EAAE,eAAe;YAChD,CAAC,CAAC;gBACE,QAAQ;gBACR,GAAG,CAAC,OAAO,EAAE,eAAe;oBAC1B,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE;oBAC9C,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,OAAO,EAAE,aAAa;oBACxB,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE;oBAC1C,CAAC,CAAC,EAAE,CAAC;gBACP,UAAU;aACX;YACH,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,KAAmB,CAAC;YACnD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC5B,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC"}
@@ -31,6 +31,7 @@ export declare const ruleInput: z.ZodObject<{
31
31
  export declare const projectAwareRuleInput: z.ZodObject<{
32
32
  filePath: z.ZodString;
33
33
  sourceCode: z.ZodString;
34
+ knownServiceIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
34
35
  knownTrailIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
35
36
  }, z.core.$strip>;
36
37
  /** Output returned by every warden rule trail. */
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/trails/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB;;;;;;;;;iBAM3B,CAAC;AAEH,iDAAiD;AACjD,eAAO,MAAM,SAAS;;;iBAGpB,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB;;;;iBAKhC,CAAC;AAEH,kDAAkD;AAClD,eAAO,MAAM,UAAU;;;;;;;;;;;iBAErB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAClD,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAC1E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/trails/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB;;;;;;;;;iBAM3B,CAAC;AAEH,iDAAiD;AACjD,eAAO,MAAM,SAAS;;;iBAGpB,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB;;;;;iBAShC,CAAC;AAEH,kDAAkD;AAClD,eAAO,MAAM,UAAU;;;;;;;;;;;iBAErB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAClD,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAC1E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC"}
@@ -26,6 +26,10 @@ export const ruleInput = z.object({
26
26
  * files.
27
27
  */
28
28
  export const projectAwareRuleInput = ruleInput.extend({
29
+ knownServiceIds: z
30
+ .array(z.string())
31
+ .optional()
32
+ .describe('Service IDs known across the project'),
29
33
  knownTrailIds: z
30
34
  .array(z.string())
31
35
  .optional()
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/trails/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC5D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAChD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IACjE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;CACpE,CAAC,CAAC;AAEH,iDAAiD;AACjD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACxD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;CACvD,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,SAAS,CAAC,MAAM,CAAC;IACpD,aAAa,EAAE,CAAC;SACb,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,oCAAoC,CAAC;CAClD,CAAC,CAAC;AAEH,kDAAkD;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;CACrE,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/trails/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC5D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAChD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IACjE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC;CACpE,CAAC,CAAC;AAEH,iDAAiD;AACjD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IACxD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;CACvD,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,SAAS,CAAC,MAAM,CAAC;IACpD,eAAe,EAAE,CAAC;SACf,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,sCAAsC,CAAC;IACnD,aAAa,EAAE,CAAC;SACb,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,oCAAoC,CAAC;CAClD,CAAC,CAAC;AAEH,kDAAkD;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;CACrE,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare const serviceDeclarationsTrail: import("@ontrails/core").Trail<{
2
+ filePath: string;
3
+ sourceCode: string;
4
+ }, {
5
+ diagnostics: {
6
+ filePath: string;
7
+ line: number;
8
+ message: string;
9
+ rule: string;
10
+ severity: "error" | "warn";
11
+ }[];
12
+ }>;
13
+ //# sourceMappingURL=service-declarations.trail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-declarations.trail.d.ts","sourceRoot":"","sources":["../../src/trails/service-declarations.trail.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,wBAAwB;;;;;;;;;;;EAqBnC,CAAC"}