@memberjunction/metadata-sync 3.4.0 → 4.1.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/README.md +907 -2200
- 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 +18 -3
- package/dist/lib/deletion-auditor.d.ts.map +1 -0
- package/dist/lib/deletion-auditor.js +111 -20
- 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 +41 -2
- package/dist/lib/record-dependency-analyzer.d.ts.map +1 -0
- package/dist/lib/record-dependency-analyzer.js +108 -40
- 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 +3 -1
- package/dist/services/PushService.d.ts.map +1 -0
- package/dist/services/PushService.js +144 -95
- 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,4 +1,4 @@
|
|
|
1
|
-
import { DeletionAudit } from './deletion-auditor';
|
|
1
|
+
import { DeletionAudit } from './deletion-auditor.js';
|
|
2
2
|
/**
|
|
3
3
|
* Generates human-readable reports for deletion audits
|
|
4
4
|
*/
|
|
@@ -56,3 +56,4 @@ export declare class DeletionReportGenerator {
|
|
|
56
56
|
*/
|
|
57
57
|
static generateSummary(audit: DeletionAudit): string;
|
|
58
58
|
}
|
|
59
|
+
//# sourceMappingURL=deletion-report-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deletion-report-generator.d.ts","sourceRoot":"","sources":["../../src/lib/deletion-report-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD;;GAEG;AACH,qBAAa,uBAAuB;IAChC;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,UAAQ,GAAG,MAAM;IA+CpE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAezB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAgBjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAwBjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAkBhC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IA2BpC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IA2B/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAkBtC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IA8B5B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAO7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAa5B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAqB/B;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM;CAqBvD"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DeletionReportGenerator = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* Generates human-readable reports for deletion audits
|
|
6
3
|
*/
|
|
7
|
-
class DeletionReportGenerator {
|
|
4
|
+
export class DeletionReportGenerator {
|
|
8
5
|
/**
|
|
9
6
|
* Generate comprehensive deletion plan report
|
|
10
7
|
*/
|
|
@@ -283,5 +280,4 @@ class DeletionReportGenerator {
|
|
|
283
280
|
return parts.length > 0 ? parts.join(', ') : 'no deletions';
|
|
284
281
|
}
|
|
285
282
|
}
|
|
286
|
-
exports.DeletionReportGenerator = DeletionReportGenerator;
|
|
287
283
|
//# sourceMappingURL=deletion-report-generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deletion-report-generator.js","sourceRoot":"","sources":["../../src/lib/deletion-report-generator.ts"],"names":[],"mappings":"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","sourcesContent":["import { DeletionAudit } from './deletion-auditor';\nimport { FlattenedRecord } from './record-dependency-analyzer';\n\n/**\n * Generates human-readable reports for deletion audits\n */\nexport class DeletionReportGenerator {\n /**\n * Generate comprehensive deletion plan report\n */\n static generateReport(audit: DeletionAudit, verbose = false): string {\n const lines: string[] = [];\n\n lines.push('═'.repeat(80));\n lines.push('DELETION AUDIT REPORT');\n lines.push('═'.repeat(80));\n lines.push('');\n\n // Summary\n this.addSummary(lines, audit);\n\n // Explicit deletes (verbose only)\n if (verbose && audit.explicitDeletes.size > 0) {\n this.addExplicitDeletes(lines, audit);\n }\n\n // Implicit deletes\n if (audit.implicitDeletes.size > 0) {\n this.addImplicitDeletes(lines, audit);\n }\n\n // Already deleted records\n if (audit.alreadyDeleted.size > 0) {\n this.addAlreadyDeleted(lines, audit);\n }\n\n // Database-only references\n if (audit.orphanedReferences.length > 0) {\n this.addOrphanedReferences(lines, audit);\n }\n\n // Deletion order (verbose only)\n if (verbose && audit.deletionLevels.length > 0) {\n this.addDeletionOrder(lines, audit);\n }\n\n // Circular dependencies\n if (audit.circularDependencies.length > 0) {\n this.addCircularDependencies(lines, audit);\n }\n\n // Conclusion\n this.addConclusion(lines, audit);\n\n return lines.join('\\n');\n }\n\n /**\n * Generate summary section\n */\n private static addSummary(lines: string[], audit: DeletionAudit): void {\n const totalMarkedForDeletion = audit.explicitDeletes.size + audit.implicitDeletes.size;\n const needDeletion = totalMarkedForDeletion - audit.alreadyDeleted.size;\n\n lines.push('SUMMARY:');\n lines.push(` Records Marked for Deletion: ${totalMarkedForDeletion}`);\n lines.push(` • Will be deleted: ${needDeletion}`);\n lines.push(` • Already deleted: ${audit.alreadyDeleted.size}`);\n lines.push(` Explicit Deletes (marked in metadata): ${audit.explicitDeletes.size}`);\n lines.push(` Implicit Deletes (required by FK): ${audit.implicitDeletes.size}`);\n lines.push(` Database-Only References: ${audit.orphanedReferences.length}`);\n lines.push(` Deletion Levels: ${audit.deletionLevels.length}`);\n lines.push('');\n }\n\n /**\n * Add explicit deletes section\n */\n private static addExplicitDeletes(lines: string[], audit: DeletionAudit): void {\n lines.push('EXPLICIT DELETES (marked with delete: true):');\n\n // Group by entity\n const byEntity = this.groupByEntity(Array.from(audit.explicitDeletes.values()));\n\n for (const [entityName, records] of byEntity) {\n lines.push(` ${entityName} (${records.length} record${records.length > 1 ? 's' : ''}):`);\n for (const record of records) {\n lines.push(` ✓ ${this.formatRecordId(record)}`);\n lines.push(` File: ${record.path}`);\n }\n }\n lines.push('');\n }\n\n /**\n * Add implicit deletes section\n */\n private static addImplicitDeletes(lines: string[], audit: DeletionAudit): void {\n lines.push('⚠️ IMPLICIT DELETES (required to satisfy FK constraints):');\n lines.push(' These records will be deleted because they depend on explicitly deleted records.');\n lines.push('');\n\n // Group by entity\n const byEntity = this.groupByEntity(Array.from(audit.implicitDeletes.values()));\n\n for (const [entityName, records] of byEntity) {\n lines.push(` ${entityName} (${records.length} record${records.length > 1 ? 's' : ''}):`);\n for (const record of records) {\n lines.push(` → ${this.formatRecordId(record)}`);\n lines.push(` File: ${record.path}`);\n\n // Show what it depends on\n const deps = this.findDependencies(record, audit);\n if (deps.length > 0) {\n lines.push(` Depends on: ${deps.join(', ')}`);\n }\n }\n }\n lines.push('');\n }\n\n /**\n * Add already deleted records section\n */\n private static addAlreadyDeleted(lines: string[], audit: DeletionAudit): void {\n lines.push('ℹ️ ALREADY DELETED (exist in metadata but not in database):');\n lines.push(' These records are marked for deletion but already don\\'t exist in the database.');\n lines.push(' No action will be taken for these records.');\n lines.push('');\n\n // Group by entity\n const byEntity = this.groupByEntity(Array.from(audit.alreadyDeleted.values()));\n\n for (const [entityName, records] of byEntity) {\n lines.push(` ${entityName} (${records.length} record${records.length > 1 ? 's' : ''}):`);\n for (const record of records) {\n lines.push(` ✓ ${this.formatRecordId(record)}`);\n }\n }\n lines.push('');\n }\n\n /**\n * Add orphaned references section\n */\n private static addOrphanedReferences(lines: string[], audit: DeletionAudit): void {\n lines.push('⚠️ DATABASE-ONLY REFERENCES (not in metadata files):');\n lines.push(' These records exist in the database but not in metadata.');\n lines.push(' May be handled by database cascade delete rules.');\n lines.push(' If not, deletion will fail with FK constraint errors.');\n lines.push('');\n\n // Group by entity\n const byEntity = new Map<string, typeof audit.orphanedReferences>();\n for (const ref of audit.orphanedReferences) {\n if (!byEntity.has(ref.entityName)) {\n byEntity.set(ref.entityName, []);\n }\n byEntity.get(ref.entityName)!.push(ref);\n }\n\n for (const [entityName, refs] of byEntity) {\n lines.push(` ${entityName} (${refs.length} record${refs.length > 1 ? 's' : ''}):`);\n for (const ref of refs) {\n lines.push(` ⚠️ ID: ${ref.dependentId}`);\n lines.push(` References: ${ref.recordId} via ${ref.fieldName}`);\n lines.push(` Note: May be handled by cascade delete OR require manual handling`);\n }\n }\n lines.push('');\n }\n\n /**\n * Add deletion order section\n */\n private static addDeletionOrder(lines: string[], audit: DeletionAudit): void {\n lines.push('DELETION ORDER (reverse topological sort):');\n lines.push('Records will be deleted in this order (highest dependency level first):');\n lines.push('');\n\n for (let i = 0; i < audit.deletionLevels.length; i++) {\n const level = audit.deletionLevels[i];\n const levelNumber = audit.deletionLevels.length - i; // Reverse numbering for clarity\n\n lines.push(` Level ${levelNumber} (${level.length} record${level.length > 1 ? 's' : ''}):`);\n\n // Group by entity within level\n const byEntity = this.groupByEntity(level);\n for (const [entityName, records] of byEntity) {\n if (records.length === 1) {\n lines.push(` - ${entityName}: ${this.formatRecordId(records[0])}`);\n } else {\n lines.push(` - ${entityName} (${records.length} records):`);\n for (const record of records) {\n lines.push(` ${this.formatRecordId(record)}`);\n }\n }\n }\n }\n lines.push('');\n }\n\n /**\n * Add circular dependencies section\n */\n private static addCircularDependencies(lines: string[], audit: DeletionAudit): void {\n lines.push('❌ CIRCULAR DEPENDENCIES DETECTED:');\n lines.push(' The following circular dependencies prevent safe deletion:');\n lines.push('');\n\n for (let i = 0; i < audit.circularDependencies.length; i++) {\n const cycle = audit.circularDependencies[i];\n lines.push(` Cycle ${i + 1}:`);\n lines.push(` ${cycle.join(' → ')}`);\n }\n lines.push('');\n lines.push(' To resolve:');\n lines.push(' 1. Review the relationships creating the cycle');\n lines.push(' 2. Break the cycle by removing one of the dependencies');\n lines.push(' 3. Consider using NULL values or restructuring relationships');\n lines.push('');\n }\n\n /**\n * Add conclusion section\n */\n private static addConclusion(lines: string[], audit: DeletionAudit): void {\n lines.push('═'.repeat(80));\n\n if (audit.circularDependencies.length > 0) {\n lines.push('STATUS: ❌ CANNOT PROCEED');\n lines.push('');\n lines.push('Circular dependencies detected. Please resolve the cycles above.');\n } else if (audit.implicitDeletes.size > 0 || audit.orphanedReferences.length > 0) {\n lines.push('STATUS: ⚠️ REVIEW REQUIRED');\n lines.push('');\n if (audit.implicitDeletes.size > 0) {\n lines.push(`${audit.implicitDeletes.size} implicit deletion${audit.implicitDeletes.size > 1 ? 's' : ''} will occur.`);\n lines.push('Review the implicit deletes above and confirm this is intended.');\n }\n if (audit.orphanedReferences.length > 0) {\n if (audit.implicitDeletes.size > 0) {\n lines.push('');\n }\n lines.push(`${audit.orphanedReferences.length} database-only reference${audit.orphanedReferences.length > 1 ? 's' : ''} detected.`);\n lines.push('These may be handled by cascade delete rules or may cause FK errors.');\n }\n } else {\n lines.push('STATUS: ✓ SAFE TO PROCEED');\n lines.push('');\n lines.push('All deletions are explicitly marked and have no dependencies.');\n }\n\n lines.push('═'.repeat(80));\n }\n\n /**\n * Format a record ID for display\n */\n private static formatRecordId(record: FlattenedRecord): string {\n return record.record.fields?.Name ||\n record.record.primaryKey?.ID ||\n record.record.fields?.ID ||\n record.id;\n }\n\n /**\n * Group records by entity name\n */\n private static groupByEntity(records: FlattenedRecord[]): Map<string, FlattenedRecord[]> {\n const byEntity = new Map<string, FlattenedRecord[]>();\n\n for (const record of records) {\n if (!byEntity.has(record.entityName)) {\n byEntity.set(record.entityName, []);\n }\n byEntity.get(record.entityName)!.push(record);\n }\n\n return byEntity;\n }\n\n /**\n * Find what an implicit delete depends on (for display)\n */\n private static findDependencies(\n record: FlattenedRecord,\n audit: DeletionAudit\n ): string[] {\n const deps: string[] = [];\n\n for (const depId of record.dependencies) {\n const explicitRecord = audit.explicitDeletes.get(depId);\n if (explicitRecord) {\n deps.push(`${explicitRecord.entityName}:${this.formatRecordId(explicitRecord)}`);\n } else {\n const implicitRecord = audit.implicitDeletes.get(depId);\n if (implicitRecord) {\n deps.push(`${implicitRecord.entityName}:${this.formatRecordId(implicitRecord)}`);\n }\n }\n }\n\n return deps;\n }\n\n /**\n * Generate a concise summary for logging\n */\n static generateSummary(audit: DeletionAudit): string {\n const parts: string[] = [];\n\n if (audit.explicitDeletes.size > 0) {\n parts.push(`${audit.explicitDeletes.size} explicit`);\n }\n\n if (audit.implicitDeletes.size > 0) {\n parts.push(`${audit.implicitDeletes.size} implicit`);\n }\n\n if (audit.orphanedReferences.length > 0) {\n parts.push(`${audit.orphanedReferences.length} orphaned refs`);\n }\n\n if (audit.circularDependencies.length > 0) {\n parts.push(`${audit.circularDependencies.length} cycles`);\n }\n\n return parts.length > 0 ? parts.join(', ') : 'no deletions';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"deletion-report-generator.js","sourceRoot":"","sources":["../../src/lib/deletion-report-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-foreign-key-helper.d.ts","sourceRoot":"","sources":["../../src/lib/entity-foreign-key-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAElE;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,qBAAa,sBAAsB;IAC/B;;;;;;;;OAQG;IACH,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IAmC1E;;;;;;;OAOG;WACU,qBAAqB,CAC9B,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAI9B;;;;;;OAMG;WACU,oBAAoB,CAC7B,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,MAAM,GACnB,OAAO,CAAC,OAAO,CAAC;IAKnB;;;;;;OAMG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;CAQ/E"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EntityForeignKeyHelper = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* Helper utility for working with entity foreign key relationships
|
|
6
3
|
* Provides methods for building reverse FK maps and querying dependencies
|
|
7
4
|
*/
|
|
8
|
-
class EntityForeignKeyHelper {
|
|
5
|
+
export class EntityForeignKeyHelper {
|
|
9
6
|
/**
|
|
10
7
|
* Build a reverse foreign key map
|
|
11
8
|
* Maps: entity name -> list of {entity, field} pairs that reference it
|
|
@@ -79,5 +76,4 @@ class EntityForeignKeyHelper {
|
|
|
79
76
|
return entity.ForeignKeys.map(fk => fk.Name);
|
|
80
77
|
}
|
|
81
78
|
}
|
|
82
|
-
exports.EntityForeignKeyHelper = EntityForeignKeyHelper;
|
|
83
79
|
//# sourceMappingURL=entity-foreign-key-helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-foreign-key-helper.js","sourceRoot":"","sources":["../../src/lib/entity-foreign-key-helper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"entity-foreign-key-helper.js","sourceRoot":"","sources":["../../src/lib/entity-foreign-key-helper.ts"],"names":[],"mappings":"AAYA;;;GAGG;AACH,MAAM,OAAO,sBAAsB;IAC/B;;;;;;;;OAQG;IACH,MAAM,CAAC,iBAAiB,CAAC,QAAkB;QACvC,MAAM,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;QAEtD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACrC,4FAA4F;YAC5F,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACjE,SAAS;YACb,CAAC;YAED,4CAA4C;YAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;YAEvC,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;gBAC9B,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC;gBAEzC,IAAI,CAAC,YAAY,EAAE,CAAC;oBAChB,SAAS,CAAC,4BAA4B;gBAC1C,CAAC;gBAED,uDAAuD;gBACvD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;oBAChC,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;gBACrC,CAAC;gBAED,UAAU,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC,IAAI,CAAC;oBAC/B,UAAU,EAAE,MAAM,CAAC,IAAI;oBACvB,SAAS,EAAE,KAAK,CAAC,IAAI;oBACrB,gBAAgB,EAAE,KAAK,CAAC,sBAAsB,IAAI,IAAI;iBACzD,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC;IACtB,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAC9B,QAAkB,EAClB,UAAkB;QAElB,OAAO,MAAM,QAAQ,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAC7B,QAAkB,EAClB,UAAkB;QAElB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,mBAAmB,CAAC,QAAkB,EAAE,UAAkB;QAC7D,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;CACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-backup-manager.d.ts","sourceRoot":"","sources":["../../src/lib/file-backup-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmBH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,WAAW,CAAkB;IAErC;;;;;;;;OAQG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAcjC;;;;;;;;;OASG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BjD;;;;;;;;;OASG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC/B;;;;;;;OAOG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB9B;;;;OAIG;IACH,QAAQ,IAAI;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE;CAO9E"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* @fileoverview File backup and rollback manager for MetadataSync operations
|
|
4
3
|
* @module file-backup-manager
|
|
@@ -7,15 +6,10 @@
|
|
|
7
6
|
* and allows rolling back all changes if any operation fails. It ensures atomic
|
|
8
7
|
* file operations by maintaining a temporary backup directory during push operations.
|
|
9
8
|
*/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
exports.FileBackupManager = void 0;
|
|
15
|
-
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
16
|
-
const path_1 = __importDefault(require("path"));
|
|
17
|
-
const os_1 = __importDefault(require("os"));
|
|
18
|
-
const uuid_1 = require("uuid");
|
|
9
|
+
import fs from 'fs-extra';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import os from 'os';
|
|
12
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
19
13
|
/**
|
|
20
14
|
* Manages file backups and rollback operations for MetadataSync
|
|
21
15
|
*
|
|
@@ -42,10 +36,12 @@ const uuid_1 = require("uuid");
|
|
|
42
36
|
* }
|
|
43
37
|
* ```
|
|
44
38
|
*/
|
|
45
|
-
class FileBackupManager {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
39
|
+
export class FileBackupManager {
|
|
40
|
+
constructor() {
|
|
41
|
+
this.backupDir = '';
|
|
42
|
+
this.backups = [];
|
|
43
|
+
this.initialized = false;
|
|
44
|
+
}
|
|
49
45
|
/**
|
|
50
46
|
* Initialize the backup manager by creating a temporary directory
|
|
51
47
|
*
|
|
@@ -60,10 +56,10 @@ class FileBackupManager {
|
|
|
60
56
|
throw new Error('FileBackupManager already initialized');
|
|
61
57
|
}
|
|
62
58
|
// Create a unique temporary directory for this session
|
|
63
|
-
const tempRoot =
|
|
64
|
-
const sessionId = (
|
|
65
|
-
this.backupDir =
|
|
66
|
-
await
|
|
59
|
+
const tempRoot = os.tmpdir();
|
|
60
|
+
const sessionId = uuidv4();
|
|
61
|
+
this.backupDir = path.join(tempRoot, 'mj-metadata-sync', sessionId);
|
|
62
|
+
await fs.ensureDir(this.backupDir);
|
|
67
63
|
this.initialized = true;
|
|
68
64
|
}
|
|
69
65
|
/**
|
|
@@ -86,9 +82,9 @@ class FileBackupManager {
|
|
|
86
82
|
// Already backed up, don't backup again
|
|
87
83
|
return;
|
|
88
84
|
}
|
|
89
|
-
const exists = await
|
|
90
|
-
const backupFileName = `${
|
|
91
|
-
const backupPath =
|
|
85
|
+
const exists = await fs.pathExists(filePath);
|
|
86
|
+
const backupFileName = `${path.basename(filePath)}_${Date.now()}_${this.backups.length}`;
|
|
87
|
+
const backupPath = path.join(this.backupDir, backupFileName);
|
|
92
88
|
const backupEntry = {
|
|
93
89
|
originalPath: filePath,
|
|
94
90
|
backupPath: backupPath,
|
|
@@ -96,7 +92,7 @@ class FileBackupManager {
|
|
|
96
92
|
};
|
|
97
93
|
if (exists) {
|
|
98
94
|
// Copy the file to backup location
|
|
99
|
-
await
|
|
95
|
+
await fs.copy(filePath, backupPath);
|
|
100
96
|
}
|
|
101
97
|
this.backups.push(backupEntry);
|
|
102
98
|
}
|
|
@@ -120,12 +116,12 @@ class FileBackupManager {
|
|
|
120
116
|
try {
|
|
121
117
|
if (backup.existed) {
|
|
122
118
|
// Restore the original file
|
|
123
|
-
await
|
|
119
|
+
await fs.copy(backup.backupPath, backup.originalPath, { overwrite: true });
|
|
124
120
|
}
|
|
125
121
|
else {
|
|
126
122
|
// File didn't exist before, remove it
|
|
127
|
-
if (await
|
|
128
|
-
await
|
|
123
|
+
if (await fs.pathExists(backup.originalPath)) {
|
|
124
|
+
await fs.remove(backup.originalPath);
|
|
129
125
|
}
|
|
130
126
|
}
|
|
131
127
|
}
|
|
@@ -159,7 +155,7 @@ class FileBackupManager {
|
|
|
159
155
|
return;
|
|
160
156
|
}
|
|
161
157
|
try {
|
|
162
|
-
await
|
|
158
|
+
await fs.remove(this.backupDir);
|
|
163
159
|
}
|
|
164
160
|
catch (error) {
|
|
165
161
|
// Log but don't throw - cleanup errors shouldn't fail the operation
|
|
@@ -182,5 +178,4 @@ class FileBackupManager {
|
|
|
182
178
|
};
|
|
183
179
|
}
|
|
184
180
|
}
|
|
185
|
-
exports.FileBackupManager = FileBackupManager;
|
|
186
181
|
//# sourceMappingURL=file-backup-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-backup-manager.js","sourceRoot":"","sources":["../../src/lib/file-backup-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"file-backup-manager.js","sourceRoot":"","sources":["../../src/lib/file-backup-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RecordData } from './sync-engine';
|
|
1
|
+
import { RecordData } from './sync-engine.js';
|
|
2
2
|
/**
|
|
3
3
|
* Batches file write operations to improve performance and ensure consistent property ordering.
|
|
4
4
|
* Collects all changes during processing and writes each file only once at the end.
|
|
@@ -59,3 +59,4 @@ export declare class FileWriteBatch {
|
|
|
59
59
|
*/
|
|
60
60
|
private createPrimaryKeyLookup;
|
|
61
61
|
}
|
|
62
|
+
//# sourceMappingURL=file-write-batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-write-batch.d.ts","sourceRoot":"","sources":["../../src/lib/file-write-batch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAmB3C;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,YAAY,CAAgD;IAEpE;;;;OAIG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,IAAI;IASnE;;;;;OAKG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAU7F;;;;OAIG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,GAAG,IAAI;IASpE;;OAEG;YACW,gBAAgB;IAgB9B;;OAEG;YACW,YAAY;IAsD1B;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAgC9B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;IAI3B;;OAEG;IACH,OAAO,CAAC,SAAS;IAOjB;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAI/B"}
|
|
@@ -1,26 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.FileWriteBatch = void 0;
|
|
7
|
-
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const json_write_helper_1 = require("./json-write-helper");
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { JsonWriteHelper } from './json-write-helper.js';
|
|
10
4
|
/**
|
|
11
5
|
* Batches file write operations to improve performance and ensure consistent property ordering.
|
|
12
6
|
* Collects all changes during processing and writes each file only once at the end.
|
|
13
7
|
*/
|
|
14
|
-
class FileWriteBatch {
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
export class FileWriteBatch {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.changes = new Map();
|
|
11
|
+
this.fileContents = new Map();
|
|
12
|
+
}
|
|
17
13
|
/**
|
|
18
14
|
* Queue a complete file write operation
|
|
19
15
|
* @param filePath - Path to the file
|
|
20
16
|
* @param data - RecordData or array of RecordData to write
|
|
21
17
|
*/
|
|
22
18
|
queueWrite(filePath, data) {
|
|
23
|
-
const absolutePath =
|
|
19
|
+
const absolutePath = path.resolve(filePath);
|
|
24
20
|
this.addChange(absolutePath, {
|
|
25
21
|
filePath: absolutePath,
|
|
26
22
|
operation: 'write',
|
|
@@ -34,7 +30,7 @@ class FileWriteBatch {
|
|
|
34
30
|
* @param primaryKeyLookup - Primary key lookup string to identify the record
|
|
35
31
|
*/
|
|
36
32
|
queueArrayUpdate(filePath, updatedRecord, primaryKeyLookup) {
|
|
37
|
-
const absolutePath =
|
|
33
|
+
const absolutePath = path.resolve(filePath);
|
|
38
34
|
this.addChange(absolutePath, {
|
|
39
35
|
filePath: absolutePath,
|
|
40
36
|
operation: 'update-array',
|
|
@@ -48,7 +44,7 @@ class FileWriteBatch {
|
|
|
48
44
|
* @param updatedRecord - The updated record data
|
|
49
45
|
*/
|
|
50
46
|
queueSingleUpdate(filePath, updatedRecord) {
|
|
51
|
-
const absolutePath =
|
|
47
|
+
const absolutePath = path.resolve(filePath);
|
|
52
48
|
this.addChange(absolutePath, {
|
|
53
49
|
filePath: absolutePath,
|
|
54
50
|
operation: 'update-single',
|
|
@@ -63,8 +59,8 @@ class FileWriteBatch {
|
|
|
63
59
|
return;
|
|
64
60
|
}
|
|
65
61
|
try {
|
|
66
|
-
if (await
|
|
67
|
-
const content = await
|
|
62
|
+
if (await fs.pathExists(filePath)) {
|
|
63
|
+
const content = await fs.readJson(filePath);
|
|
68
64
|
this.fileContents.set(filePath, content);
|
|
69
65
|
}
|
|
70
66
|
}
|
|
@@ -135,10 +131,10 @@ class FileWriteBatch {
|
|
|
135
131
|
const writePromises = [];
|
|
136
132
|
for (const [filePath, content] of this.fileContents.entries()) {
|
|
137
133
|
// Ensure directory exists
|
|
138
|
-
const dir =
|
|
139
|
-
await
|
|
134
|
+
const dir = path.dirname(filePath);
|
|
135
|
+
await fs.ensureDir(dir);
|
|
140
136
|
// Write using JsonWriteHelper for consistent property ordering
|
|
141
|
-
writePromises.push(
|
|
137
|
+
writePromises.push(JsonWriteHelper.writeOrderedRecordData(filePath, content));
|
|
142
138
|
}
|
|
143
139
|
await Promise.all(writePromises);
|
|
144
140
|
const filesWritten = this.fileContents.size;
|
|
@@ -182,5 +178,4 @@ class FileWriteBatch {
|
|
|
182
178
|
return keys.map(k => `${k}:${primaryKey[k]}`).join('|');
|
|
183
179
|
}
|
|
184
180
|
}
|
|
185
|
-
exports.FileWriteBatch = FileWriteBatch;
|
|
186
181
|
//# sourceMappingURL=file-write-batch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-write-batch.js","sourceRoot":"","sources":["../../src/lib/file-write-batch.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs-extra';\nimport path from 'path';\nimport { RecordData } from './sync-engine';\nimport { JsonWriteHelper } from './json-write-helper';\n\n/**\n * Represents a pending change to a file\n */\ninterface FileChange {\n /** Path to the file */\n filePath: string;\n /** Type of change operation */\n operation: 'write' | 'update-array' | 'update-single';\n /** The data to write */\n data: RecordData | RecordData[];\n /** For array updates: the index of the record to update */\n arrayIndex?: number;\n /** For updates: the primary key lookup to identify the record */\n primaryKeyLookup?: string;\n}\n\n/**\n * Batches file write operations to improve performance and ensure consistent property ordering.\n * Collects all changes during processing and writes each file only once at the end.\n */\nexport class FileWriteBatch {\n private changes = new Map<string, FileChange[]>();\n private fileContents = new Map<string, RecordData | RecordData[]>();\n \n /**\n * Queue a complete file write operation\n * @param filePath - Path to the file\n * @param data - RecordData or array of RecordData to write\n */\n queueWrite(filePath: string, data: RecordData | RecordData[]): void {\n const absolutePath = path.resolve(filePath);\n this.addChange(absolutePath, {\n filePath: absolutePath,\n operation: 'write',\n data\n });\n }\n \n /**\n * Queue an array record update operation\n * @param filePath - Path to the file containing the array\n * @param updatedRecord - The updated record data\n * @param primaryKeyLookup - Primary key lookup string to identify the record\n */\n queueArrayUpdate(filePath: string, updatedRecord: RecordData, primaryKeyLookup: string): void {\n const absolutePath = path.resolve(filePath);\n this.addChange(absolutePath, {\n filePath: absolutePath,\n operation: 'update-array',\n data: updatedRecord,\n primaryKeyLookup\n });\n }\n \n /**\n * Queue a single record update operation\n * @param filePath - Path to the file\n * @param updatedRecord - The updated record data\n */\n queueSingleUpdate(filePath: string, updatedRecord: RecordData): void {\n const absolutePath = path.resolve(filePath);\n this.addChange(absolutePath, {\n filePath: absolutePath,\n operation: 'update-single',\n data: updatedRecord\n });\n }\n \n /**\n * Load and cache file contents if not already loaded\n */\n private async ensureFileLoaded(filePath: string): Promise<void> {\n if (this.fileContents.has(filePath)) {\n return;\n }\n \n try {\n if (await fs.pathExists(filePath)) {\n const content = await fs.readJson(filePath);\n this.fileContents.set(filePath, content);\n }\n } catch (error) {\n // If file doesn't exist or can't be read, we'll create it fresh\n // Don't throw here - let the calling code handle it\n }\n }\n \n /**\n * Apply all queued changes to in-memory file contents\n */\n private async applyChanges(): Promise<void> {\n for (const [filePath, changes] of this.changes) {\n await this.ensureFileLoaded(filePath);\n\n // Start with existing file content or empty array\n let currentContent: RecordData | RecordData[] = this.fileContents.get(filePath) || [];\n\n for (const change of changes) {\n switch (change.operation) {\n case 'write':\n // Complete overwrite\n currentContent = change.data;\n break;\n\n case 'update-array': {\n // Ensure content is an array\n const contentArray = Array.isArray(currentContent) ? currentContent : [];\n\n if (change.primaryKeyLookup) {\n // Find existing record with matching primary key\n const index = contentArray.findIndex(r =>\n this.createPrimaryKeyLookup(r.primaryKey || {}) === change.primaryKeyLookup\n );\n\n if (index >= 0) {\n // Update existing record\n contentArray[index] = change.data as RecordData;\n } else {\n // Record not found, append it\n contentArray.push(change.data as RecordData);\n }\n } else {\n // No lookup key, just append\n contentArray.push(change.data as RecordData);\n }\n\n currentContent = contentArray;\n break;\n }\n\n case 'update-single':\n // Replace the entire file content with a single record\n currentContent = change.data;\n break;\n }\n }\n\n // Update the in-memory content\n if (currentContent !== undefined) {\n this.fileContents.set(filePath, currentContent);\n }\n }\n }\n \n /**\n * Write all batched changes to files using JsonWriteHelper for consistent ordering\n * @returns Number of files written\n */\n async flush(): Promise<number> {\n if (this.changes.size === 0) {\n return 0;\n }\n \n // Apply all changes to in-memory content first\n await this.applyChanges();\n \n // Write all files using JsonWriteHelper\n const writePromises: Promise<void>[] = [];\n \n for (const [filePath, content] of this.fileContents.entries()) {\n // Ensure directory exists\n const dir = path.dirname(filePath);\n await fs.ensureDir(dir);\n \n // Write using JsonWriteHelper for consistent property ordering\n writePromises.push(\n JsonWriteHelper.writeOrderedRecordData(filePath, content)\n );\n }\n \n await Promise.all(writePromises);\n \n const filesWritten = this.fileContents.size;\n \n // Clear all batched changes\n this.clear();\n \n return filesWritten;\n }\n \n /**\n * Clear all batched changes without writing\n */\n clear(): void {\n this.changes.clear();\n this.fileContents.clear();\n }\n \n /**\n * Get the number of files that will be written\n */\n getPendingFileCount(): number {\n return this.changes.size;\n }\n \n /**\n * Get all pending file paths\n */\n getPendingFiles(): string[] {\n return Array.from(this.changes.keys());\n }\n \n /**\n * Add a change to the batch\n */\n private addChange(filePath: string, change: FileChange): void {\n if (!this.changes.has(filePath)) {\n this.changes.set(filePath, []);\n }\n this.changes.get(filePath)!.push(change);\n }\n \n /**\n * Create a primary key lookup string (same logic as PullService)\n */\n private createPrimaryKeyLookup(primaryKey: Record<string, any>): string {\n const keys = Object.keys(primaryKey).sort();\n return keys.map(k => `${k}:${primaryKey[k]}`).join('|');\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"file-write-batch.js","sourceRoot":"","sources":["../../src/lib/file-write-batch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-preprocessor.d.ts","sourceRoot":"","sources":["../../src/lib/json-preprocessor.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC7B;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAA0B;IAE9C;;;;OAIG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAMjD;;;;;OAKG;YACW,uBAAuB;IAWrC;;;;;OAKG;YACW,YAAY;IA8B1B;;;;;OAKG;YACW,aAAa;IA0E3B;;;;OAIG;YACW,qBAAqB;IA+BnC;;;;OAIG;YACW,eAAe;IAyC7B;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAKnB;;;;;OAKG;IACG,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAIjE"}
|
|
@@ -1,18 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.JsonPreprocessor = void 0;
|
|
7
|
-
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const metadata_keywords_1 = require("../constants/metadata-keywords");
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { METADATA_KEYWORDS, extractKeywordValue } from '../constants/metadata-keywords.js';
|
|
10
4
|
/**
|
|
11
5
|
* Preprocesses JSON files to handle @include directives
|
|
12
6
|
* Supports including external JSON files with spreading or element insertion
|
|
13
7
|
*/
|
|
14
|
-
class JsonPreprocessor {
|
|
15
|
-
|
|
8
|
+
export class JsonPreprocessor {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.visitedPaths = new Set();
|
|
11
|
+
}
|
|
16
12
|
/**
|
|
17
13
|
* Process a JSON file and resolve all @include directives
|
|
18
14
|
* @param filePath - Path to the JSON file to process
|
|
@@ -20,7 +16,7 @@ class JsonPreprocessor {
|
|
|
20
16
|
*/
|
|
21
17
|
async processFile(filePath) {
|
|
22
18
|
this.visitedPaths.clear();
|
|
23
|
-
const fileContent = await
|
|
19
|
+
const fileContent = await fs.readJson(filePath);
|
|
24
20
|
return this.processIncludesInternal(fileContent, filePath);
|
|
25
21
|
}
|
|
26
22
|
/**
|
|
@@ -51,7 +47,7 @@ class JsonPreprocessor {
|
|
|
51
47
|
const result = [];
|
|
52
48
|
for (const item of arr) {
|
|
53
49
|
// Check for string-based include in array (default element mode)
|
|
54
|
-
const includePrefix = `${
|
|
50
|
+
const includePrefix = `${METADATA_KEYWORDS.INCLUDE}:`;
|
|
55
51
|
if (typeof item === 'string' && item.startsWith(includePrefix)) {
|
|
56
52
|
// Extract path directly since @include: format isn't handled by extractKeywordValue
|
|
57
53
|
const includePath = item.substring(includePrefix.length).trim();
|
|
@@ -88,7 +84,7 @@ class JsonPreprocessor {
|
|
|
88
84
|
const includeDirectives = new Map();
|
|
89
85
|
// First pass: identify all @include keys (both @include and @include.*)
|
|
90
86
|
for (const key of Object.keys(obj)) {
|
|
91
|
-
if (key ===
|
|
87
|
+
if (key === METADATA_KEYWORDS.INCLUDE || key.startsWith(`${METADATA_KEYWORDS.INCLUDE}.`)) {
|
|
92
88
|
includeKeys.push(key);
|
|
93
89
|
const includeValue = obj[key];
|
|
94
90
|
if (typeof includeValue === 'string') {
|
|
@@ -108,7 +104,7 @@ class JsonPreprocessor {
|
|
|
108
104
|
}
|
|
109
105
|
// Second pass: process all properties in order, spreading includes when encountered
|
|
110
106
|
for (const [key, value] of Object.entries(obj)) {
|
|
111
|
-
if (key ===
|
|
107
|
+
if (key === METADATA_KEYWORDS.INCLUDE || key.startsWith(`${METADATA_KEYWORDS.INCLUDE}.`)) {
|
|
112
108
|
// Process this include directive
|
|
113
109
|
const includeDirective = includeDirectives.get(key);
|
|
114
110
|
if (includeDirective) {
|
|
@@ -141,9 +137,9 @@ class JsonPreprocessor {
|
|
|
141
137
|
}
|
|
142
138
|
else {
|
|
143
139
|
// Regular property - process recursively and handle @file references
|
|
144
|
-
if (typeof value === 'string' && value.startsWith(
|
|
140
|
+
if (typeof value === 'string' && value.startsWith(METADATA_KEYWORDS.FILE)) {
|
|
145
141
|
// Process @file reference
|
|
146
|
-
const filePath =
|
|
142
|
+
const filePath = extractKeywordValue(value);
|
|
147
143
|
const resolvedPath = this.resolvePath(filePath, currentFilePath);
|
|
148
144
|
result[key] = await this.loadFileContent(resolvedPath);
|
|
149
145
|
}
|
|
@@ -163,12 +159,12 @@ class JsonPreprocessor {
|
|
|
163
159
|
* @returns The processed content of the included file
|
|
164
160
|
*/
|
|
165
161
|
async loadAndProcessInclude(filePath) {
|
|
166
|
-
const absolutePath =
|
|
162
|
+
const absolutePath = path.resolve(filePath);
|
|
167
163
|
// Check if this file is already being processed (circular reference)
|
|
168
164
|
if (this.visitedPaths.has(absolutePath)) {
|
|
169
165
|
throw new Error(`Circular reference detected: ${absolutePath} is already being processed`);
|
|
170
166
|
}
|
|
171
|
-
if (!await
|
|
167
|
+
if (!await fs.pathExists(filePath)) {
|
|
172
168
|
// Log error details before throwing
|
|
173
169
|
console.error(`\n❌ INCLUDE FILE NOT FOUND`);
|
|
174
170
|
console.error(` Referenced file: ${filePath}`);
|
|
@@ -179,7 +175,7 @@ class JsonPreprocessor {
|
|
|
179
175
|
// Add to visited paths before processing
|
|
180
176
|
this.visitedPaths.add(absolutePath);
|
|
181
177
|
try {
|
|
182
|
-
const content = await
|
|
178
|
+
const content = await fs.readJson(filePath);
|
|
183
179
|
// Process the content (visited tracking is handled in this method)
|
|
184
180
|
return this.processIncludesInternal(content, filePath);
|
|
185
181
|
}
|
|
@@ -194,7 +190,7 @@ class JsonPreprocessor {
|
|
|
194
190
|
* @returns The file content (processed if JSON with @includes)
|
|
195
191
|
*/
|
|
196
192
|
async loadFileContent(filePath) {
|
|
197
|
-
if (!await
|
|
193
|
+
if (!await fs.pathExists(filePath)) {
|
|
198
194
|
// Log error details before throwing
|
|
199
195
|
console.error(`\n❌ FILE NOT FOUND`);
|
|
200
196
|
console.error(` Referenced file: ${filePath}`);
|
|
@@ -205,7 +201,7 @@ class JsonPreprocessor {
|
|
|
205
201
|
try {
|
|
206
202
|
if (filePath.endsWith('.json')) {
|
|
207
203
|
// For JSON files, load and check for @include directives
|
|
208
|
-
const jsonContent = await
|
|
204
|
+
const jsonContent = await fs.readJson(filePath);
|
|
209
205
|
const jsonString = JSON.stringify(jsonContent);
|
|
210
206
|
const hasIncludes = jsonString.includes('"@include"') || jsonString.includes('"@include.');
|
|
211
207
|
if (hasIncludes) {
|
|
@@ -219,7 +215,7 @@ class JsonPreprocessor {
|
|
|
219
215
|
}
|
|
220
216
|
else {
|
|
221
217
|
// For non-JSON files, return the text content
|
|
222
|
-
return await
|
|
218
|
+
return await fs.readFile(filePath, 'utf-8');
|
|
223
219
|
}
|
|
224
220
|
}
|
|
225
221
|
catch (error) {
|
|
@@ -239,8 +235,8 @@ class JsonPreprocessor {
|
|
|
239
235
|
* @returns Absolute path to the included file
|
|
240
236
|
*/
|
|
241
237
|
resolvePath(includePath, currentFilePath) {
|
|
242
|
-
const currentDir =
|
|
243
|
-
return
|
|
238
|
+
const currentDir = path.dirname(currentFilePath);
|
|
239
|
+
return path.resolve(currentDir, includePath);
|
|
244
240
|
}
|
|
245
241
|
/**
|
|
246
242
|
* Process JSON data that's already loaded (for integration with existing code)
|
|
@@ -253,5 +249,4 @@ class JsonPreprocessor {
|
|
|
253
249
|
return this.processIncludesInternal(data, filePath);
|
|
254
250
|
}
|
|
255
251
|
}
|
|
256
|
-
exports.JsonPreprocessor = JsonPreprocessor;
|
|
257
252
|
//# sourceMappingURL=json-preprocessor.js.map
|