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,165 @@
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.pushCommand = pushCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const config_loader_1 = require("../utils/config-loader.cjs");
40
+ const env_loader_1 = require("../utils/env-loader.cjs");
41
+ const spinner_1 = require("../utils/spinner.cjs");
42
+ const repo_manager_1 = require("../utils/repo-manager.cjs");
43
+ async function pushCommand(context) {
44
+ const { config, flags } = context;
45
+ if (!config) {
46
+ console.error('Error: No configuration found.');
47
+ process.exit(1);
48
+ }
49
+ (0, config_loader_1.requireValidConfig)(config);
50
+ const connection = config.connection;
51
+ const projectRoot = process.cwd();
52
+ const force = flags['force'] === true;
53
+ const dryRun = flags['dry-run'] === true;
54
+ const applySQL = flags['apply'] === true;
55
+ console.log('');
56
+ if (!(0, repo_manager_1.isInitialized)(projectRoot)) {
57
+ console.log(`${spinner_1.colors.red('fatal:')} not a relq repository`);
58
+ console.log('');
59
+ console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq init')} ${spinner_1.colors.muted('to initialize.')}`);
60
+ return;
61
+ }
62
+ const localHead = (0, repo_manager_1.getHead)(projectRoot);
63
+ if (!localHead) {
64
+ console.log(`${spinner_1.colors.red('error:')} no commits to push`);
65
+ console.log('');
66
+ console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq commit -m "message"')} ${spinner_1.colors.muted('to create a commit.')}`);
67
+ return;
68
+ }
69
+ const spinner = (0, spinner_1.createSpinner)();
70
+ try {
71
+ spinner.start('Connecting to remote...');
72
+ await (0, repo_manager_1.ensureRemoteTable)(connection);
73
+ spinner.succeed(`Connected to ${spinner_1.colors.cyan((0, env_loader_1.getConnectionDescription)(connection))}`);
74
+ spinner.start('Checking remote...');
75
+ const remoteCommits = await (0, repo_manager_1.fetchRemoteCommits)(connection, 100);
76
+ const remoteHead = remoteCommits.length > 0 ? remoteCommits[0].hash : null;
77
+ spinner.stop();
78
+ const localCommits = (0, repo_manager_1.getAllCommits)(projectRoot);
79
+ const remoteHashes = new Set(remoteCommits.map(c => c.hash));
80
+ const localHashes = new Set(localCommits.map(c => c.hash));
81
+ const toPush = localCommits.filter(c => !remoteHashes.has(c.hash));
82
+ if (toPush.length === 0) {
83
+ console.log(`${spinner_1.colors.green('✓')} Everything up-to-date`);
84
+ console.log('');
85
+ return;
86
+ }
87
+ const remoteMissing = remoteCommits.filter(c => !localHashes.has(c.hash));
88
+ if (remoteMissing.length > 0 && !force) {
89
+ console.log(`${spinner_1.colors.red('error:')} failed to push`);
90
+ console.log('');
91
+ console.log(`${spinner_1.colors.yellow('hint:')} Updates were rejected because the remote contains work that you do not have locally.`);
92
+ console.log(`${spinner_1.colors.yellow('hint:')} Run ${spinner_1.colors.cyan('relq pull')} to integrate the remote changes before pushing.`);
93
+ console.log('');
94
+ return;
95
+ }
96
+ console.log(`Pushing to ${spinner_1.colors.cyan((0, env_loader_1.getConnectionDescription)(connection))}`);
97
+ console.log('');
98
+ if (dryRun) {
99
+ console.log(`${spinner_1.colors.yellow('Would push')} ${toPush.length} commit(s):`);
100
+ for (const commit of toPush.slice(0, 5)) {
101
+ console.log(` ${spinner_1.colors.yellow((0, repo_manager_1.shortHash)(commit.hash))} ${commit.message}`);
102
+ }
103
+ if (toPush.length > 5) {
104
+ console.log(` ${spinner_1.colors.muted(`... and ${toPush.length - 5} more`)}`);
105
+ }
106
+ console.log('');
107
+ return;
108
+ }
109
+ const commitsToProcess = [...toPush].reverse();
110
+ spinner.start(`Pushing ${toPush.length} commit(s)...`);
111
+ for (const commit of commitsToProcess) {
112
+ await (0, repo_manager_1.pushCommit)(connection, commit);
113
+ }
114
+ spinner.succeed(`Pushed ${toPush.length} commit(s)`);
115
+ if (applySQL) {
116
+ spinner.start('Applying SQL changes...');
117
+ const pg = await Promise.resolve().then(() => __importStar(require("../../../addons/pg.js")));
118
+ const client = new pg.Client({
119
+ host: connection.host,
120
+ port: connection.port,
121
+ database: connection.database,
122
+ user: connection.user,
123
+ password: connection.password,
124
+ });
125
+ try {
126
+ await client.connect();
127
+ let sqlExecuted = 0;
128
+ for (const commit of commitsToProcess) {
129
+ const commitPath = path.join(projectRoot, '.relq', 'commits', `${commit.hash}.json`);
130
+ if (fs.existsSync(commitPath)) {
131
+ const enhancedCommit = JSON.parse(fs.readFileSync(commitPath, 'utf-8'));
132
+ if (enhancedCommit.sql) {
133
+ await client.query(enhancedCommit.sql);
134
+ sqlExecuted++;
135
+ }
136
+ }
137
+ }
138
+ spinner.succeed(`Applied SQL from ${sqlExecuted} commit(s)`);
139
+ }
140
+ finally {
141
+ await client.end();
142
+ }
143
+ }
144
+ const oldHash = remoteHead ? (0, repo_manager_1.shortHash)(remoteHead) : '(none)';
145
+ const newHash = (0, repo_manager_1.shortHash)(localHead);
146
+ console.log(` ${oldHash}..${newHash} ${spinner_1.colors.muted('main -> main')}`);
147
+ if (!applySQL && toPush.some(c => {
148
+ const commitPath = path.join(projectRoot, '.relq', 'commits', `${c.hash}.json`);
149
+ if (fs.existsSync(commitPath)) {
150
+ const ec = JSON.parse(fs.readFileSync(commitPath, 'utf-8'));
151
+ return ec.sql && ec.sql.trim().length > 0;
152
+ }
153
+ return false;
154
+ })) {
155
+ console.log('');
156
+ console.log(`${spinner_1.colors.muted('Use')} ${spinner_1.colors.cyan('relq push --apply')} ${spinner_1.colors.muted('to also execute SQL against database.')}`);
157
+ }
158
+ }
159
+ catch (error) {
160
+ spinner.fail('Push failed');
161
+ console.error(spinner_1.colors.red(`Error: ${error instanceof Error ? error.message : error}`));
162
+ process.exit(1);
163
+ }
164
+ console.log('');
165
+ }
@@ -0,0 +1,169 @@
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.rollbackCommand = rollbackCommand;
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
+ const colors = {
43
+ reset: '\x1b[0m',
44
+ bold: '\x1b[1m',
45
+ dim: '\x1b[2m',
46
+ red: '\x1b[31m',
47
+ green: '\x1b[32m',
48
+ yellow: '\x1b[33m',
49
+ cyan: '\x1b[36m',
50
+ };
51
+ function parseMigration(content) {
52
+ const upMatch = content.match(/--\s*UP\s*\n([\s\S]*?)(?=--\s*DOWN|$)/i);
53
+ const downMatch = content.match(/--\s*DOWN\s*\n([\s\S]*?)$/i);
54
+ return {
55
+ up: upMatch?.[1]?.trim() || '',
56
+ down: downMatch?.[1]?.trim() || '',
57
+ };
58
+ }
59
+ function askConfirm(question) {
60
+ const rl = readline.createInterface({
61
+ input: process.stdin,
62
+ output: process.stdout,
63
+ });
64
+ return new Promise((resolve) => {
65
+ rl.question(`${question} [y/N]: `, (answer) => {
66
+ rl.close();
67
+ resolve(answer.trim().toLowerCase() === 'y');
68
+ });
69
+ });
70
+ }
71
+ async function rollbackCommand(context) {
72
+ const { config, args, flags } = context;
73
+ if (!config) {
74
+ console.error('Error: No configuration found.');
75
+ process.exit(1);
76
+ }
77
+ (0, config_loader_1.requireValidConfig)(config);
78
+ const connection = config.connection;
79
+ const migrationsDir = config.migrations?.directory || './migrations';
80
+ const tableName = config.migrations?.tableName || '_relq_migrations';
81
+ const count = parseInt(args[0]) || 1;
82
+ const dryRun = flags['dry-run'] === true;
83
+ const force = flags['force'] === true;
84
+ console.log(`${colors.bold}Rolling back ${count} migration(s)...${colors.reset}`);
85
+ console.log(` Connection: ${(0, env_loader_1.getConnectionDescription)(connection)}`);
86
+ console.log('');
87
+ try {
88
+ const { Pool } = await Promise.resolve().then(() => __importStar(require("../../../addons/pg.js")));
89
+ const pool = new Pool({
90
+ host: connection.host,
91
+ port: connection.port || 5432,
92
+ database: connection.database,
93
+ user: connection.user,
94
+ password: connection.password,
95
+ connectionString: connection.url,
96
+ });
97
+ try {
98
+ const result = await pool.query(`
99
+ SELECT name FROM "${tableName}"
100
+ ORDER BY id DESC
101
+ LIMIT $1;
102
+ `, [count]);
103
+ if (result.rows.length === 0) {
104
+ console.log(`${colors.yellow}No migrations to rollback.${colors.reset}`);
105
+ return;
106
+ }
107
+ const toRollback = result.rows.map(r => r.name);
108
+ console.log(`${colors.bold}Migrations to rollback:${colors.reset}`);
109
+ for (const name of toRollback) {
110
+ console.log(` ${colors.red}• ${name}${colors.reset}`);
111
+ }
112
+ console.log('');
113
+ if (!force && !dryRun) {
114
+ const proceed = await askConfirm(`${colors.red}This will undo ${toRollback.length} migration(s). Continue?${colors.reset}`);
115
+ if (!proceed) {
116
+ console.log('Cancelled.');
117
+ return;
118
+ }
119
+ }
120
+ for (const name of toRollback) {
121
+ const filePath = path.join(migrationsDir, name);
122
+ if (!fs.existsSync(filePath)) {
123
+ console.log(`${colors.yellow}⚠️ Migration file not found: ${name}${colors.reset}`);
124
+ continue;
125
+ }
126
+ const content = fs.readFileSync(filePath, 'utf-8');
127
+ const { down } = parseMigration(content);
128
+ if (!down) {
129
+ console.log(`${colors.yellow}⚠️ No DOWN section in: ${name}${colors.reset}`);
130
+ continue;
131
+ }
132
+ if (dryRun) {
133
+ console.log(`${colors.cyan}[dry-run] Would rollback: ${name}${colors.reset}`);
134
+ console.log(`${colors.dim}${down}${colors.reset}`);
135
+ console.log('');
136
+ }
137
+ else {
138
+ console.log(`Rolling back: ${name}...`);
139
+ const client = await pool.connect();
140
+ try {
141
+ await client.query('BEGIN');
142
+ await client.query(down);
143
+ await client.query(`DELETE FROM "${tableName}" WHERE name = $1`, [name]);
144
+ await client.query('COMMIT');
145
+ console.log(` ${colors.green}✓ Rolled back${colors.reset}`);
146
+ }
147
+ catch (error) {
148
+ await client.query('ROLLBACK');
149
+ throw error;
150
+ }
151
+ finally {
152
+ client.release();
153
+ }
154
+ }
155
+ }
156
+ if (!dryRun) {
157
+ console.log('');
158
+ console.log(`${colors.green}✓ Rolled back ${toRollback.length} migration(s).${colors.reset}`);
159
+ }
160
+ }
161
+ finally {
162
+ await pool.end();
163
+ }
164
+ }
165
+ catch (error) {
166
+ console.error('Error:', error instanceof Error ? error.message : error);
167
+ process.exit(1);
168
+ }
169
+ }
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.statusCommand = statusCommand;
4
+ const env_loader_1 = require("../utils/env-loader.cjs");
5
+ const spinner_1 = require("../utils/spinner.cjs");
6
+ const repo_manager_1 = require("../utils/repo-manager.cjs");
7
+ async function statusCommand(context) {
8
+ const { config, flags } = context;
9
+ const projectRoot = process.cwd();
10
+ const connection = config?.connection;
11
+ console.log('');
12
+ if (!(0, repo_manager_1.isInitialized)(projectRoot)) {
13
+ console.log(`${spinner_1.colors.red('fatal:')} not a relq repository`);
14
+ console.log('');
15
+ console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq init')} ${spinner_1.colors.muted('to initialize.')}`);
16
+ console.log('');
17
+ return;
18
+ }
19
+ const head = (0, repo_manager_1.getHead)(projectRoot);
20
+ const staged = (0, repo_manager_1.getStagedChanges)(projectRoot);
21
+ const unstaged = (0, repo_manager_1.getUnstagedChanges)(projectRoot);
22
+ if (head) {
23
+ const headCommit = (0, repo_manager_1.loadCommit)(head, projectRoot);
24
+ console.log(`On commit ${spinner_1.colors.yellow((0, repo_manager_1.shortHash)(head))}`);
25
+ if (headCommit) {
26
+ console.log(`${spinner_1.colors.muted(`"${headCommit.message}"`)}`);
27
+ }
28
+ }
29
+ else {
30
+ console.log(`${spinner_1.colors.muted('No commits yet')}`);
31
+ }
32
+ if (connection) {
33
+ console.log(`Database: ${spinner_1.colors.cyan((0, env_loader_1.getConnectionDescription)(connection))}`);
34
+ }
35
+ console.log('');
36
+ if (staged.length > 0) {
37
+ console.log(`${spinner_1.colors.green('Changes to be committed:')}`);
38
+ console.log(` ${spinner_1.colors.muted('(use "relq restore --staged <name>..." to unstage)')}`);
39
+ console.log('');
40
+ displayChanges(staged, ' ');
41
+ console.log('');
42
+ }
43
+ if (unstaged.length > 0) {
44
+ console.log(`${spinner_1.colors.red('Changes not staged for commit:')}`);
45
+ console.log(` ${spinner_1.colors.muted('(use "relq add <name>..." to stage)')}`);
46
+ console.log(` ${spinner_1.colors.muted('(use "relq restore <name>..." to discard)')}`);
47
+ console.log('');
48
+ displayChanges(unstaged, ' ');
49
+ console.log('');
50
+ }
51
+ if (staged.length === 0 && unstaged.length === 0) {
52
+ console.log(`${spinner_1.colors.green('nothing to commit, working tree clean')}`);
53
+ console.log('');
54
+ console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq pull')} ${spinner_1.colors.muted('to sync with database.')}`);
55
+ console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq import <file>')} ${spinner_1.colors.muted('to import SQL schema.')}`);
56
+ }
57
+ else {
58
+ if (staged.length > 0 && unstaged.length === 0) {
59
+ console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq commit -m "message"')} ${spinner_1.colors.muted('to commit.')}`);
60
+ }
61
+ else if (unstaged.length > 0) {
62
+ console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq add .')} ${spinner_1.colors.muted('to stage all changes.')}`);
63
+ }
64
+ }
65
+ console.log('');
66
+ }
67
+ function displayChanges(changes, indent = '') {
68
+ const byType = new Map();
69
+ for (const change of changes) {
70
+ const key = change.objectType;
71
+ if (!byType.has(key)) {
72
+ byType.set(key, []);
73
+ }
74
+ byType.get(key).push(change);
75
+ }
76
+ const order = ['TABLE', 'COLUMN', 'INDEX', 'CONSTRAINT', 'PRIMARY_KEY', 'FOREIGN_KEY', 'CHECK', 'EXCLUSION', 'EXTENSION', 'ENUM', 'DOMAIN', 'FUNCTION', 'TRIGGER', 'VIEW'];
77
+ const sorted = [...byType.entries()].sort((a, b) => {
78
+ const aIdx = order.indexOf(a[0]);
79
+ const bIdx = order.indexOf(b[0]);
80
+ return (aIdx === -1 ? 999 : aIdx) - (bIdx === -1 ? 999 : bIdx);
81
+ });
82
+ for (const [type, typeChanges] of sorted) {
83
+ for (const change of typeChanges) {
84
+ const color = change.type === 'CREATE' ? spinner_1.colors.green :
85
+ change.type === 'DROP' ? spinner_1.colors.red :
86
+ spinner_1.colors.yellow;
87
+ const typeLabel = getTypeLabel(change.type, change.objectType);
88
+ const objectName = change.parentName
89
+ ? `${change.parentName}.${change.objectName}`
90
+ : change.objectName;
91
+ console.log(`${indent}${color(typeLabel.padEnd(16))} ${objectName}`);
92
+ }
93
+ }
94
+ }
95
+ function getTypeLabel(changeType, objectType) {
96
+ const objectName = objectType.toLowerCase().replace(/_/g, ' ');
97
+ switch (changeType) {
98
+ case 'CREATE':
99
+ return `new ${objectName}:`;
100
+ case 'DROP':
101
+ return `deleted:`;
102
+ case 'ALTER':
103
+ return `modified:`;
104
+ case 'RENAME':
105
+ return `renamed:`;
106
+ default:
107
+ return `${changeType.toLowerCase()}:`;
108
+ }
109
+ }
110
+ exports.default = statusCommand;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.syncCommand = syncCommand;
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
+ const pull_1 = require("./pull.cjs");
9
+ async function syncCommand(context) {
10
+ const { config, flags } = context;
11
+ if (!config) {
12
+ console.error('Error: No configuration found.');
13
+ process.exit(1);
14
+ }
15
+ (0, config_loader_1.requireValidConfig)(config);
16
+ const connection = config.connection;
17
+ const projectRoot = process.cwd();
18
+ console.log('');
19
+ if (!(0, repo_manager_1.isInitialized)(projectRoot)) {
20
+ console.log(`${spinner_1.colors.red('fatal:')} not a relq repository`);
21
+ console.log('');
22
+ console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq init')} ${spinner_1.colors.muted('to initialize.')}`);
23
+ return;
24
+ }
25
+ const spinner = (0, spinner_1.createSpinner)();
26
+ try {
27
+ spinner.start('Checking sync status...');
28
+ const status = await (0, repo_manager_1.getRepoStatus)(connection, projectRoot);
29
+ spinner.stop();
30
+ console.log(`On database: ${spinner_1.colors.cyan((0, env_loader_1.getConnectionDescription)(connection))}`);
31
+ console.log('');
32
+ if (status.behindBy > 0) {
33
+ console.log(`${spinner_1.colors.yellow('↓')} ${status.behindBy} commit(s) to pull`);
34
+ }
35
+ if (status.aheadBy > 0) {
36
+ console.log(`${spinner_1.colors.green('↑')} ${status.aheadBy} commit(s) to push`);
37
+ }
38
+ if (status.behindBy === 0 && status.aheadBy === 0) {
39
+ console.log(`${spinner_1.colors.green('✓')} Already in sync`);
40
+ console.log('');
41
+ return;
42
+ }
43
+ console.log('');
44
+ if (status.behindBy > 0) {
45
+ console.log(`${spinner_1.colors.cyan('●')} Pulling changes...`);
46
+ console.log('');
47
+ const pullContext = {
48
+ ...context,
49
+ flags: { ...flags, force: true },
50
+ };
51
+ await (0, pull_1.pullCommand)(pullContext);
52
+ }
53
+ if (status.aheadBy > 0) {
54
+ console.log(`${spinner_1.colors.cyan('●')} Pushing commits...`);
55
+ console.log('');
56
+ await (0, repo_manager_1.ensureRemoteTable)(connection);
57
+ const localCommits = (0, repo_manager_1.getAllCommits)(projectRoot);
58
+ const remoteCommits = await (0, repo_manager_1.fetchRemoteCommits)(connection, 100);
59
+ const remoteHashes = new Set(remoteCommits.map(c => c.hash));
60
+ const toPush = localCommits.filter(c => !remoteHashes.has(c.hash));
61
+ spinner.start(`Pushing ${toPush.length} commit(s)...`);
62
+ for (const commit of toPush.reverse()) {
63
+ await (0, repo_manager_1.pushCommit)(connection, commit);
64
+ }
65
+ spinner.succeed(`Pushed ${toPush.length} commit(s)`);
66
+ }
67
+ console.log('');
68
+ const pulledText = status.behindBy > 0 ? `${spinner_1.colors.yellow(`↓ ${status.behindBy}`)} pulled` : '';
69
+ const pushedText = status.aheadBy > 0 ? `${spinner_1.colors.green(`↑ ${status.aheadBy}`)} pushed` : '';
70
+ const separator = pulledText && pushedText ? ' | ' : '';
71
+ console.log(`${spinner_1.colors.green('✓')} Sync complete: ${pulledText}${separator}${pushedText}`);
72
+ }
73
+ catch (error) {
74
+ spinner.fail('Sync failed');
75
+ console.error(spinner_1.colors.red(`Error: ${error instanceof Error ? error.message : error}`));
76
+ process.exit(1);
77
+ }
78
+ console.log('');
79
+ }