Skip to content

Commit e9829ff

Browse files
committed
📦 build: generate dist files
1 parent ea812f3 commit e9829ff

File tree

5 files changed

+285
-101
lines changed

5 files changed

+285
-101
lines changed

lib/commands/infuse.js

Lines changed: 131 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
55
Object.defineProperty(exports, "__esModule", { value: true });
66
const utils_1 = require("../utils");
77
const infuser_1 = __importDefault(require("../infuser"));
8+
const squeezer_1 = __importDefault(require("../squeezer"));
89
const fs_1 = __importDefault(require("fs"));
10+
const path_1 = __importDefault(require("path"));
11+
const deep_diff_1 = require("deep-diff");
12+
const glob_1 = __importDefault(require("glob"));
13+
const debug_1 = require("debug");
14+
const debug = debug_1.debug('vue-i18n-locale-message:commands:infuse');
915
exports.command = 'infuse';
1016
exports.aliases = 'inf';
1117
exports.describe = 'infuse locale messages to single-file components';
@@ -17,23 +23,140 @@ exports.builder = (args) => {
1723
describe: 'target path that single-file components is stored',
1824
demandOption: true
1925
})
20-
.option('messages', {
26+
.option('locales', {
2127
type: 'string',
22-
alias: 'm',
28+
alias: 'l',
2329
describe: 'locale messages path to be infused',
2430
demandOption: true
31+
})
32+
.option('match', {
33+
type: 'string',
34+
alias: 'm',
35+
describe: 'option should be accepted a regex filenames, must be specified together --messages'
2536
});
2637
};
2738
exports.handler = (args) => {
2839
const targetPath = utils_1.resolve(args.target);
29-
const messagesPath = utils_1.resolve(args.messages);
30-
const newSources = infuser_1.default(targetPath, utils_1.readSFC(targetPath), readLocaleMessages(messagesPath));
40+
const messagesPath = utils_1.resolve(args.locales);
41+
const sources = utils_1.readSFC(targetPath);
42+
const messages = readLocaleMessages(messagesPath, args.match);
43+
const meta = squeezer_1.default(targetPath, sources);
44+
apply(messages, meta);
45+
const newSources = infuser_1.default(targetPath, sources, meta);
3146
writeSFC(newSources);
3247
};
33-
function readLocaleMessages(path) {
34-
// TODO: async implementation
35-
const data = fs_1.default.readFileSync(path, { encoding: 'utf8' });
36-
return JSON.parse(data);
48+
function readLocaleMessages(targetPath, matchRegex) {
49+
debug('readLocaleMessages', targetPath, matchRegex);
50+
if (!matchRegex) {
51+
const data = fs_1.default.readFileSync(targetPath, { encoding: 'utf8' });
52+
return JSON.parse(data);
53+
}
54+
else {
55+
const globPath = path_1.default.normalize(`${targetPath}/*.json`);
56+
const paths = glob_1.default.sync(globPath);
57+
return paths.reduce((messages, p) => {
58+
const re = new RegExp(matchRegex, 'ig');
59+
const filename = path_1.default.basename(p);
60+
const match = re.exec(filename);
61+
debug('regex match', match);
62+
if (match) {
63+
const data = fs_1.default.readFileSync(p, { encoding: 'utf8' });
64+
Object.assign(messages, { [match[1]]: JSON.parse(data) });
65+
}
66+
return messages;
67+
}, {});
68+
}
69+
}
70+
function removeItem(item, items) {
71+
const index = items.indexOf(item);
72+
if (index === -1) {
73+
return false;
74+
}
75+
items.splice(index, 1);
76+
return true;
77+
}
78+
function apply(messages, meta) {
79+
const { target, components } = meta;
80+
for (const [component, blocks] of Object.entries(components)) {
81+
debug(`apply component = ${component}, blocks = ${JSON.stringify(blocks)}`);
82+
const { hierarchy } = utils_1.parsePath(target, component);
83+
const collectMessages = getTargetLocaleMessages(messages, hierarchy);
84+
debug('collect messages', JSON.stringify(collectMessages, null, 2));
85+
const sourceLocales = Object.keys(collectMessages);
86+
const targetLocales = blocks.reduce((locales, block) => {
87+
if (block.locale) {
88+
locales.push(block.locale);
89+
}
90+
else {
91+
locales = Object.keys(block.messages).reduce((locales, locale) => {
92+
locales.push(locale);
93+
return locales;
94+
}, locales);
95+
}
96+
return locales;
97+
}, []);
98+
debug(`locales: source = ${sourceLocales}, target = ${targetLocales}`);
99+
blocks.forEach(block => {
100+
const { locale } = block;
101+
if (locale) {
102+
deep_diff_1.applyDiff(block.messages[locale], collectMessages[locale]);
103+
removeItem(locale, sourceLocales);
104+
removeItem(locale, targetLocales);
105+
}
106+
else {
107+
const locales = Object.keys(block.messages);
108+
locales.forEach(locale => {
109+
deep_diff_1.applyDiff(block.messages[locale], collectMessages[locale]);
110+
removeItem(locale, sourceLocales);
111+
removeItem(locale, targetLocales);
112+
});
113+
}
114+
});
115+
debug(`locales remain: source = ${sourceLocales}, target = ${targetLocales}`);
116+
if (sourceLocales.length) {
117+
sourceLocales.forEach(locale => {
118+
blocks.push({
119+
lang: 'json',
120+
locale,
121+
messages: Object.assign({}, { [locale]: collectMessages[locale] })
122+
});
123+
});
124+
}
125+
if (targetLocales.length) {
126+
debug('invalid target remain locales ...', targetLocales.length);
127+
}
128+
}
129+
return meta;
130+
}
131+
function getTargetLocaleMessages(messages, hierarchy) {
132+
return Object.keys(messages).reduce((target, locale) => {
133+
debug(`processing curernt: locale=${locale}, target=${JSON.stringify(target)}`);
134+
const obj = messages[locale];
135+
if (obj) {
136+
let o = obj;
137+
let prev = null;
138+
const h = hierarchy.concat();
139+
while (h.length > 0) {
140+
const key = h.shift();
141+
debug('processing hierarchy key: ', key);
142+
if (!key || !o) {
143+
break;
144+
}
145+
o = o[key];
146+
prev = o;
147+
debug(`processing o = ${JSON.stringify(o)}, prev = ${JSON.stringify(prev)}`);
148+
}
149+
if (!o && !prev) {
150+
return target;
151+
}
152+
else {
153+
return Object.assign(target, { [locale]: ((!o && prev) ? prev : o) });
154+
}
155+
}
156+
else {
157+
return target;
158+
}
159+
}, {});
37160
}
38161
function writeSFC(sources) {
39162
// TODO: async implementation

lib/commands/squeeze.js

Lines changed: 83 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
66
const utils_1 = require("../utils");
77
const squeezer_1 = __importDefault(require("../squeezer"));
88
const fs_1 = __importDefault(require("fs"));
9+
const debug_1 = require("debug");
10+
const debug = debug_1.debug('vue-i18n-locale-message:commands:squeeze');
911
exports.command = 'squeeze';
1012
exports.aliases = 'sqz';
1113
exports.describe = 'squeeze locale messages from single-file components';
@@ -17,6 +19,12 @@ exports.builder = (args) => {
1719
alias: 't',
1820
describe: 'target path that single-file components is stored',
1921
demandOption: true
22+
})
23+
.option('split', {
24+
type: 'boolean',
25+
alias: 's',
26+
default: false,
27+
describe: 'split squeezed locale messages with locale'
2028
})
2129
.option('output', {
2230
type: 'string',
@@ -27,12 +35,83 @@ exports.builder = (args) => {
2735
};
2836
exports.handler = (args) => {
2937
const targetPath = utils_1.resolve(args.target);
30-
const messages = squeezer_1.default(targetPath, utils_1.readSFC(targetPath));
31-
writeLocaleMessages(utils_1.resolve(args.output), messages);
38+
const meta = squeezer_1.default(targetPath, utils_1.readSFC(targetPath));
39+
const messages = generate(meta);
40+
writeLocaleMessages(messages, args);
3241
};
33-
function writeLocaleMessages(output, messages) {
42+
function generate(meta) {
43+
const { target, components } = meta;
44+
let messages = {};
45+
const assignLocales = (locales, messages) => {
46+
return locales.reduce((messages, locale) => {
47+
!messages[locale] && Object.assign(messages, { [locale]: {} });
48+
return messages;
49+
}, messages);
50+
};
51+
for (const [component, blocks] of Object.entries(components)) {
52+
debug(`generate component = ${component}`);
53+
const parsed = utils_1.parsePath(target, component);
54+
messages = blocks.reduce((messages, block) => {
55+
debug(`generate current messages = ${JSON.stringify(messages)}`);
56+
const locales = Object.keys(block.messages);
57+
messages = assignLocales(locales, messages);
58+
locales.reduce((messages, locale) => {
59+
if (block.messages[locale]) {
60+
const localeMessages = messages[locale];
61+
const localeBlockMessages = block.messages[locale];
62+
let target = localeMessages;
63+
const hierarchy = parsed.hierarchy.concat();
64+
while (hierarchy.length >= 0) {
65+
const key = hierarchy.shift();
66+
if (!key) {
67+
break;
68+
}
69+
if (!target[key]) {
70+
target[key] = {};
71+
}
72+
target = target[key];
73+
}
74+
Object.assign(target, localeBlockMessages);
75+
return messages;
76+
}
77+
return messages;
78+
}, messages);
79+
return messages;
80+
}, messages);
81+
}
82+
return messages;
83+
}
84+
function writeLocaleMessages(messages, args) {
3485
// TODO: async implementation
35-
fs_1.default.writeFileSync(output, JSON.stringify(messages, null, 2));
86+
const split = args.split;
87+
const output = utils_1.resolve(args.output);
88+
if (!split) {
89+
fs_1.default.writeFileSync(output, JSON.stringify(messages, null, 2));
90+
}
91+
else {
92+
splitLocaleMessages(output, messages);
93+
}
94+
}
95+
function splitLocaleMessages(path, messages) {
96+
const locales = Object.keys(messages);
97+
const write = () => {
98+
locales.forEach(locale => {
99+
fs_1.default.writeFileSync(`${path}/${locale}.json`, JSON.stringify(messages[locale], null, 2));
100+
});
101+
};
102+
try {
103+
fs_1.default.mkdirSync(path);
104+
write();
105+
}
106+
catch (err) {
107+
if (err.code === 'EEXIST') {
108+
write();
109+
}
110+
else {
111+
console.error(err.message);
112+
throw err;
113+
}
114+
}
36115
}
37116
exports.default = {
38117
command: exports.command,

0 commit comments

Comments
 (0)