@intentius/chant-lexicon-sql 0.124.45 → 0.124.48

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 (360) hide show
  1. package/dist/change-set.d.ts +1 -1
  2. package/dist/change-set.d.ts.map +1 -1
  3. package/dist/change-set.js +2 -1
  4. package/dist/clickhouse/apply/statements.d.ts +9 -0
  5. package/dist/clickhouse/apply/statements.d.ts.map +1 -1
  6. package/dist/clickhouse/apply/statements.js +24 -0
  7. package/dist/clickhouse/import/live-export.d.ts +7 -3
  8. package/dist/clickhouse/import/live-export.d.ts.map +1 -1
  9. package/dist/clickhouse/import/live-export.js +21 -5
  10. package/dist/clickhouse/live/named-collections.d.ts +27 -0
  11. package/dist/clickhouse/live/named-collections.d.ts.map +1 -0
  12. package/dist/clickhouse/live/named-collections.js +53 -0
  13. package/dist/clickhouse/live/undeclarable.d.ts +15 -3
  14. package/dist/clickhouse/live/undeclarable.d.ts.map +1 -1
  15. package/dist/clickhouse/live/undeclarable.js +18 -4
  16. package/dist/clickhouse/named-collections.d.ts +83 -0
  17. package/dist/clickhouse/named-collections.d.ts.map +1 -0
  18. package/dist/clickhouse/named-collections.js +203 -0
  19. package/dist/clickhouse/parser.d.ts.map +1 -1
  20. package/dist/clickhouse/parser.js +1 -1
  21. package/dist/clickhouse/plan/commands.d.ts +2 -1
  22. package/dist/clickhouse/plan/commands.d.ts.map +1 -1
  23. package/dist/clickhouse/plan/commands.js +17 -2
  24. package/dist/clickhouse/plan/diff.d.ts +15 -0
  25. package/dist/clickhouse/plan/diff.d.ts.map +1 -1
  26. package/dist/clickhouse/plan/diff.js +43 -1
  27. package/dist/clickhouse/plan/disruption.d.ts.map +1 -1
  28. package/dist/clickhouse/plan/disruption.js +5 -0
  29. package/dist/clickhouse/plan/rebuild-handoff.d.ts.map +1 -1
  30. package/dist/clickhouse/plan/rebuild-handoff.js +4 -0
  31. package/dist/clickhouse/plan/report.d.ts.map +1 -1
  32. package/dist/clickhouse/plan/report.js +6 -1
  33. package/dist/clickhouse/plan/rules.d.ts +5 -1
  34. package/dist/clickhouse/plan/rules.d.ts.map +1 -1
  35. package/dist/clickhouse/plan/rules.js +7 -3
  36. package/dist/clickhouse/plan/stream.d.ts +40 -0
  37. package/dist/clickhouse/plan/stream.d.ts.map +1 -0
  38. package/dist/clickhouse/plan/stream.js +107 -0
  39. package/dist/clickhouse/rebuild/observe.d.ts +3 -1
  40. package/dist/clickhouse/rebuild/observe.d.ts.map +1 -1
  41. package/dist/clickhouse/rebuild/observe.js +14 -1
  42. package/dist/clickhouse/review-catalog.d.ts +213 -0
  43. package/dist/clickhouse/review-catalog.d.ts.map +1 -0
  44. package/dist/clickhouse/review-catalog.js +330 -0
  45. package/dist/codegen/classifier-page.d.ts.map +1 -1
  46. package/dist/codegen/classifier-page.js +21 -4
  47. package/dist/codegen/clickhouse-module.d.ts.map +1 -1
  48. package/dist/codegen/clickhouse-module.js +3 -0
  49. package/dist/codegen/coverage-page.d.ts.map +1 -1
  50. package/dist/codegen/coverage-page.js +5 -3
  51. package/dist/codegen/docs.js +1 -1
  52. package/dist/codegen/postgres-classifier-page.js +1 -1
  53. package/dist/codegen/registry.d.ts.map +1 -1
  54. package/dist/codegen/registry.js +5 -0
  55. package/dist/composites/catalog.d.ts.map +1 -1
  56. package/dist/composites/catalog.js +100 -0
  57. package/dist/composites/clickhouse.d.ts +2 -0
  58. package/dist/composites/clickhouse.d.ts.map +1 -1
  59. package/dist/composites/clickhouse.js +2 -0
  60. package/dist/composites/otel-tables.d.ts +100 -0
  61. package/dist/composites/otel-tables.d.ts.map +1 -0
  62. package/dist/composites/otel-tables.js +282 -0
  63. package/dist/composites/stream-ingest.d.ts +63 -0
  64. package/dist/composites/stream-ingest.d.ts.map +1 -0
  65. package/dist/composites/stream-ingest.js +39 -0
  66. package/dist/coverage/clickhouse.json +1 -1
  67. package/dist/coverage/postgres.json +7 -7
  68. package/dist/coverage.d.ts +16 -6
  69. package/dist/coverage.d.ts.map +1 -1
  70. package/dist/coverage.js +10 -5
  71. package/dist/drizzle-command.d.ts +17 -0
  72. package/dist/drizzle-command.d.ts.map +1 -0
  73. package/dist/drizzle-command.js +91 -0
  74. package/dist/drizzle.d.ts +70 -0
  75. package/dist/drizzle.d.ts.map +1 -0
  76. package/dist/drizzle.js +684 -0
  77. package/dist/files/clickhouse.d.ts.map +1 -1
  78. package/dist/files/clickhouse.js +8 -1
  79. package/dist/files/common.d.ts +13 -0
  80. package/dist/files/common.d.ts.map +1 -1
  81. package/dist/files/common.js +5 -0
  82. package/dist/files/postgres.js +12 -2
  83. package/dist/generated/clickhouse.d.ts +2 -0
  84. package/dist/generated/clickhouse.d.ts.map +1 -1
  85. package/dist/generated/clickhouse.js +2 -0
  86. package/dist/import-parser.d.ts +21 -1
  87. package/dist/import-parser.d.ts.map +1 -1
  88. package/dist/import-parser.js +79 -5
  89. package/dist/index.d.ts +1 -1
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +1 -1
  92. package/dist/integrity.json +6 -5
  93. package/dist/lint/post-synth/audit-entries.d.ts.map +1 -1
  94. package/dist/lint/post-synth/audit-entries.js +1 -0
  95. package/dist/lint/post-synth/index.d.ts.map +1 -1
  96. package/dist/lint/post-synth/index.js +2 -0
  97. package/dist/lint/post-synth/sqlch128.d.ts +18 -0
  98. package/dist/lint/post-synth/sqlch128.d.ts.map +1 -0
  99. package/dist/lint/post-synth/sqlch128.js +222 -0
  100. package/dist/lint/rules/postgres-templates.js +2 -2
  101. package/dist/lsp/postgres-template.d.ts.map +1 -1
  102. package/dist/lsp/postgres-template.js +11 -0
  103. package/dist/manifest.json +1 -1
  104. package/dist/mcp/postgres.js +1 -1
  105. package/dist/meta.json +25 -0
  106. package/dist/migrate/from-postgres/detect.d.ts +4 -0
  107. package/dist/migrate/from-postgres/detect.d.ts.map +1 -0
  108. package/dist/migrate/from-postgres/detect.js +7 -0
  109. package/dist/migrate/from-postgres/emit.d.ts +26 -0
  110. package/dist/migrate/from-postgres/emit.d.ts.map +1 -0
  111. package/dist/migrate/from-postgres/emit.js +86 -0
  112. package/dist/migrate/from-postgres/index.d.ts +51 -0
  113. package/dist/migrate/from-postgres/index.d.ts.map +1 -0
  114. package/dist/migrate/from-postgres/index.js +115 -0
  115. package/dist/migrate/from-postgres/translate.d.ts +73 -0
  116. package/dist/migrate/from-postgres/translate.d.ts.map +1 -0
  117. package/dist/migrate/from-postgres/translate.js +261 -0
  118. package/dist/migrate/from-postgres/types.d.ts +51 -0
  119. package/dist/migrate/from-postgres/types.d.ts.map +1 -0
  120. package/dist/migrate/from-postgres/types.js +211 -0
  121. package/dist/migration-replay.d.ts +73 -0
  122. package/dist/migration-replay.d.ts.map +1 -0
  123. package/dist/migration-replay.js +294 -0
  124. package/dist/okf/index.md +6 -0
  125. package/dist/okf/rules/SQLCH128.md +11 -0
  126. package/dist/okf/types/PostgresForeignDataWrapper.md +9 -0
  127. package/dist/okf/types/PostgresForeignServer.md +9 -0
  128. package/dist/okf/types/PostgresOperator.md +9 -0
  129. package/dist/okf/types/PostgresPublication.md +9 -0
  130. package/dist/okf/types/PostgresStatistics.md +9 -0
  131. package/dist/op/activities/postgres-migration.d.ts.map +1 -1
  132. package/dist/op/activities/postgres-migration.js +4 -0
  133. package/dist/op/activity-contracts.d.ts +20 -0
  134. package/dist/op/activity-contracts.d.ts.map +1 -1
  135. package/dist/op/activity-contracts.js +2 -0
  136. package/dist/plugin.d.ts.map +1 -1
  137. package/dist/plugin.js +36 -2
  138. package/dist/postgres/apply/apply.js +8 -1
  139. package/dist/postgres/apply/statements.d.ts.map +1 -1
  140. package/dist/postgres/apply/statements.js +87 -2
  141. package/dist/postgres/constraint-names.d.ts +30 -0
  142. package/dist/postgres/constraint-names.d.ts.map +1 -0
  143. package/dist/postgres/constraint-names.js +72 -0
  144. package/dist/postgres/entities.d.ts +110 -1
  145. package/dist/postgres/entities.d.ts.map +1 -1
  146. package/dist/postgres/entities.js +146 -0
  147. package/dist/postgres/entity-types.d.ts +5 -0
  148. package/dist/postgres/entity-types.d.ts.map +1 -1
  149. package/dist/postgres/entity-types.js +5 -0
  150. package/dist/postgres/import/generator.d.ts.map +1 -1
  151. package/dist/postgres/import/generator.js +50 -2
  152. package/dist/postgres/import/live-export.d.ts.map +1 -1
  153. package/dist/postgres/import/live-export.js +2 -0
  154. package/dist/postgres/live/catalog-kinds.d.ts +14 -0
  155. package/dist/postgres/live/catalog-kinds.d.ts.map +1 -1
  156. package/dist/postgres/live/catalog-kinds.js +206 -0
  157. package/dist/postgres/live/catalog.d.ts +2 -0
  158. package/dist/postgres/live/catalog.d.ts.map +1 -1
  159. package/dist/postgres/live/catalog.js +3 -1
  160. package/dist/postgres/live/describe-resources.d.ts.map +1 -1
  161. package/dist/postgres/live/describe-resources.js +10 -2
  162. package/dist/postgres/migrate/backfill.d.ts +2 -0
  163. package/dist/postgres/migrate/backfill.d.ts.map +1 -1
  164. package/dist/postgres/migrate/backfill.js +7 -1
  165. package/dist/postgres/migrate/carry.d.ts +45 -1
  166. package/dist/postgres/migrate/carry.d.ts.map +1 -1
  167. package/dist/postgres/migrate/carry.js +72 -8
  168. package/dist/postgres/migrate/observe.d.ts +28 -4
  169. package/dist/postgres/migrate/observe.d.ts.map +1 -1
  170. package/dist/postgres/migrate/observe.js +41 -12
  171. package/dist/postgres/migrate/op.d.ts +26 -1
  172. package/dist/postgres/migrate/op.d.ts.map +1 -1
  173. package/dist/postgres/migrate/op.js +3 -1
  174. package/dist/postgres/migrate/steps.d.ts +35 -2
  175. package/dist/postgres/migrate/steps.d.ts.map +1 -1
  176. package/dist/postgres/migrate/steps.js +158 -12
  177. package/dist/postgres/parser.d.ts +72 -1
  178. package/dist/postgres/parser.d.ts.map +1 -1
  179. package/dist/postgres/parser.js +194 -2
  180. package/dist/postgres/plan/deep.d.ts.map +1 -1
  181. package/dist/postgres/plan/deep.js +29 -1
  182. package/dist/postgres/plan/diff.d.ts.map +1 -1
  183. package/dist/postgres/plan/diff.js +39 -1
  184. package/dist/postgres/plan/normalize.d.ts +17 -2
  185. package/dist/postgres/plan/normalize.d.ts.map +1 -1
  186. package/dist/postgres/plan/normalize.js +109 -1
  187. package/dist/postgres/plan/rules.d.ts +1 -0
  188. package/dist/postgres/plan/rules.d.ts.map +1 -1
  189. package/dist/postgres/plan/rules.js +3 -2
  190. package/dist/postgres/plan/schema.js +1 -1
  191. package/dist/postgres/secret-options.d.ts +10 -0
  192. package/dist/postgres/secret-options.d.ts.map +1 -0
  193. package/dist/postgres/secret-options.js +9 -0
  194. package/dist/postgres/testing/roundtrip-schema.d.ts +3 -2
  195. package/dist/postgres/testing/roundtrip-schema.d.ts.map +1 -1
  196. package/dist/postgres/testing/roundtrip-schema.js +13 -1
  197. package/dist/postgres.d.ts +1 -1
  198. package/dist/postgres.d.ts.map +1 -1
  199. package/dist/postgres.js +1 -1
  200. package/dist/rules/audit-entries.ts +1 -0
  201. package/dist/rules/postgres-templates.ts +2 -2
  202. package/dist/rules/sqlch128.ts +230 -0
  203. package/dist/serializer.d.ts +5 -0
  204. package/dist/serializer.d.ts.map +1 -1
  205. package/dist/serializer.js +13 -2
  206. package/dist/sql-types-command.d.ts +13 -0
  207. package/dist/sql-types-command.d.ts.map +1 -1
  208. package/dist/sql-types-command.js +31 -16
  209. package/dist/sql-types.d.ts +22 -0
  210. package/dist/sql-types.d.ts.map +1 -1
  211. package/dist/sql-types.js +10 -6
  212. package/dist/sqlserver/lexer.d.ts +37 -0
  213. package/dist/sqlserver/lexer.d.ts.map +1 -0
  214. package/dist/sqlserver/lexer.js +254 -0
  215. package/dist/sqlserver/parse.d.ts +185 -0
  216. package/dist/sqlserver/parse.d.ts.map +1 -0
  217. package/dist/sqlserver/parse.js +767 -0
  218. package/dist/sqlserver/translate.d.ts +34 -0
  219. package/dist/sqlserver/translate.d.ts.map +1 -0
  220. package/dist/sqlserver/translate.js +495 -0
  221. package/dist/sqlserver/types.d.ts +44 -0
  222. package/dist/sqlserver/types.d.ts.map +1 -0
  223. package/dist/sqlserver/types.js +133 -0
  224. package/dist/sqlserver/validate.d.ts +31 -0
  225. package/dist/sqlserver/validate.d.ts.map +1 -0
  226. package/dist/sqlserver/validate.js +67 -0
  227. package/dist/validate.d.ts.map +1 -1
  228. package/dist/validate.js +5 -0
  229. package/package.json +2 -2
  230. package/src/change-set.ts +2 -1
  231. package/src/clickhouse/apply/statements.ts +25 -0
  232. package/src/clickhouse/import/live-export.ts +20 -5
  233. package/src/clickhouse/live/named-collections.e2e.test.ts +88 -0
  234. package/src/clickhouse/live/named-collections.ts +61 -0
  235. package/src/clickhouse/live/undeclarable.e2e.test.ts +5 -3
  236. package/src/clickhouse/live/undeclarable.ts +20 -4
  237. package/src/clickhouse/named-collections.test.ts +187 -0
  238. package/src/clickhouse/named-collections.ts +224 -0
  239. package/src/clickhouse/parser.ts +2 -1
  240. package/src/clickhouse/plan/commands.ts +17 -2
  241. package/src/clickhouse/plan/diff.ts +57 -1
  242. package/src/clickhouse/plan/disruption.ts +5 -0
  243. package/src/clickhouse/plan/rebuild-handoff.ts +3 -0
  244. package/src/clickhouse/plan/report.ts +6 -1
  245. package/src/clickhouse/plan/rules.ts +14 -4
  246. package/src/clickhouse/plan/stream-s3queue.e2e.test.ts +148 -0
  247. package/src/clickhouse/plan/stream.test.ts +237 -0
  248. package/src/clickhouse/plan/stream.ts +111 -0
  249. package/src/clickhouse/rebuild/observe.ts +15 -1
  250. package/src/clickhouse/review-catalog.test.ts +181 -0
  251. package/src/clickhouse/review-catalog.ts +489 -0
  252. package/src/codegen/classifier-page.ts +21 -4
  253. package/src/codegen/clickhouse-module.ts +3 -0
  254. package/src/codegen/coverage-page.ts +5 -3
  255. package/src/codegen/docs.ts +1 -1
  256. package/src/codegen/postgres-classifier-page.ts +1 -1
  257. package/src/codegen/registry.ts +5 -0
  258. package/src/composites/catalog.test.ts +6 -1
  259. package/src/composites/catalog.ts +100 -0
  260. package/src/composites/clickhouse.ts +2 -0
  261. package/src/composites/composites.test.ts +1 -1
  262. package/src/composites/otel-tables.test.ts +118 -0
  263. package/src/composites/otel-tables.ts +339 -0
  264. package/src/composites/stream-ingest.test.ts +114 -0
  265. package/src/composites/stream-ingest.ts +82 -0
  266. package/src/core/undeclarable.test.ts +6 -5
  267. package/src/coverage/clickhouse.json +1 -1
  268. package/src/coverage/postgres.json +7 -7
  269. package/src/coverage.test.ts +27 -2
  270. package/src/coverage.ts +18 -7
  271. package/src/drizzle-command.ts +94 -0
  272. package/src/drizzle-kit.e2e.test.ts +89 -0
  273. package/src/drizzle-types.e2e.test.ts +67 -0
  274. package/src/drizzle.test.ts +358 -0
  275. package/src/drizzle.ts +737 -0
  276. package/src/files/clickhouse.ts +8 -1
  277. package/src/files/common.ts +14 -1
  278. package/src/files/postgres.ts +12 -2
  279. package/src/generated/clickhouse.ts +3 -0
  280. package/src/generated/lexicon-sql.json +25 -0
  281. package/src/import-parser.sqlserver.test.ts +92 -0
  282. package/src/import-parser.ts +79 -5
  283. package/src/index.ts +1 -1
  284. package/src/lint/post-synth/audit-entries.ts +1 -0
  285. package/src/lint/post-synth/index.ts +2 -0
  286. package/src/lint/post-synth/sqlch128.test.ts +107 -0
  287. package/src/lint/post-synth/sqlch128.ts +230 -0
  288. package/src/lint/rules/postgres-templates.ts +2 -2
  289. package/src/lsp/postgres-template.ts +11 -0
  290. package/src/mcp/postgres.ts +1 -1
  291. package/src/migrate/from-postgres/cli.test.ts +165 -0
  292. package/src/migrate/from-postgres/detect.ts +7 -0
  293. package/src/migrate/from-postgres/emit.ts +96 -0
  294. package/src/migrate/from-postgres/example.test.ts +205 -0
  295. package/src/migrate/from-postgres/index.ts +122 -0
  296. package/src/migrate/from-postgres/translate.test.ts +242 -0
  297. package/src/migrate/from-postgres/translate.ts +359 -0
  298. package/src/migrate/from-postgres/types.test.ts +116 -0
  299. package/src/migrate/from-postgres/types.ts +236 -0
  300. package/src/migrate/from-postgres/validate.e2e.test.ts +44 -0
  301. package/src/migrate/from-postgres/workspace.e2e.test.ts +114 -0
  302. package/src/migration-replay.e2e.test.ts +155 -0
  303. package/src/migration-replay.test.ts +173 -0
  304. package/src/migration-replay.ts +289 -0
  305. package/src/op/__snapshots__/watch-pipeline.test.ts.snap +2 -2
  306. package/src/op/activities/postgres-migration.ts +4 -0
  307. package/src/op/activity-contracts.ts +2 -0
  308. package/src/plugin.ts +37 -2
  309. package/src/postgres/apply/apply.ts +9 -1
  310. package/src/postgres/apply/statements.ts +74 -1
  311. package/src/postgres/constraint-names.ts +71 -0
  312. package/src/postgres/database-kinds.test.ts +384 -0
  313. package/src/postgres/entities.ts +266 -1
  314. package/src/postgres/entity-types.ts +5 -0
  315. package/src/postgres/import/generator.ts +42 -2
  316. package/src/postgres/import/live-export.ts +1 -0
  317. package/src/postgres/live/catalog-kinds.ts +223 -0
  318. package/src/postgres/live/catalog.ts +6 -1
  319. package/src/postgres/live/database-kinds.e2e.test.ts +164 -0
  320. package/src/postgres/live/describe-resources.ts +11 -2
  321. package/src/postgres/live/undeclarable.e2e.test.ts +13 -6
  322. package/src/postgres/migrate/backfill.ts +13 -1
  323. package/src/postgres/migrate/carry.ts +103 -8
  324. package/src/postgres/migrate/followups.e2e.test.ts +218 -0
  325. package/src/postgres/migrate/followups.test.ts +199 -0
  326. package/src/postgres/migrate/kinds.e2e.test.ts +5 -5
  327. package/src/postgres/migrate/observe.ts +53 -14
  328. package/src/postgres/migrate/op.ts +28 -1
  329. package/src/postgres/migrate/partition.e2e.test.ts +129 -0
  330. package/src/postgres/migrate/partition.test.ts +206 -0
  331. package/src/postgres/migrate/steps.ts +157 -12
  332. package/src/postgres/parser.ts +234 -2
  333. package/src/postgres/plan/deep.ts +28 -1
  334. package/src/postgres/plan/diff.ts +36 -1
  335. package/src/postgres/plan/normalize.ts +122 -1
  336. package/src/postgres/plan/rules.ts +10 -3
  337. package/src/postgres/plan/schema.ts +1 -1
  338. package/src/postgres/secret-options.ts +10 -0
  339. package/src/postgres/testing/roundtrip-schema.ts +13 -1
  340. package/src/postgres.ts +16 -0
  341. package/src/serializer.ts +13 -2
  342. package/src/skills/chant-sql-postgres-migration.md +3 -3
  343. package/src/skills/chant-sql-postgres.md +6 -1
  344. package/src/skills/chant-sql.md +2 -1
  345. package/src/sql-types-command.ts +38 -16
  346. package/src/sql-types.ts +11 -6
  347. package/src/sqlserver/fixture.test.ts +186 -0
  348. package/src/sqlserver/import-cli.test.ts +61 -0
  349. package/src/sqlserver/lexer.ts +260 -0
  350. package/src/sqlserver/parse.ts +865 -0
  351. package/src/sqlserver/translate.test.ts +396 -0
  352. package/src/sqlserver/translate.ts +558 -0
  353. package/src/sqlserver/types.test.ts +102 -0
  354. package/src/sqlserver/types.ts +154 -0
  355. package/src/sqlserver/validate.e2e.test.ts +32 -0
  356. package/src/sqlserver/validate.test.ts +49 -0
  357. package/src/sqlserver/validate.ts +76 -0
  358. package/src/validate.ts +5 -0
  359. package/src/workspace-kinds.test.ts +11 -0
  360. package/workspace-kinds.json +100 -2
@@ -3,6 +3,8 @@ import { KIND_COVERAGE, PINNED_COMMANDS, kindCoverageProblems, pinnedCommandsCur
3
3
  import { POSTGRES_PROBES } from "./postgres/live/undeclarable";
4
4
  import { CLICKHOUSE_PROBES } from "./clickhouse/live/undeclarable";
5
5
  import { SQL_DIALECTS } from "./dialects";
6
+ import { POSTGRES_ENTITY_TYPES } from "./postgres/entity-types";
7
+ import { CLICKHOUSE_ENTITY_TYPES } from "./clickhouse/entities";
6
8
 
7
9
  describe("the object coverage table (#3911)", () => {
8
10
  test.each(SQL_DIALECTS)("%s: every CREATE command a pinned server has is marked, and nothing else", (dialect) => {
@@ -29,10 +31,32 @@ describe("the object coverage table (#3911)", () => {
29
31
  ]);
30
32
  });
31
33
 
32
- test("every refused kind has the live query that finds it, and every query a refused-or-declared row", () => {
34
+ test("a declared row names an entity type the dialect has, and every entity type but a grant has a declared row", () => {
35
+ // A grant is a GRANT statement, not a CREATE command, so no row is about it.
36
+ const types = {
37
+ postgres: { all: Object.values(POSTGRES_ENTITY_TYPES) as string[], notCreate: ["Postgres::Grant", "Postgres::DefaultPrivileges"] },
38
+ clickhouse: { all: Object.values(CLICKHOUSE_ENTITY_TYPES) as string[], notCreate: ["ClickHouse::Grant"] },
39
+ };
40
+ for (const dialect of SQL_DIALECTS) {
41
+ const entities = KIND_COVERAGE[dialect].filter((r) => r.status === "declared").map((r) => r.entity!);
42
+ for (const e of entities) expect(types[dialect].all, `${dialect} row entity ${e}`).toContain(e);
43
+ for (const e of types[dialect].all.filter((t) => !types[dialect].notCreate.includes(t))) expect(entities, `${dialect} entity type ${e} has no declared row`).toContain(e);
44
+ }
45
+ });
46
+
47
+ test("a kind that is declared, referenced, refused or out of scope is told apart: only a declared row names an entity", () => {
48
+ for (const dialect of SQL_DIALECTS) {
49
+ for (const r of KIND_COVERAGE[dialect]) {
50
+ if (r.status === "declared") expect(r.reason, `${dialect} ${r.kind}`).toBeUndefined();
51
+ else expect(r.entity, `${dialect} ${r.kind}`).toBeUndefined();
52
+ }
53
+ }
54
+ });
55
+
56
+ test("every refused or referenced kind has the live query that finds it, and every query a row", () => {
33
57
  const probes = { postgres: POSTGRES_PROBES, clickhouse: CLICKHOUSE_PROBES };
34
58
  for (const dialect of SQL_DIALECTS) {
35
- const refused = KIND_COVERAGE[dialect].filter((r) => r.status === "refused").map((r) => r.kind);
59
+ const refused = KIND_COVERAGE[dialect].filter((r) => r.status === "refused" || r.status === "referenced").map((r) => r.kind);
36
60
  for (const kind of refused) expect(Object.keys(probes[dialect]), `${dialect} ${kind}`).toContain(kind);
37
61
  const kinds = KIND_COVERAGE[dialect].map((r) => r.kind);
38
62
  for (const kind of Object.keys(probes[dialect])) expect(kinds, `${dialect} probe ${kind}`).toContain(kind);
@@ -68,6 +92,7 @@ describe("a statement's kind", () => {
68
92
  ["CREATE SETTINGS PROFILE p SETTINGS max_threads = 1", "settings profile"],
69
93
  ["CREATE OR REPLACE FUNCTION f AS (x) -> x + 1", "SQL function"],
70
94
  ["CREATE QUOTA q FOR INTERVAL 1 hour MAX queries = 10", "quota"],
95
+ ["CREATE NAMED COLLECTION IF NOT EXISTS c AS url = 'x'", "named collection"],
71
96
  ])("clickhouse: %s is a %s", (sql, kind) => {
72
97
  expect(statementKind("clickhouse", sql)?.kind).toBe(kind);
73
98
  });
package/src/coverage.ts CHANGED
@@ -4,8 +4,10 @@
4
4
  * Which kinds of object each dialect declares (#3911): every `CREATE` command
5
5
  * a pinned server has (`./coverage/<dialect>-commands.json`, written by
6
6
  * `scripts/sql-create-commands.ts` from the server's own sources) has a row
7
- * in `./coverage/<dialect>.json` marking it declared, refused with a reason,
8
- * or out of scope. A command with several forms that differ in what chant can
7
+ * in `./coverage/<dialect>.json` marking it declared, referenced, refused
8
+ * with a reason, or out of scope. A referenced kind (a ClickHouse named
9
+ * collection, #4395) is never declared: a declaration names one, a plan
10
+ * checks it exists, and import lists the server's as prerequisites. A command with several forms that differ in what chant can
9
11
  * hold (`CREATE TYPE ... AS ENUM` and `CREATE TYPE ... AS RANGE`) has a row
10
12
  * per form. Import refuses an object of a refused kind by that row's `kind`
11
13
  * (`./core/undeclarable.ts`), and the docs page is rendered from the rows
@@ -31,8 +33,16 @@ import clickhouseCommands from "./coverage/clickhouse-commands.json" with { type
31
33
 
32
34
  // ── Object kinds ───────────────────────────────────────────────────────
33
35
 
34
- /** `declared`: a tag holds it. `refused`: import names it and stops. `out-of-scope`: the environment's, never imported. */
35
- export type KindStatus = "declared" | "refused" | "out-of-scope";
36
+ /**
37
+ * `declared`: a tag holds it. `referenced`: the environment's, never declared
38
+ * and its values never read; a declaration names it, a plan checks it exists,
39
+ * and import lists the server's as prerequisites (#4395). `refused`: import
40
+ * names it and stops. `out-of-scope`: the environment's, never imported.
41
+ */
42
+ export type KindStatus = "declared" | "referenced" | "refused" | "out-of-scope";
43
+
44
+ /** Every status a coverage row may have. */
45
+ export const KIND_STATUSES: readonly KindStatus[] = ["declared", "referenced", "refused", "out-of-scope"];
36
46
 
37
47
  /** One row of a dialect's coverage table: a `CREATE` command, or one form of it. */
38
48
  export interface KindRow {
@@ -51,7 +61,7 @@ export interface KindRow {
51
61
  status: KindStatus;
52
62
  /** The entity type that declares it, when declared. */
53
63
  entity?: string;
54
- /** Why it is refused or out of scope. */
64
+ /** Why it is referenced, refused or out of scope. */
55
65
  reason?: string;
56
66
  /** Anything else a reader should know. */
57
67
  note?: string;
@@ -80,7 +90,8 @@ export function kindRow(dialect: SqlDialect, kind: string): KindRow {
80
90
  * What is wrong with a dialect's coverage table, against its pinned servers'
81
91
  * commands: a command a pinned server has and no row covers, a row for a
82
92
  * command no pinned server has, a kind named twice, a declared row with no
83
- * entity, a refused or out-of-scope row with no reason. Empty when complete.
93
+ * entity, a referenced, refused or out-of-scope row with no reason. Empty
94
+ * when complete.
84
95
  */
85
96
  export function kindCoverageProblems(dialect: SqlDialect, opts: { pins?: ReadonlyArray<{ version: string; commands: readonly string[] }>; rows?: readonly KindRow[] } = {}): string[] {
86
97
  const rows = opts.rows ?? KIND_COVERAGE[dialect];
@@ -96,7 +107,7 @@ export function kindCoverageProblems(dialect: SqlDialect, opts: { pins?: Readonl
96
107
  for (const r of rows) {
97
108
  if (seen.has(r.kind)) problems.push(`the kind "${r.kind}" has two rows`);
98
109
  seen.add(r.kind);
99
- if (!["declared", "refused", "out-of-scope"].includes(r.status)) problems.push(`${r.kind}: status "${r.status}" is not declared, refused or out-of-scope`);
110
+ if (!KIND_STATUSES.includes(r.status)) problems.push(`${r.kind}: status "${r.status}" is not ${KIND_STATUSES.slice(0, -1).join(", ")} or ${KIND_STATUSES.at(-1)}`);
100
111
  if (r.status === "declared" && !r.entity) problems.push(`${r.kind} is declared, and names no entity type`);
101
112
  if (r.status !== "declared" && !r.reason) problems.push(`${r.kind} is ${r.status}, and gives no reason`);
102
113
  }
@@ -0,0 +1,94 @@
1
+ /**
2
+ * `chant sql drizzle [--output <path>] [--check] [--bigint number|bigint]`
3
+ * (#4401): build the project the way `chant build` does, folded, and write the
4
+ * Drizzle schema module {@link renderDrizzle} renders from its entities.
5
+ *
6
+ * The file goes to `<project>/drizzle-schema.ts` by default, outside the
7
+ * source directory the build reads, and starts with chant's generated-file
8
+ * marker either way. `-o` and `--output` put it elsewhere, which is also the
9
+ * flag a workspace `generated` entry's generator passes. `--check` renders the
10
+ * same text and compares it with the file instead of writing it: exit 1,
11
+ * naming the file, when they differ.
12
+ */
13
+
14
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
15
+ import { dirname, join, relative, resolve } from "node:path";
16
+ import type { CommandGroupContext } from "@intentius/chant/cli/command-group";
17
+ import { DrizzleDialectError, renderDrizzle } from "./drizzle";
18
+ import { buildFolded, loadProject } from "./sql-types-command";
19
+
20
+ /** The file `chant sql drizzle` writes by default, in the project directory. */
21
+ export const DRIZZLE_SCHEMA_FILE = "drizzle-schema.ts";
22
+
23
+ const USAGE = "usage: chant sql drizzle [--output <path>] [--check] [--bigint number|bigint]";
24
+
25
+ interface Args {
26
+ output?: string;
27
+ check: boolean;
28
+ bigint?: "number" | "bigint";
29
+ }
30
+
31
+ function parseArgs(args: readonly string[]): Args | { error: string } {
32
+ const out: Args = { check: false };
33
+ for (let i = 0; i < args.length; i++) {
34
+ const a = args[i]!;
35
+ if (a === "--output" || a === "-o") {
36
+ const v = args[++i];
37
+ if (!v) return { error: `${a} needs a path` };
38
+ out.output = v;
39
+ } else if (a.startsWith("--output=")) out.output = a.slice("--output=".length);
40
+ else if (a === "--check") out.check = true;
41
+ else if (a === "--bigint" || a.startsWith("--bigint=")) {
42
+ const v = a === "--bigint" ? args[++i] : a.slice("--bigint=".length);
43
+ if (v !== "number" && v !== "bigint") return { error: "--bigint takes number or bigint" };
44
+ out.bigint = v;
45
+ } else return { error: `unknown argument ${a}` };
46
+ }
47
+ return out;
48
+ }
49
+
50
+ export async function runDrizzle(ctx: CommandGroupContext): Promise<number> {
51
+ const args = parseArgs(ctx.rawArgs);
52
+ if ("error" in args) {
53
+ console.error(`${args.error}\n${USAGE}`);
54
+ return 1;
55
+ }
56
+ const cwd = process.cwd();
57
+ const project = await loadProject(cwd);
58
+ const output = args.output !== undefined ? resolve(cwd, args.output) : join(project.projectDir, DRIZZLE_SCHEMA_FILE);
59
+ const result = await buildFolded(project, "chant sql drizzle", "nothing was written");
60
+ if (!result) return 1;
61
+
62
+ let rendered;
63
+ try {
64
+ rendered = renderDrizzle(result.entities, { config: project.config as unknown as Record<string, unknown>, ...(args.bigint ? { bigintMode: args.bigint } : {}) });
65
+ } catch (err) {
66
+ if (!(err instanceof DrizzleDialectError)) throw err;
67
+ console.error(`chant sql drizzle: ${err.message}`);
68
+ return 1;
69
+ }
70
+ const shown = relative(cwd, output);
71
+ const named = shown && !shown.startsWith("..") ? shown : output;
72
+ if (args.check) {
73
+ // Compares only; the file is never written.
74
+ const onDisk = existsSync(output) ? readFileSync(output, "utf8") : undefined;
75
+ if (onDisk === rendered.text) {
76
+ console.log(`${named} is current`);
77
+ return 0;
78
+ }
79
+ console.error(
80
+ onDisk === undefined
81
+ ? `chant sql drizzle: ${named} does not exist; run \`chant sql drizzle\` to write it`
82
+ : `chant sql drizzle: ${named} differs from what the build declares; run \`chant sql drizzle\` to rewrite it`,
83
+ );
84
+ return 1;
85
+ }
86
+ mkdirSync(dirname(output), { recursive: true });
87
+ writeFileSync(output, rendered.text);
88
+ const { tables, views, enums, sequences } = rendered.counts;
89
+ const plural = (n: number, word: string) => `${n} ${word}${n === 1 ? "" : "s"}`;
90
+ console.log(`wrote ${named}: ${[plural(tables, "table"), plural(views, "view"), plural(enums, "enum"), plural(sequences, "sequence")].join(", ")}`);
91
+ for (const s of rendered.skipped) console.log(`not written: ${s.kind} ${s.names.join(", ")} (${s.reason})`);
92
+ for (const n of rendered.approximated) console.log(`partly written: ${n}`);
93
+ return 0;
94
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * `drizzle-kit generate` finds nothing to migrate (#4401). The declaration of
3
+ * `examples/postgres-getting-started` is applied to a throwaway Postgres;
4
+ * `drizzle-kit pull` writes what the server holds as drizzle-kit's baseline
5
+ * snapshot (`generate` compares a schema with the last snapshot in its `out`
6
+ * directory, never with a server); then `drizzle-kit generate` runs against
7
+ * the schema `chant sql drizzle` wrote and must report no changes and write no
8
+ * new migration.
9
+ *
10
+ * Needs Docker and network access (npm installs drizzle-orm and drizzle-kit in
11
+ * a scratch directory). Skipped without Docker.
12
+ */
13
+
14
+ import { execFileSync } from "node:child_process";
15
+ import { mkdtempSync, readdirSync, rmSync, writeFileSync } from "node:fs";
16
+ import { tmpdir } from "node:os";
17
+ import { dirname, join } from "node:path";
18
+ import { fileURLToPath } from "node:url";
19
+ import { afterAll, beforeAll, describe, expect, test } from "vitest";
20
+ import { build } from "@intentius/chant/build";
21
+ import { resolveProjectBuildOptions } from "@intentius/chant/cli/build-options";
22
+ import { DRIZZLE_ORM_CHECKED, renderDrizzle } from "./drizzle";
23
+ import { sqlPlugin } from "./plugin";
24
+ import { dockerAvailable, startTestPostgres, type TestPostgres } from "./postgres/testing/server";
25
+ import { serializedObjects } from "./sql-types";
26
+ import { sqlSerializer } from "./serializer";
27
+
28
+ const here = dirname(fileURLToPath(import.meta.url));
29
+ const DRIZZLE_KIT = "0.31.11";
30
+ const docker = await dockerAvailable();
31
+
32
+ describe.skipIf(!docker)("drizzle-kit generate against a database applied from the declaration", () => {
33
+ let server: TestPostgres;
34
+ const work = mkdtempSync(join(tmpdir(), "chant-4401-kit-"));
35
+
36
+ beforeAll(async () => {
37
+ server = await startTestPostgres();
38
+ }, 180_000);
39
+
40
+ afterAll(async () => {
41
+ await server?.stop();
42
+ rmSync(work, { recursive: true, force: true });
43
+ });
44
+
45
+ const kit = (...args: string[]): string => execFileSync("npx", ["--no-install", "drizzle-kit", ...args], { cwd: work, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] });
46
+
47
+ test("no migration", async () => {
48
+ const dir = join(here, "..", "examples", "postgres-getting-started");
49
+ const options = resolveProjectBuildOptions({ config: {}, configDir: dir, plugins: [sqlPlugin], modes: { fold: true, sandbox: false } });
50
+ const result = await build(join(dir, "src"), [sqlSerializer], undefined, options);
51
+ expect(result.errors.map(String)).toEqual([]);
52
+ const config = { sql: { dialect: "postgres" } };
53
+
54
+ // The declaration, applied in its own order.
55
+ const doc = serializedObjects(result.entities, config) as { objects: Array<{ export: string; ddl: string }>; applyOrder?: string[] };
56
+ const byExport = new Map(doc.objects.map((o) => [o.export, o]));
57
+ const client = await server.connect();
58
+ try {
59
+ for (const name of doc.applyOrder ?? doc.objects.map((o) => o.export)) await client.query(byExport.get(name)!.ddl);
60
+ } finally {
61
+ await client.end();
62
+ }
63
+
64
+ writeFileSync(join(work, "package.json"), JSON.stringify({ name: "kit-scratch", private: true, type: "module" }));
65
+ execFileSync("npm", ["install", "--silent", `drizzle-orm@${DRIZZLE_ORM_CHECKED}`, `drizzle-kit@${DRIZZLE_KIT}`, "pg"], { cwd: work, stdio: "inherit" });
66
+ writeFileSync(join(work, "schema.ts"), renderDrizzle(result.entities, { config }).text);
67
+ const { url, password } = server.endpoint();
68
+ writeFileSync(
69
+ join(work, "drizzle.config.ts"),
70
+ `import { defineConfig } from "drizzle-kit";
71
+ export default defineConfig({
72
+ dialect: "postgresql",
73
+ schema: "./schema.ts",
74
+ out: "./out",
75
+ schemaFilter: ["app"],
76
+ dbCredentials: { url: ${JSON.stringify(url.replace("postgres@", `postgres:${password}@`))}, ssl: false },
77
+ });
78
+ `,
79
+ );
80
+
81
+ kit("pull");
82
+ const before = readdirSync(join(work, "out")).filter((f) => f.endsWith(".sql"));
83
+ expect(before).toHaveLength(1);
84
+
85
+ const out = kit("generate");
86
+ expect(out).toMatch(/No schema changes, nothing to migrate/);
87
+ expect(readdirSync(join(work, "out")).filter((f) => f.endsWith(".sql"))).toEqual(before);
88
+ }, 600_000);
89
+ });
@@ -0,0 +1,67 @@
1
+ /**
2
+ * The generated Drizzle schemas type-check against drizzle-orm (#4401), and a
3
+ * select over `examples/postgres-getting-started` has the row its declaration
4
+ * gives. The goldens are `test-fixtures/drizzle/*\/schema.ts`
5
+ * (`drizzle.test.ts` keeps them equal to what `renderDrizzle` writes);
6
+ * `postgres-getting-started/rows.ts` holds the row-type assertions.
7
+ *
8
+ * drizzle-orm is not a dependency of this repository, so the test runs only
9
+ * where it resolves from the fixtures (install `drizzle-orm@0.45.4`, the
10
+ * version `DRIZZLE_ORM_CHECKED` names, and `typescript`), and is skipped
11
+ * otherwise.
12
+ */
13
+
14
+ import { createRequire } from "node:module";
15
+ import { dirname, join, relative } from "node:path";
16
+ import { fileURLToPath } from "node:url";
17
+ import ts from "typescript";
18
+ import { describe, expect, test } from "vitest";
19
+
20
+ const here = dirname(fileURLToPath(import.meta.url));
21
+ const repoRoot = join(here, "..", "..", "..");
22
+ const fixtures = join(here, "..", "test-fixtures", "drizzle");
23
+
24
+ function drizzleInstalled(): boolean {
25
+ try {
26
+ createRequire(join(fixtures, "x.js")).resolve("drizzle-orm/package.json");
27
+ return true;
28
+ } catch {
29
+ return false;
30
+ }
31
+ }
32
+
33
+ /** Every error tsc reports in the fixture's files, as `file(line): TScode message`. */
34
+ function tscErrors(dir: string): string[] {
35
+ const options: ts.CompilerOptions = {
36
+ target: ts.ScriptTarget.ES2022,
37
+ lib: ["lib.es2023.d.ts"],
38
+ module: ts.ModuleKind.ESNext,
39
+ moduleResolution: ts.ModuleResolutionKind.Bundler,
40
+ strict: true,
41
+ noEmit: true,
42
+ skipLibCheck: true,
43
+ types: ["node"],
44
+ typeRoots: [join(repoRoot, "node_modules", "@types")],
45
+ };
46
+ const files = ts.sys.readDirectory(dir, [".ts"]);
47
+ const program = ts.createProgram(files, options);
48
+ const out: string[] = [];
49
+ for (const file of files) {
50
+ const sf = program.getSourceFile(file)!;
51
+ for (const d of [...program.getSyntacticDiagnostics(sf), ...program.getSemanticDiagnostics(sf)]) {
52
+ const { line } = sf.getLineAndCharacterOfPosition(d.start ?? 0);
53
+ out.push(`${relative(dir, file)}(${line + 1}): TS${d.code} ${ts.flattenDiagnosticMessageText(d.messageText, "\n").split("\n")[0]}`);
54
+ }
55
+ }
56
+ return out.sort();
57
+ }
58
+
59
+ describe.skipIf(!drizzleInstalled())("the generated Drizzle schema, through tsc", () => {
60
+ test("examples/postgres-getting-started: the schema compiles and a select has the declared row type", () => {
61
+ expect(tscErrors(join(fixtures, "postgres-getting-started"))).toEqual([]);
62
+ }, 120_000);
63
+
64
+ test("every mapping compiles, including two tables that reference each other", () => {
65
+ expect(tscErrors(join(fixtures, "mappings"))).toEqual([]);
66
+ }, 120_000);
67
+ });