2022-02-22 11:15:34 +01:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
const chalk = require('chalk');
|
|
|
|
const { merge } = require('lodash/fp');
|
|
|
|
const { readAllTranslationFiles } = require('../utils/translation-files');
|
2022-03-09 16:12:33 +01:00
|
|
|
const allowedKeys = require('./allowed-keys');
|
2022-02-22 11:15:34 +01:00
|
|
|
|
2022-08-08 23:33:39 +02:00
|
|
|
const printResults = (results) => {
|
2022-02-22 11:15:34 +01:00
|
|
|
let valuesCount = 0;
|
|
|
|
let keysCount = 0;
|
|
|
|
|
|
|
|
Object.entries(results).forEach(([value, pkgs]) => {
|
|
|
|
Object.entries(pkgs).forEach(([packageName, keys]) => {
|
2022-08-08 23:33:39 +02:00
|
|
|
keys.forEach((key) => {
|
2022-02-22 11:15:34 +01:00
|
|
|
console.log(`"${chalk.yellow(value)}" ${packageName} ${chalk.blue(key)}`);
|
2022-09-05 15:04:28 +02:00
|
|
|
keysCount += 1;
|
2022-02-22 11:15:34 +01:00
|
|
|
});
|
|
|
|
});
|
2022-09-05 15:04:28 +02:00
|
|
|
valuesCount += 1;
|
2022-02-22 11:15:34 +01:00
|
|
|
console.log();
|
|
|
|
});
|
|
|
|
|
|
|
|
console.log(`${valuesCount} duplicated values`);
|
|
|
|
console.log(`${keysCount} keys can be merged`);
|
|
|
|
};
|
|
|
|
|
2022-08-08 23:33:39 +02:00
|
|
|
const getDuplicatesObject = (
|
|
|
|
prevDups = {},
|
|
|
|
{ f1Key, f2Keys, f1PackageName, f2PackageName } = {}
|
|
|
|
) => {
|
2022-02-22 11:15:34 +01:00
|
|
|
const f1PackagePrevDups = prevDups[f1PackageName] || [];
|
|
|
|
const f2PackagePrevDups = prevDups[f2PackageName] || [];
|
|
|
|
const duplicates = {};
|
|
|
|
|
|
|
|
// Merge and spread duplicate keys array to sets to remove duplicates
|
|
|
|
duplicates[f1PackageName] = new Set([...f1PackagePrevDups, f1Key]);
|
|
|
|
duplicates[f2PackageName] = new Set([...f2PackagePrevDups, ...f2Keys]);
|
|
|
|
|
|
|
|
return duplicates;
|
|
|
|
};
|
|
|
|
|
|
|
|
const findDuplicates = (file1, file2, { sameFile } = { sameFile: false }) => {
|
|
|
|
const dupValues = {};
|
|
|
|
|
|
|
|
// Find in file2 duplicates of every file1 value
|
|
|
|
// Format a duplicate object and add it to the dupValues object with translation value as key
|
|
|
|
Object.entries(file1.fileContent)
|
2022-03-09 16:12:33 +01:00
|
|
|
.filter(([f1Key]) => !allowedKeys.includes(f1Key))
|
2022-02-22 11:15:34 +01:00
|
|
|
.forEach(([f1Key, f1Value]) => {
|
|
|
|
// Match translations with the same value
|
|
|
|
// Skip translations with identical key in a same file (avoid matching itself)
|
|
|
|
// Get an array of keys
|
|
|
|
const f2Keys = Object.entries(file2.fileContent)
|
2022-03-09 16:12:33 +01:00
|
|
|
.filter(([f2Key]) => !allowedKeys.includes(f2Key))
|
2022-02-22 11:15:34 +01:00
|
|
|
.filter(([, f2Value]) => f2Value === f1Value)
|
|
|
|
.filter(([f2Key]) => !sameFile || f1Key !== f2Key)
|
|
|
|
.map(([f2Key]) => f2Key);
|
|
|
|
|
|
|
|
// Add a duplicate value to dupValues if duplicates have been found
|
|
|
|
if (f2Keys.length > 0) {
|
|
|
|
dupValues[f1Value] = getDuplicatesObject(dupValues[f1Value], {
|
|
|
|
f1Key,
|
|
|
|
f2Keys,
|
|
|
|
f1PackageName: file1.packageName,
|
|
|
|
f2PackageName: file2.packageName,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
return dupValues;
|
|
|
|
};
|
|
|
|
|
|
|
|
const findDuplicatedTranslations = () => {
|
|
|
|
const files = readAllTranslationFiles();
|
|
|
|
|
|
|
|
// Separate core/admin file from plugin files
|
|
|
|
const [coreFile] = files.splice(
|
2022-08-08 23:33:39 +02:00
|
|
|
files.findIndex((file) => file.packageName === 'core/admin'),
|
2022-02-22 11:15:34 +01:00
|
|
|
1
|
|
|
|
);
|
|
|
|
const pluginFiles = files;
|
|
|
|
|
|
|
|
// Find duplicates inside every file separately
|
|
|
|
const coreAdminDuplicates = findDuplicates(coreFile, coreFile, { sameFile: true });
|
|
|
|
let crossPackagesDuplicates = { ...coreAdminDuplicates };
|
2022-08-08 23:33:39 +02:00
|
|
|
pluginFiles.forEach((pluginFile) => {
|
2022-02-22 11:15:34 +01:00
|
|
|
crossPackagesDuplicates = merge(
|
|
|
|
crossPackagesDuplicates,
|
|
|
|
findDuplicates(pluginFile, pluginFile, { sameFile: true })
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
// Find duplicates between core/admin and every plugin file
|
|
|
|
// Merge the results with core/admin duplicates to avoid showing the same key twice
|
|
|
|
// (in case core/admin contains duplicate values that also exists in a plugin)
|
2022-08-08 23:33:39 +02:00
|
|
|
pluginFiles.forEach((file) => {
|
2022-02-22 11:15:34 +01:00
|
|
|
crossPackagesDuplicates = merge(crossPackagesDuplicates, findDuplicates(coreFile, file));
|
|
|
|
});
|
|
|
|
|
|
|
|
return crossPackagesDuplicates;
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports = { findDuplicatedTranslations, printResults };
|