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,333 @@
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.exportCommand = exportCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const schema_introspect_1 = require("../utils/schema-introspect.cjs");
40
+ const spinner_1 = require("../utils/spinner.cjs");
41
+ const repo_manager_1 = require("../utils/repo-manager.cjs");
42
+ const change_tracker_1 = require("../utils/change-tracker.cjs");
43
+ const sql_generator_1 = require("../utils/sql-generator.cjs");
44
+ async function exportCommand(context) {
45
+ const spinner = (0, spinner_1.createSpinner)();
46
+ const { args, flags } = context;
47
+ const projectRoot = process.cwd();
48
+ const changesOnly = Boolean(flags['changes']);
49
+ const stagedOnly = Boolean(flags['staged']);
50
+ const fromDb = Boolean(flags['db']);
51
+ if (changesOnly || stagedOnly) {
52
+ return exportChanges(projectRoot, flags, args, stagedOnly);
53
+ }
54
+ const outputPath = flags.output || args[0] || './schema-export.sql';
55
+ const absoluteOutputPath = path.resolve(outputPath);
56
+ const options = {
57
+ output: outputPath,
58
+ includeData: Boolean(flags['include-data']),
59
+ includeFunctions: Boolean(flags['include-functions']),
60
+ includeTriggers: Boolean(flags['include-triggers']),
61
+ fromDb,
62
+ };
63
+ if (fromDb) {
64
+ return exportFromDatabase(context, absoluteOutputPath, options);
65
+ }
66
+ return exportFromSnapshot(projectRoot, absoluteOutputPath, options);
67
+ }
68
+ async function exportFromSnapshot(projectRoot, absoluteOutputPath, options) {
69
+ const spinner = (0, spinner_1.createSpinner)();
70
+ if (!(0, repo_manager_1.isInitialized)(projectRoot)) {
71
+ console.log(`${spinner_1.colors.red('error:')} relq not initialized`);
72
+ console.log('');
73
+ console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq init')} ${spinner_1.colors.muted('first, or use')} ${spinner_1.colors.cyan('relq import')} ${spinner_1.colors.muted('to import a schema.')}`);
74
+ return;
75
+ }
76
+ spinner.start('Loading snapshot');
77
+ const snapshot = (0, repo_manager_1.loadSnapshot)(projectRoot);
78
+ if (!snapshot) {
79
+ spinner.fail('No snapshot found');
80
+ console.log('');
81
+ console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq import <file.sql>')} ${spinner_1.colors.muted('to import a schema first.')}`);
82
+ return;
83
+ }
84
+ spinner.succeed('Loaded snapshot');
85
+ const schema = normalizedToDbSchema(snapshot);
86
+ console.log('');
87
+ console.log(spinner_1.colors.cyan('Schema Summary:'));
88
+ console.log(` ${spinner_1.colors.green('•')} Tables: ${schema.tables.length}`);
89
+ console.log(` ${spinner_1.colors.green('•')} Enums: ${schema.enums.length}`);
90
+ console.log(` ${spinner_1.colors.green('•')} Domains: ${schema.domains.length}`);
91
+ console.log(` ${spinner_1.colors.green('•')} Composite Types: ${schema.compositeTypes.length}`);
92
+ console.log(` ${spinner_1.colors.green('•')} Sequences: ${schema.sequences?.length || 0}`);
93
+ console.log(` ${spinner_1.colors.green('•')} Extensions: ${schema.extensions.length}`);
94
+ if (snapshot.functions?.length) {
95
+ console.log(` ${spinner_1.colors.green('•')} Functions: ${snapshot.functions.length}`);
96
+ }
97
+ if (snapshot.triggers?.length) {
98
+ console.log(` ${spinner_1.colors.green('•')} Triggers: ${snapshot.triggers.length}`);
99
+ }
100
+ spinner.start('Generating SQL statements');
101
+ const sqlContent = generateFullSQL(schema, options);
102
+ spinner.succeed('Generated SQL statements');
103
+ const outputDir = path.dirname(absoluteOutputPath);
104
+ if (!fs.existsSync(outputDir)) {
105
+ fs.mkdirSync(outputDir, { recursive: true });
106
+ }
107
+ fs.writeFileSync(absoluteOutputPath, sqlContent, 'utf-8');
108
+ spinner.succeed(`Written ${options.output} (${(sqlContent.length / 1024).toFixed(1)} KB)`);
109
+ console.log('');
110
+ console.log(spinner_1.colors.green('✓ Export completed!'));
111
+ console.log(` Source: ${spinner_1.colors.muted('snapshot (local)')}`);
112
+ console.log(` Output: ${spinner_1.colors.muted(options.output || '')}`);
113
+ }
114
+ async function exportFromDatabase(context, absoluteOutputPath, options) {
115
+ const spinner = (0, spinner_1.createSpinner)();
116
+ if (!context.config || !context.config.connection) {
117
+ console.error(spinner_1.colors.red('Error: No database connection configured'));
118
+ return;
119
+ }
120
+ try {
121
+ spinner.start('Introspecting database schema');
122
+ const schema = await (0, schema_introspect_1.introspectDatabase)(context.config.connection, undefined, {
123
+ includeFunctions: options.includeFunctions,
124
+ includeTriggers: options.includeTriggers,
125
+ });
126
+ spinner.succeed(`Introspected ${schema.tables.length} tables, ${schema.enums.length} enums`);
127
+ console.log('');
128
+ console.log(spinner_1.colors.cyan('Schema Summary:'));
129
+ console.log(` ${spinner_1.colors.green('•')} Tables: ${schema.tables.length}`);
130
+ console.log(` ${spinner_1.colors.green('•')} Enums: ${schema.enums.length}`);
131
+ console.log(` ${spinner_1.colors.green('•')} Domains: ${schema.domains.length}`);
132
+ console.log(` ${spinner_1.colors.green('•')} Composite Types: ${schema.compositeTypes.length}`);
133
+ console.log(` ${spinner_1.colors.green('•')} Extensions: ${schema.extensions.length}`);
134
+ if (options.includeFunctions) {
135
+ console.log(` ${spinner_1.colors.green('•')} Functions: ${schema.functions.length}`);
136
+ }
137
+ if (options.includeTriggers) {
138
+ console.log(` ${spinner_1.colors.green('•')} Triggers: ${schema.triggers.length}`);
139
+ }
140
+ spinner.start('Generating SQL statements');
141
+ const sqlContent = generateFullSQL(schema, options);
142
+ spinner.succeed('Generated SQL statements');
143
+ const outputDir = path.dirname(absoluteOutputPath);
144
+ if (!fs.existsSync(outputDir)) {
145
+ fs.mkdirSync(outputDir, { recursive: true });
146
+ }
147
+ fs.writeFileSync(absoluteOutputPath, sqlContent, 'utf-8');
148
+ spinner.succeed(`Written ${options.output} (${(sqlContent.length / 1024).toFixed(1)} KB)`);
149
+ console.log('');
150
+ console.log(spinner_1.colors.green('✓ Export completed!'));
151
+ console.log(` Source: ${spinner_1.colors.muted('database (live)')}`);
152
+ console.log(` Output: ${spinner_1.colors.muted(options.output || '')}`);
153
+ }
154
+ catch (error) {
155
+ spinner.fail('Export failed');
156
+ throw error;
157
+ }
158
+ }
159
+ function normalizedToDbSchema(normalized) {
160
+ return {
161
+ tables: normalized.tables.map(t => ({
162
+ name: t.name,
163
+ schema: t.schema,
164
+ columns: t.columns.map(c => ({
165
+ name: c.name,
166
+ dataType: c.type,
167
+ isNullable: c.nullable,
168
+ defaultValue: c.default,
169
+ isPrimaryKey: c.primaryKey,
170
+ isUnique: c.unique,
171
+ maxLength: null,
172
+ precision: null,
173
+ scale: null,
174
+ references: c.references ? {
175
+ table: c.references.table,
176
+ column: c.references.column,
177
+ onDelete: c.references.onDelete,
178
+ onUpdate: c.references.onUpdate,
179
+ } : null,
180
+ check: c.check ?? undefined,
181
+ comment: c.comment ?? undefined,
182
+ isGenerated: c.isGenerated || false,
183
+ generationExpression: c.generationExpression ?? null,
184
+ identityGeneration: c.identity?.type ?? null,
185
+ })),
186
+ indexes: t.indexes.map(i => ({
187
+ name: i.name,
188
+ columns: i.columns,
189
+ isUnique: i.unique,
190
+ isPrimary: i.isPrimary || false,
191
+ type: i.type || 'btree',
192
+ definition: i.definition,
193
+ whereClause: i.whereClause ?? null,
194
+ expression: i.columnDefs?.find(cd => cd.expression)?.expression ?? null,
195
+ })),
196
+ constraints: t.constraints.map(c => ({
197
+ name: c.name,
198
+ type: c.type,
199
+ columns: c.columns || [],
200
+ definition: c.definition || '',
201
+ referencedTable: c.referencedTable,
202
+ referencedColumns: c.referencedColumns,
203
+ checkExpression: c.checkExpression,
204
+ })),
205
+ rowCount: 0,
206
+ isPartitioned: t.isPartitioned || t.partitionType !== undefined,
207
+ partitionType: t.partitionType,
208
+ partitionKey: t.partitionKey,
209
+ })),
210
+ enums: normalized.enums.map(e => ({
211
+ name: e.name,
212
+ values: e.values,
213
+ })),
214
+ domains: normalized.domains.map(d => ({
215
+ name: d.name,
216
+ baseType: d.baseType,
217
+ isNotNull: d.notNull,
218
+ defaultValue: d.default,
219
+ checkExpression: d.check,
220
+ })),
221
+ compositeTypes: normalized.compositeTypes.map(c => ({
222
+ name: c.name,
223
+ attributes: c.attributes,
224
+ })),
225
+ sequences: normalized.sequences.map(s => ({
226
+ name: s.name,
227
+ dataType: s.dataType,
228
+ start: s.startValue,
229
+ increment: s.increment,
230
+ minValue: s.minValue,
231
+ maxValue: s.maxValue,
232
+ cache: s.cache,
233
+ cycle: s.cycle,
234
+ ownedBy: s.ownedBy || undefined,
235
+ })),
236
+ extensions: normalized.extensions.map(e => e.name),
237
+ functions: (normalized.functions || []).map(f => ({
238
+ name: f.name,
239
+ schema: f.schema || 'public',
240
+ returnType: f.returnType,
241
+ argTypes: f.argTypes || [],
242
+ language: f.language,
243
+ definition: f.body || '',
244
+ isAggregate: false,
245
+ volatility: f.volatility || 'VOLATILE',
246
+ })),
247
+ triggers: (normalized.triggers || []).map(t => ({
248
+ name: t.name,
249
+ tableName: t.table,
250
+ event: t.events.join(' OR '),
251
+ timing: t.timing,
252
+ functionName: t.functionName,
253
+ definition: '',
254
+ isEnabled: t.isEnabled !== false,
255
+ })),
256
+ partitions: [],
257
+ policies: [],
258
+ foreignServers: [],
259
+ foreignTables: [],
260
+ };
261
+ }
262
+ async function exportChanges(projectRoot, flags, args, stagedOnly) {
263
+ console.log('');
264
+ if (!(0, repo_manager_1.isInitialized)(projectRoot)) {
265
+ console.log(`${spinner_1.colors.red('error:')} relq not initialized`);
266
+ console.log('');
267
+ console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq init')} ${spinner_1.colors.muted('first.')}`);
268
+ return;
269
+ }
270
+ let changes;
271
+ let modeLabel;
272
+ if (stagedOnly) {
273
+ changes = (0, repo_manager_1.getStagedChanges)(projectRoot);
274
+ modeLabel = 'staged';
275
+ }
276
+ else {
277
+ const staged = (0, repo_manager_1.getStagedChanges)(projectRoot);
278
+ const unstaged = (0, repo_manager_1.getUnstagedChanges)(projectRoot);
279
+ changes = [...staged, ...unstaged];
280
+ modeLabel = 'uncommitted';
281
+ }
282
+ if (changes.length === 0) {
283
+ console.log(`${spinner_1.colors.yellow('⚠')} No ${modeLabel} changes to export`);
284
+ console.log('');
285
+ if (stagedOnly) {
286
+ console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq add .')} ${spinner_1.colors.muted('to stage changes.')}`);
287
+ }
288
+ else {
289
+ console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq pull')} ${spinner_1.colors.muted('or')} ${spinner_1.colors.cyan('relq import')} ${spinner_1.colors.muted('to detect changes.')}`);
290
+ }
291
+ return;
292
+ }
293
+ const outputPath = flags.output || args[0] || `./${modeLabel}-changes.sql`;
294
+ const absoluteOutputPath = path.resolve(outputPath);
295
+ console.log(`${spinner_1.colors.cyan(`Exporting ${modeLabel} changes:`)} ${changes.length}`);
296
+ console.log('');
297
+ for (const change of changes) {
298
+ const display = (0, change_tracker_1.getChangeDisplayName)(change);
299
+ const color = change.type === 'CREATE' ? spinner_1.colors.green :
300
+ change.type === 'DROP' ? spinner_1.colors.red :
301
+ spinner_1.colors.yellow;
302
+ console.log(` ${color(display)}`);
303
+ }
304
+ console.log('');
305
+ const sortedChanges = (0, change_tracker_1.sortChangesByDependency)(changes);
306
+ const sqlContent = (0, change_tracker_1.generateCombinedSQL)(sortedChanges);
307
+ const outputDir = path.dirname(absoluteOutputPath);
308
+ if (!fs.existsSync(outputDir)) {
309
+ fs.mkdirSync(outputDir, { recursive: true });
310
+ }
311
+ fs.writeFileSync(absoluteOutputPath, sqlContent, 'utf-8');
312
+ console.log(`${spinner_1.colors.green('✓')} Exported ${changes.length} ${modeLabel} change(s) to ${outputPath}`);
313
+ console.log(`${spinner_1.colors.muted(`${(sqlContent.length / 1024).toFixed(1)} KB`)}`);
314
+ console.log('');
315
+ }
316
+ function generateFullSQL(schema, options) {
317
+ const header = `-- PostgreSQL Database Schema Export\n-- Generated: ${new Date().toISOString()}\n-- Relq CLI`;
318
+ return (0, sql_generator_1.generateFullSchemaSQL)(schema, {
319
+ includeExtensions: true,
320
+ includeEnums: true,
321
+ includeDomains: true,
322
+ includeCompositeTypes: true,
323
+ includeSequences: true,
324
+ includeTables: true,
325
+ includePartitions: true,
326
+ includeIndexes: true,
327
+ includeConstraints: true,
328
+ includeFunctions: options.includeFunctions,
329
+ includeTriggers: options.includeTriggers,
330
+ headerComment: header,
331
+ });
332
+ }
333
+ exports.default = exportCommand;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchCommand = fetchCommand;
4
+ const config_loader_1 = require("../utils/config-loader.cjs");
5
+ const env_loader_1 = require("../utils/env-loader.cjs");
6
+ const spinner_1 = require("../utils/spinner.cjs");
7
+ const repo_manager_1 = require("../utils/repo-manager.cjs");
8
+ async function fetchCommand(context) {
9
+ const { config, flags } = context;
10
+ if (!config) {
11
+ console.error('Error: No configuration found.');
12
+ process.exit(1);
13
+ }
14
+ (0, config_loader_1.requireValidConfig)(config);
15
+ const connection = config.connection;
16
+ const projectRoot = process.cwd();
17
+ console.log('');
18
+ if (!(0, repo_manager_1.isInitialized)(projectRoot)) {
19
+ console.log(`${spinner_1.colors.red('fatal:')} not a relq repository`);
20
+ console.log('');
21
+ console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq init')} ${spinner_1.colors.muted('to initialize.')}`);
22
+ return;
23
+ }
24
+ const spinner = (0, spinner_1.createSpinner)();
25
+ spinner.start(`Fetching from ${(0, env_loader_1.getConnectionDescription)(connection)}...`);
26
+ try {
27
+ await (0, repo_manager_1.ensureRemoteTable)(connection);
28
+ const remoteCommits = await (0, repo_manager_1.fetchRemoteCommits)(connection, 100);
29
+ if (remoteCommits.length === 0) {
30
+ spinner.succeed('No remote commits found');
31
+ console.log('');
32
+ console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq push')} ${spinner_1.colors.muted('to push your commits.')}`);
33
+ return;
34
+ }
35
+ let newCommits = 0;
36
+ for (const commit of remoteCommits) {
37
+ const existing = (0, repo_manager_1.loadCommit)(commit.hash, projectRoot);
38
+ if (!existing) {
39
+ (0, repo_manager_1.saveCommit)(commit, projectRoot);
40
+ newCommits++;
41
+ }
42
+ }
43
+ const latestRemote = remoteCommits[0];
44
+ (0, repo_manager_1.setFetchHead)(latestRemote.hash, projectRoot);
45
+ spinner.succeed(`Fetched ${remoteCommits.length} commits (${newCommits} new)`);
46
+ const localHead = (0, repo_manager_1.getHead)(projectRoot);
47
+ if (localHead && latestRemote.hash !== localHead) {
48
+ console.log('');
49
+ console.log(`${spinner_1.colors.muted('From')} ${(0, env_loader_1.getConnectionDescription)(connection)}`);
50
+ console.log(` ${(0, repo_manager_1.shortHash)(localHead)}..${(0, repo_manager_1.shortHash)(latestRemote.hash)} ${spinner_1.colors.muted('main -> origin/main')}`);
51
+ }
52
+ }
53
+ catch (error) {
54
+ spinner.fail('Fetch failed');
55
+ console.error(spinner_1.colors.red(`Error: ${error instanceof Error ? error.message : error}`));
56
+ process.exit(1);
57
+ }
58
+ console.log('');
59
+ }
@@ -0,0 +1,242 @@
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.generateCommand = generateCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const readline = __importStar(require("readline"));
40
+ const config_loader_1 = require("../utils/config-loader.cjs");
41
+ const schema_introspect_1 = require("../utils/schema-introspect.cjs");
42
+ const snapshot_manager_1 = require("../utils/snapshot-manager.cjs");
43
+ const schema_diff_1 = require("../utils/schema-diff.cjs");
44
+ const schema_hash_1 = require("../utils/schema-hash.cjs");
45
+ const migration_generator_1 = require("../utils/migration-generator.cjs");
46
+ const env_loader_1 = require("../utils/env-loader.cjs");
47
+ const colors = {
48
+ reset: '\x1b[0m',
49
+ bold: '\x1b[1m',
50
+ dim: '\x1b[2m',
51
+ red: '\x1b[31m',
52
+ green: '\x1b[32m',
53
+ yellow: '\x1b[33m',
54
+ cyan: '\x1b[36m',
55
+ };
56
+ function askConfirm(question, defaultYes = false) {
57
+ const rl = readline.createInterface({
58
+ input: process.stdin,
59
+ output: process.stdout,
60
+ });
61
+ const suffix = defaultYes ? '[Y/n]' : '[y/N]';
62
+ return new Promise((resolve) => {
63
+ rl.question(`${question} ${suffix}: `, (answer) => {
64
+ rl.close();
65
+ const a = answer.trim().toLowerCase();
66
+ if (!a)
67
+ resolve(defaultYes);
68
+ else
69
+ resolve(a === 'y' || a === 'yes');
70
+ });
71
+ });
72
+ }
73
+ function askInput(question) {
74
+ const rl = readline.createInterface({
75
+ input: process.stdin,
76
+ output: process.stdout,
77
+ });
78
+ return new Promise((resolve) => {
79
+ rl.question(question, (answer) => {
80
+ rl.close();
81
+ resolve(answer.trim());
82
+ });
83
+ });
84
+ }
85
+ async function generateCommand(context) {
86
+ const { config, args, flags } = context;
87
+ if (!config) {
88
+ console.error('Error: No configuration found.');
89
+ process.exit(1);
90
+ }
91
+ (0, config_loader_1.requireValidConfig)(config);
92
+ const connection = config.connection;
93
+ const migrationsDir = config.migrations?.directory || './migrations';
94
+ const snapshotPath = config.sync?.snapshot || '.relq/snapshot.json';
95
+ const ignorePatterns = config.sync?.ignore || ['_relq_*'];
96
+ const format = config.migrations?.format || 'sequential';
97
+ const message = flags['m'] || flags['message'];
98
+ const autoStage = flags['a'] === true || flags['am'] !== undefined;
99
+ const isEmpty = flags['empty'] === true;
100
+ const interactive = flags['interactive'] === true;
101
+ const noDown = flags['no-down'] === true;
102
+ const dryRun = flags['dry-run'] === true;
103
+ let migrationName = args[0] || '';
104
+ if (flags['am']) {
105
+ const amMessage = flags['am'];
106
+ if (typeof amMessage === 'string') {
107
+ migrationName = amMessage.replace(/\s+/g, '_').toLowerCase();
108
+ }
109
+ }
110
+ if (!migrationName && message) {
111
+ migrationName = message.replace(/\s+/g, '_').toLowerCase();
112
+ }
113
+ if (!migrationName && !isEmpty) {
114
+ migrationName = await askInput(`${colors.cyan}Migration name:${colors.reset} `);
115
+ if (!migrationName) {
116
+ console.error('Error: Migration name is required.');
117
+ process.exit(1);
118
+ }
119
+ }
120
+ if (isEmpty) {
121
+ migrationName = migrationName || 'empty';
122
+ await createEmptyMigration(migrationsDir, migrationName, format, dryRun);
123
+ return;
124
+ }
125
+ console.log(`${colors.bold}Generating migration...${colors.reset}`);
126
+ console.log(` Connection: ${(0, env_loader_1.getConnectionDescription)(connection)}`);
127
+ console.log('');
128
+ try {
129
+ const dbSchema = await (0, schema_introspect_1.introspectDatabase)(connection);
130
+ const snapshot = (0, snapshot_manager_1.loadSnapshot)(snapshotPath);
131
+ if (!snapshot) {
132
+ console.log(`${colors.yellow}No snapshot found.${colors.reset}`);
133
+ console.log(`Run "${colors.cyan}relq pull${colors.reset}" first to create initial snapshot.`);
134
+ return;
135
+ }
136
+ const localSchema = (0, snapshot_manager_1.snapshotToDatabaseSchema)(snapshot);
137
+ const diff = (0, schema_diff_1.diffSchemas)((0, schema_hash_1.normalizeSchema)(localSchema), (0, schema_hash_1.normalizeSchema)(dbSchema));
138
+ const filteredDiff = (0, schema_diff_1.filterDiff)(diff, ignorePatterns);
139
+ if (!filteredDiff.hasChanges) {
140
+ console.log(`${colors.green}No changes to generate.${colors.reset}`);
141
+ return;
142
+ }
143
+ const s = filteredDiff.summary;
144
+ console.log(`${colors.bold}Changes to include:${colors.reset}`);
145
+ if (s.tablesAdded > 0)
146
+ console.log(` ${colors.green}+ ${s.tablesAdded} table(s)${colors.reset}`);
147
+ if (s.tablesRemoved > 0)
148
+ console.log(` ${colors.red}- ${s.tablesRemoved} table(s)${colors.reset}`);
149
+ if (s.tablesModified > 0)
150
+ console.log(` ${colors.yellow}~ ${s.tablesModified} table(s) modified${colors.reset}`);
151
+ if (s.columnsAdded > 0)
152
+ console.log(` ${colors.green}+ ${s.columnsAdded} column(s)${colors.reset}`);
153
+ if (s.columnsRemoved > 0)
154
+ console.log(` ${colors.red}- ${s.columnsRemoved} column(s)${colors.reset}`);
155
+ if (s.columnsModified > 0)
156
+ console.log(` ${colors.yellow}~ ${s.columnsModified} column(s)${colors.reset}`);
157
+ console.log('');
158
+ if ((0, schema_diff_1.hasDestructiveChanges)(filteredDiff)) {
159
+ const tables = (0, schema_diff_1.getDestructiveTables)(filteredDiff);
160
+ console.log(`${colors.red}${colors.bold}⚠️ Destructive changes:${colors.reset}`);
161
+ for (const t of tables) {
162
+ console.log(` ${colors.red}• ${t}${colors.reset}`);
163
+ }
164
+ console.log('');
165
+ if (!autoStage) {
166
+ const proceed = await askConfirm('Include destructive changes?', false);
167
+ if (!proceed) {
168
+ console.log('Cancelled.');
169
+ return;
170
+ }
171
+ }
172
+ }
173
+ const migrationFile = (0, migration_generator_1.generateMigrationFile)(filteredDiff, migrationName, {
174
+ includeDown: !noDown,
175
+ includeComments: true,
176
+ message: message,
177
+ });
178
+ let fileName;
179
+ if (format === 'timestamp') {
180
+ fileName = (0, migration_generator_1.generateTimestampedName)(migrationName) + '.sql';
181
+ }
182
+ else {
183
+ const num = (0, migration_generator_1.getNextMigrationNumber)(migrationsDir);
184
+ fileName = `${num}_${migrationName.replace(/\s+/g, '_').toLowerCase()}.sql`;
185
+ }
186
+ const filePath = path.join(migrationsDir, fileName);
187
+ if (dryRun) {
188
+ console.log(`${colors.cyan}[dry-run] Would create: ${filePath}${colors.reset}`);
189
+ console.log('');
190
+ console.log('--- Generated SQL ---');
191
+ console.log(migrationFile.content);
192
+ console.log('--- End ---');
193
+ }
194
+ else {
195
+ if (!fs.existsSync(migrationsDir)) {
196
+ fs.mkdirSync(migrationsDir, { recursive: true });
197
+ }
198
+ fs.writeFileSync(filePath, migrationFile.content, 'utf-8');
199
+ console.log(`${colors.green}✓ Created:${colors.reset} ${filePath}`);
200
+ (0, snapshot_manager_1.saveSnapshot)(dbSchema, snapshotPath, connection.database);
201
+ console.log(`${colors.dim}Updated snapshot.${colors.reset}`);
202
+ }
203
+ console.log('');
204
+ console.log(`${colors.dim}Run "relq push" to apply this migration.${colors.reset}`);
205
+ }
206
+ catch (error) {
207
+ console.error('Error:', error instanceof Error ? error.message : error);
208
+ process.exit(1);
209
+ }
210
+ }
211
+ async function createEmptyMigration(migrationsDir, name, format, dryRun) {
212
+ let fileName;
213
+ if (format === 'timestamp') {
214
+ fileName = (0, migration_generator_1.generateTimestampedName)(name) + '.sql';
215
+ }
216
+ else {
217
+ const num = (0, migration_generator_1.getNextMigrationNumber)(migrationsDir);
218
+ fileName = `${num}_${name.replace(/\s+/g, '_').toLowerCase()}.sql`;
219
+ }
220
+ const filePath = path.join(migrationsDir, fileName);
221
+ const content = `-- Migration: ${name}
222
+ -- Generated: ${new Date().toISOString()}
223
+
224
+ -- UP
225
+ -- Add your schema changes here
226
+
227
+
228
+ -- DOWN
229
+ -- Add rollback statements here
230
+
231
+ `;
232
+ if (dryRun) {
233
+ console.log(`${colors.cyan}[dry-run] Would create: ${filePath}${colors.reset}`);
234
+ }
235
+ else {
236
+ if (!fs.existsSync(migrationsDir)) {
237
+ fs.mkdirSync(migrationsDir, { recursive: true });
238
+ }
239
+ fs.writeFileSync(filePath, content, 'utf-8');
240
+ console.log(`${colors.green}✓ Created empty migration:${colors.reset} ${filePath}`);
241
+ }
242
+ }