@ontrails/warden 1.0.0-beta.2 → 1.0.0-beta.21

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 (249) hide show
  1. package/CHANGELOG.md +497 -6
  2. package/README.md +77 -26
  3. package/bin/warden.ts +50 -0
  4. package/package.json +27 -5
  5. package/src/adapter-check.ts +136 -0
  6. package/src/ast.ts +28 -0
  7. package/src/cli.ts +1374 -103
  8. package/src/command.ts +953 -0
  9. package/src/config.ts +184 -0
  10. package/src/draft.ts +22 -0
  11. package/src/drift.ts +106 -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 +206 -14
  16. package/src/project-context.ts +163 -0
  17. package/src/resolve.ts +530 -0
  18. package/src/rules/activation-orphan.ts +97 -0
  19. package/src/rules/ast.ts +3176 -85
  20. package/src/rules/circular-refs.ts +154 -0
  21. package/src/rules/composes-declarations.ts +704 -0
  22. package/src/rules/context-no-surface-types.ts +68 -8
  23. package/src/rules/contour-exists.ts +251 -0
  24. package/src/rules/contour-ids.ts +15 -0
  25. package/src/rules/dead-internal-trail.ts +154 -0
  26. package/src/rules/draft-file-marking.ts +160 -0
  27. package/src/rules/draft-visible-debt.ts +87 -0
  28. package/src/rules/error-mapping-completeness.ts +288 -0
  29. package/src/rules/example-valid.ts +401 -0
  30. package/src/rules/fires-declarations.ts +758 -0
  31. package/src/rules/implementation-returns-result.ts +1265 -95
  32. package/src/rules/incomplete-accessor-for-standard-op.ts +272 -0
  33. package/src/rules/incomplete-crud.ts +580 -0
  34. package/src/rules/index.ts +219 -18
  35. package/src/rules/intent-propagation.ts +127 -0
  36. package/src/rules/layer-field-name-drift.ts +96 -0
  37. package/src/rules/metadata.ts +654 -0
  38. package/src/rules/missing-reconcile.ts +98 -0
  39. package/src/rules/missing-visibility.ts +110 -0
  40. package/src/rules/no-destructured-compose.ts +192 -0
  41. package/src/rules/no-dev-permit-in-source.ts +99 -0
  42. package/src/rules/no-direct-implementation-call.ts +7 -7
  43. package/src/rules/no-legacy-layer-imports.ts +211 -0
  44. package/src/rules/no-native-error-result.ts +111 -0
  45. package/src/rules/no-redundant-result-error-wrap.ts +331 -0
  46. package/src/rules/no-retired-cross-vocabulary.ts +194 -0
  47. package/src/rules/no-sync-result-assumption.ts +1134 -99
  48. package/src/rules/no-throw-in-detour-recover.ts +225 -0
  49. package/src/rules/no-throw-in-implementation.ts +10 -9
  50. package/src/rules/no-top-level-surface.ts +389 -0
  51. package/src/rules/on-references-exist.ts +194 -0
  52. package/src/rules/orphaned-signal.ts +150 -0
  53. package/src/rules/owner-projection-parity.ts +146 -0
  54. package/src/rules/permit-governance.ts +25 -0
  55. package/src/rules/public-export-example-coverage.ts +553 -0
  56. package/src/rules/public-internal-deep-imports.ts +517 -0
  57. package/src/rules/public-output-schema.ts +29 -0
  58. package/src/rules/public-union-output-discriminants.ts +150 -0
  59. package/src/rules/read-intent-fires.ts +187 -0
  60. package/src/rules/reference-exists.ts +98 -0
  61. package/src/rules/registry-names.ts +145 -0
  62. package/src/rules/resolved-import-boundary.ts +146 -0
  63. package/src/rules/resource-declarations.ts +704 -0
  64. package/src/rules/resource-exists.ts +179 -0
  65. package/src/rules/resource-id-grammar.ts +65 -0
  66. package/src/rules/resource-mock-coverage.ts +115 -0
  67. package/src/rules/scan.ts +38 -25
  68. package/src/rules/scheduled-destroy-intent.ts +44 -0
  69. package/src/rules/signal-graph-coaching.ts +191 -0
  70. package/src/rules/specs.ts +9 -5
  71. package/src/rules/static-resource-accessor-preference.ts +657 -0
  72. package/src/rules/surface-facet-coherence.ts +370 -0
  73. package/src/rules/trail-versioning-source.ts +1094 -0
  74. package/src/rules/trail-versioning-topo.ts +172 -0
  75. package/src/rules/types.ts +270 -6
  76. package/src/rules/unmaterialized-activation-source.ts +84 -0
  77. package/src/rules/unreachable-detour-shadowing.ts +344 -0
  78. package/src/rules/valid-describe-refs.ts +160 -32
  79. package/src/rules/valid-detour-contract.ts +78 -0
  80. package/src/rules/warden-export-symmetry.ts +533 -0
  81. package/src/rules/warden-rules-use-ast.ts +996 -0
  82. package/src/rules/webhook-route-collision.ts +243 -0
  83. package/src/trails/activation-orphan.trail.ts +84 -0
  84. package/src/trails/circular-refs.trail.ts +29 -0
  85. package/src/trails/composes-declarations.trail.ts +22 -0
  86. package/src/trails/context-no-surface-types.trail.ts +21 -0
  87. package/src/trails/contour-exists.trail.ts +21 -0
  88. package/src/trails/dead-internal-trail.trail.ts +26 -0
  89. package/src/trails/deprecation-without-guidance.trail.ts +21 -0
  90. package/src/trails/draft-file-marking.trail.ts +16 -0
  91. package/src/trails/draft-visible-debt.trail.ts +16 -0
  92. package/src/trails/error-mapping-completeness.trail.ts +29 -0
  93. package/src/trails/example-valid.trail.ts +25 -0
  94. package/src/trails/fires-declarations.trail.ts +23 -0
  95. package/src/trails/fork-without-preserved-blaze.trail.ts +31 -0
  96. package/src/trails/implementation-returns-result.trail.ts +20 -0
  97. package/src/trails/incomplete-accessor-for-standard-op.trail.ts +76 -0
  98. package/src/trails/incomplete-crud.trail.ts +39 -0
  99. package/src/trails/index.ts +78 -0
  100. package/src/trails/intent-propagation.trail.ts +30 -0
  101. package/src/trails/layer-field-name-drift.trail.ts +39 -0
  102. package/src/trails/marker-schema-unsupported.trail.ts +23 -0
  103. package/src/trails/missing-reconcile.trail.ts +33 -0
  104. package/src/trails/missing-visibility.trail.ts +22 -0
  105. package/src/trails/no-destructured-compose.trail.ts +44 -0
  106. package/src/trails/no-dev-permit-in-source.trail.ts +16 -0
  107. package/src/trails/no-direct-implementation-call.trail.ts +16 -0
  108. package/src/trails/no-legacy-layer-imports.trail.ts +41 -0
  109. package/src/trails/no-native-error-result.trail.ts +18 -0
  110. package/src/trails/no-redundant-result-error-wrap.trail.ts +55 -0
  111. package/src/trails/no-retired-cross-vocabulary.trail.ts +42 -0
  112. package/src/trails/no-sync-result-assumption.trail.ts +19 -0
  113. package/src/trails/no-throw-in-detour-recover.trail.ts +24 -0
  114. package/src/trails/no-throw-in-implementation.trail.ts +20 -0
  115. package/src/trails/no-top-level-surface.trail.ts +43 -0
  116. package/src/trails/on-references-exist.trail.ts +21 -0
  117. package/src/trails/orphaned-signal.trail.ts +36 -0
  118. package/src/trails/owner-projection-parity.trail.ts +26 -0
  119. package/src/trails/pending-force.trail.ts +21 -0
  120. package/src/trails/permit-governance.trail.ts +51 -0
  121. package/src/trails/prefer-schema-inference.trail.ts +21 -0
  122. package/src/trails/public-export-example-coverage.trail.ts +16 -0
  123. package/src/trails/public-internal-deep-imports.trail.ts +94 -0
  124. package/src/trails/public-output-schema.trail.ts +55 -0
  125. package/src/trails/public-union-output-discriminants.trail.ts +33 -0
  126. package/src/trails/read-intent-fires.trail.ts +20 -0
  127. package/src/trails/reference-exists.trail.ts +25 -0
  128. package/src/trails/resolved-import-boundary.trail.ts +109 -0
  129. package/src/trails/resource-declarations.trail.ts +25 -0
  130. package/src/trails/resource-exists.trail.ts +27 -0
  131. package/src/trails/resource-id-grammar.trail.ts +39 -0
  132. package/src/trails/resource-mock-coverage.trail.ts +40 -0
  133. package/src/trails/run.ts +162 -0
  134. package/src/trails/scheduled-destroy-intent.trail.ts +56 -0
  135. package/src/trails/schema.ts +194 -0
  136. package/src/trails/signal-graph-coaching.trail.ts +77 -0
  137. package/src/trails/static-resource-accessor-preference.trail.ts +25 -0
  138. package/src/trails/surface-facet-coherence.trail.ts +25 -0
  139. package/src/trails/topo.ts +6 -0
  140. package/src/trails/unmaterialized-activation-source.trail.ts +72 -0
  141. package/src/trails/unreachable-detour-shadowing.trail.ts +45 -0
  142. package/src/trails/valid-describe-refs.trail.ts +18 -0
  143. package/src/trails/valid-detour-contract.trail.ts +71 -0
  144. package/src/trails/version-gap.trail.ts +35 -0
  145. package/src/trails/version-pinned-compose.trail.ts +23 -0
  146. package/src/trails/version-without-examples.trail.ts +38 -0
  147. package/src/trails/warden-export-symmetry.trail.ts +16 -0
  148. package/src/trails/warden-rules-use-ast.trail.ts +45 -0
  149. package/src/trails/webhook-route-collision.trail.ts +50 -0
  150. package/src/trails/wrap-rule.ts +213 -0
  151. package/src/workspaces.ts +238 -0
  152. package/.turbo/turbo-build.log +0 -1
  153. package/.turbo/turbo-lint.log +0 -3
  154. package/.turbo/turbo-typecheck.log +0 -1
  155. package/dist/cli.d.ts +0 -46
  156. package/dist/cli.d.ts.map +0 -1
  157. package/dist/cli.js +0 -221
  158. package/dist/cli.js.map +0 -1
  159. package/dist/drift.d.ts +0 -26
  160. package/dist/drift.d.ts.map +0 -1
  161. package/dist/drift.js +0 -27
  162. package/dist/drift.js.map +0 -1
  163. package/dist/formatters.d.ts +0 -29
  164. package/dist/formatters.d.ts.map +0 -1
  165. package/dist/formatters.js +0 -87
  166. package/dist/formatters.js.map +0 -1
  167. package/dist/index.d.ts +0 -26
  168. package/dist/index.d.ts.map +0 -1
  169. package/dist/index.js +0 -26
  170. package/dist/index.js.map +0 -1
  171. package/dist/rules/ast.d.ts +0 -41
  172. package/dist/rules/ast.d.ts.map +0 -1
  173. package/dist/rules/ast.js +0 -163
  174. package/dist/rules/ast.js.map +0 -1
  175. package/dist/rules/context-no-surface-types.d.ts +0 -12
  176. package/dist/rules/context-no-surface-types.d.ts.map +0 -1
  177. package/dist/rules/context-no-surface-types.js +0 -96
  178. package/dist/rules/context-no-surface-types.js.map +0 -1
  179. package/dist/rules/implementation-returns-result.d.ts +0 -13
  180. package/dist/rules/implementation-returns-result.d.ts.map +0 -1
  181. package/dist/rules/implementation-returns-result.js +0 -231
  182. package/dist/rules/implementation-returns-result.js.map +0 -1
  183. package/dist/rules/index.d.ts +0 -22
  184. package/dist/rules/index.d.ts.map +0 -1
  185. package/dist/rules/index.js +0 -41
  186. package/dist/rules/index.js.map +0 -1
  187. package/dist/rules/no-direct-impl-in-route.d.ts +0 -12
  188. package/dist/rules/no-direct-impl-in-route.d.ts.map +0 -1
  189. package/dist/rules/no-direct-impl-in-route.js +0 -46
  190. package/dist/rules/no-direct-impl-in-route.js.map +0 -1
  191. package/dist/rules/no-direct-implementation-call.d.ts +0 -12
  192. package/dist/rules/no-direct-implementation-call.d.ts.map +0 -1
  193. package/dist/rules/no-direct-implementation-call.js +0 -39
  194. package/dist/rules/no-direct-implementation-call.js.map +0 -1
  195. package/dist/rules/no-sync-result-assumption.d.ts +0 -6
  196. package/dist/rules/no-sync-result-assumption.d.ts.map +0 -1
  197. package/dist/rules/no-sync-result-assumption.js +0 -98
  198. package/dist/rules/no-sync-result-assumption.js.map +0 -1
  199. package/dist/rules/no-throw-in-detour-target.d.ts +0 -12
  200. package/dist/rules/no-throw-in-detour-target.d.ts.map +0 -1
  201. package/dist/rules/no-throw-in-detour-target.js +0 -87
  202. package/dist/rules/no-throw-in-detour-target.js.map +0 -1
  203. package/dist/rules/no-throw-in-implementation.d.ts +0 -9
  204. package/dist/rules/no-throw-in-implementation.d.ts.map +0 -1
  205. package/dist/rules/no-throw-in-implementation.js +0 -34
  206. package/dist/rules/no-throw-in-implementation.js.map +0 -1
  207. package/dist/rules/prefer-schema-inference.d.ts +0 -7
  208. package/dist/rules/prefer-schema-inference.d.ts.map +0 -1
  209. package/dist/rules/prefer-schema-inference.js +0 -86
  210. package/dist/rules/prefer-schema-inference.js.map +0 -1
  211. package/dist/rules/scan.d.ts +0 -8
  212. package/dist/rules/scan.d.ts.map +0 -1
  213. package/dist/rules/scan.js +0 -32
  214. package/dist/rules/scan.js.map +0 -1
  215. package/dist/rules/specs.d.ts +0 -29
  216. package/dist/rules/specs.d.ts.map +0 -1
  217. package/dist/rules/specs.js +0 -192
  218. package/dist/rules/specs.js.map +0 -1
  219. package/dist/rules/structure.d.ts +0 -13
  220. package/dist/rules/structure.d.ts.map +0 -1
  221. package/dist/rules/structure.js +0 -142
  222. package/dist/rules/structure.js.map +0 -1
  223. package/dist/rules/types.d.ts +0 -52
  224. package/dist/rules/types.d.ts.map +0 -1
  225. package/dist/rules/types.js +0 -2
  226. package/dist/rules/types.js.map +0 -1
  227. package/dist/rules/valid-describe-refs.d.ts +0 -7
  228. package/dist/rules/valid-describe-refs.d.ts.map +0 -1
  229. package/dist/rules/valid-describe-refs.js +0 -51
  230. package/dist/rules/valid-describe-refs.js.map +0 -1
  231. package/dist/rules/valid-detour-refs.d.ts +0 -6
  232. package/dist/rules/valid-detour-refs.d.ts.map +0 -1
  233. package/dist/rules/valid-detour-refs.js +0 -116
  234. package/dist/rules/valid-detour-refs.js.map +0 -1
  235. package/src/__tests__/cli.test.ts +0 -198
  236. package/src/__tests__/drift.test.ts +0 -74
  237. package/src/__tests__/formatters.test.ts +0 -157
  238. package/src/__tests__/implementation-returns-result.test.ts +0 -75
  239. package/src/__tests__/no-direct-implementation-call.test.ts +0 -83
  240. package/src/__tests__/no-sync-result-assumption.test.ts +0 -85
  241. package/src/__tests__/no-throw-in-detour-target.test.ts +0 -78
  242. package/src/__tests__/prefer-schema-inference.test.ts +0 -84
  243. package/src/__tests__/rules.test.ts +0 -188
  244. package/src/__tests__/valid-describe-refs.test.ts +0 -60
  245. package/src/rules/no-direct-impl-in-route.ts +0 -77
  246. package/src/rules/no-throw-in-detour-target.ts +0 -150
  247. package/src/rules/valid-detour-refs.ts +0 -187
  248. package/tsconfig.json +0 -9
  249. package/tsconfig.tsbuildinfo +0 -1
@@ -1,87 +0,0 @@
1
- /**
2
- * Flags throws in implementations that are used as detour targets.
3
- *
4
- * Uses AST parsing for accurate detection of detour target IDs and
5
- * throw statements within those trail implementations.
6
- */
7
- import { findImplementationBodies, findTrailDefinitions, offsetToLine, parse, walk, } from './ast.js';
8
- import { isTestFile } from './scan.js';
9
- /** Collect all trail IDs referenced as detour targets in the AST. */
10
- const collectDetourTargets = (ast) => {
11
- const targets = new Set();
12
- walk(ast, (node) => {
13
- if (node.type !== 'Property' ||
14
- node.key?.name !== 'detours' ||
15
- !node.value) {
16
- return;
17
- }
18
- walk(node.value, (inner) => {
19
- if (inner.type === 'Literal' || inner.type === 'StringLiteral') {
20
- const { value } = inner;
21
- if (typeof value === 'string' && value.includes('.')) {
22
- targets.add(value);
23
- }
24
- }
25
- });
26
- });
27
- return targets;
28
- };
29
- /** Find throws in implementation bodies of targeted trails. */
30
- const findThrowsInTargetedTrails = (ast, sourceCode, filePath, detourTargets) => {
31
- const diagnostics = [];
32
- for (const def of findTrailDefinitions(ast)) {
33
- if (!detourTargets.has(def.id)) {
34
- continue;
35
- }
36
- for (const body of findImplementationBodies(def.config)) {
37
- walk(body, (node) => {
38
- if (node.type === 'ThrowStatement') {
39
- diagnostics.push({
40
- filePath,
41
- line: offsetToLine(sourceCode, node.start),
42
- message: `Trail "${def.id}" is a detour target and must not throw. Use Result.err() instead.`,
43
- rule: 'no-throw-in-detour-target',
44
- severity: 'error',
45
- });
46
- }
47
- });
48
- }
49
- }
50
- return diagnostics;
51
- };
52
- const checkThrowInDetourTargets = (sourceCode, filePath, detourTargets) => {
53
- if (isTestFile(filePath)) {
54
- return [];
55
- }
56
- const ast = parse(filePath, sourceCode);
57
- if (!ast) {
58
- return [];
59
- }
60
- return findThrowsInTargetedTrails(ast, sourceCode, filePath, detourTargets);
61
- };
62
- /**
63
- * Flags throws in implementations that are used as detour targets.
64
- */
65
- export const noThrowInDetourTarget = {
66
- check(sourceCode, filePath) {
67
- const ast = parse(filePath, sourceCode);
68
- if (!ast) {
69
- return [];
70
- }
71
- return checkThrowInDetourTargets(sourceCode, filePath, collectDetourTargets(ast));
72
- },
73
- checkWithContext(sourceCode, filePath, context) {
74
- if (context.detourTargetTrailIds) {
75
- return checkThrowInDetourTargets(sourceCode, filePath, context.detourTargetTrailIds);
76
- }
77
- const ast = parse(filePath, sourceCode);
78
- if (!ast) {
79
- return [];
80
- }
81
- return checkThrowInDetourTargets(sourceCode, filePath, collectDetourTargets(ast));
82
- },
83
- description: 'Disallow throw statements inside implementations that are referenced as detour targets.',
84
- name: 'no-throw-in-detour-target',
85
- severity: 'error',
86
- };
87
- //# sourceMappingURL=no-throw-in-detour-target.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"no-throw-in-detour-target.js","sourceRoot":"","sources":["../../src/rules/no-throw-in-detour-target.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Finds `throw` statements inside `implementation:` function bodies.
3
- *
4
- * Uses AST parsing for accurate detection — no false positives from
5
- * throw in comments, strings, or nested non-implementation functions.
6
- */
7
- import type { WardenRule } from './types.js';
8
- export declare const noThrowInImplementation: WardenRule;
9
- //# sourceMappingURL=no-throw-in-implementation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"no-throw-in-implementation.d.ts","sourceRoot":"","sources":["../../src/rules/no-throw-in-implementation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,uBAAuB,EAAE,UA8BrC,CAAC"}
@@ -1,34 +0,0 @@
1
- /**
2
- * Finds `throw` statements inside `implementation:` function bodies.
3
- *
4
- * Uses AST parsing for accurate detection — no false positives from
5
- * throw in comments, strings, or nested non-implementation functions.
6
- */
7
- import { findImplementationBodies, offsetToLine, parse, walk } from './ast.js';
8
- export const noThrowInImplementation = {
9
- check(sourceCode, filePath) {
10
- const ast = parse(filePath, sourceCode);
11
- if (!ast) {
12
- return [];
13
- }
14
- const diagnostics = [];
15
- for (const body of findImplementationBodies(ast)) {
16
- walk(body, (node) => {
17
- if (node.type === 'ThrowStatement') {
18
- diagnostics.push({
19
- filePath,
20
- line: offsetToLine(sourceCode, node.start),
21
- message: 'Do not throw inside implementation. Use Result.err() instead.',
22
- rule: 'no-throw-in-implementation',
23
- severity: 'error',
24
- });
25
- }
26
- });
27
- }
28
- return diagnostics;
29
- },
30
- description: 'Disallow throw statements inside trail/route implementation bodies. Use Result.err() instead.',
31
- name: 'no-throw-in-implementation',
32
- severity: 'error',
33
- };
34
- //# sourceMappingURL=no-throw-in-implementation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"no-throw-in-implementation.js","sourceRoot":"","sources":["../../src/rules/no-throw-in-implementation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAG/E,MAAM,CAAC,MAAM,uBAAuB,GAAe;IACjD,KAAK,CAAC,UAAkB,EAAE,QAAgB;QACxC,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,WAAW,GAAuB,EAAE,CAAC;QAE3C,KAAK,MAAM,IAAI,IAAI,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;gBAClB,IAAI,IAAI,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;oBACnC,WAAW,CAAC,IAAI,CAAC;wBACf,QAAQ;wBACR,IAAI,EAAE,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC;wBAC1C,OAAO,EACL,+DAA+D;wBACjE,IAAI,EAAE,4BAA4B;wBAClC,QAAQ,EAAE,OAAO;qBAClB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,WAAW,EACT,+FAA+F;IACjG,IAAI,EAAE,4BAA4B;IAClC,QAAQ,EAAE,OAAO;CAClB,CAAC"}
@@ -1,7 +0,0 @@
1
- import type { WardenRule } from './types.js';
2
- /**
3
- * Warns when a fields override only repeats metadata deriveFields() already gets from
4
- * the schema.
5
- */
6
- export declare const preferSchemaInference: WardenRule;
7
- //# sourceMappingURL=prefer-schema-inference.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prefer-schema-inference.d.ts","sourceRoot":"","sources":["../../src/rules/prefer-schema-inference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AA0H/D;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,UAcnC,CAAC"}
@@ -1,86 +0,0 @@
1
- import { isTestFile } from './scan.js';
2
- import { findTrailLikeSpecs, parseArrayEntries, parseObjectProperties, parseStringLiteral, parseZodObjectShape, } from './specs.js';
3
- const REDUNDANT_OVERRIDE_KEYS = new Set(['label', 'options']);
4
- const hasOnlyRedundantKeys = (properties) => [...properties.keys()].every((key) => REDUNDANT_OVERRIDE_KEYS.has(key));
5
- const redundantLabelPart = (derivedLabel, properties) => {
6
- const label = parseStringLiteral(properties.get('label')?.value ?? '');
7
- return label !== null && label === derivedLabel ? ['label'] : [];
8
- };
9
- const optionsAreDerivedDefaults = (optionsText, schemaOptions) => {
10
- const entries = parseArrayEntries(optionsText, 0, optionsText);
11
- if (entries.length !== schemaOptions.length) {
12
- return false;
13
- }
14
- return entries.every((entry, index) => {
15
- if (!entry.text.startsWith('{')) {
16
- return false;
17
- }
18
- const properties = parseObjectProperties(entry.text, 0, entry.text);
19
- if (properties.size !== 1) {
20
- return false;
21
- }
22
- const value = parseStringLiteral(properties.get('value')?.value ?? '');
23
- return value !== null && value === schemaOptions[index];
24
- });
25
- };
26
- const redundantOptionsPart = (options, schemaOptions) => options !== undefined &&
27
- schemaOptions !== undefined &&
28
- optionsAreDerivedDefaults(options.value, schemaOptions)
29
- ? ['options']
30
- : [];
31
- const findRedundantParts = (fieldKey, fieldOverride, schemaText) => {
32
- const fieldInfo = parseZodObjectShape(schemaText).get(fieldKey);
33
- if (!fieldInfo) {
34
- return [];
35
- }
36
- const properties = parseObjectProperties(fieldOverride, 0, fieldOverride);
37
- if (properties.size === 0) {
38
- return ['field metadata'];
39
- }
40
- if (!hasOnlyRedundantKeys(properties)) {
41
- return [];
42
- }
43
- const redundant = [
44
- ...redundantLabelPart(fieldInfo.derivedLabel, properties),
45
- ...redundantOptionsPart(properties.get('options'), fieldInfo.options),
46
- ];
47
- return redundant.length === properties.size ? redundant : [];
48
- };
49
- const diagnosticsForSpec = (sourceCode, filePath, spec) => {
50
- const input = spec.properties.get('input');
51
- const fields = spec.properties.get('fields');
52
- if (!input || !fields) {
53
- return [];
54
- }
55
- const fieldEntries = parseObjectProperties(fields.value, fields.start, sourceCode);
56
- return [...fieldEntries.entries()]
57
- .map(([fieldKey, fieldEntry]) => ({
58
- fieldEntry,
59
- fieldKey,
60
- redundantParts: findRedundantParts(fieldKey, fieldEntry.value, input.value),
61
- }))
62
- .filter(({ redundantParts }) => redundantParts.length > 0)
63
- .map(({ fieldEntry, fieldKey, redundantParts }) => ({
64
- filePath,
65
- line: fieldEntry.line,
66
- message: `Trail "${spec.id}" field "${fieldKey}" only repeats schema-derived ${redundantParts.join(' and ')}. Remove the override and let deriveFields() infer it.`,
67
- rule: 'prefer-schema-inference',
68
- severity: 'warn',
69
- }));
70
- };
71
- /**
72
- * Warns when a fields override only repeats metadata deriveFields() already gets from
73
- * the schema.
74
- */
75
- export const preferSchemaInference = {
76
- check(sourceCode, filePath) {
77
- if (isTestFile(filePath)) {
78
- return [];
79
- }
80
- return findTrailLikeSpecs(sourceCode).flatMap((spec) => diagnosticsForSpec(sourceCode, filePath, spec));
81
- },
82
- description: 'Warn when fields overrides only restate labels or enum options deriveFields() already infers from the Zod schema.',
83
- name: 'prefer-schema-inference',
84
- severity: 'warn',
85
- };
86
- //# sourceMappingURL=prefer-schema-inference.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prefer-schema-inference.js","sourceRoot":"","sources":["../../src/rules/prefer-schema-inference.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;AAE9D,MAAM,oBAAoB,GAAG,CAC3B,UAAkD,EACzC,EAAE,CACX,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1E,MAAM,kBAAkB,GAAG,CACzB,YAAoB,EACpB,UAAkD,EACxC,EAAE;IACZ,MAAM,KAAK,GAAG,kBAAkB,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IACvE,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAChC,WAAmB,EACnB,aAAgC,EACvB,EAAE;IACX,MAAM,OAAO,GAAG,iBAAiB,CAAC,WAAW,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;IAC/D,IAAI,OAAO,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACpC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACvE,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAC3B,OAAsC,EACtC,aAA4C,EAClC,EAAE,CACZ,OAAO,KAAK,SAAS;IACrB,aAAa,KAAK,SAAS;IAC3B,yBAAyB,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC;IACrD,CAAC,CAAC,CAAC,SAAS,CAAC;IACb,CAAC,CAAC,EAAE,CAAC;AAET,MAAM,kBAAkB,GAAG,CACzB,QAAgB,EAChB,aAAqB,EACrB,UAAkB,EACR,EAAE;IACZ,MAAM,SAAS,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,UAAU,GAAG,qBAAqB,CAAC,aAAa,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;IAC1E,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,SAAS,GAAG;QAChB,GAAG,kBAAkB,CAAC,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC;QACzD,GAAG,oBAAoB,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC;KACtE,CAAC;IAEF,OAAO,SAAS,CAAC,MAAM,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CACzB,UAAkB,EAClB,QAAgB,EAChB,IAAmD,EACtB,EAAE;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,YAAY,GAAG,qBAAqB,CACxC,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,KAAK,EACZ,UAAU,CACX,CAAC;IACF,OAAO,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC;SAC/B,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,UAAU;QACV,QAAQ;QACR,cAAc,EAAE,kBAAkB,CAChC,QAAQ,EACR,UAAU,CAAC,KAAK,EAChB,KAAK,CAAC,KAAK,CACZ;KACF,CAAC,CAAC;SACF,MAAM,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;SACzD,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC;QAClD,QAAQ;QACR,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,OAAO,EAAE,UAAU,IAAI,CAAC,EAAE,YAAY,QAAQ,iCAAiC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,wDAAwD;QACnK,IAAI,EAAE,yBAAyB;QAC/B,QAAQ,EAAE,MAAe;KAC1B,CAAC,CAAC,CAAC;AACR,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAe;IAC/C,KAAK,CAAC,UAAkB,EAAE,QAAgB;QACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,kBAAkB,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACrD,kBAAkB,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,CAC/C,CAAC;IACJ,CAAC;IACD,WAAW,EACT,mHAAmH;IACrH,IAAI,EAAE,yBAAyB;IAC/B,QAAQ,EAAE,MAAM;CACjB,CAAC"}
@@ -1,8 +0,0 @@
1
- export declare const isTestFile: (filePath: string) => boolean;
2
- export declare const isFrameworkInternalFile: (filePath: string) => boolean;
3
- /**
4
- * Replace quoted content and comments with whitespace while preserving line
5
- * breaks so simple line-based scanners do not match examples or messages.
6
- */
7
- export declare const stripQuotedContent: (sourceCode: string) => string;
8
- //# sourceMappingURL=scan.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/rules/scan.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,UAAU,GAAI,UAAU,MAAM,KAAG,OACO,CAAC;AAEtD,eAAO,MAAM,uBAAuB,GAAI,UAAU,MAAM,KAAG,OAK1D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,YAAY,MAAM,KAAG,MAevD,CAAC"}
@@ -1,32 +0,0 @@
1
- const TEST_FILE_PATTERN = /(?:^|\/)__tests__(?:\/|$)|(?:\.test|\.spec)\.[cm]?[jt]sx?$/;
2
- const FRAMEWORK_INTERNAL_SEGMENTS = [
3
- '/packages/testing/',
4
- '/packages/warden/',
5
- ];
6
- const normalizeFilePath = (filePath) => filePath.replaceAll('\\', '/');
7
- const maskText = (text) => text.replaceAll(/[^\n]/g, ' ');
8
- const stripPattern = (sourceCode, pattern) => sourceCode.replaceAll(pattern, (match) => maskText(match));
9
- export const isTestFile = (filePath) => TEST_FILE_PATTERN.test(normalizeFilePath(filePath));
10
- export const isFrameworkInternalFile = (filePath) => {
11
- const normalized = normalizeFilePath(filePath);
12
- return FRAMEWORK_INTERNAL_SEGMENTS.some((segment) => normalized.includes(segment));
13
- };
14
- /**
15
- * Replace quoted content and comments with whitespace while preserving line
16
- * breaks so simple line-based scanners do not match examples or messages.
17
- */
18
- export const stripQuotedContent = (sourceCode) => {
19
- let sanitized = sourceCode;
20
- const patterns = [
21
- /\/\/[^\n]*/g,
22
- /\/\*[\s\S]*?\*\//g,
23
- /'[^'\\\n]*(?:\\.[^'\\\n]*)*'/g,
24
- /"[^"\\\n]*(?:\\.[^"\\\n]*)*"/g,
25
- /`[\s\S]*?`/g,
26
- ];
27
- for (const pattern of patterns) {
28
- sanitized = stripPattern(sanitized, pattern);
29
- }
30
- return sanitized;
31
- };
32
- //# sourceMappingURL=scan.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/rules/scan.ts"],"names":[],"mappings":"AAAA,MAAM,iBAAiB,GACrB,4DAA4D,CAAC;AAE/D,MAAM,2BAA2B,GAAG;IAClC,oBAAoB;IACpB,mBAAmB;CACX,CAAC;AAEX,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAU,EAAE,CACrD,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAEjC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAE1E,MAAM,YAAY,GAAG,CAAC,UAAkB,EAAE,OAAe,EAAU,EAAE,CACnE,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAE7D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAW,EAAE,CACtD,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEtD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,QAAgB,EAAW,EAAE;IACnE,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAClD,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC7B,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,UAAkB,EAAU,EAAE;IAC/D,IAAI,SAAS,GAAG,UAAU,CAAC;IAC3B,MAAM,QAAQ,GAAG;QACf,aAAa;QACb,mBAAmB;QACnB,+BAA+B;QAC/B,+BAA+B;QAC/B,aAAa;KACd,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,SAAS,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC"}
@@ -1,29 +0,0 @@
1
- export interface ParsedEntry {
2
- readonly line: number;
3
- readonly start: number;
4
- readonly text: string;
5
- }
6
- export interface ObjectProperty extends ParsedEntry {
7
- readonly key: string;
8
- readonly value: string;
9
- }
10
- export interface TrailLikeSpec {
11
- readonly id: string;
12
- readonly kind: 'hike' | 'trail';
13
- readonly line: number;
14
- readonly properties: ReadonlyMap<string, ObjectProperty>;
15
- readonly specText: string;
16
- readonly start: number;
17
- }
18
- export interface SchemaFieldInfo {
19
- readonly derivedLabel: string;
20
- readonly options?: readonly string[] | undefined;
21
- readonly required: boolean;
22
- }
23
- export declare const parseStringLiteral: (text: string) => string | null;
24
- export declare const parseArrayEntries: (arrayText: string, arrayStart: number, sourceCode: string) => readonly ParsedEntry[];
25
- export declare const parseObjectProperties: (objectText: string, objectStart: number, sourceCode: string) => ReadonlyMap<string, ObjectProperty>;
26
- export declare const findTrailLikeSpecs: (sourceCode: string) => readonly TrailLikeSpec[];
27
- export declare const collectTrailIds: (sourceCode: string) => ReadonlySet<string>;
28
- export declare const parseZodObjectShape: (schemaText: string) => ReadonlyMap<string, SchemaFieldInfo>;
29
- //# sourceMappingURL=specs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"specs.d.ts","sourceRoot":"","sources":["../../src/rules/specs.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAuFD,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,IAc1D,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,WAAW,MAAM,EACjB,YAAY,MAAM,EAClB,YAAY,MAAM,KACjB,SAAS,WAAW,EActB,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,YAAY,MAAM,EAClB,aAAa,MAAM,EACnB,YAAY,MAAM,KACjB,WAAW,CAAC,MAAM,EAAE,cAAc,CAcpC,CAAC;AA2KF,eAAO,MAAM,kBAAkB,GAC7B,YAAY,MAAM,KACjB,SAAS,aAAa,EAiBxB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,YAAY,MAAM,KAAG,WAAW,CAAC,MAAM,CACP,CAAC;AAEjE,eAAO,MAAM,mBAAmB,GAC9B,YAAY,MAAM,KACjB,WAAW,CAAC,MAAM,EAAE,eAAe,CAcrC,CAAC"}
@@ -1,192 +0,0 @@
1
- import { captureBalanced, lineNumberAt, splitTopLevelEntriesWithOffsets, } from './structure.js';
2
- const TRAIL_LIKE_PATTERN = /\b(trail|hike)\s*\(/g;
3
- const PROPERTY_PATTERN = /^(?:readonly\s+)?(?:(["'`])([^"'`]+)\1|([A-Za-z_$][\w$]*))\s*:\s*([\s\S]+)$/;
4
- const OPTIONALISH_PATTERN = /(?:^|[^\w])z\.(?:default|nullish|optional)\s*\(|\.(?:default|nullish|optional)\s*\(/;
5
- const humanize = (str) => str
6
- .replaceAll(/([a-z])([A-Z])/g, '$1 $2')
7
- .replaceAll(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
8
- .replace(/^./, (ch) => ch.toUpperCase());
9
- const trimWrapped = (text, open, close) => {
10
- const trimmed = text.trim();
11
- if (!trimmed.startsWith(open) || !trimmed.endsWith(close)) {
12
- return null;
13
- }
14
- return trimmed.slice(1, -1);
15
- };
16
- const firstEntry = (text) => {
17
- const [entry] = splitTopLevelEntriesWithOffsets(text);
18
- return entry ?? null;
19
- };
20
- const createParsedEntry = (sourceCode, start, text) => ({
21
- line: lineNumberAt(sourceCode, start),
22
- start,
23
- text,
24
- });
25
- const createObjectProperty = (entry, key, value, objectStart, objectOffset, sourceCode) => {
26
- const start = objectStart + objectOffset + 1 + entry.start;
27
- return {
28
- key,
29
- line: lineNumberAt(sourceCode, start),
30
- start,
31
- text: entry.text,
32
- value,
33
- };
34
- };
35
- const parsePropertyEntry = (entry, objectStart, objectOffset, sourceCode) => {
36
- const propertyMatch = entry.text.match(PROPERTY_PATTERN);
37
- const key = propertyMatch?.[2] ?? propertyMatch?.[3];
38
- const value = propertyMatch?.[4]?.trim();
39
- if (!key || !value) {
40
- return null;
41
- }
42
- return createObjectProperty(entry, key, value, objectStart, objectOffset, sourceCode);
43
- };
44
- const isDefined = (value) => value !== null;
45
- export const parseStringLiteral = (text) => {
46
- const trimmed = text.trim();
47
- const [quote = ''] = trimmed;
48
- const closer = quote === "'" || quote === '"' || quote === '`' ? quote : null;
49
- if (closer === null || trimmed.at(-1) !== closer) {
50
- return null;
51
- }
52
- const value = trimmed.slice(1, -1);
53
- if (quote === '`' && value.includes('${')) {
54
- return null;
55
- }
56
- return value;
57
- };
58
- export const parseArrayEntries = (arrayText, arrayStart, sourceCode) => {
59
- const inner = trimWrapped(arrayText, '[', ']');
60
- if (inner === null) {
61
- return [];
62
- }
63
- const arrayOffset = arrayText.indexOf('[');
64
- return splitTopLevelEntriesWithOffsets(inner).map((entry) => createParsedEntry(sourceCode, arrayStart + arrayOffset + 1 + entry.start, entry.text));
65
- };
66
- export const parseObjectProperties = (objectText, objectStart, sourceCode) => {
67
- const inner = trimWrapped(objectText, '{', '}');
68
- if (inner === null) {
69
- return new Map();
70
- }
71
- const objectOffset = objectText.indexOf('{');
72
- const properties = splitTopLevelEntriesWithOffsets(inner)
73
- .map((entry) => parsePropertyEntry(entry, objectStart, objectOffset, sourceCode))
74
- .filter(isDefined);
75
- return new Map(properties.map((property) => [property.key, property]));
76
- };
77
- const resolveSpecTarget = (args) => {
78
- const [firstArg, secondArg] = args;
79
- if (!firstArg) {
80
- return null;
81
- }
82
- const id = parseStringLiteral(firstArg.text);
83
- return {
84
- id,
85
- specArg: id === null ? firstArg : (secondArg ?? firstArg),
86
- };
87
- };
88
- const parseCallArguments = (sourceCode, callStart) => {
89
- const openParen = sourceCode.indexOf('(', callStart);
90
- const call = openParen === -1 ? null : captureBalanced(sourceCode, openParen);
91
- if (call === null || openParen === -1) {
92
- return null;
93
- }
94
- return {
95
- argsStart: openParen + 1,
96
- argsText: call.text.slice(1, -1),
97
- };
98
- };
99
- const isSpecObject = (entry) => entry !== undefined && entry.text.trim().startsWith('{');
100
- const resolveSpecId = (resolved, properties) => resolved.id ?? parseStringLiteral(properties.get('id')?.value ?? '');
101
- const buildTrailLikeSpec = (sourceCode, kind, specArg, specStart, id, properties) => ({
102
- id,
103
- kind,
104
- line: lineNumberAt(sourceCode, specStart),
105
- properties,
106
- specText: specArg.text,
107
- start: specStart,
108
- });
109
- const parseResolvedSpec = (sourceCode, resolved, call) => {
110
- const specStart = call.argsStart + resolved.specArg.start;
111
- const properties = parseObjectProperties(resolved.specArg.text, specStart, sourceCode);
112
- const id = resolveSpecId(resolved, properties);
113
- return id === null ? null : { id, properties, specStart };
114
- };
115
- const resolveTrailLikeSpec = (sourceCode, callStart) => {
116
- const call = parseCallArguments(sourceCode, callStart);
117
- if (call === null) {
118
- return null;
119
- }
120
- const resolved = resolveSpecTarget(splitTopLevelEntriesWithOffsets(call.argsText));
121
- if (!resolved || !isSpecObject(resolved.specArg)) {
122
- return null;
123
- }
124
- const parsed = parseResolvedSpec(sourceCode, resolved, call);
125
- return parsed === null ? null : { parsed, resolved };
126
- };
127
- const parseTrailLikeMatch = (sourceCode, kind, callStart) => {
128
- const resolved = resolveTrailLikeSpec(sourceCode, callStart);
129
- if (resolved === null) {
130
- return null;
131
- }
132
- return buildTrailLikeSpec(sourceCode, kind, resolved.resolved.specArg, resolved.parsed.specStart, resolved.parsed.id, resolved.parsed.properties);
133
- };
134
- const findCallArguments = (sourceText, pattern) => {
135
- const index = pattern.exec(sourceText)?.index;
136
- if (index === undefined) {
137
- return null;
138
- }
139
- return parseCallArguments(sourceText, index)?.argsText ?? null;
140
- };
141
- const parseStringArrayLiteral = (arrayText) => {
142
- const inner = trimWrapped(arrayText, '[', ']');
143
- if (inner === null) {
144
- return null;
145
- }
146
- const values = splitTopLevelEntriesWithOffsets(inner).map((entry) => parseStringLiteral(entry.text));
147
- const strings = values.filter((value) => value !== null);
148
- return strings.length === values.length ? strings : null;
149
- };
150
- const parseDescribeLabel = (fieldText) => {
151
- const args = findCallArguments(fieldText, /\.describe\s*\(/);
152
- return args === null ? undefined : (parseStringLiteral(args) ?? undefined);
153
- };
154
- const parseEnumValues = (fieldText) => {
155
- const args = findCallArguments(fieldText, /\bz\.enum\s*\(/);
156
- const entry = args === null ? null : firstEntry(args);
157
- return entry ? (parseStringArrayLiteral(entry.text) ?? undefined) : undefined;
158
- };
159
- const toSchemaFieldInfo = (key, property) => ({
160
- derivedLabel: parseDescribeLabel(property.value) ?? humanize(key),
161
- options: parseEnumValues(property.value),
162
- required: !OPTIONALISH_PATTERN.test(property.value),
163
- });
164
- export const findTrailLikeSpecs = (sourceCode) => {
165
- const specs = [];
166
- for (const match of sourceCode.matchAll(TRAIL_LIKE_PATTERN)) {
167
- const callStart = match.index;
168
- if (callStart === undefined) {
169
- continue;
170
- }
171
- const kind = match[1] === 'hike' ? 'hike' : 'trail';
172
- const spec = parseTrailLikeMatch(sourceCode, kind, callStart);
173
- if (spec !== null) {
174
- specs.push(spec);
175
- }
176
- }
177
- return specs;
178
- };
179
- export const collectTrailIds = (sourceCode) => new Set(findTrailLikeSpecs(sourceCode).map((spec) => spec.id));
180
- export const parseZodObjectShape = (schemaText) => {
181
- const args = findCallArguments(schemaText, /\bz\.object\s*\(/);
182
- const shapeEntry = args === null ? null : firstEntry(args);
183
- if (!shapeEntry || !shapeEntry.text.trim().startsWith('{')) {
184
- return new Map();
185
- }
186
- const shape = parseObjectProperties(shapeEntry.text, 0, shapeEntry.text);
187
- return new Map([...shape.entries()].map(([key, property]) => [
188
- key,
189
- toSchemaFieldInfo(key, property),
190
- ]));
191
- };
192
- //# sourceMappingURL=specs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"specs.js","sourceRoot":"","sources":["../../src/rules/specs.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- interface BalancedSegment {
2
- readonly end: number;
3
- readonly text: string;
4
- }
5
- export interface SplitEntry {
6
- readonly start: number;
7
- readonly text: string;
8
- }
9
- export declare const captureBalanced: (sourceText: string, startIndex: number) => BalancedSegment | null;
10
- export declare const lineNumberAt: (sourceText: string, startIndex: number) => number;
11
- export declare const splitTopLevelEntriesWithOffsets: (sourceText: string) => SplitEntry[];
12
- export {};
13
- //# sourceMappingURL=structure.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../src/rules/structure.ts"],"names":[],"mappings":"AAYA,UAAU,eAAe;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAmHD,eAAO,MAAM,eAAe,GAC1B,YAAY,MAAM,EAClB,YAAY,MAAM,KACjB,eAAe,GAAG,IAiBpB,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,YAAY,MAAM,EAAE,YAAY,MAAM,KAAG,MAClB,CAAC;AAuDrD,eAAO,MAAM,+BAA+B,GAC1C,YAAY,MAAM,KACjB,UAAU,EAkBZ,CAAC"}