@ontrails/warden 1.0.0-beta.3 → 1.0.0-beta.30

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 (260) hide show
  1. package/CHANGELOG.md +625 -9
  2. package/README.md +111 -26
  3. package/bin/warden.ts +50 -0
  4. package/package.json +28 -5
  5. package/src/adapter-check.ts +136 -0
  6. package/src/ast.ts +137 -0
  7. package/src/cli.ts +1415 -104
  8. package/src/command.ts +943 -0
  9. package/src/config.ts +184 -0
  10. package/src/draft.ts +22 -0
  11. package/src/drift.ts +122 -22
  12. package/src/fix.ts +120 -0
  13. package/src/formatters.ts +79 -9
  14. package/src/guide.ts +245 -0
  15. package/src/index.ts +215 -14
  16. package/src/project-context.ts +163 -0
  17. package/src/project-rules.ts +290 -0
  18. package/src/resolve.ts +531 -0
  19. package/src/rules/activation-orphan.ts +97 -0
  20. package/src/rules/ast.ts +4008 -86
  21. package/src/rules/circular-refs.ts +154 -0
  22. package/src/rules/cli-command-route-coherence.ts +177 -0
  23. package/src/rules/composes-declarations.ts +837 -0
  24. package/src/rules/context-no-surface-types.ts +78 -15
  25. package/src/rules/contour-exists.ts +251 -0
  26. package/src/rules/contour-ids.ts +15 -0
  27. package/src/rules/dead-internal-trail.ts +161 -0
  28. package/src/rules/dead-public-trail.ts +258 -0
  29. package/src/rules/draft-file-marking.ts +160 -0
  30. package/src/rules/draft-visible-debt.ts +87 -0
  31. package/src/rules/duplicate-public-contract.ts +91 -0
  32. package/src/rules/error-mapping-completeness.ts +290 -0
  33. package/src/rules/example-valid.ts +395 -0
  34. package/src/rules/fires-declarations.ts +735 -0
  35. package/src/rules/implementation-returns-result.ts +1411 -166
  36. package/src/rules/incomplete-accessor-for-standard-op.ts +272 -0
  37. package/src/rules/incomplete-crud.ts +581 -0
  38. package/src/rules/index.ts +234 -18
  39. package/src/rules/intent-propagation.ts +127 -0
  40. package/src/rules/layer-field-name-drift.ts +102 -0
  41. package/src/rules/library-projection-coherence.ts +100 -0
  42. package/src/rules/metadata.ts +755 -0
  43. package/src/rules/missing-reconcile.ts +98 -0
  44. package/src/rules/missing-visibility.ts +110 -0
  45. package/src/rules/no-destructured-compose.ts +194 -0
  46. package/src/rules/no-dev-permit-in-source.ts +99 -0
  47. package/src/rules/no-direct-implementation-call.ts +7 -7
  48. package/src/rules/no-legacy-layer-imports.ts +211 -0
  49. package/src/rules/no-native-error-result.ts +118 -0
  50. package/src/rules/no-redundant-result-error-wrap.ts +384 -0
  51. package/src/rules/no-retired-cross-vocabulary.ts +194 -0
  52. package/src/rules/no-sync-result-assumption.ts +1135 -98
  53. package/src/rules/no-throw-in-detour-recover.ts +225 -0
  54. package/src/rules/no-throw-in-implementation.ts +10 -9
  55. package/src/rules/no-top-level-surface.ts +371 -0
  56. package/src/rules/on-references-exist.ts +194 -0
  57. package/src/rules/orphaned-signal.ts +150 -0
  58. package/src/rules/owner-projection-parity.ts +143 -0
  59. package/src/rules/permit-governance.ts +25 -0
  60. package/src/rules/public-export-example-coverage.ts +562 -0
  61. package/src/rules/public-internal-deep-imports.ts +517 -0
  62. package/src/rules/public-output-schema.ts +29 -0
  63. package/src/rules/public-union-output-discriminants.ts +150 -0
  64. package/src/rules/read-intent-fires.ts +187 -0
  65. package/src/rules/reference-exists.ts +98 -0
  66. package/src/rules/registry-names.ts +155 -0
  67. package/src/rules/resolved-import-boundary.ts +146 -0
  68. package/src/rules/resource-declarations.ts +693 -0
  69. package/src/rules/resource-exists.ts +179 -0
  70. package/src/rules/resource-id-grammar.ts +65 -0
  71. package/src/rules/resource-mock-coverage.ts +115 -0
  72. package/src/rules/scan.ts +38 -25
  73. package/src/rules/scheduled-destroy-intent.ts +44 -0
  74. package/src/rules/signal-graph-coaching.ts +191 -0
  75. package/src/rules/specs.ts +9 -5
  76. package/src/rules/static-resource-accessor-preference.ts +649 -0
  77. package/src/rules/surface-facet-coherence.ts +362 -0
  78. package/src/rules/trail-fork-coaching.ts +616 -0
  79. package/src/rules/trail-versioning-source.ts +1072 -0
  80. package/src/rules/trail-versioning-topo.ts +172 -0
  81. package/src/rules/types.ts +272 -6
  82. package/src/rules/unmaterialized-activation-source.ts +84 -0
  83. package/src/rules/unreachable-detour-shadowing.ts +339 -0
  84. package/src/rules/valid-describe-refs.ts +162 -32
  85. package/src/rules/valid-detour-contract.ts +78 -0
  86. package/src/rules/warden-export-symmetry.ts +540 -0
  87. package/src/rules/warden-rules-use-ast.ts +1114 -0
  88. package/src/rules/webhook-route-collision.ts +243 -0
  89. package/src/trails/activation-orphan.trail.ts +84 -0
  90. package/src/trails/circular-refs.trail.ts +29 -0
  91. package/src/trails/cli-command-route-coherence.trail.ts +47 -0
  92. package/src/trails/composes-declarations.trail.ts +22 -0
  93. package/src/trails/context-no-surface-types.trail.ts +21 -0
  94. package/src/trails/contour-exists.trail.ts +21 -0
  95. package/src/trails/dead-internal-trail.trail.ts +26 -0
  96. package/src/trails/dead-public-trail.trail.ts +31 -0
  97. package/src/trails/deprecation-without-guidance.trail.ts +21 -0
  98. package/src/trails/draft-file-marking.trail.ts +16 -0
  99. package/src/trails/draft-visible-debt.trail.ts +16 -0
  100. package/src/trails/duplicate-public-contract.trail.ts +47 -0
  101. package/src/trails/error-mapping-completeness.trail.ts +30 -0
  102. package/src/trails/example-valid.trail.ts +25 -0
  103. package/src/trails/fires-declarations.trail.ts +23 -0
  104. package/src/trails/fork-without-preserved-blaze.trail.ts +31 -0
  105. package/src/trails/implementation-returns-result.trail.ts +20 -0
  106. package/src/trails/incomplete-accessor-for-standard-op.trail.ts +76 -0
  107. package/src/trails/incomplete-crud.trail.ts +39 -0
  108. package/src/trails/index.ts +83 -0
  109. package/src/trails/intent-propagation.trail.ts +30 -0
  110. package/src/trails/layer-field-name-drift.trail.ts +39 -0
  111. package/src/trails/library-projection-coherence.trail.ts +43 -0
  112. package/src/trails/marker-schema-unsupported.trail.ts +23 -0
  113. package/src/trails/missing-reconcile.trail.ts +33 -0
  114. package/src/trails/missing-visibility.trail.ts +22 -0
  115. package/src/trails/no-destructured-compose.trail.ts +44 -0
  116. package/src/trails/no-dev-permit-in-source.trail.ts +16 -0
  117. package/src/trails/no-direct-implementation-call.trail.ts +16 -0
  118. package/src/trails/no-legacy-layer-imports.trail.ts +41 -0
  119. package/src/trails/no-native-error-result.trail.ts +18 -0
  120. package/src/trails/no-redundant-result-error-wrap.trail.ts +55 -0
  121. package/src/trails/no-retired-cross-vocabulary.trail.ts +42 -0
  122. package/src/trails/no-sync-result-assumption.trail.ts +19 -0
  123. package/src/trails/no-throw-in-detour-recover.trail.ts +24 -0
  124. package/src/trails/no-throw-in-implementation.trail.ts +20 -0
  125. package/src/trails/no-top-level-surface.trail.ts +43 -0
  126. package/src/trails/on-references-exist.trail.ts +21 -0
  127. package/src/trails/orphaned-signal.trail.ts +36 -0
  128. package/src/trails/owner-projection-parity.trail.ts +26 -0
  129. package/src/trails/pending-force.trail.ts +21 -0
  130. package/src/trails/permit-governance.trail.ts +51 -0
  131. package/src/trails/prefer-schema-inference.trail.ts +21 -0
  132. package/src/trails/public-export-example-coverage.trail.ts +16 -0
  133. package/src/trails/public-internal-deep-imports.trail.ts +94 -0
  134. package/src/trails/public-output-schema.trail.ts +55 -0
  135. package/src/trails/public-union-output-discriminants.trail.ts +33 -0
  136. package/src/trails/read-intent-fires.trail.ts +20 -0
  137. package/src/trails/reference-exists.trail.ts +25 -0
  138. package/src/trails/resolved-import-boundary.trail.ts +109 -0
  139. package/src/trails/resource-declarations.trail.ts +25 -0
  140. package/src/trails/resource-exists.trail.ts +27 -0
  141. package/src/trails/resource-id-grammar.trail.ts +39 -0
  142. package/src/trails/resource-mock-coverage.trail.ts +40 -0
  143. package/src/trails/run.ts +162 -0
  144. package/src/trails/scheduled-destroy-intent.trail.ts +56 -0
  145. package/src/trails/schema.ts +198 -0
  146. package/src/trails/signal-graph-coaching.trail.ts +77 -0
  147. package/src/trails/static-resource-accessor-preference.trail.ts +25 -0
  148. package/src/trails/surface-facet-coherence.trail.ts +25 -0
  149. package/src/trails/topo.ts +6 -0
  150. package/src/trails/trail-fork-coaching.trail.ts +42 -0
  151. package/src/trails/unmaterialized-activation-source.trail.ts +72 -0
  152. package/src/trails/unreachable-detour-shadowing.trail.ts +45 -0
  153. package/src/trails/valid-describe-refs.trail.ts +18 -0
  154. package/src/trails/valid-detour-contract.trail.ts +71 -0
  155. package/src/trails/version-gap.trail.ts +35 -0
  156. package/src/trails/version-pinned-compose.trail.ts +23 -0
  157. package/src/trails/version-without-examples.trail.ts +38 -0
  158. package/src/trails/warden-export-symmetry.trail.ts +16 -0
  159. package/src/trails/warden-rules-use-ast.trail.ts +64 -0
  160. package/src/trails/webhook-route-collision.trail.ts +50 -0
  161. package/src/trails/wrap-rule.ts +214 -0
  162. package/src/workspaces.ts +238 -0
  163. package/.turbo/turbo-build.log +0 -1
  164. package/.turbo/turbo-lint.log +0 -3
  165. package/.turbo/turbo-typecheck.log +0 -1
  166. package/dist/cli.d.ts +0 -46
  167. package/dist/cli.d.ts.map +0 -1
  168. package/dist/cli.js +0 -221
  169. package/dist/cli.js.map +0 -1
  170. package/dist/drift.d.ts +0 -26
  171. package/dist/drift.d.ts.map +0 -1
  172. package/dist/drift.js +0 -27
  173. package/dist/drift.js.map +0 -1
  174. package/dist/formatters.d.ts +0 -29
  175. package/dist/formatters.d.ts.map +0 -1
  176. package/dist/formatters.js +0 -87
  177. package/dist/formatters.js.map +0 -1
  178. package/dist/index.d.ts +0 -26
  179. package/dist/index.d.ts.map +0 -1
  180. package/dist/index.js +0 -26
  181. package/dist/index.js.map +0 -1
  182. package/dist/rules/ast.d.ts +0 -41
  183. package/dist/rules/ast.d.ts.map +0 -1
  184. package/dist/rules/ast.js +0 -163
  185. package/dist/rules/ast.js.map +0 -1
  186. package/dist/rules/context-no-surface-types.d.ts +0 -12
  187. package/dist/rules/context-no-surface-types.d.ts.map +0 -1
  188. package/dist/rules/context-no-surface-types.js +0 -96
  189. package/dist/rules/context-no-surface-types.js.map +0 -1
  190. package/dist/rules/implementation-returns-result.d.ts +0 -13
  191. package/dist/rules/implementation-returns-result.d.ts.map +0 -1
  192. package/dist/rules/implementation-returns-result.js +0 -277
  193. package/dist/rules/implementation-returns-result.js.map +0 -1
  194. package/dist/rules/index.d.ts +0 -22
  195. package/dist/rules/index.d.ts.map +0 -1
  196. package/dist/rules/index.js +0 -41
  197. package/dist/rules/index.js.map +0 -1
  198. package/dist/rules/no-direct-impl-in-route.d.ts +0 -12
  199. package/dist/rules/no-direct-impl-in-route.d.ts.map +0 -1
  200. package/dist/rules/no-direct-impl-in-route.js +0 -46
  201. package/dist/rules/no-direct-impl-in-route.js.map +0 -1
  202. package/dist/rules/no-direct-implementation-call.d.ts +0 -12
  203. package/dist/rules/no-direct-implementation-call.d.ts.map +0 -1
  204. package/dist/rules/no-direct-implementation-call.js +0 -39
  205. package/dist/rules/no-direct-implementation-call.js.map +0 -1
  206. package/dist/rules/no-sync-result-assumption.d.ts +0 -6
  207. package/dist/rules/no-sync-result-assumption.d.ts.map +0 -1
  208. package/dist/rules/no-sync-result-assumption.js +0 -98
  209. package/dist/rules/no-sync-result-assumption.js.map +0 -1
  210. package/dist/rules/no-throw-in-detour-target.d.ts +0 -12
  211. package/dist/rules/no-throw-in-detour-target.d.ts.map +0 -1
  212. package/dist/rules/no-throw-in-detour-target.js +0 -87
  213. package/dist/rules/no-throw-in-detour-target.js.map +0 -1
  214. package/dist/rules/no-throw-in-implementation.d.ts +0 -9
  215. package/dist/rules/no-throw-in-implementation.d.ts.map +0 -1
  216. package/dist/rules/no-throw-in-implementation.js +0 -34
  217. package/dist/rules/no-throw-in-implementation.js.map +0 -1
  218. package/dist/rules/prefer-schema-inference.d.ts +0 -7
  219. package/dist/rules/prefer-schema-inference.d.ts.map +0 -1
  220. package/dist/rules/prefer-schema-inference.js +0 -86
  221. package/dist/rules/prefer-schema-inference.js.map +0 -1
  222. package/dist/rules/scan.d.ts +0 -8
  223. package/dist/rules/scan.d.ts.map +0 -1
  224. package/dist/rules/scan.js +0 -32
  225. package/dist/rules/scan.js.map +0 -1
  226. package/dist/rules/specs.d.ts +0 -29
  227. package/dist/rules/specs.d.ts.map +0 -1
  228. package/dist/rules/specs.js +0 -192
  229. package/dist/rules/specs.js.map +0 -1
  230. package/dist/rules/structure.d.ts +0 -13
  231. package/dist/rules/structure.d.ts.map +0 -1
  232. package/dist/rules/structure.js +0 -142
  233. package/dist/rules/structure.js.map +0 -1
  234. package/dist/rules/types.d.ts +0 -52
  235. package/dist/rules/types.d.ts.map +0 -1
  236. package/dist/rules/types.js +0 -2
  237. package/dist/rules/types.js.map +0 -1
  238. package/dist/rules/valid-describe-refs.d.ts +0 -7
  239. package/dist/rules/valid-describe-refs.d.ts.map +0 -1
  240. package/dist/rules/valid-describe-refs.js +0 -51
  241. package/dist/rules/valid-describe-refs.js.map +0 -1
  242. package/dist/rules/valid-detour-refs.d.ts +0 -6
  243. package/dist/rules/valid-detour-refs.d.ts.map +0 -1
  244. package/dist/rules/valid-detour-refs.js +0 -116
  245. package/dist/rules/valid-detour-refs.js.map +0 -1
  246. package/src/__tests__/cli.test.ts +0 -198
  247. package/src/__tests__/drift.test.ts +0 -74
  248. package/src/__tests__/formatters.test.ts +0 -157
  249. package/src/__tests__/implementation-returns-result.test.ts +0 -128
  250. package/src/__tests__/no-direct-implementation-call.test.ts +0 -83
  251. package/src/__tests__/no-sync-result-assumption.test.ts +0 -85
  252. package/src/__tests__/no-throw-in-detour-target.test.ts +0 -78
  253. package/src/__tests__/prefer-schema-inference.test.ts +0 -84
  254. package/src/__tests__/rules.test.ts +0 -215
  255. package/src/__tests__/valid-describe-refs.test.ts +0 -60
  256. package/src/rules/no-direct-impl-in-route.ts +0 -77
  257. package/src/rules/no-throw-in-detour-target.ts +0 -150
  258. package/src/rules/valid-detour-refs.ts +0 -187
  259. package/tsconfig.json +0 -9
  260. package/tsconfig.tsbuildinfo +0 -1
package/dist/cli.js DELETED
@@ -1,221 +0,0 @@
1
- /**
2
- * Warden CLI command runner.
3
- *
4
- * Scans TypeScript files, runs all warden rules, optionally checks drift,
5
- * and returns a structured report.
6
- */
7
- import { resolve } from 'node:path';
8
- import { checkDrift } from './drift.js';
9
- import { findConfigProperty, findTrailDefinitions, parse, walk, } from './rules/ast.js';
10
- import { wardenRules } from './rules/index.js';
11
- /**
12
- * Collect all .ts files under a directory, excluding node_modules, dist, and .git.
13
- */
14
- const isSourceFile = (match) => !match.endsWith('.d.ts') &&
15
- !match.startsWith('node_modules/') &&
16
- !match.startsWith('dist/') &&
17
- !match.startsWith('.git/') &&
18
- !match.includes('__tests__/') &&
19
- !match.includes('__test__/') &&
20
- !match.endsWith('.test.ts') &&
21
- !match.endsWith('.spec.ts');
22
- const collectTsFiles = (dir) => {
23
- const glob = new Bun.Glob('**/*.ts');
24
- let matches;
25
- try {
26
- matches = glob.scanSync({ cwd: dir, dot: false, onlyFiles: true });
27
- }
28
- catch {
29
- return [];
30
- }
31
- const files = [];
32
- for (const match of matches) {
33
- if (isSourceFile(match)) {
34
- files.push(`${dir}/${match}`);
35
- }
36
- }
37
- return files;
38
- };
39
- const collectKnownTrailIds = (sourceCode, filePath, knownTrailIds) => {
40
- const ast = parse(filePath, sourceCode);
41
- if (!ast) {
42
- return;
43
- }
44
- for (const def of findTrailDefinitions(ast)) {
45
- knownTrailIds.add(def.id);
46
- }
47
- };
48
- const collectDetourTargetTrailIds = (sourceCode, filePath, detourTargetTrailIds) => {
49
- const ast = parse(filePath, sourceCode);
50
- if (!ast) {
51
- return;
52
- }
53
- for (const def of findTrailDefinitions(ast)) {
54
- const detoursProp = findConfigProperty(def.config, 'detours');
55
- if (!detoursProp) {
56
- continue;
57
- }
58
- // Walk the detours value for string literals that look like trail IDs
59
- walk(detoursProp, (node) => {
60
- if (node.type !== 'Literal') {
61
- return;
62
- }
63
- const val = node.value;
64
- if (val && val.includes('.')) {
65
- detourTargetTrailIds.add(val);
66
- }
67
- });
68
- }
69
- };
70
- const loadSourceFiles = async (rootDir) => {
71
- const sourceFiles = [];
72
- for (const filePath of collectTsFiles(rootDir)) {
73
- try {
74
- sourceFiles.push({
75
- filePath,
76
- sourceCode: await Bun.file(filePath).text(),
77
- });
78
- }
79
- catch {
80
- continue;
81
- }
82
- }
83
- return sourceFiles;
84
- };
85
- const buildProjectContextFromTopo = (appTopo) => {
86
- const knownTrailIds = new Set([
87
- ...appTopo.trails.keys(),
88
- ...appTopo.hikes.keys(),
89
- ]);
90
- const detourTargetTrailIds = new Set();
91
- for (const t of [...appTopo.trails.values(), ...appTopo.hikes.values()]) {
92
- const detours = t['detours'];
93
- if (!detours) {
94
- continue;
95
- }
96
- for (const targets of Object.values(detours)) {
97
- for (const id of targets) {
98
- detourTargetTrailIds.add(id);
99
- }
100
- }
101
- }
102
- return { detourTargetTrailIds, knownTrailIds };
103
- };
104
- const buildProjectContextFromFiles = (sourceFiles) => {
105
- const knownTrailIds = new Set();
106
- const detourTargetTrailIds = new Set();
107
- for (const sourceFile of sourceFiles) {
108
- collectKnownTrailIds(sourceFile.sourceCode, sourceFile.filePath, knownTrailIds);
109
- collectDetourTargetTrailIds(sourceFile.sourceCode, sourceFile.filePath, detourTargetTrailIds);
110
- }
111
- return {
112
- detourTargetTrailIds,
113
- knownTrailIds,
114
- };
115
- };
116
- const isProjectAwareRule = (rule) => 'checkWithContext' in rule;
117
- /**
118
- * Lint all files against all warden rules.
119
- */
120
- const lintFiles = async (rootDir, appTopo) => {
121
- const allDiagnostics = [];
122
- const sourceFiles = await loadSourceFiles(rootDir);
123
- const context = appTopo
124
- ? buildProjectContextFromTopo(appTopo)
125
- : buildProjectContextFromFiles(sourceFiles);
126
- for (const sourceFile of sourceFiles) {
127
- for (const rule of wardenRules.values()) {
128
- if (isProjectAwareRule(rule)) {
129
- allDiagnostics.push(...rule.checkWithContext(sourceFile.sourceCode, sourceFile.filePath, context));
130
- continue;
131
- }
132
- allDiagnostics.push(...rule.check(sourceFile.sourceCode, sourceFile.filePath));
133
- }
134
- }
135
- return allDiagnostics;
136
- };
137
- /**
138
- * Run all warden checks and return a structured report.
139
- */
140
- export const runWarden = async (options = {}) => {
141
- const rootDir = resolve(options.rootDir ?? process.cwd());
142
- const allDiagnostics = options.driftOnly
143
- ? []
144
- : await lintFiles(rootDir, options.topo);
145
- const drift = options.lintOnly
146
- ? null
147
- : await checkDrift(rootDir, options.topo);
148
- const errorCount = allDiagnostics.filter((d) => d.severity === 'error').length;
149
- const warnCount = allDiagnostics.filter((d) => d.severity === 'warn').length;
150
- return {
151
- diagnostics: allDiagnostics,
152
- drift,
153
- errorCount,
154
- passed: errorCount === 0 && !(drift?.stale ?? false),
155
- warnCount,
156
- };
157
- };
158
- /**
159
- * Format the lint section of the report.
160
- */
161
- const formatLintSection = (report) => {
162
- if (report.diagnostics.length === 0) {
163
- return ['Lint: clean'];
164
- }
165
- const lines = [
166
- `Lint: ${report.errorCount} errors, ${report.warnCount} warnings`,
167
- ];
168
- for (const d of report.diagnostics) {
169
- const prefix = d.severity === 'error' ? 'ERROR' : 'WARN';
170
- lines.push(` ${d.filePath}:${String(d.line)} [${prefix}] ${d.rule} ${d.message}`);
171
- }
172
- return lines;
173
- };
174
- /**
175
- * Format the drift section of the report.
176
- */
177
- const formatDriftSection = (drift) => {
178
- if (drift === null) {
179
- return [];
180
- }
181
- const label = drift.stale
182
- ? 'Drift: surface.lock is stale (regenerate with `trails survey generate`)'
183
- : 'Drift: clean';
184
- return [label, ''];
185
- };
186
- /**
187
- * Format the result line.
188
- */
189
- const formatResultLine = (report) => {
190
- if (report.passed) {
191
- return 'Result: PASS';
192
- }
193
- const parts = [];
194
- if (report.errorCount > 0) {
195
- parts.push(`${report.errorCount} errors`);
196
- }
197
- if (report.drift?.stale) {
198
- parts.push('drift detected');
199
- }
200
- return `Result: FAIL (${parts.join(', ')})`;
201
- };
202
- /**
203
- * Format a warden report as a human-readable string.
204
- */
205
- export const formatWardenReport = (report) => {
206
- const lintLines = formatLintSection(report);
207
- const driftLines = formatDriftSection(report.drift);
208
- if (lintLines.length === 0 && driftLines.length === 0) {
209
- return ['Warden Report', '=============', '', 'No checks were run.'].join('\n');
210
- }
211
- return [
212
- 'Warden Report',
213
- '=============',
214
- '',
215
- ...lintLines,
216
- '',
217
- ...driftLines,
218
- formatResultLine(report),
219
- ].join('\n');
220
- };
221
- //# sourceMappingURL=cli.js.map
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/drift.d.ts DELETED
@@ -1,26 +0,0 @@
1
- /**
2
- * Surface lock drift detection.
3
- *
4
- * Compares the committed `surface.lock` hash against a freshly generated
5
- * surface map hash to detect when the trail topology has changed without
6
- * updating the lock file.
7
- */
8
- import type { Topo } from '@ontrails/core';
9
- /**
10
- * Result of a drift check comparing committed surface.lock against the current state.
11
- */
12
- export interface DriftResult {
13
- /** Whether the committed lock is out of date */
14
- readonly stale: boolean;
15
- /** Hash from the committed surface.lock file, or null if not found */
16
- readonly committedHash: string | null;
17
- /** Hash computed from the current trail topology */
18
- readonly currentHash: string;
19
- }
20
- /**
21
- * Check whether the committed surface.lock is stale compared to the current topology.
22
- *
23
- * When no topo is provided, returns a clean result (no drift detectable without runtime info).
24
- */
25
- export declare const checkDrift: (rootDir: string, topo?: Topo | undefined) => Promise<DriftResult>;
26
- //# sourceMappingURL=drift.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../src/drift.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAO3C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,oDAAoD;IACpD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,GACrB,SAAS,MAAM,EACf,OAAO,IAAI,GAAG,SAAS,KACtB,OAAO,CAAC,WAAW,CAcrB,CAAC"}
package/dist/drift.js DELETED
@@ -1,27 +0,0 @@
1
- /**
2
- * Surface lock drift detection.
3
- *
4
- * Compares the committed `surface.lock` hash against a freshly generated
5
- * surface map hash to detect when the trail topology has changed without
6
- * updating the lock file.
7
- */
8
- import { generateSurfaceMap, hashSurfaceMap, readSurfaceLock, } from '@ontrails/schema';
9
- /**
10
- * Check whether the committed surface.lock is stale compared to the current topology.
11
- *
12
- * When no topo is provided, returns a clean result (no drift detectable without runtime info).
13
- */
14
- export const checkDrift = async (rootDir, topo) => {
15
- if (!topo) {
16
- return { committedHash: null, currentHash: 'unknown', stale: false };
17
- }
18
- const surfaceMap = generateSurfaceMap(topo);
19
- const currentHash = hashSurfaceMap(surfaceMap);
20
- const committedHash = await readSurfaceLock({ dir: rootDir });
21
- return {
22
- committedHash,
23
- currentHash,
24
- stale: committedHash !== null && committedHash !== currentHash,
25
- };
26
- };
27
- //# sourceMappingURL=drift.js.map
package/dist/drift.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"drift.js","sourceRoot":"","sources":["../src/drift.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAc1B;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,OAAe,EACf,IAAuB,EACD,EAAE;IACxB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAE9D,OAAO;QACL,aAAa;QACb,WAAW;QACX,KAAK,EAAE,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,WAAW;KAC/D,CAAC;AACJ,CAAC,CAAC"}
@@ -1,29 +0,0 @@
1
- /**
2
- * CI-oriented formatters for warden reports.
3
- *
4
- * Each formatter takes a `WardenReport` and produces output suited to a
5
- * specific CI environment: GitHub Actions annotations, structured JSON,
6
- * or a concise markdown summary.
7
- */
8
- import type { WardenReport } from './cli.js';
9
- /**
10
- * Produce GitHub Actions workflow command annotations, one per diagnostic.
11
- *
12
- * Severity mapping: `error` to `::error`, `warn` to `::warning`.
13
- * Drift staleness is emitted as a single `::error` annotation when detected.
14
- */
15
- export declare const formatGitHubAnnotations: (report: WardenReport) => string;
16
- /**
17
- * Produce a structured JSON string from the report.
18
- *
19
- * Includes a `summary` object with error, warning, and suggestion counts
20
- * for easy consumption by downstream tooling.
21
- */
22
- export declare const formatJson: (report: WardenReport) => string;
23
- /**
24
- * Produce a concise markdown summary suitable for a GitHub job summary or PR comment.
25
- *
26
- * Groups diagnostics by severity and includes drift status when relevant.
27
- */
28
- export declare const formatSummary: (report: WardenReport) => string;
29
- //# sourceMappingURL=formatters.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAS7C;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,GAAI,QAAQ,YAAY,KAAG,MAiB9D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,YAAY,KAAG,MAiBjD,CAAC;AA6BF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,YAAY,KAAG,MAapD,CAAC"}
@@ -1,87 +0,0 @@
1
- /**
2
- * CI-oriented formatters for warden reports.
3
- *
4
- * Each formatter takes a `WardenReport` and produces output suited to a
5
- * specific CI environment: GitHub Actions annotations, structured JSON,
6
- * or a concise markdown summary.
7
- */
8
- /** Map warden severity to GitHub Actions annotation level. */
9
- const ghLevel = {
10
- error: 'error',
11
- warn: 'warning',
12
- };
13
- /**
14
- * Produce GitHub Actions workflow command annotations, one per diagnostic.
15
- *
16
- * Severity mapping: `error` to `::error`, `warn` to `::warning`.
17
- * Drift staleness is emitted as a single `::error` annotation when detected.
18
- */
19
- export const formatGitHubAnnotations = (report) => {
20
- const lines = [];
21
- for (const d of report.diagnostics) {
22
- const level = ghLevel[d.severity];
23
- lines.push(`::${level} file=${d.filePath},line=${String(d.line)}::${d.rule}: ${d.message}`);
24
- }
25
- if (report.drift?.stale) {
26
- lines.push('::error::drift: surface.lock is stale (regenerate with `trails survey generate`)');
27
- }
28
- return lines.join('\n');
29
- };
30
- /**
31
- * Produce a structured JSON string from the report.
32
- *
33
- * Includes a `summary` object with error, warning, and suggestion counts
34
- * for easy consumption by downstream tooling.
35
- */
36
- export const formatJson = (report) => {
37
- const summary = {
38
- errors: report.errorCount,
39
- suggestions: 0,
40
- warnings: report.warnCount,
41
- };
42
- return JSON.stringify({
43
- diagnostics: report.diagnostics,
44
- drift: report.drift,
45
- passed: report.passed,
46
- summary,
47
- }, null, 2);
48
- };
49
- /** Format a diagnostic as a markdown list item. */
50
- const diagnosticLine = (d) => `- \`${d.filePath}:${String(d.line)}\` — ${d.rule}: ${d.message}`;
51
- /** Render a severity group as a headed markdown section, or empty array. */
52
- const severitySection = (heading, diagnostics) => {
53
- if (diagnostics.length === 0) {
54
- return [];
55
- }
56
- return ['', `### ${heading}`, ...diagnostics.map(diagnosticLine)];
57
- };
58
- /** Render a drift section if stale, otherwise empty array. */
59
- const driftSection = (drift) => {
60
- if (!drift?.stale) {
61
- return [];
62
- }
63
- return [
64
- '',
65
- '### Drift',
66
- '- surface.lock is stale (regenerate with `trails survey generate`)',
67
- ];
68
- };
69
- /**
70
- * Produce a concise markdown summary suitable for a GitHub job summary or PR comment.
71
- *
72
- * Groups diagnostics by severity and includes drift status when relevant.
73
- */
74
- export const formatSummary = (report) => {
75
- const result = report.passed ? 'PASS' : 'FAIL';
76
- const errors = report.diagnostics.filter((d) => d.severity === 'error');
77
- const warnings = report.diagnostics.filter((d) => d.severity === 'warn');
78
- return [
79
- '## Warden Report',
80
- '',
81
- `**Result: ${result}** | ${String(report.errorCount)} errors, ${String(report.warnCount)} warnings`,
82
- ...severitySection('Errors', errors),
83
- ...severitySection('Warnings', warnings),
84
- ...driftSection(report.drift),
85
- ].join('\n');
86
- };
87
- //# sourceMappingURL=formatters.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,8DAA8D;AAC9D,MAAM,OAAO,GAAmC;IAC9C,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAoB,EAAU,EAAE;IACtE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,CACR,KAAK,KAAK,SAAS,CAAC,CAAC,QAAQ,SAAS,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAChF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CACR,kFAAkF,CACnF,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAoB,EAAU,EAAE;IACzD,MAAM,OAAO,GAAG;QACd,MAAM,EAAE,MAAM,CAAC,UAAU;QACzB,WAAW,EAAE,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC,SAAS;KAC3B,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO;KACR,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,mDAAmD;AACnD,MAAM,cAAc,GAAG,CAAC,CAAsC,EAAU,EAAE,CACxE,OAAO,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;AAEpE,4EAA4E;AAC5E,MAAM,eAAe,GAAG,CACtB,OAAe,EACf,WAAwC,EACrB,EAAE;IACrB,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,EAAE,EAAE,OAAO,OAAO,EAAE,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF,8DAA8D;AAC9D,MAAM,YAAY,GAAG,CAAC,KAA4B,EAAqB,EAAE;IACvE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO;QACL,EAAE;QACF,WAAW;QACX,oEAAoE;KACrE,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAoB,EAAU,EAAE;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAEzE,OAAO;QACL,kBAAkB;QAClB,EAAE;QACF,aAAa,MAAM,QAAQ,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW;QACnG,GAAG,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC;QACpC,GAAG,eAAe,CAAC,UAAU,EAAE,QAAQ,CAAC;QACxC,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC;KAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,CAAC"}
package/dist/index.d.ts DELETED
@@ -1,26 +0,0 @@
1
- /**
2
- * Warden - Governance package for Trails.
3
- *
4
- * Provides lint rules, drift detection, and a CLI runner to enforce
5
- * contract-first discipline at development time.
6
- *
7
- * Package: `@ontrails/warden`
8
- */
9
- export type { ProjectAwareWardenRule, ProjectContext, WardenDiagnostic, WardenRule, WardenSeverity, } from './rules/index.js';
10
- export { noThrowInImplementation } from './rules/no-throw-in-implementation.js';
11
- export { contextNoSurfaceTypes } from './rules/context-no-surface-types.js';
12
- export { validDetourRefs } from './rules/valid-detour-refs.js';
13
- export { noDirectImplInRoute } from './rules/no-direct-impl-in-route.js';
14
- export { noDirectImplementationCall } from './rules/no-direct-implementation-call.js';
15
- export { noSyncResultAssumption } from './rules/no-sync-result-assumption.js';
16
- export { implementationReturnsResult } from './rules/implementation-returns-result.js';
17
- export { noThrowInDetourTarget } from './rules/no-throw-in-detour-target.js';
18
- export { preferSchemaInference } from './rules/prefer-schema-inference.js';
19
- export { validDescribeRefs } from './rules/valid-describe-refs.js';
20
- export { wardenRules } from './rules/index.js';
21
- export type { WardenOptions, WardenReport } from './cli.js';
22
- export { formatWardenReport, runWarden } from './cli.js';
23
- export { formatGitHubAnnotations, formatJson, formatSummary, } from './formatters.js';
24
- export type { DriftResult } from './drift.js';
25
- export { checkDrift } from './drift.js';
26
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,YAAY,EACV,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,cAAc,GACf,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AACtF,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGzD,OAAO,EACL,uBAAuB,EACvB,UAAU,EACV,aAAa,GACd,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js DELETED
@@ -1,26 +0,0 @@
1
- /**
2
- * Warden - Governance package for Trails.
3
- *
4
- * Provides lint rules, drift detection, and a CLI runner to enforce
5
- * contract-first discipline at development time.
6
- *
7
- * Package: `@ontrails/warden`
8
- */
9
- // Individual rules
10
- export { noThrowInImplementation } from './rules/no-throw-in-implementation.js';
11
- export { contextNoSurfaceTypes } from './rules/context-no-surface-types.js';
12
- export { validDetourRefs } from './rules/valid-detour-refs.js';
13
- export { noDirectImplInRoute } from './rules/no-direct-impl-in-route.js';
14
- export { noDirectImplementationCall } from './rules/no-direct-implementation-call.js';
15
- export { noSyncResultAssumption } from './rules/no-sync-result-assumption.js';
16
- export { implementationReturnsResult } from './rules/implementation-returns-result.js';
17
- export { noThrowInDetourTarget } from './rules/no-throw-in-detour-target.js';
18
- export { preferSchemaInference } from './rules/prefer-schema-inference.js';
19
- export { validDescribeRefs } from './rules/valid-describe-refs.js';
20
- // Rule registry
21
- export { wardenRules } from './rules/index.js';
22
- export { formatWardenReport, runWarden } from './cli.js';
23
- // CI formatters
24
- export { formatGitHubAnnotations, formatJson, formatSummary, } from './formatters.js';
25
- export { checkDrift } from './drift.js';
26
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,mBAAmB;AACnB,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AACtF,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,gBAAgB;AAChB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAI/C,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEzD,gBAAgB;AAChB,OAAO,EACL,uBAAuB,EACvB,UAAU,EACV,aAAa,GACd,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
@@ -1,41 +0,0 @@
1
- /**
2
- * Shared AST utilities for warden rules.
3
- *
4
- * Uses oxc-parser for native-speed TypeScript parsing. Provides a lightweight
5
- * walker and helpers for finding trail implementation bodies.
6
- */
7
- export interface AstNode {
8
- readonly type: string;
9
- readonly start: number;
10
- readonly end: number;
11
- readonly key?: {
12
- readonly name?: string;
13
- };
14
- readonly value?: AstNode;
15
- readonly body?: AstNode | readonly AstNode[];
16
- readonly [key: string]: unknown;
17
- }
18
- /** Parse TypeScript source into an AST. Returns null on parse failure. */
19
- export declare const parse: (filePath: string, sourceCode: string) => AstNode | null;
20
- /** Walk an AST node tree, calling `visit` on every node. */
21
- export declare const walk: (node: unknown, visit: (node: AstNode) => void) => void;
22
- /** Find the byte offset's line number (1-based) in source code. */
23
- export declare const offsetToLine: (sourceCode: string, offset: number) => number;
24
- /** Find all `implementation:` property values in an AST. */
25
- export declare const findImplementationBodies: (ast: AstNode) => AstNode[];
26
- export interface TrailDefinition {
27
- /** Trail ID string, e.g. "entity.show" */
28
- readonly id: string;
29
- /** "trail" or "hike" */
30
- readonly kind: string;
31
- /** The config object argument (second arg to trail/hike call) */
32
- readonly config: AstNode;
33
- /** Start offset of the call expression */
34
- readonly start: number;
35
- }
36
- /** Check if a node is a call to `.implementation()` on some object. */
37
- export declare const isImplementationCall: (node: AstNode) => boolean;
38
- export declare const findTrailDefinitions: (ast: AstNode) => TrailDefinition[];
39
- /** Find a Property node by key name inside an ObjectExpression config. */
40
- export declare const findConfigProperty: (config: AstNode, propertyName: string) => AstNode | null;
41
- //# sourceMappingURL=ast.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/rules/ast.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,OAAO,EAAE,CAAC;IAC7C,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAMD,0EAA0E;AAC1E,eAAO,MAAM,KAAK,GAAI,UAAU,MAAM,EAAE,YAAY,MAAM,KAAG,OAAO,GAAG,IAOtE,CAAC;AAMF,4DAA4D;AAC5D,eAAO,MAAM,IAAI,GAAI,MAAM,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,KAAG,IAiBpE,CAAC;AAMF,mEAAmE;AACnE,eAAO,MAAM,YAAY,GAAI,YAAY,MAAM,EAAE,QAAQ,MAAM,KAAG,MAQjE,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,wBAAwB,GAAI,KAAK,OAAO,KAAG,OAAO,EAY9D,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AA2DD,uEAAuE;AACvE,eAAO,MAAM,oBAAoB,GAAI,MAAM,OAAO,KAAG,OAmBpD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,KAAK,OAAO,KAAG,eAAe,EAWlE,CAAC;AAMF,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,OAAO,EACf,cAAc,MAAM,KACnB,OAAO,GAAG,IAcZ,CAAC"}