@memberjunction/metadata-sync 3.3.0 → 4.0.0
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/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +17 -27
- package/dist/config.js.map +1 -1
- package/dist/constants/metadata-keywords.d.ts +1 -0
- package/dist/constants/metadata-keywords.d.ts.map +1 -0
- package/dist/constants/metadata-keywords.js +31 -42
- package/dist/constants/metadata-keywords.js.map +1 -1
- package/dist/index.d.ts +39 -37
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -62
- package/dist/index.js.map +1 -1
- package/dist/lib/EntityPropertyExtractor.d.ts +1 -0
- package/dist/lib/EntityPropertyExtractor.d.ts.map +1 -0
- package/dist/lib/EntityPropertyExtractor.js +1 -5
- package/dist/lib/EntityPropertyExtractor.js.map +1 -1
- package/dist/lib/FieldExternalizer.d.ts +1 -0
- package/dist/lib/FieldExternalizer.d.ts.map +1 -0
- package/dist/lib/FieldExternalizer.js +14 -21
- package/dist/lib/FieldExternalizer.js.map +1 -1
- package/dist/lib/RecordProcessor.d.ts +3 -2
- package/dist/lib/RecordProcessor.d.ts.map +1 -0
- package/dist/lib/RecordProcessor.js +16 -25
- package/dist/lib/RecordProcessor.js.map +1 -1
- package/dist/lib/RelatedEntityHandler.d.ts +3 -2
- package/dist/lib/RelatedEntityHandler.d.ts.map +1 -0
- package/dist/lib/RelatedEntityHandler.js +3 -9
- package/dist/lib/RelatedEntityHandler.js.map +1 -1
- package/dist/lib/config-manager.d.ts +2 -1
- package/dist/lib/config-manager.d.ts.map +1 -0
- package/dist/lib/config-manager.js +10 -15
- package/dist/lib/config-manager.js.map +1 -1
- package/dist/lib/database-reference-scanner.d.ts +3 -2
- package/dist/lib/database-reference-scanner.d.ts.map +1 -0
- package/dist/lib/database-reference-scanner.js +7 -13
- package/dist/lib/database-reference-scanner.js.map +1 -1
- package/dist/lib/deletion-auditor.d.ts +3 -2
- package/dist/lib/deletion-auditor.d.ts.map +1 -0
- package/dist/lib/deletion-auditor.js +9 -15
- package/dist/lib/deletion-auditor.js.map +1 -1
- package/dist/lib/deletion-report-generator.d.ts +2 -1
- package/dist/lib/deletion-report-generator.d.ts.map +1 -0
- package/dist/lib/deletion-report-generator.js +1 -5
- package/dist/lib/deletion-report-generator.js.map +1 -1
- package/dist/lib/entity-foreign-key-helper.d.ts +1 -0
- package/dist/lib/entity-foreign-key-helper.d.ts.map +1 -0
- package/dist/lib/entity-foreign-key-helper.js +1 -5
- package/dist/lib/entity-foreign-key-helper.js.map +1 -1
- package/dist/lib/file-backup-manager.d.ts +1 -0
- package/dist/lib/file-backup-manager.d.ts.map +1 -0
- package/dist/lib/file-backup-manager.js +22 -27
- package/dist/lib/file-backup-manager.js.map +1 -1
- package/dist/lib/file-write-batch.d.ts +2 -1
- package/dist/lib/file-write-batch.d.ts.map +1 -0
- package/dist/lib/file-write-batch.js +16 -21
- package/dist/lib/file-write-batch.js.map +1 -1
- package/dist/lib/json-preprocessor.d.ts +1 -0
- package/dist/lib/json-preprocessor.d.ts.map +1 -0
- package/dist/lib/json-preprocessor.js +21 -26
- package/dist/lib/json-preprocessor.js.map +1 -1
- package/dist/lib/json-write-helper.d.ts +2 -1
- package/dist/lib/json-write-helper.d.ts.map +1 -0
- package/dist/lib/json-write-helper.js +4 -11
- package/dist/lib/json-write-helper.js.map +1 -1
- package/dist/lib/provider-utils.d.ts +2 -1
- package/dist/lib/provider-utils.d.ts.map +1 -0
- package/dist/lib/provider-utils.js +15 -46
- package/dist/lib/provider-utils.js.map +1 -1
- package/dist/lib/record-dependency-analyzer.d.ts +2 -1
- package/dist/lib/record-dependency-analyzer.d.ts.map +1 -0
- package/dist/lib/record-dependency-analyzer.js +26 -31
- package/dist/lib/record-dependency-analyzer.js.map +1 -1
- package/dist/lib/singleton-manager.d.ts +2 -1
- package/dist/lib/singleton-manager.d.ts.map +1 -0
- package/dist/lib/singleton-manager.js +4 -9
- package/dist/lib/singleton-manager.js.map +1 -1
- package/dist/lib/sql-logger.d.ts +2 -1
- package/dist/lib/sql-logger.d.ts.map +1 -0
- package/dist/lib/sql-logger.js +8 -16
- package/dist/lib/sql-logger.js.map +1 -1
- package/dist/lib/sync-engine.d.ts +2 -1
- package/dist/lib/sync-engine.d.ts.map +1 -0
- package/dist/lib/sync-engine.js +58 -76
- package/dist/lib/sync-engine.js.map +1 -1
- package/dist/lib/transaction-manager.d.ts +2 -1
- package/dist/lib/transaction-manager.d.ts.map +1 -0
- package/dist/lib/transaction-manager.js +6 -11
- package/dist/lib/transaction-manager.js.map +1 -1
- package/dist/services/FileResetService.d.ts +1 -0
- package/dist/services/FileResetService.d.ts.map +1 -0
- package/dist/services/FileResetService.js +17 -24
- package/dist/services/FileResetService.js.map +1 -1
- package/dist/services/FormattingService.d.ts +2 -1
- package/dist/services/FormattingService.d.ts.map +1 -0
- package/dist/services/FormattingService.js +68 -73
- package/dist/services/FormattingService.js.map +1 -1
- package/dist/services/InitService.d.ts +1 -0
- package/dist/services/InitService.d.ts.map +1 -0
- package/dist/services/InitService.js +12 -19
- package/dist/services/InitService.js.map +1 -1
- package/dist/services/PullService.d.ts +2 -1
- package/dist/services/PullService.d.ts.map +1 -0
- package/dist/services/PullService.js +49 -60
- package/dist/services/PullService.js.map +1 -1
- package/dist/services/PushService.d.ts +2 -1
- package/dist/services/PushService.d.ts.map +1 -0
- package/dist/services/PushService.js +59 -68
- package/dist/services/PushService.js.map +1 -1
- package/dist/services/StatusService.d.ts +2 -1
- package/dist/services/StatusService.d.ts.map +1 -0
- package/dist/services/StatusService.js +14 -22
- package/dist/services/StatusService.js.map +1 -1
- package/dist/services/ValidationService.d.ts +2 -1
- package/dist/services/ValidationService.d.ts.map +1 -0
- package/dist/services/ValidationService.js +41 -71
- package/dist/services/ValidationService.js.map +1 -1
- package/dist/services/WatchService.d.ts +4 -3
- package/dist/services/WatchService.d.ts.map +1 -0
- package/dist/services/WatchService.js +35 -43
- package/dist/services/WatchService.js.map +1 -1
- package/dist/services/index.d.ts +9 -8
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +8 -19
- package/dist/services/index.js.map +1 -1
- package/dist/types/validation.d.ts +2 -1
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/types/validation.js +2 -23
- package/dist/types/validation.js.map +1 -1
- package/package.json +23 -21
|
@@ -1,35 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const json_write_helper_1 = require("../lib/json-write-helper");
|
|
18
|
-
const record_dependency_analyzer_1 = require("../lib/record-dependency-analyzer");
|
|
19
|
-
const json_preprocessor_1 = require("../lib/json-preprocessor");
|
|
20
|
-
const provider_utils_1 = require("../lib/provider-utils");
|
|
21
|
-
const deletion_auditor_1 = require("../lib/deletion-auditor");
|
|
22
|
-
const deletion_report_generator_1 = require("../lib/deletion-report-generator");
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import fastGlob from 'fast-glob';
|
|
4
|
+
import { Metadata } from '@memberjunction/core';
|
|
5
|
+
import { DeferrableLookupError } from '../lib/sync-engine.js';
|
|
6
|
+
import { loadEntityConfig, loadSyncConfig } from '../config.js';
|
|
7
|
+
import { FileBackupManager } from '../lib/file-backup-manager.js';
|
|
8
|
+
import { configManager } from '../lib/config-manager.js';
|
|
9
|
+
import { SQLLogger } from '../lib/sql-logger.js';
|
|
10
|
+
import { TransactionManager } from '../lib/transaction-manager.js';
|
|
11
|
+
import { JsonWriteHelper } from '../lib/json-write-helper.js';
|
|
12
|
+
import { RecordDependencyAnalyzer } from '../lib/record-dependency-analyzer.js';
|
|
13
|
+
import { JsonPreprocessor } from '../lib/json-preprocessor.js';
|
|
14
|
+
import { findEntityDirectories } from '../lib/provider-utils.js';
|
|
15
|
+
import { DeletionAuditor } from '../lib/deletion-auditor.js';
|
|
16
|
+
import { DeletionReportGenerator } from '../lib/deletion-report-generator.js';
|
|
23
17
|
// Configuration for parallel processing
|
|
24
18
|
const PARALLEL_BATCH_SIZE = 1; // Number of records to process in parallel at each dependency level
|
|
25
|
-
class PushService {
|
|
26
|
-
syncEngine;
|
|
27
|
-
contextUser;
|
|
28
|
-
warnings = [];
|
|
29
|
-
syncConfig = null;
|
|
30
|
-
deferredFileWrites = new Map();
|
|
31
|
-
deferredRecords = [];
|
|
19
|
+
export class PushService {
|
|
32
20
|
constructor(syncEngine, contextUser) {
|
|
21
|
+
this.warnings = [];
|
|
22
|
+
this.syncConfig = null;
|
|
23
|
+
this.deferredFileWrites = new Map();
|
|
24
|
+
this.deferredRecords = [];
|
|
33
25
|
this.syncEngine = syncEngine;
|
|
34
26
|
this.contextUser = contextUser;
|
|
35
27
|
}
|
|
@@ -56,11 +48,11 @@ class PushService {
|
|
|
56
48
|
// Reset deferred tracking for this push operation
|
|
57
49
|
this.deferredFileWrites.clear();
|
|
58
50
|
this.deferredRecords = [];
|
|
59
|
-
const fileBackupManager = new
|
|
51
|
+
const fileBackupManager = new FileBackupManager();
|
|
60
52
|
// Load sync config for SQL logging settings and autoCreateMissingRecords flag
|
|
61
53
|
// If dir option is specified, load from that directory, otherwise use original CWD
|
|
62
|
-
const configDir = options.dir ?
|
|
63
|
-
this.syncConfig = await
|
|
54
|
+
const configDir = options.dir ? path.resolve(configManager.getOriginalCwd(), options.dir) : configManager.getOriginalCwd();
|
|
55
|
+
this.syncConfig = await loadSyncConfig(configDir);
|
|
64
56
|
// Display warnings for special flags that are enabled
|
|
65
57
|
if (this.syncConfig?.push?.alwaysPush && !options.dryRun) {
|
|
66
58
|
callbacks?.onWarn?.('\n⚡ WARNING: alwaysPush is enabled - ALL records will be saved to database regardless of changes\n');
|
|
@@ -69,14 +61,14 @@ class PushService {
|
|
|
69
61
|
callbacks?.onWarn?.('\n🔧 WARNING: autoCreateMissingRecords is enabled - Missing records with primaryKey will be created\n');
|
|
70
62
|
}
|
|
71
63
|
if (options.verbose) {
|
|
72
|
-
callbacks?.onLog?.(`Original working directory: ${
|
|
64
|
+
callbacks?.onLog?.(`Original working directory: ${configManager.getOriginalCwd()}`);
|
|
73
65
|
callbacks?.onLog?.(`Config directory (with dir option): ${configDir}`);
|
|
74
|
-
callbacks?.onLog?.(`Config file path: ${
|
|
66
|
+
callbacks?.onLog?.(`Config file path: ${path.join(configDir, '.mj-sync.json')}`);
|
|
75
67
|
callbacks?.onLog?.(`Full sync config loaded: ${JSON.stringify(this.syncConfig, null, 2)}`);
|
|
76
68
|
callbacks?.onLog?.(`SQL logging config: ${JSON.stringify(this.syncConfig?.sqlLogging)}`);
|
|
77
69
|
}
|
|
78
|
-
const sqlLogger = new
|
|
79
|
-
const transactionManager = new
|
|
70
|
+
const sqlLogger = new SQLLogger(this.syncConfig);
|
|
71
|
+
const transactionManager = new TransactionManager(sqlLogger);
|
|
80
72
|
if (options.verbose) {
|
|
81
73
|
callbacks?.onLog?.(`SQLLogger enabled status: ${sqlLogger.enabled}`);
|
|
82
74
|
}
|
|
@@ -85,7 +77,7 @@ class PushService {
|
|
|
85
77
|
try {
|
|
86
78
|
// Initialize SQL logger if enabled and not dry-run
|
|
87
79
|
if (sqlLogger.enabled && !options.dryRun) {
|
|
88
|
-
const provider =
|
|
80
|
+
const provider = Metadata.Provider;
|
|
89
81
|
if (options.verbose) {
|
|
90
82
|
callbacks?.onLog?.(`SQL logging enabled: ${sqlLogger.enabled}`);
|
|
91
83
|
callbacks?.onLog?.(`Provider type: ${provider?.constructor?.name || 'Unknown'}`);
|
|
@@ -98,10 +90,10 @@ class PushService {
|
|
|
98
90
|
? `MetadataSync_Push_${timestamp}.sql`
|
|
99
91
|
: `push_${timestamp}.sql`;
|
|
100
92
|
// Use .sql-log-push directory in the config directory (where sync was initiated)
|
|
101
|
-
const outputDir =
|
|
102
|
-
const filepath =
|
|
93
|
+
const outputDir = path.join(configDir, this.syncConfig?.sqlLogging?.outputDirectory || './sql-log-push');
|
|
94
|
+
const filepath = path.join(outputDir, filename);
|
|
103
95
|
// Ensure the directory exists
|
|
104
|
-
await
|
|
96
|
+
await fs.ensureDir(path.dirname(filepath));
|
|
105
97
|
// Create the SQL logging session
|
|
106
98
|
sqlLoggingSession = await provider.CreateSqlLogger(filepath, {
|
|
107
99
|
formatAsMigration: this.syncConfig?.sqlLogging?.formatAsMigration || false,
|
|
@@ -125,7 +117,7 @@ class PushService {
|
|
|
125
117
|
// Find entity directories to process
|
|
126
118
|
// Note: If options.dir is specified, configDir already points to that directory
|
|
127
119
|
// So we don't need to pass it as specificDir
|
|
128
|
-
const entityDirs =
|
|
120
|
+
const entityDirs = findEntityDirectories(configDir, undefined, this.syncConfig?.directoryOrder, this.syncConfig?.ignoreDirectories, options.include, options.exclude);
|
|
129
121
|
if (entityDirs.length === 0) {
|
|
130
122
|
throw new Error('No entity directories found');
|
|
131
123
|
}
|
|
@@ -167,8 +159,8 @@ class PushService {
|
|
|
167
159
|
try {
|
|
168
160
|
await sqlLoggingSession.dispose();
|
|
169
161
|
// Delete the empty SQL log file since no operations occurred
|
|
170
|
-
if (await
|
|
171
|
-
await
|
|
162
|
+
if (await fs.pathExists(sqlLogPath)) {
|
|
163
|
+
await fs.remove(sqlLogPath);
|
|
172
164
|
if (options.verbose) {
|
|
173
165
|
callbacks?.onLog?.(`🗑️ Removed empty SQL log file: ${sqlLogPath}`);
|
|
174
166
|
}
|
|
@@ -198,7 +190,7 @@ class PushService {
|
|
|
198
190
|
// PHASE 1: Process creates/updates for all entities
|
|
199
191
|
callbacks?.onLog?.('📝 Processing creates and updates...\n');
|
|
200
192
|
for (const entityDir of entityDirs) {
|
|
201
|
-
const entityConfig = await
|
|
193
|
+
const entityConfig = await loadEntityConfig(entityDir);
|
|
202
194
|
if (!entityConfig) {
|
|
203
195
|
const warning = `Skipping ${entityDir} - no valid entity configuration`;
|
|
204
196
|
this.warnings.push(warning);
|
|
@@ -207,7 +199,7 @@ class PushService {
|
|
|
207
199
|
continue;
|
|
208
200
|
}
|
|
209
201
|
// Show folder with spinner at start
|
|
210
|
-
const dirName =
|
|
202
|
+
const dirName = path.relative(process.cwd(), entityDir) || '.';
|
|
211
203
|
callbacks?.onLog?.(`\n📁 ${dirName}:`);
|
|
212
204
|
// Use onProgress for animated spinner if available
|
|
213
205
|
if (callbacks?.onProgress) {
|
|
@@ -350,7 +342,7 @@ class PushService {
|
|
|
350
342
|
let errors = 0;
|
|
351
343
|
// Find all JSON files in the directory
|
|
352
344
|
const pattern = entityConfig.filePattern || '*.json';
|
|
353
|
-
const files = await (
|
|
345
|
+
const files = await fastGlob(pattern, {
|
|
354
346
|
cwd: entityDir,
|
|
355
347
|
absolute: true,
|
|
356
348
|
onlyFiles: true,
|
|
@@ -368,7 +360,7 @@ class PushService {
|
|
|
368
360
|
await fileBackupManager.backupFile(filePath);
|
|
369
361
|
}
|
|
370
362
|
// Read the raw file data first
|
|
371
|
-
const rawFileData = await
|
|
363
|
+
const rawFileData = await fs.readJson(filePath);
|
|
372
364
|
// Keep unprocessed data to write back (preserves @file: references)
|
|
373
365
|
const unprocessedRecords = Array.isArray(rawFileData) ? rawFileData : [rawFileData];
|
|
374
366
|
const isArray = Array.isArray(rawFileData);
|
|
@@ -379,12 +371,12 @@ class PushService {
|
|
|
379
371
|
if (hasIncludes) {
|
|
380
372
|
// Preprocess the JSON file to handle @include directives
|
|
381
373
|
// Create a new preprocessor instance for each file to ensure clean state
|
|
382
|
-
const jsonPreprocessor = new
|
|
374
|
+
const jsonPreprocessor = new JsonPreprocessor();
|
|
383
375
|
fileData = await jsonPreprocessor.processFile(filePath);
|
|
384
376
|
}
|
|
385
377
|
const records = Array.isArray(fileData) ? fileData : [fileData];
|
|
386
378
|
// Analyze dependencies and get sorted records
|
|
387
|
-
const analyzer = new
|
|
379
|
+
const analyzer = new RecordDependencyAnalyzer();
|
|
388
380
|
const analysisResult = await analyzer.analyzeFileRecords(records, entityConfig.entity);
|
|
389
381
|
if (analysisResult.circularDependencies.length > 0) {
|
|
390
382
|
callbacks?.onWarn?.(`⚠️ Circular dependencies detected in ${filePath}`);
|
|
@@ -521,10 +513,10 @@ class PushService {
|
|
|
521
513
|
else {
|
|
522
514
|
// Write immediately for files without deletions
|
|
523
515
|
if (isArray) {
|
|
524
|
-
await
|
|
516
|
+
await JsonWriteHelper.writeOrderedRecordData(filePath, unprocessedRecords);
|
|
525
517
|
}
|
|
526
518
|
else {
|
|
527
|
-
await
|
|
519
|
+
await JsonWriteHelper.writeOrderedRecordData(filePath, unprocessedRecords[0]);
|
|
528
520
|
}
|
|
529
521
|
}
|
|
530
522
|
}
|
|
@@ -537,7 +529,7 @@ class PushService {
|
|
|
537
529
|
return { created, updated, unchanged, deleted, skipped, deferred, errors };
|
|
538
530
|
}
|
|
539
531
|
async processFlattenedRecord(flattenedRecord, entityDir, options, batchContext, callbacks, entityConfig, allowDefer = true) {
|
|
540
|
-
const metadata = new
|
|
532
|
+
const metadata = new Metadata();
|
|
541
533
|
const { record, entityName, parentContext, id: recordId } = flattenedRecord;
|
|
542
534
|
// Skip deletion records - they're handled in Phase 2
|
|
543
535
|
// File writing is deferred for files containing deletions
|
|
@@ -584,7 +576,7 @@ class PushService {
|
|
|
584
576
|
}
|
|
585
577
|
catch (pkError) {
|
|
586
578
|
// Check if this is a deferrable lookup error
|
|
587
|
-
if (pkError instanceof
|
|
579
|
+
if (pkError instanceof DeferrableLookupError) {
|
|
588
580
|
throw new Error(`Cannot defer lookup in primaryKey field '${pkField}': ${pkError.message}. Primary key lookups must resolve immediately.`);
|
|
589
581
|
}
|
|
590
582
|
throw pkError;
|
|
@@ -660,7 +652,7 @@ class PushService {
|
|
|
660
652
|
}
|
|
661
653
|
catch (fieldError) {
|
|
662
654
|
// Check if this is a deferrable lookup error first
|
|
663
|
-
if (fieldError instanceof
|
|
655
|
+
if (fieldError instanceof DeferrableLookupError) {
|
|
664
656
|
// If allowDefer is false, we're in deferred processing mode - can't defer again
|
|
665
657
|
if (!allowDefer) {
|
|
666
658
|
const err = fieldError;
|
|
@@ -1156,12 +1148,12 @@ class PushService {
|
|
|
1156
1148
|
for (const entityDir of entityDirs) {
|
|
1157
1149
|
if (hasAnyDeletions)
|
|
1158
1150
|
break; // Early exit once we find any deletion
|
|
1159
|
-
const entityConfig = await
|
|
1151
|
+
const entityConfig = await loadEntityConfig(entityDir);
|
|
1160
1152
|
if (!entityConfig) {
|
|
1161
1153
|
continue;
|
|
1162
1154
|
}
|
|
1163
1155
|
const pattern = entityConfig.filePattern || '*.json';
|
|
1164
|
-
const files = await (
|
|
1156
|
+
const files = await fastGlob(pattern, {
|
|
1165
1157
|
cwd: entityDir,
|
|
1166
1158
|
absolute: true,
|
|
1167
1159
|
onlyFiles: true,
|
|
@@ -1171,7 +1163,7 @@ class PushService {
|
|
|
1171
1163
|
// Quick scan for delete directives without full processing
|
|
1172
1164
|
for (const filePath of files) {
|
|
1173
1165
|
try {
|
|
1174
|
-
const content = await
|
|
1166
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
1175
1167
|
// Fast string check for delete directives
|
|
1176
1168
|
if (content.includes('"delete"') && content.includes('true')) {
|
|
1177
1169
|
// More precise check - parse JSON to confirm
|
|
@@ -1200,15 +1192,15 @@ class PushService {
|
|
|
1200
1192
|
callbacks?.onLog?.('\n🔍 Analyzing deletion operations...\n');
|
|
1201
1193
|
// Load all records from all entity directories
|
|
1202
1194
|
const allRecords = [];
|
|
1203
|
-
const analyzer = new
|
|
1195
|
+
const analyzer = new RecordDependencyAnalyzer();
|
|
1204
1196
|
for (const entityDir of entityDirs) {
|
|
1205
|
-
const entityConfig = await
|
|
1197
|
+
const entityConfig = await loadEntityConfig(entityDir);
|
|
1206
1198
|
if (!entityConfig) {
|
|
1207
1199
|
continue;
|
|
1208
1200
|
}
|
|
1209
1201
|
// Find all JSON files
|
|
1210
1202
|
const pattern = entityConfig.filePattern || '*.json';
|
|
1211
|
-
const files = await (
|
|
1203
|
+
const files = await fastGlob(pattern, {
|
|
1212
1204
|
cwd: entityDir,
|
|
1213
1205
|
absolute: true,
|
|
1214
1206
|
onlyFiles: true,
|
|
@@ -1218,13 +1210,13 @@ class PushService {
|
|
|
1218
1210
|
// Load and flatten records from each file
|
|
1219
1211
|
for (const filePath of files) {
|
|
1220
1212
|
try {
|
|
1221
|
-
const rawFileData = await
|
|
1213
|
+
const rawFileData = await fs.readJson(filePath);
|
|
1222
1214
|
// Handle @include directives if present
|
|
1223
1215
|
let fileData = rawFileData;
|
|
1224
1216
|
const jsonString = JSON.stringify(rawFileData);
|
|
1225
1217
|
const hasIncludes = jsonString.includes('"@include"') || jsonString.includes('"@include.');
|
|
1226
1218
|
if (hasIncludes) {
|
|
1227
|
-
const jsonPreprocessor = new
|
|
1219
|
+
const jsonPreprocessor = new JsonPreprocessor();
|
|
1228
1220
|
fileData = await jsonPreprocessor.processFile(filePath);
|
|
1229
1221
|
}
|
|
1230
1222
|
const records = Array.isArray(fileData) ? fileData : [fileData];
|
|
@@ -1240,8 +1232,8 @@ class PushService {
|
|
|
1240
1232
|
}
|
|
1241
1233
|
}
|
|
1242
1234
|
// Perform comprehensive deletion audit
|
|
1243
|
-
const md = new
|
|
1244
|
-
const auditor = new
|
|
1235
|
+
const md = new Metadata();
|
|
1236
|
+
const auditor = new DeletionAuditor(md, this.contextUser);
|
|
1245
1237
|
const audit = await auditor.auditDeletions(allRecords);
|
|
1246
1238
|
// Check if any records actually need deletion
|
|
1247
1239
|
const totalMarkedForDeletion = audit.explicitDeletes.size + audit.implicitDeletes.size;
|
|
@@ -1255,7 +1247,7 @@ class PushService {
|
|
|
1255
1247
|
return null; // Signal that no deletion audit is needed
|
|
1256
1248
|
}
|
|
1257
1249
|
// Generate and display report (only if records need deletion)
|
|
1258
|
-
const report =
|
|
1250
|
+
const report = DeletionReportGenerator.generateReport(audit, options.verbose);
|
|
1259
1251
|
callbacks?.onLog?.(report);
|
|
1260
1252
|
callbacks?.onLog?.('');
|
|
1261
1253
|
// Check for blocking issues (only circular dependencies block execution)
|
|
@@ -1419,10 +1411,10 @@ class PushService {
|
|
|
1419
1411
|
for (const deferredWrite of this.deferredFileWrites.values()) {
|
|
1420
1412
|
try {
|
|
1421
1413
|
if (deferredWrite.isArray) {
|
|
1422
|
-
await
|
|
1414
|
+
await JsonWriteHelper.writeOrderedRecordData(deferredWrite.filePath, deferredWrite.records);
|
|
1423
1415
|
}
|
|
1424
1416
|
else {
|
|
1425
|
-
await
|
|
1417
|
+
await JsonWriteHelper.writeOrderedRecordData(deferredWrite.filePath, deferredWrite.records[0]);
|
|
1426
1418
|
}
|
|
1427
1419
|
}
|
|
1428
1420
|
catch (error) {
|
|
@@ -1517,5 +1509,4 @@ class PushService {
|
|
|
1517
1509
|
return keyParts.join('|');
|
|
1518
1510
|
}
|
|
1519
1511
|
}
|
|
1520
|
-
exports.PushService = PushService;
|
|
1521
1512
|
//# sourceMappingURL=PushService.js.map
|