forked from honestbleeps/Reddit-Enhancement-Suite
-
Notifications
You must be signed in to change notification settings - Fork 0
/
i18nTransformer.js
72 lines (55 loc) · 2.06 KB
/
i18nTransformer.js
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
/* @noflow */
/* eslint-disable import/no-nodejs-modules */
import fs from 'fs';
import path from 'path';
import _ from 'lodash';
export default function i18nTransformer(file, api) {
const j = api.jscodeshift;
const basePath = j(file.source);
const modName = basePath
.find(j.NewExpression, { callee: { name: 'Module' } })
.get().node.arguments[0].value;
const newI18nKeys = {};
const modOptionsPath = basePath
.find(j.AssignmentExpression, {
left: {
type: 'MemberExpression',
object: { name: 'module' },
property: { name: 'options' },
},
})
.at(0);
function upCase(str) {
return str.slice(0, 1).toUpperCase() + str.slice(1);
}
modOptionsPath
.find(j.Property, { value: { properties: [] } })
.filter(path => path.parentPath.parentPath.parentPath.node === modOptionsPath.get().node)
.forEach(optionPath => {
const optName = optionPath.node.key.name;
const titleKey = `${modName}${upCase(optName)}Title`;
newI18nKeys[titleKey] = _.startCase(optName);
optionPath.node.value.properties.unshift(j.property('init', j.identifier('title'), j.literal(titleKey)));
j(optionPath)
.find(j.Property, { kind: 'init', key: { name: 'description' } })
.filter(path => path.parentPath.parentPath.parentPath.node === optionPath.node)
.replaceWith(descPath => {
const descKey = `${modName}${upCase(optName)}Desc`;
newI18nKeys[descKey] = descPath.node.value.type === 'TemplateLiteral' ?
descPath.node.value.quasis[0].value.raw.trim() :
descPath.node.value.value;
return j.property('init', j.identifier('description'), j.literal(descKey));
});
});
const enJsonLocation = path.join(__dirname, '../locales/locales/en.json');
const enJson = fs.readFileSync(enJsonLocation, { encoding: 'utf8' });
const enJsonObj = JSON.parse(enJson);
Object.assign(enJsonObj, _.mapValues(newI18nKeys, message => ({ message })));
const newEnJson = JSON.stringify(enJsonObj, null, '\t');
fs.writeFileSync(enJsonLocation, newEnJson);
return basePath.toSource({
tabWidth: 4,
quote: 'single',
trailingComma: true,
});
}