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,167 @@
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.migrateCommand = migrateCommand;
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 env_loader_1 = require("../utils/env-loader.cjs");
42
+ function parseMigration(content) {
43
+ const upMatch = content.match(/--\s*UP\s*\n([\s\S]*?)(?=--\s*DOWN|$)/i);
44
+ const downMatch = content.match(/--\s*DOWN\s*\n([\s\S]*?)$/i);
45
+ return {
46
+ up: upMatch?.[1]?.trim() || '',
47
+ down: downMatch?.[1]?.trim() || '',
48
+ };
49
+ }
50
+ function askConfirm(question) {
51
+ const rl = readline.createInterface({
52
+ input: process.stdin,
53
+ output: process.stdout,
54
+ });
55
+ return new Promise((resolve) => {
56
+ rl.question(`${question} [y/N]: `, (answer) => {
57
+ rl.close();
58
+ resolve(answer.trim().toLowerCase() === 'y');
59
+ });
60
+ });
61
+ }
62
+ async function migrateCommand(context) {
63
+ const { config, flags } = context;
64
+ if (!config) {
65
+ console.error('Error: No configuration found.');
66
+ process.exit(1);
67
+ }
68
+ (0, config_loader_1.requireValidConfig)(config);
69
+ const dryRun = flags['dry-run'] === true;
70
+ const force = flags['force'] === true;
71
+ const connection = config.connection;
72
+ const migrationsDir = config.migrations?.directory || './migrations';
73
+ const tableName = config.migrations?.tableName || '_relq_migrations';
74
+ console.log('🔄 Running migrations...');
75
+ console.log(` Connection: ${(0, env_loader_1.getConnectionDescription)(connection)}`);
76
+ console.log(` Migrations: ${migrationsDir}\n`);
77
+ try {
78
+ const { Pool } = await Promise.resolve().then(() => __importStar(require("../../../addons/pg.js")));
79
+ const pool = new Pool({
80
+ host: connection.host,
81
+ port: connection.port || 5432,
82
+ database: connection.database,
83
+ user: connection.user,
84
+ password: connection.password,
85
+ connectionString: connection.url,
86
+ });
87
+ try {
88
+ await pool.query(`
89
+ CREATE TABLE IF NOT EXISTS "${tableName}" (
90
+ id SERIAL PRIMARY KEY,
91
+ name VARCHAR(255) NOT NULL UNIQUE,
92
+ applied_at TIMESTAMPTZ DEFAULT NOW()
93
+ );
94
+ `);
95
+ const appliedResult = await pool.query(`
96
+ SELECT name FROM "${tableName}" ORDER BY id;
97
+ `);
98
+ const appliedMigrations = new Set(appliedResult.rows.map(r => r.name));
99
+ if (!fs.existsSync(migrationsDir)) {
100
+ console.log('No migrations directory found.');
101
+ return;
102
+ }
103
+ const migrationFiles = fs.readdirSync(migrationsDir)
104
+ .filter(f => f.endsWith('.sql'))
105
+ .sort();
106
+ const pending = migrationFiles.filter(f => !appliedMigrations.has(f));
107
+ if (pending.length === 0) {
108
+ console.log('✅ No pending migrations.');
109
+ return;
110
+ }
111
+ console.log(`📋 Pending migrations (${pending.length}):`);
112
+ for (const file of pending) {
113
+ console.log(` • ${file}`);
114
+ }
115
+ console.log('');
116
+ if (!force && !dryRun) {
117
+ if (!await askConfirm('Apply these migrations?')) {
118
+ console.log('Cancelled.');
119
+ return;
120
+ }
121
+ }
122
+ for (const file of pending) {
123
+ const filePath = path.join(migrationsDir, file);
124
+ const content = fs.readFileSync(filePath, 'utf-8');
125
+ const { up } = parseMigration(content);
126
+ if (!up) {
127
+ console.log(`⚠️ Skipping ${file} (no UP section)`);
128
+ continue;
129
+ }
130
+ if (dryRun) {
131
+ console.log(`Would apply: ${file}`);
132
+ console.log('---');
133
+ console.log(up);
134
+ console.log('---\n');
135
+ }
136
+ else {
137
+ console.log(`Applying: ${file}...`);
138
+ const client = await pool.connect();
139
+ try {
140
+ await client.query('BEGIN');
141
+ await client.query(up);
142
+ await client.query(`INSERT INTO "${tableName}" (name) VALUES ($1)`, [file]);
143
+ await client.query('COMMIT');
144
+ console.log(` ✅ Applied`);
145
+ }
146
+ catch (error) {
147
+ await client.query('ROLLBACK');
148
+ throw error;
149
+ }
150
+ finally {
151
+ client.release();
152
+ }
153
+ }
154
+ }
155
+ if (!dryRun) {
156
+ console.log(`\n✅ Applied ${pending.length} migration(s).`);
157
+ }
158
+ }
159
+ finally {
160
+ await pool.end();
161
+ }
162
+ }
163
+ catch (error) {
164
+ console.error('Error:', error instanceof Error ? error.message : error);
165
+ process.exit(1);
166
+ }
167
+ }
@@ -0,0 +1,410 @@
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.pullCommand = pullCommand;
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 fast_introspect_1 = require("../utils/fast-introspect.cjs");
42
+ const type_generator_1 = require("../utils/type-generator.cjs");
43
+ const env_loader_1 = require("../utils/env-loader.cjs");
44
+ const spinner_1 = require("../utils/spinner.cjs");
45
+ const relqignore_1 = require("../utils/relqignore.cjs");
46
+ const repo_manager_1 = require("../utils/repo-manager.cjs");
47
+ function toCamelCase(str) {
48
+ return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
49
+ }
50
+ function parseSchemaFileForSnapshot(schemaPath) {
51
+ if (!fs.existsSync(schemaPath)) {
52
+ return null;
53
+ }
54
+ const content = fs.readFileSync(schemaPath, 'utf-8');
55
+ const tables = [];
56
+ const tableRegex = /defineTable\s*\(\s*['"]([^'"]+)['"],\s*\{([\s\S]*?)\}(?:\s*,\s*\{([\s\S]*?)\})?\s*\)/g;
57
+ let tableMatch;
58
+ while ((tableMatch = tableRegex.exec(content)) !== null) {
59
+ const tableName = tableMatch[1];
60
+ const columnsBlock = tableMatch[2];
61
+ const optionsBlock = tableMatch[3] || '';
62
+ const columns = [];
63
+ const typePattern = 'varchar|text|uuid|integer|bigint|boolean|timestamp|date|jsonb|json|numeric|serial|bigserial|smallserial|tsvector|smallint|real|doublePrecision|char|inet|cidr|macaddr|macaddr8|interval|time|point|line|lseg|box|path|polygon|circle|bytea|bit|varbit|money|xml|oid';
64
+ const columnRegex = new RegExp(`^\\s*(\\w+):\\s*(${typePattern})(?:\\([^)]*\\))?((?:\\.[a-zA-Z]+\\([^)]*\\))*)`, 'gm');
65
+ let colMatch;
66
+ while ((colMatch = columnRegex.exec(columnsBlock)) !== null) {
67
+ const tsName = colMatch[1];
68
+ const type = colMatch[2];
69
+ const modifiers = colMatch[3] || '';
70
+ const explicitNameMatch = columnsBlock.match(new RegExp(`${tsName}:\\s*${type}\\s*\\(['\"]([^'"]+)['\"]`));
71
+ const dbColName = explicitNameMatch ? explicitNameMatch[1] : tsName;
72
+ columns.push({
73
+ name: dbColName,
74
+ tsName: tsName,
75
+ type: modifiers.includes('.array()') ? `${type}[]` : type,
76
+ nullable: !modifiers.includes('.notNull()') && !modifiers.includes('.primaryKey()'),
77
+ default: null,
78
+ primaryKey: modifiers.includes('.primaryKey()'),
79
+ unique: modifiers.includes('.unique()'),
80
+ });
81
+ }
82
+ const indexes = [];
83
+ const indexRegex = /index\s*\(\s*['"]([^'"]+)['"]\s*\)\.on\(([^)]+)\)/g;
84
+ let idxMatch;
85
+ while ((idxMatch = indexRegex.exec(optionsBlock)) !== null) {
86
+ const indexName = idxMatch[1];
87
+ const indexCols = idxMatch[2].split(',').map(c => c.trim().replace(/table\.\s*/, ''));
88
+ const isUnique = optionsBlock.includes(`index('${indexName}')`) &&
89
+ optionsBlock.substring(optionsBlock.indexOf(`index('${indexName}')`)).split('\n')[0].includes('.unique()');
90
+ indexes.push({
91
+ name: indexName,
92
+ columns: indexCols,
93
+ unique: isUnique,
94
+ type: 'btree',
95
+ });
96
+ }
97
+ const hasPartition = optionsBlock.includes('partitionBy');
98
+ let partitionType;
99
+ let partitionKey = [];
100
+ let partitions = [];
101
+ if (hasPartition) {
102
+ const partitionByMatch = optionsBlock.match(/partitionBy:\s*\([^)]+\)\s*=>\s*\w+\.(list|range|hash)\(([^)]+)\)/i);
103
+ if (partitionByMatch) {
104
+ partitionType = partitionByMatch[1].toUpperCase();
105
+ const colMatch = partitionByMatch[2].match(/table\.(\w+)/);
106
+ if (colMatch) {
107
+ partitionKey = [colMatch[1]];
108
+ }
109
+ }
110
+ const partitionsMatch = optionsBlock.match(/partitions:\s*\(partition\)\s*=>\s*\[([\s\S]*?)\]/);
111
+ if (partitionsMatch) {
112
+ const partitionsBlock = partitionsMatch[1];
113
+ const partitionRegex = /partition\s*\(\s*['"]([^'"]+)['"]\s*\)\.([^,\n]+)/g;
114
+ let pMatch;
115
+ while ((pMatch = partitionRegex.exec(partitionsBlock)) !== null) {
116
+ partitions.push({
117
+ name: pMatch[1],
118
+ bound: pMatch[2].trim(),
119
+ });
120
+ }
121
+ }
122
+ }
123
+ tables.push({
124
+ name: tableName,
125
+ schema: 'public',
126
+ columns,
127
+ indexes,
128
+ constraints: [],
129
+ ...(hasPartition && {
130
+ isPartitioned: true,
131
+ partitionType,
132
+ partitionKey,
133
+ partitions,
134
+ }),
135
+ });
136
+ }
137
+ const enums = [];
138
+ const enumRegex = /pgEnum\s*\(\s*['"]([^'"]+)['"]]/g;
139
+ let enumMatch;
140
+ while ((enumMatch = enumRegex.exec(content)) !== null) {
141
+ enums.push(enumMatch[1]);
142
+ }
143
+ return {
144
+ tables,
145
+ enums: [],
146
+ domains: [],
147
+ compositeTypes: [],
148
+ sequences: [],
149
+ collations: [],
150
+ functions: [],
151
+ triggers: [],
152
+ extensions: [],
153
+ };
154
+ }
155
+ function askConfirm(question, defaultYes = true) {
156
+ const suffix = defaultYes ? spinner_1.colors.muted('[Y/n]') : spinner_1.colors.muted('[y/N]');
157
+ const rl = readline.createInterface({
158
+ input: process.stdin,
159
+ output: process.stdout,
160
+ });
161
+ return new Promise((resolve) => {
162
+ rl.question(`${question} ${suffix}: `, (answer) => {
163
+ rl.close();
164
+ const a = answer.trim().toLowerCase();
165
+ if (!a)
166
+ resolve(defaultYes);
167
+ else
168
+ resolve(a === 'y' || a === 'yes');
169
+ });
170
+ });
171
+ }
172
+ async function pullCommand(context) {
173
+ const { config, flags } = context;
174
+ if (!config) {
175
+ console.error('Error: No configuration found.');
176
+ process.exit(1);
177
+ }
178
+ (0, config_loader_1.requireValidConfig)(config);
179
+ const connection = config.connection;
180
+ const projectRoot = process.cwd();
181
+ const force = flags['force'] === true;
182
+ const dryRun = flags['dry-run'] === true;
183
+ const author = config.author || 'Relq CLI';
184
+ const schemaPath = typeof config.schema === 'string' ? config.schema : './db/schema.ts';
185
+ const includeFunctions = config.generate?.includeFunctions ?? false;
186
+ const includeTriggers = config.generate?.includeTriggers ?? false;
187
+ const spinner = (0, spinner_1.createSpinner)();
188
+ const startTime = Date.now();
189
+ console.log('');
190
+ if (!(0, repo_manager_1.isInitialized)(projectRoot)) {
191
+ (0, repo_manager_1.initRepository)(projectRoot);
192
+ console.log(`${spinner_1.colors.cyan('ℹ')} Initialized .relq folder`);
193
+ }
194
+ if (!force) {
195
+ const stagedChanges = (0, repo_manager_1.getStagedChanges)(projectRoot);
196
+ const unstagedChanges = (0, repo_manager_1.getUnstagedChanges)(projectRoot);
197
+ if (stagedChanges.length > 0 || unstagedChanges.length > 0) {
198
+ const hasUnstaged = unstagedChanges.length > 0;
199
+ const hasStaged = stagedChanges.length > 0;
200
+ if (hasUnstaged && hasStaged) {
201
+ console.error(spinner_1.colors.red('Error: You have uncommitted and unstaged changes.'));
202
+ }
203
+ else if (hasStaged) {
204
+ console.error(spinner_1.colors.red('Error: You have uncommitted changes.'));
205
+ }
206
+ else {
207
+ console.error(spinner_1.colors.red('Error: You have unstaged changes.'));
208
+ }
209
+ console.log('');
210
+ if (hasStaged) {
211
+ console.log(` ${spinner_1.colors.green('Staged (uncommitted):')} ${stagedChanges.length} change(s)`);
212
+ }
213
+ if (hasUnstaged) {
214
+ console.log(` ${spinner_1.colors.red('Unstaged:')} ${unstagedChanges.length} change(s)`);
215
+ }
216
+ console.log('');
217
+ if (hasUnstaged && !hasStaged) {
218
+ console.log('Please stage and commit, or reset your changes:');
219
+ console.log(` ${spinner_1.colors.cyan('relq add .')} - stage all changes`);
220
+ console.log(` ${spinner_1.colors.cyan('relq commit -m "message"')} - then commit`);
221
+ }
222
+ else {
223
+ console.log('Please commit or reset your changes:');
224
+ console.log(` ${spinner_1.colors.cyan('relq commit -m "message"')} - commit staged changes`);
225
+ }
226
+ console.log(` ${spinner_1.colors.cyan('relq reset')} - discard all changes`);
227
+ console.log(` ${spinner_1.colors.cyan('relq pull --force')} - force pull (overwrites local changes)`);
228
+ return;
229
+ }
230
+ }
231
+ try {
232
+ spinner.start('Connecting to database...');
233
+ await (0, repo_manager_1.ensureRemoteTable)(connection);
234
+ spinner.succeed(`Connected to ${spinner_1.colors.cyan((0, env_loader_1.getConnectionDescription)(connection))}`);
235
+ spinner.start('Fetching remote commits...');
236
+ const remoteCommits = await (0, repo_manager_1.fetchRemoteCommits)(connection, 100);
237
+ const remoteHead = remoteCommits.length > 0 ? remoteCommits[0].hash : null;
238
+ if (remoteHead) {
239
+ (0, repo_manager_1.setFetchHead)(remoteHead, projectRoot);
240
+ }
241
+ spinner.succeed(`Fetched ${remoteCommits.length} remote commits`);
242
+ spinner.start('Introspecting database...');
243
+ const dbSchema = await (0, fast_introspect_1.fastIntrospectDatabase)(connection, undefined, {
244
+ includeFunctions,
245
+ includeTriggers,
246
+ });
247
+ spinner.succeed(`Found ${dbSchema.tables.length} tables`);
248
+ const ignorePatterns = (0, relqignore_1.getIgnorePatterns)(projectRoot);
249
+ const filteredTables = (0, relqignore_1.filterIgnored)(dbSchema.tables, ignorePatterns);
250
+ const localHead = (0, repo_manager_1.getHead)(projectRoot);
251
+ const localSnapshot = (0, repo_manager_1.loadSnapshot)(projectRoot);
252
+ const schemaExists = fs.existsSync(schemaPath);
253
+ const currentSchema = {
254
+ tables: filteredTables.map(t => ({
255
+ name: t.name,
256
+ schema: t.schema,
257
+ columns: t.columns.map(c => ({
258
+ name: c.name,
259
+ tsName: toCamelCase(c.name),
260
+ type: c.dataType,
261
+ nullable: c.isNullable,
262
+ default: c.defaultValue,
263
+ primaryKey: c.isPrimaryKey,
264
+ unique: c.isUnique,
265
+ })),
266
+ indexes: t.indexes.map(i => ({
267
+ name: i.name,
268
+ columns: i.columns,
269
+ unique: i.isUnique,
270
+ type: i.type,
271
+ })),
272
+ constraints: t.constraints.map(c => ({
273
+ name: c.name,
274
+ type: c.type,
275
+ definition: c.definition,
276
+ })),
277
+ })),
278
+ enums: dbSchema.enums.map(e => ({
279
+ name: e.name,
280
+ schema: 'public',
281
+ values: e.values,
282
+ })),
283
+ domains: dbSchema.domains.map(d => ({
284
+ name: d.name,
285
+ schema: 'public',
286
+ baseType: d.baseType,
287
+ notNull: d.isNotNull || false,
288
+ default: d.defaultValue || null,
289
+ check: d.checkExpression || null,
290
+ })),
291
+ compositeTypes: dbSchema.compositeTypes.map(c => ({
292
+ name: c.name,
293
+ schema: 'public',
294
+ attributes: c.attributes,
295
+ })),
296
+ sequences: [],
297
+ collations: [],
298
+ functions: dbSchema.functions.map(f => ({
299
+ name: f.name,
300
+ returnType: f.returnType,
301
+ argTypes: f.argTypes,
302
+ language: f.language,
303
+ })),
304
+ triggers: dbSchema.triggers.map(t => ({
305
+ name: t.name,
306
+ table: t.tableName,
307
+ events: [t.event],
308
+ timing: t.timing,
309
+ forEach: 'STATEMENT',
310
+ functionName: t.functionName || '',
311
+ })),
312
+ extensions: dbSchema.extensions.map(ext => ({ name: ext })),
313
+ };
314
+ console.log('');
315
+ if (schemaExists && localSnapshot && !force) {
316
+ const localTables = new Set(localSnapshot.tables.map(t => t.name));
317
+ const remoteTables = new Set(currentSchema.tables.map(t => t.name));
318
+ const added = [...remoteTables].filter(t => !localTables.has(t));
319
+ const removed = [...localTables].filter(t => !remoteTables.has(t));
320
+ if (added.length === 0 && removed.length === 0) {
321
+ console.log(`${spinner_1.colors.green('✓')} Already up to date with remote`);
322
+ console.log('');
323
+ return;
324
+ }
325
+ console.log(`${spinner_1.colors.yellow('Remote has changes:')}`);
326
+ if (added.length > 0) {
327
+ console.log(` ${spinner_1.colors.green(`+${added.length}`)} tables added`);
328
+ }
329
+ if (removed.length > 0) {
330
+ console.log(` ${spinner_1.colors.red(`-${removed.length}`)} tables removed`);
331
+ }
332
+ console.log('');
333
+ if (!dryRun) {
334
+ const proceed = await askConfirm(`${spinner_1.colors.bold('Pull these changes?')}`, true);
335
+ if (!proceed) {
336
+ console.log('');
337
+ console.log(`${spinner_1.colors.muted('Cancelled.')}`);
338
+ return;
339
+ }
340
+ console.log('');
341
+ }
342
+ }
343
+ else if (schemaExists && !force) {
344
+ console.log(`${spinner_1.colors.yellow('⚠')} ${spinner_1.colors.bold('Local schema exists but not tracked')}`);
345
+ console.log('');
346
+ console.log(` ${spinner_1.colors.cyan(schemaPath)}`);
347
+ console.log('');
348
+ if (!dryRun) {
349
+ const proceed = await askConfirm(`${spinner_1.colors.bold('Overwrite local schema?')}`, false);
350
+ if (!proceed) {
351
+ console.log('');
352
+ console.log(`${spinner_1.colors.muted('Cancelled. Run')} ${spinner_1.colors.cyan('relq status')} ${spinner_1.colors.muted('to see current state.')}`);
353
+ return;
354
+ }
355
+ console.log('');
356
+ }
357
+ }
358
+ else if (!schemaExists) {
359
+ console.log(`${spinner_1.colors.cyan('ℹ')} ${spinner_1.colors.bold('First pull - creating schema')}`);
360
+ console.log('');
361
+ console.log(`📊 ${spinner_1.colors.bold('Schema Summary')}`);
362
+ console.log(` ${spinner_1.colors.green(String(filteredTables.length))} tables`);
363
+ console.log(` ${spinner_1.colors.green(String(dbSchema.extensions.length))} extensions`);
364
+ console.log('');
365
+ }
366
+ if (dryRun) {
367
+ console.log(`${spinner_1.colors.yellow('⚠')} Dry run - no files written`);
368
+ console.log('');
369
+ return;
370
+ }
371
+ spinner.start('Generating TypeScript schema...');
372
+ const typescript = (0, type_generator_1.generateTypeScript)(dbSchema, {
373
+ includeDefineTables: true,
374
+ includeSchema: true,
375
+ includeIndexes: true,
376
+ includeFunctions,
377
+ includeTriggers,
378
+ camelCase: config.generate?.camelCase ?? true,
379
+ });
380
+ spinner.succeed('Generated TypeScript schema');
381
+ const schemaDir = path.dirname(schemaPath);
382
+ if (!fs.existsSync(schemaDir)) {
383
+ fs.mkdirSync(schemaDir, { recursive: true });
384
+ }
385
+ spinner.start('Writing schema file...');
386
+ fs.writeFileSync(schemaPath, typescript, 'utf-8');
387
+ const fileSize = Buffer.byteLength(typescript, 'utf8');
388
+ spinner.succeed(`Written ${spinner_1.colors.cyan(schemaPath)} ${spinner_1.colors.muted(`(${(0, spinner_1.formatBytes)(fileSize)})`)}`);
389
+ const snapshotFromFile = parseSchemaFileForSnapshot(schemaPath);
390
+ if (snapshotFromFile) {
391
+ (0, repo_manager_1.saveSnapshot)(snapshotFromFile, projectRoot);
392
+ }
393
+ else {
394
+ (0, repo_manager_1.saveSnapshot)(currentSchema, projectRoot);
395
+ }
396
+ spinner.start('Creating commit...');
397
+ const message = localHead ? 'Pulled schema from database' : 'Initial schema pull';
398
+ const commit = (0, repo_manager_1.createCommit)(currentSchema, author, message, projectRoot);
399
+ spinner.succeed(`Created commit ${spinner_1.colors.yellow((0, repo_manager_1.shortHash)(commit.hash))}`);
400
+ const duration = Date.now() - startTime;
401
+ console.log('');
402
+ console.log(`${spinner_1.colors.green('✓')} Pull completed in ${spinner_1.colors.cyan(`${duration}ms`)}`);
403
+ console.log('');
404
+ }
405
+ catch (error) {
406
+ spinner.fail('Pull failed');
407
+ console.error(spinner_1.colors.red(`Error: ${error instanceof Error ? error.message : error}`));
408
+ process.exit(1);
409
+ }
410
+ }