@memberjunction/metadata-sync 2.55.0 → 2.57.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 (67) hide show
  1. package/README.md +92 -51
  2. package/dist/index.d.ts +21 -1
  3. package/dist/index.js +43 -3
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/file-backup-manager.js +2 -2
  6. package/dist/lib/file-backup-manager.js.map +1 -1
  7. package/dist/lib/provider-utils.d.ts +2 -2
  8. package/dist/lib/provider-utils.js.map +1 -1
  9. package/dist/lib/sql-logger.d.ts +44 -0
  10. package/dist/lib/sql-logger.js +140 -0
  11. package/dist/lib/sql-logger.js.map +1 -0
  12. package/dist/lib/sync-engine.d.ts +25 -0
  13. package/dist/lib/sync-engine.js +72 -2
  14. package/dist/lib/sync-engine.js.map +1 -1
  15. package/dist/lib/transaction-manager.d.ts +35 -0
  16. package/dist/lib/transaction-manager.js +100 -0
  17. package/dist/lib/transaction-manager.js.map +1 -0
  18. package/dist/services/FileResetService.d.ts +30 -0
  19. package/dist/services/FileResetService.js +183 -0
  20. package/dist/services/FileResetService.js.map +1 -0
  21. package/dist/services/InitService.d.ts +17 -0
  22. package/dist/services/InitService.js +118 -0
  23. package/dist/services/InitService.js.map +1 -0
  24. package/dist/services/PullService.d.ts +45 -0
  25. package/dist/services/PullService.js +564 -0
  26. package/dist/services/PullService.js.map +1 -0
  27. package/dist/services/PushService.d.ts +47 -0
  28. package/dist/services/PushService.js +558 -0
  29. package/dist/services/PushService.js.map +1 -0
  30. package/dist/services/StatusService.d.ts +32 -0
  31. package/dist/services/StatusService.js +138 -0
  32. package/dist/services/StatusService.js.map +1 -0
  33. package/dist/services/WatchService.d.ts +34 -0
  34. package/dist/services/WatchService.js +296 -0
  35. package/dist/services/WatchService.js.map +1 -0
  36. package/dist/services/index.d.ts +16 -0
  37. package/dist/services/index.js +28 -0
  38. package/dist/services/index.js.map +1 -0
  39. package/package.json +14 -45
  40. package/bin/debug.js +0 -7
  41. package/bin/run +0 -17
  42. package/bin/run.js +0 -6
  43. package/dist/commands/file-reset/index.d.ts +0 -15
  44. package/dist/commands/file-reset/index.js +0 -221
  45. package/dist/commands/file-reset/index.js.map +0 -1
  46. package/dist/commands/init/index.d.ts +0 -7
  47. package/dist/commands/init/index.js +0 -155
  48. package/dist/commands/init/index.js.map +0 -1
  49. package/dist/commands/pull/index.d.ts +0 -246
  50. package/dist/commands/pull/index.js +0 -1448
  51. package/dist/commands/pull/index.js.map +0 -1
  52. package/dist/commands/push/index.d.ts +0 -41
  53. package/dist/commands/push/index.js +0 -1129
  54. package/dist/commands/push/index.js.map +0 -1
  55. package/dist/commands/status/index.d.ts +0 -10
  56. package/dist/commands/status/index.js +0 -199
  57. package/dist/commands/status/index.js.map +0 -1
  58. package/dist/commands/validate/index.d.ts +0 -15
  59. package/dist/commands/validate/index.js +0 -149
  60. package/dist/commands/validate/index.js.map +0 -1
  61. package/dist/commands/watch/index.d.ts +0 -15
  62. package/dist/commands/watch/index.js +0 -300
  63. package/dist/commands/watch/index.js.map +0 -1
  64. package/dist/hooks/init.d.ts +0 -3
  65. package/dist/hooks/init.js +0 -59
  66. package/dist/hooks/init.js.map +0 -1
  67. package/oclif.manifest.json +0 -376
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PullService.js","sourceRoot":"","sources":["../../src/services/PullService.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs-extra';\nimport path from 'path';\nimport { RunView, Metadata, EntityInfo, UserInfo } from '@memberjunction/core';\nimport { SyncEngine, RecordData } from '../lib/sync-engine';\nimport { loadEntityConfig, RelatedEntityConfig } from '../config';\nimport { configManager } from '../lib/config-manager';\n\nexport interface PullOptions {\n entity: string;\n filter?: string;\n dryRun?: boolean;\n multiFile?: string;\n verbose?: boolean;\n noValidate?: boolean;\n targetDir?: string;\n updateExistingRecords?: boolean;\n createNewFileIfNotFound?: boolean;\n}\n\nexport interface PullCallbacks {\n onProgress?: (message: string) => void;\n onSuccess?: (message: string) => void;\n onError?: (message: string) => void;\n onWarn?: (message: string) => void;\n onLog?: (message: string) => void;\n}\n\nexport interface PullResult {\n processed: number;\n created: number;\n updated: number;\n skipped: number;\n targetDir: string;\n}\n\nexport class PullService {\n private syncEngine: SyncEngine;\n private contextUser: UserInfo;\n \n constructor(syncEngine: SyncEngine, contextUser: UserInfo) {\n this.syncEngine = syncEngine;\n this.contextUser = contextUser;\n }\n \n async pull(options: PullOptions, callbacks?: PullCallbacks): Promise<PullResult> {\n let targetDir: string;\n let entityConfig: any;\n \n // Check if we should use a specific target directory\n if (options.targetDir) {\n if (options.verbose) {\n callbacks?.onLog?.(`Using specified target directory: ${options.targetDir}`);\n }\n process.chdir(options.targetDir);\n targetDir = process.cwd();\n \n // Load entity config from the current directory\n entityConfig = await loadEntityConfig(targetDir);\n if (!entityConfig) {\n throw new Error(`No .mj-sync.json found in ${targetDir}`);\n }\n if (entityConfig.entity !== options.entity) {\n throw new Error(`Directory ${targetDir} is configured for entity \"${entityConfig.entity}\", not \"${options.entity}\"`);\n }\n } else {\n // Original behavior - find entity directory\n const entityDirs = await this.findEntityDirectories(options.entity);\n \n if (entityDirs.length === 0) {\n throw new Error(`No directory found for entity \"${options.entity}\". Run \"mj sync init\" first.`);\n }\n \n if (entityDirs.length === 1) {\n targetDir = entityDirs[0];\n } else {\n // Multiple directories found - in service mode, we'll use the first one\n // The CLI can handle prompting for selection\n throw new Error(`Multiple directories found for entity \"${options.entity}\". Please specify target directory.`);\n }\n \n entityConfig = await loadEntityConfig(targetDir);\n if (!entityConfig) {\n throw new Error(`Invalid entity configuration in ${targetDir}`);\n }\n }\n \n // Show configuration notice only if relevant and in verbose mode\n if (options.verbose && entityConfig.pull?.appendRecordsToExistingFile && entityConfig.pull?.newFileName) {\n const targetFile = path.join(targetDir, entityConfig.pull.newFileName.endsWith('.json') \n ? entityConfig.pull.newFileName \n : `${entityConfig.pull.newFileName}.json`);\n \n if (await fs.pathExists(targetFile)) {\n callbacks?.onLog?.(`\\nšŸ“ Configuration: New records will be appended to existing file '${path.basename(targetFile)}'`);\n }\n }\n \n // Pull records\n callbacks?.onProgress?.(`Pulling ${options.entity} records`);\n const rv = new RunView();\n \n let filter = '';\n if (options.filter) {\n filter = options.filter;\n } else if (entityConfig.pull?.filter) {\n filter = entityConfig.pull.filter;\n }\n \n const result = await rv.RunView({\n EntityName: options.entity,\n ExtraFilter: filter,\n ResultType: 'entity_object'\n }, this.contextUser);\n \n if (!result.Success) {\n throw new Error(`Failed to pull records: ${result.ErrorMessage}`);\n }\n \n callbacks?.onSuccess?.(`Found ${result.Results.length} records`);\n \n if (options.dryRun) {\n callbacks?.onLog?.(`\\nDry run mode - would pull ${result.Results.length} records to ${targetDir}`);\n return {\n processed: 0,\n created: 0,\n updated: 0,\n skipped: 0,\n targetDir\n };\n }\n \n // Check if we need to wait for async property loading\n if (entityConfig.pull?.externalizeFields && result.Results.length > 0) {\n await this.handleAsyncPropertyLoading(options.entity, entityConfig, options.verbose, callbacks);\n }\n \n // Process records\n const pullResult = await this.processRecords(\n result.Results,\n options,\n targetDir,\n entityConfig,\n callbacks\n );\n \n return {\n ...pullResult,\n targetDir\n };\n }\n \n private async handleAsyncPropertyLoading(\n entityName: string,\n entityConfig: any,\n verbose?: boolean,\n callbacks?: PullCallbacks\n ): Promise<void> {\n const metadata = new Metadata();\n const entityInfo = metadata.EntityByName(entityName);\n \n if (!entityInfo) return;\n \n const externalizeConfig = entityConfig.pull.externalizeFields;\n let fieldsToExternalize: string[] = [];\n \n if (Array.isArray(externalizeConfig)) {\n if (externalizeConfig.length > 0 && typeof externalizeConfig[0] === 'string') {\n fieldsToExternalize = externalizeConfig as string[];\n } else {\n fieldsToExternalize = (externalizeConfig as Array<{field: string; pattern: string}>)\n .map(item => item.field);\n }\n } else {\n fieldsToExternalize = Object.keys(externalizeConfig);\n }\n \n // Get all field names from entity metadata\n const metadataFieldNames = entityInfo.Fields.map(f => f.Name);\n \n // Check if any externalized fields are NOT in metadata (likely computed properties)\n const computedFields = fieldsToExternalize.filter(f => !metadataFieldNames.includes(f));\n \n if (computedFields.length > 0) {\n if (verbose) {\n callbacks?.onProgress?.(`Waiting 5 seconds for async property loading in ${entityName} (${computedFields.join(', ')})...`);\n }\n await new Promise(resolve => setTimeout(resolve, 5000));\n if (verbose) {\n callbacks?.onSuccess?.('Async property loading wait complete');\n }\n }\n }\n \n private async processRecords(\n records: any[],\n options: PullOptions,\n targetDir: string,\n entityConfig: any,\n callbacks?: PullCallbacks\n ): Promise<Omit<PullResult, 'targetDir'>> {\n const entityInfo = this.syncEngine.getEntityInfo(options.entity);\n if (!entityInfo) {\n throw new Error(`Entity information not found for: ${options.entity}`);\n }\n \n callbacks?.onProgress?.('Processing records');\n let processed = 0;\n let updated = 0;\n let created = 0;\n let skipped = 0;\n \n // If multi-file flag is set, collect all records\n if (options.multiFile) {\n const allRecords: RecordData[] = [];\n \n for (const record of records) {\n try {\n // Build primary key\n const primaryKey: Record<string, any> = {};\n for (const pk of entityInfo.PrimaryKeys) {\n primaryKey[pk.Name] = record[pk.Name];\n }\n \n // Process record for multi-file\n const recordData = await this.processRecordData(\n record, \n primaryKey, \n targetDir, \n entityConfig, \n options.verbose, \n true\n );\n allRecords.push(recordData);\n processed++;\n \n if (options.verbose) {\n callbacks?.onProgress?.(`Processing records (${processed}/${records.length})`);\n }\n } catch (error) {\n callbacks?.onWarn?.(`Failed to process record: ${(error as any).message || error}`);\n }\n }\n \n // Write all records to single file\n if (allRecords.length > 0) {\n const fileName = options.multiFile.endsWith('.json') ? options.multiFile : `${options.multiFile}.json`;\n const filePath = path.join(targetDir, fileName);\n await fs.writeJson(filePath, allRecords, { spaces: 2 });\n callbacks?.onSuccess?.(`Pulled ${processed} records to ${path.basename(filePath)}`);\n }\n } else {\n // Smart update logic for single-file-per-record\n const result = await this.processIndividualRecords(\n records,\n options,\n targetDir,\n entityConfig,\n entityInfo,\n callbacks\n );\n \n processed = result.processed;\n updated = result.updated;\n created = result.created;\n skipped = result.skipped;\n \n // Final status\n const statusParts = [`Processed ${processed} records`];\n if (updated > 0) statusParts.push(`updated ${updated}`);\n if (created > 0) statusParts.push(`created ${created}`);\n if (skipped > 0) statusParts.push(`skipped ${skipped}`);\n \n callbacks?.onSuccess?.(statusParts.join(', '));\n }\n \n return { processed, created, updated, skipped };\n }\n \n private async processIndividualRecords(\n records: any[],\n options: PullOptions,\n targetDir: string,\n entityConfig: any,\n entityInfo: EntityInfo,\n callbacks?: PullCallbacks\n ): Promise<{ processed: number; updated: number; created: number; skipped: number }> {\n let processed = 0;\n let updated = 0;\n let created = 0;\n let skipped = 0;\n \n // Find existing files\n const filePattern = entityConfig.pull?.filePattern || entityConfig.filePattern || '*.json';\n const existingFiles = await this.findExistingFiles(targetDir, filePattern);\n \n if (options.verbose) {\n callbacks?.onLog?.(`Found ${existingFiles.length} existing files matching pattern '${filePattern}'`);\n existingFiles.forEach(f => callbacks?.onLog?.(` - ${path.basename(f)}`));\n }\n \n // Load existing records and build lookup map\n const existingRecordsMap = await this.loadExistingRecords(existingFiles, entityInfo);\n \n if (options.verbose) {\n callbacks?.onLog?.(`Loaded ${existingRecordsMap.size} existing records from files`);\n }\n \n // Separate records into new and existing\n const newRecords: Array<{ record: any; primaryKey: Record<string, any> }> = [];\n const existingRecordsToUpdate: Array<{ record: any; primaryKey: Record<string, any>; filePath: string }> = [];\n \n for (const record of records) {\n // Build primary key\n const primaryKey: Record<string, any> = {};\n for (const pk of entityInfo.PrimaryKeys) {\n primaryKey[pk.Name] = record[pk.Name];\n }\n \n // Create lookup key\n const lookupKey = this.createPrimaryKeyLookup(primaryKey);\n const existingFileInfo = existingRecordsMap.get(lookupKey);\n \n if (existingFileInfo) {\n // Record exists locally\n if (entityConfig.pull?.updateExistingRecords !== false) {\n existingRecordsToUpdate.push({ record, primaryKey, filePath: existingFileInfo.filePath });\n } else {\n skipped++;\n if (options.verbose) {\n callbacks?.onLog?.(`Skipping existing record: ${lookupKey}`);\n }\n }\n } else {\n // Record doesn't exist locally\n if (entityConfig.pull?.createNewFileIfNotFound !== false) {\n newRecords.push({ record, primaryKey });\n } else {\n skipped++;\n if (options.verbose) {\n callbacks?.onLog?.(`Skipping new record (createNewFileIfNotFound=false): ${lookupKey}`);\n }\n }\n }\n }\n \n // Track which files have been backed up to avoid duplicates\n const backedUpFiles = new Set<string>();\n \n // Process existing records updates\n for (const { record, primaryKey, filePath } of existingRecordsToUpdate) {\n try {\n callbacks?.onProgress?.(`Updating existing records (${updated + 1}/${existingRecordsToUpdate.length})`);\n \n // Create backup if configured (only once per file)\n if (entityConfig.pull?.backupBeforeUpdate && !backedUpFiles.has(filePath)) {\n await this.createBackup(filePath, entityConfig.pull?.backupDirectory);\n backedUpFiles.add(filePath);\n }\n \n // Load existing file data\n const existingData = await fs.readJson(filePath);\n \n // Find the specific existing record that matches this primary key\n let existingRecordData: RecordData;\n if (Array.isArray(existingData)) {\n // Find the matching record in the array\n const matchingRecord = existingData.find(r => \n this.createPrimaryKeyLookup(r.primaryKey || {}) === this.createPrimaryKeyLookup(primaryKey)\n );\n existingRecordData = matchingRecord || existingData[0]; // Fallback to first if not found\n } else {\n existingRecordData = existingData;\n }\n \n // Process the new record data (isNewRecord = false for updates)\n const newRecordData = await this.processRecordData(\n record, \n primaryKey, \n targetDir, \n entityConfig, \n options.verbose, \n false, \n existingRecordData\n );\n \n // Apply merge strategy\n const mergedData = await this.mergeRecords(\n existingRecordData,\n newRecordData,\n entityConfig.pull?.mergeStrategy || 'merge',\n entityConfig.pull?.preserveFields || []\n );\n \n // Write updated data\n if (Array.isArray(existingData)) {\n // Update the record in the array\n const index = existingData.findIndex(r => \n this.createPrimaryKeyLookup(r.primaryKey || {}) === this.createPrimaryKeyLookup(primaryKey)\n );\n if (index >= 0) {\n existingData[index] = mergedData;\n await fs.writeJson(filePath, existingData, { spaces: 2 });\n }\n } else {\n await fs.writeJson(filePath, mergedData, { spaces: 2 });\n }\n \n updated++;\n processed++;\n \n if (options.verbose) {\n callbacks?.onLog?.(`Updated: ${filePath}`);\n }\n } catch (error) {\n callbacks?.onWarn?.(`Failed to update record: ${(error as any).message || error}`);\n }\n }\n \n // Process new records\n if (newRecords.length > 0) {\n callbacks?.onProgress?.(`Creating new records (0/${newRecords.length})`);\n \n if (entityConfig.pull?.appendRecordsToExistingFile && entityConfig.pull?.newFileName) {\n // Append all new records to a single file\n const fileName = entityConfig.pull.newFileName.endsWith('.json') \n ? entityConfig.pull.newFileName \n : `${entityConfig.pull.newFileName}.json`;\n const filePath = path.join(targetDir, fileName);\n \n // Load existing file if it exists\n let existingData: RecordData[] = [];\n if (await fs.pathExists(filePath)) {\n const fileData = await fs.readJson(filePath);\n existingData = Array.isArray(fileData) ? fileData : [fileData];\n }\n \n // Process and append all new records\n for (const { record, primaryKey } of newRecords) {\n try {\n // For new records, pass isNewRecord = true (default)\n const recordData = await this.processRecordData(\n record, \n primaryKey, \n targetDir, \n entityConfig, \n options.verbose, \n true\n );\n existingData.push(recordData);\n created++;\n processed++;\n \n if (options.verbose) {\n callbacks?.onProgress?.(`Creating new records (${created}/${newRecords.length})`);\n }\n } catch (error) {\n callbacks?.onWarn?.(`Failed to process new record: ${(error as any).message || error}`);\n }\n }\n \n // Write the combined data\n await fs.writeJson(filePath, existingData, { spaces: 2 });\n \n if (options.verbose) {\n callbacks?.onLog?.(`Appended ${created} new records to: ${filePath}`);\n }\n } else {\n // Create individual files for each new record\n for (const { record, primaryKey } of newRecords) {\n try {\n await this.processRecord(record, primaryKey, targetDir, entityConfig, options.verbose);\n created++;\n processed++;\n \n if (options.verbose) {\n callbacks?.onProgress?.(`Creating new records (${created}/${newRecords.length})`);\n }\n } catch (error) {\n callbacks?.onWarn?.(`Failed to process new record: ${(error as any).message || error}`);\n }\n }\n }\n }\n \n return { processed, updated, created, skipped };\n }\n \n private async processRecord(\n record: any, \n primaryKey: Record<string, any>,\n targetDir: string, \n entityConfig: any,\n verbose?: boolean\n ): Promise<void> {\n const recordData = await this.processRecordData(record, primaryKey, targetDir, entityConfig, verbose, true);\n \n // Determine file path\n const fileName = this.buildFileName(primaryKey, entityConfig);\n const filePath = path.join(targetDir, fileName);\n \n // Write JSON file\n await fs.writeJson(filePath, recordData, { spaces: 2 });\n }\n \n private async processRecordData(\n record: any, \n primaryKey: Record<string, any>,\n targetDir: string, \n entityConfig: any,\n verbose?: boolean,\n isNewRecord: boolean = true,\n existingRecordData?: RecordData,\n currentDepth: number = 0,\n ancestryPath: Set<string> = new Set()\n ): Promise<RecordData> {\n // This is a simplified version - the full implementation would need to be extracted\n // from the pull command. For now, we'll delegate to a method that would be\n // implemented in the full service\n \n // Build record data\n const fields: Record<string, any> = {};\n const relatedEntities: Record<string, RecordData[]> = {};\n \n // Get the underlying data from the entity object\n let dataToProcess = record;\n if (typeof record.GetAll === 'function') {\n dataToProcess = record.GetAll();\n }\n \n // Process fields (simplified - full implementation needed)\n for (const [fieldName, fieldValue] of Object.entries(dataToProcess)) {\n // Skip primary key fields\n if (primaryKey[fieldName] !== undefined) {\n continue;\n }\n \n // Skip internal fields\n if (fieldName.startsWith('__mj_')) {\n continue;\n }\n \n // Skip excluded fields\n if (entityConfig.pull?.excludeFields?.includes(fieldName)) {\n continue;\n }\n \n fields[fieldName] = fieldValue;\n }\n \n // Calculate checksum\n const checksum = this.syncEngine.calculateChecksum(fields);\n \n // Build the final record data\n const recordData: RecordData = {\n fields,\n primaryKey,\n sync: {\n lastModified: new Date().toISOString(),\n checksum: checksum\n }\n };\n \n if (Object.keys(relatedEntities).length > 0) {\n recordData.relatedEntities = relatedEntities;\n }\n \n return recordData;\n }\n \n private async findEntityDirectories(entityName: string): Promise<string[]> {\n const dirs: string[] = [];\n \n // Search for directories with matching entity config\n const searchDirs = async (dir: string) => {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n \n for (const entry of entries) {\n if (entry.isDirectory()) {\n const fullPath = path.join(dir, entry.name);\n const config = await loadEntityConfig(fullPath);\n \n if (config && config.entity === entityName) {\n dirs.push(fullPath);\n } else {\n // Recurse\n await searchDirs(fullPath);\n }\n }\n }\n };\n \n await searchDirs(configManager.getOriginalCwd());\n return dirs;\n }\n \n private buildFileName(primaryKey: Record<string, any>, entityConfig: any): string {\n // Use primary key values to build filename\n const keys = Object.values(primaryKey);\n \n if (keys.length === 1 && typeof keys[0] === 'string') {\n // Single string key - use as base if it's a guid\n const key = keys[0];\n if (key.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i)) {\n // It's a GUID, use first 8 chars, prefixed with dot, lowercase\n return `.${key.substring(0, 8).toLowerCase()}.json`;\n }\n // Use the whole key if not too long, prefixed with dot\n if (key.length <= 50) {\n return `.${key.replace(/[^a-zA-Z0-9\\-_]/g, '').toLowerCase()}.json`;\n }\n }\n \n // Multiple keys or numeric - create composite name, prefixed with dot\n return '.' + keys.map(k => String(k).replace(/[^a-zA-Z0-9\\-_]/g, '').toLowerCase()).join('-') + '.json';\n }\n \n private async findExistingFiles(dir: string, pattern: string): Promise<string[]> {\n const files: string[] = [];\n \n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n \n for (const entry of entries) {\n if (entry.isFile()) {\n const fileName = entry.name;\n \n // Simple pattern matching\n if (pattern === '*.json' && fileName.endsWith('.json')) {\n files.push(path.join(dir, fileName));\n } else if (pattern === '.*.json' && fileName.startsWith('.') && fileName.endsWith('.json')) {\n files.push(path.join(dir, fileName));\n } else if (pattern === fileName) {\n files.push(path.join(dir, fileName));\n }\n }\n }\n } catch (error) {\n // Directory might not exist yet\n if ((error as any).code !== 'ENOENT') {\n throw error;\n }\n }\n \n return files;\n }\n \n private async loadExistingRecords(\n files: string[], \n entityInfo: EntityInfo\n ): Promise<Map<string, { filePath: string; recordData: RecordData }>> {\n const recordsMap = new Map<string, { filePath: string; recordData: RecordData }>();\n \n for (const filePath of files) {\n try {\n const fileData = await fs.readJson(filePath);\n const records = Array.isArray(fileData) ? fileData : [fileData];\n \n for (const record of records) {\n if (record.primaryKey) {\n const lookupKey = this.createPrimaryKeyLookup(record.primaryKey);\n recordsMap.set(lookupKey, { filePath, recordData: record });\n }\n }\n } catch (error) {\n // Skip files that can't be parsed\n }\n }\n \n return recordsMap;\n }\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 \n private async mergeRecords(\n existing: RecordData,\n newData: RecordData,\n strategy: 'overwrite' | 'merge' | 'skip',\n preserveFields: string[]\n ): Promise<RecordData> {\n if (strategy === 'skip') {\n return existing;\n }\n \n if (strategy === 'overwrite') {\n const result: RecordData = {\n fields: { ...newData.fields },\n primaryKey: newData.primaryKey,\n sync: newData.sync\n };\n \n // Restore preserved fields from existing\n if (preserveFields.length > 0 && existing.fields) {\n for (const field of preserveFields) {\n if (field in existing.fields) {\n result.fields[field] = existing.fields[field];\n }\n }\n }\n \n if (newData.relatedEntities) {\n result.relatedEntities = newData.relatedEntities;\n }\n \n return result;\n }\n \n // Default 'merge' strategy\n const result: RecordData = {\n fields: { ...existing.fields, ...newData.fields },\n primaryKey: newData.primaryKey || existing.primaryKey,\n sync: newData.sync\n };\n \n // Restore preserved fields\n if (preserveFields.length > 0 && existing.fields) {\n for (const field of preserveFields) {\n if (field in existing.fields) {\n result.fields[field] = existing.fields[field];\n }\n }\n }\n \n if (existing.relatedEntities || newData.relatedEntities) {\n result.relatedEntities = {\n ...existing.relatedEntities,\n ...newData.relatedEntities\n };\n }\n \n return result;\n }\n \n private async createBackup(filePath: string, backupDirName?: string): Promise<void> {\n const dir = path.dirname(filePath);\n const fileName = path.basename(filePath);\n const backupDir = path.join(dir, backupDirName || '.backups');\n \n // Ensure backup directory exists\n await fs.ensureDir(backupDir);\n \n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n // Remove .json extension, add timestamp, then add .backup extension\n const backupFileName = fileName.replace(/\\.json$/, `.${timestamp}.backup`);\n const backupPath = path.join(backupDir, backupFileName);\n \n try {\n await fs.copy(filePath, backupPath);\n } catch (error) {\n // Log error but don't throw\n }\n }\n}"]}
@@ -0,0 +1,47 @@
1
+ import { UserInfo } from '@memberjunction/core';
2
+ import { SyncEngine } from '../lib/sync-engine';
3
+ export interface PushOptions {
4
+ dir?: string;
5
+ dryRun?: boolean;
6
+ verbose?: boolean;
7
+ noValidate?: boolean;
8
+ }
9
+ export interface PushCallbacks {
10
+ onProgress?: (message: string) => void;
11
+ onSuccess?: (message: string) => void;
12
+ onError?: (message: string) => void;
13
+ onWarn?: (message: string) => void;
14
+ onLog?: (message: string) => void;
15
+ onConfirm?: (message: string) => Promise<boolean>;
16
+ }
17
+ export interface PushResult {
18
+ created: number;
19
+ updated: number;
20
+ unchanged: number;
21
+ errors: number;
22
+ warnings: string[];
23
+ sqlLogPath?: string;
24
+ }
25
+ export interface EntityPushResult {
26
+ created: number;
27
+ updated: number;
28
+ unchanged: number;
29
+ errors: number;
30
+ }
31
+ export declare class PushService {
32
+ private syncEngine;
33
+ private contextUser;
34
+ private warnings;
35
+ private processedRecords;
36
+ private syncConfig;
37
+ constructor(syncEngine: SyncEngine, contextUser: UserInfo);
38
+ push(options: PushOptions, callbacks?: PushCallbacks): Promise<PushResult>;
39
+ private processEntityDirectory;
40
+ private processRecord;
41
+ private processRelatedEntities;
42
+ private isValidRecordData;
43
+ private getRecordKey;
44
+ private formatFieldValue;
45
+ private findEntityDirectories;
46
+ private findEntityDirectoriesRecursive;
47
+ }