@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.
Files changed (130) hide show
  1. package/README.md +907 -2200
  2. package/dist/config.d.ts +1 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +17 -27
  5. package/dist/config.js.map +1 -1
  6. package/dist/constants/metadata-keywords.d.ts +1 -0
  7. package/dist/constants/metadata-keywords.d.ts.map +1 -0
  8. package/dist/constants/metadata-keywords.js +31 -42
  9. package/dist/constants/metadata-keywords.js.map +1 -1
  10. package/dist/index.d.ts +39 -37
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +26 -62
  13. package/dist/index.js.map +1 -1
  14. package/dist/lib/EntityPropertyExtractor.d.ts +1 -0
  15. package/dist/lib/EntityPropertyExtractor.d.ts.map +1 -0
  16. package/dist/lib/EntityPropertyExtractor.js +1 -5
  17. package/dist/lib/EntityPropertyExtractor.js.map +1 -1
  18. package/dist/lib/FieldExternalizer.d.ts +1 -0
  19. package/dist/lib/FieldExternalizer.d.ts.map +1 -0
  20. package/dist/lib/FieldExternalizer.js +14 -21
  21. package/dist/lib/FieldExternalizer.js.map +1 -1
  22. package/dist/lib/RecordProcessor.d.ts +3 -2
  23. package/dist/lib/RecordProcessor.d.ts.map +1 -0
  24. package/dist/lib/RecordProcessor.js +16 -25
  25. package/dist/lib/RecordProcessor.js.map +1 -1
  26. package/dist/lib/RelatedEntityHandler.d.ts +3 -2
  27. package/dist/lib/RelatedEntityHandler.d.ts.map +1 -0
  28. package/dist/lib/RelatedEntityHandler.js +3 -9
  29. package/dist/lib/RelatedEntityHandler.js.map +1 -1
  30. package/dist/lib/config-manager.d.ts +2 -1
  31. package/dist/lib/config-manager.d.ts.map +1 -0
  32. package/dist/lib/config-manager.js +10 -15
  33. package/dist/lib/config-manager.js.map +1 -1
  34. package/dist/lib/database-reference-scanner.d.ts +3 -2
  35. package/dist/lib/database-reference-scanner.d.ts.map +1 -0
  36. package/dist/lib/database-reference-scanner.js +7 -13
  37. package/dist/lib/database-reference-scanner.js.map +1 -1
  38. package/dist/lib/deletion-auditor.d.ts +18 -3
  39. package/dist/lib/deletion-auditor.d.ts.map +1 -0
  40. package/dist/lib/deletion-auditor.js +111 -20
  41. package/dist/lib/deletion-auditor.js.map +1 -1
  42. package/dist/lib/deletion-report-generator.d.ts +2 -1
  43. package/dist/lib/deletion-report-generator.d.ts.map +1 -0
  44. package/dist/lib/deletion-report-generator.js +1 -5
  45. package/dist/lib/deletion-report-generator.js.map +1 -1
  46. package/dist/lib/entity-foreign-key-helper.d.ts +1 -0
  47. package/dist/lib/entity-foreign-key-helper.d.ts.map +1 -0
  48. package/dist/lib/entity-foreign-key-helper.js +1 -5
  49. package/dist/lib/entity-foreign-key-helper.js.map +1 -1
  50. package/dist/lib/file-backup-manager.d.ts +1 -0
  51. package/dist/lib/file-backup-manager.d.ts.map +1 -0
  52. package/dist/lib/file-backup-manager.js +22 -27
  53. package/dist/lib/file-backup-manager.js.map +1 -1
  54. package/dist/lib/file-write-batch.d.ts +2 -1
  55. package/dist/lib/file-write-batch.d.ts.map +1 -0
  56. package/dist/lib/file-write-batch.js +16 -21
  57. package/dist/lib/file-write-batch.js.map +1 -1
  58. package/dist/lib/json-preprocessor.d.ts +1 -0
  59. package/dist/lib/json-preprocessor.d.ts.map +1 -0
  60. package/dist/lib/json-preprocessor.js +21 -26
  61. package/dist/lib/json-preprocessor.js.map +1 -1
  62. package/dist/lib/json-write-helper.d.ts +2 -1
  63. package/dist/lib/json-write-helper.d.ts.map +1 -0
  64. package/dist/lib/json-write-helper.js +4 -11
  65. package/dist/lib/json-write-helper.js.map +1 -1
  66. package/dist/lib/provider-utils.d.ts +2 -1
  67. package/dist/lib/provider-utils.d.ts.map +1 -0
  68. package/dist/lib/provider-utils.js +15 -46
  69. package/dist/lib/provider-utils.js.map +1 -1
  70. package/dist/lib/record-dependency-analyzer.d.ts +41 -2
  71. package/dist/lib/record-dependency-analyzer.d.ts.map +1 -0
  72. package/dist/lib/record-dependency-analyzer.js +108 -40
  73. package/dist/lib/record-dependency-analyzer.js.map +1 -1
  74. package/dist/lib/singleton-manager.d.ts +2 -1
  75. package/dist/lib/singleton-manager.d.ts.map +1 -0
  76. package/dist/lib/singleton-manager.js +4 -9
  77. package/dist/lib/singleton-manager.js.map +1 -1
  78. package/dist/lib/sql-logger.d.ts +2 -1
  79. package/dist/lib/sql-logger.d.ts.map +1 -0
  80. package/dist/lib/sql-logger.js +8 -16
  81. package/dist/lib/sql-logger.js.map +1 -1
  82. package/dist/lib/sync-engine.d.ts +2 -1
  83. package/dist/lib/sync-engine.d.ts.map +1 -0
  84. package/dist/lib/sync-engine.js +58 -76
  85. package/dist/lib/sync-engine.js.map +1 -1
  86. package/dist/lib/transaction-manager.d.ts +2 -1
  87. package/dist/lib/transaction-manager.d.ts.map +1 -0
  88. package/dist/lib/transaction-manager.js +6 -11
  89. package/dist/lib/transaction-manager.js.map +1 -1
  90. package/dist/services/FileResetService.d.ts +1 -0
  91. package/dist/services/FileResetService.d.ts.map +1 -0
  92. package/dist/services/FileResetService.js +17 -24
  93. package/dist/services/FileResetService.js.map +1 -1
  94. package/dist/services/FormattingService.d.ts +2 -1
  95. package/dist/services/FormattingService.d.ts.map +1 -0
  96. package/dist/services/FormattingService.js +68 -73
  97. package/dist/services/FormattingService.js.map +1 -1
  98. package/dist/services/InitService.d.ts +1 -0
  99. package/dist/services/InitService.d.ts.map +1 -0
  100. package/dist/services/InitService.js +12 -19
  101. package/dist/services/InitService.js.map +1 -1
  102. package/dist/services/PullService.d.ts +2 -1
  103. package/dist/services/PullService.d.ts.map +1 -0
  104. package/dist/services/PullService.js +49 -60
  105. package/dist/services/PullService.js.map +1 -1
  106. package/dist/services/PushService.d.ts +3 -1
  107. package/dist/services/PushService.d.ts.map +1 -0
  108. package/dist/services/PushService.js +144 -95
  109. package/dist/services/PushService.js.map +1 -1
  110. package/dist/services/StatusService.d.ts +2 -1
  111. package/dist/services/StatusService.d.ts.map +1 -0
  112. package/dist/services/StatusService.js +14 -22
  113. package/dist/services/StatusService.js.map +1 -1
  114. package/dist/services/ValidationService.d.ts +2 -1
  115. package/dist/services/ValidationService.d.ts.map +1 -0
  116. package/dist/services/ValidationService.js +41 -71
  117. package/dist/services/ValidationService.js.map +1 -1
  118. package/dist/services/WatchService.d.ts +4 -3
  119. package/dist/services/WatchService.d.ts.map +1 -0
  120. package/dist/services/WatchService.js +35 -43
  121. package/dist/services/WatchService.js.map +1 -1
  122. package/dist/services/index.d.ts +9 -8
  123. package/dist/services/index.d.ts.map +1 -0
  124. package/dist/services/index.js +8 -19
  125. package/dist/services/index.js.map +1 -1
  126. package/dist/types/validation.d.ts +2 -1
  127. package/dist/types/validation.d.ts.map +1 -0
  128. package/dist/types/validation.js +2 -23
  129. package/dist/types/validation.js.map +1 -1
  130. 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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"}
@@ -49,3 +49,4 @@ export declare class EntityForeignKeyHelper {
49
49
  */
50
50
  static getForeignKeyFields(metadata: Metadata, entityName: string): string[];
51
51
  }
52
+ //# sourceMappingURL=entity-foreign-key-helper.d.ts.map
@@ -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":";;;AAYA;;;GAGG;AACH,MAAa,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;AA1FD,wDA0FC","sourcesContent":["import { Metadata, EntityDependency } from '@memberjunction/core';\n\n/**\n * Information about a reverse foreign key relationship\n * (which entities reference a given entity)\n */\nexport interface ReverseFKInfo {\n entityName: string; // Entity that has the FK\n fieldName: string; // FK field name in that entity\n relatedFieldName: string; // Field in target entity (usually 'ID')\n}\n\n/**\n * Helper utility for working with entity foreign key relationships\n * Provides methods for building reverse FK maps and querying dependencies\n */\nexport class EntityForeignKeyHelper {\n /**\n * Build a reverse foreign key map\n * Maps: entity name -> list of {entity, field} pairs that reference it\n *\n * Example: \"Users\" -> [{ entityName: \"Orders\", fieldName: \"UserID\", relatedFieldName: \"ID\" }]\n *\n * @param metadata The metadata instance\n * @returns Map of entity name to list of reverse FK references\n */\n static buildReverseFKMap(metadata: Metadata): Map<string, ReverseFKInfo[]> {\n const reverseMap = new Map<string, ReverseFKInfo[]>();\n\n for (const entity of metadata.Entities) {\n // Skip deprecated and disabled entities to avoid deprecation warnings during database scans\n if (entity.Status === 'Deprecated' || entity.Status === 'Disabled') {\n continue;\n }\n\n // Get all foreign key fields in this entity\n const foreignKeys = entity.ForeignKeys;\n\n for (const field of foreignKeys) {\n const targetEntity = field.RelatedEntity;\n\n if (!targetEntity) {\n continue; // Skip if no related entity\n }\n\n // Add this FK to the reverse map for the target entity\n if (!reverseMap.has(targetEntity)) {\n reverseMap.set(targetEntity, []);\n }\n\n reverseMap.get(targetEntity)!.push({\n entityName: entity.Name,\n fieldName: field.Name,\n relatedFieldName: field.RelatedEntityFieldName || 'ID'\n });\n }\n }\n\n return reverseMap;\n }\n\n /**\n * Get entity dependencies using the Metadata API\n * Returns all entities that have foreign keys pointing to the specified entity\n *\n * @param metadata The metadata instance\n * @param entityName The entity to check dependencies for\n * @returns Array of entity dependencies\n */\n static async getEntityDependencies(\n metadata: Metadata,\n entityName: string\n ): Promise<EntityDependency[]> {\n return await metadata.GetEntityDependencies(entityName);\n }\n\n /**\n * Check if an entity has any dependent entities\n *\n * @param metadata The metadata instance\n * @param entityName The entity to check\n * @returns True if other entities reference this entity\n */\n static async hasDependentEntities(\n metadata: Metadata,\n entityName: string\n ): Promise<boolean> {\n const deps = await metadata.GetEntityDependencies(entityName);\n return deps.length > 0;\n }\n\n /**\n * Get all foreign key fields for an entity\n *\n * @param metadata The metadata instance\n * @param entityName The entity name\n * @returns Array of foreign key field names\n */\n static getForeignKeyFields(metadata: Metadata, entityName: string): string[] {\n const entity = metadata.Entities.find(e => e.Name === entityName);\n if (!entity) {\n return [];\n }\n\n return entity.ForeignKeys.map(fk => fk.Name);\n }\n}\n"]}
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"}
@@ -88,3 +88,4 @@ export declare class FileBackupManager {
88
88
  initialized: boolean;
89
89
  };
90
90
  }
91
+ //# sourceMappingURL=file-backup-manager.d.ts.map
@@ -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
- var __importDefault = (this && this.__importDefault) || function (mod) {
11
- return (mod && mod.__esModule) ? mod : { "default": mod };
12
- };
13
- Object.defineProperty(exports, "__esModule", { value: true });
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
- backupDir = '';
47
- backups = [];
48
- initialized = false;
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 = os_1.default.tmpdir();
64
- const sessionId = (0, uuid_1.v4)();
65
- this.backupDir = path_1.default.join(tempRoot, 'mj-metadata-sync', sessionId);
66
- await fs_extra_1.default.ensureDir(this.backupDir);
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 fs_extra_1.default.pathExists(filePath);
90
- const backupFileName = `${path_1.default.basename(filePath)}_${Date.now()}_${this.backups.length}`;
91
- const backupPath = path_1.default.join(this.backupDir, backupFileName);
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 fs_extra_1.default.copy(filePath, backupPath);
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 fs_extra_1.default.copy(backup.backupPath, backup.originalPath, { overwrite: true });
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 fs_extra_1.default.pathExists(backup.originalPath)) {
128
- await fs_extra_1.default.remove(backup.originalPath);
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 fs_extra_1.default.remove(this.backupDir);
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":"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","sourcesContent":["/**\n * @fileoverview File backup and rollback manager for MetadataSync operations\n * @module file-backup-manager\n * \n * This module provides functionality to create backups of files before modification\n * and allows rolling back all changes if any operation fails. It ensures atomic\n * file operations by maintaining a temporary backup directory during push operations.\n */\n\nimport fs from 'fs-extra';\nimport path from 'path';\nimport os from 'os';\nimport { v4 as uuidv4 } from 'uuid';\n\n/**\n * Represents a backed-up file with its original and backup paths\n */\ninterface BackupEntry {\n /** Original file path that was backed up */\n originalPath: string;\n /** Path to the backup copy of the file */\n backupPath: string;\n /** Whether the file existed before modification */\n existed: boolean;\n}\n\n/**\n * Manages file backups and rollback operations for MetadataSync\n * \n * Creates temporary backups of all modified files during a push operation,\n * allowing atomic rollback of all file changes if any error occurs.\n * \n * @class FileBackupManager\n * @example\n * ```typescript\n * const backupManager = new FileBackupManager();\n * await backupManager.initialize();\n * \n * try {\n * await backupManager.backupFile('/path/to/file.json');\n * // Modify the file\n * await fs.writeJson('/path/to/file.json', newData);\n * \n * // If all operations succeed\n * await backupManager.cleanup();\n * } catch (error) {\n * // Rollback all file changes\n * await backupManager.rollback();\n * throw error;\n * }\n * ```\n */\nexport class FileBackupManager {\n private backupDir: string = '';\n private backups: BackupEntry[] = [];\n private initialized: boolean = false;\n \n /**\n * Initialize the backup manager by creating a temporary directory\n * \n * Creates a unique temporary directory for storing file backups during\n * the current operation. Must be called before any backup operations.\n * \n * @returns Promise that resolves when initialization is complete\n * @throws Error if temporary directory creation fails\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n throw new Error('FileBackupManager already initialized');\n }\n \n // Create a unique temporary directory for this session\n const tempRoot = os.tmpdir();\n const sessionId = uuidv4();\n this.backupDir = path.join(tempRoot, 'mj-metadata-sync', sessionId);\n \n await fs.ensureDir(this.backupDir);\n this.initialized = true;\n }\n \n /**\n * Create a backup of a file before modification\n * \n * Copies the current state of a file to the backup directory. If the file\n * doesn't exist, records that fact for proper rollback handling.\n * \n * @param filePath - Absolute path to the file to backup\n * @returns Promise that resolves when backup is complete\n * @throws Error if backup operation fails\n */\n async backupFile(filePath: string): Promise<void> {\n if (!this.initialized) {\n throw new Error('FileBackupManager not initialized. Call initialize() first.');\n }\n \n // Check if we already have a backup for this file\n const existingBackup = this.backups.find(b => b.originalPath === filePath);\n if (existingBackup) {\n // Already backed up, don't backup again\n return;\n }\n \n const exists = await fs.pathExists(filePath);\n const backupFileName = `${path.basename(filePath)}_${Date.now()}_${this.backups.length}`;\n const backupPath = path.join(this.backupDir, backupFileName);\n \n const backupEntry: BackupEntry = {\n originalPath: filePath,\n backupPath: backupPath,\n existed: exists\n };\n \n if (exists) {\n // Copy the file to backup location\n await fs.copy(filePath, backupPath);\n }\n \n this.backups.push(backupEntry);\n }\n \n /**\n * Rollback all file changes by restoring from backups\n * \n * Restores all backed-up files to their original state. Files that didn't\n * exist before the operation are deleted. This operation is atomic - either\n * all files are restored or none are.\n * \n * @returns Promise that resolves when rollback is complete\n * @throws Error if any rollback operation fails\n */\n async rollback(): Promise<void> {\n if (!this.initialized) {\n return; // Nothing to rollback\n }\n \n const errors: string[] = [];\n \n // Process backups in reverse order (last modified first)\n for (const backup of this.backups.reverse()) {\n try {\n if (backup.existed) {\n // Restore the original file\n await fs.copy(backup.backupPath, backup.originalPath, { overwrite: true });\n } else {\n // File didn't exist before, remove it\n if (await fs.pathExists(backup.originalPath)) {\n await fs.remove(backup.originalPath);\n }\n }\n } catch (error) {\n const errorMsg = `Failed to rollback ${backup.originalPath}: ${error instanceof Error ? error.message : String(error)}`;\n errors.push(errorMsg);\n console.error(errorMsg);\n }\n }\n \n // Clean up backup directory\n try {\n await this.cleanup();\n } catch (error) {\n console.error('Failed to cleanup backup directory during rollback:', error);\n }\n \n if (errors.length > 0) {\n throw new Error(`Rollback completed with errors:\\n${errors.join('\\n')}`);\n }\n }\n \n /**\n * Clean up backup directory after successful operation\n * \n * Removes all temporary backup files and the backup directory. Should be\n * called after all operations complete successfully.\n * \n * @returns Promise that resolves when cleanup is complete\n */\n async cleanup(): Promise<void> {\n if (!this.initialized || !this.backupDir) {\n return;\n }\n \n try {\n await fs.remove(this.backupDir);\n } catch (error) {\n // Log but don't throw - cleanup errors shouldn't fail the operation\n console.warn(`Failed to cleanup backup directory ${this.backupDir}:`, error);\n }\n \n this.backups = [];\n this.initialized = false;\n this.backupDir = '';\n }\n \n /**\n * Get statistics about current backup session\n * \n * @returns Object containing backup statistics\n */\n getStats(): { totalBackups: number; backupDir: string; initialized: boolean } {\n return {\n totalBackups: this.backups.length,\n backupDir: this.backupDir,\n initialized: this.initialized\n };\n }\n}"]}
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
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
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
- changes = new Map();
16
- fileContents = new Map();
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 = path_1.default.resolve(filePath);
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 = path_1.default.resolve(filePath);
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 = path_1.default.resolve(filePath);
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 fs_extra_1.default.pathExists(filePath)) {
67
- const content = await fs_extra_1.default.readJson(filePath);
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 = path_1.default.dirname(filePath);
139
- await fs_extra_1.default.ensureDir(dir);
134
+ const dir = path.dirname(filePath);
135
+ await fs.ensureDir(dir);
140
136
  // Write using JsonWriteHelper for consistent property ordering
141
- writePromises.push(json_write_helper_1.JsonWriteHelper.writeOrderedRecordData(filePath, content));
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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"}
@@ -65,3 +65,4 @@ export declare class JsonPreprocessor {
65
65
  */
66
66
  processJsonData(data: any, filePath: string): Promise<any>;
67
67
  }
68
+ //# sourceMappingURL=json-preprocessor.d.ts.map
@@ -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
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
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
- visitedPaths = new Set();
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 fs_extra_1.default.readJson(filePath);
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 = `${metadata_keywords_1.METADATA_KEYWORDS.INCLUDE}:`;
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 === metadata_keywords_1.METADATA_KEYWORDS.INCLUDE || key.startsWith(`${metadata_keywords_1.METADATA_KEYWORDS.INCLUDE}.`)) {
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 === metadata_keywords_1.METADATA_KEYWORDS.INCLUDE || key.startsWith(`${metadata_keywords_1.METADATA_KEYWORDS.INCLUDE}.`)) {
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(metadata_keywords_1.METADATA_KEYWORDS.FILE)) {
140
+ if (typeof value === 'string' && value.startsWith(METADATA_KEYWORDS.FILE)) {
145
141
  // Process @file reference
146
- const filePath = (0, metadata_keywords_1.extractKeywordValue)(value);
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 = path_1.default.resolve(filePath);
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 fs_extra_1.default.pathExists(filePath)) {
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 fs_extra_1.default.readJson(filePath);
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 fs_extra_1.default.pathExists(filePath)) {
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 fs_extra_1.default.readJson(filePath);
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 fs_extra_1.default.readFile(filePath, 'utf-8');
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 = path_1.default.dirname(currentFilePath);
243
- return path_1.default.resolve(currentDir, includePath);
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