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.
@@ -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
- for (const col of table.columns) {
463
- const colPattern = new RegExp(`\\(${col.name}\\)|\\b${col.name}\\b`, 'i');
464
- if (colPattern.test(c.expression)) {
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(col.name, { name: c.name, values });
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, t]));
781
- const afterMap = new Map(after.map(t => [t.name, t]));
782
- for (const [name, trigger] of afterMap) {
783
- if (!beforeMap.has(name)) {
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(name);
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
- beforeTrigger.tableName !== trigger.tableName) {
792
- changes.push((0, change_tracker_1.createChange)('DROP', 'TRIGGER', name, beforeTrigger, null, beforeTrigger.tableName));
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 [name, trigger] of beforeMap) {
798
- if (!afterMap.has(name)) {
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
- for (const col of table.columns) {
455
- const colPattern = new RegExp(`\\(${col.name}\\)|\\b${col.name}\\b`, 'i');
456
- if (colPattern.test(c.expression)) {
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(col.name, { name: c.name, values });
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, t]));
774
- const afterMap = new Map(after.map(t => [t.name, t]));
775
- for (const [name, trigger] of afterMap) {
776
- if (!beforeMap.has(name)) {
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(name);
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
- beforeTrigger.tableName !== trigger.tableName) {
785
- changes.push(createChange('DROP', 'TRIGGER', name, beforeTrigger, null, beforeTrigger.tableName));
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 [name, trigger] of beforeMap) {
791
- if (!afterMap.has(name)) {
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "relq",
3
- "version": "1.0.49",
3
+ "version": "1.0.50",
4
4
  "description": "The Fully-Typed PostgreSQL ORM for TypeScript",
5
5
  "author": "Olajide Mathew O. <olajide.mathew@yuniq.solutions>",
6
6
  "license": "MIT",