relq 1.0.0 → 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 +102 -13
- 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 +102 -13
- 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
|
@@ -2,83 +2,162 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.diffCommand = diffCommand;
|
|
4
4
|
const config_loader_1 = require("../utils/config-loader.cjs");
|
|
5
|
-
const
|
|
6
|
-
const snapshot_manager_1 = require("../utils/snapshot-manager.cjs");
|
|
7
|
-
const schema_diff_1 = require("../utils/schema-diff.cjs");
|
|
8
|
-
const schema_hash_1 = require("../utils/schema-hash.cjs");
|
|
9
|
-
const schema_diff_2 = require("../utils/schema-diff.cjs");
|
|
10
|
-
const migration_generator_1 = require("../utils/migration-generator.cjs");
|
|
5
|
+
const fast_introspect_1 = require("../utils/fast-introspect.cjs");
|
|
11
6
|
const env_loader_1 = require("../utils/env-loader.cjs");
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
dim: '\x1b[2m',
|
|
16
|
-
red: '\x1b[31m',
|
|
17
|
-
green: '\x1b[32m',
|
|
18
|
-
yellow: '\x1b[33m',
|
|
19
|
-
blue: '\x1b[34m',
|
|
20
|
-
cyan: '\x1b[36m',
|
|
21
|
-
magenta: '\x1b[35m',
|
|
22
|
-
};
|
|
23
|
-
function filterDiff(diff, ignorePatterns) {
|
|
24
|
-
const patterns = ignorePatterns.map(p => {
|
|
25
|
-
const regexStr = p.replace(/\*/g, '.*').replace(/\?/g, '.');
|
|
26
|
-
return new RegExp(`^${regexStr}$`, 'i');
|
|
27
|
-
});
|
|
28
|
-
const matchesPattern = (name) => patterns.some(p => p.test(name));
|
|
29
|
-
const tables = diff.tables.filter(t => !matchesPattern(t.name));
|
|
30
|
-
const hasChanges = tables.length > 0 || diff.extensions.length > 0;
|
|
31
|
-
return {
|
|
32
|
-
...diff,
|
|
33
|
-
tables,
|
|
34
|
-
hasChanges,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
7
|
+
const spinner_1 = require("../utils/spinner.cjs");
|
|
8
|
+
const repo_manager_1 = require("../utils/repo-manager.cjs");
|
|
9
|
+
const change_tracker_1 = require("../utils/change-tracker.cjs");
|
|
37
10
|
async function diffCommand(context) {
|
|
38
|
-
const { config, flags } = context;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
11
|
+
const { config, args, flags } = context;
|
|
12
|
+
const projectRoot = process.cwd();
|
|
13
|
+
console.log('');
|
|
14
|
+
if (!(0, repo_manager_1.isInitialized)(projectRoot)) {
|
|
15
|
+
console.log(`${spinner_1.colors.red('fatal:')} not a relq repository`);
|
|
16
|
+
console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq init')} ${spinner_1.colors.muted('to initialize.')}`);
|
|
17
|
+
return;
|
|
42
18
|
}
|
|
43
|
-
(0, config_loader_1.requireValidConfig)(config);
|
|
44
|
-
const connection = config.connection;
|
|
45
|
-
const snapshotPath = config.sync?.snapshot || '.relq/snapshot.json';
|
|
46
|
-
const ignorePatterns = config.sync?.ignore || ['_relq_*'];
|
|
47
19
|
const showSQL = flags['sql'] === true;
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
20
|
+
const staged = flags['staged'] === true;
|
|
21
|
+
const target = args[0];
|
|
22
|
+
if (staged) {
|
|
23
|
+
await showStagedDiff(projectRoot, showSQL);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (target === 'remote/live' || target === 'remote' || target === 'live' || target === 'origin') {
|
|
27
|
+
if (!config) {
|
|
28
|
+
console.error('Error: No configuration found.');
|
|
29
|
+
process.exit(1);
|
|
57
30
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
31
|
+
(0, config_loader_1.requireValidConfig)(config);
|
|
32
|
+
await showOriginDiff(config, projectRoot, showSQL);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
await showUnstagedDiff(projectRoot, showSQL);
|
|
36
|
+
}
|
|
37
|
+
function getSymbol(change) {
|
|
38
|
+
if (change.type === 'CREATE')
|
|
39
|
+
return spinner_1.colors.green('+');
|
|
40
|
+
if (change.type === 'DROP')
|
|
41
|
+
return spinner_1.colors.red('-');
|
|
42
|
+
return spinner_1.colors.yellow('~');
|
|
43
|
+
}
|
|
44
|
+
async function showUnstagedDiff(projectRoot, showSQL) {
|
|
45
|
+
const unstaged = (0, repo_manager_1.getUnstagedChanges)(projectRoot);
|
|
46
|
+
if (unstaged.length === 0) {
|
|
47
|
+
console.log(`${spinner_1.colors.green('No unstaged changes.')}`);
|
|
48
|
+
console.log(`${spinner_1.colors.muted('Use')} ${spinner_1.colors.cyan('relq diff remote/live')} ${spinner_1.colors.muted('to compare with remote.')}`);
|
|
49
|
+
console.log('');
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
console.log(`${spinner_1.colors.bold('Unstaged changes:')}`);
|
|
53
|
+
console.log('');
|
|
54
|
+
const sorted = (0, change_tracker_1.sortChangesByDependency)(unstaged);
|
|
55
|
+
for (const change of sorted) {
|
|
56
|
+
console.log(` ${getSymbol(change)} ${change.objectType.toLowerCase()}: ${(0, change_tracker_1.getChangeDisplayName)(change)}`);
|
|
57
|
+
}
|
|
58
|
+
if (showSQL) {
|
|
59
|
+
console.log('');
|
|
60
|
+
console.log(`${spinner_1.colors.bold('SQL:')}`);
|
|
61
|
+
for (const change of sorted) {
|
|
62
|
+
const sql = (0, change_tracker_1.generateChangeSQL)(change);
|
|
63
|
+
if (sql)
|
|
64
|
+
console.log(`${spinner_1.colors.cyan(sql)}`);
|
|
66
65
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
66
|
+
}
|
|
67
|
+
console.log('');
|
|
68
|
+
console.log(`${spinner_1.colors.muted('Use')} ${spinner_1.colors.cyan('relq add .')} ${spinner_1.colors.muted('to stage all.')}`);
|
|
69
|
+
console.log('');
|
|
70
|
+
}
|
|
71
|
+
async function showStagedDiff(projectRoot, showSQL) {
|
|
72
|
+
const staged = (0, repo_manager_1.getStagedChanges)(projectRoot);
|
|
73
|
+
if (staged.length === 0) {
|
|
74
|
+
console.log(`${spinner_1.colors.green('No staged changes.')}`);
|
|
75
|
+
console.log(`${spinner_1.colors.muted('Use')} ${spinner_1.colors.cyan('relq add .')} ${spinner_1.colors.muted('to stage changes.')}`);
|
|
76
|
+
console.log('');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
console.log(`${spinner_1.colors.bold('Staged changes:')}`);
|
|
80
|
+
console.log('');
|
|
81
|
+
const sorted = (0, change_tracker_1.sortChangesByDependency)(staged);
|
|
82
|
+
for (const change of sorted) {
|
|
83
|
+
console.log(` ${getSymbol(change)} ${change.objectType.toLowerCase()}: ${(0, change_tracker_1.getChangeDisplayName)(change)}`);
|
|
84
|
+
}
|
|
85
|
+
if (showSQL) {
|
|
86
|
+
console.log('');
|
|
87
|
+
console.log(`${spinner_1.colors.bold('SQL:')}`);
|
|
88
|
+
for (const change of sorted) {
|
|
89
|
+
const sql = (0, change_tracker_1.generateChangeSQL)(change);
|
|
90
|
+
if (sql)
|
|
91
|
+
console.log(`${spinner_1.colors.cyan(sql)}`);
|
|
76
92
|
}
|
|
93
|
+
}
|
|
94
|
+
console.log('');
|
|
95
|
+
console.log(`${spinner_1.colors.muted('Use')} ${spinner_1.colors.cyan('relq commit -m "message"')} ${spinner_1.colors.muted('to commit.')}`);
|
|
96
|
+
console.log('');
|
|
97
|
+
}
|
|
98
|
+
async function showOriginDiff(config, projectRoot, showSQL) {
|
|
99
|
+
const connection = config.connection;
|
|
100
|
+
const spinner = (0, spinner_1.createSpinner)();
|
|
101
|
+
const snapshot = (0, repo_manager_1.loadSnapshot)(projectRoot);
|
|
102
|
+
if (!snapshot) {
|
|
103
|
+
console.log(`${spinner_1.colors.yellow('No local snapshot.')}`);
|
|
104
|
+
console.log(`${spinner_1.colors.muted('Run')} ${spinner_1.colors.cyan('relq pull')} ${spinner_1.colors.muted('first.')}`);
|
|
105
|
+
console.log('');
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
spinner.start(`Connecting to ${(0, env_loader_1.getConnectionDescription)(connection)}...`);
|
|
109
|
+
const remoteDb = await (0, fast_introspect_1.fastIntrospectDatabase)(connection, undefined, {
|
|
110
|
+
includeFunctions: config.includeFunctions ?? false,
|
|
111
|
+
includeTriggers: config.includeTriggers ?? false,
|
|
112
|
+
});
|
|
113
|
+
spinner.succeed(`Connected`);
|
|
114
|
+
const diffs = compareSchemas(snapshot, remoteDb);
|
|
115
|
+
if (diffs.length === 0) {
|
|
116
|
+
console.log('');
|
|
117
|
+
console.log(`${spinner_1.colors.green('✓ Local and remote are in sync.')}`);
|
|
77
118
|
console.log('');
|
|
78
|
-
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
console.log('');
|
|
122
|
+
console.log(`${spinner_1.colors.bold('Differences:')}`);
|
|
123
|
+
console.log('');
|
|
124
|
+
for (const d of diffs.slice(0, 20)) {
|
|
125
|
+
const sym = d.type === 'added' ? spinner_1.colors.green('+') : d.type === 'removed' ? spinner_1.colors.red('-') : spinner_1.colors.yellow('~');
|
|
126
|
+
console.log(` ${sym} ${d.description}`);
|
|
79
127
|
}
|
|
80
|
-
|
|
81
|
-
console.
|
|
82
|
-
|
|
128
|
+
if (diffs.length > 20) {
|
|
129
|
+
console.log(` ${spinner_1.colors.muted(`... and ${diffs.length - 20} more`)}`);
|
|
130
|
+
}
|
|
131
|
+
console.log('');
|
|
132
|
+
console.log(`${spinner_1.colors.muted('Use')} ${spinner_1.colors.cyan('relq pull')} ${spinner_1.colors.muted('to sync local with remote.')}`);
|
|
133
|
+
console.log('');
|
|
134
|
+
}
|
|
135
|
+
function compareSchemas(local, remote) {
|
|
136
|
+
const diffs = [];
|
|
137
|
+
const localTableNames = local.tables.map(t => t.name);
|
|
138
|
+
const remoteTableNames = (remote.tables || []).map((t) => t.name);
|
|
139
|
+
for (const name of remoteTableNames) {
|
|
140
|
+
if (!localTableNames.includes(name)) {
|
|
141
|
+
diffs.push({ type: 'added', description: `table: ${name}` });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
for (const name of localTableNames) {
|
|
145
|
+
if (!remoteTableNames.includes(name)) {
|
|
146
|
+
diffs.push({ type: 'removed', description: `table: ${name}` });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const localEnumNames = local.enums.map(e => e.name);
|
|
150
|
+
const remoteEnumNames = (remote.enums || []).map((e) => e.name);
|
|
151
|
+
for (const name of remoteEnumNames) {
|
|
152
|
+
if (!localEnumNames.includes(name)) {
|
|
153
|
+
diffs.push({ type: 'added', description: `enum: ${name}` });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
for (const name of localEnumNames) {
|
|
157
|
+
if (!remoteEnumNames.includes(name)) {
|
|
158
|
+
diffs.push({ type: 'removed', description: `enum: ${name}` });
|
|
159
|
+
}
|
|
83
160
|
}
|
|
161
|
+
return diffs;
|
|
84
162
|
}
|
|
163
|
+
exports.default = diffCommand;
|
|
@@ -41,6 +41,8 @@ const spinner_1 = require("../utils/spinner.cjs");
|
|
|
41
41
|
const repo_manager_1 = require("../utils/repo-manager.cjs");
|
|
42
42
|
const change_tracker_1 = require("../utils/change-tracker.cjs");
|
|
43
43
|
const sql_generator_1 = require("../utils/sql-generator.cjs");
|
|
44
|
+
const relqignore_1 = require("../utils/relqignore.cjs");
|
|
45
|
+
const config_1 = require("../../config/config.cjs");
|
|
44
46
|
async function exportCommand(context) {
|
|
45
47
|
const spinner = (0, spinner_1.createSpinner)();
|
|
46
48
|
const { args, flags } = context;
|
|
@@ -82,7 +84,18 @@ async function exportFromSnapshot(projectRoot, absoluteOutputPath, options) {
|
|
|
82
84
|
return;
|
|
83
85
|
}
|
|
84
86
|
spinner.succeed('Loaded snapshot');
|
|
85
|
-
const
|
|
87
|
+
const config = await (0, config_1.loadConfig)();
|
|
88
|
+
const ignorePatterns = (0, relqignore_1.loadRelqignore)(projectRoot);
|
|
89
|
+
const filteredSnapshot = filterNormalizedSchema(snapshot, ignorePatterns, {
|
|
90
|
+
includeFunctions: config.includeFunctions ?? options.includeFunctions ?? false,
|
|
91
|
+
includeTriggers: config.includeTriggers ?? options.includeTriggers ?? false,
|
|
92
|
+
includeViews: config.includeViews ?? false,
|
|
93
|
+
includeFDW: config.includeFDW ?? false,
|
|
94
|
+
});
|
|
95
|
+
const schema = normalizedToDbSchema(filteredSnapshot);
|
|
96
|
+
const ignoredCount = (snapshot.tables.length - filteredSnapshot.tables.length) +
|
|
97
|
+
(snapshot.enums.length - filteredSnapshot.enums.length) +
|
|
98
|
+
((snapshot.functions?.length || 0) - (filteredSnapshot.functions?.length || 0));
|
|
86
99
|
console.log('');
|
|
87
100
|
console.log(spinner_1.colors.cyan('Schema Summary:'));
|
|
88
101
|
console.log(` ${spinner_1.colors.green('•')} Tables: ${schema.tables.length}`);
|
|
@@ -91,11 +104,14 @@ async function exportFromSnapshot(projectRoot, absoluteOutputPath, options) {
|
|
|
91
104
|
console.log(` ${spinner_1.colors.green('•')} Composite Types: ${schema.compositeTypes.length}`);
|
|
92
105
|
console.log(` ${spinner_1.colors.green('•')} Sequences: ${schema.sequences?.length || 0}`);
|
|
93
106
|
console.log(` ${spinner_1.colors.green('•')} Extensions: ${schema.extensions.length}`);
|
|
94
|
-
if (
|
|
95
|
-
console.log(` ${spinner_1.colors.green('•')} Functions: ${
|
|
107
|
+
if (filteredSnapshot.functions?.length) {
|
|
108
|
+
console.log(` ${spinner_1.colors.green('•')} Functions: ${filteredSnapshot.functions.length}`);
|
|
109
|
+
}
|
|
110
|
+
if (filteredSnapshot.triggers?.length) {
|
|
111
|
+
console.log(` ${spinner_1.colors.green('•')} Triggers: ${filteredSnapshot.triggers.length}`);
|
|
96
112
|
}
|
|
97
|
-
if (
|
|
98
|
-
console.log(` ${spinner_1.colors.
|
|
113
|
+
if (ignoredCount > 0) {
|
|
114
|
+
console.log(` ${spinner_1.colors.muted(`ℹ ${ignoredCount} object(s) filtered by .relqignore`)}`);
|
|
99
115
|
}
|
|
100
116
|
spinner.start('Generating SQL statements');
|
|
101
117
|
const sqlContent = generateFullSQL(schema, options);
|
|
@@ -330,4 +346,47 @@ function generateFullSQL(schema, options) {
|
|
|
330
346
|
headerComment: header,
|
|
331
347
|
});
|
|
332
348
|
}
|
|
349
|
+
function filterNormalizedSchema(schema, patterns, options) {
|
|
350
|
+
const filteredTables = schema.tables
|
|
351
|
+
.filter(table => !(0, relqignore_1.isTableIgnored)(table.name, patterns).ignored)
|
|
352
|
+
.map(table => ({
|
|
353
|
+
...table,
|
|
354
|
+
columns: table.columns.filter(col => !(0, relqignore_1.isColumnIgnored)(table.name, col.name, patterns).ignored),
|
|
355
|
+
indexes: table.indexes.filter(idx => !(0, relqignore_1.isIndexIgnored)(table.name, idx.name, patterns).ignored),
|
|
356
|
+
constraints: table.constraints?.filter(con => !(0, relqignore_1.isConstraintIgnored)(table.name, con.name, patterns).ignored) || [],
|
|
357
|
+
}));
|
|
358
|
+
const filteredEnums = schema.enums.filter(e => !(0, relqignore_1.isEnumIgnored)(e.name, patterns).ignored);
|
|
359
|
+
const filteredDomains = schema.domains.filter(d => !(0, relqignore_1.isDomainIgnored)(d.name, patterns).ignored);
|
|
360
|
+
const filteredCompositeTypes = schema.compositeTypes.filter(c => !(0, relqignore_1.isCompositeTypeIgnored)(c.name, patterns).ignored);
|
|
361
|
+
const filteredSequences = schema.sequences.filter(s => !(0, relqignore_1.isSequenceIgnored)(s.name, patterns).ignored);
|
|
362
|
+
const filteredFunctions = options.includeFunctions
|
|
363
|
+
? (schema.functions || []).filter(f => !(0, relqignore_1.isFunctionIgnored)(f.name, patterns).ignored)
|
|
364
|
+
: [];
|
|
365
|
+
const filteredTriggers = options.includeTriggers
|
|
366
|
+
? schema.triggers || []
|
|
367
|
+
: [];
|
|
368
|
+
const filteredViews = options.includeViews
|
|
369
|
+
? schema.views || []
|
|
370
|
+
: [];
|
|
371
|
+
const filteredMaterializedViews = options.includeViews
|
|
372
|
+
? schema.materializedViews || []
|
|
373
|
+
: [];
|
|
374
|
+
const filteredForeignTables = options.includeFDW
|
|
375
|
+
? schema.foreignTables || []
|
|
376
|
+
: [];
|
|
377
|
+
return {
|
|
378
|
+
extensions: schema.extensions,
|
|
379
|
+
enums: filteredEnums,
|
|
380
|
+
domains: filteredDomains,
|
|
381
|
+
compositeTypes: filteredCompositeTypes,
|
|
382
|
+
sequences: filteredSequences,
|
|
383
|
+
collations: schema.collations,
|
|
384
|
+
tables: filteredTables,
|
|
385
|
+
functions: filteredFunctions,
|
|
386
|
+
triggers: filteredTriggers,
|
|
387
|
+
views: filteredViews,
|
|
388
|
+
materializedViews: filteredMaterializedViews,
|
|
389
|
+
foreignTables: filteredForeignTables,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
333
392
|
exports.default = exportCommand;
|
|
@@ -44,10 +44,25 @@ async function fetchCommand(context) {
|
|
|
44
44
|
(0, repo_manager_1.setFetchHead)(latestRemote.hash, projectRoot);
|
|
45
45
|
spinner.succeed(`Fetched ${remoteCommits.length} commits (${newCommits} new)`);
|
|
46
46
|
const localHead = (0, repo_manager_1.getHead)(projectRoot);
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
const localCommits = localHead ? getAllLocalCommitHashes(projectRoot) : new Set();
|
|
48
|
+
const remoteHashes = new Set(remoteCommits.map(c => c.hash));
|
|
49
|
+
const behind = remoteCommits.filter(c => !localCommits.has(c.hash)).length;
|
|
50
|
+
const ahead = [...localCommits].filter(h => !remoteHashes.has(h)).length;
|
|
51
|
+
console.log('');
|
|
52
|
+
if (behind > 0 && ahead > 0) {
|
|
53
|
+
console.log(`Your branch and 'origin/main' have diverged.`);
|
|
54
|
+
console.log(` ${spinner_1.colors.yellow(String(ahead))} commit(s) ahead, ${spinner_1.colors.yellow(String(behind))} commit(s) behind`);
|
|
55
|
+
}
|
|
56
|
+
else if (behind > 0) {
|
|
57
|
+
console.log(`Your branch is ${spinner_1.colors.yellow(String(behind))} commit(s) behind 'origin/main'.`);
|
|
58
|
+
console.log(` ${spinner_1.colors.muted('Use')} ${spinner_1.colors.cyan('relq pull')} ${spinner_1.colors.muted('to update.')}`);
|
|
59
|
+
}
|
|
60
|
+
else if (ahead > 0) {
|
|
61
|
+
console.log(`Your branch is ${spinner_1.colors.green(String(ahead))} commit(s) ahead of 'origin/main'.`);
|
|
62
|
+
console.log(` ${spinner_1.colors.muted('Use')} ${spinner_1.colors.cyan('relq push')} ${spinner_1.colors.muted('to publish.')}`);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.log(`${spinner_1.colors.green('✓')} Your branch is up to date with 'origin/main'.`);
|
|
51
66
|
}
|
|
52
67
|
}
|
|
53
68
|
catch (error) {
|
|
@@ -57,3 +72,18 @@ async function fetchCommand(context) {
|
|
|
57
72
|
}
|
|
58
73
|
console.log('');
|
|
59
74
|
}
|
|
75
|
+
function getAllLocalCommitHashes(projectRoot) {
|
|
76
|
+
const fs = require('fs');
|
|
77
|
+
const path = require('path');
|
|
78
|
+
const commitsDir = path.join(projectRoot, '.relq', 'commits');
|
|
79
|
+
const hashes = new Set();
|
|
80
|
+
if (fs.existsSync(commitsDir)) {
|
|
81
|
+
const files = fs.readdirSync(commitsDir);
|
|
82
|
+
for (const file of files) {
|
|
83
|
+
if (file.endsWith('.json')) {
|
|
84
|
+
hashes.add(file.replace('.json', ''));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return hashes;
|
|
89
|
+
}
|
|
@@ -123,7 +123,7 @@ function getMigrationFiles(migrationsDir) {
|
|
|
123
123
|
.sort();
|
|
124
124
|
}
|
|
125
125
|
async function getAppliedMigrations(connection, tableName) {
|
|
126
|
-
const { Pool } = await Promise.resolve().then(() => __importStar(require("
|
|
126
|
+
const { Pool } = await Promise.resolve().then(() => __importStar(require("../../addon/pg/index.cjs")));
|
|
127
127
|
const pool = new Pool({
|
|
128
128
|
host: connection.host,
|
|
129
129
|
port: connection.port || 5432,
|