@ontrails/warden 1.0.0-beta.13 → 1.0.0-beta.15

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 (474) hide show
  1. package/.turbo/turbo-lint.log +1 -1
  2. package/CHANGELOG.md +30 -0
  3. package/README.md +31 -20
  4. package/dist/cli.d.ts +19 -2
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +261 -64
  7. package/dist/cli.js.map +1 -1
  8. package/dist/draft.d.ts +5 -0
  9. package/dist/draft.d.ts.map +1 -0
  10. package/dist/draft.js +16 -0
  11. package/dist/draft.js.map +1 -0
  12. package/dist/drift.d.ts +10 -7
  13. package/dist/drift.d.ts.map +1 -1
  14. package/dist/drift.js +50 -16
  15. package/dist/drift.js.map +1 -1
  16. package/dist/formatters.d.ts +2 -1
  17. package/dist/formatters.d.ts.map +1 -1
  18. package/dist/formatters.js +15 -4
  19. package/dist/formatters.js.map +1 -1
  20. package/dist/index.d.ts +9 -17
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +10 -17
  23. package/dist/index.js.map +1 -1
  24. package/dist/rules/ast.d.ts +412 -7
  25. package/dist/rules/ast.d.ts.map +1 -1
  26. package/dist/rules/ast.js +1847 -102
  27. package/dist/rules/ast.js.map +1 -1
  28. package/dist/rules/circular-refs.d.ts +6 -0
  29. package/dist/rules/circular-refs.d.ts.map +1 -0
  30. package/dist/rules/circular-refs.js +83 -0
  31. package/dist/rules/circular-refs.js.map +1 -0
  32. package/dist/rules/context-no-surface-types.d.ts.map +1 -1
  33. package/dist/rules/context-no-surface-types.js +59 -3
  34. package/dist/rules/context-no-surface-types.js.map +1 -1
  35. package/dist/rules/contour-exists.d.ts +7 -0
  36. package/dist/rules/contour-exists.d.ts.map +1 -0
  37. package/dist/rules/contour-exists.js +113 -0
  38. package/dist/rules/contour-exists.js.map +1 -0
  39. package/dist/rules/contour-ids.d.ts +10 -0
  40. package/dist/rules/contour-ids.d.ts.map +1 -0
  41. package/dist/rules/contour-ids.js +12 -0
  42. package/dist/rules/contour-ids.js.map +1 -0
  43. package/dist/rules/cross-declarations.d.ts.map +1 -1
  44. package/dist/rules/cross-declarations.js +171 -57
  45. package/dist/rules/cross-declarations.js.map +1 -1
  46. package/dist/rules/dead-internal-trail.d.ts +3 -0
  47. package/dist/rules/dead-internal-trail.d.ts.map +1 -0
  48. package/dist/rules/dead-internal-trail.js +80 -0
  49. package/dist/rules/dead-internal-trail.js.map +1 -0
  50. package/dist/rules/draft-file-marking.d.ts +6 -0
  51. package/dist/rules/draft-file-marking.d.ts.map +1 -0
  52. package/dist/rules/draft-file-marking.js +87 -0
  53. package/dist/rules/draft-file-marking.js.map +1 -0
  54. package/dist/rules/draft-visible-debt.d.ts +12 -0
  55. package/dist/rules/draft-visible-debt.d.ts.map +1 -0
  56. package/dist/rules/draft-visible-debt.js +50 -0
  57. package/dist/rules/draft-visible-debt.js.map +1 -0
  58. package/dist/rules/error-mapping-completeness.d.ts +13 -0
  59. package/dist/rules/error-mapping-completeness.d.ts.map +1 -0
  60. package/dist/rules/error-mapping-completeness.js +160 -0
  61. package/dist/rules/error-mapping-completeness.js.map +1 -0
  62. package/dist/rules/example-valid.d.ts +6 -0
  63. package/dist/rules/example-valid.d.ts.map +1 -0
  64. package/dist/rules/example-valid.js +203 -0
  65. package/dist/rules/example-valid.js.map +1 -0
  66. package/dist/rules/fires-declarations.d.ts +16 -0
  67. package/dist/rules/fires-declarations.d.ts.map +1 -0
  68. package/dist/rules/fires-declarations.js +444 -0
  69. package/dist/rules/fires-declarations.js.map +1 -0
  70. package/dist/rules/implementation-returns-result.d.ts +9 -0
  71. package/dist/rules/implementation-returns-result.d.ts.map +1 -1
  72. package/dist/rules/implementation-returns-result.js +638 -76
  73. package/dist/rules/implementation-returns-result.js.map +1 -1
  74. package/dist/rules/incomplete-accessor-for-standard-op.d.ts +30 -0
  75. package/dist/rules/incomplete-accessor-for-standard-op.d.ts.map +1 -0
  76. package/dist/rules/incomplete-accessor-for-standard-op.js +226 -0
  77. package/dist/rules/incomplete-accessor-for-standard-op.js.map +1 -0
  78. package/dist/rules/incomplete-crud.d.ts +21 -0
  79. package/dist/rules/incomplete-crud.d.ts.map +1 -0
  80. package/dist/rules/incomplete-crud.js +368 -0
  81. package/dist/rules/incomplete-crud.js.map +1 -0
  82. package/dist/rules/index.d.ts +40 -7
  83. package/dist/rules/index.d.ts.map +1 -1
  84. package/dist/rules/index.js +91 -15
  85. package/dist/rules/index.js.map +1 -1
  86. package/dist/rules/intent-propagation.d.ts +3 -0
  87. package/dist/rules/intent-propagation.d.ts.map +1 -0
  88. package/dist/rules/intent-propagation.js +57 -0
  89. package/dist/rules/intent-propagation.js.map +1 -0
  90. package/dist/rules/missing-reconcile.d.ts +3 -0
  91. package/dist/rules/missing-reconcile.d.ts.map +1 -0
  92. package/dist/rules/missing-reconcile.js +44 -0
  93. package/dist/rules/missing-reconcile.js.map +1 -0
  94. package/dist/rules/missing-visibility.d.ts +3 -0
  95. package/dist/rules/missing-visibility.d.ts.map +1 -0
  96. package/dist/rules/missing-visibility.js +63 -0
  97. package/dist/rules/missing-visibility.js.map +1 -0
  98. package/dist/rules/no-direct-impl-in-route.d.ts.map +1 -1
  99. package/dist/rules/no-direct-impl-in-route.js +0 -3
  100. package/dist/rules/no-direct-impl-in-route.js.map +1 -1
  101. package/dist/rules/no-direct-implementation-call.js +1 -1
  102. package/dist/rules/no-direct-implementation-call.js.map +1 -1
  103. package/dist/rules/no-sync-result-assumption.d.ts.map +1 -1
  104. package/dist/rules/no-sync-result-assumption.js +870 -61
  105. package/dist/rules/no-sync-result-assumption.js.map +1 -1
  106. package/dist/rules/no-throw-in-detour-recover.d.ts +3 -0
  107. package/dist/rules/no-throw-in-detour-recover.d.ts.map +1 -0
  108. package/dist/rules/no-throw-in-detour-recover.js +147 -0
  109. package/dist/rules/no-throw-in-detour-recover.js.map +1 -0
  110. package/dist/rules/no-throw-in-detour-target.d.ts +4 -1
  111. package/dist/rules/no-throw-in-detour-target.d.ts.map +1 -1
  112. package/dist/rules/no-throw-in-detour-target.js +6 -3
  113. package/dist/rules/no-throw-in-detour-target.js.map +1 -1
  114. package/dist/rules/no-throw-in-implementation.d.ts +4 -2
  115. package/dist/rules/no-throw-in-implementation.d.ts.map +1 -1
  116. package/dist/rules/no-throw-in-implementation.js +6 -4
  117. package/dist/rules/no-throw-in-implementation.js.map +1 -1
  118. package/dist/rules/on-references-exist.d.ts +14 -0
  119. package/dist/rules/on-references-exist.d.ts.map +1 -0
  120. package/dist/rules/on-references-exist.js +109 -0
  121. package/dist/rules/on-references-exist.js.map +1 -0
  122. package/dist/rules/orphaned-signal.d.ts +3 -0
  123. package/dist/rules/orphaned-signal.d.ts.map +1 -0
  124. package/dist/rules/orphaned-signal.js +67 -0
  125. package/dist/rules/orphaned-signal.js.map +1 -0
  126. package/dist/rules/permit-governance.d.ts +3 -0
  127. package/dist/rules/permit-governance.d.ts.map +1 -0
  128. package/dist/rules/permit-governance.js +15 -0
  129. package/dist/rules/permit-governance.js.map +1 -0
  130. package/dist/rules/reference-exists.d.ts +6 -0
  131. package/dist/rules/reference-exists.d.ts.map +1 -0
  132. package/dist/rules/reference-exists.js +47 -0
  133. package/dist/rules/reference-exists.js.map +1 -0
  134. package/dist/rules/registry-names.d.ts +8 -0
  135. package/dist/rules/registry-names.d.ts.map +1 -0
  136. package/dist/rules/registry-names.js +83 -0
  137. package/dist/rules/registry-names.js.map +1 -0
  138. package/dist/rules/resource-declarations.d.ts +14 -0
  139. package/dist/rules/resource-declarations.d.ts.map +1 -0
  140. package/dist/rules/resource-declarations.js +413 -0
  141. package/dist/rules/resource-declarations.js.map +1 -0
  142. package/dist/rules/resource-exists.d.ts +6 -0
  143. package/dist/rules/resource-exists.d.ts.map +1 -0
  144. package/dist/rules/resource-exists.js +90 -0
  145. package/dist/rules/resource-exists.js.map +1 -0
  146. package/dist/rules/resource-id-grammar.d.ts +3 -0
  147. package/dist/rules/resource-id-grammar.d.ts.map +1 -0
  148. package/dist/rules/resource-id-grammar.js +39 -0
  149. package/dist/rules/resource-id-grammar.js.map +1 -0
  150. package/dist/rules/specs.d.ts.map +1 -1
  151. package/dist/rules/specs.js +5 -1
  152. package/dist/rules/specs.js.map +1 -1
  153. package/dist/rules/types.d.ts +53 -4
  154. package/dist/rules/types.d.ts.map +1 -1
  155. package/dist/rules/unreachable-detour-shadowing.d.ts +3 -0
  156. package/dist/rules/unreachable-detour-shadowing.d.ts.map +1 -0
  157. package/dist/rules/unreachable-detour-shadowing.js +202 -0
  158. package/dist/rules/unreachable-detour-shadowing.js.map +1 -0
  159. package/dist/rules/valid-describe-refs.d.ts.map +1 -1
  160. package/dist/rules/valid-describe-refs.js +132 -16
  161. package/dist/rules/valid-describe-refs.js.map +1 -1
  162. package/dist/rules/valid-detour-contract.d.ts +3 -0
  163. package/dist/rules/valid-detour-contract.d.ts.map +1 -0
  164. package/dist/rules/valid-detour-contract.js +47 -0
  165. package/dist/rules/valid-detour-contract.js.map +1 -0
  166. package/dist/rules/valid-detour-refs.d.ts.map +1 -1
  167. package/dist/rules/valid-detour-refs.js +73 -82
  168. package/dist/rules/valid-detour-refs.js.map +1 -1
  169. package/dist/rules/warden-export-symmetry.d.ts +7 -0
  170. package/dist/rules/warden-export-symmetry.d.ts.map +1 -0
  171. package/dist/rules/warden-export-symmetry.js +352 -0
  172. package/dist/rules/warden-export-symmetry.js.map +1 -0
  173. package/dist/rules/warden-rules-use-ast.d.ts +17 -0
  174. package/dist/rules/warden-rules-use-ast.d.ts.map +1 -0
  175. package/dist/rules/warden-rules-use-ast.js +778 -0
  176. package/dist/rules/warden-rules-use-ast.js.map +1 -0
  177. package/dist/trails/circular-refs.trail.d.ts +24 -0
  178. package/dist/trails/circular-refs.trail.d.ts.map +1 -0
  179. package/dist/trails/circular-refs.trail.js +29 -0
  180. package/dist/trails/circular-refs.trail.js.map +1 -0
  181. package/dist/trails/context-no-surface-types.trail.d.ts +2 -2
  182. package/dist/trails/context-no-surface-types.trail.d.ts.map +1 -1
  183. package/dist/trails/context-no-trailhead-types.trail.d.ts +2 -2
  184. package/dist/trails/context-no-trailhead-types.trail.d.ts.map +1 -1
  185. package/dist/trails/contour-exists.trail.d.ts +24 -0
  186. package/dist/trails/contour-exists.trail.d.ts.map +1 -0
  187. package/dist/trails/contour-exists.trail.js +21 -0
  188. package/dist/trails/contour-exists.trail.js.map +1 -0
  189. package/dist/trails/cross-declarations.trail.d.ts +2 -2
  190. package/dist/trails/cross-declarations.trail.d.ts.map +1 -1
  191. package/dist/trails/dead-internal-trail.trail.d.ts +24 -0
  192. package/dist/trails/dead-internal-trail.trail.d.ts.map +1 -0
  193. package/dist/trails/dead-internal-trail.trail.js +26 -0
  194. package/dist/trails/dead-internal-trail.trail.js.map +1 -0
  195. package/dist/trails/{provision-declarations.trail.d.ts → draft-file-marking.trail.d.ts} +3 -3
  196. package/dist/trails/draft-file-marking.trail.d.ts.map +1 -0
  197. package/dist/trails/draft-file-marking.trail.js +16 -0
  198. package/dist/trails/draft-file-marking.trail.js.map +1 -0
  199. package/dist/trails/draft-visible-debt.trail.d.ts +13 -0
  200. package/dist/trails/draft-visible-debt.trail.d.ts.map +1 -0
  201. package/dist/trails/draft-visible-debt.trail.js +16 -0
  202. package/dist/trails/draft-visible-debt.trail.js.map +1 -0
  203. package/dist/trails/error-mapping-completeness.trail.d.ts +13 -0
  204. package/dist/trails/error-mapping-completeness.trail.d.ts.map +1 -0
  205. package/dist/trails/error-mapping-completeness.trail.js +29 -0
  206. package/dist/trails/error-mapping-completeness.trail.js.map +1 -0
  207. package/dist/trails/{follow-declarations.trail.d.ts → example-valid.trail.d.ts} +3 -3
  208. package/dist/trails/example-valid.trail.d.ts.map +1 -0
  209. package/dist/trails/example-valid.trail.js +25 -0
  210. package/dist/trails/example-valid.trail.js.map +1 -0
  211. package/dist/trails/fires-declarations.trail.d.ts +13 -0
  212. package/dist/trails/fires-declarations.trail.d.ts.map +1 -0
  213. package/dist/trails/fires-declarations.trail.js +22 -0
  214. package/dist/trails/fires-declarations.trail.js.map +1 -0
  215. package/dist/trails/implementation-returns-result.trail.d.ts +2 -2
  216. package/dist/trails/implementation-returns-result.trail.d.ts.map +1 -1
  217. package/dist/trails/incomplete-accessor-for-standard-op.trail.d.ts +12 -0
  218. package/dist/trails/incomplete-accessor-for-standard-op.trail.d.ts.map +1 -0
  219. package/dist/trails/incomplete-accessor-for-standard-op.trail.js +60 -0
  220. package/dist/trails/incomplete-accessor-for-standard-op.trail.js.map +1 -0
  221. package/dist/trails/incomplete-crud.trail.d.ts +24 -0
  222. package/dist/trails/incomplete-crud.trail.d.ts.map +1 -0
  223. package/dist/trails/incomplete-crud.trail.js +39 -0
  224. package/dist/trails/incomplete-crud.trail.js.map +1 -0
  225. package/dist/trails/index.d.ts +29 -7
  226. package/dist/trails/index.d.ts.map +1 -1
  227. package/dist/trails/index.js +28 -6
  228. package/dist/trails/index.js.map +1 -1
  229. package/dist/trails/intent-propagation.trail.d.ts +24 -0
  230. package/dist/trails/intent-propagation.trail.d.ts.map +1 -0
  231. package/dist/trails/intent-propagation.trail.js +30 -0
  232. package/dist/trails/intent-propagation.trail.js.map +1 -0
  233. package/dist/trails/missing-reconcile.trail.d.ts +24 -0
  234. package/dist/trails/missing-reconcile.trail.d.ts.map +1 -0
  235. package/dist/trails/missing-reconcile.trail.js +33 -0
  236. package/dist/trails/missing-reconcile.trail.js.map +1 -0
  237. package/dist/trails/missing-visibility.trail.d.ts +24 -0
  238. package/dist/trails/missing-visibility.trail.d.ts.map +1 -0
  239. package/dist/trails/missing-visibility.trail.js +22 -0
  240. package/dist/trails/missing-visibility.trail.js.map +1 -0
  241. package/dist/trails/no-direct-impl-in-route.trail.d.ts +2 -2
  242. package/dist/trails/no-direct-impl-in-route.trail.d.ts.map +1 -1
  243. package/dist/trails/no-direct-implementation-call.trail.d.ts +2 -2
  244. package/dist/trails/no-direct-implementation-call.trail.d.ts.map +1 -1
  245. package/dist/trails/no-sync-result-assumption.trail.d.ts +2 -2
  246. package/dist/trails/no-sync-result-assumption.trail.d.ts.map +1 -1
  247. package/dist/trails/no-throw-in-detour-recover.trail.d.ts +13 -0
  248. package/dist/trails/no-throw-in-detour-recover.trail.d.ts.map +1 -0
  249. package/dist/trails/no-throw-in-detour-recover.trail.js +24 -0
  250. package/dist/trails/no-throw-in-detour-recover.trail.js.map +1 -0
  251. package/dist/trails/no-throw-in-detour-target.trail.d.ts +13 -3
  252. package/dist/trails/no-throw-in-detour-target.trail.d.ts.map +1 -1
  253. package/dist/trails/no-throw-in-implementation.trail.d.ts +2 -2
  254. package/dist/trails/no-throw-in-implementation.trail.d.ts.map +1 -1
  255. package/dist/trails/on-references-exist.trail.d.ts +24 -0
  256. package/dist/trails/on-references-exist.trail.d.ts.map +1 -0
  257. package/dist/trails/on-references-exist.trail.js +21 -0
  258. package/dist/trails/on-references-exist.trail.js.map +1 -0
  259. package/dist/trails/orphaned-signal.trail.d.ts +24 -0
  260. package/dist/trails/orphaned-signal.trail.d.ts.map +1 -0
  261. package/dist/trails/orphaned-signal.trail.js +36 -0
  262. package/dist/trails/orphaned-signal.trail.js.map +1 -0
  263. package/dist/trails/permit-governance.trail.d.ts +12 -0
  264. package/dist/trails/permit-governance.trail.d.ts.map +1 -0
  265. package/dist/trails/permit-governance.trail.js +47 -0
  266. package/dist/trails/permit-governance.trail.js.map +1 -0
  267. package/dist/trails/prefer-schema-inference.trail.d.ts +2 -2
  268. package/dist/trails/prefer-schema-inference.trail.d.ts.map +1 -1
  269. package/dist/trails/reference-exists.trail.d.ts +24 -0
  270. package/dist/trails/reference-exists.trail.d.ts.map +1 -0
  271. package/dist/trails/reference-exists.trail.js +25 -0
  272. package/dist/trails/reference-exists.trail.js.map +1 -0
  273. package/dist/trails/resource-declarations.trail.d.ts +13 -0
  274. package/dist/trails/resource-declarations.trail.d.ts.map +1 -0
  275. package/dist/trails/{provision-declarations.trail.js → resource-declarations.trail.js} +7 -7
  276. package/dist/trails/resource-declarations.trail.js.map +1 -0
  277. package/dist/trails/resource-exists.trail.d.ts +24 -0
  278. package/dist/trails/resource-exists.trail.d.ts.map +1 -0
  279. package/dist/trails/{provision-exists.trail.js → resource-exists.trail.js} +8 -8
  280. package/dist/trails/resource-exists.trail.js.map +1 -0
  281. package/dist/trails/resource-id-grammar.trail.d.ts +13 -0
  282. package/dist/trails/resource-id-grammar.trail.d.ts.map +1 -0
  283. package/dist/trails/resource-id-grammar.trail.js +38 -0
  284. package/dist/trails/resource-id-grammar.trail.js.map +1 -0
  285. package/dist/trails/run.d.ts +25 -9
  286. package/dist/trails/run.d.ts.map +1 -1
  287. package/dist/trails/run.js +63 -19
  288. package/dist/trails/run.js.map +1 -1
  289. package/dist/trails/schema.d.ts +28 -3
  290. package/dist/trails/schema.d.ts.map +1 -1
  291. package/dist/trails/schema.js +57 -4
  292. package/dist/trails/schema.js.map +1 -1
  293. package/dist/trails/unreachable-detour-shadowing.trail.d.ts +13 -0
  294. package/dist/trails/unreachable-detour-shadowing.trail.d.ts.map +1 -0
  295. package/dist/trails/unreachable-detour-shadowing.trail.js +44 -0
  296. package/dist/trails/unreachable-detour-shadowing.trail.js.map +1 -0
  297. package/dist/trails/valid-describe-refs.trail.d.ts +12 -3
  298. package/dist/trails/valid-describe-refs.trail.d.ts.map +1 -1
  299. package/dist/trails/valid-detour-contract.trail.d.ts +12 -0
  300. package/dist/trails/valid-detour-contract.trail.d.ts.map +1 -0
  301. package/dist/trails/valid-detour-contract.trail.js +66 -0
  302. package/dist/trails/valid-detour-contract.trail.js.map +1 -0
  303. package/dist/trails/valid-detour-refs.trail.d.ts +13 -3
  304. package/dist/trails/valid-detour-refs.trail.d.ts.map +1 -1
  305. package/dist/trails/warden-export-symmetry.trail.d.ts +13 -0
  306. package/dist/trails/warden-export-symmetry.trail.d.ts.map +1 -0
  307. package/dist/trails/warden-export-symmetry.trail.js +16 -0
  308. package/dist/trails/warden-export-symmetry.trail.js.map +1 -0
  309. package/dist/trails/warden-rules-use-ast.trail.d.ts +13 -0
  310. package/dist/trails/warden-rules-use-ast.trail.d.ts.map +1 -0
  311. package/dist/trails/warden-rules-use-ast.trail.js +41 -0
  312. package/dist/trails/warden-rules-use-ast.trail.js.map +1 -0
  313. package/dist/trails/wrap-rule.d.ts +16 -2
  314. package/dist/trails/wrap-rule.d.ts.map +1 -1
  315. package/dist/trails/wrap-rule.js +71 -11
  316. package/dist/trails/wrap-rule.js.map +1 -1
  317. package/package.json +7 -4
  318. package/src/__tests__/ast.test.ts +613 -0
  319. package/src/__tests__/circular-refs.test.ts +121 -0
  320. package/src/__tests__/cli.test.ts +360 -32
  321. package/src/__tests__/contour-exists.test.ts +203 -0
  322. package/src/__tests__/cross-declarations.test.ts +245 -0
  323. package/src/__tests__/dead-internal-trail.test.ts +81 -0
  324. package/src/__tests__/draft-rules-context.test.ts +150 -0
  325. package/src/__tests__/drift.test.ts +75 -5
  326. package/src/__tests__/error-mapping-completeness.test.ts +56 -0
  327. package/src/__tests__/example-valid.test.ts +101 -0
  328. package/src/__tests__/fires-declarations-param-destructure.test.ts +54 -0
  329. package/src/__tests__/fires-declarations.test.ts +652 -0
  330. package/src/__tests__/formatters.test.ts +2 -2
  331. package/src/__tests__/implementation-returns-result.test.ts +1016 -2
  332. package/src/__tests__/incomplete-accessor-for-standard-op.test.ts +337 -0
  333. package/src/__tests__/incomplete-crud.test.ts +498 -0
  334. package/src/__tests__/intent-propagation.test.ts +116 -0
  335. package/src/__tests__/missing-reconcile.test.ts +154 -0
  336. package/src/__tests__/missing-visibility.test.ts +108 -0
  337. package/src/__tests__/no-sync-result-assumption.test.ts +870 -39
  338. package/src/__tests__/no-throw-in-detour-recover.test.ts +93 -0
  339. package/src/__tests__/no-throw-in-implementation.test.ts +88 -0
  340. package/src/__tests__/on-references-exist.test.ts +151 -0
  341. package/src/__tests__/orphaned-signal.test.ts +137 -0
  342. package/src/__tests__/permit-governance.test.ts +66 -0
  343. package/src/__tests__/reference-exists.test.ts +281 -0
  344. package/src/__tests__/resource-declarations.test.ts +448 -0
  345. package/src/__tests__/resource-exists.test.ts +122 -0
  346. package/src/__tests__/resource-id-grammar.test.ts +50 -0
  347. package/src/__tests__/rules.test.ts +17 -77
  348. package/src/__tests__/topo-aware-rule.test.ts +257 -0
  349. package/src/__tests__/trails.test.ts +2 -2
  350. package/src/__tests__/unreachable-detour-shadowing.test.ts +128 -0
  351. package/src/__tests__/valid-describe-refs.test.ts +183 -0
  352. package/src/__tests__/valid-detour-contract.test.ts +86 -0
  353. package/src/__tests__/warden-export-symmetry.test.ts +251 -0
  354. package/src/__tests__/warden-rules-use-ast.test.ts +468 -0
  355. package/src/__tests__/wrap-rule.test.ts +3 -3
  356. package/src/cli.ts +458 -91
  357. package/src/draft.ts +22 -0
  358. package/src/drift.ts +63 -21
  359. package/src/formatters.ts +15 -4
  360. package/src/index.ts +62 -23
  361. package/src/rules/ast.ts +2715 -119
  362. package/src/rules/circular-refs.ts +154 -0
  363. package/src/rules/{context-no-trailhead-types.ts → context-no-surface-types.ts} +72 -12
  364. package/src/rules/contour-exists.ts +251 -0
  365. package/src/rules/contour-ids.ts +15 -0
  366. package/src/rules/cross-declarations.ts +277 -69
  367. package/src/rules/dead-internal-trail.ts +141 -0
  368. package/src/rules/draft-file-marking.ts +160 -0
  369. package/src/rules/draft-visible-debt.ts +87 -0
  370. package/src/rules/error-mapping-completeness.ts +273 -0
  371. package/src/rules/example-valid.ts +401 -0
  372. package/src/rules/fires-declarations.ts +609 -0
  373. package/src/rules/implementation-returns-result.ts +1042 -122
  374. package/src/rules/incomplete-accessor-for-standard-op.ts +315 -0
  375. package/src/rules/incomplete-crud.ts +579 -0
  376. package/src/rules/index.ts +95 -16
  377. package/src/rules/intent-propagation.ts +142 -0
  378. package/src/rules/missing-reconcile.ts +98 -0
  379. package/src/rules/missing-visibility.ts +110 -0
  380. package/src/rules/no-direct-impl-in-route.ts +0 -4
  381. package/src/rules/no-direct-implementation-call.ts +1 -1
  382. package/src/rules/no-sync-result-assumption.ts +1134 -96
  383. package/src/rules/no-throw-in-detour-recover.ts +225 -0
  384. package/src/rules/no-throw-in-implementation.ts +6 -4
  385. package/src/rules/on-references-exist.ts +194 -0
  386. package/src/rules/orphaned-signal.ts +150 -0
  387. package/src/rules/permit-governance.ts +25 -0
  388. package/src/rules/reference-exists.ts +98 -0
  389. package/src/rules/registry-names.ts +83 -0
  390. package/src/rules/{provision-declarations.ts → resource-declarations.ts} +208 -138
  391. package/src/rules/{provision-exists.ts → resource-exists.ts} +48 -51
  392. package/src/rules/resource-id-grammar.ts +65 -0
  393. package/src/rules/specs.ts +5 -1
  394. package/src/rules/types.ts +57 -4
  395. package/src/rules/unreachable-detour-shadowing.ts +375 -0
  396. package/src/rules/valid-describe-refs.ts +160 -32
  397. package/src/rules/valid-detour-contract.ts +78 -0
  398. package/src/rules/warden-export-symmetry.ts +533 -0
  399. package/src/rules/warden-rules-use-ast.ts +996 -0
  400. package/src/trails/circular-refs.trail.ts +29 -0
  401. package/src/trails/{context-no-trailhead-types.trail.ts → context-no-surface-types.trail.ts} +4 -4
  402. package/src/trails/contour-exists.trail.ts +21 -0
  403. package/src/trails/dead-internal-trail.trail.ts +26 -0
  404. package/src/trails/draft-file-marking.trail.ts +16 -0
  405. package/src/trails/draft-visible-debt.trail.ts +16 -0
  406. package/src/trails/error-mapping-completeness.trail.ts +29 -0
  407. package/src/trails/example-valid.trail.ts +25 -0
  408. package/src/trails/fires-declarations.trail.ts +22 -0
  409. package/src/trails/incomplete-accessor-for-standard-op.trail.ts +76 -0
  410. package/src/trails/incomplete-crud.trail.ts +39 -0
  411. package/src/trails/index.ts +40 -7
  412. package/src/trails/intent-propagation.trail.ts +30 -0
  413. package/src/trails/missing-reconcile.trail.ts +33 -0
  414. package/src/trails/missing-visibility.trail.ts +22 -0
  415. package/src/trails/no-throw-in-detour-recover.trail.ts +24 -0
  416. package/src/trails/on-references-exist.trail.ts +21 -0
  417. package/src/trails/orphaned-signal.trail.ts +36 -0
  418. package/src/trails/permit-governance.trail.ts +51 -0
  419. package/src/trails/reference-exists.trail.ts +25 -0
  420. package/src/trails/{provision-declarations.trail.ts → resource-declarations.trail.ts} +6 -6
  421. package/src/trails/{provision-exists.trail.ts → resource-exists.trail.ts} +7 -7
  422. package/src/trails/resource-id-grammar.trail.ts +39 -0
  423. package/src/trails/run.ts +121 -24
  424. package/src/trails/schema.ts +66 -4
  425. package/src/trails/unreachable-detour-shadowing.trail.ts +45 -0
  426. package/src/trails/valid-detour-contract.trail.ts +71 -0
  427. package/src/trails/warden-export-symmetry.trail.ts +16 -0
  428. package/src/trails/warden-rules-use-ast.trail.ts +45 -0
  429. package/src/trails/wrap-rule.ts +104 -12
  430. package/tsconfig.tests.json +10 -0
  431. package/tsconfig.tsbuildinfo +1 -1
  432. package/dist/rules/follow-declarations.d.ts +0 -13
  433. package/dist/rules/follow-declarations.d.ts.map +0 -1
  434. package/dist/rules/follow-declarations.js +0 -264
  435. package/dist/rules/follow-declarations.js.map +0 -1
  436. package/dist/rules/provision-declarations.d.ts +0 -14
  437. package/dist/rules/provision-declarations.d.ts.map +0 -1
  438. package/dist/rules/provision-declarations.js +0 -344
  439. package/dist/rules/provision-declarations.js.map +0 -1
  440. package/dist/rules/provision-exists.d.ts +0 -6
  441. package/dist/rules/provision-exists.d.ts.map +0 -1
  442. package/dist/rules/provision-exists.js +0 -89
  443. package/dist/rules/provision-exists.js.map +0 -1
  444. package/dist/rules/service-declarations.d.ts +0 -16
  445. package/dist/rules/service-declarations.d.ts.map +0 -1
  446. package/dist/rules/service-declarations.js +0 -346
  447. package/dist/rules/service-declarations.js.map +0 -1
  448. package/dist/rules/service-exists.d.ts +0 -8
  449. package/dist/rules/service-exists.d.ts.map +0 -1
  450. package/dist/rules/service-exists.js +0 -91
  451. package/dist/rules/service-exists.js.map +0 -1
  452. package/dist/trails/follow-declarations.trail.d.ts.map +0 -1
  453. package/dist/trails/follow-declarations.trail.js +0 -22
  454. package/dist/trails/follow-declarations.trail.js.map +0 -1
  455. package/dist/trails/provision-declarations.trail.d.ts.map +0 -1
  456. package/dist/trails/provision-declarations.trail.js.map +0 -1
  457. package/dist/trails/provision-exists.trail.d.ts +0 -15
  458. package/dist/trails/provision-exists.trail.d.ts.map +0 -1
  459. package/dist/trails/provision-exists.trail.js.map +0 -1
  460. package/dist/trails/service-declarations.trail.d.ts +0 -26
  461. package/dist/trails/service-declarations.trail.d.ts.map +0 -1
  462. package/dist/trails/service-declarations.trail.js +0 -27
  463. package/dist/trails/service-declarations.trail.js.map +0 -1
  464. package/dist/trails/service-exists.trail.d.ts +0 -32
  465. package/dist/trails/service-exists.trail.d.ts.map +0 -1
  466. package/dist/trails/service-exists.trail.js +0 -29
  467. package/dist/trails/service-exists.trail.js.map +0 -1
  468. package/src/__tests__/no-throw-in-detour-target.test.ts +0 -78
  469. package/src/__tests__/provision-declarations.test.ts +0 -318
  470. package/src/__tests__/provision-exists.test.ts +0 -122
  471. package/src/rules/no-throw-in-detour-target.ts +0 -150
  472. package/src/rules/valid-detour-refs.ts +0 -187
  473. package/src/trails/no-throw-in-detour-target.trail.ts +0 -20
  474. package/src/trails/valid-detour-refs.trail.ts +0 -24
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Validates that registered transport error mappers cover every error category.
3
+ *
4
+ * Scans `createTransportErrorMapper(...)` calls and resolves simple object
5
+ * literals, identifier bindings, and object-property references in the same
6
+ * file so incomplete mapper registrations are caught before they ship.
7
+ */
8
+ import type { WardenRule } from './types.js';
9
+ /**
10
+ * Flags `createTransportErrorMapper()` registrations that omit error categories.
11
+ */
12
+ export declare const errorMappingCompleteness: WardenRule;
13
+ //# sourceMappingURL=error-mapping-completeness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-mapping-completeness.d.ts","sourceRoot":"","sources":["../../src/rules/error-mapping-completeness.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AAsN/D;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,UAmCtC,CAAC"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Validates that registered transport error mappers cover every error category.
3
+ *
4
+ * Scans `createTransportErrorMapper(...)` calls and resolves simple object
5
+ * literals, identifier bindings, and object-property references in the same
6
+ * file so incomplete mapper registrations are caught before they ship.
7
+ */
8
+ import { errorCategories } from '@ontrails/core';
9
+ import { getStringValue, identifierName, isStringLiteral, offsetToLine, parse, walk, } from './ast.js';
10
+ import { isTestFile } from './scan.js';
11
+ const MEMBER_EXPRESSION_TYPES = new Set([
12
+ 'MemberExpression',
13
+ 'StaticMemberExpression',
14
+ ]);
15
+ const getPropertyName = (node) => {
16
+ if (!node) {
17
+ return null;
18
+ }
19
+ return (identifierName(node) ??
20
+ (isStringLiteral(node) ? getStringValue(node) : null));
21
+ };
22
+ const collectObjectBindings = (ast) => {
23
+ const bindings = new Map();
24
+ walk(ast, (node) => {
25
+ if (node.type !== 'VariableDeclarator') {
26
+ return;
27
+ }
28
+ const { id, init } = node;
29
+ const bindingName = identifierName(id);
30
+ if (bindingName && init?.type === 'ObjectExpression') {
31
+ bindings.set(bindingName, init);
32
+ }
33
+ });
34
+ return bindings;
35
+ };
36
+ const getObjectProperties = (objectNode) => objectNode.type === 'ObjectExpression'
37
+ ? (objectNode['properties'] ?? [])
38
+ : [];
39
+ const findObjectPropertyValue = (objectNode, propertyName) => {
40
+ for (const property of getObjectProperties(objectNode)) {
41
+ if (property.type !== 'Property') {
42
+ continue;
43
+ }
44
+ const key = getPropertyName(property.key);
45
+ if (key === propertyName) {
46
+ return property.value ?? null;
47
+ }
48
+ }
49
+ return null;
50
+ };
51
+ const resolveIdentifierObject = (node, bindings) => bindings.get(node.name ?? '') ?? null;
52
+ const resolveMemberObject = (node, bindings, depth, resolve) => {
53
+ const { object, property } = node;
54
+ const propertyName = getPropertyName(property);
55
+ if (!propertyName) {
56
+ return null;
57
+ }
58
+ const objectNode = resolve(object, bindings, depth + 1);
59
+ return objectNode
60
+ ? resolve(findObjectPropertyValue(objectNode, propertyName) ?? undefined, bindings, depth + 1)
61
+ : null;
62
+ };
63
+ const resolveObjectExpression = function resolveObjectExpression(node, bindings, depth = 0) {
64
+ if (!node || depth > 4) {
65
+ return null;
66
+ }
67
+ if (node.type === 'ObjectExpression') {
68
+ return node;
69
+ }
70
+ if (node.type === 'Identifier') {
71
+ return resolveIdentifierObject(node, bindings);
72
+ }
73
+ return MEMBER_EXPRESSION_TYPES.has(node.type)
74
+ ? resolveMemberObject(node, bindings, depth, resolveObjectExpression)
75
+ : null;
76
+ };
77
+ const addMappedCategory = (categories, property) => {
78
+ if (property.type === 'SpreadElement') {
79
+ return false;
80
+ }
81
+ if (property.type !== 'Property') {
82
+ return true;
83
+ }
84
+ const key = getPropertyName(property.key);
85
+ if (key) {
86
+ categories.add(key);
87
+ }
88
+ return true;
89
+ };
90
+ const collectMappedCategories = (mapperObject) => {
91
+ if (mapperObject.type !== 'ObjectExpression') {
92
+ return null;
93
+ }
94
+ const categories = new Set();
95
+ for (const property of getObjectProperties(mapperObject)) {
96
+ if (!addMappedCategory(categories, property)) {
97
+ return null;
98
+ }
99
+ }
100
+ return categories;
101
+ };
102
+ const createDiagnostic = (filePath, line, missingCategories) => ({
103
+ filePath,
104
+ line,
105
+ message: `Transport error mapper is missing mappings for: ${missingCategories.join(', ')}. Registered createTransportErrorMapper() calls must cover every ErrorCategory.`,
106
+ rule: 'error-mapping-completeness',
107
+ severity: 'error',
108
+ });
109
+ const getCallArgs = (node) => node.arguments ?? [];
110
+ const getCallCallee = (node) => node.callee;
111
+ const isMapperFactoryCall = (node) => node.type === 'CallExpression' &&
112
+ identifierName(getCallCallee(node)) === 'createTransportErrorMapper';
113
+ const findMissingCategories = (mappedCategories) => errorCategories.filter((category) => !mappedCategories.has(category));
114
+ const resolveMappedCategories = (node, bindings) => {
115
+ const [firstArg] = getCallArgs(node);
116
+ const mapperObject = resolveObjectExpression(firstArg, bindings);
117
+ return mapperObject ? collectMappedCategories(mapperObject) : null;
118
+ };
119
+ const inspectMapperCall = (node, bindings, filePath, sourceCode) => {
120
+ if (!isMapperFactoryCall(node)) {
121
+ return null;
122
+ }
123
+ const mappedCategories = resolveMappedCategories(node, bindings);
124
+ if (!mappedCategories) {
125
+ return null;
126
+ }
127
+ const missingCategories = findMissingCategories(mappedCategories);
128
+ if (missingCategories.length === 0) {
129
+ return null;
130
+ }
131
+ return createDiagnostic(filePath, offsetToLine(sourceCode, node.start), missingCategories);
132
+ };
133
+ /**
134
+ * Flags `createTransportErrorMapper()` registrations that omit error categories.
135
+ */
136
+ export const errorMappingCompleteness = {
137
+ check(sourceCode, filePath) {
138
+ if (isTestFile(filePath) ||
139
+ !sourceCode.includes('createTransportErrorMapper')) {
140
+ return [];
141
+ }
142
+ const ast = parse(filePath, sourceCode);
143
+ if (!ast) {
144
+ return [];
145
+ }
146
+ const bindings = collectObjectBindings(ast);
147
+ const diagnostics = [];
148
+ walk(ast, (node) => {
149
+ const diagnostic = inspectMapperCall(node, bindings, filePath, sourceCode);
150
+ if (diagnostic) {
151
+ diagnostics.push(diagnostic);
152
+ }
153
+ });
154
+ return diagnostics;
155
+ },
156
+ description: 'Require registered transport error mappers to cover every ErrorCategory.',
157
+ name: 'error-mapping-completeness',
158
+ severity: 'error',
159
+ };
160
+ //# sourceMappingURL=error-mapping-completeness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-mapping-completeness.js","sourceRoot":"","sources":["../../src/rules/error-mapping-completeness.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EACL,cAAc,EACd,cAAc,EACd,eAAe,EACf,YAAY,EACZ,KAAK,EACL,IAAI,GACL,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,kBAAkB;IAClB,wBAAwB;CACzB,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC,IAAyB,EAAiB,EAAE;IACnE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,cAAc,CAAC,IAAI,CAAC;QACpB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CACtD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,GAAY,EAAgC,EAAE;IAC3E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE5C,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;QACjB,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QAED,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAwC,CAAC;QAC9D,MAAM,WAAW,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;QAEvC,IAAI,WAAW,IAAI,IAAI,EAAE,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACrD,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,UAAmB,EAAsB,EAAE,CACtE,UAAU,CAAC,IAAI,KAAK,kBAAkB;IACpC,CAAC,CAAC,CAAE,UAAU,CAAC,YAAY,CAAoC,IAAI,EAAE,CAAC;IACtE,CAAC,CAAC,EAAE,CAAC;AAET,MAAM,uBAAuB,GAAG,CAC9B,UAAmB,EACnB,YAAoB,EACJ,EAAE;IAClB,KAAK,MAAM,QAAQ,IAAI,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;QACvD,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACjC,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,eAAe,CAAE,QAAyC,CAAC,GAAG,CAAC,CAAC;QAC5E,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACzB,OAAQ,QAA2C,CAAC,KAAK,IAAI,IAAI,CAAC;QACpE,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAC9B,IAAa,EACb,QAAsC,EACtB,EAAE,CAClB,QAAQ,CAAC,GAAG,CAAE,IAA0B,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC;AAE/D,MAAM,mBAAmB,GAAG,CAC1B,IAAa,EACb,QAAsC,EACtC,KAAa,EACb,OAImB,EACH,EAAE;IAClB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAgD,CAAC;IAC9E,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACxD,OAAO,UAAU;QACf,CAAC,CAAC,OAAO,CACL,uBAAuB,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,SAAS,EAC9D,QAAQ,EACR,KAAK,GAAG,CAAC,CACV;QACH,CAAC,CAAC,IAAI,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,SAAS,uBAAuB,CAC9D,IAAyB,EACzB,QAAsC,EACtC,KAAK,GAAG,CAAC;IAET,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC/B,OAAO,uBAAuB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3C,CAAC,CAAC,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,uBAAuB,CAAC;QACrE,CAAC,CAAC,IAAI,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CACxB,UAAuB,EACvB,QAAiB,EACR,EAAE;IACX,IAAI,QAAQ,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,eAAe,CAAE,QAAyC,CAAC,GAAG,CAAC,CAAC;IAC5E,IAAI,GAAG,EAAE,CAAC;QACR,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAC9B,YAAqB,EACO,EAAE;IAC9B,IAAI,YAAY,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,QAAQ,IAAI,mBAAmB,CAAC,YAAY,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CACvB,QAAgB,EAChB,IAAY,EACZ,iBAAoC,EAClB,EAAE,CAAC,CAAC;IACtB,QAAQ;IACR,IAAI;IACJ,OAAO,EAAE,mDAAmD,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,iFAAiF;IACzK,IAAI,EAAE,4BAA4B;IAClC,QAAQ,EAAE,OAAO;CAClB,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,IAAa,EAAsB,EAAE,CACvD,IAA2C,CAAC,SAAS,IAAI,EAAE,CAAC;AAE/D,MAAM,aAAa,GAAG,CAAC,IAAa,EAAuB,EAAE,CAC1D,IAA6B,CAAC,MAAM,CAAC;AAExC,MAAM,mBAAmB,GAAG,CAAC,IAAa,EAAW,EAAE,CACrD,IAAI,CAAC,IAAI,KAAK,gBAAgB;IAC9B,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,4BAA4B,CAAC;AAEvE,MAAM,qBAAqB,GAAG,CAC5B,gBAAqC,EAClB,EAAE,CACrB,eAAe,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AAExE,MAAM,uBAAuB,GAAG,CAC9B,IAAa,EACb,QAAsC,EACV,EAAE;IAC9B,MAAM,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACjE,OAAO,YAAY,CAAC,CAAC,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CACxB,IAAa,EACb,QAAsC,EACtC,QAAgB,EAChB,UAAkB,EACO,EAAE;IAC3B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IAClE,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,gBAAgB,CACrB,QAAQ,EACR,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,EACpC,iBAAiB,CAClB,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAe;IAClD,KAAK,CAAC,UAAkB,EAAE,QAAgB;QACxC,IACE,UAAU,CAAC,QAAQ,CAAC;YACpB,CAAC,UAAU,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAClD,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAuB,EAAE,CAAC;QAE3C,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YACjB,MAAM,UAAU,GAAG,iBAAiB,CAClC,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,UAAU,CACX,CAAC;YACF,IAAI,UAAU,EAAE,CAAC;gBACf,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,WAAW,EACT,0EAA0E;IAC5E,IAAI,EAAE,4BAA4B;IAClC,QAAQ,EAAE,OAAO;CAClB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { WardenRule } from './types.js';
2
+ /**
3
+ * Checks that contour examples validate against their schema.
4
+ */
5
+ export declare const exampleValid: WardenRule;
6
+ //# sourceMappingURL=example-valid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example-valid.d.ts","sourceRoot":"","sources":["../../src/rules/example-valid.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AAuX/D;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,UAQ1B,CAAC"}
@@ -0,0 +1,203 @@
1
+ import { contour } from '@ontrails/core';
2
+ import { z } from 'zod';
3
+ import { extractStringLiteral, findConfigProperty, findContourDefinitions, getStringValue, identifierName, offsetToLine, parse, } from './ast.js';
4
+ import { isTestFile } from './scan.js';
5
+ class UnsupportedContourEvaluationError extends Error {
6
+ }
7
+ const buildInvalidExampleDiagnostic = (contourName, message, filePath, line) => ({
8
+ filePath,
9
+ line,
10
+ message: `Contour "${contourName}" has invalid examples: ${message}`,
11
+ rule: 'example-valid',
12
+ severity: 'error',
13
+ });
14
+ const getPropertyName = (node) => {
15
+ if (typeof node !== 'object' || node === null) {
16
+ return null;
17
+ }
18
+ const { name } = node;
19
+ if (typeof name === 'string') {
20
+ return name;
21
+ }
22
+ return extractStringLiteral(node);
23
+ };
24
+ const requireNode = (node) => {
25
+ if (!node) {
26
+ throw new UnsupportedContourEvaluationError('Missing node in contour evaluation.');
27
+ }
28
+ return node;
29
+ };
30
+ // The evaluator table is declared before `evaluateNode` so the recursive
31
+ // dispatch can read it at call time without any forward references. Entries
32
+ // are registered below once each per-type evaluator is defined.
33
+ const contourNodeEvaluators = new Map();
34
+ const evaluateNode = (node, env) => {
35
+ const evaluator = contourNodeEvaluators.get(node.type);
36
+ if (evaluator) {
37
+ return evaluator(node, env);
38
+ }
39
+ throw new UnsupportedContourEvaluationError(`Unsupported AST node "${node.type}" in contour evaluation.`);
40
+ };
41
+ const evaluateArrayExpression = (node, env) => {
42
+ const elements = node['elements'];
43
+ return (elements ?? []).map((element) => evaluateNode(element, env));
44
+ };
45
+ const evaluateLiteralExpression = (node) => getStringValue(node) ?? node.value;
46
+ const evaluateIdentifierExpression = (node, env) => {
47
+ const name = identifierName(node);
48
+ if (name === 'undefined') {
49
+ return undefined;
50
+ }
51
+ if (name === 'z') {
52
+ return z;
53
+ }
54
+ if (!name || !env.has(name)) {
55
+ throw new UnsupportedContourEvaluationError(`Unknown identifier "${name ?? '<unknown>'}" in contour evaluation.`);
56
+ }
57
+ return env.get(name);
58
+ };
59
+ const evaluateWrappedExpression = (node, env) => evaluateNode(requireNode(node.expression), env);
60
+ const evaluateNullExpression = () => null;
61
+ const evaluateObjectExpression = (node, env) => {
62
+ const properties = node['properties'];
63
+ const value = {};
64
+ for (const property of properties ?? []) {
65
+ if (property.type !== 'Property') {
66
+ throw new UnsupportedContourEvaluationError(`Unsupported object property type "${property.type}".`);
67
+ }
68
+ const propertyName = getPropertyName(property.key);
69
+ if (!propertyName) {
70
+ throw new UnsupportedContourEvaluationError('Unsupported object property key in contour evaluation.');
71
+ }
72
+ value[propertyName] = evaluateNode(requireNode(property.value), env);
73
+ }
74
+ return value;
75
+ };
76
+ const evaluateCallArguments = (node, env) => (node['arguments'] ?? []).map((arg) => evaluateNode(arg, env));
77
+ const resolveContourFallbackOptions = (shape) => typeof shape === 'object' &&
78
+ shape !== null &&
79
+ Object.hasOwn(shape, 'id') &&
80
+ shape['id'] !== undefined
81
+ ? { identity: 'id' }
82
+ : null;
83
+ const resolveContourOptions = (shape, options) => {
84
+ if (options === undefined) {
85
+ const fallbackOptions = resolveContourFallbackOptions(shape);
86
+ if (fallbackOptions !== null) {
87
+ return fallbackOptions;
88
+ }
89
+ throw new UnsupportedContourEvaluationError('Contour evaluator requires literal options, or an `id` field when options are omitted.');
90
+ }
91
+ if (typeof options !== 'object' || options === null) {
92
+ throw new UnsupportedContourEvaluationError('Contour evaluator requires literal options when provided.');
93
+ }
94
+ return options;
95
+ };
96
+ const evaluateContourCall = (args) => {
97
+ const [name, shape, options] = args;
98
+ if (typeof name !== 'string') {
99
+ throw new UnsupportedContourEvaluationError('Contour evaluator requires a literal name.');
100
+ }
101
+ return contour(name, shape, resolveContourOptions(shape, options));
102
+ };
103
+ const evaluateMemberCall = (callee, args, env) => {
104
+ const receiver = evaluateNode(requireNode(callee.object), env);
105
+ const propertyName = getPropertyName(callee.property);
106
+ if (!propertyName) {
107
+ throw new UnsupportedContourEvaluationError('Unsupported member property in contour evaluation.');
108
+ }
109
+ const method = receiver[propertyName];
110
+ if (typeof method !== 'function') {
111
+ throw new UnsupportedContourEvaluationError(`Contour evaluator could not call "${propertyName}".`);
112
+ }
113
+ return Reflect.apply(method, receiver, args);
114
+ };
115
+ const evaluateCallExpression = (node, env) => {
116
+ const args = evaluateCallArguments(node, env);
117
+ const callee = requireNode(node['callee']);
118
+ if (callee.type === 'Identifier') {
119
+ const calleeName = identifierName(callee);
120
+ if (calleeName !== 'contour') {
121
+ throw new UnsupportedContourEvaluationError(`Unsupported contour evaluator call "${calleeName ?? '<unknown>'}".`);
122
+ }
123
+ return evaluateContourCall(args);
124
+ }
125
+ if (callee.type !== 'MemberExpression' &&
126
+ callee.type !== 'StaticMemberExpression') {
127
+ throw new UnsupportedContourEvaluationError(`Unsupported callee type "${callee.type}".`);
128
+ }
129
+ return evaluateMemberCall(callee, args, env);
130
+ };
131
+ const EVALUATOR_REGISTRATIONS = [
132
+ ['ArrayExpression', evaluateArrayExpression],
133
+ ['BooleanLiteral', evaluateLiteralExpression],
134
+ ['Literal', evaluateLiteralExpression],
135
+ ['NumericLiteral', evaluateLiteralExpression],
136
+ ['StringLiteral', evaluateLiteralExpression],
137
+ ['CallExpression', evaluateCallExpression],
138
+ ['Identifier', evaluateIdentifierExpression],
139
+ ['NullLiteral', evaluateNullExpression],
140
+ ['ObjectExpression', evaluateObjectExpression],
141
+ ['ParenthesizedExpression', evaluateWrappedExpression],
142
+ ['TSAsExpression', evaluateWrappedExpression],
143
+ ['TSSatisfiesExpression', evaluateWrappedExpression],
144
+ ];
145
+ for (const [type, evaluator] of EVALUATOR_REGISTRATIONS) {
146
+ contourNodeEvaluators.set(type, evaluator);
147
+ }
148
+ const hasExamples = (definition) => definition.options !== null &&
149
+ findConfigProperty(definition.options, 'examples') !== null;
150
+ const evaluateContourDefinition = (definition, env) => evaluateNode(definition.call, env);
151
+ const buildContourExampleErrorDiagnostic = (definition, error, sourceCode, filePath) => {
152
+ if (error instanceof UnsupportedContourEvaluationError ||
153
+ !hasExamples(definition) ||
154
+ !(error instanceof Error)) {
155
+ return null;
156
+ }
157
+ return buildInvalidExampleDiagnostic(definition.name, error.message, filePath, offsetToLine(sourceCode, definition.start));
158
+ };
159
+ const evaluateContourExamples = (definition, env, sourceCode, filePath) => {
160
+ try {
161
+ const value = evaluateContourDefinition(definition, env);
162
+ if (definition.bindingName) {
163
+ env.set(definition.bindingName, value);
164
+ }
165
+ return null;
166
+ }
167
+ catch (error) {
168
+ return buildContourExampleErrorDiagnostic(definition, error, sourceCode, filePath);
169
+ }
170
+ };
171
+ const collectContourExampleDiagnostics = (definitions, sourceCode, filePath) => {
172
+ const diagnostics = [];
173
+ const env = new Map();
174
+ for (const definition of definitions) {
175
+ const diagnostic = evaluateContourExamples(definition, env, sourceCode, filePath);
176
+ if (diagnostic) {
177
+ diagnostics.push(diagnostic);
178
+ }
179
+ }
180
+ return diagnostics;
181
+ };
182
+ const checkContourExamples = (sourceCode, filePath) => {
183
+ if (isTestFile(filePath)) {
184
+ return [];
185
+ }
186
+ const ast = parse(filePath, sourceCode);
187
+ if (!ast) {
188
+ return [];
189
+ }
190
+ return collectContourExampleDiagnostics(findContourDefinitions(ast), sourceCode, filePath);
191
+ };
192
+ /**
193
+ * Checks that contour examples validate against their schema.
194
+ */
195
+ export const exampleValid = {
196
+ check(sourceCode, filePath) {
197
+ return checkContourExamples(sourceCode, filePath);
198
+ },
199
+ description: 'Ensure every contour example validates against the declared contour schema.',
200
+ name: 'example-valid',
201
+ severity: 'error',
202
+ };
203
+ //# sourceMappingURL=example-valid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example-valid.js","sourceRoot":"","sources":["../../src/rules/example-valid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Validates that `ctx.fire()` calls match the declared `fires` array.
3
+ *
4
+ * Statically analyzes trail `blaze` functions to find `ctx.fire('signalId', ...)`
5
+ * calls and compares them against the `fires: [...]` declaration in the trail
6
+ * config. Reports errors for undeclared fires and warnings for unused ones.
7
+ *
8
+ * Mirrors `cross-declarations` structurally — same extraction, same reporting
9
+ * shape, same const-identifier resolution, same context-parameter handling.
10
+ */
11
+ import type { WardenRule } from './types.js';
12
+ /**
13
+ * Validates that `ctx.fire()` calls align with declared `fires` arrays.
14
+ */
15
+ export declare const firesDeclarations: WardenRule;
16
+ //# sourceMappingURL=fires-declarations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fires-declarations.d.ts","sourceRoot":"","sources":["../../src/rules/fires-declarations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgBH,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AA6iB/D;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAuB/B,CAAC"}