relq 1.0.49 → 1.0.50
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/cli/commands/pull.cjs +31 -2
- package/dist/cjs/cli/utils/ast-codegen.cjs +6 -5
- package/dist/cjs/cli/utils/schema-comparator.cjs +12 -13
- package/dist/esm/cli/commands/pull.js +32 -3
- package/dist/esm/cli/utils/ast-codegen.js +6 -5
- package/dist/esm/cli/utils/schema-comparator.js +12 -13
- package/package.json +1 -1
|
@@ -244,6 +244,14 @@ async function pullCommand(context) {
|
|
|
244
244
|
if (remoteHead) {
|
|
245
245
|
(0, repo_manager_1.setFetchHead)(remoteHead, projectRoot);
|
|
246
246
|
}
|
|
247
|
+
const localCommits = (0, repo_manager_1.getAllCommits)(projectRoot);
|
|
248
|
+
const localHashes = new Set(localCommits.map(c => c.hash));
|
|
249
|
+
const missingCommits = remoteCommits.filter(c => !localHashes.has(c.hash));
|
|
250
|
+
if (missingCommits.length > 0) {
|
|
251
|
+
for (const commit of missingCommits.reverse()) {
|
|
252
|
+
(0, repo_manager_1.saveCommit)(commit, projectRoot);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
247
255
|
spinner.succeed(`Fetched ${remoteCommits.length} remote commits`);
|
|
248
256
|
console.log('');
|
|
249
257
|
console.log(cli_utils_1.colors.bold('Introspecting database...'));
|
|
@@ -423,7 +431,16 @@ async function pullCommand(context) {
|
|
|
423
431
|
comment: t.comment,
|
|
424
432
|
})),
|
|
425
433
|
functions: localSnapshot.functions || [],
|
|
426
|
-
triggers: localSnapshot.triggers || []
|
|
434
|
+
triggers: (localSnapshot.triggers || []).map(t => ({
|
|
435
|
+
name: t.name,
|
|
436
|
+
tableName: t.table,
|
|
437
|
+
event: t.events?.[0] || 'UPDATE',
|
|
438
|
+
timing: t.timing,
|
|
439
|
+
forEach: t.forEach || 'STATEMENT',
|
|
440
|
+
functionName: t.functionName,
|
|
441
|
+
definition: '',
|
|
442
|
+
isEnabled: true,
|
|
443
|
+
})),
|
|
427
444
|
};
|
|
428
445
|
const remoteForCompare = {
|
|
429
446
|
extensions: dbSchema.extensions || [],
|
|
@@ -864,7 +881,16 @@ async function pullCommand(context) {
|
|
|
864
881
|
comment: t.comment,
|
|
865
882
|
})),
|
|
866
883
|
functions: oldSnapshot.functions || [],
|
|
867
|
-
triggers: oldSnapshot.triggers || []
|
|
884
|
+
triggers: (oldSnapshot.triggers || []).map(t => ({
|
|
885
|
+
name: t.name,
|
|
886
|
+
tableName: t.table,
|
|
887
|
+
event: t.events?.[0] || 'UPDATE',
|
|
888
|
+
timing: t.timing,
|
|
889
|
+
forEach: t.forEach || 'STATEMENT',
|
|
890
|
+
functionName: t.functionName,
|
|
891
|
+
definition: '',
|
|
892
|
+
isEnabled: true,
|
|
893
|
+
})),
|
|
868
894
|
} : {
|
|
869
895
|
extensions: [],
|
|
870
896
|
enums: [],
|
|
@@ -920,6 +946,9 @@ async function pullCommand(context) {
|
|
|
920
946
|
(0, repo_manager_1.saveSnapshot)(currentSchema, projectRoot);
|
|
921
947
|
const duration = Date.now() - startTime;
|
|
922
948
|
if (!autoCommit) {
|
|
949
|
+
if (remoteHead) {
|
|
950
|
+
(0, repo_manager_1.setHead)(remoteHead, projectRoot);
|
|
951
|
+
}
|
|
923
952
|
if (hadPreviousSnapshot && schemaChanges.length > 0) {
|
|
924
953
|
(0, repo_manager_1.addUnstagedChanges)(schemaChanges, projectRoot);
|
|
925
954
|
spinner.succeed(`Detected ${schemaChanges.length} schema change(s)`);
|
|
@@ -12,6 +12,7 @@ const builder_1 = require("./ast/codegen/builder.cjs");
|
|
|
12
12
|
const type_map_1 = require("./ast/codegen/type-map.cjs");
|
|
13
13
|
const defaults_1 = require("./ast/codegen/defaults.cjs");
|
|
14
14
|
const constraints_1 = require("./ast/codegen/constraints.cjs");
|
|
15
|
+
const pg_parser_1 = require("./pg-parser.cjs");
|
|
15
16
|
let needsDefaultImport = false;
|
|
16
17
|
let needsSqlImport = false;
|
|
17
18
|
let trackingIdCounter = 0;
|
|
@@ -459,14 +460,14 @@ function generateTableCode(table, useCamelCase, enumNames, domainNames, columnTy
|
|
|
459
460
|
const columnChecks = new Map();
|
|
460
461
|
for (const c of table.constraints) {
|
|
461
462
|
if (c.type === 'CHECK' && c.expression) {
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
463
|
+
const extractedCol = (0, pg_parser_1.extractColumnFromCheck)(c.expression);
|
|
464
|
+
if (extractedCol) {
|
|
465
|
+
const matchingCol = table.columns.find(col => col.name.toLowerCase() === extractedCol);
|
|
466
|
+
if (matchingCol) {
|
|
465
467
|
const values = (0, constraints_1.extractEnumValues)(c.expression);
|
|
466
468
|
if (values && values.length > 0) {
|
|
467
|
-
columnChecks.set(
|
|
469
|
+
columnChecks.set(matchingCol.name, { name: c.name, values });
|
|
468
470
|
}
|
|
469
|
-
break;
|
|
470
471
|
}
|
|
471
472
|
}
|
|
472
473
|
}
|
|
@@ -777,26 +777,25 @@ async function compareFunctions(before, after) {
|
|
|
777
777
|
}
|
|
778
778
|
function compareTriggers(before, after) {
|
|
779
779
|
const changes = [];
|
|
780
|
-
const beforeMap = new Map(before.map(t => [t.name
|
|
781
|
-
const afterMap = new Map(after.map(t => [t.name
|
|
782
|
-
for (const [
|
|
783
|
-
if (!beforeMap.has(
|
|
784
|
-
changes.push((0, change_tracker_1.createChange)('CREATE', 'TRIGGER', name, null, trigger, trigger.tableName));
|
|
780
|
+
const beforeMap = new Map(before.map(t => [`${t.tableName}.${t.name}`, t]));
|
|
781
|
+
const afterMap = new Map(after.map(t => [`${t.tableName}.${t.name}`, t]));
|
|
782
|
+
for (const [key, trigger] of afterMap) {
|
|
783
|
+
if (!beforeMap.has(key)) {
|
|
784
|
+
changes.push((0, change_tracker_1.createChange)('CREATE', 'TRIGGER', trigger.name, null, trigger, trigger.tableName));
|
|
785
785
|
}
|
|
786
786
|
else {
|
|
787
|
-
const beforeTrigger = beforeMap.get(
|
|
787
|
+
const beforeTrigger = beforeMap.get(key);
|
|
788
788
|
if (beforeTrigger.timing !== trigger.timing ||
|
|
789
789
|
beforeTrigger.event !== trigger.event ||
|
|
790
|
-
beforeTrigger.functionName !== trigger.functionName
|
|
791
|
-
|
|
792
|
-
changes.push((0, change_tracker_1.createChange)('
|
|
793
|
-
changes.push((0, change_tracker_1.createChange)('CREATE', 'TRIGGER', name, null, trigger, trigger.tableName));
|
|
790
|
+
beforeTrigger.functionName !== trigger.functionName) {
|
|
791
|
+
changes.push((0, change_tracker_1.createChange)('DROP', 'TRIGGER', trigger.name, beforeTrigger, null, beforeTrigger.tableName));
|
|
792
|
+
changes.push((0, change_tracker_1.createChange)('CREATE', 'TRIGGER', trigger.name, null, trigger, trigger.tableName));
|
|
794
793
|
}
|
|
795
794
|
}
|
|
796
795
|
}
|
|
797
|
-
for (const [
|
|
798
|
-
if (!afterMap.has(
|
|
799
|
-
changes.push((0, change_tracker_1.createChange)('DROP', 'TRIGGER', name, trigger, null, trigger.tableName));
|
|
796
|
+
for (const [key, trigger] of beforeMap) {
|
|
797
|
+
if (!afterMap.has(key)) {
|
|
798
|
+
changes.push((0, change_tracker_1.createChange)('DROP', 'TRIGGER', trigger.name, trigger, null, trigger.tableName));
|
|
800
799
|
}
|
|
801
800
|
}
|
|
802
801
|
return changes;
|
|
@@ -8,7 +8,7 @@ import { syncTypesFromDb, getTypesFilePath, getTypesFromDb } from "../utils/type
|
|
|
8
8
|
import { getConnectionDescription } from "../utils/env-loader.js";
|
|
9
9
|
import { createSpinner, colors, formatBytes, formatDuration, fatal, confirm, warning, createMultiProgress, select } from "../utils/cli-utils.js";
|
|
10
10
|
import { loadRelqignore, isTableIgnored, isColumnIgnored, isIndexIgnored, isConstraintIgnored, isEnumIgnored, isDomainIgnored, isCompositeTypeIgnored, isFunctionIgnored, } from "../utils/relqignore.js";
|
|
11
|
-
import { isInitialized, initRepository, getHead, saveCommit, saveSnapshot, loadSnapshot, createCommit, shortHash, fetchRemoteCommits, ensureRemoteTable, setFetchHead, addUnstagedChanges, getStagedChanges, getUnstagedChanges, clearWorkingState, hashFileContent, saveFileHash, markCommitAsPulled, getAllCommits, } from "../utils/repo-manager.js";
|
|
11
|
+
import { isInitialized, initRepository, getHead, setHead, saveCommit, saveSnapshot, loadSnapshot, createCommit, shortHash, fetchRemoteCommits, ensureRemoteTable, setFetchHead, addUnstagedChanges, getStagedChanges, getUnstagedChanges, clearWorkingState, hashFileContent, saveFileHash, markCommitAsPulled, getAllCommits, } from "../utils/repo-manager.js";
|
|
12
12
|
import { compareSchemas } from "../utils/schema-comparator.js";
|
|
13
13
|
function toCamelCase(str) {
|
|
14
14
|
return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
@@ -208,6 +208,14 @@ export async function pullCommand(context) {
|
|
|
208
208
|
if (remoteHead) {
|
|
209
209
|
setFetchHead(remoteHead, projectRoot);
|
|
210
210
|
}
|
|
211
|
+
const localCommits = getAllCommits(projectRoot);
|
|
212
|
+
const localHashes = new Set(localCommits.map(c => c.hash));
|
|
213
|
+
const missingCommits = remoteCommits.filter(c => !localHashes.has(c.hash));
|
|
214
|
+
if (missingCommits.length > 0) {
|
|
215
|
+
for (const commit of missingCommits.reverse()) {
|
|
216
|
+
saveCommit(commit, projectRoot);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
211
219
|
spinner.succeed(`Fetched ${remoteCommits.length} remote commits`);
|
|
212
220
|
console.log('');
|
|
213
221
|
console.log(colors.bold('Introspecting database...'));
|
|
@@ -387,7 +395,16 @@ export async function pullCommand(context) {
|
|
|
387
395
|
comment: t.comment,
|
|
388
396
|
})),
|
|
389
397
|
functions: localSnapshot.functions || [],
|
|
390
|
-
triggers: localSnapshot.triggers || []
|
|
398
|
+
triggers: (localSnapshot.triggers || []).map(t => ({
|
|
399
|
+
name: t.name,
|
|
400
|
+
tableName: t.table,
|
|
401
|
+
event: t.events?.[0] || 'UPDATE',
|
|
402
|
+
timing: t.timing,
|
|
403
|
+
forEach: t.forEach || 'STATEMENT',
|
|
404
|
+
functionName: t.functionName,
|
|
405
|
+
definition: '',
|
|
406
|
+
isEnabled: true,
|
|
407
|
+
})),
|
|
391
408
|
};
|
|
392
409
|
const remoteForCompare = {
|
|
393
410
|
extensions: dbSchema.extensions || [],
|
|
@@ -828,7 +845,16 @@ export async function pullCommand(context) {
|
|
|
828
845
|
comment: t.comment,
|
|
829
846
|
})),
|
|
830
847
|
functions: oldSnapshot.functions || [],
|
|
831
|
-
triggers: oldSnapshot.triggers || []
|
|
848
|
+
triggers: (oldSnapshot.triggers || []).map(t => ({
|
|
849
|
+
name: t.name,
|
|
850
|
+
tableName: t.table,
|
|
851
|
+
event: t.events?.[0] || 'UPDATE',
|
|
852
|
+
timing: t.timing,
|
|
853
|
+
forEach: t.forEach || 'STATEMENT',
|
|
854
|
+
functionName: t.functionName,
|
|
855
|
+
definition: '',
|
|
856
|
+
isEnabled: true,
|
|
857
|
+
})),
|
|
832
858
|
} : {
|
|
833
859
|
extensions: [],
|
|
834
860
|
enums: [],
|
|
@@ -884,6 +910,9 @@ export async function pullCommand(context) {
|
|
|
884
910
|
saveSnapshot(currentSchema, projectRoot);
|
|
885
911
|
const duration = Date.now() - startTime;
|
|
886
912
|
if (!autoCommit) {
|
|
913
|
+
if (remoteHead) {
|
|
914
|
+
setHead(remoteHead, projectRoot);
|
|
915
|
+
}
|
|
887
916
|
if (hadPreviousSnapshot && schemaChanges.length > 0) {
|
|
888
917
|
addUnstagedChanges(schemaChanges, projectRoot);
|
|
889
918
|
spinner.succeed(`Detected ${schemaChanges.length} schema change(s)`);
|
|
@@ -4,6 +4,7 @@ import { astToBuilder } from "./ast/codegen/builder.js";
|
|
|
4
4
|
import { getColumnBuilder, getColumnBuilderWithInfo } from "./ast/codegen/type-map.js";
|
|
5
5
|
import { formatDefaultValue, resetDefaultImportFlags, getDefaultImportNeeded, getDefaultSqlImportNeeded, } from "./ast/codegen/defaults.js";
|
|
6
6
|
import { extractEnumValues, generateConstraintCode, generateCheckConstraintsOption, resetSqlImportFlag, getSqlImportNeeded, } from "./ast/codegen/constraints.js";
|
|
7
|
+
import { extractColumnFromCheck } from "./pg-parser.js";
|
|
7
8
|
let needsDefaultImport = false;
|
|
8
9
|
let needsSqlImport = false;
|
|
9
10
|
let trackingIdCounter = 0;
|
|
@@ -451,14 +452,14 @@ function generateTableCode(table, useCamelCase, enumNames, domainNames, columnTy
|
|
|
451
452
|
const columnChecks = new Map();
|
|
452
453
|
for (const c of table.constraints) {
|
|
453
454
|
if (c.type === 'CHECK' && c.expression) {
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
455
|
+
const extractedCol = extractColumnFromCheck(c.expression);
|
|
456
|
+
if (extractedCol) {
|
|
457
|
+
const matchingCol = table.columns.find(col => col.name.toLowerCase() === extractedCol);
|
|
458
|
+
if (matchingCol) {
|
|
457
459
|
const values = extractEnumValues(c.expression);
|
|
458
460
|
if (values && values.length > 0) {
|
|
459
|
-
columnChecks.set(
|
|
461
|
+
columnChecks.set(matchingCol.name, { name: c.name, values });
|
|
460
462
|
}
|
|
461
|
-
break;
|
|
462
463
|
}
|
|
463
464
|
}
|
|
464
465
|
}
|
|
@@ -770,26 +770,25 @@ async function compareFunctions(before, after) {
|
|
|
770
770
|
}
|
|
771
771
|
function compareTriggers(before, after) {
|
|
772
772
|
const changes = [];
|
|
773
|
-
const beforeMap = new Map(before.map(t => [t.name
|
|
774
|
-
const afterMap = new Map(after.map(t => [t.name
|
|
775
|
-
for (const [
|
|
776
|
-
if (!beforeMap.has(
|
|
777
|
-
changes.push(createChange('CREATE', 'TRIGGER', name, null, trigger, trigger.tableName));
|
|
773
|
+
const beforeMap = new Map(before.map(t => [`${t.tableName}.${t.name}`, t]));
|
|
774
|
+
const afterMap = new Map(after.map(t => [`${t.tableName}.${t.name}`, t]));
|
|
775
|
+
for (const [key, trigger] of afterMap) {
|
|
776
|
+
if (!beforeMap.has(key)) {
|
|
777
|
+
changes.push(createChange('CREATE', 'TRIGGER', trigger.name, null, trigger, trigger.tableName));
|
|
778
778
|
}
|
|
779
779
|
else {
|
|
780
|
-
const beforeTrigger = beforeMap.get(
|
|
780
|
+
const beforeTrigger = beforeMap.get(key);
|
|
781
781
|
if (beforeTrigger.timing !== trigger.timing ||
|
|
782
782
|
beforeTrigger.event !== trigger.event ||
|
|
783
|
-
beforeTrigger.functionName !== trigger.functionName
|
|
784
|
-
|
|
785
|
-
changes.push(createChange('
|
|
786
|
-
changes.push(createChange('CREATE', 'TRIGGER', name, null, trigger, trigger.tableName));
|
|
783
|
+
beforeTrigger.functionName !== trigger.functionName) {
|
|
784
|
+
changes.push(createChange('DROP', 'TRIGGER', trigger.name, beforeTrigger, null, beforeTrigger.tableName));
|
|
785
|
+
changes.push(createChange('CREATE', 'TRIGGER', trigger.name, null, trigger, trigger.tableName));
|
|
787
786
|
}
|
|
788
787
|
}
|
|
789
788
|
}
|
|
790
|
-
for (const [
|
|
791
|
-
if (!afterMap.has(
|
|
792
|
-
changes.push(createChange('DROP', 'TRIGGER', name, trigger, null, trigger.tableName));
|
|
789
|
+
for (const [key, trigger] of beforeMap) {
|
|
790
|
+
if (!afterMap.has(key)) {
|
|
791
|
+
changes.push(createChange('DROP', 'TRIGGER', trigger.name, trigger, null, trigger.tableName));
|
|
793
792
|
}
|
|
794
793
|
}
|
|
795
794
|
return changes;
|