relq 1.0.1 → 1.0.3

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 (194) hide show
  1. package/dist/cjs/addon/buffer/index.cjs +1881 -0
  2. package/dist/cjs/addon/pg/index.cjs +4812 -0
  3. package/dist/cjs/addon/pg-cursor/index.cjs +1451 -0
  4. package/dist/cjs/addon/pg-format/index.cjs +2270 -0
  5. package/dist/cjs/cli/commands/add.cjs +430 -25
  6. package/dist/cjs/cli/commands/branch.cjs +131 -0
  7. package/dist/cjs/cli/commands/checkout.cjs +121 -0
  8. package/dist/cjs/cli/commands/cherry-pick.cjs +282 -0
  9. package/dist/cjs/cli/commands/commit.cjs +21 -29
  10. package/dist/cjs/cli/commands/diff.cjs +144 -69
  11. package/dist/cjs/cli/commands/export.cjs +70 -11
  12. package/dist/cjs/cli/commands/fetch.cjs +42 -18
  13. package/dist/cjs/cli/commands/generate.cjs +28 -54
  14. package/dist/cjs/cli/commands/history.cjs +19 -40
  15. package/dist/cjs/cli/commands/import.cjs +305 -41
  16. package/dist/cjs/cli/commands/init.cjs +69 -59
  17. package/dist/cjs/cli/commands/introspect.cjs +4 -8
  18. package/dist/cjs/cli/commands/log.cjs +84 -15
  19. package/dist/cjs/cli/commands/merge.cjs +207 -0
  20. package/dist/cjs/cli/commands/migrate.cjs +13 -26
  21. package/dist/cjs/cli/commands/pull.cjs +321 -95
  22. package/dist/cjs/cli/commands/push.cjs +228 -52
  23. package/dist/cjs/cli/commands/remote.cjs +17 -0
  24. package/dist/cjs/cli/commands/reset.cjs +148 -0
  25. package/dist/cjs/cli/commands/resolve.cjs +191 -0
  26. package/dist/cjs/cli/commands/rollback.cjs +17 -39
  27. package/dist/cjs/cli/commands/stash.cjs +152 -0
  28. package/dist/cjs/cli/commands/status.cjs +52 -9
  29. package/dist/cjs/cli/commands/sync.cjs +30 -50
  30. package/dist/cjs/cli/commands/tag.cjs +146 -0
  31. package/dist/cjs/cli/index.cjs +117 -10
  32. package/dist/cjs/cli/utils/change-tracker.cjs +107 -3
  33. package/dist/cjs/cli/utils/cli-utils.cjs +217 -0
  34. package/dist/cjs/cli/utils/commit-manager.cjs +3 -3
  35. package/dist/cjs/cli/utils/config-loader.cjs +34 -8
  36. package/dist/cjs/cli/utils/env-loader.cjs +3 -2
  37. package/dist/cjs/cli/utils/fast-introspect.cjs +110 -4
  38. package/dist/cjs/cli/utils/git-utils.cjs +42 -161
  39. package/dist/cjs/cli/utils/pool-manager.cjs +156 -0
  40. package/dist/cjs/cli/utils/project-root.cjs +107 -0
  41. package/dist/cjs/cli/utils/relqignore.cjs +297 -38
  42. package/dist/cjs/cli/utils/repo-manager.cjs +92 -3
  43. package/dist/cjs/cli/utils/schema-comparator.cjs +301 -11
  44. package/dist/cjs/cli/utils/schema-diff.cjs +202 -1
  45. package/dist/cjs/cli/utils/schema-hash.cjs +2 -1
  46. package/dist/cjs/cli/utils/schema-introspect.cjs +9 -5
  47. package/dist/cjs/cli/utils/snapshot-manager.cjs +1 -0
  48. package/dist/cjs/cli/utils/spinner.cjs +14 -106
  49. package/dist/cjs/cli/utils/sql-generator.cjs +2 -2
  50. package/dist/cjs/cli/utils/sql-parser.cjs +94 -7
  51. package/dist/cjs/cli/utils/type-generator.cjs +28 -16
  52. package/dist/cjs/condition/array-condition-builder.cjs +1 -1
  53. package/dist/cjs/condition/condition-collector.cjs +1 -1
  54. package/dist/cjs/condition/fulltext-condition-builder.cjs +1 -1
  55. package/dist/cjs/condition/geometric-condition-builder.cjs +1 -1
  56. package/dist/cjs/condition/jsonb-condition-builder.cjs +1 -1
  57. package/dist/cjs/condition/network-condition-builder.cjs +1 -1
  58. package/dist/cjs/condition/range-condition-builder.cjs +1 -1
  59. package/dist/cjs/copy/copy-builder.cjs +1 -1
  60. package/dist/cjs/core/query-builder.cjs +1 -1
  61. package/dist/cjs/core/relq-client.cjs +2 -2
  62. package/dist/cjs/count/count-builder.cjs +1 -1
  63. package/dist/cjs/cte/cte-builder.cjs +1 -1
  64. package/dist/cjs/delete/delete-builder.cjs +1 -1
  65. package/dist/cjs/function/create-function-builder.cjs +1 -1
  66. package/dist/cjs/functions/advanced-functions.cjs +1 -1
  67. package/dist/cjs/functions/case-builder.cjs +1 -1
  68. package/dist/cjs/functions/geometric-functions.cjs +1 -1
  69. package/dist/cjs/functions/network-functions.cjs +1 -1
  70. package/dist/cjs/functions/sql-functions.cjs +1 -1
  71. package/dist/cjs/indexing/create-index-builder.cjs +1 -1
  72. package/dist/cjs/indexing/drop-index-builder.cjs +1 -1
  73. package/dist/cjs/insert/conflict-builder.cjs +1 -1
  74. package/dist/cjs/insert/insert-builder.cjs +1 -1
  75. package/dist/cjs/maintenance/vacuum-builder.cjs +1 -1
  76. package/dist/cjs/pubsub/listen-notify-builder.cjs +1 -1
  77. package/dist/cjs/pubsub/listener-connection.cjs +2 -2
  78. package/dist/cjs/raw/raw-query-builder.cjs +1 -1
  79. package/dist/cjs/schema/schema-builder.cjs +1 -1
  80. package/dist/cjs/schema-definition/table-definition.cjs +1 -1
  81. package/dist/cjs/select/aggregate-builder.cjs +1 -1
  82. package/dist/cjs/select/select-builder.cjs +1 -1
  83. package/dist/cjs/sequence/sequence-builder.cjs +1 -1
  84. package/dist/cjs/table/alter-table-builder.cjs +1 -1
  85. package/dist/cjs/table/constraint-builder.cjs +1 -1
  86. package/dist/cjs/table/create-table-builder.cjs +1 -1
  87. package/dist/cjs/table/partition-builder.cjs +1 -1
  88. package/dist/cjs/table/truncate-builder.cjs +1 -1
  89. package/dist/cjs/transaction/transaction-builder.cjs +1 -1
  90. package/dist/cjs/trigger/create-trigger-builder.cjs +1 -1
  91. package/dist/cjs/update/array-update-builder.cjs +1 -1
  92. package/dist/cjs/update/update-builder.cjs +1 -1
  93. package/dist/cjs/utils/index.cjs +1 -1
  94. package/dist/cjs/view/create-view-builder.cjs +1 -1
  95. package/dist/cjs/window/window-builder.cjs +1 -1
  96. package/dist/config.d.ts +16 -25
  97. package/dist/esm/cli/commands/add.js +399 -27
  98. package/dist/esm/cli/commands/branch.js +95 -0
  99. package/dist/esm/cli/commands/checkout.js +85 -0
  100. package/dist/esm/cli/commands/cherry-pick.js +246 -0
  101. package/dist/esm/cli/commands/commit.js +22 -30
  102. package/dist/esm/cli/commands/diff.js +144 -69
  103. package/dist/esm/cli/commands/export.js +71 -12
  104. package/dist/esm/cli/commands/fetch.js +42 -18
  105. package/dist/esm/cli/commands/generate.js +28 -54
  106. package/dist/esm/cli/commands/history.js +11 -32
  107. package/dist/esm/cli/commands/import.js +306 -42
  108. package/dist/esm/cli/commands/init.js +65 -55
  109. package/dist/esm/cli/commands/introspect.js +4 -8
  110. package/dist/esm/cli/commands/log.js +78 -10
  111. package/dist/esm/cli/commands/merge.js +171 -0
  112. package/dist/esm/cli/commands/migrate.js +13 -26
  113. package/dist/esm/cli/commands/pull.js +313 -87
  114. package/dist/esm/cli/commands/push.js +223 -47
  115. package/dist/esm/cli/commands/remote.js +14 -0
  116. package/dist/esm/cli/commands/reset.js +112 -0
  117. package/dist/esm/cli/commands/resolve.js +155 -0
  118. package/dist/esm/cli/commands/rollback.js +17 -39
  119. package/dist/esm/cli/commands/stash.js +116 -0
  120. package/dist/esm/cli/commands/status.js +20 -10
  121. package/dist/esm/cli/commands/sync.js +30 -50
  122. package/dist/esm/cli/commands/tag.js +110 -0
  123. package/dist/esm/cli/index.js +118 -11
  124. package/dist/esm/cli/utils/change-tracker.js +107 -3
  125. package/dist/esm/cli/utils/cli-utils.js +169 -0
  126. package/dist/esm/cli/utils/commit-manager.js +3 -3
  127. package/dist/esm/cli/utils/config-loader.js +34 -8
  128. package/dist/esm/cli/utils/env-loader.js +3 -2
  129. package/dist/esm/cli/utils/fast-introspect.js +110 -4
  130. package/dist/esm/cli/utils/git-utils.js +2 -124
  131. package/dist/esm/cli/utils/pool-manager.js +114 -0
  132. package/dist/esm/cli/utils/project-root.js +69 -0
  133. package/dist/esm/cli/utils/relqignore.js +278 -37
  134. package/dist/esm/cli/utils/repo-manager.js +83 -3
  135. package/dist/esm/cli/utils/schema-comparator.js +301 -11
  136. package/dist/esm/cli/utils/schema-diff.js +202 -1
  137. package/dist/esm/cli/utils/schema-hash.js +2 -1
  138. package/dist/esm/cli/utils/schema-introspect.js +9 -5
  139. package/dist/esm/cli/utils/snapshot-manager.js +1 -0
  140. package/dist/esm/cli/utils/spinner.js +1 -101
  141. package/dist/esm/cli/utils/sql-generator.js +2 -2
  142. package/dist/esm/cli/utils/sql-parser.js +94 -7
  143. package/dist/esm/cli/utils/type-generator.js +28 -16
  144. package/dist/esm/condition/array-condition-builder.js +1 -1
  145. package/dist/esm/condition/condition-collector.js +1 -1
  146. package/dist/esm/condition/fulltext-condition-builder.js +1 -1
  147. package/dist/esm/condition/geometric-condition-builder.js +1 -1
  148. package/dist/esm/condition/jsonb-condition-builder.js +1 -1
  149. package/dist/esm/condition/network-condition-builder.js +1 -1
  150. package/dist/esm/condition/range-condition-builder.js +1 -1
  151. package/dist/esm/copy/copy-builder.js +1 -1
  152. package/dist/esm/core/query-builder.js +1 -1
  153. package/dist/esm/core/relq-client.js +2 -2
  154. package/dist/esm/count/count-builder.js +1 -1
  155. package/dist/esm/cte/cte-builder.js +1 -1
  156. package/dist/esm/delete/delete-builder.js +1 -1
  157. package/dist/esm/function/create-function-builder.js +1 -1
  158. package/dist/esm/functions/advanced-functions.js +1 -1
  159. package/dist/esm/functions/case-builder.js +1 -1
  160. package/dist/esm/functions/geometric-functions.js +1 -1
  161. package/dist/esm/functions/network-functions.js +1 -1
  162. package/dist/esm/functions/sql-functions.js +1 -1
  163. package/dist/esm/indexing/create-index-builder.js +1 -1
  164. package/dist/esm/indexing/drop-index-builder.js +1 -1
  165. package/dist/esm/insert/conflict-builder.js +1 -1
  166. package/dist/esm/insert/insert-builder.js +1 -1
  167. package/dist/esm/maintenance/vacuum-builder.js +1 -1
  168. package/dist/esm/pubsub/listen-notify-builder.js +1 -1
  169. package/dist/esm/pubsub/listener-connection.js +2 -2
  170. package/dist/esm/raw/raw-query-builder.js +1 -1
  171. package/dist/esm/schema/schema-builder.js +1 -1
  172. package/dist/esm/schema-definition/table-definition.js +1 -1
  173. package/dist/esm/select/aggregate-builder.js +1 -1
  174. package/dist/esm/select/select-builder.js +1 -1
  175. package/dist/esm/sequence/sequence-builder.js +1 -1
  176. package/dist/esm/table/alter-table-builder.js +1 -1
  177. package/dist/esm/table/constraint-builder.js +1 -1
  178. package/dist/esm/table/create-table-builder.js +1 -1
  179. package/dist/esm/table/partition-builder.js +1 -1
  180. package/dist/esm/table/truncate-builder.js +1 -1
  181. package/dist/esm/transaction/transaction-builder.js +1 -1
  182. package/dist/esm/trigger/create-trigger-builder.js +1 -1
  183. package/dist/esm/update/array-update-builder.js +1 -1
  184. package/dist/esm/update/update-builder.js +1 -1
  185. package/dist/esm/utils/index.js +1 -1
  186. package/dist/esm/view/create-view-builder.js +1 -1
  187. package/dist/esm/window/window-builder.js +1 -1
  188. package/dist/index.d.ts +25 -8
  189. package/dist/schema-builder.d.ts +16 -6
  190. package/package.json +1 -1
  191. /package/dist/{addons/buffer.js → esm/addon/buffer/index.js} +0 -0
  192. /package/dist/{addons/pg.js → esm/addon/pg/index.js} +0 -0
  193. /package/dist/{addons/pg-cursor.js → esm/addon/pg-cursor/index.js} +0 -0
  194. /package/dist/{addons/pg-format.js → esm/addon/pg-format/index.js} +0 -0
@@ -0,0 +1,191 @@
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.resolveCommand = resolveCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const spinner_1 = require("../utils/spinner.cjs");
40
+ const repo_manager_1 = require("../utils/repo-manager.cjs");
41
+ async function resolveCommand(context) {
42
+ const { flags, args, projectRoot } = context;
43
+ console.log('');
44
+ if (!(0, repo_manager_1.isInitialized)(projectRoot)) {
45
+ (0, spinner_1.fatal)('not a relq repository (or any parent directories): .relq', `Run ${spinner_1.colors.cyan('relq init')} to initialize.`);
46
+ }
47
+ const mergeStatePath = path.join(projectRoot, '.relq', 'MERGE_STATE');
48
+ if (!fs.existsSync(mergeStatePath)) {
49
+ console.log('No conflicts to resolve');
50
+ console.log('');
51
+ return;
52
+ }
53
+ const mergeState = JSON.parse(fs.readFileSync(mergeStatePath, 'utf-8'));
54
+ if (mergeState.conflicts.length === 0) {
55
+ fs.unlinkSync(mergeStatePath);
56
+ console.log('All conflicts resolved');
57
+ console.log('');
58
+ return;
59
+ }
60
+ const allTheirs = flags['all-theirs'] === true;
61
+ const allOurs = flags['all-ours'] === true;
62
+ const theirs = flags['theirs'] === true;
63
+ const ours = flags['ours'] === true;
64
+ const objectName = args[0];
65
+ if (allTheirs) {
66
+ console.log(`Resolving ${mergeState.conflicts.length} conflict(s) with --all-theirs`);
67
+ console.log('');
68
+ (0, repo_manager_1.saveSnapshot)(mergeState.remoteSnapshot, projectRoot);
69
+ fs.unlinkSync(mergeStatePath);
70
+ console.log('Applied remote versions for all conflicts');
71
+ console.log('');
72
+ console.log(`hint: run 'relq commit -m "Merge remote changes"' to complete`);
73
+ console.log('');
74
+ return;
75
+ }
76
+ if (allOurs) {
77
+ console.log(`Resolving ${mergeState.conflicts.length} conflict(s) with --all-ours`);
78
+ console.log('');
79
+ fs.unlinkSync(mergeStatePath);
80
+ console.log('Kept local versions for all conflicts');
81
+ console.log('');
82
+ console.log(`hint: run 'relq commit -m "Keep local changes"' to complete`);
83
+ console.log('');
84
+ return;
85
+ }
86
+ if ((theirs || ours) && objectName) {
87
+ const conflict = mergeState.conflicts.find(c => c.objectName === objectName ||
88
+ `${c.parentName}.${c.objectName}` === objectName);
89
+ if (!conflict) {
90
+ console.log(`${spinner_1.colors.red('error:')} No conflict found for '${objectName}'`);
91
+ console.log('');
92
+ console.log('Conflicts:');
93
+ for (const c of mergeState.conflicts) {
94
+ const name = c.parentName ? `${c.parentName}.${c.objectName}` : c.objectName;
95
+ console.log(` ${c.objectType}: ${name}`);
96
+ }
97
+ console.log('');
98
+ return;
99
+ }
100
+ const localSnapshot = (0, repo_manager_1.loadSnapshot)(projectRoot);
101
+ if (!localSnapshot) {
102
+ console.log(`${spinner_1.colors.red('error:')} No local snapshot found`);
103
+ return;
104
+ }
105
+ if (theirs) {
106
+ applyResolution(localSnapshot, conflict, mergeState.remoteSnapshot, 'theirs');
107
+ (0, repo_manager_1.saveSnapshot)(localSnapshot, projectRoot);
108
+ }
109
+ mergeState.conflicts = mergeState.conflicts.filter(c => c !== conflict);
110
+ if (mergeState.conflicts.length === 0) {
111
+ fs.unlinkSync(mergeStatePath);
112
+ console.log('All conflicts resolved');
113
+ }
114
+ else {
115
+ fs.writeFileSync(mergeStatePath, JSON.stringify(mergeState, null, 2));
116
+ console.log(`Resolved: ${conflict.objectType} ${objectName}`);
117
+ console.log(`${mergeState.conflicts.length} conflict(s) remaining`);
118
+ }
119
+ console.log('');
120
+ return;
121
+ }
122
+ (0, spinner_1.warning)(`You have ${mergeState.conflicts.length} unresolved conflict(s):`);
123
+ console.log('');
124
+ for (const conflict of mergeState.conflicts) {
125
+ const name = conflict.parentName
126
+ ? `${conflict.parentName}.${conflict.objectName}`
127
+ : conflict.objectName;
128
+ console.log(` ${spinner_1.colors.red('conflict:')} ${conflict.objectType.toLowerCase()} ${spinner_1.colors.bold(name)}`);
129
+ console.log(` ${spinner_1.colors.muted(conflict.description)}`);
130
+ }
131
+ console.log('');
132
+ console.log('To resolve:');
133
+ console.log(` ${spinner_1.colors.cyan('relq resolve --theirs <name>')} Take remote version`);
134
+ console.log(` ${spinner_1.colors.cyan('relq resolve --ours <name>')} Keep local version`);
135
+ console.log(` ${spinner_1.colors.cyan('relq resolve --all-theirs')} Take all remote`);
136
+ console.log(` ${spinner_1.colors.cyan('relq resolve --all-ours')} Keep all local`);
137
+ console.log('');
138
+ }
139
+ function applyResolution(local, conflict, remote, resolution) {
140
+ if (resolution !== 'theirs')
141
+ return;
142
+ switch (conflict.objectType) {
143
+ case 'TABLE': {
144
+ const remoteTable = remote.tables.find(t => t.name === conflict.objectName);
145
+ const localIdx = local.tables.findIndex(t => t.name === conflict.objectName);
146
+ if (remoteTable) {
147
+ if (localIdx >= 0) {
148
+ local.tables[localIdx] = remoteTable;
149
+ }
150
+ else {
151
+ local.tables.push(remoteTable);
152
+ }
153
+ }
154
+ break;
155
+ }
156
+ case 'COLUMN': {
157
+ const [tableName, colName] = conflict.objectName.includes('.')
158
+ ? conflict.objectName.split('.')
159
+ : [conflict.parentName, conflict.objectName];
160
+ const remoteTable = remote.tables.find(t => t.name === tableName);
161
+ const localTable = local.tables.find(t => t.name === tableName);
162
+ if (remoteTable && localTable) {
163
+ const remoteCol = remoteTable.columns.find(c => c.name === colName);
164
+ const localIdx = localTable.columns.findIndex(c => c.name === colName);
165
+ if (remoteCol) {
166
+ if (localIdx >= 0) {
167
+ localTable.columns[localIdx] = remoteCol;
168
+ }
169
+ else {
170
+ localTable.columns.push(remoteCol);
171
+ }
172
+ }
173
+ }
174
+ break;
175
+ }
176
+ case 'ENUM': {
177
+ const remoteEnum = remote.enums.find(e => e.name === conflict.objectName);
178
+ const localIdx = local.enums.findIndex(e => e.name === conflict.objectName);
179
+ if (remoteEnum) {
180
+ if (localIdx >= 0) {
181
+ local.enums[localIdx] = remoteEnum;
182
+ }
183
+ else {
184
+ local.enums.push(remoteEnum);
185
+ }
186
+ }
187
+ break;
188
+ }
189
+ }
190
+ }
191
+ exports.default = resolveCommand;
@@ -36,18 +36,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.rollbackCommand = rollbackCommand;
37
37
  const fs = __importStar(require("fs"));
38
38
  const path = __importStar(require("path"));
39
- const readline = __importStar(require("readline"));
40
39
  const config_loader_1 = require("../utils/config-loader.cjs");
41
40
  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
- };
41
+ const cli_utils_1 = require("../utils/cli-utils.cjs");
51
42
  function parseMigration(content) {
52
43
  const upMatch = content.match(/--\s*UP\s*\n([\s\S]*?)(?=--\s*DOWN|$)/i);
53
44
  const downMatch = content.match(/--\s*DOWN\s*\n([\s\S]*?)$/i);
@@ -56,36 +47,24 @@ function parseMigration(content) {
56
47
  down: downMatch?.[1]?.trim() || '',
57
48
  };
58
49
  }
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
50
  async function rollbackCommand(context) {
72
51
  const { config, args, flags } = context;
73
52
  if (!config) {
74
- console.error('Error: No configuration found.');
75
- process.exit(1);
53
+ (0, cli_utils_1.fatal)('No configuration found', `run ${cli_utils_1.colors.cyan('relq init')} to create a configuration file`);
54
+ return;
76
55
  }
77
- (0, config_loader_1.requireValidConfig)(config);
56
+ await (0, config_loader_1.requireValidConfig)(config, { calledFrom: 'rollback' });
78
57
  const connection = config.connection;
79
58
  const migrationsDir = config.migrations?.directory || './migrations';
80
59
  const tableName = config.migrations?.tableName || '_relq_migrations';
81
60
  const count = parseInt(args[0]) || 1;
82
61
  const dryRun = flags['dry-run'] === true;
83
62
  const force = flags['force'] === true;
84
- console.log(`${colors.bold}Rolling back ${count} migration(s)...${colors.reset}`);
63
+ console.log(`Rolling back ${count} migration(s)...`);
85
64
  console.log(` Connection: ${(0, env_loader_1.getConnectionDescription)(connection)}`);
86
65
  console.log('');
87
66
  try {
88
- const { Pool } = await Promise.resolve().then(() => __importStar(require("../../../addons/pg.js")));
67
+ const { Pool } = await Promise.resolve().then(() => __importStar(require("../../addon/pg/index.cjs")));
89
68
  const pool = new Pool({
90
69
  host: connection.host,
91
70
  port: connection.port || 5432,
@@ -101,17 +80,17 @@ async function rollbackCommand(context) {
101
80
  LIMIT $1;
102
81
  `, [count]);
103
82
  if (result.rows.length === 0) {
104
- console.log(`${colors.yellow}No migrations to rollback.${colors.reset}`);
83
+ console.log('No migrations to rollback.');
105
84
  return;
106
85
  }
107
86
  const toRollback = result.rows.map(r => r.name);
108
- console.log(`${colors.bold}Migrations to rollback:${colors.reset}`);
87
+ console.log('Migrations to rollback:');
109
88
  for (const name of toRollback) {
110
- console.log(` ${colors.red}• ${name}${colors.reset}`);
89
+ console.log(` - ${name}`);
111
90
  }
112
91
  console.log('');
113
92
  if (!force && !dryRun) {
114
- const proceed = await askConfirm(`${colors.red}This will undo ${toRollback.length} migration(s). Continue?${colors.reset}`);
93
+ const proceed = await (0, cli_utils_1.confirm)(`${cli_utils_1.colors.red('This will undo ' + toRollback.length + ' migration(s). Continue?')}`, false);
115
94
  if (!proceed) {
116
95
  console.log('Cancelled.');
117
96
  return;
@@ -120,18 +99,18 @@ async function rollbackCommand(context) {
120
99
  for (const name of toRollback) {
121
100
  const filePath = path.join(migrationsDir, name);
122
101
  if (!fs.existsSync(filePath)) {
123
- console.log(`${colors.yellow}⚠️ Migration file not found: ${name}${colors.reset}`);
102
+ (0, cli_utils_1.warning)(`Migration file not found: ${name}`);
124
103
  continue;
125
104
  }
126
105
  const content = fs.readFileSync(filePath, 'utf-8');
127
106
  const { down } = parseMigration(content);
128
107
  if (!down) {
129
- console.log(`${colors.yellow}⚠️ No DOWN section in: ${name}${colors.reset}`);
108
+ (0, cli_utils_1.warning)(`No DOWN section in: ${name}`);
130
109
  continue;
131
110
  }
132
111
  if (dryRun) {
133
- console.log(`${colors.cyan}[dry-run] Would rollback: ${name}${colors.reset}`);
134
- console.log(`${colors.dim}${down}${colors.reset}`);
112
+ console.log(`[dry-run] Would rollback: ${name}`);
113
+ console.log(down);
135
114
  console.log('');
136
115
  }
137
116
  else {
@@ -142,7 +121,7 @@ async function rollbackCommand(context) {
142
121
  await client.query(down);
143
122
  await client.query(`DELETE FROM "${tableName}" WHERE name = $1`, [name]);
144
123
  await client.query('COMMIT');
145
- console.log(` ${colors.green}✓ Rolled back${colors.reset}`);
124
+ console.log(' Rolled back');
146
125
  }
147
126
  catch (error) {
148
127
  await client.query('ROLLBACK');
@@ -155,7 +134,7 @@ async function rollbackCommand(context) {
155
134
  }
156
135
  if (!dryRun) {
157
136
  console.log('');
158
- console.log(`${colors.green}✓ Rolled back ${toRollback.length} migration(s).${colors.reset}`);
137
+ console.log(`Rolled back ${toRollback.length} migration(s).`);
159
138
  }
160
139
  }
161
140
  finally {
@@ -163,7 +142,6 @@ async function rollbackCommand(context) {
163
142
  }
164
143
  }
165
144
  catch (error) {
166
- console.error('Error:', error instanceof Error ? error.message : error);
167
- process.exit(1);
145
+ (0, cli_utils_1.fatal)('Rollback failed', error instanceof Error ? error.message : String(error));
168
146
  }
169
147
  }
@@ -0,0 +1,152 @@
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.stashCommand = stashCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const spinner_1 = require("../utils/spinner.cjs");
40
+ const repo_manager_1 = require("../utils/repo-manager.cjs");
41
+ async function stashCommand(context) {
42
+ const { args, flags, projectRoot } = context;
43
+ const subcommand = args[0] || 'push';
44
+ console.log('');
45
+ if (!(0, repo_manager_1.isInitialized)(projectRoot)) {
46
+ (0, spinner_1.fatal)('not a relq repository (or any parent directories): .relq', `Run ${spinner_1.colors.cyan('relq init')} to initialize.`);
47
+ }
48
+ const stashDir = path.join(projectRoot, '.relq', 'stash');
49
+ switch (subcommand) {
50
+ case 'push':
51
+ case 'save':
52
+ await stashPush(projectRoot, stashDir, flags['m'] || 'WIP');
53
+ break;
54
+ case 'pop':
55
+ await stashPop(projectRoot, stashDir);
56
+ break;
57
+ case 'list':
58
+ await stashList(stashDir);
59
+ break;
60
+ case 'drop':
61
+ await stashDrop(stashDir);
62
+ break;
63
+ default:
64
+ await stashPush(projectRoot, stashDir, subcommand);
65
+ }
66
+ }
67
+ async function stashPush(projectRoot, stashDir, message) {
68
+ const staged = (0, repo_manager_1.getStagedChanges)(projectRoot);
69
+ const unstaged = (0, repo_manager_1.getUnstagedChanges)(projectRoot);
70
+ if (staged.length === 0 && unstaged.length === 0) {
71
+ console.log(`${spinner_1.colors.muted('No changes to stash.')}`);
72
+ console.log('');
73
+ return;
74
+ }
75
+ if (!fs.existsSync(stashDir)) {
76
+ fs.mkdirSync(stashDir, { recursive: true });
77
+ }
78
+ const stashFiles = fs.readdirSync(stashDir).filter(f => f.endsWith('.json'));
79
+ const stashIdx = stashFiles.length;
80
+ const stash = {
81
+ message,
82
+ timestamp: new Date().toISOString(),
83
+ staged,
84
+ unstaged,
85
+ };
86
+ fs.writeFileSync(path.join(stashDir, `stash-${stashIdx}.json`), JSON.stringify(stash, null, 2));
87
+ const stagedPath = path.join(projectRoot, '.relq', 'staged.json');
88
+ const unstagedPath = path.join(projectRoot, '.relq', 'unstaged.json');
89
+ if (fs.existsSync(stagedPath))
90
+ fs.writeFileSync(stagedPath, '[]');
91
+ if (fs.existsSync(unstagedPath))
92
+ fs.writeFileSync(unstagedPath, '[]');
93
+ console.log('Saved working directory');
94
+ console.log(` stash@{${stashIdx}}: ${message}`);
95
+ console.log('');
96
+ }
97
+ async function stashPop(projectRoot, stashDir) {
98
+ if (!fs.existsSync(stashDir)) {
99
+ console.log(`${spinner_1.colors.muted('No stashes found.')}`);
100
+ return;
101
+ }
102
+ const stashFiles = fs.readdirSync(stashDir).filter(f => f.endsWith('.json')).sort().reverse();
103
+ if (stashFiles.length === 0) {
104
+ console.log(`${spinner_1.colors.muted('No stashes found.')}`);
105
+ return;
106
+ }
107
+ const stashPath = path.join(stashDir, stashFiles[0]);
108
+ const stash = JSON.parse(fs.readFileSync(stashPath, 'utf-8'));
109
+ const stagedPath = path.join(projectRoot, '.relq', 'staged.json');
110
+ const unstagedPath = path.join(projectRoot, '.relq', 'unstaged.json');
111
+ if (stash.staged.length > 0) {
112
+ fs.writeFileSync(stagedPath, JSON.stringify(stash.staged, null, 2));
113
+ }
114
+ if (stash.unstaged.length > 0) {
115
+ fs.writeFileSync(unstagedPath, JSON.stringify(stash.unstaged, null, 2));
116
+ }
117
+ fs.unlinkSync(stashPath);
118
+ console.log('Applied stash and dropped');
119
+ console.log(` ${stash.message}`);
120
+ console.log('');
121
+ }
122
+ async function stashList(stashDir) {
123
+ if (!fs.existsSync(stashDir)) {
124
+ console.log(`${spinner_1.colors.muted('No stashes.')}`);
125
+ return;
126
+ }
127
+ const stashFiles = fs.readdirSync(stashDir).filter(f => f.endsWith('.json')).sort();
128
+ if (stashFiles.length === 0) {
129
+ console.log(`${spinner_1.colors.muted('No stashes.')}`);
130
+ return;
131
+ }
132
+ for (let i = 0; i < stashFiles.length; i++) {
133
+ const stash = JSON.parse(fs.readFileSync(path.join(stashDir, stashFiles[i]), 'utf-8'));
134
+ console.log(`stash@{${i}}: ${stash.message} (${stash.staged.length + stash.unstaged.length} changes)`);
135
+ }
136
+ console.log('');
137
+ }
138
+ async function stashDrop(stashDir) {
139
+ if (!fs.existsSync(stashDir)) {
140
+ console.log(`${spinner_1.colors.muted('No stashes.')}`);
141
+ return;
142
+ }
143
+ const stashFiles = fs.readdirSync(stashDir).filter(f => f.endsWith('.json')).sort().reverse();
144
+ if (stashFiles.length === 0) {
145
+ console.log(`${spinner_1.colors.muted('No stashes.')}`);
146
+ return;
147
+ }
148
+ fs.unlinkSync(path.join(stashDir, stashFiles[0]));
149
+ console.log('Dropped stash');
150
+ console.log('');
151
+ }
152
+ exports.default = stashCommand;
@@ -1,20 +1,51 @@
1
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
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.statusCommand = statusCommand;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
4
39
  const env_loader_1 = require("../utils/env-loader.cjs");
5
40
  const spinner_1 = require("../utils/spinner.cjs");
41
+ const relqignore_1 = require("../utils/relqignore.cjs");
6
42
  const repo_manager_1 = require("../utils/repo-manager.cjs");
7
43
  async function statusCommand(context) {
8
- const { config, flags } = context;
9
- const projectRoot = process.cwd();
44
+ const { config, flags, projectRoot } = context;
10
45
  const connection = config?.connection;
11
46
  console.log('');
12
47
  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;
48
+ (0, spinner_1.fatal)('not a relq repository (or any parent directories): .relq', `Run ${spinner_1.colors.cyan('relq init')} to initialize.`);
18
49
  }
19
50
  const head = (0, repo_manager_1.getHead)(projectRoot);
20
51
  const staged = (0, repo_manager_1.getStagedChanges)(projectRoot);
@@ -37,7 +68,7 @@ async function statusCommand(context) {
37
68
  console.log(`${spinner_1.colors.green('Changes to be committed:')}`);
38
69
  console.log(` ${spinner_1.colors.muted('(use "relq restore --staged <name>..." to unstage)')}`);
39
70
  console.log('');
40
- displayChanges(staged, ' ');
71
+ displayChanges(staged, ' ');
41
72
  console.log('');
42
73
  }
43
74
  if (unstaged.length > 0) {
@@ -45,9 +76,21 @@ async function statusCommand(context) {
45
76
  console.log(` ${spinner_1.colors.muted('(use "relq add <name>..." to stage)')}`);
46
77
  console.log(` ${spinner_1.colors.muted('(use "relq restore <name>..." to discard)')}`);
47
78
  console.log('');
48
- displayChanges(unstaged, ' ');
79
+ displayChanges(unstaged, ' ');
49
80
  console.log('');
50
81
  }
82
+ const ignorePatterns = (0, relqignore_1.loadRelqignore)(projectRoot);
83
+ const relqignorePath = path.join(projectRoot, '.relqignore');
84
+ if (ignorePatterns.length > 0 && fs.existsSync(relqignorePath)) {
85
+ const userPatterns = ignorePatterns.filter(p => !p.raw.startsWith('_relq_') &&
86
+ !p.raw.startsWith('pg_') &&
87
+ !p.raw.startsWith('_temp_') &&
88
+ !p.raw.startsWith('tmp_'));
89
+ if (userPatterns.length > 0) {
90
+ console.log(`${spinner_1.colors.muted(`${userPatterns.length} pattern(s) active from .relqignore`)}`);
91
+ console.log('');
92
+ }
93
+ }
51
94
  if (staged.length === 0 && unstaged.length === 0) {
52
95
  console.log(`${spinner_1.colors.green('nothing to commit, working tree clean')}`);
53
96
  console.log('');