diff --git a/fcdev.js b/fcdev.js index b755b45..bddf84b 100644 --- a/fcdev.js +++ b/fcdev.js @@ -1,3 +1,4 @@ +import { diffLines } from 'diff'; import fs from 'fs/promises'; import path from 'path'; import { fileURLToPath } from 'url'; @@ -11,24 +12,41 @@ async function syncModelsWithWS() { console.log(`Syncing schemas from ${sourceDir} to ${targetDir}...`); + const stats = { copied: 0, added: 0, skipped: 0 }; + try { - await syncDirectory(sourceDir, targetDir, sourceDir); - console.log('✅ Schema sync completed successfully!'); + await syncDirectory(sourceDir, targetDir, sourceDir, stats); + console.log( + `✅ Schema sync completed successfully! (${stats.added} added, ${stats.copied} updated, ${stats.skipped} unchanged)` + ); } catch (error) { console.error('❌ Error syncing schemas:', error); process.exit(1); } } -async function syncDirectory(source, target, rootSource) { - // Create target directory if it doesn't exist +function fileHasChanges(oldContent, newContent) { + return diffLines(oldContent, newContent).some((part) => part.added || part.removed); +} + +async function readFileIfExists(filePath) { + try { + return await fs.readFile(filePath, 'utf8'); + } catch (error) { + if (error.code === 'ENOENT') { + return null; + } + throw error; + } +} + +async function syncDirectory(source, target, rootSource, stats) { try { await fs.access(target); } catch { await fs.mkdir(target, { recursive: true }); } - // Read all items in source directory const items = await fs.readdir(source, { withFileTypes: true }); for (const item of items) { @@ -36,12 +54,23 @@ async function syncDirectory(source, target, rootSource) { const targetPath = path.join(target, item.name); if (item.isDirectory()) { - // Recursively sync subdirectories - await syncDirectory(sourcePath, targetPath, rootSource); + await syncDirectory(sourcePath, targetPath, rootSource, stats); } else if (item.isFile()) { - // Copy file from source to target - await fs.copyFile(sourcePath, targetPath); - console.log(` ✓ Copied: ${path.relative(rootSource, sourcePath)}`); + const sourceContent = await fs.readFile(sourcePath, 'utf8'); + const targetContent = await readFileIfExists(targetPath); + const relativePath = path.relative(rootSource, sourcePath); + + if (targetContent === null) { + await fs.writeFile(targetPath, sourceContent); + stats.added += 1; + console.log(` + Added: ${relativePath}`); + } else if (fileHasChanges(targetContent, sourceContent)) { + await fs.writeFile(targetPath, sourceContent); + stats.copied += 1; + console.log(` ✓ Updated: ${relativePath}`); + } else { + stats.skipped += 1; + } } } }