@ontrails/warden 1.0.0-beta.14 → 1.0.0-beta.16

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 (351) hide show
  1. package/CHANGELOG.md +149 -0
  2. package/README.md +77 -34
  3. package/bin/warden.ts +22 -0
  4. package/package.json +26 -6
  5. package/src/ast.ts +28 -0
  6. package/src/cli.ts +1169 -116
  7. package/src/command.ts +927 -0
  8. package/src/config.ts +184 -0
  9. package/src/drift.ts +76 -34
  10. package/src/formatters.ts +54 -7
  11. package/src/guide.ts +234 -0
  12. package/src/index.ts +151 -38
  13. package/src/project-context.ts +163 -0
  14. package/src/resolve.ts +530 -0
  15. package/src/rules/activation-orphan.ts +97 -0
  16. package/src/rules/ast.ts +2884 -124
  17. package/src/rules/circular-refs.ts +154 -0
  18. package/src/rules/{context-no-trailhead-types.ts → context-no-surface-types.ts} +72 -12
  19. package/src/rules/contour-exists.ts +251 -0
  20. package/src/rules/contour-ids.ts +15 -0
  21. package/src/rules/cross-declarations.ts +277 -69
  22. package/src/rules/dead-internal-trail.ts +141 -0
  23. package/src/rules/draft-file-marking.ts +51 -3
  24. package/src/rules/draft-visible-debt.ts +40 -15
  25. package/src/rules/error-mapping-completeness.ts +288 -0
  26. package/src/rules/example-valid.ts +401 -0
  27. package/src/rules/fires-declarations.ts +758 -0
  28. package/src/rules/implementation-returns-result.ts +1042 -122
  29. package/src/rules/incomplete-accessor-for-standard-op.ts +272 -0
  30. package/src/rules/incomplete-crud.ts +580 -0
  31. package/src/rules/index.ts +156 -19
  32. package/src/rules/intent-propagation.ts +127 -0
  33. package/src/rules/layer-field-name-drift.ts +96 -0
  34. package/src/rules/metadata.ts +508 -0
  35. package/src/rules/missing-reconcile.ts +98 -0
  36. package/src/rules/missing-visibility.ts +110 -0
  37. package/src/rules/no-dev-permit-in-source.ts +99 -0
  38. package/src/rules/no-direct-implementation-call.ts +1 -1
  39. package/src/rules/no-legacy-layer-imports.ts +193 -0
  40. package/src/rules/no-native-error-result.ts +111 -0
  41. package/src/rules/no-sync-result-assumption.ts +1131 -96
  42. package/src/rules/no-throw-in-detour-recover.ts +225 -0
  43. package/src/rules/no-throw-in-implementation.ts +6 -4
  44. package/src/rules/on-references-exist.ts +194 -0
  45. package/src/rules/orphaned-signal.ts +150 -0
  46. package/src/rules/owner-projection-parity.ts +146 -0
  47. package/src/rules/permit-governance.ts +25 -0
  48. package/src/rules/public-internal-deep-imports.ts +517 -0
  49. package/src/rules/public-output-schema.ts +29 -0
  50. package/src/rules/public-union-output-discriminants.ts +150 -0
  51. package/src/rules/read-intent-fires.ts +187 -0
  52. package/src/rules/reference-exists.ts +98 -0
  53. package/src/rules/registry-names.ts +113 -0
  54. package/src/rules/resolved-import-boundary.ts +146 -0
  55. package/src/rules/{provision-declarations.ts → resource-declarations.ts} +208 -138
  56. package/src/rules/{provision-exists.ts → resource-exists.ts} +46 -51
  57. package/src/rules/resource-id-grammar.ts +65 -0
  58. package/src/rules/scan.ts +0 -26
  59. package/src/rules/scheduled-destroy-intent.ts +44 -0
  60. package/src/rules/signal-graph-coaching.ts +191 -0
  61. package/src/rules/specs.ts +5 -1
  62. package/src/rules/static-resource-accessor-preference.ts +657 -0
  63. package/src/rules/types.ts +187 -7
  64. package/src/rules/unmaterialized-activation-source.ts +84 -0
  65. package/src/rules/unreachable-detour-shadowing.ts +344 -0
  66. package/src/rules/valid-describe-refs.ts +160 -32
  67. package/src/rules/valid-detour-contract.ts +78 -0
  68. package/src/rules/warden-export-symmetry.ts +533 -0
  69. package/src/rules/warden-rules-use-ast.ts +996 -0
  70. package/src/rules/webhook-route-collision.ts +243 -0
  71. package/src/trails/activation-orphan.trail.ts +81 -0
  72. package/src/trails/circular-refs.trail.ts +29 -0
  73. package/src/trails/{context-no-trailhead-types.trail.ts → context-no-surface-types.trail.ts} +4 -4
  74. package/src/trails/contour-exists.trail.ts +21 -0
  75. package/src/trails/dead-internal-trail.trail.ts +26 -0
  76. package/src/trails/draft-file-marking.trail.ts +16 -0
  77. package/src/trails/draft-visible-debt.trail.ts +16 -0
  78. package/src/trails/error-mapping-completeness.trail.ts +29 -0
  79. package/src/trails/example-valid.trail.ts +25 -0
  80. package/src/trails/fires-declarations.trail.ts +23 -0
  81. package/src/trails/incomplete-accessor-for-standard-op.trail.ts +76 -0
  82. package/src/trails/incomplete-crud.trail.ts +39 -0
  83. package/src/trails/index.ts +56 -8
  84. package/src/trails/intent-propagation.trail.ts +30 -0
  85. package/src/trails/layer-field-name-drift.trail.ts +39 -0
  86. package/src/trails/missing-reconcile.trail.ts +33 -0
  87. package/src/trails/missing-visibility.trail.ts +22 -0
  88. package/src/trails/no-dev-permit-in-source.trail.ts +16 -0
  89. package/src/trails/no-legacy-layer-imports.trail.ts +35 -0
  90. package/src/trails/no-native-error-result.trail.ts +18 -0
  91. package/src/trails/no-throw-in-detour-recover.trail.ts +24 -0
  92. package/src/trails/on-references-exist.trail.ts +21 -0
  93. package/src/trails/orphaned-signal.trail.ts +36 -0
  94. package/src/trails/owner-projection-parity.trail.ts +26 -0
  95. package/src/trails/permit-governance.trail.ts +51 -0
  96. package/src/trails/public-internal-deep-imports.trail.ts +94 -0
  97. package/src/trails/public-output-schema.trail.ts +55 -0
  98. package/src/trails/public-union-output-discriminants.trail.ts +33 -0
  99. package/src/trails/read-intent-fires.trail.ts +20 -0
  100. package/src/trails/reference-exists.trail.ts +25 -0
  101. package/src/trails/resolved-import-boundary.trail.ts +109 -0
  102. package/src/trails/{provision-declarations.trail.ts → resource-declarations.trail.ts} +6 -6
  103. package/src/trails/{provision-exists.trail.ts → resource-exists.trail.ts} +7 -7
  104. package/src/trails/resource-id-grammar.trail.ts +39 -0
  105. package/src/trails/run.ts +133 -24
  106. package/src/trails/scheduled-destroy-intent.trail.ts +56 -0
  107. package/src/trails/schema.ts +122 -4
  108. package/src/trails/signal-graph-coaching.trail.ts +74 -0
  109. package/src/trails/static-resource-accessor-preference.trail.ts +25 -0
  110. package/src/trails/unmaterialized-activation-source.trail.ts +69 -0
  111. package/src/trails/unreachable-detour-shadowing.trail.ts +45 -0
  112. package/src/trails/valid-detour-contract.trail.ts +71 -0
  113. package/src/trails/warden-export-symmetry.trail.ts +16 -0
  114. package/src/trails/warden-rules-use-ast.trail.ts +45 -0
  115. package/src/trails/webhook-route-collision.trail.ts +50 -0
  116. package/src/trails/wrap-rule.ts +133 -14
  117. package/src/workspaces.ts +238 -0
  118. package/.turbo/turbo-build.log +0 -1
  119. package/.turbo/turbo-lint.log +0 -3
  120. package/.turbo/turbo-typecheck.log +0 -1
  121. package/dist/cli.d.ts +0 -46
  122. package/dist/cli.d.ts.map +0 -1
  123. package/dist/cli.js +0 -247
  124. package/dist/cli.js.map +0 -1
  125. package/dist/draft.d.ts +0 -5
  126. package/dist/draft.d.ts.map +0 -1
  127. package/dist/draft.js +0 -16
  128. package/dist/draft.js.map +0 -1
  129. package/dist/drift.d.ts +0 -29
  130. package/dist/drift.d.ts.map +0 -1
  131. package/dist/drift.js +0 -61
  132. package/dist/drift.js.map +0 -1
  133. package/dist/formatters.d.ts +0 -30
  134. package/dist/formatters.d.ts.map +0 -1
  135. package/dist/formatters.js +0 -98
  136. package/dist/formatters.js.map +0 -1
  137. package/dist/index.d.ts +0 -37
  138. package/dist/index.d.ts.map +0 -1
  139. package/dist/index.js +0 -38
  140. package/dist/index.js.map +0 -1
  141. package/dist/rules/ast.d.ts +0 -82
  142. package/dist/rules/ast.d.ts.map +0 -1
  143. package/dist/rules/ast.js +0 -363
  144. package/dist/rules/ast.js.map +0 -1
  145. package/dist/rules/context-no-surface-types.d.ts +0 -12
  146. package/dist/rules/context-no-surface-types.d.ts.map +0 -1
  147. package/dist/rules/context-no-surface-types.js +0 -96
  148. package/dist/rules/context-no-surface-types.js.map +0 -1
  149. package/dist/rules/context-no-trailhead-types.d.ts +0 -12
  150. package/dist/rules/context-no-trailhead-types.d.ts.map +0 -1
  151. package/dist/rules/context-no-trailhead-types.js +0 -96
  152. package/dist/rules/context-no-trailhead-types.js.map +0 -1
  153. package/dist/rules/cross-declarations.d.ts +0 -13
  154. package/dist/rules/cross-declarations.d.ts.map +0 -1
  155. package/dist/rules/cross-declarations.js +0 -264
  156. package/dist/rules/cross-declarations.js.map +0 -1
  157. package/dist/rules/draft-file-marking.d.ts +0 -6
  158. package/dist/rules/draft-file-marking.d.ts.map +0 -1
  159. package/dist/rules/draft-file-marking.js +0 -65
  160. package/dist/rules/draft-file-marking.js.map +0 -1
  161. package/dist/rules/draft-visible-debt.d.ts +0 -12
  162. package/dist/rules/draft-visible-debt.d.ts.map +0 -1
  163. package/dist/rules/draft-visible-debt.js +0 -45
  164. package/dist/rules/draft-visible-debt.js.map +0 -1
  165. package/dist/rules/follow-declarations.d.ts +0 -13
  166. package/dist/rules/follow-declarations.d.ts.map +0 -1
  167. package/dist/rules/follow-declarations.js +0 -264
  168. package/dist/rules/follow-declarations.js.map +0 -1
  169. package/dist/rules/implementation-returns-result.d.ts +0 -13
  170. package/dist/rules/implementation-returns-result.d.ts.map +0 -1
  171. package/dist/rules/implementation-returns-result.js +0 -277
  172. package/dist/rules/implementation-returns-result.js.map +0 -1
  173. package/dist/rules/index.d.ts +0 -20
  174. package/dist/rules/index.d.ts.map +0 -1
  175. package/dist/rules/index.js +0 -49
  176. package/dist/rules/index.js.map +0 -1
  177. package/dist/rules/no-direct-impl-in-route.d.ts +0 -12
  178. package/dist/rules/no-direct-impl-in-route.d.ts.map +0 -1
  179. package/dist/rules/no-direct-impl-in-route.js +0 -47
  180. package/dist/rules/no-direct-impl-in-route.js.map +0 -1
  181. package/dist/rules/no-direct-implementation-call.d.ts +0 -12
  182. package/dist/rules/no-direct-implementation-call.d.ts.map +0 -1
  183. package/dist/rules/no-direct-implementation-call.js +0 -39
  184. package/dist/rules/no-direct-implementation-call.js.map +0 -1
  185. package/dist/rules/no-sync-result-assumption.d.ts +0 -6
  186. package/dist/rules/no-sync-result-assumption.d.ts.map +0 -1
  187. package/dist/rules/no-sync-result-assumption.js +0 -98
  188. package/dist/rules/no-sync-result-assumption.js.map +0 -1
  189. package/dist/rules/no-throw-in-detour-target.d.ts +0 -12
  190. package/dist/rules/no-throw-in-detour-target.d.ts.map +0 -1
  191. package/dist/rules/no-throw-in-detour-target.js +0 -87
  192. package/dist/rules/no-throw-in-detour-target.js.map +0 -1
  193. package/dist/rules/no-throw-in-implementation.d.ts +0 -9
  194. package/dist/rules/no-throw-in-implementation.d.ts.map +0 -1
  195. package/dist/rules/no-throw-in-implementation.js +0 -34
  196. package/dist/rules/no-throw-in-implementation.js.map +0 -1
  197. package/dist/rules/prefer-schema-inference.d.ts +0 -7
  198. package/dist/rules/prefer-schema-inference.d.ts.map +0 -1
  199. package/dist/rules/prefer-schema-inference.js +0 -86
  200. package/dist/rules/prefer-schema-inference.js.map +0 -1
  201. package/dist/rules/provision-declarations.d.ts +0 -14
  202. package/dist/rules/provision-declarations.d.ts.map +0 -1
  203. package/dist/rules/provision-declarations.js +0 -344
  204. package/dist/rules/provision-declarations.js.map +0 -1
  205. package/dist/rules/provision-exists.d.ts +0 -6
  206. package/dist/rules/provision-exists.d.ts.map +0 -1
  207. package/dist/rules/provision-exists.js +0 -90
  208. package/dist/rules/provision-exists.js.map +0 -1
  209. package/dist/rules/scan.d.ts +0 -8
  210. package/dist/rules/scan.d.ts.map +0 -1
  211. package/dist/rules/scan.js +0 -32
  212. package/dist/rules/scan.js.map +0 -1
  213. package/dist/rules/service-declarations.d.ts +0 -16
  214. package/dist/rules/service-declarations.d.ts.map +0 -1
  215. package/dist/rules/service-declarations.js +0 -346
  216. package/dist/rules/service-declarations.js.map +0 -1
  217. package/dist/rules/service-exists.d.ts +0 -8
  218. package/dist/rules/service-exists.d.ts.map +0 -1
  219. package/dist/rules/service-exists.js +0 -91
  220. package/dist/rules/service-exists.js.map +0 -1
  221. package/dist/rules/specs.d.ts +0 -29
  222. package/dist/rules/specs.d.ts.map +0 -1
  223. package/dist/rules/specs.js +0 -192
  224. package/dist/rules/specs.js.map +0 -1
  225. package/dist/rules/structure.d.ts +0 -13
  226. package/dist/rules/structure.d.ts.map +0 -1
  227. package/dist/rules/structure.js +0 -142
  228. package/dist/rules/structure.js.map +0 -1
  229. package/dist/rules/types.d.ts +0 -54
  230. package/dist/rules/types.d.ts.map +0 -1
  231. package/dist/rules/types.js +0 -2
  232. package/dist/rules/types.js.map +0 -1
  233. package/dist/rules/valid-describe-refs.d.ts +0 -7
  234. package/dist/rules/valid-describe-refs.d.ts.map +0 -1
  235. package/dist/rules/valid-describe-refs.js +0 -51
  236. package/dist/rules/valid-describe-refs.js.map +0 -1
  237. package/dist/rules/valid-detour-refs.d.ts +0 -6
  238. package/dist/rules/valid-detour-refs.d.ts.map +0 -1
  239. package/dist/rules/valid-detour-refs.js +0 -117
  240. package/dist/rules/valid-detour-refs.js.map +0 -1
  241. package/dist/trails/context-no-surface-types.trail.d.ts +0 -13
  242. package/dist/trails/context-no-surface-types.trail.d.ts.map +0 -1
  243. package/dist/trails/context-no-surface-types.trail.js +0 -21
  244. package/dist/trails/context-no-surface-types.trail.js.map +0 -1
  245. package/dist/trails/context-no-trailhead-types.trail.d.ts +0 -13
  246. package/dist/trails/context-no-trailhead-types.trail.d.ts.map +0 -1
  247. package/dist/trails/context-no-trailhead-types.trail.js +0 -21
  248. package/dist/trails/context-no-trailhead-types.trail.js.map +0 -1
  249. package/dist/trails/cross-declarations.trail.d.ts +0 -13
  250. package/dist/trails/cross-declarations.trail.d.ts.map +0 -1
  251. package/dist/trails/cross-declarations.trail.js +0 -22
  252. package/dist/trails/cross-declarations.trail.js.map +0 -1
  253. package/dist/trails/follow-declarations.trail.d.ts +0 -13
  254. package/dist/trails/follow-declarations.trail.d.ts.map +0 -1
  255. package/dist/trails/follow-declarations.trail.js +0 -22
  256. package/dist/trails/follow-declarations.trail.js.map +0 -1
  257. package/dist/trails/implementation-returns-result.trail.d.ts +0 -13
  258. package/dist/trails/implementation-returns-result.trail.d.ts.map +0 -1
  259. package/dist/trails/implementation-returns-result.trail.js +0 -20
  260. package/dist/trails/implementation-returns-result.trail.js.map +0 -1
  261. package/dist/trails/index.d.ts +0 -16
  262. package/dist/trails/index.d.ts.map +0 -1
  263. package/dist/trails/index.js +0 -15
  264. package/dist/trails/index.js.map +0 -1
  265. package/dist/trails/no-direct-impl-in-route.trail.d.ts +0 -13
  266. package/dist/trails/no-direct-impl-in-route.trail.d.ts.map +0 -1
  267. package/dist/trails/no-direct-impl-in-route.trail.js +0 -22
  268. package/dist/trails/no-direct-impl-in-route.trail.js.map +0 -1
  269. package/dist/trails/no-direct-implementation-call.trail.d.ts +0 -13
  270. package/dist/trails/no-direct-implementation-call.trail.d.ts.map +0 -1
  271. package/dist/trails/no-direct-implementation-call.trail.js +0 -16
  272. package/dist/trails/no-direct-implementation-call.trail.js.map +0 -1
  273. package/dist/trails/no-sync-result-assumption.trail.d.ts +0 -13
  274. package/dist/trails/no-sync-result-assumption.trail.d.ts.map +0 -1
  275. package/dist/trails/no-sync-result-assumption.trail.js +0 -19
  276. package/dist/trails/no-sync-result-assumption.trail.js.map +0 -1
  277. package/dist/trails/no-throw-in-detour-target.trail.d.ts +0 -15
  278. package/dist/trails/no-throw-in-detour-target.trail.d.ts.map +0 -1
  279. package/dist/trails/no-throw-in-detour-target.trail.js +0 -20
  280. package/dist/trails/no-throw-in-detour-target.trail.js.map +0 -1
  281. package/dist/trails/no-throw-in-implementation.trail.d.ts +0 -13
  282. package/dist/trails/no-throw-in-implementation.trail.d.ts.map +0 -1
  283. package/dist/trails/no-throw-in-implementation.trail.js +0 -20
  284. package/dist/trails/no-throw-in-implementation.trail.js.map +0 -1
  285. package/dist/trails/prefer-schema-inference.trail.d.ts +0 -13
  286. package/dist/trails/prefer-schema-inference.trail.d.ts.map +0 -1
  287. package/dist/trails/prefer-schema-inference.trail.js +0 -21
  288. package/dist/trails/prefer-schema-inference.trail.js.map +0 -1
  289. package/dist/trails/provision-declarations.trail.d.ts +0 -13
  290. package/dist/trails/provision-declarations.trail.d.ts.map +0 -1
  291. package/dist/trails/provision-declarations.trail.js +0 -25
  292. package/dist/trails/provision-declarations.trail.js.map +0 -1
  293. package/dist/trails/provision-exists.trail.d.ts +0 -15
  294. package/dist/trails/provision-exists.trail.d.ts.map +0 -1
  295. package/dist/trails/provision-exists.trail.js +0 -27
  296. package/dist/trails/provision-exists.trail.js.map +0 -1
  297. package/dist/trails/run.d.ts +0 -17
  298. package/dist/trails/run.d.ts.map +0 -1
  299. package/dist/trails/run.js +0 -39
  300. package/dist/trails/run.js.map +0 -1
  301. package/dist/trails/schema.d.ts +0 -53
  302. package/dist/trails/schema.d.ts.map +0 -1
  303. package/dist/trails/schema.js +0 -42
  304. package/dist/trails/schema.js.map +0 -1
  305. package/dist/trails/service-declarations.trail.d.ts +0 -26
  306. package/dist/trails/service-declarations.trail.d.ts.map +0 -1
  307. package/dist/trails/service-declarations.trail.js +0 -27
  308. package/dist/trails/service-declarations.trail.js.map +0 -1
  309. package/dist/trails/service-exists.trail.d.ts +0 -32
  310. package/dist/trails/service-exists.trail.d.ts.map +0 -1
  311. package/dist/trails/service-exists.trail.js +0 -29
  312. package/dist/trails/service-exists.trail.js.map +0 -1
  313. package/dist/trails/topo.d.ts +0 -3
  314. package/dist/trails/topo.d.ts.map +0 -1
  315. package/dist/trails/topo.js +0 -5
  316. package/dist/trails/topo.js.map +0 -1
  317. package/dist/trails/valid-describe-refs.trail.d.ts +0 -15
  318. package/dist/trails/valid-describe-refs.trail.d.ts.map +0 -1
  319. package/dist/trails/valid-describe-refs.trail.js +0 -18
  320. package/dist/trails/valid-describe-refs.trail.js.map +0 -1
  321. package/dist/trails/valid-detour-refs.trail.d.ts +0 -15
  322. package/dist/trails/valid-detour-refs.trail.d.ts.map +0 -1
  323. package/dist/trails/valid-detour-refs.trail.js +0 -24
  324. package/dist/trails/valid-detour-refs.trail.js.map +0 -1
  325. package/dist/trails/wrap-rule.d.ts +0 -29
  326. package/dist/trails/wrap-rule.d.ts.map +0 -1
  327. package/dist/trails/wrap-rule.js +0 -47
  328. package/dist/trails/wrap-rule.js.map +0 -1
  329. package/src/__tests__/cli.test.ts +0 -311
  330. package/src/__tests__/cross-declarations.test.ts +0 -303
  331. package/src/__tests__/drift.test.ts +0 -144
  332. package/src/__tests__/formatters.test.ts +0 -157
  333. package/src/__tests__/implementation-returns-result.test.ts +0 -129
  334. package/src/__tests__/no-direct-implementation-call.test.ts +0 -83
  335. package/src/__tests__/no-sync-result-assumption.test.ts +0 -85
  336. package/src/__tests__/no-throw-in-detour-target.test.ts +0 -78
  337. package/src/__tests__/prefer-schema-inference.test.ts +0 -84
  338. package/src/__tests__/provision-declarations.test.ts +0 -318
  339. package/src/__tests__/provision-exists.test.ts +0 -122
  340. package/src/__tests__/rules.test.ts +0 -227
  341. package/src/__tests__/trails.test.ts +0 -19
  342. package/src/__tests__/valid-describe-refs.test.ts +0 -60
  343. package/src/__tests__/wrap-rule.test.ts +0 -41
  344. package/src/rules/no-direct-impl-in-route.ts +0 -81
  345. package/src/rules/no-throw-in-detour-target.ts +0 -150
  346. package/src/rules/valid-detour-refs.ts +0 -189
  347. package/src/trails/no-direct-impl-in-route.trail.ts +0 -22
  348. package/src/trails/no-throw-in-detour-target.trail.ts +0 -20
  349. package/src/trails/valid-detour-refs.trail.ts +0 -24
  350. package/tsconfig.json +0 -9
  351. package/tsconfig.tsbuildinfo +0 -1
@@ -1,346 +0,0 @@
1
- /**
2
- * Validates that provision access matches the declared `provisions` array.
3
- *
4
- * Statically analyzes trail `blaze` functions to find `db.from(ctx)` and
5
- * `ctx.provision('db.main')` calls and compares them against the declared
6
- * `provisions: [...]` array in the trail config. Reports errors for undeclared
7
- * access and warnings for unused declarations.
8
- */
9
- import { collectNamedProvisionIds, extractFirstStringArg, findConfigProperty, findBlazeBodies, findTrailDefinitions, getStringValue, identifierName, isStringLiteral, offsetToLine, parse, walkScope, } from './ast.js';
10
- import { isTestFile } from './scan.js';
11
- const MEMBER_TYPES = new Set(['StaticMemberExpression', 'MemberExpression']);
12
- /** Extract object and property Identifier names from a MemberExpression. */
13
- const extractMemberPair = (callee) => {
14
- if (!MEMBER_TYPES.has(callee.type)) {
15
- return null;
16
- }
17
- const objName = identifierName(callee.object);
18
- const propName = identifierName(callee.property);
19
- return objName && propName ? { objName, propName } : null;
20
- };
21
- /** Check if a node is an inline `provision('id', ...)` call. */
22
- const isInlineProvisionCall = (node) => {
23
- if (node.type !== 'CallExpression') {
24
- return false;
25
- }
26
- return (identifierName(node.callee) ===
27
- 'provision');
28
- };
29
- /** Get `provisions` array elements from a trail config. */
30
- const getProvisionElements = (config) => {
31
- const provisionsProp = findConfigProperty(config, 'provisions');
32
- if (!provisionsProp) {
33
- return [];
34
- }
35
- const arrayNode = provisionsProp.value;
36
- if (!arrayNode || arrayNode.type !== 'ArrayExpression') {
37
- return [];
38
- }
39
- const elements = arrayNode['elements'];
40
- return elements ?? [];
41
- };
42
- /** Extract one declared provision from a `provisions` array element. */
43
- const extractDeclaredProvision = (element, provisionIdsByName) => {
44
- if (element.type === 'Identifier') {
45
- const name = identifierName(element);
46
- return {
47
- id: name ? (provisionIdsByName.get(name) ?? null) : null,
48
- name,
49
- };
50
- }
51
- if (isStringLiteral(element)) {
52
- return { id: getStringValue(element), name: null };
53
- }
54
- if (isInlineProvisionCall(element)) {
55
- return { id: extractFirstStringArg(element), name: null };
56
- }
57
- return null;
58
- };
59
- /** Extract declared provisions from a trail config's `provisions` array. */
60
- const extractDeclaredProvisions = (config, provisionIdsByName) => getProvisionElements(config).flatMap((element) => {
61
- const provision = extractDeclaredProvision(element, provisionIdsByName);
62
- return provision ? [provision] : [];
63
- });
64
- // ---------------------------------------------------------------------------
65
- // Called service extraction
66
- // ---------------------------------------------------------------------------
67
- /** Extract the second parameter name from a blaze function node. */
68
- const extractContextParamName = (blazeBody) => {
69
- const params = blazeBody['params'];
70
- if (!params || params.length < 2) {
71
- return null;
72
- }
73
- return identifierName(params[1]);
74
- };
75
- /** Build the set of context parameter names to match against. */
76
- const buildCtxNames = (body) => {
77
- const ctxNames = new Set(['ctx', 'context']);
78
- const paramName = extractContextParamName(body);
79
- if (paramName) {
80
- ctxNames.add(paramName);
81
- }
82
- return ctxNames;
83
- };
84
- /** Extract a CallExpression callee, or null. */
85
- const extractCallCallee = (node) => {
86
- if (node.type !== 'CallExpression') {
87
- return null;
88
- }
89
- return (node.callee ??
90
- null);
91
- };
92
- /** Extract the first identifier argument from a CallExpression. */
93
- const extractFirstIdentifierArg = (node) => {
94
- const args = node['arguments'];
95
- const [firstArg] = args ?? [];
96
- return identifierName(firstArg);
97
- };
98
- const extractCallInfo = (node) => {
99
- const callee = extractCallCallee(node);
100
- return callee
101
- ? {
102
- callee,
103
- firstArgName: extractFirstIdentifierArg(node),
104
- }
105
- : null;
106
- };
107
- /** Extract `db.from(ctx)` object names. */
108
- const extractFromCallName = (node, ctxNames) => {
109
- const call = extractCallInfo(node);
110
- const pair = call ? extractMemberPair(call.callee) : null;
111
- return pair &&
112
- pair.propName === 'from' &&
113
- call?.firstArgName &&
114
- ctxNames.has(call.firstArgName)
115
- ? pair.objName
116
- : null;
117
- };
118
- /** Check if a callee is a member-style `ctx.provision(...)` call. */
119
- const isMemberProvisionCall = (callee, ctxNames) => {
120
- const pair = extractMemberPair(callee);
121
- return !!pair && ctxNames.has(pair.objName) && pair.propName === 'provision';
122
- };
123
- /** Extract `ctx.provision(db)` and destructured `provision(db)` lookup names. */
124
- const extractLookupProvisionName = (node, ctxNames, provisionAliases) => {
125
- const callee = extractCallCallee(node);
126
- if (!callee) {
127
- return null;
128
- }
129
- if (isMemberProvisionCall(callee, ctxNames)) {
130
- return extractFirstIdentifierArg(node);
131
- }
132
- if (provisionAliases.has(identifierName(callee) ?? '')) {
133
- return extractFirstIdentifierArg(node);
134
- }
135
- return null;
136
- };
137
- /** Extract `ctx.provision('id')` and destructured `provision('id')` lookup IDs. */
138
- const extractLookupProvisionId = (node, ctxNames, provisionAliases) => {
139
- const callee = extractCallCallee(node);
140
- if (!callee) {
141
- return null;
142
- }
143
- if (isMemberProvisionCall(callee, ctxNames)) {
144
- return extractFirstStringArg(node);
145
- }
146
- const calleeName = identifierName(callee);
147
- const args = node['arguments'];
148
- if (calleeName && provisionAliases.has(calleeName) && args?.length === 1) {
149
- return extractFirstStringArg(node);
150
- }
151
- return null;
152
- };
153
- /** Collect local aliases for the provision accessor (e.g. `const { provision } = ctx`). */
154
- const collectProvisionAliases = (body, ctxNames) => {
155
- const aliases = new Set();
156
- const extractAliasNames = (pattern) => {
157
- if (pattern?.type !== 'ObjectPattern') {
158
- return [];
159
- }
160
- const properties = pattern['properties'];
161
- return (properties ?? []).flatMap((property) => {
162
- if (property.type !== 'Property') {
163
- return [];
164
- }
165
- const keyName = identifierName(property.key);
166
- if (keyName !== 'provision') {
167
- return [];
168
- }
169
- const alias = identifierName(property.value) ??
170
- keyName;
171
- return [alias];
172
- });
173
- };
174
- walkScope(body, (node) => {
175
- if (node.type !== 'VariableDeclarator') {
176
- return;
177
- }
178
- const { id, init } = node;
179
- const initName = identifierName(init);
180
- if (!initName || !ctxNames.has(initName)) {
181
- return;
182
- }
183
- for (const alias of extractAliasNames(id)) {
184
- aliases.add(alias);
185
- }
186
- });
187
- return aliases;
188
- };
189
- /** Walk blaze bodies and collect provision access that can be resolved statically. */
190
- const extractCalledProvisions = (config) => {
191
- const fromNames = new Set();
192
- const lookupIds = new Set();
193
- const lookupNames = new Set();
194
- for (const body of findBlazeBodies(config)) {
195
- const ctxNames = buildCtxNames(body);
196
- const provisionAliases = collectProvisionAliases(body, ctxNames);
197
- walkScope(body, (node) => {
198
- const fromName = extractFromCallName(node, ctxNames);
199
- if (fromName) {
200
- fromNames.add(fromName);
201
- }
202
- const lookupId = extractLookupProvisionId(node, ctxNames, provisionAliases);
203
- if (lookupId) {
204
- lookupIds.add(lookupId);
205
- }
206
- const lookupName = extractLookupProvisionName(node, ctxNames, provisionAliases);
207
- if (lookupName) {
208
- lookupNames.add(lookupName);
209
- }
210
- });
211
- }
212
- return { fromNames, lookupIds, lookupNames };
213
- };
214
- // ---------------------------------------------------------------------------
215
- // Diagnostics
216
- // ---------------------------------------------------------------------------
217
- const renderDeclaredProvision = (provision) => provision.name ?? provision.id ?? '<unknown>';
218
- const buildUndeclaredFromDiagnostic = (trailId, provisionName, filePath, line) => ({
219
- filePath,
220
- line,
221
- message: `Trail "${trailId}": ${provisionName}.from(ctx) called but '${provisionName}' is not declared in provisions`,
222
- rule: 'provision-declarations',
223
- severity: 'error',
224
- });
225
- const buildUndeclaredLookupDiagnostic = (trailId, provisionId, filePath, line) => ({
226
- filePath,
227
- line,
228
- message: `Trail "${trailId}": ctx.provision('${provisionId}') called but '${provisionId}' is not declared in provisions`,
229
- rule: 'provision-declarations',
230
- severity: 'error',
231
- });
232
- const buildUndeclaredLookupNameDiagnostic = (trailId, provisionName, filePath, line) => ({
233
- filePath,
234
- line,
235
- message: `Trail "${trailId}": ctx.provision(${provisionName}) called but '${provisionName}' is not declared in provisions`,
236
- rule: 'provision-declarations',
237
- severity: 'error',
238
- });
239
- const buildUnusedDiagnostic = (trailId, declaredProvision, filePath, line) => ({
240
- filePath,
241
- line,
242
- message: `Trail "${trailId}": '${renderDeclaredProvision(declaredProvision)}' declared in provisions but never used`,
243
- rule: 'provision-declarations',
244
- severity: 'warn',
245
- });
246
- // ---------------------------------------------------------------------------
247
- // Comparison
248
- // ---------------------------------------------------------------------------
249
- const provisionWasUsed = (declaredProvision, calledProvisions) => {
250
- if (declaredProvision.name &&
251
- (calledProvisions.fromNames.has(declaredProvision.name) ||
252
- calledProvisions.lookupNames.has(declaredProvision.name))) {
253
- return true;
254
- }
255
- if (declaredProvision.id &&
256
- calledProvisions.lookupIds.has(declaredProvision.id)) {
257
- return true;
258
- }
259
- return false;
260
- };
261
- const buildDeclaredNames = (declaredProvisions) => new Set(declaredProvisions.flatMap((provision) => provision.name ? [provision.name] : []));
262
- const buildDeclaredIds = (declaredProvisions) => new Set(declaredProvisions.flatMap((provision) => provision.id ? [provision.id] : []));
263
- const reportUndeclaredFromCalls = (trailId, filePath, line, calledProvisions, declaredNames, diagnostics) => {
264
- for (const provisionName of calledProvisions.fromNames) {
265
- if (!declaredNames.has(provisionName)) {
266
- diagnostics.push(buildUndeclaredFromDiagnostic(trailId, provisionName, filePath, line));
267
- }
268
- }
269
- };
270
- const reportUndeclaredLookupCalls = (trailId, filePath, line, calledProvisions, declaredIds, declaredNames, diagnostics) => {
271
- for (const provisionName of calledProvisions.lookupNames) {
272
- // Name-based lookup checks remain reliable even when an imported provision ID
273
- // cannot be resolved locally.
274
- if (!declaredNames.has(provisionName)) {
275
- diagnostics.push(buildUndeclaredLookupNameDiagnostic(trailId, provisionName, filePath, line));
276
- }
277
- }
278
- for (const provisionId of calledProvisions.lookupIds) {
279
- if (!declaredIds.has(provisionId)) {
280
- diagnostics.push(buildUndeclaredLookupDiagnostic(trailId, provisionId, filePath, line));
281
- }
282
- }
283
- };
284
- const reportUnusedDeclarations = (trailId, filePath, line, declaredProvisions, calledProvisions, diagnostics) => {
285
- for (const declaredProvision of declaredProvisions) {
286
- if (provisionWasUsed(declaredProvision, calledProvisions)) {
287
- continue;
288
- }
289
- if (declaredProvision.name && declaredProvision.id === null) {
290
- continue;
291
- }
292
- diagnostics.push(buildUnusedDiagnostic(trailId, declaredProvision, filePath, line));
293
- }
294
- };
295
- const hasNoProvisionActivity = (declaredProvisions, calledProvisions) => declaredProvisions.length === 0 &&
296
- calledProvisions.fromNames.size === 0 &&
297
- calledProvisions.lookupIds.size === 0 &&
298
- calledProvisions.lookupNames.size === 0;
299
- const analyzeTrailServices = (def, sourceCode, provisionIdsByName) => {
300
- const declaredProvisions = extractDeclaredProvisions(def.config, provisionIdsByName);
301
- return {
302
- calledProvisions: extractCalledProvisions(def.config),
303
- declaredIds: buildDeclaredIds(declaredProvisions),
304
- declaredNames: buildDeclaredNames(declaredProvisions),
305
- declaredProvisions,
306
- line: offsetToLine(sourceCode, def.start),
307
- };
308
- };
309
- const checkTrailDefinition = (def, filePath, sourceCode, provisionIdsByName, diagnostics) => {
310
- const { calledProvisions, declaredIds, declaredNames, declaredProvisions, line, } = analyzeTrailServices(def, sourceCode, provisionIdsByName);
311
- if (hasNoProvisionActivity(declaredProvisions, calledProvisions)) {
312
- return;
313
- }
314
- reportUndeclaredFromCalls(def.id, filePath, line, calledProvisions, declaredNames, diagnostics);
315
- reportUndeclaredLookupCalls(def.id, filePath, line, calledProvisions, declaredIds, declaredNames, diagnostics);
316
- reportUnusedDeclarations(def.id, filePath, line, declaredProvisions, calledProvisions, diagnostics);
317
- };
318
- // ---------------------------------------------------------------------------
319
- // Rule
320
- // ---------------------------------------------------------------------------
321
- /**
322
- * Validates that provision access aligns with declared `provisions` arrays.
323
- */
324
- export const provisionDeclarations = {
325
- check(sourceCode, filePath) {
326
- if (isTestFile(filePath)) {
327
- return [];
328
- }
329
- const ast = parse(filePath, sourceCode);
330
- if (!ast) {
331
- return [];
332
- }
333
- const diagnostics = [];
334
- const provisionIdsByName = collectNamedProvisionIds(ast);
335
- for (const def of findTrailDefinitions(ast)) {
336
- checkTrailDefinition(def, filePath, sourceCode, provisionIdsByName, diagnostics);
337
- }
338
- return diagnostics;
339
- },
340
- description: 'Ensure provision.from(ctx) and ctx.provision() calls match the declared provisions array in trail definitions.',
341
- name: 'provision-declarations',
342
- severity: 'error',
343
- };
344
- /** Backward-compatible alias while the migration is in flight. */
345
- export const serviceDeclarations = provisionDeclarations;
346
- //# sourceMappingURL=service-declarations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-declarations.js","sourceRoot":"","sources":["../../src/rules/service-declarations.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import type { ProjectAwareWardenRule } from './types.js';
2
- /**
3
- * Checks that all declared provisions resolve to known provision definitions.
4
- */
5
- export declare const provisionExists: ProjectAwareWardenRule;
6
- /** Backward-compatible alias while the migration is in flight. */
7
- export declare const serviceExists: ProjectAwareWardenRule;
8
- //# sourceMappingURL=service-exists.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-exists.d.ts","sourceRoot":"","sources":["../../src/rules/service-exists.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,sBAAsB,EAGvB,MAAM,YAAY,CAAC;AA4HpB;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,sBA+B7B,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,aAAa,wBAAkB,CAAC"}
@@ -1,91 +0,0 @@
1
- import { collectNamedProvisionIds, collectProvisionDefinitionIds, extractFirstStringArg, findConfigProperty, findTrailDefinitions, getStringValue, identifierName, isStringLiteral, offsetToLine, parse, } from './ast.js';
2
- import { isTestFile } from './scan.js';
3
- const isProvisionCall = (node) => node.type === 'CallExpression' &&
4
- identifierName(node.callee) ===
5
- 'provision';
6
- const getProvisionElements = (config) => {
7
- const provisionsProp = findConfigProperty(config, 'provisions');
8
- if (!provisionsProp) {
9
- return [];
10
- }
11
- const arrayNode = provisionsProp.value;
12
- if (!arrayNode || arrayNode.type !== 'ArrayExpression') {
13
- return [];
14
- }
15
- const elements = arrayNode['elements'];
16
- return elements ?? [];
17
- };
18
- const extractDeclaredProvisionId = (element, provisionIdsByName) => {
19
- if (element.type === 'Identifier') {
20
- const name = identifierName(element);
21
- return name ? (provisionIdsByName.get(name) ?? null) : null;
22
- }
23
- if (isStringLiteral(element)) {
24
- return getStringValue(element);
25
- }
26
- return isProvisionCall(element) ? extractFirstStringArg(element) : null;
27
- };
28
- const extractDeclaredProvisionIds = (config, provisionIdsByName) => [
29
- ...new Set(getProvisionElements(config).flatMap((element) => {
30
- const id = extractDeclaredProvisionId(element, provisionIdsByName);
31
- return id ? [id] : [];
32
- })),
33
- ];
34
- const buildMissingProvisionDiagnostic = (trailId, provisionId, filePath, line) => ({
35
- filePath,
36
- line,
37
- message: `Trail "${trailId}" declares provision "${provisionId}" which is not defined in the project.`,
38
- rule: 'provision-exists',
39
- severity: 'error',
40
- });
41
- const reportMissingProvisions = (def, sourceCode, provisionIdsByName, filePath, knownProvisionIds, diagnostics) => {
42
- const line = offsetToLine(sourceCode, def.start);
43
- for (const provisionId of extractDeclaredProvisionIds(def.config, provisionIdsByName)) {
44
- if (!knownProvisionIds.has(provisionId)) {
45
- diagnostics.push(buildMissingProvisionDiagnostic(def.id, provisionId, filePath, line));
46
- }
47
- }
48
- };
49
- const buildProvisionDiagnostics = (ast, sourceCode, filePath, knownProvisionIds) => {
50
- const diagnostics = [];
51
- const provisionIdsByName = collectNamedProvisionIds(ast);
52
- for (const def of findTrailDefinitions(ast)) {
53
- reportMissingProvisions(def, sourceCode, provisionIdsByName, filePath, knownProvisionIds, diagnostics);
54
- }
55
- return diagnostics;
56
- };
57
- const checkProvisionsExist = (sourceCode, filePath, knownProvisionIds) => {
58
- if (isTestFile(filePath)) {
59
- return [];
60
- }
61
- const ast = parse(filePath, sourceCode);
62
- if (!ast) {
63
- return [];
64
- }
65
- return buildProvisionDiagnostics(ast, sourceCode, filePath, knownProvisionIds);
66
- };
67
- /**
68
- * Checks that all declared provisions resolve to known provision definitions.
69
- */
70
- export const provisionExists = {
71
- check(sourceCode, filePath) {
72
- const ast = parse(filePath, sourceCode);
73
- if (!ast) {
74
- return [];
75
- }
76
- return checkProvisionsExist(sourceCode, filePath, collectProvisionDefinitionIds(ast));
77
- },
78
- checkWithContext(sourceCode, filePath, context) {
79
- const ast = parse(filePath, sourceCode);
80
- const localProvisionIds = ast
81
- ? collectProvisionDefinitionIds(ast)
82
- : new Set();
83
- return checkProvisionsExist(sourceCode, filePath, context.knownProvisionIds ?? context.knownServiceIds ?? localProvisionIds);
84
- },
85
- description: 'Ensure every provision declared on a trail resolves to a known provision definition.',
86
- name: 'provision-exists',
87
- severity: 'error',
88
- };
89
- /** Backward-compatible alias while the migration is in flight. */
90
- export const serviceExists = provisionExists;
91
- //# sourceMappingURL=service-exists.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-exists.js","sourceRoot":"","sources":["../../src/rules/service-exists.ts"],"names":[],"mappings":"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"}
@@ -1,29 +0,0 @@
1
- export interface ParsedEntry {
2
- readonly line: number;
3
- readonly start: number;
4
- readonly text: string;
5
- }
6
- export interface ObjectProperty extends ParsedEntry {
7
- readonly key: string;
8
- readonly value: string;
9
- }
10
- export interface TrailLikeSpec {
11
- readonly id: string;
12
- readonly kind: 'signal' | 'trail';
13
- readonly line: number;
14
- readonly properties: ReadonlyMap<string, ObjectProperty>;
15
- readonly specText: string;
16
- readonly start: number;
17
- }
18
- export interface SchemaFieldInfo {
19
- readonly derivedLabel: string;
20
- readonly options?: readonly string[] | undefined;
21
- readonly required: boolean;
22
- }
23
- export declare const parseStringLiteral: (text: string) => string | null;
24
- export declare const parseArrayEntries: (arrayText: string, arrayStart: number, sourceCode: string) => readonly ParsedEntry[];
25
- export declare const parseObjectProperties: (objectText: string, objectStart: number, sourceCode: string) => ReadonlyMap<string, ObjectProperty>;
26
- export declare const findTrailLikeSpecs: (sourceCode: string) => readonly TrailLikeSpec[];
27
- export declare const collectTrailIds: (sourceCode: string) => ReadonlySet<string>;
28
- export declare const parseZodObjectShape: (schemaText: string) => ReadonlyMap<string, SchemaFieldInfo>;
29
- //# sourceMappingURL=specs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"specs.d.ts","sourceRoot":"","sources":["../../src/rules/specs.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAuFD,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,IAc1D,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,WAAW,MAAM,EACjB,YAAY,MAAM,EAClB,YAAY,MAAM,KACjB,SAAS,WAAW,EActB,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,YAAY,MAAM,EAClB,aAAa,MAAM,EACnB,YAAY,MAAM,KACjB,WAAW,CAAC,MAAM,EAAE,cAAc,CAcpC,CAAC;AA2KF,eAAO,MAAM,kBAAkB,GAC7B,YAAY,MAAM,KACjB,SAAS,aAAa,EAiBxB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,YAAY,MAAM,KAAG,WAAW,CAAC,MAAM,CACP,CAAC;AAEjE,eAAO,MAAM,mBAAmB,GAC9B,YAAY,MAAM,KACjB,WAAW,CAAC,MAAM,EAAE,eAAe,CAcrC,CAAC"}