relq 1.0.1 → 1.0.2
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.
- package/dist/cjs/addon/buffer/index.cjs +1881 -0
- package/dist/cjs/addon/pg/index.cjs +4812 -0
- package/dist/cjs/addon/pg-cursor/index.cjs +1451 -0
- package/dist/cjs/addon/pg-format/index.cjs +2270 -0
- package/dist/cjs/cli/commands/add.cjs +30 -1
- package/dist/cjs/cli/commands/branch.cjs +141 -0
- package/dist/cjs/cli/commands/checkout.cjs +134 -0
- package/dist/cjs/cli/commands/cherry-pick.cjs +283 -0
- package/dist/cjs/cli/commands/diff.cjs +148 -69
- package/dist/cjs/cli/commands/export.cjs +64 -5
- package/dist/cjs/cli/commands/fetch.cjs +34 -4
- package/dist/cjs/cli/commands/history.cjs +1 -1
- package/dist/cjs/cli/commands/import.cjs +283 -12
- package/dist/cjs/cli/commands/log.cjs +75 -0
- package/dist/cjs/cli/commands/merge.cjs +224 -0
- package/dist/cjs/cli/commands/migrate.cjs +1 -1
- package/dist/cjs/cli/commands/pull.cjs +123 -7
- package/dist/cjs/cli/commands/push.cjs +245 -29
- package/dist/cjs/cli/commands/remote.cjs +16 -0
- package/dist/cjs/cli/commands/reset.cjs +169 -0
- package/dist/cjs/cli/commands/resolve.cjs +193 -0
- package/dist/cjs/cli/commands/rollback.cjs +1 -1
- package/dist/cjs/cli/commands/stash.cjs +154 -0
- package/dist/cjs/cli/commands/status.cjs +48 -0
- package/dist/cjs/cli/commands/tag.cjs +147 -0
- package/dist/cjs/cli/index.cjs +46 -2
- package/dist/cjs/cli/utils/commit-manager.cjs +3 -3
- package/dist/cjs/cli/utils/env-loader.cjs +3 -2
- package/dist/cjs/cli/utils/fast-introspect.cjs +1 -1
- package/dist/cjs/cli/utils/project-root.cjs +56 -0
- package/dist/cjs/cli/utils/relqignore.cjs +296 -38
- package/dist/cjs/cli/utils/repo-manager.cjs +45 -3
- package/dist/cjs/cli/utils/schema-introspect.cjs +2 -2
- package/dist/cjs/cli/utils/sql-generator.cjs +1 -1
- package/dist/cjs/cli/utils/sql-parser.cjs +94 -7
- package/dist/cjs/condition/array-condition-builder.cjs +1 -1
- package/dist/cjs/condition/condition-collector.cjs +1 -1
- package/dist/cjs/condition/fulltext-condition-builder.cjs +1 -1
- package/dist/cjs/condition/geometric-condition-builder.cjs +1 -1
- package/dist/cjs/condition/jsonb-condition-builder.cjs +1 -1
- package/dist/cjs/condition/network-condition-builder.cjs +1 -1
- package/dist/cjs/condition/range-condition-builder.cjs +1 -1
- package/dist/cjs/copy/copy-builder.cjs +1 -1
- package/dist/cjs/core/query-builder.cjs +1 -1
- package/dist/cjs/core/relq-client.cjs +2 -2
- package/dist/cjs/count/count-builder.cjs +1 -1
- package/dist/cjs/cte/cte-builder.cjs +1 -1
- package/dist/cjs/delete/delete-builder.cjs +1 -1
- package/dist/cjs/function/create-function-builder.cjs +1 -1
- package/dist/cjs/functions/advanced-functions.cjs +1 -1
- package/dist/cjs/functions/case-builder.cjs +1 -1
- package/dist/cjs/functions/geometric-functions.cjs +1 -1
- package/dist/cjs/functions/network-functions.cjs +1 -1
- package/dist/cjs/functions/sql-functions.cjs +1 -1
- package/dist/cjs/indexing/create-index-builder.cjs +1 -1
- package/dist/cjs/indexing/drop-index-builder.cjs +1 -1
- package/dist/cjs/insert/conflict-builder.cjs +1 -1
- package/dist/cjs/insert/insert-builder.cjs +1 -1
- package/dist/cjs/maintenance/vacuum-builder.cjs +1 -1
- package/dist/cjs/pubsub/listen-notify-builder.cjs +1 -1
- package/dist/cjs/pubsub/listener-connection.cjs +2 -2
- package/dist/cjs/raw/raw-query-builder.cjs +1 -1
- package/dist/cjs/schema/schema-builder.cjs +1 -1
- package/dist/cjs/schema-definition/table-definition.cjs +1 -1
- package/dist/cjs/select/aggregate-builder.cjs +1 -1
- package/dist/cjs/select/select-builder.cjs +1 -1
- package/dist/cjs/sequence/sequence-builder.cjs +1 -1
- package/dist/cjs/table/alter-table-builder.cjs +1 -1
- package/dist/cjs/table/constraint-builder.cjs +1 -1
- package/dist/cjs/table/create-table-builder.cjs +1 -1
- package/dist/cjs/table/partition-builder.cjs +1 -1
- package/dist/cjs/table/truncate-builder.cjs +1 -1
- package/dist/cjs/transaction/transaction-builder.cjs +1 -1
- package/dist/cjs/trigger/create-trigger-builder.cjs +1 -1
- package/dist/cjs/update/array-update-builder.cjs +1 -1
- package/dist/cjs/update/update-builder.cjs +1 -1
- package/dist/cjs/utils/index.cjs +1 -1
- package/dist/cjs/view/create-view-builder.cjs +1 -1
- package/dist/cjs/window/window-builder.cjs +1 -1
- package/dist/esm/cli/commands/add.js +30 -1
- package/dist/esm/cli/commands/branch.js +105 -0
- package/dist/esm/cli/commands/checkout.js +98 -0
- package/dist/esm/cli/commands/cherry-pick.js +247 -0
- package/dist/esm/cli/commands/diff.js +148 -69
- package/dist/esm/cli/commands/export.js +64 -5
- package/dist/esm/cli/commands/fetch.js +35 -5
- package/dist/esm/cli/commands/history.js +1 -1
- package/dist/esm/cli/commands/import.js +283 -12
- package/dist/esm/cli/commands/log.js +74 -0
- package/dist/esm/cli/commands/merge.js +188 -0
- package/dist/esm/cli/commands/migrate.js +1 -1
- package/dist/esm/cli/commands/pull.js +124 -8
- package/dist/esm/cli/commands/push.js +246 -30
- package/dist/esm/cli/commands/remote.js +13 -0
- package/dist/esm/cli/commands/reset.js +133 -0
- package/dist/esm/cli/commands/resolve.js +157 -0
- package/dist/esm/cli/commands/rollback.js +1 -1
- package/dist/esm/cli/commands/stash.js +118 -0
- package/dist/esm/cli/commands/status.js +15 -0
- package/dist/esm/cli/commands/tag.js +111 -0
- package/dist/esm/cli/index.js +47 -3
- package/dist/esm/cli/utils/commit-manager.js +3 -3
- package/dist/esm/cli/utils/env-loader.js +3 -2
- package/dist/esm/cli/utils/fast-introspect.js +1 -1
- package/dist/esm/cli/utils/project-root.js +19 -0
- package/dist/esm/cli/utils/relqignore.js +277 -37
- package/dist/esm/cli/utils/repo-manager.js +41 -3
- package/dist/esm/cli/utils/schema-introspect.js +2 -2
- package/dist/esm/cli/utils/sql-generator.js +1 -1
- package/dist/esm/cli/utils/sql-parser.js +94 -7
- package/dist/esm/condition/array-condition-builder.js +1 -1
- package/dist/esm/condition/condition-collector.js +1 -1
- package/dist/esm/condition/fulltext-condition-builder.js +1 -1
- package/dist/esm/condition/geometric-condition-builder.js +1 -1
- package/dist/esm/condition/jsonb-condition-builder.js +1 -1
- package/dist/esm/condition/network-condition-builder.js +1 -1
- package/dist/esm/condition/range-condition-builder.js +1 -1
- package/dist/esm/copy/copy-builder.js +1 -1
- package/dist/esm/core/query-builder.js +1 -1
- package/dist/esm/core/relq-client.js +2 -2
- package/dist/esm/count/count-builder.js +1 -1
- package/dist/esm/cte/cte-builder.js +1 -1
- package/dist/esm/delete/delete-builder.js +1 -1
- package/dist/esm/function/create-function-builder.js +1 -1
- package/dist/esm/functions/advanced-functions.js +1 -1
- package/dist/esm/functions/case-builder.js +1 -1
- package/dist/esm/functions/geometric-functions.js +1 -1
- package/dist/esm/functions/network-functions.js +1 -1
- package/dist/esm/functions/sql-functions.js +1 -1
- package/dist/esm/indexing/create-index-builder.js +1 -1
- package/dist/esm/indexing/drop-index-builder.js +1 -1
- package/dist/esm/insert/conflict-builder.js +1 -1
- package/dist/esm/insert/insert-builder.js +1 -1
- package/dist/esm/maintenance/vacuum-builder.js +1 -1
- package/dist/esm/pubsub/listen-notify-builder.js +1 -1
- package/dist/esm/pubsub/listener-connection.js +2 -2
- package/dist/esm/raw/raw-query-builder.js +1 -1
- package/dist/esm/schema/schema-builder.js +1 -1
- package/dist/esm/schema-definition/table-definition.js +1 -1
- package/dist/esm/select/aggregate-builder.js +1 -1
- package/dist/esm/select/select-builder.js +1 -1
- package/dist/esm/sequence/sequence-builder.js +1 -1
- package/dist/esm/table/alter-table-builder.js +1 -1
- package/dist/esm/table/constraint-builder.js +1 -1
- package/dist/esm/table/create-table-builder.js +1 -1
- package/dist/esm/table/partition-builder.js +1 -1
- package/dist/esm/table/truncate-builder.js +1 -1
- package/dist/esm/transaction/transaction-builder.js +1 -1
- package/dist/esm/trigger/create-trigger-builder.js +1 -1
- package/dist/esm/update/array-update-builder.js +1 -1
- package/dist/esm/update/update-builder.js +1 -1
- package/dist/esm/utils/index.js +1 -1
- package/dist/esm/view/create-view-builder.js +1 -1
- package/dist/esm/window/window-builder.js +1 -1
- package/package.json +1 -1
- /package/dist/{addons/buffer.js → esm/addon/buffer/index.js} +0 -0
- /package/dist/{addons/pg.js → esm/addon/pg/index.js} +0 -0
- /package/dist/{addons/pg-cursor.js → esm/addon/pg-cursor/index.js} +0 -0
- /package/dist/{addons/pg-format.js → esm/addon/pg-format/index.js} +0 -0
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.addCommand = addCommand;
|
|
4
4
|
exports.getRelatedChanges = getRelatedChanges;
|
|
5
5
|
const spinner_1 = require("../utils/spinner.cjs");
|
|
6
|
+
const relqignore_1 = require("../utils/relqignore.cjs");
|
|
7
|
+
const config_1 = require("../../config/config.cjs");
|
|
6
8
|
const repo_manager_1 = require("../utils/repo-manager.cjs");
|
|
7
9
|
const change_tracker_1 = require("../utils/change-tracker.cjs");
|
|
8
10
|
async function addCommand(context) {
|
|
@@ -15,8 +17,31 @@ async function addCommand(context) {
|
|
|
15
17
|
console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq init')} ${spinner_1.colors.muted('first.')}`);
|
|
16
18
|
return;
|
|
17
19
|
}
|
|
18
|
-
const
|
|
20
|
+
const allUnstaged = (0, repo_manager_1.getUnstagedChanges)(projectRoot);
|
|
19
21
|
const staged = (0, repo_manager_1.getStagedChanges)(projectRoot);
|
|
22
|
+
const ignorePatterns = (0, relqignore_1.loadRelqignore)(projectRoot);
|
|
23
|
+
const config = await (0, config_1.loadConfig)();
|
|
24
|
+
const unstaged = allUnstaged.filter(change => {
|
|
25
|
+
const objectType = change.objectType;
|
|
26
|
+
const result = (0, relqignore_1.isIgnored)(objectType, change.objectName, change.parentName || null, ignorePatterns);
|
|
27
|
+
if (result.ignored) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
if (['FUNCTION', 'PROCEDURE'].includes(change.objectType) && !config.includeFunctions) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
if (change.objectType === 'TRIGGER' && !config.includeTriggers) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (['VIEW', 'MATERIALIZED_VIEW'].includes(change.objectType) && !config.includeViews) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
if (change.objectType === 'FOREIGN_TABLE' && !config.includeFDW) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return true;
|
|
43
|
+
});
|
|
44
|
+
const filteredCount = allUnstaged.length - unstaged.length;
|
|
20
45
|
if (unstaged.length === 0) {
|
|
21
46
|
if (staged.length > 0) {
|
|
22
47
|
console.log(`${spinner_1.colors.green('✓')} All changes are already staged`);
|
|
@@ -24,6 +49,10 @@ async function addCommand(context) {
|
|
|
24
49
|
console.log('');
|
|
25
50
|
console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq commit -m "message"')} ${spinner_1.colors.muted('to commit.')}`);
|
|
26
51
|
}
|
|
52
|
+
else if (filteredCount > 0) {
|
|
53
|
+
console.log(`${spinner_1.colors.green('✓')} No stageable changes`);
|
|
54
|
+
console.log(`${spinner_1.colors.muted(`${filteredCount} change(s) filtered by .relqignore or config`)}`);
|
|
55
|
+
}
|
|
27
56
|
else {
|
|
28
57
|
console.log(`${spinner_1.colors.green('✓')} No changes to stage`);
|
|
29
58
|
console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq pull')} ${spinner_1.colors.muted('or')} ${spinner_1.colors.cyan('relq import')} ${spinner_1.colors.muted('to detect changes.')}`);
|
|
@@ -0,0 +1,141 @@
|
|
|
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.branchCommand = branchCommand;
|
|
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
|
+
function loadBranchState(projectRoot) {
|
|
42
|
+
const branchPath = path.join(projectRoot, '.relq', 'branches.json');
|
|
43
|
+
if (fs.existsSync(branchPath)) {
|
|
44
|
+
return JSON.parse(fs.readFileSync(branchPath, 'utf-8'));
|
|
45
|
+
}
|
|
46
|
+
const head = (0, repo_manager_1.getHead)(projectRoot);
|
|
47
|
+
return {
|
|
48
|
+
current: 'main',
|
|
49
|
+
branches: { main: head || '' }
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function saveBranchState(state, projectRoot) {
|
|
53
|
+
const branchPath = path.join(projectRoot, '.relq', 'branches.json');
|
|
54
|
+
fs.writeFileSync(branchPath, JSON.stringify(state, null, 2));
|
|
55
|
+
}
|
|
56
|
+
async function branchCommand(context) {
|
|
57
|
+
const { args, flags } = context;
|
|
58
|
+
const projectRoot = process.cwd();
|
|
59
|
+
console.log('');
|
|
60
|
+
if (!(0, repo_manager_1.isInitialized)(projectRoot)) {
|
|
61
|
+
console.log(`${spinner_1.colors.red('fatal:')} not a relq repository`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const state = loadBranchState(projectRoot);
|
|
65
|
+
const deleteFlag = flags['d'] === true || flags['delete'] === true;
|
|
66
|
+
const renameFlag = flags['m'] === true || flags['move'] === true;
|
|
67
|
+
if (deleteFlag) {
|
|
68
|
+
const branchName = args[0];
|
|
69
|
+
if (!branchName) {
|
|
70
|
+
console.log(`${spinner_1.colors.red('error:')} Please specify branch name`);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (branchName === state.current) {
|
|
74
|
+
console.log(`${spinner_1.colors.red('error:')} Cannot delete current branch`);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (!state.branches[branchName]) {
|
|
78
|
+
console.log(`${spinner_1.colors.red('error:')} Branch not found: ${branchName}`);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
delete state.branches[branchName];
|
|
82
|
+
saveBranchState(state, projectRoot);
|
|
83
|
+
console.log(`${spinner_1.colors.green('✓')} Deleted branch '${branchName}'`);
|
|
84
|
+
console.log('');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (renameFlag) {
|
|
88
|
+
const oldName = args[0];
|
|
89
|
+
const newName = args[1];
|
|
90
|
+
if (!oldName || !newName) {
|
|
91
|
+
console.log(`${spinner_1.colors.red('error:')} Usage: relq branch -m <old> <new>`);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (!state.branches[oldName]) {
|
|
95
|
+
console.log(`${spinner_1.colors.red('error:')} Branch not found: ${oldName}`);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (state.branches[newName]) {
|
|
99
|
+
console.log(`${spinner_1.colors.red('error:')} Branch already exists: ${newName}`);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
state.branches[newName] = state.branches[oldName];
|
|
103
|
+
delete state.branches[oldName];
|
|
104
|
+
if (state.current === oldName)
|
|
105
|
+
state.current = newName;
|
|
106
|
+
saveBranchState(state, projectRoot);
|
|
107
|
+
console.log(`${spinner_1.colors.green('✓')} Renamed '${oldName}' to '${newName}'`);
|
|
108
|
+
console.log('');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (args[0]) {
|
|
112
|
+
const branchName = args[0];
|
|
113
|
+
if (state.branches[branchName]) {
|
|
114
|
+
console.log(`${spinner_1.colors.red('error:')} Branch already exists: ${branchName}`);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const head = (0, repo_manager_1.getHead)(projectRoot);
|
|
118
|
+
if (!head) {
|
|
119
|
+
console.log(`${spinner_1.colors.red('error:')} No commits yet`);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
state.branches[branchName] = head;
|
|
123
|
+
saveBranchState(state, projectRoot);
|
|
124
|
+
console.log(`${spinner_1.colors.green('✓')} Created branch '${branchName}'`);
|
|
125
|
+
console.log('');
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const branches = Object.keys(state.branches).sort();
|
|
129
|
+
if (branches.length === 0) {
|
|
130
|
+
console.log(`${spinner_1.colors.muted('No branches.')}`);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
for (const name of branches) {
|
|
134
|
+
const isCurrent = name === state.current;
|
|
135
|
+
const prefix = isCurrent ? spinner_1.colors.green('* ') : ' ';
|
|
136
|
+
const branchName = isCurrent ? spinner_1.colors.green(name) : name;
|
|
137
|
+
console.log(`${prefix}${branchName}`);
|
|
138
|
+
}
|
|
139
|
+
console.log('');
|
|
140
|
+
}
|
|
141
|
+
exports.default = branchCommand;
|
|
@@ -0,0 +1,134 @@
|
|
|
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.checkoutCommand = checkoutCommand;
|
|
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
|
+
function loadBranchState(projectRoot) {
|
|
42
|
+
const branchPath = path.join(projectRoot, '.relq', 'branches.json');
|
|
43
|
+
if (fs.existsSync(branchPath)) {
|
|
44
|
+
return JSON.parse(fs.readFileSync(branchPath, 'utf-8'));
|
|
45
|
+
}
|
|
46
|
+
const head = (0, repo_manager_1.getHead)(projectRoot);
|
|
47
|
+
return { current: 'main', branches: { main: head || '' } };
|
|
48
|
+
}
|
|
49
|
+
function saveBranchState(state, projectRoot) {
|
|
50
|
+
const branchPath = path.join(projectRoot, '.relq', 'branches.json');
|
|
51
|
+
fs.writeFileSync(branchPath, JSON.stringify(state, null, 2));
|
|
52
|
+
}
|
|
53
|
+
async function checkoutCommand(context) {
|
|
54
|
+
const { args, flags } = context;
|
|
55
|
+
const projectRoot = process.cwd();
|
|
56
|
+
console.log('');
|
|
57
|
+
if (!(0, repo_manager_1.isInitialized)(projectRoot)) {
|
|
58
|
+
console.log(`${spinner_1.colors.red('fatal:')} not a relq repository`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const createBranch = flags['b'] === true;
|
|
62
|
+
const branchName = args[0];
|
|
63
|
+
if (!branchName) {
|
|
64
|
+
console.log(`${spinner_1.colors.red('error:')} Please specify a branch`);
|
|
65
|
+
console.log('');
|
|
66
|
+
console.log(`Usage: ${spinner_1.colors.cyan('relq checkout <branch>')}`);
|
|
67
|
+
console.log(` ${spinner_1.colors.cyan('relq checkout -b <new-branch>')}`);
|
|
68
|
+
console.log('');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const staged = (0, repo_manager_1.getStagedChanges)(projectRoot);
|
|
72
|
+
const unstaged = (0, repo_manager_1.getUnstagedChanges)(projectRoot);
|
|
73
|
+
if (staged.length > 0 || unstaged.length > 0) {
|
|
74
|
+
console.log(`${spinner_1.colors.red('error:')} You have uncommitted changes`);
|
|
75
|
+
console.log('');
|
|
76
|
+
console.log('Commit or stash them before switching branches:');
|
|
77
|
+
console.log(` ${spinner_1.colors.cyan('relq commit -m "message"')}`);
|
|
78
|
+
console.log(` ${spinner_1.colors.cyan('relq stash')}`);
|
|
79
|
+
console.log('');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const state = loadBranchState(projectRoot);
|
|
83
|
+
if (createBranch) {
|
|
84
|
+
if (state.branches[branchName]) {
|
|
85
|
+
console.log(`${spinner_1.colors.red('error:')} Branch already exists: ${branchName}`);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const head = (0, repo_manager_1.getHead)(projectRoot);
|
|
89
|
+
if (!head) {
|
|
90
|
+
console.log(`${spinner_1.colors.red('error:')} No commits yet`);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
state.branches[branchName] = head;
|
|
94
|
+
state.current = branchName;
|
|
95
|
+
saveBranchState(state, projectRoot);
|
|
96
|
+
console.log(`${spinner_1.colors.green('✓')} Switched to new branch '${branchName}'`);
|
|
97
|
+
console.log('');
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (!state.branches[branchName]) {
|
|
101
|
+
console.log(`${spinner_1.colors.red('error:')} Branch not found: ${branchName}`);
|
|
102
|
+
console.log('');
|
|
103
|
+
console.log('Available branches:');
|
|
104
|
+
for (const name of Object.keys(state.branches)) {
|
|
105
|
+
console.log(` ${name}`);
|
|
106
|
+
}
|
|
107
|
+
console.log('');
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (state.current === branchName) {
|
|
111
|
+
console.log(`Already on '${branchName}'`);
|
|
112
|
+
console.log('');
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const currentHead = (0, repo_manager_1.getHead)(projectRoot);
|
|
116
|
+
if (currentHead) {
|
|
117
|
+
state.branches[state.current] = currentHead;
|
|
118
|
+
}
|
|
119
|
+
const targetHash = state.branches[branchName];
|
|
120
|
+
const targetCommit = (0, repo_manager_1.loadCommit)(targetHash, projectRoot);
|
|
121
|
+
if (!targetCommit) {
|
|
122
|
+
console.log(`${spinner_1.colors.red('error:')} Cannot find commit for branch`);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (targetCommit.schema) {
|
|
126
|
+
(0, repo_manager_1.saveSnapshot)(targetCommit.schema, projectRoot);
|
|
127
|
+
}
|
|
128
|
+
(0, repo_manager_1.setHead)(targetHash, projectRoot);
|
|
129
|
+
state.current = branchName;
|
|
130
|
+
saveBranchState(state, projectRoot);
|
|
131
|
+
console.log(`${spinner_1.colors.green('✓')} Switched to branch '${branchName}'`);
|
|
132
|
+
console.log('');
|
|
133
|
+
}
|
|
134
|
+
exports.default = checkoutCommand;
|
|
@@ -0,0 +1,283 @@
|
|
|
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.cherryPickCommand = cherryPickCommand;
|
|
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 cherryPickCommand(context) {
|
|
42
|
+
const { config, args, flags } = context;
|
|
43
|
+
const projectRoot = process.cwd();
|
|
44
|
+
console.log('');
|
|
45
|
+
if (!(0, repo_manager_1.isInitialized)(projectRoot)) {
|
|
46
|
+
console.log(`${spinner_1.colors.red('fatal:')} not a relq repository`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const abort = flags['abort'] === true;
|
|
50
|
+
const cherryPickStatePath = path.join(projectRoot, '.relq', 'CHERRY_PICK_STATE');
|
|
51
|
+
if (abort) {
|
|
52
|
+
if (fs.existsSync(cherryPickStatePath)) {
|
|
53
|
+
fs.unlinkSync(cherryPickStatePath);
|
|
54
|
+
console.log(`${spinner_1.colors.green('✓')} Cherry-pick aborted`);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
console.log(`${spinner_1.colors.muted('No cherry-pick in progress.')}`);
|
|
58
|
+
}
|
|
59
|
+
console.log('');
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (fs.existsSync(cherryPickStatePath)) {
|
|
63
|
+
const state = JSON.parse(fs.readFileSync(cherryPickStatePath, 'utf-8'));
|
|
64
|
+
console.log(`${spinner_1.colors.red('error:')} Cherry-pick in progress from ${(0, repo_manager_1.shortHash)(state.fromCommit)}`);
|
|
65
|
+
console.log('');
|
|
66
|
+
console.log(`${spinner_1.colors.muted('Use')} ${spinner_1.colors.cyan('relq resolve')} ${spinner_1.colors.muted('to resolve conflicts')}`);
|
|
67
|
+
console.log(`${spinner_1.colors.muted('Or')} ${spinner_1.colors.cyan('relq cherry-pick --abort')} ${spinner_1.colors.muted('to cancel')}`);
|
|
68
|
+
console.log('');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const ref = args[0];
|
|
72
|
+
if (!ref) {
|
|
73
|
+
console.log(`${spinner_1.colors.red('error:')} Please specify a commit`);
|
|
74
|
+
console.log('');
|
|
75
|
+
console.log(`Usage: ${spinner_1.colors.cyan('relq cherry-pick <commit>')}`);
|
|
76
|
+
console.log('');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const spinner = (0, spinner_1.createSpinner)();
|
|
80
|
+
spinner.start(`Cherry-picking ${(0, repo_manager_1.shortHash)(ref)}...`);
|
|
81
|
+
try {
|
|
82
|
+
const hash = (0, repo_manager_1.resolveRef)(ref, projectRoot);
|
|
83
|
+
if (!hash) {
|
|
84
|
+
spinner.fail(`Commit not found: ${ref}`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const targetCommit = (0, repo_manager_1.loadCommit)(hash, projectRoot);
|
|
88
|
+
const parentCommit = (0, repo_manager_1.loadParentCommit)(hash, projectRoot);
|
|
89
|
+
if (!targetCommit) {
|
|
90
|
+
spinner.fail('Cannot load commit');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (!parentCommit) {
|
|
94
|
+
spinner.fail('Cannot cherry-pick first commit (no parent)');
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const diff = calculateCommitDiff(parentCommit.schema, targetCommit.schema);
|
|
98
|
+
const currentSnapshot = (0, repo_manager_1.loadSnapshot)(projectRoot);
|
|
99
|
+
if (!currentSnapshot) {
|
|
100
|
+
spinner.fail('No snapshot found');
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const conflicts = detectCherryPickConflicts(currentSnapshot, diff);
|
|
104
|
+
if (conflicts.length > 0) {
|
|
105
|
+
const state = {
|
|
106
|
+
fromCommit: hash,
|
|
107
|
+
originalMessage: targetCommit.message,
|
|
108
|
+
conflicts,
|
|
109
|
+
diff,
|
|
110
|
+
createdAt: new Date().toISOString(),
|
|
111
|
+
};
|
|
112
|
+
fs.writeFileSync(cherryPickStatePath, JSON.stringify(state, null, 2));
|
|
113
|
+
spinner.fail(`${conflicts.length} conflict(s) detected`);
|
|
114
|
+
console.log('');
|
|
115
|
+
for (const c of conflicts.slice(0, 5)) {
|
|
116
|
+
const name = c.parentName ? `${c.parentName}.${c.objectName}` : c.objectName;
|
|
117
|
+
console.log(` ${spinner_1.colors.red('conflict:')} ${c.objectType.toLowerCase()} ${name}`);
|
|
118
|
+
console.log(` ${spinner_1.colors.muted(c.description)}`);
|
|
119
|
+
}
|
|
120
|
+
if (conflicts.length > 5) {
|
|
121
|
+
console.log(` ${spinner_1.colors.muted(`... and ${conflicts.length - 5} more`)}`);
|
|
122
|
+
}
|
|
123
|
+
console.log('');
|
|
124
|
+
console.log(`${spinner_1.colors.muted('Use')} ${spinner_1.colors.cyan('relq resolve --theirs')} ${spinner_1.colors.muted('to resolve')}`);
|
|
125
|
+
console.log(`${spinner_1.colors.muted('Or')} ${spinner_1.colors.cyan('relq cherry-pick --abort')} ${spinner_1.colors.muted('to cancel')}`);
|
|
126
|
+
console.log('');
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const newSnapshot = applyCommitDiff(currentSnapshot, diff);
|
|
130
|
+
(0, repo_manager_1.saveSnapshot)(newSnapshot, projectRoot);
|
|
131
|
+
const author = config?.author || 'Relq CLI';
|
|
132
|
+
const message = `Cherry-picked ${(0, repo_manager_1.shortHash)(hash)}: ${targetCommit.message}`;
|
|
133
|
+
const commit = (0, repo_manager_1.createCommit)(newSnapshot, author, message, projectRoot);
|
|
134
|
+
spinner.succeed(`Cherry-picked ${spinner_1.colors.yellow((0, repo_manager_1.shortHash)(hash))}`);
|
|
135
|
+
console.log(` ${spinner_1.colors.cyan(commit.message)}`);
|
|
136
|
+
console.log('');
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
spinner.fail('Cherry-pick failed');
|
|
140
|
+
console.error(spinner_1.colors.red(`Error: ${error instanceof Error ? error.message : error}`));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function calculateCommitDiff(parent, target) {
|
|
144
|
+
const diff = {
|
|
145
|
+
tablesAdded: [],
|
|
146
|
+
tablesRemoved: [],
|
|
147
|
+
tablesModified: [],
|
|
148
|
+
enumsAdded: [],
|
|
149
|
+
enumsRemoved: [],
|
|
150
|
+
columnsAdded: [],
|
|
151
|
+
columnsRemoved: [],
|
|
152
|
+
};
|
|
153
|
+
const parentTables = new Map(parent.tables.map(t => [t.name, t]));
|
|
154
|
+
const targetTables = new Map(target.tables.map(t => [t.name, t]));
|
|
155
|
+
for (const [name, table] of targetTables) {
|
|
156
|
+
if (!parentTables.has(name)) {
|
|
157
|
+
diff.tablesAdded.push(table);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
for (const [name] of parentTables) {
|
|
161
|
+
if (!targetTables.has(name)) {
|
|
162
|
+
diff.tablesRemoved.push(name);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
for (const [name, targetTable] of targetTables) {
|
|
166
|
+
const parentTable = parentTables.get(name);
|
|
167
|
+
if (!parentTable)
|
|
168
|
+
continue;
|
|
169
|
+
const parentCols = new Map(parentTable.columns.map(c => [c.name, c]));
|
|
170
|
+
const targetCols = new Map(targetTable.columns.map(c => [c.name, c]));
|
|
171
|
+
const changes = { columnsAdded: [], columnsRemoved: [] };
|
|
172
|
+
for (const [colName, col] of targetCols) {
|
|
173
|
+
if (!parentCols.has(colName)) {
|
|
174
|
+
changes.columnsAdded.push(col);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
for (const [colName] of parentCols) {
|
|
178
|
+
if (!targetCols.has(colName)) {
|
|
179
|
+
changes.columnsRemoved.push(colName);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (changes.columnsAdded.length > 0 || changes.columnsRemoved.length > 0) {
|
|
183
|
+
diff.tablesModified.push({ name, changes });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const parentEnums = new Set(parent.enums.map(e => e.name));
|
|
187
|
+
const targetEnums = new Map(target.enums.map(e => [e.name, e]));
|
|
188
|
+
for (const [name, e] of targetEnums) {
|
|
189
|
+
if (!parentEnums.has(name)) {
|
|
190
|
+
diff.enumsAdded.push(e);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
for (const name of parentEnums) {
|
|
194
|
+
if (!targetEnums.has(name)) {
|
|
195
|
+
diff.enumsRemoved.push(name);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return diff;
|
|
199
|
+
}
|
|
200
|
+
function detectCherryPickConflicts(current, diff) {
|
|
201
|
+
const conflicts = [];
|
|
202
|
+
for (const table of diff.tablesAdded) {
|
|
203
|
+
if (current.tables.find(t => t.name === table.name)) {
|
|
204
|
+
conflicts.push({
|
|
205
|
+
objectType: 'TABLE',
|
|
206
|
+
objectName: table.name,
|
|
207
|
+
currentValue: 'exists',
|
|
208
|
+
incomingValue: 'add',
|
|
209
|
+
description: 'Table already exists in current snapshot',
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
for (const tableName of diff.tablesRemoved) {
|
|
214
|
+
if (!current.tables.find(t => t.name === tableName)) {
|
|
215
|
+
conflicts.push({
|
|
216
|
+
objectType: 'TABLE',
|
|
217
|
+
objectName: tableName,
|
|
218
|
+
currentValue: 'missing',
|
|
219
|
+
incomingValue: 'remove',
|
|
220
|
+
description: 'Table does not exist in current snapshot',
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
for (const mod of diff.tablesModified) {
|
|
225
|
+
const currentTable = current.tables.find(t => t.name === mod.name);
|
|
226
|
+
if (!currentTable) {
|
|
227
|
+
conflicts.push({
|
|
228
|
+
objectType: 'TABLE',
|
|
229
|
+
objectName: mod.name,
|
|
230
|
+
currentValue: 'missing',
|
|
231
|
+
incomingValue: 'modify',
|
|
232
|
+
description: 'Table does not exist in current snapshot',
|
|
233
|
+
});
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
for (const col of mod.changes.columnsAdded) {
|
|
237
|
+
if (currentTable.columns.find(c => c.name === col.name)) {
|
|
238
|
+
conflicts.push({
|
|
239
|
+
objectType: 'COLUMN',
|
|
240
|
+
objectName: col.name,
|
|
241
|
+
parentName: mod.name,
|
|
242
|
+
currentValue: 'exists',
|
|
243
|
+
incomingValue: 'add',
|
|
244
|
+
description: 'Column already exists',
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
for (const e of diff.enumsAdded) {
|
|
250
|
+
if (current.enums.find(en => en.name === e.name)) {
|
|
251
|
+
conflicts.push({
|
|
252
|
+
objectType: 'ENUM',
|
|
253
|
+
objectName: e.name,
|
|
254
|
+
currentValue: 'exists',
|
|
255
|
+
incomingValue: 'add',
|
|
256
|
+
description: 'Enum already exists',
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return conflicts;
|
|
261
|
+
}
|
|
262
|
+
function applyCommitDiff(snapshot, diff) {
|
|
263
|
+
const result = JSON.parse(JSON.stringify(snapshot));
|
|
264
|
+
for (const table of diff.tablesAdded) {
|
|
265
|
+
result.tables.push(table);
|
|
266
|
+
}
|
|
267
|
+
result.tables = result.tables.filter(t => !diff.tablesRemoved.includes(t.name));
|
|
268
|
+
for (const mod of diff.tablesModified) {
|
|
269
|
+
const table = result.tables.find(t => t.name === mod.name);
|
|
270
|
+
if (!table)
|
|
271
|
+
continue;
|
|
272
|
+
for (const col of mod.changes.columnsAdded) {
|
|
273
|
+
table.columns.push(col);
|
|
274
|
+
}
|
|
275
|
+
table.columns = table.columns.filter(c => !mod.changes.columnsRemoved.includes(c.name));
|
|
276
|
+
}
|
|
277
|
+
for (const e of diff.enumsAdded) {
|
|
278
|
+
result.enums.push(e);
|
|
279
|
+
}
|
|
280
|
+
result.enums = result.enums.filter(e => !diff.enumsRemoved.includes(e.name));
|
|
281
|
+
return result;
|
|
282
|
+
}
|
|
283
|
+
exports.default = cherryPickCommand;
|