relq 1.0.0

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 (305) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +862 -0
  3. package/dist/addons/buffer.js +1869 -0
  4. package/dist/addons/pg-cursor.js +1425 -0
  5. package/dist/addons/pg-format.js +2248 -0
  6. package/dist/addons/pg.js +4790 -0
  7. package/dist/bin/relq.js +2 -0
  8. package/dist/cjs/cache/index.cjs +9 -0
  9. package/dist/cjs/cache/query-cache.cjs +311 -0
  10. package/dist/cjs/cli/commands/add.cjs +82 -0
  11. package/dist/cjs/cli/commands/commit.cjs +145 -0
  12. package/dist/cjs/cli/commands/diff.cjs +84 -0
  13. package/dist/cjs/cli/commands/export.cjs +333 -0
  14. package/dist/cjs/cli/commands/fetch.cjs +59 -0
  15. package/dist/cjs/cli/commands/generate.cjs +242 -0
  16. package/dist/cjs/cli/commands/history.cjs +165 -0
  17. package/dist/cjs/cli/commands/import.cjs +524 -0
  18. package/dist/cjs/cli/commands/init.cjs +437 -0
  19. package/dist/cjs/cli/commands/introspect.cjs +142 -0
  20. package/dist/cjs/cli/commands/log.cjs +62 -0
  21. package/dist/cjs/cli/commands/migrate.cjs +167 -0
  22. package/dist/cjs/cli/commands/pull.cjs +410 -0
  23. package/dist/cjs/cli/commands/push.cjs +165 -0
  24. package/dist/cjs/cli/commands/rollback.cjs +169 -0
  25. package/dist/cjs/cli/commands/status.cjs +110 -0
  26. package/dist/cjs/cli/commands/sync.cjs +79 -0
  27. package/dist/cjs/cli/index.cjs +275 -0
  28. package/dist/cjs/cli/utils/change-tracker.cjs +446 -0
  29. package/dist/cjs/cli/utils/commit-manager.cjs +239 -0
  30. package/dist/cjs/cli/utils/config-loader.cjs +127 -0
  31. package/dist/cjs/cli/utils/env-loader.cjs +62 -0
  32. package/dist/cjs/cli/utils/fast-introspect.cjs +398 -0
  33. package/dist/cjs/cli/utils/git-utils.cjs +404 -0
  34. package/dist/cjs/cli/utils/migration-generator.cjs +269 -0
  35. package/dist/cjs/cli/utils/relqignore.cjs +114 -0
  36. package/dist/cjs/cli/utils/repo-manager.cjs +515 -0
  37. package/dist/cjs/cli/utils/schema-comparator.cjs +313 -0
  38. package/dist/cjs/cli/utils/schema-diff.cjs +284 -0
  39. package/dist/cjs/cli/utils/schema-hash.cjs +108 -0
  40. package/dist/cjs/cli/utils/schema-introspect.cjs +455 -0
  41. package/dist/cjs/cli/utils/snapshot-manager.cjs +223 -0
  42. package/dist/cjs/cli/utils/spinner.cjs +108 -0
  43. package/dist/cjs/cli/utils/sql-generator.cjs +520 -0
  44. package/dist/cjs/cli/utils/sql-parser.cjs +999 -0
  45. package/dist/cjs/cli/utils/type-generator.cjs +2061 -0
  46. package/dist/cjs/condition/array-condition-builder.cjs +503 -0
  47. package/dist/cjs/condition/array-numeric-condition-builder.cjs +186 -0
  48. package/dist/cjs/condition/array-specialized-condition-builder.cjs +206 -0
  49. package/dist/cjs/condition/array-string-condition-builder.cjs +146 -0
  50. package/dist/cjs/condition/base-condition-builder.cjs +2 -0
  51. package/dist/cjs/condition/condition-collector.cjs +284 -0
  52. package/dist/cjs/condition/fulltext-condition-builder.cjs +61 -0
  53. package/dist/cjs/condition/geometric-condition-builder.cjs +208 -0
  54. package/dist/cjs/condition/index.cjs +25 -0
  55. package/dist/cjs/condition/jsonb-condition-builder.cjs +160 -0
  56. package/dist/cjs/condition/network-condition-builder.cjs +230 -0
  57. package/dist/cjs/condition/range-condition-builder.cjs +82 -0
  58. package/dist/cjs/config/config.cjs +190 -0
  59. package/dist/cjs/config/index.cjs +9 -0
  60. package/dist/cjs/constants/pg-values.cjs +68 -0
  61. package/dist/cjs/copy/copy-builder.cjs +316 -0
  62. package/dist/cjs/copy/index.cjs +6 -0
  63. package/dist/cjs/core/query-builder.cjs +440 -0
  64. package/dist/cjs/core/relq-client.cjs +1831 -0
  65. package/dist/cjs/core/typed-kuery-client.cjs +2 -0
  66. package/dist/cjs/count/count-builder.cjs +88 -0
  67. package/dist/cjs/count/index.cjs +5 -0
  68. package/dist/cjs/cte/cte-builder.cjs +89 -0
  69. package/dist/cjs/cte/index.cjs +5 -0
  70. package/dist/cjs/ddl/function.cjs +48 -0
  71. package/dist/cjs/ddl/index.cjs +7 -0
  72. package/dist/cjs/ddl/sql.cjs +54 -0
  73. package/dist/cjs/delete/delete-builder.cjs +135 -0
  74. package/dist/cjs/delete/index.cjs +5 -0
  75. package/dist/cjs/errors/relq-errors.cjs +329 -0
  76. package/dist/cjs/examples/fulltext-search-test.cjs +122 -0
  77. package/dist/cjs/explain/explain-builder.cjs +99 -0
  78. package/dist/cjs/explain/index.cjs +5 -0
  79. package/dist/cjs/function/create-function-builder.cjs +196 -0
  80. package/dist/cjs/function/index.cjs +6 -0
  81. package/dist/cjs/functions/advanced-functions.cjs +241 -0
  82. package/dist/cjs/functions/case-builder.cjs +66 -0
  83. package/dist/cjs/functions/geometric-functions.cjs +104 -0
  84. package/dist/cjs/functions/index.cjs +184 -0
  85. package/dist/cjs/functions/network-functions.cjs +86 -0
  86. package/dist/cjs/functions/sql-functions.cjs +431 -0
  87. package/dist/cjs/index.cjs +164 -0
  88. package/dist/cjs/indexing/create-index-builder.cjs +187 -0
  89. package/dist/cjs/indexing/drop-index-builder.cjs +89 -0
  90. package/dist/cjs/indexing/index-types.cjs +2 -0
  91. package/dist/cjs/indexing/index.cjs +8 -0
  92. package/dist/cjs/insert/conflict-builder.cjs +173 -0
  93. package/dist/cjs/insert/index.cjs +5 -0
  94. package/dist/cjs/insert/insert-builder.cjs +254 -0
  95. package/dist/cjs/introspect/index.cjs +229 -0
  96. package/dist/cjs/maintenance/index.cjs +6 -0
  97. package/dist/cjs/maintenance/vacuum-builder.cjs +166 -0
  98. package/dist/cjs/pubsub/index.cjs +7 -0
  99. package/dist/cjs/pubsub/listen-notify-builder.cjs +57 -0
  100. package/dist/cjs/pubsub/listener-connection.cjs +180 -0
  101. package/dist/cjs/raw/index.cjs +5 -0
  102. package/dist/cjs/raw/raw-query-builder.cjs +27 -0
  103. package/dist/cjs/schema/index.cjs +15 -0
  104. package/dist/cjs/schema/schema-builder.cjs +1167 -0
  105. package/dist/cjs/schema-builder.cjs +21 -0
  106. package/dist/cjs/schema-definition/column-types.cjs +829 -0
  107. package/dist/cjs/schema-definition/index.cjs +62 -0
  108. package/dist/cjs/schema-definition/introspection.cjs +620 -0
  109. package/dist/cjs/schema-definition/partitions.cjs +129 -0
  110. package/dist/cjs/schema-definition/pg-enum.cjs +76 -0
  111. package/dist/cjs/schema-definition/pg-function.cjs +91 -0
  112. package/dist/cjs/schema-definition/pg-sequence.cjs +56 -0
  113. package/dist/cjs/schema-definition/pg-trigger.cjs +108 -0
  114. package/dist/cjs/schema-definition/relations.cjs +98 -0
  115. package/dist/cjs/schema-definition/sql-expressions.cjs +202 -0
  116. package/dist/cjs/schema-definition/table-definition.cjs +636 -0
  117. package/dist/cjs/select/aggregate-builder.cjs +179 -0
  118. package/dist/cjs/select/index.cjs +5 -0
  119. package/dist/cjs/select/select-builder.cjs +233 -0
  120. package/dist/cjs/sequence/index.cjs +7 -0
  121. package/dist/cjs/sequence/sequence-builder.cjs +264 -0
  122. package/dist/cjs/table/alter-table-builder.cjs +146 -0
  123. package/dist/cjs/table/constraint-builder.cjs +102 -0
  124. package/dist/cjs/table/create-table-builder.cjs +248 -0
  125. package/dist/cjs/table/index.cjs +17 -0
  126. package/dist/cjs/table/partition-builder.cjs +131 -0
  127. package/dist/cjs/table/truncate-builder.cjs +70 -0
  128. package/dist/cjs/transaction/index.cjs +6 -0
  129. package/dist/cjs/transaction/transaction-builder.cjs +78 -0
  130. package/dist/cjs/trigger/create-trigger-builder.cjs +174 -0
  131. package/dist/cjs/trigger/index.cjs +6 -0
  132. package/dist/cjs/types/aggregate-types.cjs +2 -0
  133. package/dist/cjs/types/config-types.cjs +40 -0
  134. package/dist/cjs/types/inference-types.cjs +18 -0
  135. package/dist/cjs/types/pagination-types.cjs +7 -0
  136. package/dist/cjs/types/result-types.cjs +2 -0
  137. package/dist/cjs/types/schema-types.cjs +2 -0
  138. package/dist/cjs/types/subscription-types.cjs +2 -0
  139. package/dist/cjs/types.cjs +2 -0
  140. package/dist/cjs/update/array-update-builder.cjs +205 -0
  141. package/dist/cjs/update/index.cjs +13 -0
  142. package/dist/cjs/update/update-builder.cjs +195 -0
  143. package/dist/cjs/utils/case-converter.cjs +58 -0
  144. package/dist/cjs/utils/environment-detection.cjs +120 -0
  145. package/dist/cjs/utils/index.cjs +10 -0
  146. package/dist/cjs/utils/pool-defaults.cjs +106 -0
  147. package/dist/cjs/utils/type-coercion.cjs +118 -0
  148. package/dist/cjs/view/create-view-builder.cjs +180 -0
  149. package/dist/cjs/view/index.cjs +7 -0
  150. package/dist/cjs/window/index.cjs +5 -0
  151. package/dist/cjs/window/window-builder.cjs +80 -0
  152. package/dist/config.cjs +1 -0
  153. package/dist/config.d.ts +655 -0
  154. package/dist/config.js +1 -0
  155. package/dist/esm/cache/index.js +1 -0
  156. package/dist/esm/cache/query-cache.js +303 -0
  157. package/dist/esm/cli/commands/add.js +78 -0
  158. package/dist/esm/cli/commands/commit.js +109 -0
  159. package/dist/esm/cli/commands/diff.js +81 -0
  160. package/dist/esm/cli/commands/export.js +297 -0
  161. package/dist/esm/cli/commands/fetch.js +56 -0
  162. package/dist/esm/cli/commands/generate.js +206 -0
  163. package/dist/esm/cli/commands/history.js +129 -0
  164. package/dist/esm/cli/commands/import.js +488 -0
  165. package/dist/esm/cli/commands/init.js +401 -0
  166. package/dist/esm/cli/commands/introspect.js +106 -0
  167. package/dist/esm/cli/commands/log.js +59 -0
  168. package/dist/esm/cli/commands/migrate.js +131 -0
  169. package/dist/esm/cli/commands/pull.js +374 -0
  170. package/dist/esm/cli/commands/push.js +129 -0
  171. package/dist/esm/cli/commands/rollback.js +133 -0
  172. package/dist/esm/cli/commands/status.js +107 -0
  173. package/dist/esm/cli/commands/sync.js +76 -0
  174. package/dist/esm/cli/index.js +240 -0
  175. package/dist/esm/cli/utils/change-tracker.js +405 -0
  176. package/dist/esm/cli/utils/commit-manager.js +191 -0
  177. package/dist/esm/cli/utils/config-loader.js +86 -0
  178. package/dist/esm/cli/utils/env-loader.js +57 -0
  179. package/dist/esm/cli/utils/fast-introspect.js +362 -0
  180. package/dist/esm/cli/utils/git-utils.js +347 -0
  181. package/dist/esm/cli/utils/migration-generator.js +263 -0
  182. package/dist/esm/cli/utils/relqignore.js +74 -0
  183. package/dist/esm/cli/utils/repo-manager.js +444 -0
  184. package/dist/esm/cli/utils/schema-comparator.js +307 -0
  185. package/dist/esm/cli/utils/schema-diff.js +276 -0
  186. package/dist/esm/cli/utils/schema-hash.js +69 -0
  187. package/dist/esm/cli/utils/schema-introspect.js +418 -0
  188. package/dist/esm/cli/utils/snapshot-manager.js +179 -0
  189. package/dist/esm/cli/utils/spinner.js +101 -0
  190. package/dist/esm/cli/utils/sql-generator.js +504 -0
  191. package/dist/esm/cli/utils/sql-parser.js +992 -0
  192. package/dist/esm/cli/utils/type-generator.js +2058 -0
  193. package/dist/esm/condition/array-condition-builder.js +495 -0
  194. package/dist/esm/condition/array-numeric-condition-builder.js +182 -0
  195. package/dist/esm/condition/array-specialized-condition-builder.js +200 -0
  196. package/dist/esm/condition/array-string-condition-builder.js +142 -0
  197. package/dist/esm/condition/base-condition-builder.js +1 -0
  198. package/dist/esm/condition/condition-collector.js +275 -0
  199. package/dist/esm/condition/fulltext-condition-builder.js +53 -0
  200. package/dist/esm/condition/geometric-condition-builder.js +200 -0
  201. package/dist/esm/condition/index.js +7 -0
  202. package/dist/esm/condition/jsonb-condition-builder.js +152 -0
  203. package/dist/esm/condition/network-condition-builder.js +222 -0
  204. package/dist/esm/condition/range-condition-builder.js +74 -0
  205. package/dist/esm/config/config.js +150 -0
  206. package/dist/esm/config/index.js +1 -0
  207. package/dist/esm/constants/pg-values.js +63 -0
  208. package/dist/esm/copy/copy-builder.js +308 -0
  209. package/dist/esm/copy/index.js +1 -0
  210. package/dist/esm/core/query-builder.js +426 -0
  211. package/dist/esm/core/relq-client.js +1791 -0
  212. package/dist/esm/core/typed-kuery-client.js +1 -0
  213. package/dist/esm/count/count-builder.js +81 -0
  214. package/dist/esm/count/index.js +1 -0
  215. package/dist/esm/cte/cte-builder.js +82 -0
  216. package/dist/esm/cte/index.js +1 -0
  217. package/dist/esm/ddl/function.js +45 -0
  218. package/dist/esm/ddl/index.js +2 -0
  219. package/dist/esm/ddl/sql.js +51 -0
  220. package/dist/esm/delete/delete-builder.js +128 -0
  221. package/dist/esm/delete/index.js +1 -0
  222. package/dist/esm/errors/relq-errors.js +310 -0
  223. package/dist/esm/examples/fulltext-search-test.js +117 -0
  224. package/dist/esm/explain/explain-builder.js +95 -0
  225. package/dist/esm/explain/index.js +1 -0
  226. package/dist/esm/function/create-function-builder.js +188 -0
  227. package/dist/esm/function/index.js +1 -0
  228. package/dist/esm/functions/advanced-functions.js +231 -0
  229. package/dist/esm/functions/case-builder.js +58 -0
  230. package/dist/esm/functions/geometric-functions.js +97 -0
  231. package/dist/esm/functions/index.js +171 -0
  232. package/dist/esm/functions/network-functions.js +79 -0
  233. package/dist/esm/functions/sql-functions.js +421 -0
  234. package/dist/esm/index.js +34 -0
  235. package/dist/esm/indexing/create-index-builder.js +180 -0
  236. package/dist/esm/indexing/drop-index-builder.js +81 -0
  237. package/dist/esm/indexing/index-types.js +1 -0
  238. package/dist/esm/indexing/index.js +2 -0
  239. package/dist/esm/insert/conflict-builder.js +162 -0
  240. package/dist/esm/insert/index.js +1 -0
  241. package/dist/esm/insert/insert-builder.js +247 -0
  242. package/dist/esm/introspect/index.js +224 -0
  243. package/dist/esm/maintenance/index.js +1 -0
  244. package/dist/esm/maintenance/vacuum-builder.js +158 -0
  245. package/dist/esm/pubsub/index.js +1 -0
  246. package/dist/esm/pubsub/listen-notify-builder.js +48 -0
  247. package/dist/esm/pubsub/listener-connection.js +173 -0
  248. package/dist/esm/raw/index.js +1 -0
  249. package/dist/esm/raw/raw-query-builder.js +20 -0
  250. package/dist/esm/schema/index.js +1 -0
  251. package/dist/esm/schema/schema-builder.js +1150 -0
  252. package/dist/esm/schema-builder.js +2 -0
  253. package/dist/esm/schema-definition/column-types.js +738 -0
  254. package/dist/esm/schema-definition/index.js +10 -0
  255. package/dist/esm/schema-definition/introspection.js +614 -0
  256. package/dist/esm/schema-definition/partitions.js +123 -0
  257. package/dist/esm/schema-definition/pg-enum.js +70 -0
  258. package/dist/esm/schema-definition/pg-function.js +85 -0
  259. package/dist/esm/schema-definition/pg-sequence.js +50 -0
  260. package/dist/esm/schema-definition/pg-trigger.js +102 -0
  261. package/dist/esm/schema-definition/relations.js +90 -0
  262. package/dist/esm/schema-definition/sql-expressions.js +193 -0
  263. package/dist/esm/schema-definition/table-definition.js +630 -0
  264. package/dist/esm/select/aggregate-builder.js +172 -0
  265. package/dist/esm/select/index.js +1 -0
  266. package/dist/esm/select/select-builder.js +226 -0
  267. package/dist/esm/sequence/index.js +1 -0
  268. package/dist/esm/sequence/sequence-builder.js +255 -0
  269. package/dist/esm/table/alter-table-builder.js +138 -0
  270. package/dist/esm/table/constraint-builder.js +95 -0
  271. package/dist/esm/table/create-table-builder.js +241 -0
  272. package/dist/esm/table/index.js +5 -0
  273. package/dist/esm/table/partition-builder.js +121 -0
  274. package/dist/esm/table/truncate-builder.js +63 -0
  275. package/dist/esm/transaction/index.js +1 -0
  276. package/dist/esm/transaction/transaction-builder.js +70 -0
  277. package/dist/esm/trigger/create-trigger-builder.js +166 -0
  278. package/dist/esm/trigger/index.js +1 -0
  279. package/dist/esm/types/aggregate-types.js +1 -0
  280. package/dist/esm/types/config-types.js +36 -0
  281. package/dist/esm/types/inference-types.js +12 -0
  282. package/dist/esm/types/pagination-types.js +4 -0
  283. package/dist/esm/types/result-types.js +1 -0
  284. package/dist/esm/types/schema-types.js +1 -0
  285. package/dist/esm/types/subscription-types.js +1 -0
  286. package/dist/esm/types.js +1 -0
  287. package/dist/esm/update/array-update-builder.js +192 -0
  288. package/dist/esm/update/index.js +2 -0
  289. package/dist/esm/update/update-builder.js +188 -0
  290. package/dist/esm/utils/case-converter.js +55 -0
  291. package/dist/esm/utils/environment-detection.js +113 -0
  292. package/dist/esm/utils/index.js +2 -0
  293. package/dist/esm/utils/pool-defaults.js +100 -0
  294. package/dist/esm/utils/type-coercion.js +110 -0
  295. package/dist/esm/view/create-view-builder.js +171 -0
  296. package/dist/esm/view/index.js +1 -0
  297. package/dist/esm/window/index.js +1 -0
  298. package/dist/esm/window/window-builder.js +73 -0
  299. package/dist/index.cjs +1 -0
  300. package/dist/index.d.ts +10341 -0
  301. package/dist/index.js +1 -0
  302. package/dist/schema-builder.cjs +1 -0
  303. package/dist/schema-builder.d.ts +2272 -0
  304. package/dist/schema-builder.js +1 -0
  305. package/package.json +55 -0
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.normalizeSchema = normalizeSchema;
37
+ exports.generateSchemaHash = generateSchemaHash;
38
+ exports.generateShortHash = generateShortHash;
39
+ exports.schemasMatch = schemasMatch;
40
+ const crypto = __importStar(require("crypto"));
41
+ function normalizeSchema(schema) {
42
+ const userTables = schema.tables.filter(t => !t.name.startsWith('_relq') &&
43
+ !t.name.startsWith('relq_'));
44
+ const tables = userTables
45
+ .map(normalizeTable)
46
+ .sort((a, b) => a.name.localeCompare(b.name));
47
+ const extensions = [...schema.extensions].sort();
48
+ return { tables, extensions };
49
+ }
50
+ function normalizeTable(table) {
51
+ const columns = table.columns
52
+ .map(normalizeColumn)
53
+ .sort((a, b) => a.name.localeCompare(b.name));
54
+ const indexes = (table.indexes || [])
55
+ .map(normalizeIndex)
56
+ .sort((a, b) => a.name.localeCompare(b.name));
57
+ const constraints = (table.constraints || [])
58
+ .map(normalizeConstraint)
59
+ .sort((a, b) => a.name.localeCompare(b.name));
60
+ return {
61
+ name: table.name,
62
+ columns,
63
+ indexes,
64
+ constraints,
65
+ partitionType: table.partitionType,
66
+ partitionKey: table.partitionKey?.sort(),
67
+ };
68
+ }
69
+ function normalizeColumn(col) {
70
+ return {
71
+ name: col.name,
72
+ type: col.dataType.toUpperCase(),
73
+ nullable: col.isNullable,
74
+ defaultValue: col.defaultValue || undefined,
75
+ isPrimaryKey: col.isPrimaryKey,
76
+ isUnique: col.isUnique,
77
+ length: col.maxLength || undefined,
78
+ };
79
+ }
80
+ function normalizeIndex(idx) {
81
+ return {
82
+ name: idx.name,
83
+ columns: [...idx.columns].sort(),
84
+ unique: idx.isUnique,
85
+ type: idx.type?.toUpperCase(),
86
+ };
87
+ }
88
+ function normalizeConstraint(con) {
89
+ return {
90
+ name: con.name,
91
+ type: con.type.toUpperCase(),
92
+ definition: con.definition || undefined,
93
+ };
94
+ }
95
+ function generateSchemaHash(schema) {
96
+ const normalized = normalizeSchema(schema);
97
+ const json = JSON.stringify(normalized, null, 0);
98
+ return crypto
99
+ .createHash('sha1')
100
+ .update(json, 'utf8')
101
+ .digest('hex');
102
+ }
103
+ function generateShortHash(schema) {
104
+ return generateSchemaHash(schema).substring(0, 7);
105
+ }
106
+ function schemasMatch(schema1, schema2) {
107
+ return generateSchemaHash(schema1) === generateSchemaHash(schema2);
108
+ }
@@ -0,0 +1,455 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.introspectDatabase = introspectDatabase;
37
+ exports.tableHasData = tableHasData;
38
+ async function introspectDatabase(connection, onProgress, options) {
39
+ const { includeFunctions = false, includeTriggers = false } = options || {};
40
+ const { Pool } = await Promise.resolve().then(() => __importStar(require("../../../addons/pg.js")));
41
+ onProgress?.('connecting', connection.database);
42
+ const pool = new Pool({
43
+ host: connection.host,
44
+ port: connection.port || 5432,
45
+ database: connection.database,
46
+ user: connection.user,
47
+ password: connection.password,
48
+ connectionString: connection.url,
49
+ ssl: connection.ssl,
50
+ });
51
+ try {
52
+ onProgress?.('fetching_tables');
53
+ const tablesResult = await pool.query(`
54
+ SELECT
55
+ t.table_name,
56
+ t.table_schema,
57
+ (SELECT reltuples::bigint FROM pg_class WHERE relname = t.table_name) as row_count
58
+ FROM information_schema.tables t
59
+ WHERE t.table_schema = 'public'
60
+ AND t.table_type = 'BASE TABLE'
61
+ ORDER BY t.table_name;
62
+ `);
63
+ const tables = [];
64
+ const partitionNamesResult = await pool.query(`
65
+ SELECT c.relname as name
66
+ FROM pg_class c
67
+ JOIN pg_namespace n ON c.relnamespace = n.oid
68
+ WHERE n.nspname = 'public' AND c.relispartition = true;
69
+ `);
70
+ const partitionTableNames = new Set(partitionNamesResult.rows.map((r) => r.name));
71
+ const nonPartitionTables = tablesResult.rows.filter((r) => !partitionTableNames.has(r.table_name) && !r.table_name.startsWith('_relq'));
72
+ const totalTables = nonPartitionTables.length;
73
+ let tableIndex = 0;
74
+ for (let i = 0; i < tablesResult.rows.length; i++) {
75
+ const row = tablesResult.rows[i];
76
+ const tableName = row.table_name;
77
+ const tableSchema = row.table_schema;
78
+ const rowCount = parseInt(row.row_count) || 0;
79
+ const isPartition = partitionTableNames.has(tableName);
80
+ const isInternal = tableName.startsWith('_relq');
81
+ if (!isPartition && !isInternal) {
82
+ tableIndex++;
83
+ onProgress?.('parsing_table', `${tableName} (${tableIndex}/${totalTables})`);
84
+ }
85
+ const columnsResult = await pool.query(`
86
+ SELECT
87
+ c.column_name,
88
+ c.data_type,
89
+ c.udt_name,
90
+ c.is_nullable,
91
+ c.column_default,
92
+ c.character_maximum_length,
93
+ c.numeric_precision,
94
+ c.numeric_scale,
95
+ COALESCE(pk.is_pk, false) as is_primary_key,
96
+ COALESCE(uq.is_unique, false) as is_unique,
97
+ fk.foreign_table,
98
+ fk.foreign_column,
99
+ col_description(pgc.oid, c.ordinal_position::int) as column_comment
100
+ FROM information_schema.columns c
101
+ JOIN pg_class pgc ON pgc.relname = c.table_name
102
+ JOIN pg_namespace pgn ON pgn.oid = pgc.relnamespace AND pgn.nspname = c.table_schema
103
+ LEFT JOIN (
104
+ SELECT kcu.column_name, true as is_pk
105
+ FROM information_schema.table_constraints tc
106
+ JOIN information_schema.key_column_usage kcu
107
+ ON tc.constraint_name = kcu.constraint_name
108
+ WHERE tc.table_name = $1 AND tc.constraint_type = 'PRIMARY KEY'
109
+ ) pk ON pk.column_name = c.column_name
110
+ LEFT JOIN (
111
+ SELECT kcu.column_name, true as is_unique
112
+ FROM information_schema.table_constraints tc
113
+ JOIN information_schema.key_column_usage kcu
114
+ ON tc.constraint_name = kcu.constraint_name
115
+ WHERE tc.table_name = $1 AND tc.constraint_type = 'UNIQUE'
116
+ ) uq ON uq.column_name = c.column_name
117
+ LEFT JOIN (
118
+ SELECT
119
+ kcu.column_name,
120
+ ccu.table_name as foreign_table,
121
+ ccu.column_name as foreign_column
122
+ FROM information_schema.table_constraints tc
123
+ JOIN information_schema.key_column_usage kcu
124
+ ON tc.constraint_name = kcu.constraint_name
125
+ JOIN information_schema.constraint_column_usage ccu
126
+ ON tc.constraint_name = ccu.constraint_name
127
+ WHERE tc.table_name = $1 AND tc.constraint_type = 'FOREIGN KEY'
128
+ ) fk ON fk.column_name = c.column_name
129
+ WHERE c.table_name = $1 AND c.table_schema = $2
130
+ ORDER BY c.ordinal_position;
131
+ `, [tableName, tableSchema]);
132
+ const columns = columnsResult.rows.map(col => ({
133
+ name: col.column_name,
134
+ dataType: col.udt_name || col.data_type,
135
+ isNullable: col.is_nullable === 'YES',
136
+ defaultValue: col.column_default,
137
+ isPrimaryKey: col.is_primary_key,
138
+ isUnique: col.is_unique,
139
+ maxLength: col.character_maximum_length,
140
+ precision: col.numeric_precision,
141
+ scale: col.numeric_scale,
142
+ references: col.foreign_table ? {
143
+ table: col.foreign_table,
144
+ column: col.foreign_column,
145
+ } : null,
146
+ comment: col.column_comment || undefined,
147
+ }));
148
+ const indexesResult = await pool.query(`
149
+ SELECT
150
+ i.relname as index_name,
151
+ array_agg(a.attname ORDER BY k.n) as columns,
152
+ ix.indisunique as is_unique,
153
+ ix.indisprimary as is_primary,
154
+ am.amname as index_type
155
+ FROM pg_index ix
156
+ JOIN pg_class t ON t.oid = ix.indrelid
157
+ JOIN pg_class i ON i.oid = ix.indexrelid
158
+ JOIN pg_am am ON am.oid = i.relam
159
+ JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS k(attnum, n) ON true
160
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = k.attnum
161
+ WHERE t.relname = $1
162
+ GROUP BY i.relname, ix.indisunique, ix.indisprimary, am.amname
163
+ ORDER BY i.relname;
164
+ `, [tableName]);
165
+ const indexes = indexesResult.rows.map(idx => ({
166
+ name: idx.index_name,
167
+ columns: idx.columns,
168
+ isUnique: idx.is_unique,
169
+ isPrimary: idx.is_primary,
170
+ type: idx.index_type,
171
+ }));
172
+ const constraintsResult = await pool.query(`
173
+ SELECT
174
+ con.conname as name,
175
+ CASE con.contype
176
+ WHEN 'p' THEN 'PRIMARY KEY'
177
+ WHEN 'f' THEN 'FOREIGN KEY'
178
+ WHEN 'u' THEN 'UNIQUE'
179
+ WHEN 'c' THEN 'CHECK'
180
+ WHEN 'x' THEN 'EXCLUDE'
181
+ END as type,
182
+ array_agg(a.attname ORDER BY u.attposition) as columns,
183
+ pg_get_constraintdef(con.oid) as definition,
184
+ conf.relname as referenced_table
185
+ FROM pg_constraint con
186
+ JOIN pg_class c ON c.oid = con.conrelid
187
+ JOIN pg_namespace n ON n.oid = c.relnamespace
188
+ LEFT JOIN pg_class conf ON conf.oid = con.confrelid
189
+ LEFT JOIN unnest(con.conkey) WITH ORDINALITY u(attnum, attposition) ON true
190
+ LEFT JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = u.attnum
191
+ WHERE c.relname = $1 AND n.nspname = 'public'
192
+ GROUP BY con.oid, con.conname, con.contype, conf.relname
193
+ ORDER BY con.conname;
194
+ `, [tableName]);
195
+ const constraints = constraintsResult.rows.map(c => ({
196
+ name: c.name,
197
+ type: c.type,
198
+ columns: c.columns || [],
199
+ definition: c.definition || '',
200
+ referencedTable: c.referenced_table,
201
+ }));
202
+ const partitionCheckResult = await pool.query(`
203
+ SELECT
204
+ c.relkind = 'p' as is_partitioned,
205
+ CASE pt.partstrat
206
+ WHEN 'r' THEN 'RANGE'
207
+ WHEN 'l' THEN 'LIST'
208
+ WHEN 'h' THEN 'HASH'
209
+ END as partition_type,
210
+ array_agg(a.attname) as partition_key
211
+ FROM pg_class c
212
+ JOIN pg_namespace n ON n.oid = c.relnamespace
213
+ LEFT JOIN pg_partitioned_table pt ON pt.partrelid = c.oid
214
+ LEFT JOIN unnest(pt.partattrs) WITH ORDINALITY pk(attnum, ord) ON true
215
+ LEFT JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = pk.attnum
216
+ WHERE c.relname = $1 AND n.nspname = 'public'
217
+ GROUP BY c.relkind, pt.partstrat;
218
+ `, [tableName]);
219
+ const partitionInfo = partitionCheckResult.rows[0] || {};
220
+ let partitionKey;
221
+ if (partitionInfo.partition_key) {
222
+ partitionKey = Array.isArray(partitionInfo.partition_key)
223
+ ? partitionInfo.partition_key.filter(Boolean)
224
+ : typeof partitionInfo.partition_key === 'string'
225
+ ? [partitionInfo.partition_key]
226
+ : undefined;
227
+ }
228
+ tables.push({
229
+ name: tableName,
230
+ schema: tableSchema,
231
+ columns,
232
+ indexes,
233
+ constraints,
234
+ rowCount,
235
+ isPartitioned: partitionInfo.is_partitioned || false,
236
+ partitionType: partitionInfo.partition_type,
237
+ partitionKey,
238
+ });
239
+ }
240
+ onProgress?.('fetching_extensions');
241
+ const extensionsResult = await pool.query(`
242
+ SELECT extname FROM pg_extension WHERE extname != 'plpgsql';
243
+ `);
244
+ const extensions = extensionsResult.rows.map(r => r.extname);
245
+ let functions = [];
246
+ if (includeFunctions) {
247
+ onProgress?.('fetching_functions');
248
+ const functionsResult = await pool.query(`
249
+ SELECT
250
+ p.proname as name,
251
+ n.nspname as schema,
252
+ pg_get_function_result(p.oid) as return_type,
253
+ pg_get_function_arguments(p.oid) as arg_types,
254
+ l.lanname as language,
255
+ pg_get_functiondef(p.oid) as definition,
256
+ p.prokind = 'a' as is_aggregate,
257
+ p.provolatile as volatility
258
+ FROM pg_proc p
259
+ JOIN pg_namespace n ON p.pronamespace = n.oid
260
+ JOIN pg_language l ON p.prolang = l.oid
261
+ WHERE n.nspname = 'public'
262
+ AND p.prokind IN ('f', 'a')
263
+ ORDER BY p.proname;
264
+ `);
265
+ functions = functionsResult.rows.map(f => ({
266
+ name: f.name,
267
+ schema: f.schema,
268
+ returnType: f.return_type,
269
+ argTypes: f.arg_types ? f.arg_types.split(', ') : [],
270
+ language: f.language,
271
+ definition: f.definition || '',
272
+ isAggregate: f.is_aggregate || false,
273
+ volatility: f.volatility === 'i' ? 'IMMUTABLE' : f.volatility === 's' ? 'STABLE' : 'VOLATILE',
274
+ }));
275
+ }
276
+ let triggers = [];
277
+ if (includeTriggers) {
278
+ const triggersResult = await pool.query(`
279
+ SELECT
280
+ t.tgname as name,
281
+ c.relname as table_name,
282
+ CASE
283
+ WHEN t.tgtype & 2 > 0 THEN 'BEFORE'
284
+ WHEN t.tgtype & 64 > 0 THEN 'INSTEAD OF'
285
+ ELSE 'AFTER'
286
+ END as timing,
287
+ CASE
288
+ WHEN t.tgtype & 4 > 0 THEN 'INSERT'
289
+ WHEN t.tgtype & 8 > 0 THEN 'DELETE'
290
+ WHEN t.tgtype & 16 > 0 THEN 'UPDATE'
291
+ ELSE 'UNKNOWN'
292
+ END as event,
293
+ p.proname as function_name,
294
+ pg_get_triggerdef(t.oid) as definition,
295
+ t.tgenabled != 'D' as is_enabled
296
+ FROM pg_trigger t
297
+ JOIN pg_class c ON t.tgrelid = c.oid
298
+ JOIN pg_namespace n ON c.relnamespace = n.oid
299
+ JOIN pg_proc p ON t.tgfoid = p.oid
300
+ WHERE n.nspname = 'public'
301
+ AND NOT t.tgisinternal
302
+ ORDER BY c.relname, t.tgname;
303
+ `);
304
+ triggers = triggersResult.rows.map(t => ({
305
+ name: t.name,
306
+ tableName: t.table_name,
307
+ timing: t.timing,
308
+ event: t.event,
309
+ functionName: t.function_name,
310
+ definition: t.definition || '',
311
+ isEnabled: t.is_enabled,
312
+ }));
313
+ }
314
+ const policiesResult = await pool.query(`
315
+ SELECT
316
+ pol.polname as name,
317
+ c.relname as table_name,
318
+ CASE pol.polcmd
319
+ WHEN '*' THEN 'ALL'
320
+ WHEN 'r' THEN 'SELECT'
321
+ WHEN 'a' THEN 'INSERT'
322
+ WHEN 'w' THEN 'UPDATE'
323
+ WHEN 'd' THEN 'DELETE'
324
+ END as command,
325
+ array_agg(r.rolname) as roles,
326
+ pg_get_expr(pol.polqual, pol.polrelid) as using_expr,
327
+ pg_get_expr(pol.polwithcheck, pol.polrelid) as with_check
328
+ FROM pg_policy pol
329
+ JOIN pg_class c ON pol.polrelid = c.oid
330
+ JOIN pg_namespace n ON c.relnamespace = n.oid
331
+ LEFT JOIN unnest(pol.polroles) WITH ORDINALITY pr(oid, ord) ON true
332
+ LEFT JOIN pg_roles r ON r.oid = pr.oid
333
+ WHERE n.nspname = 'public'
334
+ GROUP BY pol.polname, c.relname, pol.polcmd, pol.polqual, pol.polwithcheck, pol.polrelid
335
+ ORDER BY c.relname, pol.polname;
336
+ `);
337
+ const policies = policiesResult.rows.map(p => ({
338
+ name: p.name,
339
+ tableName: p.table_name,
340
+ command: p.command,
341
+ roles: p.roles?.filter(Boolean) || [],
342
+ using: p.using_expr,
343
+ withCheck: p.with_check,
344
+ }));
345
+ const partitionsResult = await pool.query(`
346
+ SELECT
347
+ c.relname as name,
348
+ parent.relname as parent_table,
349
+ CASE pt.partstrat
350
+ WHEN 'r' THEN 'RANGE'
351
+ WHEN 'l' THEN 'LIST'
352
+ WHEN 'h' THEN 'HASH'
353
+ END as partition_type,
354
+ pg_get_expr(c.relpartbound, c.oid) as partition_bound
355
+ FROM pg_class c
356
+ JOIN pg_inherits i ON c.oid = i.inhrelid
357
+ JOIN pg_class parent ON parent.oid = i.inhparent
358
+ JOIN pg_namespace n ON c.relnamespace = n.oid
359
+ LEFT JOIN pg_partitioned_table pt ON pt.partrelid = parent.oid
360
+ WHERE n.nspname = 'public'
361
+ AND c.relispartition
362
+ ORDER BY parent.relname, c.relname;
363
+ `);
364
+ const partitions = partitionsResult.rows.map(p => ({
365
+ name: p.name,
366
+ parentTable: p.parent_table,
367
+ partitionType: p.partition_type || 'RANGE',
368
+ partitionKey: [],
369
+ partitionBound: p.partition_bound || '',
370
+ }));
371
+ const foreignServersResult = await pool.query(`
372
+ SELECT
373
+ s.srvname as name,
374
+ f.fdwname as foreign_data_wrapper,
375
+ s.srvoptions as options
376
+ FROM pg_foreign_server s
377
+ JOIN pg_foreign_data_wrapper f ON f.oid = s.srvfdw
378
+ ORDER BY s.srvname;
379
+ `);
380
+ const foreignServers = foreignServersResult.rows.map(s => ({
381
+ name: s.name,
382
+ foreignDataWrapper: s.foreign_data_wrapper,
383
+ options: parseOptions(s.options),
384
+ }));
385
+ const foreignTablesResult = await pool.query(`
386
+ SELECT
387
+ c.relname as name,
388
+ n.nspname as schema,
389
+ s.srvname as server_name,
390
+ ft.ftoptions as options
391
+ FROM pg_foreign_table ft
392
+ JOIN pg_class c ON c.oid = ft.ftrelid
393
+ JOIN pg_namespace n ON n.oid = c.relnamespace
394
+ JOIN pg_foreign_server s ON s.oid = ft.ftserver
395
+ WHERE n.nspname = 'public'
396
+ ORDER BY c.relname;
397
+ `);
398
+ const foreignTables = foreignTablesResult.rows.map(t => ({
399
+ name: t.name,
400
+ schema: t.schema,
401
+ serverName: t.server_name,
402
+ columns: [],
403
+ options: parseOptions(t.options),
404
+ }));
405
+ return {
406
+ tables,
407
+ enums: [],
408
+ domains: [],
409
+ compositeTypes: [],
410
+ sequences: [],
411
+ functions,
412
+ triggers,
413
+ policies,
414
+ partitions,
415
+ foreignServers,
416
+ foreignTables,
417
+ extensions
418
+ };
419
+ }
420
+ finally {
421
+ await pool.end();
422
+ }
423
+ }
424
+ function parseOptions(options) {
425
+ if (!options)
426
+ return {};
427
+ const result = {};
428
+ for (const opt of options) {
429
+ const [key, value] = opt.split('=');
430
+ if (key)
431
+ result[key] = value || '';
432
+ }
433
+ return result;
434
+ }
435
+ async function tableHasData(connection, tableName) {
436
+ const { Pool } = await Promise.resolve().then(() => __importStar(require("../../../addons/pg.js")));
437
+ const pool = new Pool({
438
+ host: connection.host,
439
+ port: connection.port || 5432,
440
+ database: connection.database,
441
+ user: connection.user,
442
+ password: connection.password,
443
+ connectionString: connection.url,
444
+ });
445
+ try {
446
+ const result = await pool.query(`SELECT EXISTS(SELECT 1 FROM "${tableName}" LIMIT 1) as has_data`);
447
+ return result.rows[0]?.has_data || false;
448
+ }
449
+ catch {
450
+ return false;
451
+ }
452
+ finally {
453
+ await pool.end();
454
+ }
455
+ }