@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,444 @@
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 { extractFirstStringArg, extractStringLiteral, findConfigProperty, findBlazeBodies, findTrailDefinitions, identifierName, offsetToLine, parse, deriveConstString, walkScope, } from './ast.js';
12
+ import { isTestFile } from './scan.js';
13
+ // ---------------------------------------------------------------------------
14
+ // Const identifier resolution
15
+ // ---------------------------------------------------------------------------
16
+ /** Try to resolve an Identifier element to a string via const declaration. */
17
+ const resolveIdentifierElement = (el, sourceCode) => {
18
+ const name = identifierName(el);
19
+ if (!name) {
20
+ return null;
21
+ }
22
+ return deriveConstString(name, sourceCode);
23
+ };
24
+ /**
25
+ * Resolve an array element to a static signal ID when possible.
26
+ *
27
+ * Returns null for entries the rule can't statically resolve — callers should
28
+ * treat "unresolved" as "trust the runtime" rather than a missing declaration.
29
+ * In particular, object-form references (e.g. `fires: [orderPlaced]` where
30
+ * `orderPlaced` is a `Signal` imported from elsewhere) resolve via runtime
31
+ * normalization in `trail()`, not at lint time.
32
+ */
33
+ const resolveFireElementId = (element, sourceCode) => {
34
+ const literalValue = extractStringLiteral(element);
35
+ if (literalValue !== null) {
36
+ return literalValue;
37
+ }
38
+ if (element.type === 'Identifier') {
39
+ return resolveIdentifierElement(element, sourceCode);
40
+ }
41
+ return null;
42
+ };
43
+ // ---------------------------------------------------------------------------
44
+ // Declared fires extraction
45
+ // ---------------------------------------------------------------------------
46
+ /** Extract the ArrayExpression elements from a config's `fires` property. */
47
+ const getFiresElements = (config) => {
48
+ const firesProp = findConfigProperty(config, 'fires');
49
+ if (!firesProp) {
50
+ return null;
51
+ }
52
+ const arrayNode = firesProp.value;
53
+ if (!arrayNode || arrayNode.type !== 'ArrayExpression') {
54
+ return null;
55
+ }
56
+ const elements = arrayNode['elements'];
57
+ return elements ?? null;
58
+ };
59
+ /**
60
+ * Extract declared fires from a `fires: [...]` array.
61
+ *
62
+ * Object-form entries (`fires: [someSignal]`) cannot be resolved at lint time;
63
+ * they're normalized at runtime by `trail()`. When any entry is unresolved,
64
+ * the rule reports `hasUnresolved: true`, and callers should suppress the
65
+ * "undeclared" diagnostic since the declared set is incomplete from our view.
66
+ */
67
+ const resolveDeclaredFiresElements = (elements, sourceCode) => {
68
+ const ids = new Set();
69
+ let hasUnresolved = false;
70
+ for (const element of elements) {
71
+ const resolved = resolveFireElementId(element, sourceCode);
72
+ if (resolved) {
73
+ ids.add(resolved);
74
+ }
75
+ else {
76
+ hasUnresolved = true;
77
+ }
78
+ }
79
+ return { hasUnresolved, ids };
80
+ };
81
+ const extractDeclaredFires = (config, sourceCode) => {
82
+ const elements = getFiresElements(config);
83
+ return elements
84
+ ? resolveDeclaredFiresElements(elements, sourceCode)
85
+ : { hasUnresolved: false, ids: new Set() };
86
+ };
87
+ // ---------------------------------------------------------------------------
88
+ // Called fires extraction — member expression helpers
89
+ // ---------------------------------------------------------------------------
90
+ const MEMBER_TYPES = new Set(['StaticMemberExpression', 'MemberExpression']);
91
+ /** Extract object and property Identifier names from a MemberExpression. */
92
+ const extractMemberPair = (callee) => {
93
+ if (!MEMBER_TYPES.has(callee.type)) {
94
+ return null;
95
+ }
96
+ const objName = identifierName(callee.object);
97
+ const propName = identifierName(callee.property);
98
+ return objName && propName ? { objName, propName } : null;
99
+ };
100
+ /**
101
+ * Extract the second parameter node from a blaze function node.
102
+ *
103
+ * Handles `(input, ctx) => ...`, `async (input, context) => ...`,
104
+ * `function(input, ctx) { ... }`, and parameter-level destructuring
105
+ * like `(input, { fire }) => ...`.
106
+ */
107
+ const extractContextParamNode = (blazeBody) => {
108
+ const params = blazeBody['params'];
109
+ if (!params || params.length < 2) {
110
+ return null;
111
+ }
112
+ return params[1] ?? null;
113
+ };
114
+ /** Extract the local name bound to `fire` inside an ObjectPattern Property. */
115
+ const extractFireLocalName = (prop) => {
116
+ if (prop.type !== 'Property') {
117
+ return null;
118
+ }
119
+ const { key } = prop;
120
+ const { value } = prop;
121
+ const keyName = identifierName(key);
122
+ if (keyName !== 'fire') {
123
+ return null;
124
+ }
125
+ // `{ fire }` → key and value are the same Identifier (shorthand).
126
+ // `{ fire: emit }` → value is a distinct Identifier.
127
+ return identifierName(value) ?? keyName;
128
+ };
129
+ /** Collect `fire` local names from an ObjectPattern's properties into `names`. */
130
+ const collectFireNamesFromPattern = (pattern, names) => {
131
+ const { properties } = pattern;
132
+ if (!properties) {
133
+ return;
134
+ }
135
+ for (const prop of properties) {
136
+ const localName = extractFireLocalName(prop);
137
+ if (localName) {
138
+ names.add(localName);
139
+ }
140
+ }
141
+ };
142
+ /**
143
+ * Extract the second parameter name from a blaze function node.
144
+ *
145
+ * Returns null when the parameter is not a plain Identifier (e.g. when the
146
+ * author destructures `{ fire }` in the parameter list). Parameter-level
147
+ * destructuring is handled separately by `collectParamFireNames`.
148
+ *
149
+ * Also handles defaulted parameters like `(input, ctx = fallback) => ...`
150
+ * (AssignmentPattern whose `.left` is the Identifier). Without this, valid
151
+ * signatures would silently drop out of ctx-access analysis.
152
+ */
153
+ const extractContextParamName = (blazeBody) => {
154
+ const param = extractContextParamNode(blazeBody);
155
+ if (!param) {
156
+ return null;
157
+ }
158
+ if (param.type === 'AssignmentPattern') {
159
+ const { left } = param;
160
+ return identifierName(left);
161
+ }
162
+ return identifierName(param);
163
+ };
164
+ /**
165
+ * Collect `fire` local names bound via parameter-level destructuring.
166
+ *
167
+ * Recognizes `(input, { fire }) => ...` and `(input, { fire: emit }) => ...`.
168
+ * When the blaze author destructures in the parameter list, there is no
169
+ * enclosing `ctx` identifier to track — we seed the fire local set directly
170
+ * from the ObjectPattern in `params[1]`.
171
+ */
172
+ const collectParamFireNames = (body) => {
173
+ const param = extractContextParamNode(body);
174
+ if (!param || param.type !== 'ObjectPattern') {
175
+ return new Set();
176
+ }
177
+ const names = new Set();
178
+ collectFireNamesFromPattern(param, names);
179
+ return names;
180
+ };
181
+ /** Check if a callee is a member-style fire call: <ctxName>.fire(...). */
182
+ const isMemberFireCall = (callee, ctxNames) => {
183
+ const pair = extractMemberPair(callee);
184
+ return !!pair && ctxNames.has(pair.objName) && pair.propName === 'fire';
185
+ };
186
+ /**
187
+ * Check if a node is a `<ctxName>.fire(...)` call and return the string signal ID.
188
+ *
189
+ * Also matches bare `<fireLocalName>(...)` calls, but only when the local name
190
+ * was verifiably destructured from the trail context (e.g. `const { fire } = ctx`
191
+ * or `const { fire: emit } = ctx`). Unrelated local `fire()` helpers are
192
+ * ignored — see `collectDestructuredFireNames`.
193
+ */
194
+ const isTrackedFireCallee = (callee, ctxNames, fireLocalNames) => {
195
+ if (isMemberFireCall(callee, ctxNames)) {
196
+ return true;
197
+ }
198
+ const calleeName = identifierName(callee);
199
+ return !!calleeName && fireLocalNames.has(calleeName);
200
+ };
201
+ const extractFireCallId = (node, ctxNames, fireLocalNames) => {
202
+ if (node.type !== 'CallExpression') {
203
+ return null;
204
+ }
205
+ const callee = node['callee'];
206
+ if (!callee) {
207
+ return null;
208
+ }
209
+ return isTrackedFireCallee(callee, ctxNames, fireLocalNames)
210
+ ? extractFirstStringArg(node)
211
+ : null;
212
+ };
213
+ /**
214
+ * Walk a blaze body and collect local names bound to `ctx.fire` via destructure.
215
+ *
216
+ * Recognizes:
217
+ * - `const { fire } = ctx;` → adds `fire`
218
+ * - `const { fire: emit } = context;` → adds `emit`
219
+ *
220
+ * Only destructures whose init is one of the tracked ctx parameter names are
221
+ * accepted. This prevents unrelated local `fire` helpers from being treated as
222
+ * calls into the trail context.
223
+ */
224
+ /** Check if a VariableDeclarator destructures from a known ctx identifier. */
225
+ const getCtxDestructurePattern = (node, ctxNames) => {
226
+ if (node.type !== 'VariableDeclarator') {
227
+ return null;
228
+ }
229
+ const { id, init } = node;
230
+ if (!id || id.type !== 'ObjectPattern' || !init) {
231
+ return null;
232
+ }
233
+ const initName = identifierName(init);
234
+ if (!initName || !ctxNames.has(initName)) {
235
+ return null;
236
+ }
237
+ return id;
238
+ };
239
+ /**
240
+ * Collect `fire` local names destructured from ctx at the TOP LEVEL of the
241
+ * blaze body. Destructures inside nested functions are intentionally ignored
242
+ * to avoid leaking nested-scope bindings into the outer blaze scope — a
243
+ * `const { fire } = ctx` inside a nested helper should not cause an outer
244
+ * bare `fire('x')` to be treated as a ctx-bound call.
245
+ *
246
+ * Tradeoff: nested-scope destructures lose tracking entirely. Calls inside
247
+ * nested functions that rely on their own destructure will not be analyzed.
248
+ * This is a conservative precision loss; a full scope walker is a follow-up.
249
+ *
250
+ * Tradeoff: only `const` destructures are tracked. `let` and `var` bindings
251
+ * allow reassignment (`let { fire } = ctx; fire = other; fire('x')`) which
252
+ * this flow-insensitive walker cannot follow. Skipping them trades a small
253
+ * amount of precision — `let { fire } = ctx` is rare — for eliminating a
254
+ * class of false positives. The runtime + signal-id cross-check still
255
+ * validate real undeclared fires.
256
+ */
257
+ /** Get the top-level statements of a blaze function's BlockStatement body. */
258
+ const getTopLevelStatements = (body) => {
259
+ const blockBody = body.body;
260
+ if (!blockBody || blockBody.type !== 'BlockStatement') {
261
+ return [];
262
+ }
263
+ return blockBody.body ?? [];
264
+ };
265
+ /** Collect fire-local names from a single top-level VariableDeclaration. */
266
+ const collectFireNamesFromDeclaration = (stmt, ctxNames, names) => {
267
+ if (stmt.type !== 'VariableDeclaration') {
268
+ return;
269
+ }
270
+ // Only track `const` destructures. `let` and `var` allow reassignment that
271
+ // a single-pass walker cannot track, so `let { fire } = ctx; fire = other;
272
+ // fire('x')` would otherwise be a false positive. Skipping non-const is a
273
+ // small precision loss (see TSDoc on `collectDestructuredFireNames`) in
274
+ // exchange for eliminating that class of false positives.
275
+ const { kind } = stmt;
276
+ if (kind !== 'const') {
277
+ return;
278
+ }
279
+ const declarations = stmt.declarations ??
280
+ [];
281
+ for (const decl of declarations) {
282
+ const pattern = getCtxDestructurePattern(decl, ctxNames);
283
+ if (pattern) {
284
+ collectFireNamesFromPattern(pattern, names);
285
+ }
286
+ }
287
+ };
288
+ const collectDestructuredFireNames = (body, ctxNames) => {
289
+ const names = new Set();
290
+ for (const stmt of getTopLevelStatements(body)) {
291
+ collectFireNamesFromDeclaration(stmt, ctxNames, names);
292
+ }
293
+ return names;
294
+ };
295
+ /**
296
+ * Build the set of context parameter names to match against.
297
+ *
298
+ * Returns ONLY the actual second-parameter name from the blaze signature.
299
+ * No seeded defaults: if the blaze has no second parameter, the returned set
300
+ * is empty and no `ctx.fire(...)` / `context.fire(...)` calls are tracked
301
+ * for that blaze. An unrelated closure-scoped `ctx` identifier is not the
302
+ * trail context and must not be treated as one.
303
+ */
304
+ const buildCtxNames = (body) => {
305
+ const ctxNames = new Set();
306
+ const paramName = extractContextParamName(body);
307
+ if (paramName) {
308
+ ctxNames.add(paramName);
309
+ }
310
+ return ctxNames;
311
+ };
312
+ /**
313
+ * Walk blaze bodies and collect all statically resolvable ctx.fire() signal IDs.
314
+ *
315
+ * Traversal uses `walkScope`, which stops at nested function boundaries
316
+ * (FunctionDeclaration, FunctionExpression, ArrowFunctionExpression). This
317
+ * mirrors the top-level-only behavior of `collectDestructuredFireNames` and
318
+ * avoids false positives when a nested function parameter shadows `ctx` or a
319
+ * destructured `fire` local:
320
+ *
321
+ * ```ts
322
+ * blaze: async (_, ctx) => {
323
+ * const { fire } = ctx;
324
+ * function nested(fire) { fire('shadow'); } // ignored — shadowed
325
+ * function other(ctx) { ctx.fire('x'); } // ignored — shadowed
326
+ * return Result.ok({});
327
+ * }
328
+ * ```
329
+ *
330
+ * Tradeoff: legitimate helper-scoped fire calls are not statically analyzed
331
+ * today. This includes both direct `ctx.fire(...)` inside a nested helper and
332
+ * helper-local destructures like `const { fire } = ctx` inside that helper.
333
+ * The runtime + signal-id cross-check still validate them; the warden just
334
+ * can't prove them at lint time. A fuller helper-aware scope walker remains
335
+ * follow-up work if this precision loss becomes meaningful in practice.
336
+ */
337
+ const extractCalledFires = (config) => {
338
+ const ids = new Set();
339
+ for (const body of findBlazeBodies(config)) {
340
+ const ctxNames = buildCtxNames(body);
341
+ const bodyFireNames = collectDestructuredFireNames(body, ctxNames);
342
+ const paramFireNames = collectParamFireNames(body);
343
+ const fireLocalNames = new Set([
344
+ ...bodyFireNames,
345
+ ...paramFireNames,
346
+ ]);
347
+ walkScope(body, (node) => {
348
+ const id = extractFireCallId(node, ctxNames, fireLocalNames);
349
+ if (id) {
350
+ ids.add(id);
351
+ }
352
+ });
353
+ }
354
+ return ids;
355
+ };
356
+ // ---------------------------------------------------------------------------
357
+ // Diagnostic builders
358
+ // ---------------------------------------------------------------------------
359
+ const buildUndeclaredDiagnostic = (trailId, signalId, filePath, line, softened = false) => ({
360
+ filePath,
361
+ line,
362
+ message: softened
363
+ ? `Trail "${trailId}": ctx.fire('${signalId}') called but '${signalId}' is not declared in fires (may be declared via object-form fires entries)`
364
+ : `Trail "${trailId}": ctx.fire('${signalId}') called but '${signalId}' is not declared in fires`,
365
+ rule: 'fires-declarations',
366
+ severity: softened ? 'warn' : 'error',
367
+ });
368
+ const buildUnusedDiagnostic = (trailId, signalId, filePath, line) => ({
369
+ filePath,
370
+ line,
371
+ message: `Trail "${trailId}": '${signalId}' declared in fires but ctx.fire('${signalId}') never called`,
372
+ rule: 'fires-declarations',
373
+ severity: 'warn',
374
+ });
375
+ // ---------------------------------------------------------------------------
376
+ // Comparison
377
+ // ---------------------------------------------------------------------------
378
+ /** Emit error for each called ID not present in declared set. */
379
+ const reportUndeclared = (called, declared, ctx, diagnostics) => {
380
+ for (const id of called) {
381
+ if (!declared.has(id)) {
382
+ diagnostics.push(buildUndeclaredDiagnostic(ctx.trailId, id, ctx.filePath, ctx.line, ctx.softened));
383
+ }
384
+ }
385
+ };
386
+ /**
387
+ * Emit warning for each declared ID not present in called set.
388
+ *
389
+ * Note: unlike `reportUndeclared`, this function does NOT soften its
390
+ * diagnostics when `hasUnresolved` is true. The asymmetry is intentional —
391
+ * softening only applies to the undeclared direction because unresolved
392
+ * Signal-value entries might cover an unknown set of called IDs. In the
393
+ * unused direction, a declared string-literal that is never called is
394
+ * genuinely unused regardless of whether other entries are unresolved.
395
+ */
396
+ const reportUnused = (declared, called, ctx, diagnostics) => {
397
+ for (const id of declared) {
398
+ if (!called.has(id)) {
399
+ diagnostics.push(buildUnusedDiagnostic(ctx.trailId, id, ctx.filePath, ctx.line));
400
+ }
401
+ }
402
+ };
403
+ const checkTrailDefinition = (def, filePath, sourceCode, diagnostics) => {
404
+ const declared = extractDeclaredFires(def.config, sourceCode);
405
+ const called = extractCalledFires(def.config);
406
+ if (declared.ids.size === 0 && !declared.hasUnresolved && called.size === 0) {
407
+ return;
408
+ }
409
+ const line = offsetToLine(sourceCode, def.start);
410
+ const ctx = { filePath, line, trailId: def.id };
411
+ // When the declared array contains object-form references we can't resolve,
412
+ // downgrade "undeclared" diagnostics from error to warn with a disclaimer
413
+ // instead of suppressing entirely. The developer still sees genuinely
414
+ // undeclared calls, but we can't statically prove the call isn't covered by
415
+ // a Signal-value entry the runtime will normalize.
416
+ reportUndeclared(called, declared.ids, { ...ctx, softened: declared.hasUnresolved }, diagnostics);
417
+ reportUnused(declared.ids, called, ctx, diagnostics);
418
+ };
419
+ // ---------------------------------------------------------------------------
420
+ // Rule
421
+ // ---------------------------------------------------------------------------
422
+ /**
423
+ * Validates that `ctx.fire()` calls align with declared `fires` arrays.
424
+ */
425
+ export const firesDeclarations = {
426
+ check(sourceCode, filePath) {
427
+ if (isTestFile(filePath)) {
428
+ return [];
429
+ }
430
+ const ast = parse(filePath, sourceCode);
431
+ if (!ast) {
432
+ return [];
433
+ }
434
+ const diagnostics = [];
435
+ for (const def of findTrailDefinitions(ast)) {
436
+ checkTrailDefinition(def, filePath, sourceCode, diagnostics);
437
+ }
438
+ return diagnostics;
439
+ },
440
+ description: 'Ensure ctx.fire() calls match the declared fires array in trail definitions.',
441
+ name: 'fires-declarations',
442
+ severity: 'error',
443
+ };
444
+ //# sourceMappingURL=fires-declarations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fires-declarations.js","sourceRoot":"","sources":["../../src/rules/fires-declarations.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,15 @@
6
6
  * or a tracked Result-typed variable.
7
7
  */
8
8
  import type { WardenRule } from './types.js';
9
+ /**
10
+ * Clear the module-level cache used by the `implementation-returns-result`
11
+ * rule to remember which exported names on a target file carry a `Result<...>`
12
+ * return annotation.
13
+ *
14
+ * Call this between runs in long-lived processes where the set of Trails
15
+ * source files may have changed on disk since the last check.
16
+ */
17
+ export declare const clearImplementationReturnsResultCache: () => void;
9
18
  /**
10
19
  * Finds implementations that return raw values instead of `Result`.
11
20
  */
@@ -1 +1 @@
1
- {"version":3,"file":"implementation-returns-result.d.ts","sourceRoot":"","sources":["../../src/rules/implementation-returns-result.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AA2W/D;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,UAiBzC,CAAC"}
1
+ {"version":3,"file":"implementation-returns-result.d.ts","sourceRoot":"","sources":["../../src/rules/implementation-returns-result.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AAwR/D;;;;;;;GAOG;AACH,eAAO,MAAM,qCAAqC,QAAO,IAExD,CAAC;AA09BF;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,UAiBzC,CAAC"}