| 
									
										
										
										
											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)}`); | 
					
						
							|  |  |  |         keysCount++; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     valuesCount++; | 
					
						
							|  |  |  |     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 }; |