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,446 @@
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.generateChangeId = generateChangeId;
37
+ exports.generateChangeSQL = generateChangeSQL;
38
+ exports.createChange = createChange;
39
+ exports.getChangeDisplayName = getChangeDisplayName;
40
+ exports.sortChangesByDependency = sortChangesByDependency;
41
+ exports.generateCombinedSQL = generateCombinedSQL;
42
+ const crypto = __importStar(require("crypto"));
43
+ function generateChangeId(type, objectType, objectName, parentName) {
44
+ const input = `${type}:${objectType}:${parentName || ''}:${objectName}:${Date.now()}`;
45
+ return crypto.createHash('sha1').update(input).digest('hex').substring(0, 12);
46
+ }
47
+ function generateChangeSQL(change) {
48
+ switch (change.objectType) {
49
+ case 'EXTENSION':
50
+ return generateExtensionSQL(change);
51
+ case 'ENUM':
52
+ return generateEnumSQL(change);
53
+ case 'ENUM_VALUE':
54
+ return generateEnumValueSQL(change);
55
+ case 'DOMAIN':
56
+ return generateDomainSQL(change);
57
+ case 'COMPOSITE_TYPE':
58
+ return generateCompositeTypeSQL(change);
59
+ case 'SEQUENCE':
60
+ return generateSequenceSQL(change);
61
+ case 'TABLE':
62
+ return generateTableSQL(change);
63
+ case 'COLUMN':
64
+ return generateColumnSQL(change);
65
+ case 'INDEX':
66
+ return generateIndexSQL(change);
67
+ case 'CONSTRAINT':
68
+ case 'PRIMARY_KEY':
69
+ case 'FOREIGN_KEY':
70
+ case 'CHECK':
71
+ case 'EXCLUSION':
72
+ return generateConstraintSQL(change);
73
+ case 'PARTITION':
74
+ return generatePartitionSQL(change);
75
+ case 'VIEW':
76
+ return generateViewSQL(change);
77
+ case 'MATERIALIZED_VIEW':
78
+ return generateMaterializedViewSQL(change);
79
+ case 'FUNCTION':
80
+ case 'PROCEDURE':
81
+ return generateFunctionSQL(change);
82
+ case 'TRIGGER':
83
+ return generateTriggerSQL(change);
84
+ case 'FOREIGN_SERVER':
85
+ return generateForeignServerSQL(change);
86
+ case 'FOREIGN_TABLE':
87
+ return generateForeignTableSQL(change);
88
+ default:
89
+ return `-- Unsupported object type: ${change.objectType}`;
90
+ }
91
+ }
92
+ function generateExtensionSQL(change) {
93
+ if (change.type === 'CREATE') {
94
+ return `CREATE EXTENSION IF NOT EXISTS "${change.objectName}";`;
95
+ }
96
+ else if (change.type === 'DROP') {
97
+ return `DROP EXTENSION IF EXISTS "${change.objectName}";`;
98
+ }
99
+ return '';
100
+ }
101
+ function generateEnumSQL(change) {
102
+ const data = change.after;
103
+ if (change.type === 'CREATE' && data) {
104
+ const values = data.values.map(v => `'${v}'`).join(', ');
105
+ return `CREATE TYPE "${data.name}" AS ENUM (${values});`;
106
+ }
107
+ else if (change.type === 'DROP') {
108
+ return `DROP TYPE IF EXISTS "${change.objectName}" CASCADE;`;
109
+ }
110
+ return '';
111
+ }
112
+ function generateEnumValueSQL(change) {
113
+ const data = change.after;
114
+ if (change.type === 'CREATE' && data) {
115
+ const afterClause = data.after ? ` AFTER '${data.after}'` : '';
116
+ return `ALTER TYPE "${data.enumName}" ADD VALUE IF NOT EXISTS '${data.value}'${afterClause};`;
117
+ }
118
+ return '';
119
+ }
120
+ function generateDomainSQL(change) {
121
+ const data = change.after;
122
+ if (change.type === 'CREATE' && data) {
123
+ let sql = `CREATE DOMAIN "${data.name}" AS ${data.baseType}`;
124
+ if (data.default)
125
+ sql += ` DEFAULT ${data.default}`;
126
+ if (data.notNull)
127
+ sql += ' NOT NULL';
128
+ if (data.check)
129
+ sql += ` CHECK (${data.check})`;
130
+ return sql + ';';
131
+ }
132
+ else if (change.type === 'DROP') {
133
+ return `DROP DOMAIN IF EXISTS "${change.objectName}" CASCADE;`;
134
+ }
135
+ return '';
136
+ }
137
+ function generateCompositeTypeSQL(change) {
138
+ const data = change.after;
139
+ if (change.type === 'CREATE' && data) {
140
+ const attrs = data.attributes.map(a => ` "${a.name}" ${a.type}`).join(',\n');
141
+ return `CREATE TYPE "${data.name}" AS (\n${attrs}\n);`;
142
+ }
143
+ else if (change.type === 'DROP') {
144
+ return `DROP TYPE IF EXISTS "${change.objectName}" CASCADE;`;
145
+ }
146
+ return '';
147
+ }
148
+ function generateSequenceSQL(change) {
149
+ const data = change.after;
150
+ if (change.type === 'CREATE' && data) {
151
+ let sql = `CREATE SEQUENCE IF NOT EXISTS "${data.name}"`;
152
+ if (data.startWith)
153
+ sql += ` START WITH ${data.startWith}`;
154
+ if (data.incrementBy)
155
+ sql += ` INCREMENT BY ${data.incrementBy}`;
156
+ return sql + ';';
157
+ }
158
+ else if (change.type === 'DROP') {
159
+ return `DROP SEQUENCE IF EXISTS "${change.objectName}" CASCADE;`;
160
+ }
161
+ return '';
162
+ }
163
+ function generateTableSQL(change) {
164
+ const data = change.after;
165
+ if (change.type === 'CREATE' && data) {
166
+ const colDefs = [];
167
+ const constraintDefs = [];
168
+ for (const col of data.columns) {
169
+ let def = ` "${col.name}" ${col.dataType}`;
170
+ if (col.isPrimaryKey)
171
+ def += ' PRIMARY KEY';
172
+ if (!col.isNullable && !col.isPrimaryKey)
173
+ def += ' NOT NULL';
174
+ if (col.isUnique && !col.isPrimaryKey)
175
+ def += ' UNIQUE';
176
+ if (col.defaultValue)
177
+ def += ` DEFAULT ${col.defaultValue}`;
178
+ if (col.references) {
179
+ def += ` REFERENCES "${col.references.table}"("${col.references.column}")`;
180
+ }
181
+ colDefs.push(def);
182
+ }
183
+ for (const con of data.constraints || []) {
184
+ constraintDefs.push(` CONSTRAINT "${con.name}" ${con.definition}`);
185
+ }
186
+ const allDefs = [...colDefs, ...constraintDefs].join(',\n');
187
+ let sql = `CREATE TABLE "${data.name}" (\n${allDefs}\n)`;
188
+ if (data.isPartitioned && data.partitionType && data.partitionKey?.length) {
189
+ sql += ` PARTITION BY ${data.partitionType} (${data.partitionKey.join(', ')})`;
190
+ }
191
+ return sql + ';';
192
+ }
193
+ else if (change.type === 'DROP') {
194
+ return `DROP TABLE IF EXISTS "${change.objectName}" CASCADE;`;
195
+ }
196
+ return '';
197
+ }
198
+ function generateColumnSQL(change) {
199
+ const tableName = change.parentName;
200
+ if (!tableName)
201
+ return '';
202
+ const data = change.after;
203
+ if (change.type === 'CREATE' && data) {
204
+ let sql = `ALTER TABLE "${tableName}" ADD COLUMN "${data.name}" ${data.dataType}`;
205
+ if (!data.isNullable)
206
+ sql += ' NOT NULL';
207
+ if (data.defaultValue)
208
+ sql += ` DEFAULT ${data.defaultValue}`;
209
+ return sql + ';';
210
+ }
211
+ else if (change.type === 'DROP') {
212
+ return `ALTER TABLE "${tableName}" DROP COLUMN IF EXISTS "${change.objectName}" CASCADE;`;
213
+ }
214
+ else if (change.type === 'ALTER' && data) {
215
+ const before = change.before;
216
+ const lines = [];
217
+ if (before?.dataType !== data.dataType) {
218
+ lines.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${data.name}" TYPE ${data.dataType};`);
219
+ }
220
+ if (before?.isNullable !== data.isNullable) {
221
+ if (data.isNullable) {
222
+ lines.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${data.name}" DROP NOT NULL;`);
223
+ }
224
+ else {
225
+ lines.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${data.name}" SET NOT NULL;`);
226
+ }
227
+ }
228
+ if (before?.defaultValue !== data.defaultValue) {
229
+ if (data.defaultValue) {
230
+ lines.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${data.name}" SET DEFAULT ${data.defaultValue};`);
231
+ }
232
+ else {
233
+ lines.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${data.name}" DROP DEFAULT;`);
234
+ }
235
+ }
236
+ return lines.join('\n');
237
+ }
238
+ return '';
239
+ }
240
+ function generateIndexSQL(change) {
241
+ const data = change.after;
242
+ if (change.type === 'CREATE' && data) {
243
+ const unique = data.isUnique ? 'UNIQUE ' : '';
244
+ const using = data.type && data.type !== 'btree' ? ` USING ${data.type}` : '';
245
+ const cols = data.columns.map(c => `"${c}"`).join(', ');
246
+ let sql = `CREATE ${unique}INDEX IF NOT EXISTS "${data.name}" ON "${data.tableName}"${using} (${cols})`;
247
+ if (data.where)
248
+ sql += ` WHERE ${data.where}`;
249
+ return sql + ';';
250
+ }
251
+ else if (change.type === 'DROP') {
252
+ return `DROP INDEX IF EXISTS "${change.objectName}";`;
253
+ }
254
+ return '';
255
+ }
256
+ function generateConstraintSQL(change) {
257
+ const tableName = change.parentName;
258
+ if (!tableName)
259
+ return '';
260
+ const data = change.after;
261
+ if (change.type === 'CREATE' && data) {
262
+ return `ALTER TABLE "${tableName}" ADD CONSTRAINT "${data.name}" ${data.definition};`;
263
+ }
264
+ else if (change.type === 'DROP') {
265
+ return `ALTER TABLE "${tableName}" DROP CONSTRAINT IF EXISTS "${change.objectName}";`;
266
+ }
267
+ return '';
268
+ }
269
+ function generatePartitionSQL(change) {
270
+ const data = change.after;
271
+ if (change.type === 'CREATE' && data) {
272
+ return `CREATE TABLE "${data.name}" PARTITION OF "${data.parentTable}" ${data.bound};`;
273
+ }
274
+ else if (change.type === 'DROP') {
275
+ return `DROP TABLE IF EXISTS "${change.objectName}";`;
276
+ }
277
+ return '';
278
+ }
279
+ function generateViewSQL(change) {
280
+ const data = change.after;
281
+ if (change.type === 'CREATE' && data) {
282
+ return `CREATE OR REPLACE VIEW "${data.name}" AS ${data.definition};`;
283
+ }
284
+ else if (change.type === 'DROP') {
285
+ return `DROP VIEW IF EXISTS "${change.objectName}" CASCADE;`;
286
+ }
287
+ return '';
288
+ }
289
+ function generateMaterializedViewSQL(change) {
290
+ const data = change.after;
291
+ if (change.type === 'CREATE' && data) {
292
+ return `CREATE MATERIALIZED VIEW IF NOT EXISTS "${data.name}" AS ${data.definition};`;
293
+ }
294
+ else if (change.type === 'DROP') {
295
+ return `DROP MATERIALIZED VIEW IF EXISTS "${change.objectName}" CASCADE;`;
296
+ }
297
+ return '';
298
+ }
299
+ function generateFunctionSQL(change) {
300
+ const data = change.after;
301
+ if (change.type === 'CREATE' && data) {
302
+ const args = data.args || '';
303
+ const volatility = data.volatility || 'VOLATILE';
304
+ return `CREATE OR REPLACE FUNCTION "${data.name}"(${args})
305
+ RETURNS ${data.returns}
306
+ LANGUAGE ${data.language}
307
+ ${volatility}
308
+ AS $$
309
+ ${data.body}
310
+ $$;`;
311
+ }
312
+ else if (change.type === 'DROP') {
313
+ return `DROP FUNCTION IF EXISTS "${change.objectName}" CASCADE;`;
314
+ }
315
+ return '';
316
+ }
317
+ function generateTriggerSQL(change) {
318
+ const data = change.after;
319
+ if (change.type === 'CREATE' && data) {
320
+ return `CREATE TRIGGER "${data.name}"
321
+ ${data.timing} ${data.event} ON "${data.tableName}"
322
+ FOR EACH ROW EXECUTE FUNCTION ${data.functionName}();`;
323
+ }
324
+ else if (change.type === 'DROP' && change.parentName) {
325
+ return `DROP TRIGGER IF EXISTS "${change.objectName}" ON "${change.parentName}";`;
326
+ }
327
+ return '';
328
+ }
329
+ function generateForeignServerSQL(change) {
330
+ const data = change.after;
331
+ if (change.type === 'CREATE' && data) {
332
+ let sql = `CREATE SERVER IF NOT EXISTS "${data.name}" FOREIGN DATA WRAPPER ${data.fdw}`;
333
+ if (data.options && Object.keys(data.options).length > 0) {
334
+ const opts = Object.entries(data.options)
335
+ .map(([k, v]) => `${k} '${v}'`)
336
+ .join(', ');
337
+ sql += ` OPTIONS (${opts})`;
338
+ }
339
+ return sql + ';';
340
+ }
341
+ else if (change.type === 'DROP') {
342
+ return `DROP SERVER IF EXISTS "${change.objectName}" CASCADE;`;
343
+ }
344
+ return '';
345
+ }
346
+ function generateForeignTableSQL(change) {
347
+ const data = change.after;
348
+ if (change.type === 'CREATE' && data) {
349
+ const cols = data.columns.map(c => ` "${c.name}" ${c.type}`).join(',\n');
350
+ let sql = `CREATE FOREIGN TABLE IF NOT EXISTS "${data.name}" (\n${cols}\n) SERVER "${data.serverName}"`;
351
+ if (data.options && Object.keys(data.options).length > 0) {
352
+ const opts = Object.entries(data.options)
353
+ .map(([k, v]) => `${k} '${v}'`)
354
+ .join(', ');
355
+ sql += ` OPTIONS (${opts})`;
356
+ }
357
+ return sql + ';';
358
+ }
359
+ else if (change.type === 'DROP') {
360
+ return `DROP FOREIGN TABLE IF EXISTS "${change.objectName}";`;
361
+ }
362
+ return '';
363
+ }
364
+ function createChange(type, objectType, objectName, before, after, parentName) {
365
+ const id = generateChangeId(type, objectType, objectName, parentName);
366
+ const change = {
367
+ id,
368
+ type,
369
+ objectType,
370
+ objectName,
371
+ parentName,
372
+ before,
373
+ after,
374
+ sql: '',
375
+ detectedAt: new Date().toISOString(),
376
+ };
377
+ change.sql = generateChangeSQL(change);
378
+ return change;
379
+ }
380
+ function getChangeDisplayName(change) {
381
+ const prefix = change.type === 'CREATE' ? '+' :
382
+ change.type === 'DROP' ? '-' :
383
+ change.type === 'ALTER' ? '~' :
384
+ '>';
385
+ if (change.parentName) {
386
+ return `${prefix} ${change.objectType} ${change.parentName}.${change.objectName}`;
387
+ }
388
+ return `${prefix} ${change.objectType} ${change.objectName}`;
389
+ }
390
+ function sortChangesByDependency(changes) {
391
+ const order = {
392
+ 'EXTENSION': 1,
393
+ 'SCHEMA': 2,
394
+ 'ENUM': 3,
395
+ 'DOMAIN': 4,
396
+ 'COMPOSITE_TYPE': 5,
397
+ 'SEQUENCE': 6,
398
+ 'FOREIGN_SERVER': 7,
399
+ 'TABLE': 10,
400
+ 'PARTITION': 11,
401
+ 'COLUMN': 12,
402
+ 'INDEX': 13,
403
+ 'CONSTRAINT': 14,
404
+ 'PRIMARY_KEY': 14,
405
+ 'FOREIGN_KEY': 15,
406
+ 'CHECK': 14,
407
+ 'EXCLUSION': 14,
408
+ 'VIEW': 20,
409
+ 'MATERIALIZED_VIEW': 21,
410
+ 'FUNCTION': 30,
411
+ 'PROCEDURE': 31,
412
+ 'TRIGGER': 40,
413
+ 'ENUM_VALUE': 3,
414
+ 'FOREIGN_TABLE': 8,
415
+ };
416
+ return [...changes].sort((a, b) => {
417
+ if (a.type === 'CREATE' && b.type === 'DROP')
418
+ return -1;
419
+ if (a.type === 'DROP' && b.type === 'CREATE')
420
+ return 1;
421
+ return (order[a.objectType] || 50) - (order[b.objectType] || 50);
422
+ });
423
+ }
424
+ function generateCombinedSQL(changes) {
425
+ const sorted = sortChangesByDependency(changes);
426
+ const lines = [
427
+ '--',
428
+ '-- Generated by Relq CLI',
429
+ `-- Generated at: ${new Date().toISOString()}`,
430
+ '--',
431
+ '',
432
+ ];
433
+ let currentSection = '';
434
+ for (const change of sorted) {
435
+ const section = change.objectType;
436
+ if (section !== currentSection) {
437
+ lines.push(`-- ${section}s`);
438
+ currentSection = section;
439
+ }
440
+ if (change.sql) {
441
+ lines.push(change.sql);
442
+ lines.push('');
443
+ }
444
+ }
445
+ return lines.join('\n');
446
+ }
@@ -0,0 +1,239 @@
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.ensureRelqDir = ensureRelqDir;
37
+ exports.getLocalCommits = getLocalCommits;
38
+ exports.saveLocalCommits = saveLocalCommits;
39
+ exports.getLocalHead = getLocalHead;
40
+ exports.setLocalHead = setLocalHead;
41
+ exports.addLocalCommit = addLocalCommit;
42
+ exports.getLatestLocalCommit = getLatestLocalCommit;
43
+ exports.ensureCommitsTable = ensureCommitsTable;
44
+ exports.getRemoteCommits = getRemoteCommits;
45
+ exports.getLatestRemoteCommit = getLatestRemoteCommit;
46
+ exports.addRemoteCommit = addRemoteCommit;
47
+ exports.createCommit = createCommit;
48
+ exports.checkSyncStatus = checkSyncStatus;
49
+ const fs = __importStar(require("fs"));
50
+ const path = __importStar(require("path"));
51
+ const schema_hash_1 = require("./schema-hash.cjs");
52
+ const RELQ_DIR = '.relq';
53
+ const COMMITS_FILE = 'commits.json';
54
+ const HEAD_FILE = 'HEAD';
55
+ function ensureRelqDir(baseDir = process.cwd()) {
56
+ const relqPath = path.join(baseDir, RELQ_DIR);
57
+ if (!fs.existsSync(relqPath)) {
58
+ fs.mkdirSync(relqPath, { recursive: true });
59
+ }
60
+ return relqPath;
61
+ }
62
+ function getLocalCommits(baseDir = process.cwd()) {
63
+ const filePath = path.join(baseDir, RELQ_DIR, COMMITS_FILE);
64
+ if (!fs.existsSync(filePath)) {
65
+ return [];
66
+ }
67
+ try {
68
+ const data = fs.readFileSync(filePath, 'utf-8');
69
+ return JSON.parse(data);
70
+ }
71
+ catch {
72
+ return [];
73
+ }
74
+ }
75
+ function saveLocalCommits(commits, baseDir = process.cwd()) {
76
+ ensureRelqDir(baseDir);
77
+ const filePath = path.join(baseDir, RELQ_DIR, COMMITS_FILE);
78
+ fs.writeFileSync(filePath, JSON.stringify(commits, null, 2), 'utf-8');
79
+ }
80
+ function getLocalHead(baseDir = process.cwd()) {
81
+ const filePath = path.join(baseDir, RELQ_DIR, HEAD_FILE);
82
+ if (!fs.existsSync(filePath)) {
83
+ return null;
84
+ }
85
+ return fs.readFileSync(filePath, 'utf-8').trim() || null;
86
+ }
87
+ function setLocalHead(hash, baseDir = process.cwd()) {
88
+ ensureRelqDir(baseDir);
89
+ const filePath = path.join(baseDir, RELQ_DIR, HEAD_FILE);
90
+ fs.writeFileSync(filePath, hash, 'utf-8');
91
+ }
92
+ function addLocalCommit(commit, limit = 1000, baseDir = process.cwd()) {
93
+ const commits = getLocalCommits(baseDir);
94
+ commits.push(commit);
95
+ while (commits.length > limit) {
96
+ commits.shift();
97
+ }
98
+ saveLocalCommits(commits, baseDir);
99
+ setLocalHead(commit.hash, baseDir);
100
+ }
101
+ function getLatestLocalCommit(baseDir = process.cwd()) {
102
+ const commits = getLocalCommits(baseDir);
103
+ return commits.length > 0 ? commits[commits.length - 1] : null;
104
+ }
105
+ const CREATE_TABLE_SQL = `
106
+ CREATE TABLE IF NOT EXISTS _relq_commits (
107
+ id SERIAL PRIMARY KEY,
108
+ hash VARCHAR(40) UNIQUE NOT NULL,
109
+ parent_hash VARCHAR(40),
110
+ schema_snapshot JSONB NOT NULL,
111
+ author VARCHAR(255) NOT NULL,
112
+ message TEXT,
113
+ created_at TIMESTAMPTZ DEFAULT NOW()
114
+ );
115
+
116
+ CREATE INDEX IF NOT EXISTS idx_relq_commits_created
117
+ ON _relq_commits(created_at DESC);
118
+ `;
119
+ async function ensureCommitsTable(connection) {
120
+ const { Pool } = await Promise.resolve().then(() => __importStar(require("../../../addons/pg.js")));
121
+ const pool = new Pool({
122
+ host: connection.host,
123
+ port: connection.port || 5432,
124
+ database: connection.database,
125
+ user: connection.user,
126
+ password: connection.password,
127
+ connectionString: connection.url,
128
+ ssl: connection.ssl,
129
+ });
130
+ try {
131
+ await pool.query(CREATE_TABLE_SQL);
132
+ }
133
+ finally {
134
+ await pool.end();
135
+ }
136
+ }
137
+ async function getRemoteCommits(connection, limit = 100) {
138
+ const { Pool } = await Promise.resolve().then(() => __importStar(require("../../../addons/pg.js")));
139
+ const pool = new Pool({
140
+ host: connection.host,
141
+ port: connection.port || 5432,
142
+ database: connection.database,
143
+ user: connection.user,
144
+ password: connection.password,
145
+ connectionString: connection.url,
146
+ ssl: connection.ssl,
147
+ });
148
+ try {
149
+ await ensureCommitsTable(connection);
150
+ const result = await pool.query(`
151
+ SELECT id, hash, parent_hash, schema_snapshot, author, message, created_at
152
+ FROM _relq_commits
153
+ ORDER BY created_at DESC
154
+ LIMIT $1
155
+ `, [limit]);
156
+ return result.rows.map((row) => ({
157
+ id: row.id,
158
+ hash: row.hash,
159
+ parentHash: row.parent_hash,
160
+ schemaSnapshot: row.schema_snapshot,
161
+ author: row.author,
162
+ message: row.message,
163
+ createdAt: new Date(row.created_at),
164
+ }));
165
+ }
166
+ finally {
167
+ await pool.end();
168
+ }
169
+ }
170
+ async function getLatestRemoteCommit(connection) {
171
+ const commits = await getRemoteCommits(connection, 1);
172
+ return commits.length > 0 ? commits[0] : null;
173
+ }
174
+ async function addRemoteCommit(connection, commit, limit = 1000) {
175
+ const { Pool } = await Promise.resolve().then(() => __importStar(require("../../../addons/pg.js")));
176
+ const pool = new Pool({
177
+ host: connection.host,
178
+ port: connection.port || 5432,
179
+ database: connection.database,
180
+ user: connection.user,
181
+ password: connection.password,
182
+ connectionString: connection.url,
183
+ ssl: connection.ssl,
184
+ });
185
+ try {
186
+ await ensureCommitsTable(connection);
187
+ await pool.query(`
188
+ INSERT INTO _relq_commits (hash, parent_hash, schema_snapshot, author, message)
189
+ VALUES ($1, $2, $3, $4, $5)
190
+ ON CONFLICT (hash) DO NOTHING
191
+ `, [
192
+ commit.hash,
193
+ commit.parentHash || null,
194
+ JSON.stringify(commit.schemaSnapshot),
195
+ commit.author,
196
+ commit.message || null,
197
+ ]);
198
+ await pool.query(`
199
+ DELETE FROM _relq_commits
200
+ WHERE id NOT IN (
201
+ SELECT id FROM _relq_commits
202
+ ORDER BY created_at DESC
203
+ LIMIT $1
204
+ )
205
+ `, [limit]);
206
+ }
207
+ finally {
208
+ await pool.end();
209
+ }
210
+ }
211
+ async function createCommit(connection, schema, author, message, commitLimit = 1000, baseDir = process.cwd()) {
212
+ const hash = (0, schema_hash_1.generateSchemaHash)(schema);
213
+ const normalized = (0, schema_hash_1.normalizeSchema)(schema);
214
+ const parentHash = getLocalHead(baseDir);
215
+ const commit = {
216
+ hash,
217
+ parentHash,
218
+ schemaSnapshot: normalized,
219
+ author,
220
+ message,
221
+ createdAt: new Date(),
222
+ };
223
+ addLocalCommit(commit, commitLimit, baseDir);
224
+ await addRemoteCommit(connection, commit, commitLimit);
225
+ return commit;
226
+ }
227
+ async function checkSyncStatus(connection, baseDir = process.cwd()) {
228
+ const localHead = getLocalHead(baseDir);
229
+ const remoteCommit = await getLatestRemoteCommit(connection);
230
+ const remoteHead = remoteCommit?.hash || null;
231
+ const localCommits = getLocalCommits(baseDir);
232
+ const remoteCommits = await getRemoteCommits(connection, 100);
233
+ const inSync = localHead === remoteHead;
234
+ const localHashes = new Set(localCommits.map(c => c.hash));
235
+ const remoteHashes = new Set(remoteCommits.map(c => c.hash));
236
+ const localAhead = [...localHashes].filter(h => !remoteHashes.has(h)).length;
237
+ const remoteAhead = [...remoteHashes].filter(h => !localHashes.has(h)).length;
238
+ return { inSync, localHead, remoteHead, localAhead, remoteAhead };
239
+ }