forked from AdguardTeam/AdguardBrowserExtension
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrenew-locales.js
More file actions
146 lines (129 loc) · 4.17 KB
/
renew-locales.js
File metadata and controls
146 lines (129 loc) · 4.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
const fs = require('fs').promises;
const path = require('path');
const _ = require('lodash');
const { LOCALES_DIR } = require('./consts');
/**
* Search configuration
*/
const configuration = {
src: path.join('../', LOCALES_DIR, '/en/messages.json'), // Base language json
targets: [ './Extension/' ], // Directory to search occurrences
output: LOCALES_DIR + '/en/messages.json', // Place to put result
filesReg: '(.js|.html)$',
// messages used in extensions localisations e.g. __MSG_short_name__
persistedMessages: ['name', 'short_name', 'description'],
};
/**
* Promise wrapper for writing in file
*
* @param {string} filename
* @param {*} body
*/
const writeInFile = (filename, body) => {
if (typeof body !== 'string') {
body = JSON.stringify(body, null, 4);
}
return fs.writeFile(filename, body);
};
/**
* Finds files paths within directory corresponding to filesReg
* @param {string} dir
* @param {string} filesReg
* @returns {Promise<*>}
*/
const findFilesPaths = async (dir, filesReg) => {
const filterRegexp = new RegExp(filesReg);
const walk = async (dir, filePaths = []) => {
const files = await fs.readdir(dir);
for (let file of files) {
const filePath = path.join(dir, file);
const stat = await fs.stat(filePath);
if (stat.isDirectory()) {
filePaths = await walk(filePath, filePaths);
} else {
if (filePath.match(filterRegexp)) {
filePaths.push(filePath);
}
}
}
return filePaths;
};
return walk(dir);
};
const getFilesPathsList = async (targets, filesReg) => {
const filesListsPromises = targets.map(async directory => {
return await findFilesPaths(directory, filesReg);
});
return Promise
.all(filesListsPromises)
.then(filesLists => {
return filesLists.reduce((uniqueFiles, filesList) => {
return [...new Set([...uniqueFiles, ...filesList])];
}, []);
})
};
const filterMessages = (messages, content) => {
return messages.filter(message => {
return content.indexOf(message) > -1;
});
};
const chooseMessagesFromFiles = async (messages, targets, filesReg) => {
const filesPaths = await getFilesPathsList(targets, filesReg);
const filteredMessages = filesPaths.map(async filePath => {
const fileContent = await fs.readFile(filePath);
return filterMessages(messages, fileContent);
});
return Promise
.all(filteredMessages)
.then(messages => {
return [...messages.reduce((unique, messageArray) => {
return new Set([...unique, ...messageArray]);
}, new Set())]
});
};
/**
* Initialization of search process
*/
const renewLocales = async (done) => {
let {
src,
targets,
output = 'result.json',
filesReg = '.html$',
persistedMessages = [],
} = configuration;
if (!src) {
throw new Error('No source path');
}
if (!targets || !targets.length) {
throw new Error('No target directories');
}
if (typeof targets === 'string') {
targets = [target];
}
const source = require(src);
const oldKeys = Object.keys({...source});
chooseMessagesFromFiles(oldKeys, targets, filesReg)
.then(chosenKeys => {
const result = {};
const resultMessages = _.uniq([...chosenKeys, ...persistedMessages]);
resultMessages.forEach(key => {
result[key] = source[key];
});
console.log('existing keys length: ', resultMessages.length);
console.log('old keys length: ', oldKeys.length);
const removedKeys = _.xor(resultMessages, oldKeys);
console.log('removed keys length: ', removedKeys.length);
console.log('removed keys: ', removedKeys);
return writeInFile(output, result);
})
.then(() => {
console.log('Success');
done();
})
.catch(err => {
console.log(err);
done(err);
});
};
export default renewLocales;