zlocalz
Version:
ZLocalz - TUI Locale Guardian for Flutter ARB l10n/i18n validation and translation with AI-powered fixes
83 lines • 3.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DiffGenerator = void 0;
const diff_1 = require("diff");
class DiffGenerator {
static async generatePatch(originalFile, modifiedFile, format = 'unified') {
const originalContent = await this.serializeARB(originalFile);
const modifiedContent = await this.serializeARB(modifiedFile);
const patch = (0, diff_1.createTwoFilesPatch)(originalFile.path, modifiedFile.path, originalContent, modifiedContent, 'original', 'modified', { context: 3 });
return {
path: modifiedFile.path,
diff: patch,
format
};
}
static async generatePatches(originalFiles, modifiedFiles) {
const patches = [];
for (const [locale, modifiedFile] of modifiedFiles) {
const originalFile = originalFiles.get(locale);
if (!originalFile)
continue;
const hasChanges = await this.hasChanges(originalFile, modifiedFile);
if (hasChanges) {
const patch = await this.generatePatch(originalFile, modifiedFile);
patches.push(patch);
}
}
return patches;
}
static async serializeARB(file) {
const output = {};
if (file.raw['@@locale']) {
output['@@locale'] = file.raw['@@locale'];
}
const keys = Object.keys(file.entries).sort();
for (const key of keys) {
const entry = file.entries[key];
output[key] = entry.value;
if (entry.metadata || entry.description || entry.placeholders) {
const metadata = {};
if (entry.description)
metadata.description = entry.description;
if (entry.placeholders)
metadata.placeholders = entry.placeholders;
if (entry.metadata)
Object.assign(metadata, entry.metadata);
if (Object.keys(metadata).length > 0) {
output[`@${key}`] = metadata;
}
}
}
return JSON.stringify(output, null, 2) + '\n';
}
static async hasChanges(originalFile, modifiedFile) {
const original = await this.serializeARB(originalFile);
const modified = await this.serializeARB(modifiedFile);
return original !== modified;
}
static formatPatchForDisplay(patch) {
const lines = patch.diff.split('\n');
const formatted = [];
for (const line of lines) {
if (line.startsWith('+++') || line.startsWith('---')) {
formatted.push(`\x1b[36m${line}\x1b[0m`);
}
else if (line.startsWith('@@')) {
formatted.push(`\x1b[35m${line}\x1b[0m`);
}
else if (line.startsWith('+')) {
formatted.push(`\x1b[32m${line}\x1b[0m`);
}
else if (line.startsWith('-')) {
formatted.push(`\x1b[31m${line}\x1b[0m`);
}
else {
formatted.push(line);
}
}
return formatted.join('\n');
}
}
exports.DiffGenerator = DiffGenerator;
//# sourceMappingURL=diff-generator.js.map