@intentius/chant 0.124.46 → 0.124.49

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 (726) hide show
  1. package/dist/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
  2. package/dist/__golden__/wave-loop/op-by-apply-hold.json +10 -0
  3. package/dist/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
  4. package/dist/__golden__/wave-loop/op-by-apply-pass.json +10 -0
  5. package/dist/__golden__/wave-loop/op-by-apply-skip.json +10 -0
  6. package/dist/__golden__/wave-loop/op-cost-member-clash.json +6 -0
  7. package/dist/__golden__/wave-loop/op-cost-member.json +13 -0
  8. package/dist/__golden__/wave-loop/op-denied-source.json +16 -0
  9. package/dist/__golden__/wave-loop/op-denied.json +16 -0
  10. package/dist/__golden__/wave-loop/op-discover-rest-short.json +6 -0
  11. package/dist/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
  12. package/dist/__golden__/wave-loop/op-discover-rest.json +26 -0
  13. package/dist/__golden__/wave-loop/op-discover-wide.json +26 -0
  14. package/dist/__golden__/wave-loop/op-held-on-again.json +16 -0
  15. package/dist/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
  16. package/dist/__golden__/wave-loop/op-held-on.json +16 -0
  17. package/dist/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
  18. package/dist/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
  19. package/dist/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
  20. package/dist/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
  21. package/dist/__golden__/wave-loop/op-hooks-held.json +13 -0
  22. package/dist/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
  23. package/dist/__golden__/wave-loop/op-hooks-pass.json +13 -0
  24. package/dist/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
  25. package/dist/__golden__/wave-loop/op-hooks-share.json +33 -0
  26. package/dist/__golden__/wave-loop/op-outcome-held.json +10 -0
  27. package/dist/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
  28. package/dist/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
  29. package/dist/__golden__/wave-loop/op-outcome-replan.json +10 -0
  30. package/dist/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
  31. package/dist/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
  32. package/dist/__golden__/wave-loop/op-overridden.json +16 -0
  33. package/dist/__golden__/wave-loop/op-per-run.json +20 -0
  34. package/dist/__golden__/wave-loop/op-point.json +13 -0
  35. package/dist/__golden__/wave-loop/op-pr-review.json +10 -0
  36. package/dist/__golden__/wave-loop/op-sealed.json +10 -0
  37. package/dist/__golden__/wave-loop/op-spend-change-only.json +10 -0
  38. package/dist/__golden__/wave-loop/op-spend.json +10 -0
  39. package/dist/__golden__/wave-loop/op-wave-commands.json +55 -0
  40. package/dist/__golden__/wave-loop/op-wide-refused.json +26 -0
  41. package/dist/__golden__/wave-loop/op-wide-waiting.json +29 -0
  42. package/dist/__golden__/wave-loop/op-wide.json +39 -0
  43. package/dist/action-pins.d.ts +61 -0
  44. package/dist/action-pins.d.ts.map +1 -0
  45. package/dist/action-pins.js +77 -0
  46. package/dist/cli/commands/carve.d.ts +3 -0
  47. package/dist/cli/commands/carve.d.ts.map +1 -1
  48. package/dist/cli/commands/carve.js +36 -7
  49. package/dist/cli/commands/import-report.d.ts +26 -0
  50. package/dist/cli/commands/import-report.d.ts.map +1 -0
  51. package/dist/cli/commands/import-report.js +65 -0
  52. package/dist/cli/commands/import.d.ts +11 -1
  53. package/dist/cli/commands/import.d.ts.map +1 -1
  54. package/dist/cli/commands/import.js +22 -3
  55. package/dist/cli/commands/migrate.d.ts +13 -1
  56. package/dist/cli/commands/migrate.d.ts.map +1 -1
  57. package/dist/cli/commands/migrate.js +134 -10
  58. package/dist/cli/handlers/approve.d.ts.map +1 -1
  59. package/dist/cli/handlers/approve.js +41 -14
  60. package/dist/cli/handlers/build.d.ts.map +1 -1
  61. package/dist/cli/handlers/build.js +6 -1
  62. package/dist/cli/handlers/graph-reader.d.ts +26 -0
  63. package/dist/cli/handlers/graph-reader.d.ts.map +1 -0
  64. package/dist/cli/handlers/graph-reader.js +41 -0
  65. package/dist/cli/handlers/graph.d.ts.map +1 -1
  66. package/dist/cli/handlers/graph.js +14 -0
  67. package/dist/cli/handlers/ledger.d.ts +3 -0
  68. package/dist/cli/handlers/ledger.d.ts.map +1 -0
  69. package/dist/cli/handlers/ledger.js +55 -0
  70. package/dist/cli/handlers/migrate.d.ts.map +1 -1
  71. package/dist/cli/handlers/migrate.js +18 -11
  72. package/dist/cli/handlers/misc.d.ts.map +1 -1
  73. package/dist/cli/handlers/misc.js +12 -1
  74. package/dist/cli/handlers/pr-env.js +2 -2
  75. package/dist/cli/handlers/pr.d.ts +15 -1
  76. package/dist/cli/handlers/pr.d.ts.map +1 -1
  77. package/dist/cli/handlers/pr.js +183 -40
  78. package/dist/cli/handlers/query.d.ts +7 -2
  79. package/dist/cli/handlers/query.d.ts.map +1 -1
  80. package/dist/cli/handlers/query.js +16 -4
  81. package/dist/cli/handlers/release.d.ts.map +1 -1
  82. package/dist/cli/handlers/release.js +6 -3
  83. package/dist/cli/handlers/search.d.ts +2 -4
  84. package/dist/cli/handlers/search.d.ts.map +1 -1
  85. package/dist/cli/handlers/search.js +13 -39
  86. package/dist/cli/main.d.ts.map +1 -1
  87. package/dist/cli/main.js +87 -14
  88. package/dist/cli/parse-args.d.ts.map +1 -1
  89. package/dist/cli/parse-args.js +47 -2
  90. package/dist/cli/registry.d.ts +22 -4
  91. package/dist/cli/registry.d.ts.map +1 -1
  92. package/dist/components/builders.d.ts +5 -1
  93. package/dist/components/builders.d.ts.map +1 -1
  94. package/dist/components/builders.js +5 -0
  95. package/dist/components/capability-plugin-loader.d.ts.map +1 -1
  96. package/dist/components/capability-plugin-loader.js +16 -1
  97. package/dist/components/capability-plugin.d.ts +14 -0
  98. package/dist/components/capability-plugin.d.ts.map +1 -1
  99. package/dist/components/pr-hooks.d.ts +21 -1
  100. package/dist/components/pr-hooks.d.ts.map +1 -1
  101. package/dist/components/pr-hooks.js +72 -4
  102. package/dist/components/pr-pipeline.d.ts +45 -10
  103. package/dist/components/pr-pipeline.d.ts.map +1 -1
  104. package/dist/components/pr-pipeline.js +47 -14
  105. package/dist/components/pr-policy.d.ts +36 -0
  106. package/dist/components/pr-policy.d.ts.map +1 -1
  107. package/dist/components/pr-policy.js +36 -0
  108. package/dist/components/pr-run.d.ts +3 -0
  109. package/dist/components/pr-run.d.ts.map +1 -1
  110. package/dist/components/pr-run.js +1 -0
  111. package/dist/components/starter-plugin.d.ts +1 -0
  112. package/dist/components/starter-plugin.d.ts.map +1 -1
  113. package/dist/components/starter-plugin.js +5 -1
  114. package/dist/components/verbs/index.d.ts +2 -0
  115. package/dist/components/verbs/index.d.ts.map +1 -1
  116. package/dist/components/verbs/index.js +2 -0
  117. package/dist/components/verbs/publish-artifact.d.ts +65 -0
  118. package/dist/components/verbs/publish-artifact.d.ts.map +1 -0
  119. package/dist/components/verbs/publish-artifact.js +74 -0
  120. package/dist/components/verbs/publish-image.d.ts +129 -0
  121. package/dist/components/verbs/publish-image.d.ts.map +1 -0
  122. package/dist/components/verbs/publish-image.js +145 -0
  123. package/dist/config-environments.d.ts +20 -0
  124. package/dist/config-environments.d.ts.map +1 -1
  125. package/dist/config-environments.js +12 -0
  126. package/dist/config.d.ts +25 -1
  127. package/dist/config.d.ts.map +1 -1
  128. package/dist/config.js +10 -2
  129. package/dist/gate-decision.d.ts +20 -2
  130. package/dist/gate-decision.d.ts.map +1 -1
  131. package/dist/gate-decision.js +30 -3
  132. package/dist/graph-ir.d.ts +25 -0
  133. package/dist/graph-ir.d.ts.map +1 -1
  134. package/dist/graph-walk.d.ts +66 -0
  135. package/dist/graph-walk.d.ts.map +1 -0
  136. package/dist/graph-walk.js +70 -0
  137. package/dist/import/parser.d.ts +19 -0
  138. package/dist/import/parser.d.ts.map +1 -1
  139. package/dist/lexicon.d.ts +94 -6
  140. package/dist/lexicon.d.ts.map +1 -1
  141. package/dist/lifecycle/gate-ledger.d.ts +11 -0
  142. package/dist/lifecycle/gate-ledger.d.ts.map +1 -1
  143. package/dist/lifecycle/git.d.ts +2 -5
  144. package/dist/lifecycle/git.d.ts.map +1 -1
  145. package/dist/lifecycle/ledger-read.d.ts +65 -0
  146. package/dist/lifecycle/ledger-read.d.ts.map +1 -0
  147. package/dist/lifecycle/ledger-read.js +160 -0
  148. package/dist/lifecycle/release-workstation.d.ts +7 -0
  149. package/dist/lifecycle/release-workstation.d.ts.map +1 -1
  150. package/dist/lifecycle/release-workstation.js +25 -0
  151. package/dist/lifecycle/run-ledger.d.ts +4 -3
  152. package/dist/lifecycle/run-ledger.d.ts.map +1 -1
  153. package/dist/lifecycle/run-ledger.js +1 -0
  154. package/dist/lint/discover.js +3 -1
  155. package/dist/lint/post-synth.d.ts +127 -1
  156. package/dist/lint/post-synth.d.ts.map +1 -1
  157. package/dist/lint/post-synth.js +84 -2
  158. package/dist/lint/rules/op/index.d.ts +1 -0
  159. package/dist/lint/rules/op/index.d.ts.map +1 -1
  160. package/dist/lint/rules/op/index.js +2 -0
  161. package/dist/lint/rules/op/ops019-workspace-op-target.d.ts +32 -0
  162. package/dist/lint/rules/op/ops019-workspace-op-target.d.ts.map +1 -0
  163. package/dist/lint/rules/op/ops019-workspace-op-target.js +63 -0
  164. package/dist/op/activities/activity-contracts.d.ts +9 -6
  165. package/dist/op/activities/activity-contracts.d.ts.map +1 -1
  166. package/dist/op/activities/activity-contracts.js +5 -2
  167. package/dist/op/activities/index.d.ts +2 -2
  168. package/dist/op/activities/index.d.ts.map +1 -1
  169. package/dist/op/activities/index.js +1 -1
  170. package/dist/op/activities/review-agent.d.ts +90 -4
  171. package/dist/op/activities/review-agent.d.ts.map +1 -1
  172. package/dist/op/activities/review-agent.js +217 -19
  173. package/dist/op/activities/work-evidence.d.ts +8 -1
  174. package/dist/op/activities/work-evidence.d.ts.map +1 -1
  175. package/dist/op/activities/work-evidence.js +1 -0
  176. package/dist/op/builders.d.ts +9 -5
  177. package/dist/op/builders.d.ts.map +1 -1
  178. package/dist/op/builders.js +9 -5
  179. package/dist/op/composites/apply-op.d.ts +29 -2
  180. package/dist/op/composites/apply-op.d.ts.map +1 -1
  181. package/dist/op/composites/apply-op.js +20 -1
  182. package/dist/op/gate-approval-base.d.ts +25 -0
  183. package/dist/op/gate-approval-base.d.ts.map +1 -0
  184. package/dist/op/gate-approval-base.js +71 -0
  185. package/dist/op/gate-approval.d.ts +18 -9
  186. package/dist/op/gate-approval.d.ts.map +1 -1
  187. package/dist/op/gate-approval.js +13 -31
  188. package/dist/op/gate-name.d.ts +13 -0
  189. package/dist/op/gate-name.d.ts.map +1 -1
  190. package/dist/op/gate-name.js +14 -1
  191. package/dist/op/gate-quorum.d.ts +100 -3
  192. package/dist/op/gate-quorum.d.ts.map +1 -1
  193. package/dist/op/gate-quorum.js +108 -6
  194. package/dist/op/gate-review.d.ts +9 -0
  195. package/dist/op/gate-review.d.ts.map +1 -1
  196. package/dist/op/gate-review.js +13 -0
  197. package/dist/op/gate.d.ts +47 -5
  198. package/dist/op/gate.d.ts.map +1 -1
  199. package/dist/op/gate.js +25 -4
  200. package/dist/op/index.d.ts +3 -3
  201. package/dist/op/index.d.ts.map +1 -1
  202. package/dist/op/index.js +1 -1
  203. package/dist/op/local-executor.d.ts +45 -3
  204. package/dist/op/local-executor.d.ts.map +1 -1
  205. package/dist/op/local-executor.js +68 -7
  206. package/dist/op/op-waves-run.d.ts +26 -1
  207. package/dist/op/op-waves-run.d.ts.map +1 -1
  208. package/dist/op/op-waves-run.js +259 -13
  209. package/dist/op/op-waves.d.ts +72 -5
  210. package/dist/op/op-waves.d.ts.map +1 -1
  211. package/dist/op/op-waves.js +110 -15
  212. package/dist/op/runtime.d.ts +11 -0
  213. package/dist/op/runtime.d.ts.map +1 -1
  214. package/dist/op/schedule-overdue.d.ts +16 -0
  215. package/dist/op/schedule-overdue.d.ts.map +1 -1
  216. package/dist/op/schedule-overdue.js +36 -0
  217. package/dist/op/stage-hooks.d.ts +9 -2
  218. package/dist/op/stage-hooks.d.ts.map +1 -1
  219. package/dist/op/stage-hooks.js +7 -5
  220. package/dist/op/workspace-run-env.d.ts +22 -0
  221. package/dist/op/workspace-run-env.d.ts.map +1 -0
  222. package/dist/op/workspace-run-env.js +21 -0
  223. package/dist/pr-forge.d.ts +24 -0
  224. package/dist/pr-forge.d.ts.map +1 -1
  225. package/dist/pr-forge.js +47 -0
  226. package/dist/pr-loop.d.ts +10 -0
  227. package/dist/pr-loop.d.ts.map +1 -1
  228. package/dist/pr-loop.js +4 -0
  229. package/dist/pr-migrations.d.ts +62 -0
  230. package/dist/pr-migrations.d.ts.map +1 -0
  231. package/dist/pr-migrations.js +50 -0
  232. package/dist/pr-post.d.ts +42 -0
  233. package/dist/pr-post.d.ts.map +1 -1
  234. package/dist/pr-post.js +68 -2
  235. package/dist/read-filter.d.ts +65 -0
  236. package/dist/read-filter.d.ts.map +1 -0
  237. package/dist/read-filter.js +179 -0
  238. package/dist/run-event.d.ts +1 -1
  239. package/dist/run-event.d.ts.map +1 -1
  240. package/dist/terraform/carve.d.ts +24 -3
  241. package/dist/terraform/carve.d.ts.map +1 -1
  242. package/dist/terraform/carve.js +32 -14
  243. package/dist/terraform/cuts.d.ts +97 -0
  244. package/dist/terraform/cuts.d.ts.map +1 -0
  245. package/dist/terraform/cuts.js +138 -0
  246. package/dist/terraform/folds.d.ts +26 -0
  247. package/dist/terraform/folds.d.ts.map +1 -0
  248. package/dist/terraform/folds.js +38 -0
  249. package/dist/terraform/graph.d.ts.map +1 -1
  250. package/dist/terraform/graph.js +10 -0
  251. package/dist/terraform/reach.d.ts +140 -0
  252. package/dist/terraform/reach.d.ts.map +1 -0
  253. package/dist/terraform/reach.js +170 -0
  254. package/dist/terraform/score.d.ts +14 -0
  255. package/dist/terraform/score.d.ts.map +1 -1
  256. package/dist/terraform/score.js +14 -31
  257. package/dist/terraform/state.d.ts.map +1 -1
  258. package/dist/terraform/state.js +4 -2
  259. package/dist/terraform/types.d.ts +8 -0
  260. package/dist/terraform/types.d.ts.map +1 -1
  261. package/dist/wave-blocked.d.ts +10 -1
  262. package/dist/wave-blocked.d.ts.map +1 -1
  263. package/dist/wave-blocked.js +31 -3
  264. package/dist/wave-runtime.mjs +264 -254
  265. package/dist/workspace/check.schema.json +13 -2
  266. package/dist/workspace/checks/ci-branch.d.ts +44 -0
  267. package/dist/workspace/checks/ci-branch.d.ts.map +1 -0
  268. package/dist/workspace/checks/ci-branch.js +133 -0
  269. package/dist/workspace/checks/gate-approval.d.ts +58 -0
  270. package/dist/workspace/checks/gate-approval.d.ts.map +1 -0
  271. package/dist/workspace/checks/gate-approval.js +103 -0
  272. package/dist/workspace/checks/links.d.ts +3 -0
  273. package/dist/workspace/checks/links.d.ts.map +1 -1
  274. package/dist/workspace/checks/links.js +12 -1
  275. package/dist/workspace/checks/org.d.ts +48 -0
  276. package/dist/workspace/checks/org.d.ts.map +1 -0
  277. package/dist/workspace/checks/org.js +156 -0
  278. package/dist/workspace/checks.d.ts +12 -1
  279. package/dist/workspace/checks.d.ts.map +1 -1
  280. package/dist/workspace/checks.js +63 -7
  281. package/dist/workspace/ci-branches.d.ts +16 -0
  282. package/dist/workspace/ci-branches.d.ts.map +1 -1
  283. package/dist/workspace/ci-branches.js +27 -0
  284. package/dist/workspace/ci-green-cli.js +7 -7
  285. package/dist/workspace/ci-green-workflow.d.ts +1 -1
  286. package/dist/workspace/ci-green-workflow.d.ts.map +1 -1
  287. package/dist/workspace/ci-green-workflow.js +13 -8
  288. package/dist/workspace/ci-green.d.ts +14 -0
  289. package/dist/workspace/ci-green.d.ts.map +1 -1
  290. package/dist/workspace/ci-green.js +44 -11
  291. package/dist/workspace/ci-run.d.ts +9 -1
  292. package/dist/workspace/ci-run.d.ts.map +1 -1
  293. package/dist/workspace/ci-run.js +67 -6
  294. package/dist/workspace/ci-serve.d.ts +9 -0
  295. package/dist/workspace/ci-serve.d.ts.map +1 -1
  296. package/dist/workspace/ci-serve.js +114 -76
  297. package/dist/workspace/compose-graph.d.ts +14 -0
  298. package/dist/workspace/compose-graph.d.ts.map +1 -1
  299. package/dist/workspace/composites.d.ts +4 -1
  300. package/dist/workspace/composites.d.ts.map +1 -1
  301. package/dist/workspace/composites.js +5 -2
  302. package/dist/workspace/composites.schema.json +22 -0
  303. package/dist/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
  304. package/dist/workspace/cross-root-lint.d.ts +56 -0
  305. package/dist/workspace/cross-root-lint.d.ts.map +1 -0
  306. package/dist/workspace/cross-root-lint.js +111 -0
  307. package/dist/workspace/dbt-models-reader.d.ts +44 -0
  308. package/dist/workspace/dbt-models-reader.d.ts.map +1 -0
  309. package/dist/workspace/dbt-models-reader.js +356 -0
  310. package/dist/workspace/dbt-project-common.d.ts +40 -0
  311. package/dist/workspace/dbt-project-common.d.ts.map +1 -0
  312. package/dist/workspace/dbt-project-common.js +106 -0
  313. package/dist/workspace/dbt-project-reader.d.ts +4 -3
  314. package/dist/workspace/dbt-project-reader.d.ts.map +1 -1
  315. package/dist/workspace/dbt-project-reader.js +14 -108
  316. package/dist/workspace/decision-rank.d.ts +26 -0
  317. package/dist/workspace/decision-rank.d.ts.map +1 -0
  318. package/dist/workspace/decision-rank.js +16 -0
  319. package/dist/workspace/declaration.d.ts +50 -2
  320. package/dist/workspace/declaration.d.ts.map +1 -1
  321. package/dist/workspace/declaration.js +57 -11
  322. package/dist/workspace/declaration.schema.json +166 -24
  323. package/dist/workspace/environments.d.ts +26 -2
  324. package/dist/workspace/environments.d.ts.map +1 -1
  325. package/dist/workspace/environments.js +26 -2
  326. package/dist/workspace/exit-cli.d.ts +44 -0
  327. package/dist/workspace/exit-cli.d.ts.map +1 -0
  328. package/dist/workspace/exit-cli.js +198 -0
  329. package/dist/workspace/exit.d.ts +159 -0
  330. package/dist/workspace/exit.d.ts.map +1 -0
  331. package/dist/workspace/exit.js +480 -0
  332. package/dist/workspace/exit.schema.json +257 -0
  333. package/dist/workspace/flyway-dir.d.ts +39 -0
  334. package/dist/workspace/flyway-dir.d.ts.map +1 -0
  335. package/dist/workspace/flyway-dir.js +104 -0
  336. package/dist/workspace/flyway-layout.d.ts +96 -0
  337. package/dist/workspace/flyway-layout.d.ts.map +1 -0
  338. package/dist/workspace/flyway-layout.js +308 -0
  339. package/dist/workspace/graph-cache.d.ts +3 -1
  340. package/dist/workspace/graph-cache.d.ts.map +1 -1
  341. package/dist/workspace/graph-cache.js +12 -1
  342. package/dist/workspace/graph-cli.d.ts.map +1 -1
  343. package/dist/workspace/graph-cli.js +26 -8
  344. package/dist/workspace/graph.schema.json +34 -0
  345. package/dist/workspace/import-fetch.d.ts +38 -0
  346. package/dist/workspace/import-fetch.d.ts.map +1 -0
  347. package/dist/workspace/import-fetch.js +99 -0
  348. package/dist/workspace/import-init.d.ts +26 -0
  349. package/dist/workspace/import-init.d.ts.map +1 -0
  350. package/dist/workspace/import-init.js +130 -0
  351. package/dist/workspace/import-source.d.ts +147 -0
  352. package/dist/workspace/import-source.d.ts.map +1 -0
  353. package/dist/workspace/import-source.js +370 -0
  354. package/dist/workspace/init.d.ts +4 -0
  355. package/dist/workspace/init.d.ts.map +1 -1
  356. package/dist/workspace/init.js +70 -3
  357. package/dist/workspace/intent.d.ts +2 -3
  358. package/dist/workspace/intent.d.ts.map +1 -1
  359. package/dist/workspace/intent.js +5 -9
  360. package/dist/workspace/kind-link-readers.d.ts +59 -2
  361. package/dist/workspace/kind-link-readers.d.ts.map +1 -1
  362. package/dist/workspace/kind-link-readers.js +17 -1
  363. package/dist/workspace/kind-readers.d.ts +6 -0
  364. package/dist/workspace/kind-readers.d.ts.map +1 -1
  365. package/dist/workspace/kind-readers.js +18 -0
  366. package/dist/workspace/kinds.d.ts +90 -3
  367. package/dist/workspace/kinds.d.ts.map +1 -1
  368. package/dist/workspace/kinds.js +161 -7
  369. package/dist/workspace/ledger.schema.json +158 -0
  370. package/dist/workspace/lexicon-outputs.d.ts +20 -1
  371. package/dist/workspace/lexicon-outputs.d.ts.map +1 -1
  372. package/dist/workspace/lexicon-outputs.js +102 -10
  373. package/dist/workspace/lineage-check.d.ts +3 -0
  374. package/dist/workspace/lineage-check.d.ts.map +1 -1
  375. package/dist/workspace/lineage-check.js +23 -4
  376. package/dist/workspace/lineage-upgrade.d.ts.map +1 -1
  377. package/dist/workspace/lineage-upgrade.js +13 -4
  378. package/dist/workspace/links.d.ts +8 -1
  379. package/dist/workspace/links.d.ts.map +1 -1
  380. package/dist/workspace/links.js +25 -1
  381. package/dist/workspace/ls.d.ts +8 -0
  382. package/dist/workspace/ls.d.ts.map +1 -1
  383. package/dist/workspace/ls.js +7 -1
  384. package/dist/workspace/ls.schema.json +7 -0
  385. package/dist/workspace/member-commands.d.ts.map +1 -1
  386. package/dist/workspace/member-commands.js +54 -5
  387. package/dist/workspace/migrate-links.d.ts +45 -0
  388. package/dist/workspace/migrate-links.d.ts.map +1 -0
  389. package/dist/workspace/migrate-links.js +100 -0
  390. package/dist/workspace/migration-dirs.d.ts +74 -0
  391. package/dist/workspace/migration-dirs.d.ts.map +1 -0
  392. package/dist/workspace/migration-dirs.js +254 -0
  393. package/dist/workspace/new-migrations.d.ts +47 -0
  394. package/dist/workspace/new-migrations.d.ts.map +1 -0
  395. package/dist/workspace/new-migrations.js +91 -0
  396. package/dist/workspace/pr-report.schema.json +46 -0
  397. package/dist/workspace/promote.d.ts +96 -0
  398. package/dist/workspace/promote.d.ts.map +1 -0
  399. package/dist/workspace/promote.js +263 -0
  400. package/dist/workspace/reason-codes.d.ts +21 -0
  401. package/dist/workspace/reason-codes.d.ts.map +1 -1
  402. package/dist/workspace/reason-codes.js +25 -0
  403. package/dist/workspace/records-cli.d.ts +11 -0
  404. package/dist/workspace/records-cli.d.ts.map +1 -1
  405. package/dist/workspace/records-cli.js +57 -5
  406. package/dist/workspace/records.schema.json +5 -0
  407. package/dist/workspace/release-candidates.d.ts +2 -0
  408. package/dist/workspace/release-candidates.d.ts.map +1 -1
  409. package/dist/workspace/release-candidates.js +5 -2
  410. package/dist/workspace/release-train.d.ts +53 -0
  411. package/dist/workspace/release-train.d.ts.map +1 -0
  412. package/dist/workspace/release-train.js +134 -0
  413. package/dist/workspace/release-workflow.d.ts.map +1 -1
  414. package/dist/workspace/release-workflow.js +4 -3
  415. package/dist/workspace/repo-ref.d.ts +45 -0
  416. package/dist/workspace/repo-ref.d.ts.map +1 -0
  417. package/dist/workspace/repo-ref.js +114 -0
  418. package/dist/workspace/run-event.schema.json +2 -2
  419. package/dist/workspace/runs-cli.d.ts +9 -0
  420. package/dist/workspace/runs-cli.d.ts.map +1 -1
  421. package/dist/workspace/runs-cli.js +48 -3
  422. package/dist/workspace/runs.schema.json +7 -0
  423. package/dist/workspace/search-contract.d.ts +1 -1
  424. package/dist/workspace/search-contract.d.ts.map +1 -1
  425. package/dist/workspace/status-decisions.d.ts +37 -0
  426. package/dist/workspace/status-decisions.d.ts.map +1 -0
  427. package/dist/workspace/status-decisions.js +147 -0
  428. package/dist/workspace/status-gates.d.ts +9 -0
  429. package/dist/workspace/status-gates.d.ts.map +1 -1
  430. package/dist/workspace/status.d.ts +4 -0
  431. package/dist/workspace/status.d.ts.map +1 -1
  432. package/dist/workspace/status.js +14 -2
  433. package/dist/workspace/status.schema.json +6 -0
  434. package/dist/workspace/work-cli.d.ts.map +1 -1
  435. package/dist/workspace/work-cli.js +5 -3
  436. package/dist/workspace/work-evidence-ops.d.ts +83 -0
  437. package/dist/workspace/work-evidence-ops.d.ts.map +1 -0
  438. package/dist/workspace/work-evidence-ops.js +169 -0
  439. package/dist/workspace/work-evidence.d.ts +12 -2
  440. package/dist/workspace/work-evidence.d.ts.map +1 -1
  441. package/dist/workspace/work-evidence.js +21 -3
  442. package/dist/workspace/work-evidence.schema.json +49 -2
  443. package/dist/workspace/workspace-gates.d.ts +110 -0
  444. package/dist/workspace/workspace-gates.d.ts.map +1 -0
  445. package/dist/workspace/workspace-gates.js +140 -0
  446. package/dist/workspace/workspace-kinds.schema.json +108 -10
  447. package/dist/workspace/workspace-ledger.d.ts +76 -0
  448. package/dist/workspace/workspace-ledger.d.ts.map +1 -0
  449. package/dist/workspace/workspace-ledger.js +91 -0
  450. package/dist/workspace/workspace-run.d.ts +112 -0
  451. package/dist/workspace/workspace-run.d.ts.map +1 -0
  452. package/dist/workspace/workspace-run.js +432 -0
  453. package/package.json +1 -1
  454. package/src/__golden__/wave-loop/op-by-apply-after-fails.json +10 -0
  455. package/src/__golden__/wave-loop/op-by-apply-hold.json +10 -0
  456. package/src/__golden__/wave-loop/op-by-apply-ignored.json +10 -0
  457. package/src/__golden__/wave-loop/op-by-apply-pass.json +10 -0
  458. package/src/__golden__/wave-loop/op-by-apply-skip.json +10 -0
  459. package/src/__golden__/wave-loop/op-cost-member-clash.json +6 -0
  460. package/src/__golden__/wave-loop/op-cost-member.json +13 -0
  461. package/src/__golden__/wave-loop/op-denied-source.json +16 -0
  462. package/src/__golden__/wave-loop/op-denied.json +16 -0
  463. package/src/__golden__/wave-loop/op-discover-rest-short.json +6 -0
  464. package/src/__golden__/wave-loop/op-discover-rest-stops.json +13 -0
  465. package/src/__golden__/wave-loop/op-discover-rest.json +26 -0
  466. package/src/__golden__/wave-loop/op-discover-wide.json +26 -0
  467. package/src/__golden__/wave-loop/op-held-on-again.json +16 -0
  468. package/src/__golden__/wave-loop/op-held-on-before-apply.json +16 -0
  469. package/src/__golden__/wave-loop/op-held-on.json +16 -0
  470. package/src/__golden__/wave-loop/op-hooks-apply-fails.json +13 -0
  471. package/src/__golden__/wave-loop/op-hooks-fail-after-apply.json +13 -0
  472. package/src/__golden__/wave-loop/op-hooks-fail-before-apply.json +13 -0
  473. package/src/__golden__/wave-loop/op-hooks-fail-before-plan.json +13 -0
  474. package/src/__golden__/wave-loop/op-hooks-held.json +13 -0
  475. package/src/__golden__/wave-loop/op-hooks-hold-before-apply.json +13 -0
  476. package/src/__golden__/wave-loop/op-hooks-pass.json +13 -0
  477. package/src/__golden__/wave-loop/op-hooks-refused-at-base.json +13 -0
  478. package/src/__golden__/wave-loop/op-hooks-share.json +33 -0
  479. package/src/__golden__/wave-loop/op-outcome-held.json +10 -0
  480. package/src/__golden__/wave-loop/op-outcome-replan-approved.json +10 -0
  481. package/src/__golden__/wave-loop/op-outcome-replan-forever.json +10 -0
  482. package/src/__golden__/wave-loop/op-outcome-replan.json +10 -0
  483. package/src/__golden__/wave-loop/op-outcome-stood-down.json +10 -0
  484. package/src/__golden__/wave-loop/op-outcome-unreadable.json +10 -0
  485. package/src/__golden__/wave-loop/op-overridden.json +16 -0
  486. package/src/__golden__/wave-loop/op-per-run.json +20 -0
  487. package/src/__golden__/wave-loop/op-point.json +13 -0
  488. package/src/__golden__/wave-loop/op-pr-review.json +10 -0
  489. package/src/__golden__/wave-loop/op-sealed.json +10 -0
  490. package/src/__golden__/wave-loop/op-spend-change-only.json +10 -0
  491. package/src/__golden__/wave-loop/op-spend.json +10 -0
  492. package/src/__golden__/wave-loop/op-wave-commands.json +55 -0
  493. package/src/__golden__/wave-loop/op-wide-refused.json +26 -0
  494. package/src/__golden__/wave-loop/op-wide-waiting.json +29 -0
  495. package/src/__golden__/wave-loop/op-wide.json +39 -0
  496. package/src/action-pins.test.ts +78 -0
  497. package/src/action-pins.ts +92 -0
  498. package/src/cli/commands/carve-score-once.test.ts +99 -0
  499. package/src/cli/commands/carve.ts +37 -6
  500. package/src/cli/commands/check-lexicon.test.ts +2 -2
  501. package/src/cli/commands/import-report.ts +71 -0
  502. package/src/cli/commands/import.ts +33 -3
  503. package/src/cli/commands/migrate-dialect.test.ts +145 -0
  504. package/src/cli/commands/migrate.ts +132 -11
  505. package/src/cli/handlers/__snapshots__/build-member.test.ts.snap +4 -4
  506. package/src/cli/handlers/approve.ts +33 -4
  507. package/src/cli/handlers/build.ts +7 -1
  508. package/src/cli/handlers/graph-reader.test.ts +31 -0
  509. package/src/cli/handlers/graph-reader.ts +51 -0
  510. package/src/cli/handlers/graph.ts +14 -0
  511. package/src/cli/handlers/ledger.ts +54 -0
  512. package/src/cli/handlers/migrate.ts +21 -12
  513. package/src/cli/handlers/misc.ts +10 -1
  514. package/src/cli/handlers/pr-env.ts +2 -2
  515. package/src/cli/handlers/pr.ts +176 -37
  516. package/src/cli/handlers/query.ts +16 -4
  517. package/src/cli/handlers/release.ts +6 -3
  518. package/src/cli/handlers/search.ts +13 -34
  519. package/src/cli/main.test.ts +17 -0
  520. package/src/cli/main.ts +87 -14
  521. package/src/cli/parse-args.ts +35 -2
  522. package/src/cli/registry.ts +22 -4
  523. package/src/components/builders.ts +8 -0
  524. package/src/components/capability-plugin-loader.ts +13 -1
  525. package/src/components/capability-plugin.ts +16 -0
  526. package/src/components/pr-env-run-bundle.test.ts +1 -0
  527. package/src/components/pr-hooks.test.ts +73 -5
  528. package/src/components/pr-hooks.ts +95 -5
  529. package/src/components/pr-pipeline.ts +64 -16
  530. package/src/components/pr-policy.test.ts +64 -1
  531. package/src/components/pr-policy.ts +53 -0
  532. package/src/components/pr-run.ts +4 -0
  533. package/src/components/registry.test.ts +1 -1
  534. package/src/components/starter-plugin.ts +6 -0
  535. package/src/components/verbs/index.ts +2 -0
  536. package/src/components/verbs/publish-artifact.test.ts +60 -0
  537. package/src/components/verbs/publish-artifact.ts +122 -0
  538. package/src/components/verbs/publish-image.test.ts +101 -0
  539. package/src/components/verbs/publish-image.ts +265 -0
  540. package/src/config-environments.ts +28 -1
  541. package/src/config.ts +24 -1
  542. package/src/gate-decision-bundle.test.ts +5 -2
  543. package/src/gate-decision-identity.test.ts +20 -0
  544. package/src/gate-decision.ts +46 -3
  545. package/src/graph-ir.ts +27 -0
  546. package/src/graph-walk.test.ts +44 -0
  547. package/src/graph-walk.ts +102 -0
  548. package/src/import/parser.ts +20 -0
  549. package/src/lexicon.ts +98 -6
  550. package/src/lifecycle/gate-ledger.ts +8 -0
  551. package/src/lifecycle/git.ts +2 -2
  552. package/src/lifecycle/ledger-read.test.ts +107 -0
  553. package/src/lifecycle/ledger-read.ts +195 -0
  554. package/src/lifecycle/release-workstation.ts +24 -0
  555. package/src/lifecycle/run-ledger.ts +5 -2
  556. package/src/lint/cross-root.test.ts +122 -0
  557. package/src/lint/discover.ts +3 -1
  558. package/src/lint/post-synth.ts +212 -2
  559. package/src/lint/rules/op/index.ts +2 -0
  560. package/src/lint/rules/op/ops019-workspace-op-target.ts +89 -0
  561. package/src/op/activities/activity-contracts.ts +5 -2
  562. package/src/op/activities/index.ts +2 -2
  563. package/src/op/activities/review-agent.test.ts +221 -4
  564. package/src/op/activities/review-agent.ts +265 -22
  565. package/src/op/activities/work-evidence.ts +9 -1
  566. package/src/op/builders.ts +9 -5
  567. package/src/op/composites/apply-op.test.ts +108 -0
  568. package/src/op/composites/apply-op.ts +37 -2
  569. package/src/op/gate-approval-at-base.test.ts +97 -0
  570. package/src/op/gate-approval-base.ts +72 -0
  571. package/src/op/gate-approval.test.ts +6 -1
  572. package/src/op/gate-approval.ts +22 -27
  573. package/src/op/gate-name.ts +16 -1
  574. package/src/op/gate-quorum-at-base.test.ts +211 -0
  575. package/src/op/gate-quorum.ts +156 -8
  576. package/src/op/gate-review.ts +14 -0
  577. package/src/op/gate.ts +69 -9
  578. package/src/op/index.ts +3 -2
  579. package/src/op/local-executor.ts +91 -11
  580. package/src/op/op-waves-depends-on.test.ts +81 -0
  581. package/src/op/op-waves-hook-targets.test.ts +4 -2
  582. package/src/op/op-waves-quorum-product.test.ts +158 -0
  583. package/src/op/op-waves-run.ts +288 -14
  584. package/src/op/op-waves.ts +143 -14
  585. package/src/op/runtime.ts +8 -0
  586. package/src/op/schedule-overdue.ts +33 -0
  587. package/src/op/stage-hooks.ts +13 -5
  588. package/src/op/workspace-run-env.ts +29 -0
  589. package/src/pr-forge-bundle.test.ts +2 -2
  590. package/src/pr-forge.test.ts +47 -0
  591. package/src/pr-forge.ts +68 -0
  592. package/src/pr-loop-bundle.test.ts +3 -2
  593. package/src/pr-loop.test.ts +52 -0
  594. package/src/pr-loop.ts +12 -0
  595. package/src/pr-migrations.ts +97 -0
  596. package/src/pr-post-open.e2e.test.ts +36 -0
  597. package/src/pr-post.test.ts +102 -3
  598. package/src/pr-post.ts +90 -2
  599. package/src/read-filter.test.ts +54 -0
  600. package/src/read-filter.ts +193 -0
  601. package/src/run-event.ts +1 -1
  602. package/src/stage-hooks-bundle.test.ts +1 -0
  603. package/src/terraform/carve.ts +52 -15
  604. package/src/terraform/cuts.test.ts +173 -0
  605. package/src/terraform/cuts.ts +188 -0
  606. package/src/terraform/folds.ts +44 -0
  607. package/src/terraform/graph.ts +9 -0
  608. package/src/terraform/radius.test.ts +90 -0
  609. package/src/terraform/reach.test.ts +146 -0
  610. package/src/terraform/reach.ts +247 -0
  611. package/src/terraform/score.ts +27 -29
  612. package/src/terraform/state.ts +3 -1
  613. package/src/terraform/types.ts +8 -0
  614. package/src/wave-blocked.ts +28 -3
  615. package/src/wave-loop-golden.test.ts +4 -3
  616. package/src/workspace/__fixtures__/import/spacelift.json +9 -0
  617. package/src/workspace/__fixtures__/import/tfc.json +13 -0
  618. package/src/workspace/behold-kinds.test.ts +2 -1
  619. package/src/workspace/check-contract.test.ts +8 -6
  620. package/src/workspace/check.schema.json +13 -2
  621. package/src/workspace/checks/ci-branch.test.ts +128 -0
  622. package/src/workspace/checks/ci-branch.ts +141 -0
  623. package/src/workspace/checks/gate-approval.test.ts +77 -0
  624. package/src/workspace/checks/gate-approval.ts +121 -0
  625. package/src/workspace/checks/links.ts +12 -1
  626. package/src/workspace/checks/org.ts +169 -0
  627. package/src/workspace/checks.ts +68 -7
  628. package/src/workspace/ci-branches.ts +31 -0
  629. package/src/workspace/ci-green-branches.test.ts +153 -0
  630. package/src/workspace/ci-green-cli.ts +7 -7
  631. package/src/workspace/ci-green-workflow.test.ts +4 -3
  632. package/src/workspace/ci-green-workflow.ts +13 -9
  633. package/src/workspace/ci-green.ts +49 -12
  634. package/src/workspace/ci-run.test.ts +72 -1
  635. package/src/workspace/ci-run.ts +68 -8
  636. package/src/workspace/ci-serve.test.ts +95 -0
  637. package/src/workspace/ci-serve.ts +106 -65
  638. package/src/workspace/component-environments.test.ts +25 -2
  639. package/src/workspace/compose-graph.ts +9 -2
  640. package/src/workspace/composites.schema.json +22 -0
  641. package/src/workspace/composites.test.ts +39 -8
  642. package/src/workspace/composites.ts +6 -2
  643. package/src/workspace/conformance/__writer_fixture__/work/work.schema.json +105 -1
  644. package/src/workspace/cross-root-lint.test.ts +90 -0
  645. package/src/workspace/cross-root-lint.ts +126 -0
  646. package/src/workspace/dbt-kind.test.ts +3 -2
  647. package/src/workspace/dbt-models-reader.ts +362 -0
  648. package/src/workspace/dbt-models.test.ts +248 -0
  649. package/src/workspace/dbt-project-common.ts +113 -0
  650. package/src/workspace/dbt-project-reader.ts +29 -112
  651. package/src/workspace/decision-rank.ts +40 -0
  652. package/src/workspace/declaration.schema.json +166 -24
  653. package/src/workspace/declaration.ts +101 -15
  654. package/src/workspace/environments.ts +40 -4
  655. package/src/workspace/exit-cli.ts +219 -0
  656. package/src/workspace/exit.schema.json +257 -0
  657. package/src/workspace/exit.test.ts +185 -0
  658. package/src/workspace/exit.ts +560 -0
  659. package/src/workspace/flyway-dir.ts +113 -0
  660. package/src/workspace/flyway-layout.ts +337 -0
  661. package/src/workspace/graph-cache.ts +12 -2
  662. package/src/workspace/graph-cli.ts +25 -10
  663. package/src/workspace/graph-contract.test.ts +4 -2
  664. package/src/workspace/graph.schema.json +34 -0
  665. package/src/workspace/identity.test.ts +29 -2
  666. package/src/workspace/import-fetch.ts +151 -0
  667. package/src/workspace/import-init.ts +147 -0
  668. package/src/workspace/import-source.test.ts +183 -0
  669. package/src/workspace/import-source.ts +462 -0
  670. package/src/workspace/init.test.ts +55 -1
  671. package/src/workspace/init.ts +66 -4
  672. package/src/workspace/intent.ts +6 -14
  673. package/src/workspace/kind-link-readers.ts +68 -3
  674. package/src/workspace/kind-readers.test.ts +36 -0
  675. package/src/workspace/kind-readers.ts +18 -1
  676. package/src/workspace/kinds.test.ts +35 -7
  677. package/src/workspace/kinds.ts +212 -11
  678. package/src/workspace/ledger.schema.json +158 -0
  679. package/src/workspace/lexicon-outputs.ts +132 -13
  680. package/src/workspace/lineage-check.ts +30 -7
  681. package/src/workspace/lineage-upgrade.test.ts +20 -0
  682. package/src/workspace/lineage-upgrade.ts +16 -7
  683. package/src/workspace/links.ts +24 -1
  684. package/src/workspace/ls-contract.test.ts +1 -1
  685. package/src/workspace/ls.schema.json +7 -0
  686. package/src/workspace/ls.ts +10 -1
  687. package/src/workspace/member-commands.ts +60 -2
  688. package/src/workspace/member-file-schema.test.ts +124 -0
  689. package/src/workspace/migrate-links.test.ts +99 -0
  690. package/src/workspace/migrate-links.ts +108 -0
  691. package/src/workspace/migration-dirs.test.ts +272 -0
  692. package/src/workspace/migration-dirs.ts +267 -0
  693. package/src/workspace/new-migrations.test.ts +98 -0
  694. package/src/workspace/new-migrations.ts +109 -0
  695. package/src/workspace/org-scope.test.ts +238 -0
  696. package/src/workspace/pr-report.schema.json +46 -0
  697. package/src/workspace/promote.test.ts +114 -0
  698. package/src/workspace/promote.ts +302 -0
  699. package/src/workspace/reason-codes.test.ts +10 -1
  700. package/src/workspace/reason-codes.ts +25 -0
  701. package/src/workspace/records-cli.ts +58 -5
  702. package/src/workspace/records.schema.json +5 -0
  703. package/src/workspace/release-candidates.ts +7 -2
  704. package/src/workspace/release-train.ts +157 -0
  705. package/src/workspace/release-workflow.ts +4 -3
  706. package/src/workspace/repo-ref.ts +113 -0
  707. package/src/workspace/run-event.schema.json +2 -2
  708. package/src/workspace/runs-cli.ts +48 -4
  709. package/src/workspace/runs.schema.json +7 -0
  710. package/src/workspace/status-contract.test.ts +46 -1
  711. package/src/workspace/status-decisions.test.ts +100 -0
  712. package/src/workspace/status-decisions.ts +151 -0
  713. package/src/workspace/status-gates.ts +9 -0
  714. package/src/workspace/status.schema.json +6 -0
  715. package/src/workspace/status.ts +17 -3
  716. package/src/workspace/where-filters.test.ts +39 -0
  717. package/src/workspace/work-cli.ts +5 -3
  718. package/src/workspace/work-evidence-ops.test.ts +176 -0
  719. package/src/workspace/work-evidence-ops.ts +189 -0
  720. package/src/workspace/work-evidence.schema.json +49 -2
  721. package/src/workspace/work-evidence.ts +22 -3
  722. package/src/workspace/workspace-gates.ts +200 -0
  723. package/src/workspace/workspace-kinds.schema.json +108 -10
  724. package/src/workspace/workspace-ledger.ts +130 -0
  725. package/src/workspace/workspace-run.test.ts +322 -0
  726. package/src/workspace/workspace-run.ts +461 -0
@@ -0,0 +1,111 @@
1
+ /**
2
+ * The disagreement lint (#2549, #2524 D6): `chant workspace lint --cross-root`.
3
+ *
4
+ * A member link is written down once, on the consumer. The members' graphs
5
+ * can surface the same relation on their own: a consumer's parameter that
6
+ * joins another member's output by name, or any relation a lexicon puts in
7
+ * its IR. The lint reports where the two disagree.
8
+ *
9
+ * It uses #1939's cross-build-root mode. Each composed member is one build
10
+ * root, read under the member's own toolchain as `chant workspace graph`
11
+ * reads it (`crossRootInputs` in `./workspace-run.ts`), and the composed
12
+ * graph's link table goes to every check as `ctx.links`. The checks are:
13
+ *
14
+ * - LNK001, core's own: the consumer declares a link to one member's output
15
+ * while its graph joins a parameter of the same name to another member's.
16
+ * - every cross-root check a lexicon ships through `crossRootChecks()`, for
17
+ * the lexicons the members' graphs name. A lexicon applies its own rule
18
+ * once it surfaces the relation in its IR. One that can't be loaded here
19
+ * is reported and skipped.
20
+ *
21
+ * Nothing runs unless `--cross-root` asks, so a plain `workspace lint`, and
22
+ * level 0, pay nothing for it.
23
+ */
24
+ import { joinKey } from "../join-key.js";
25
+ import { runCrossRootChecks } from "../lint/post-synth.js";
26
+ import { crossRootInputs } from "./workspace-run.js";
27
+ export const LNK001_ID = "LNK001";
28
+ /** The links of the composed graph, as a cross-root check reads them. Ambiguous rows and record links are left out. */
29
+ export function crossRootLinks(links) {
30
+ const out = [];
31
+ for (const row of links) {
32
+ const r = row;
33
+ if (typeof r.consumer !== "string" || typeof r.producer !== "string" || typeof r.output !== "string" || typeof r.origin !== "string")
34
+ continue;
35
+ out.push({
36
+ consumer: r.consumer,
37
+ producer: r.producer,
38
+ output: r.output,
39
+ origin: r.origin,
40
+ ...(typeof r.input === "string" || r.input === null ? { input: r.input } : {}),
41
+ ...(typeof r.status === "string" ? { status: r.status } : {}),
42
+ });
43
+ }
44
+ return out;
45
+ }
46
+ /**
47
+ * LNK001: a declared link and a join the graph surfaces name different
48
+ * producers for the same handle. The consumer must be one of the run's roots,
49
+ * so its graph was read.
50
+ */
51
+ export const lnk001 = {
52
+ id: LNK001_ID,
53
+ description: "A declared member link and the join the members' graphs surface name different producers for the same output",
54
+ scope: "cross-root",
55
+ check(ctx) {
56
+ const links = ctx.links ?? [];
57
+ const findings = [];
58
+ const declared = links.filter((l) => l.origin === "declared" && l.status !== "invalid");
59
+ for (const inferred of links) {
60
+ if (!inferred.origin.startsWith("inferred:") || inferred.status !== "resolved")
61
+ continue;
62
+ if (!ctx.root(inferred.consumer))
63
+ continue;
64
+ const keys = new Set([joinKey(inferred.output), ...(inferred.input ? [joinKey(inferred.input)] : [])]);
65
+ for (const d of declared) {
66
+ if (d.consumer !== inferred.consumer || d.producer === inferred.producer)
67
+ continue;
68
+ if (!keys.has(joinKey(d.output)))
69
+ continue;
70
+ findings.push({
71
+ checkId: LNK001_ID,
72
+ severity: "warning",
73
+ message: `${d.consumer} declares a link to ${d.producer}'s output ${d.output}, but its graph joins ` +
74
+ `${inferred.input ? `parameter ${inferred.input}` : "a parameter"} to ${inferred.producer}'s output ${inferred.output}. ` +
75
+ `Point the link at the member the graph reads from, or rename the parameter so it joins the declared output.`,
76
+ root: d.consumer,
77
+ entity: inferred.input ?? undefined,
78
+ });
79
+ }
80
+ }
81
+ return findings;
82
+ },
83
+ };
84
+ async function pluginChecks(lexicon) {
85
+ const { loadPlugin } = await import("../cli/plugins.js");
86
+ const plugin = await loadPlugin(lexicon);
87
+ return plugin.crossRootChecks?.() ?? [];
88
+ }
89
+ /**
90
+ * Run the disagreement lint over a composed graph: one root per composed
91
+ * member, LNK001, and the cross-root checks of every lexicon the roots name.
92
+ */
93
+ export async function crossRootLint(graph, opts = {}) {
94
+ const roots = crossRootInputs(graph, opts.env);
95
+ const lexicons = [...new Set(roots.flatMap((r) => [...r.buildResult.entities.values()].map((e) => e.lexicon)))]
96
+ .filter((l) => typeof l === "string" && l !== "chant")
97
+ .sort();
98
+ const checks = [lnk001];
99
+ const unloaded = [];
100
+ for (const lexicon of lexicons) {
101
+ try {
102
+ checks.push(...(await (opts.load ?? pluginChecks)(lexicon)));
103
+ }
104
+ catch (err) {
105
+ unloaded.push({ lexicon, reason: err instanceof Error ? err.message.split("\n")[0] : String(err) });
106
+ }
107
+ }
108
+ const findings = runCrossRootChecks(checks, roots, { ...(opts.env ? { env: opts.env } : {}), links: crossRootLinks(graph.links) });
109
+ const ran = checks.filter((c) => c.scope === "cross-root").map((c) => c.id);
110
+ return { findings, checks: ran, unloaded };
111
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * A dbt project's models as outputs (#3935), read beside its sources by the
3
+ * `dbt-project` reader.
4
+ *
5
+ * A model exposes `<schema>.<model>` and, for each column its YAML lists,
6
+ * `<schema>.<model>.<column>`, named by the contract of #3931: names as
7
+ * declared, Postgres case folding, never rendered per target. As with
8
+ * sources, nothing runs: dbt, Jinja and `profiles.yml` stay unread.
9
+ *
10
+ * - A model is a `.sql` file under the project's `model-paths`. Its name is
11
+ * the file's name, or its `alias`. Python models, seeds and snapshots are
12
+ * not read.
13
+ * - `enabled`, `schema` and `alias` come from the first of: the model's own
14
+ * `{{ config(...) }}`, the `config:` of its entry in a model YAML, then the
15
+ * `+` keys of `dbt_project.yml` that match the model's path (the project's
16
+ * name, each directory under the model path, the model's name), the
17
+ * deepest first.
18
+ * - The schema is the member's `modelSchema` field when it is set, and
19
+ * dbt's config is then not read for it. Otherwise it is the schema dbt
20
+ * config names, but dbt's default `generate_schema_name` joins the target's
21
+ * schema to a custom one (`<target_schema>_<custom>`), and a model with no
22
+ * custom schema lands in the target's schema, so the name depends on the
23
+ * target. The model is then a gap that says to set `modelSchema`. The
24
+ * exception is a project whose `generate_schema_name` macro is the usual
25
+ * override (the custom schema as it stands, the target's schema when there
26
+ * is none): a model with a custom schema is named by it. Any other
27
+ * override is not evaluated, and every model is a gap.
28
+ * - A templated schema, alias or `enabled`, or one that is not a plain
29
+ * string, is a gap; chant never renders it.
30
+ */
31
+ import type { KindLinkRead, KindReaderInput } from "./kind-link-readers.js";
32
+ import { type Dialect, type Quoting } from "./dbt-project-common.js";
33
+ export interface DbtModelsContext {
34
+ input: KindReaderInput;
35
+ project: Record<string, unknown>;
36
+ projectFile: string;
37
+ /** The tree-relative model paths, already checked. */
38
+ paths: string[];
39
+ quoting: Quoting;
40
+ dialect: Dialect;
41
+ result: KindLinkRead;
42
+ }
43
+ export declare function readDbtModels(ctx: DbtModelsContext): void;
44
+ //# sourceMappingURL=dbt-models-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dbt-models-reader.d.ts","sourceRoot":"","sources":["../../src/workspace/dbt-models-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH,OAAO,KAAK,EAAkB,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAQL,KAAK,OAAO,EACZ,KAAK,OAAO,EACb,MAAM,sBAAsB,CAAC;AAG9B,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;CACtB;AAcD,wBAAgB,aAAa,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAmHzD"}
@@ -0,0 +1,356 @@
1
+ /**
2
+ * A dbt project's models as outputs (#3935), read beside its sources by the
3
+ * `dbt-project` reader.
4
+ *
5
+ * A model exposes `<schema>.<model>` and, for each column its YAML lists,
6
+ * `<schema>.<model>.<column>`, named by the contract of #3931: names as
7
+ * declared, Postgres case folding, never rendered per target. As with
8
+ * sources, nothing runs: dbt, Jinja and `profiles.yml` stay unread.
9
+ *
10
+ * - A model is a `.sql` file under the project's `model-paths`. Its name is
11
+ * the file's name, or its `alias`. Python models, seeds and snapshots are
12
+ * not read.
13
+ * - `enabled`, `schema` and `alias` come from the first of: the model's own
14
+ * `{{ config(...) }}`, the `config:` of its entry in a model YAML, then the
15
+ * `+` keys of `dbt_project.yml` that match the model's path (the project's
16
+ * name, each directory under the model path, the model's name), the
17
+ * deepest first.
18
+ * - The schema is the member's `modelSchema` field when it is set, and
19
+ * dbt's config is then not read for it. Otherwise it is the schema dbt
20
+ * config names, but dbt's default `generate_schema_name` joins the target's
21
+ * schema to a custom one (`<target_schema>_<custom>`), and a model with no
22
+ * custom schema lands in the target's schema, so the name depends on the
23
+ * target. The model is then a gap that says to set `modelSchema`. The
24
+ * exception is a project whose `generate_schema_name` macro is the usual
25
+ * override (the custom schema as it stands, the target's schema when there
26
+ * is none): a model with a custom schema is named by it. Any other
27
+ * override is not evaluated, and every model is a gap.
28
+ * - A templated schema, alias or `enabled`, or one that is not a plain
29
+ * string, is a gap; chant never renders it.
30
+ */
31
+ import { posix } from "node:path";
32
+ import { parseYAMLDocument } from "../yaml.js";
33
+ import { isObject, isTemplated, keyLine, lines, nameLine, scalar, yamlFiles, } from "./dbt-project-common.js";
34
+ import { joinPath, skippedDir } from "./tree.js";
35
+ const KEYS = ["schema", "alias", "enabled"];
36
+ export function readDbtModels(ctx) {
37
+ const { input, project, projectFile, paths, quoting, dialect, result } = ctx;
38
+ const { tree, dir, fields } = input;
39
+ const gaps = result.gaps;
40
+ const outputs = (result.outputs ?? (result.outputs = []));
41
+ const modelSchema = typeof fields?.modelSchema === "string" && fields.modelSchema !== "" ? fields.modelSchema : null;
42
+ const name = (v, quoted) => (dialect === "postgres" && !quoted ? v.toLowerCase() : v);
43
+ const projectName = scalar(project.name);
44
+ const macro = modelSchema === null ? schemaMacro(tree, dir, project) : { kind: "default" };
45
+ // Model YAML: config and columns, by model name.
46
+ const yamlModels = new Map();
47
+ for (const p of paths) {
48
+ for (const file of yamlFiles(tree, p)) {
49
+ let text;
50
+ let doc;
51
+ try {
52
+ text = tree.read(file);
53
+ doc = parseYAMLDocument(text);
54
+ }
55
+ catch (err) {
56
+ // The sources pass reports an unreadable file, as a gap that leaves outputs out.
57
+ void err;
58
+ continue;
59
+ }
60
+ if (!isObject(doc) || !Array.isArray(doc.models))
61
+ continue;
62
+ const fileLines = lines(text);
63
+ let cursor = keyLine(fileLines, "models");
64
+ for (const entry of doc.models) {
65
+ if (!isObject(entry))
66
+ continue;
67
+ const modelName = scalar(entry.name);
68
+ cursor = nameLine(fileLines, modelName, cursor);
69
+ if (modelName === undefined)
70
+ continue;
71
+ const cols = [];
72
+ let columnCursor = cursor;
73
+ for (const column of Array.isArray(entry.columns) ? entry.columns : []) {
74
+ if (!isObject(column))
75
+ continue;
76
+ const columnName = scalar(column.name);
77
+ columnCursor = nameLine(fileLines, columnName, columnCursor);
78
+ if (columnName === undefined || isTemplated(columnName)) {
79
+ gaps.push({ file, line: columnCursor, message: `model ${modelName}: column ${JSON.stringify(column.name)} is a Jinja template or not a name, which chant does not render; it was not read`, outputs: true });
80
+ continue;
81
+ }
82
+ cols.push({ name: columnName, quote: column.quote === true, line: columnCursor, file });
83
+ }
84
+ const config = isObject(entry.config) ? { ...entry.config } : {};
85
+ yamlModels.set(modelName, { config, columns: cols, file });
86
+ }
87
+ }
88
+ }
89
+ const seen = new Set();
90
+ for (const p of paths) {
91
+ for (const file of sqlFiles(tree, p)) {
92
+ const modelName = posix.basename(file).replace(/\.sql$/, "");
93
+ if (seen.has(modelName))
94
+ continue;
95
+ seen.add(modelName);
96
+ const text = tree.read(file);
97
+ const inline = readInlineConfig(text);
98
+ const yaml = yamlModels.get(modelName);
99
+ const rel = posix.relative(p || ".", posix.dirname(file));
100
+ const segments = [...(rel === "" || rel === "." ? [] : rel.split("/")), modelName];
101
+ const fromProject = projectName ? projectConfig(project.models, projectName, segments) : {};
102
+ const config = {
103
+ schema: pick(inline.schema, setting(yaml?.config.schema, `config of ${modelName} in ${yaml?.file}`), setting(fromProject.schema, `+schema in ${projectFile}`)),
104
+ alias: pick(inline.alias, setting(yaml?.config.alias, `config of ${modelName} in ${yaml?.file}`), setting(fromProject.alias, `+alias in ${projectFile}`)),
105
+ enabled: pick(inline.enabled, setting(yaml?.config.enabled, `config of ${modelName} in ${yaml?.file}`), setting(fromProject.enabled, `+enabled in ${projectFile}`)),
106
+ };
107
+ const line = inline.line;
108
+ const gap = (message) => gaps.push({ file, line, message: `model ${modelName}: ${message}`, outputs: true });
109
+ const enabled = config.enabled;
110
+ if (enabled.status === "dynamic") {
111
+ gap(`enabled is ${enabled.text} (${enabled.at}), which chant does not render; the model was not read`);
112
+ continue;
113
+ }
114
+ if (enabled.status === "value" && enabled.value === false)
115
+ continue;
116
+ if (enabled.status === "value" && enabled.value !== true) {
117
+ gap(`enabled is ${JSON.stringify(enabled.value)} (${enabled.at}), not true or false; the model was not read`);
118
+ continue;
119
+ }
120
+ // The model's name: its alias, or the file's.
121
+ let relation = modelName;
122
+ if (config.alias.status === "dynamic") {
123
+ gap(`alias ${config.alias.text} (${config.alias.at}) is a Jinja template or not a name, which chant does not render; the model was not read`);
124
+ continue;
125
+ }
126
+ if (config.alias.status === "value") {
127
+ const alias = scalar(config.alias.value);
128
+ if (alias === undefined || alias === "" || isTemplated(alias)) {
129
+ gap(`alias ${JSON.stringify(config.alias.value)} (${config.alias.at}) is a Jinja template or not a name, which chant does not render; the model was not read`);
130
+ continue;
131
+ }
132
+ relation = alias;
133
+ }
134
+ // The schema it lands in.
135
+ let schema;
136
+ if (modelSchema !== null) {
137
+ schema = modelSchema;
138
+ }
139
+ else {
140
+ const resolved = modelSchemaFromConfig(config.schema, macro);
141
+ if (typeof resolved !== "string") {
142
+ gap(`${resolved.message}; set modelSchema on the dbt member to name the schema its models land in`);
143
+ continue;
144
+ }
145
+ schema = resolved;
146
+ }
147
+ const model = `${name(schema, quoting.schema)}.${name(relation, quoting.identifier)}`;
148
+ outputs.push({ name: model, file, line });
149
+ for (const column of yaml?.columns ?? [])
150
+ outputs.push({ name: `${model}.${name(column.name, column.quote)}`, file: column.file, line: column.line });
151
+ }
152
+ }
153
+ }
154
+ /** The schema config names, or why that does not give a name. */
155
+ function modelSchemaFromConfig(schema, macro) {
156
+ if (schema.status === "dynamic")
157
+ return { message: `schema ${schema.text} (${schema.at}) is a Jinja template, which chant does not render for a target` };
158
+ if (macro.kind === "other")
159
+ return { message: `the project overrides generate_schema_name (${macro.file}:${macro.line}), which chant does not evaluate, so it cannot tell which schema the model lands in` };
160
+ if (schema.status === "unset")
161
+ return { message: "it sets no schema, so it lands in the target's schema, which profiles.yml names and chant does not read" };
162
+ const custom = scalar(schema.value);
163
+ if (custom === undefined || custom === "" || isTemplated(custom))
164
+ return { message: `schema ${JSON.stringify(schema.value)} (${schema.at}) is a Jinja template or not a name, which chant does not render` };
165
+ if (macro.kind === "custom-as-is")
166
+ return custom;
167
+ return { message: `schema ${JSON.stringify(custom)} (${schema.at}) is joined to the target's schema by dbt's default generate_schema_name (<target_schema>_${custom}), so the name depends on the target` };
168
+ }
169
+ /**
170
+ * Whether the project overrides `generate_schema_name`, in a `.sql` file under
171
+ * `macro-paths` (`macros` by default). The usual override returns the custom
172
+ * schema as it stands: with the tags removed, its body is the target's schema
173
+ * and `{{ custom_schema_name | trim }}`, one per branch of an `is none` test.
174
+ * Any other body is not evaluated.
175
+ */
176
+ function schemaMacro(tree, dir, project) {
177
+ const raw = project["macro-paths"] ?? ["macros"];
178
+ if (!Array.isArray(raw))
179
+ return { kind: "default" };
180
+ let found = { kind: "default" };
181
+ for (const p of raw) {
182
+ if (typeof p !== "string" || isTemplated(p) || posix.isAbsolute(p))
183
+ continue;
184
+ const at = posix.normalize(joinPath(dir, p));
185
+ if (at === ".." || at.startsWith("../"))
186
+ continue;
187
+ for (const file of sqlFiles(tree, at === "." ? "" : at)) {
188
+ let text;
189
+ try {
190
+ text = tree.read(file);
191
+ }
192
+ catch {
193
+ continue;
194
+ }
195
+ const start = /\{%-?\s*macro\s+generate_schema_name\s*\(/.exec(text);
196
+ if (!start)
197
+ continue;
198
+ const line = text.slice(0, start.index).split("\n").length;
199
+ const end = /\{%-?\s*endmacro\s*-?%\}/.exec(text.slice(start.index));
200
+ const body = text.slice(start.index + start[0].length, end ? start.index + end.index : undefined);
201
+ const afterSignature = body.slice(body.indexOf("%}") + 2);
202
+ const flat = afterSignature.replace(/\{%[\s\S]*?%\}/g, "").replace(/\s+/g, "");
203
+ const asIs = /^\{\{(?:target\.schema|default_schema)\}\}\{\{custom_schema_name\|trim\}\}$/.test(flat) && /custom_schema_name(?:is|==)none/.test(afterSignature.replace(/\s+/g, ""));
204
+ found = asIs ? { kind: "custom-as-is" } : { kind: "other", file, line };
205
+ }
206
+ }
207
+ return found;
208
+ }
209
+ /** `.sql` files under tree-relative directory `dir`, skipping dot directories and node_modules; sorted. */
210
+ function sqlFiles(tree, dir) {
211
+ if (dir !== "" && tree.stat(dir) !== "dir")
212
+ return [];
213
+ const out = [];
214
+ const walk = (at) => {
215
+ for (const e of tree.list(at) ?? []) {
216
+ const path = joinPath(at, e.name);
217
+ if (e.type === "dir") {
218
+ if (!skippedDir(e.name))
219
+ walk(path);
220
+ }
221
+ else if (/\.sql$/.test(e.name)) {
222
+ out.push(path);
223
+ }
224
+ }
225
+ };
226
+ walk(dir);
227
+ return out.sort();
228
+ }
229
+ /** The first setting that is set: the model's own, then its YAML's, then the project's. */
230
+ function pick(...settings) {
231
+ return settings.find((s) => s.status !== "unset") ?? { status: "unset" };
232
+ }
233
+ function setting(value, at) {
234
+ if (value === undefined || value === null)
235
+ return { status: "unset" };
236
+ if (typeof value === "string" && isTemplated(value))
237
+ return { status: "dynamic", at, text: JSON.stringify(value) };
238
+ return { status: "value", value, at };
239
+ }
240
+ const PROJECT_KEYS = new Set(KEYS);
241
+ /** The configs `dbt_project.yml` sets for a model: the project's block, then each directory down to the model's name; deeper wins. */
242
+ function projectConfig(models, projectName, segments) {
243
+ const out = {};
244
+ if (!isObject(models))
245
+ return out;
246
+ let node = models[projectName];
247
+ const take = (n) => {
248
+ for (const [k, v] of Object.entries(n)) {
249
+ if (k.startsWith("+") && PROJECT_KEYS.has(k.slice(1)))
250
+ out[k.slice(1)] = v;
251
+ else if (PROJECT_KEYS.has(k) && !isObject(v))
252
+ out[k] = v;
253
+ }
254
+ };
255
+ if (!isObject(node))
256
+ return out;
257
+ take(node);
258
+ for (const seg of segments) {
259
+ node = node[seg];
260
+ if (!isObject(node))
261
+ break;
262
+ take(node);
263
+ }
264
+ return out;
265
+ }
266
+ /** What a model's own `{{ config(...) }}` calls set, and the line of the first one (1 when none). */
267
+ function readInlineConfig(text) {
268
+ const out = { schema: { status: "unset" }, alias: { status: "unset" }, enabled: { status: "unset" }, line: 1 };
269
+ // Comments are blanked, not removed, so lines stay where they were.
270
+ const blank = (m) => m.replace(/[^\n]/g, " ");
271
+ const code = text.replace(/\{#[\s\S]*?#\}/g, blank).replace(/--[^\n]*/g, blank);
272
+ const open = /\{\{-?\s*config\s*\(/g;
273
+ let first = true;
274
+ for (let m = open.exec(code); m; m = open.exec(code)) {
275
+ const args = balanced(code, open.lastIndex);
276
+ if (args === undefined)
277
+ continue;
278
+ if (first) {
279
+ out.line = code.slice(0, m.index).split("\n").length;
280
+ first = false;
281
+ }
282
+ for (const arg of splitTop(args)) {
283
+ const kv = /^\s*([A-Za-z_]\w*)\s*=\s*([\s\S]*?)\s*$/.exec(arg);
284
+ if (!kv || !PROJECT_KEYS.has(kv[1]))
285
+ continue;
286
+ const at = "the model's config()";
287
+ const raw = kv[2];
288
+ const str = /^(['"])((?:(?!\1)[^\\]|\\.)*)\1$/.exec(raw);
289
+ let s;
290
+ if (str)
291
+ s = isTemplated(str[2]) ? { status: "dynamic", at, text: raw } : { status: "value", value: str[2], at };
292
+ else if (/^true$/i.test(raw))
293
+ s = { status: "value", value: true, at };
294
+ else if (/^false$/i.test(raw))
295
+ s = { status: "value", value: false, at };
296
+ else if (/^(none|null)$/i.test(raw))
297
+ s = { status: "unset" };
298
+ else
299
+ s = { status: "dynamic", at, text: raw };
300
+ out[kv[1]] = s;
301
+ }
302
+ }
303
+ return out;
304
+ }
305
+ /** The text from `from` up to the parenthesis that closes the one before it, or undefined. */
306
+ function balanced(text, from) {
307
+ let depth = 1;
308
+ let quote = null;
309
+ for (let i = from; i < text.length; i++) {
310
+ const c = text[i];
311
+ if (quote) {
312
+ if (c === "\\")
313
+ i++;
314
+ else if (c === quote)
315
+ quote = null;
316
+ }
317
+ else if (c === "'" || c === '"')
318
+ quote = c;
319
+ else if (c === "(" || c === "[" || c === "{")
320
+ depth++;
321
+ else if (c === ")" || c === "]" || c === "}") {
322
+ depth--;
323
+ if (depth === 0)
324
+ return text.slice(from, i);
325
+ }
326
+ }
327
+ return undefined;
328
+ }
329
+ /** `text` split at the commas outside quotes and brackets. */
330
+ function splitTop(text) {
331
+ const parts = [];
332
+ let depth = 0;
333
+ let quote = null;
334
+ let start = 0;
335
+ for (let i = 0; i < text.length; i++) {
336
+ const c = text[i];
337
+ if (quote) {
338
+ if (c === "\\")
339
+ i++;
340
+ else if (c === quote)
341
+ quote = null;
342
+ }
343
+ else if (c === "'" || c === '"')
344
+ quote = c;
345
+ else if (c === "(" || c === "[" || c === "{")
346
+ depth++;
347
+ else if (c === ")" || c === "]" || c === "}")
348
+ depth--;
349
+ else if (c === "," && depth === 0) {
350
+ parts.push(text.slice(start, i));
351
+ start = i + 1;
352
+ }
353
+ }
354
+ parts.push(text.slice(start));
355
+ return parts;
356
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * What the dbt readers share (#3932, #3935): YAML and line helpers, the
3
+ * `quoting:` rules, and the project's `model-paths`.
4
+ */
5
+ import type { KindReadGap } from "./kind-link-readers.js";
6
+ import { type WorkspaceTree } from "./tree.js";
7
+ export declare const DBT_PROJECT_FILE = "dbt_project.yml";
8
+ export declare const DEFAULT_MODEL_PATHS: string[];
9
+ /** The dialects whose naming the reader follows; the member's `dialect` field picks one. */
10
+ export declare const DBT_DIALECTS: readonly ["postgres", "clickhouse"];
11
+ export type Dialect = (typeof DBT_DIALECTS)[number];
12
+ export interface Quoting {
13
+ schema: boolean;
14
+ identifier: boolean;
15
+ }
16
+ export declare const isTemplated: (v: string) => boolean;
17
+ export declare const isObject: (v: unknown) => v is Record<string, unknown>;
18
+ /** A name as text: a string, or a number or boolean YAML read as one. */
19
+ export declare function scalar(v: unknown): string | undefined;
20
+ /** Whether an entry is enabled: `enabled`, or `config.enabled`. A templated value is a gap, and the entry is left out. */
21
+ export declare function readEnabled(entry: Record<string, unknown>, file: string, line: number, where: string, gaps: KindReadGap[]): boolean;
22
+ /** `base` with a `quoting:` block's schema and identifier applied. A value that isn't a boolean is a gap and keeps the base. */
23
+ export declare function readQuoting(base: Quoting, raw: unknown, file: string, line: number, where: string, gaps: KindReadGap[]): Quoting;
24
+ /** Every `.yml` and `.yaml` file under tree-relative directory `dir`, skipping dot directories and node_modules. */
25
+ export declare function yamlFiles(tree: WorkspaceTree, dir: string): string[];
26
+ export declare function lines(text: string): string[];
27
+ export declare function escapeRegExp(text: string): string;
28
+ /** The line (from 1) of top-level key `key`, or 1. */
29
+ export declare function keyLine(fileLines: string[], key: string): number;
30
+ /**
31
+ * The line of the first `name: <value>` entry after line `from`, or `from`
32
+ * itself. Sources, tables and columns are listed in file order, so
33
+ * searching on from the parent's line finds each one's own line. A file in
34
+ * flow style has no such lines, and its entries are reported at the parent.
35
+ */
36
+ export declare function nameLine(fileLines: string[], value: string | undefined, from: number): number;
37
+ /** The line of the first `<key>:` after line `from`, or `from`. */
38
+ export declare function valueLine(fileLines: string[], key: string, from: number): number;
39
+ export declare function valueLineOf(fileLines: string[], key: string, value: string, from: number): number;
40
+ //# sourceMappingURL=dbt-project-common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dbt-project-common.d.ts","sourceRoot":"","sources":["../../src/workspace/dbt-project-common.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AAElE,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAClD,eAAO,MAAM,mBAAmB,UAAa,CAAC;AAE9C,4FAA4F;AAC5F,eAAO,MAAM,YAAY,YAAI,UAAU,EAAE,YAAY,CAAU,CAAC;AAChE,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpD,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,WAAW,MAAO,MAAM,YAAuB,CAAC;AAC7D,eAAO,MAAM,QAAQ,MAAO,OAAO,KAAG,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAA6D,CAAC;AAE/H,yEAAyE;AACzE,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIrD;AAED,0HAA0H;AAC1H,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAOnI;AAED,gIAAgI;AAChI,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAchI;AAED,oHAAoH;AACpH,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAepE;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE5C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,sDAAsD;AACtD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7F;AAED,mEAAmE;AACnE,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIhF;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjG"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * What the dbt readers share (#3932, #3935): YAML and line helpers, the
3
+ * `quoting:` rules, and the project's `model-paths`.
4
+ */
5
+ import { joinPath, skippedDir } from "./tree.js";
6
+ export const DBT_PROJECT_FILE = "dbt_project.yml";
7
+ export const DEFAULT_MODEL_PATHS = ["models"];
8
+ /** The dialects whose naming the reader follows; the member's `dialect` field picks one. */
9
+ export const DBT_DIALECTS = ["postgres", "clickhouse"];
10
+ export const isTemplated = (v) => /\{\{|\{%/.test(v);
11
+ export const isObject = (v) => v !== null && typeof v === "object" && !Array.isArray(v);
12
+ /** A name as text: a string, or a number or boolean YAML read as one. */
13
+ export function scalar(v) {
14
+ if (typeof v === "string")
15
+ return v;
16
+ if (typeof v === "number" || typeof v === "boolean")
17
+ return String(v);
18
+ return undefined;
19
+ }
20
+ /** Whether an entry is enabled: `enabled`, or `config.enabled`. A templated value is a gap, and the entry is left out. */
21
+ export function readEnabled(entry, file, line, where, gaps) {
22
+ const config = isObject(entry.config) ? entry.config : {};
23
+ const raw = entry.enabled ?? config.enabled;
24
+ if (raw === undefined || raw === null || raw === true)
25
+ return true;
26
+ if (raw === false)
27
+ return false;
28
+ gaps.push({ file, line, message: `${where}: enabled is ${JSON.stringify(raw)}, which chant does not render; it was not read` });
29
+ return false;
30
+ }
31
+ /** `base` with a `quoting:` block's schema and identifier applied. A value that isn't a boolean is a gap and keeps the base. */
32
+ export function readQuoting(base, raw, file, line, where, gaps) {
33
+ if (raw === undefined || raw === null)
34
+ return base;
35
+ if (!isObject(raw)) {
36
+ gaps.push({ file, line, message: `${where} is not a mapping; the quoting above it applies` });
37
+ return base;
38
+ }
39
+ const out = { ...base };
40
+ for (const key of ["schema", "identifier"]) {
41
+ const v = raw[key];
42
+ if (v === undefined)
43
+ continue;
44
+ if (typeof v === "boolean")
45
+ out[key] = v;
46
+ else
47
+ gaps.push({ file, line, message: `${where}.${key} is ${JSON.stringify(v)}, not true or false; the quoting above it applies` });
48
+ }
49
+ return out;
50
+ }
51
+ /** Every `.yml` and `.yaml` file under tree-relative directory `dir`, skipping dot directories and node_modules. */
52
+ export function yamlFiles(tree, dir) {
53
+ if (dir !== "" && tree.stat(dir) !== "dir")
54
+ return [];
55
+ const out = [];
56
+ const walk = (at) => {
57
+ for (const e of tree.list(at) ?? []) {
58
+ const path = joinPath(at, e.name);
59
+ if (e.type === "dir") {
60
+ if (!skippedDir(e.name))
61
+ walk(path);
62
+ }
63
+ else if (/\.ya?ml$/.test(e.name)) {
64
+ out.push(path);
65
+ }
66
+ }
67
+ };
68
+ walk(dir);
69
+ return out;
70
+ }
71
+ export function lines(text) {
72
+ return text.replace(/\r\n/g, "\n").split("\n");
73
+ }
74
+ export function escapeRegExp(text) {
75
+ return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
76
+ }
77
+ /** The line (from 1) of top-level key `key`, or 1. */
78
+ export function keyLine(fileLines, key) {
79
+ const re = new RegExp(`^${escapeRegExp(key)}\\s*:`);
80
+ const i = fileLines.findIndex((l) => re.test(l));
81
+ return i < 0 ? 1 : i + 1;
82
+ }
83
+ /**
84
+ * The line of the first `name: <value>` entry after line `from`, or `from`
85
+ * itself. Sources, tables and columns are listed in file order, so
86
+ * searching on from the parent's line finds each one's own line. A file in
87
+ * flow style has no such lines, and its entries are reported at the parent.
88
+ */
89
+ export function nameLine(fileLines, value, from) {
90
+ return value === undefined ? from : valueLineOf(fileLines, "name", value, from);
91
+ }
92
+ /** The line of the first `<key>:` after line `from`, or `from`. */
93
+ export function valueLine(fileLines, key, from) {
94
+ const re = new RegExp(`^\\s*(?:-\\s+)?${escapeRegExp(key)}\\s*:`);
95
+ for (let i = Math.max(from, 0); i < fileLines.length; i++)
96
+ if (re.test(fileLines[i]))
97
+ return i + 1;
98
+ return from;
99
+ }
100
+ export function valueLineOf(fileLines, key, value, from) {
101
+ const re = new RegExp(`^\\s*(?:-\\s+)?${escapeRegExp(key)}\\s*:\\s*(["']?)${escapeRegExp(value)}\\1\\s*(?:#.*)?$`);
102
+ for (let i = Math.max(from, 0); i < fileLines.length; i++)
103
+ if (re.test(fileLines[i]))
104
+ return i + 1;
105
+ return from;
106
+ }