@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,344 +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
- //# sourceMappingURL=provision-declarations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"provision-declarations.js","sourceRoot":"","sources":["../../src/rules/provision-declarations.ts"],"names":[],"mappings":"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"}
@@ -1,6 +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
- //# sourceMappingURL=provision-exists.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"provision-exists.d.ts","sourceRoot":"","sources":["../../src/rules/provision-exists.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,sBAAsB,EAGvB,MAAM,YAAY,CAAC;AAiIpB;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,sBA+B7B,CAAC"}
@@ -1,90 +0,0 @@
1
- import { isDraftId } from '@ontrails/core';
2
- import { collectNamedProvisionIds, collectProvisionDefinitionIds, extractFirstStringArg, findConfigProperty, findTrailDefinitions, getStringValue, identifierName, isStringLiteral, offsetToLine, parse, } from './ast.js';
3
- import { isTestFile } from './scan.js';
4
- const isProvisionCall = (node) => node.type === 'CallExpression' &&
5
- identifierName(node.callee) ===
6
- 'provision';
7
- const getProvisionElements = (config) => {
8
- const provisionsProp = findConfigProperty(config, 'provisions');
9
- if (!provisionsProp) {
10
- return [];
11
- }
12
- const arrayNode = provisionsProp.value;
13
- if (!arrayNode || arrayNode.type !== 'ArrayExpression') {
14
- return [];
15
- }
16
- const elements = arrayNode['elements'];
17
- return elements ?? [];
18
- };
19
- const extractDeclaredProvisionId = (element, provisionIdsByName) => {
20
- if (element.type === 'Identifier') {
21
- const name = identifierName(element);
22
- return name ? (provisionIdsByName.get(name) ?? null) : null;
23
- }
24
- if (isStringLiteral(element)) {
25
- return getStringValue(element);
26
- }
27
- return isProvisionCall(element) ? extractFirstStringArg(element) : null;
28
- };
29
- const extractDeclaredProvisionIds = (config, provisionIdsByName) => [
30
- ...new Set(getProvisionElements(config).flatMap((element) => {
31
- const id = extractDeclaredProvisionId(element, provisionIdsByName);
32
- return id ? [id] : [];
33
- })),
34
- ];
35
- const buildMissingProvisionDiagnostic = (trailId, provisionId, filePath, line) => ({
36
- filePath,
37
- line,
38
- message: `Trail "${trailId}" declares provision "${provisionId}" which is not defined in the project.`,
39
- rule: 'provision-exists',
40
- severity: 'error',
41
- });
42
- const reportMissingProvisions = (def, sourceCode, provisionIdsByName, filePath, knownProvisionIds, diagnostics) => {
43
- const line = offsetToLine(sourceCode, def.start);
44
- for (const provisionId of extractDeclaredProvisionIds(def.config, provisionIdsByName)) {
45
- if (!knownProvisionIds.has(provisionId) && !isDraftId(provisionId)) {
46
- diagnostics.push(buildMissingProvisionDiagnostic(def.id, provisionId, filePath, line));
47
- }
48
- }
49
- };
50
- const buildProvisionDiagnostics = (ast, sourceCode, filePath, knownProvisionIds) => {
51
- const diagnostics = [];
52
- const provisionIdsByName = collectNamedProvisionIds(ast);
53
- for (const def of findTrailDefinitions(ast)) {
54
- reportMissingProvisions(def, sourceCode, provisionIdsByName, filePath, knownProvisionIds, diagnostics);
55
- }
56
- return diagnostics;
57
- };
58
- const checkProvisionsExist = (sourceCode, filePath, knownProvisionIds) => {
59
- if (isTestFile(filePath)) {
60
- return [];
61
- }
62
- const ast = parse(filePath, sourceCode);
63
- if (!ast) {
64
- return [];
65
- }
66
- return buildProvisionDiagnostics(ast, sourceCode, filePath, knownProvisionIds);
67
- };
68
- /**
69
- * Checks that all declared provisions resolve to known provision definitions.
70
- */
71
- export const provisionExists = {
72
- check(sourceCode, filePath) {
73
- const ast = parse(filePath, sourceCode);
74
- if (!ast) {
75
- return [];
76
- }
77
- return checkProvisionsExist(sourceCode, filePath, collectProvisionDefinitionIds(ast));
78
- },
79
- checkWithContext(sourceCode, filePath, context) {
80
- const ast = parse(filePath, sourceCode);
81
- const localProvisionIds = ast
82
- ? collectProvisionDefinitionIds(ast)
83
- : new Set();
84
- return checkProvisionsExist(sourceCode, filePath, context.knownProvisionIds ?? localProvisionIds);
85
- },
86
- description: 'Ensure every provision declared on a trail resolves to a known provision definition.',
87
- name: 'provision-exists',
88
- severity: 'error',
89
- };
90
- //# sourceMappingURL=provision-exists.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"provision-exists.js","sourceRoot":"","sources":["../../src/rules/provision-exists.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- export declare const isTestFile: (filePath: string) => boolean;
2
- export declare const isFrameworkInternalFile: (filePath: string) => boolean;
3
- /**
4
- * Replace quoted content and comments with whitespace while preserving line
5
- * breaks so simple line-based scanners do not match examples or messages.
6
- */
7
- export declare const stripQuotedContent: (sourceCode: string) => string;
8
- //# sourceMappingURL=scan.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/rules/scan.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,UAAU,GAAI,UAAU,MAAM,KAAG,OACO,CAAC;AAEtD,eAAO,MAAM,uBAAuB,GAAI,UAAU,MAAM,KAAG,OAK1D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,YAAY,MAAM,KAAG,MAevD,CAAC"}
@@ -1,32 +0,0 @@
1
- const TEST_FILE_PATTERN = /(?:^|\/)__tests__(?:\/|$)|(?:\.test|\.spec)\.[cm]?[jt]sx?$/;
2
- const FRAMEWORK_INTERNAL_SEGMENTS = [
3
- '/packages/testing/',
4
- '/packages/warden/',
5
- ];
6
- const normalizeFilePath = (filePath) => filePath.replaceAll('\\', '/');
7
- const maskText = (text) => text.replaceAll(/[^\n]/g, ' ');
8
- const stripPattern = (sourceCode, pattern) => sourceCode.replaceAll(pattern, (match) => maskText(match));
9
- export const isTestFile = (filePath) => TEST_FILE_PATTERN.test(normalizeFilePath(filePath));
10
- export const isFrameworkInternalFile = (filePath) => {
11
- const normalized = normalizeFilePath(filePath);
12
- return FRAMEWORK_INTERNAL_SEGMENTS.some((segment) => normalized.includes(segment));
13
- };
14
- /**
15
- * Replace quoted content and comments with whitespace while preserving line
16
- * breaks so simple line-based scanners do not match examples or messages.
17
- */
18
- export const stripQuotedContent = (sourceCode) => {
19
- let sanitized = sourceCode;
20
- const patterns = [
21
- /\/\/[^\n]*/g,
22
- /\/\*[\s\S]*?\*\//g,
23
- /'[^'\\\n]*(?:\\.[^'\\\n]*)*'/g,
24
- /"[^"\\\n]*(?:\\.[^"\\\n]*)*"/g,
25
- /`[\s\S]*?`/g,
26
- ];
27
- for (const pattern of patterns) {
28
- sanitized = stripPattern(sanitized, pattern);
29
- }
30
- return sanitized;
31
- };
32
- //# sourceMappingURL=scan.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/rules/scan.ts"],"names":[],"mappings":"AAAA,MAAM,iBAAiB,GACrB,4DAA4D,CAAC;AAE/D,MAAM,2BAA2B,GAAG;IAClC,oBAAoB;IACpB,mBAAmB;CACX,CAAC;AAEX,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAU,EAAE,CACrD,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAEjC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAE1E,MAAM,YAAY,GAAG,CAAC,UAAkB,EAAE,OAAe,EAAU,EAAE,CACnE,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAE7D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAW,EAAE,CACtD,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEtD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,QAAgB,EAAW,EAAE;IACnE,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAClD,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC7B,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,UAAkB,EAAU,EAAE;IAC/D,IAAI,SAAS,GAAG,UAAU,CAAC;IAC3B,MAAM,QAAQ,GAAG;QACf,aAAa;QACb,mBAAmB;QACnB,+BAA+B;QAC/B,+BAA+B;QAC/B,aAAa;KACd,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,SAAS,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC"}
@@ -1,16 +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 type { WardenRule } from './types.js';
10
- /**
11
- * Validates that provision access aligns with declared `provisions` arrays.
12
- */
13
- export declare const provisionDeclarations: WardenRule;
14
- /** Backward-compatible alias while the migration is in flight. */
15
- export declare const serviceDeclarations: WardenRule;
16
- //# sourceMappingURL=service-declarations.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-declarations.d.ts","sourceRoot":"","sources":["../../src/rules/service-declarations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiBH,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,YAAY,CAAC;AAgkB/D;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,UA8BnC,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,mBAAmB,YAAwB,CAAC"}