Skip to content

Commit dccaa2b

Browse files
committed
📦 build: dist files
1 parent 44df7ab commit dccaa2b

File tree

7 files changed

+359
-38
lines changed

7 files changed

+359
-38
lines changed

lib/cli.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/usr/bin/env node
2+
"use strict";
3+
var __importStar = (this && this.__importStar) || function (mod) {
4+
if (mod && mod.__esModule) return mod;
5+
var result = {};
6+
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
7+
result["default"] = mod;
8+
return result;
9+
};
10+
Object.defineProperty(exports, "__esModule", { value: true });
11+
const yargs = __importStar(require("yargs"));
12+
yargs
13+
.usage('Usage: $0 <command> [options]')
14+
.commandDir('./commands', {
15+
extensions: process.env.NODE_ENV === 'development' ? ['js', 'ts'] : ['js']
16+
})
17+
.demandCommand()
18+
.help()
19+
.version()
20+
.argv;
21+
process.on('uncaughtException', err => {
22+
console.error(`uncaught exception: ${err}\n`);
23+
process.exit(1);
24+
});
25+
process.on('unhandledRejection', (reason, p) => {
26+
console.error('unhandled rejection at:', p, 'reason:', reason);
27+
process.exit(1);
28+
});

lib/commands/infuse.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
"use strict";
2+
var __importDefault = (this && this.__importDefault) || function (mod) {
3+
return (mod && mod.__esModule) ? mod : { "default": mod };
4+
};
5+
Object.defineProperty(exports, "__esModule", { value: true });
6+
const utils_1 = require("../utils");
7+
const infuser_1 = __importDefault(require("../infuser"));
8+
const fs_1 = __importDefault(require("fs"));
9+
exports.command = 'infuse';
10+
exports.aliases = 'inf';
11+
exports.describe = 'infuse locale messages to single-file components';
12+
exports.builder = (args) => {
13+
return args
14+
.option('target', {
15+
type: 'string',
16+
alias: 't',
17+
describe: 'target path that single-file components is stored',
18+
demandOption: true
19+
})
20+
.option('messages', {
21+
type: 'string',
22+
alias: 'o',
23+
describe: 'locale messages path to be infused',
24+
demandOption: true
25+
});
26+
};
27+
exports.handler = (args) => {
28+
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));
31+
writeSFC(newSources);
32+
};
33+
function readLocaleMessages(path) {
34+
// TODO: async implementation
35+
const data = fs_1.default.readFileSync(path, { encoding: 'utf8' });
36+
return JSON.parse(data);
37+
}
38+
function writeSFC(sources) {
39+
// TODO: async implementation
40+
sources.forEach(({ path, content }) => {
41+
fs_1.default.writeFileSync(path, content);
42+
});
43+
}
44+
exports.default = {
45+
command: exports.command,
46+
aliases: exports.aliases,
47+
describe: exports.describe,
48+
builder: exports.builder,
49+
handler: exports.handler
50+
};

lib/commands/squeeze.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
"use strict";
2+
var __importDefault = (this && this.__importDefault) || function (mod) {
3+
return (mod && mod.__esModule) ? mod : { "default": mod };
4+
};
5+
Object.defineProperty(exports, "__esModule", { value: true });
6+
const utils_1 = require("../utils");
7+
const squeezer_1 = __importDefault(require("../squeezer"));
8+
const fs_1 = __importDefault(require("fs"));
9+
exports.command = 'squeeze';
10+
exports.aliases = 'sqz';
11+
exports.describe = 'squeeze locale messages from single-file components';
12+
exports.builder = (args) => {
13+
const outputDefault = `${process.cwd()}/messages.json`;
14+
return args
15+
.option('target', {
16+
type: 'string',
17+
alias: 't',
18+
describe: 'target path that single-file components is stored',
19+
demandOption: true
20+
})
21+
.option('output', {
22+
type: 'string',
23+
alias: 'o',
24+
default: outputDefault,
25+
describe: 'path to output squeezed locale messages'
26+
});
27+
};
28+
exports.handler = (args) => {
29+
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);
32+
};
33+
function writeLocaleMessages(output, messages) {
34+
// TODO: async implementation
35+
fs_1.default.writeFileSync(output, JSON.stringify(messages, null, 2));
36+
}
37+
exports.default = {
38+
command: exports.command,
39+
aliases: exports.aliases,
40+
describe: exports.describe,
41+
builder: exports.builder,
42+
handler: exports.handler
43+
};

lib/index.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
33
return (mod && mod.__esModule) ? mod : { "default": mod };
44
};
55
Object.defineProperty(exports, "__esModule", { value: true });
6-
const reflector_1 = __importDefault(require("./reflector"));
7-
exports.getLocaleMessageMeta = reflector_1.default;
86
const squeezer_1 = __importDefault(require("./squeezer"));
97
exports.squeeze = squeezer_1.default;
108
const infuser_1 = __importDefault(require("./infuser"));

lib/infuser.js

Lines changed: 115 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,119 @@
11
"use strict";
2+
var __importDefault = (this && this.__importDefault) || function (mod) {
3+
return (mod && mod.__esModule) ? mod : { "default": mod };
4+
};
25
Object.defineProperty(exports, "__esModule", { value: true });
3-
function infuse(messages, meta) {
6+
const utils_1 = require("./utils");
7+
const prettier_1 = __importDefault(require("prettier"));
8+
const debug_1 = require("debug");
9+
const debug = debug_1.debug('vue-i18n-locale-message:infuser');
10+
function infuse(basePath, sources, messages) {
11+
const descriptors = utils_1.reflectSFCDescriptor(basePath, sources);
12+
const locales = Object.keys(messages);
13+
return descriptors.map(descriptor => {
14+
return {
15+
content: generate(locales, messages, descriptor),
16+
path: descriptor.contentPath
17+
};
18+
});
419
}
520
exports.default = infuse;
21+
function generate(locales, messages, descriptor) {
22+
const target = getTargetLocaleMessages(locales, messages, descriptor);
23+
debug('target locale messages\n', target);
24+
const blocks = getBlocks(descriptor);
25+
blocks.forEach(b => debug(`block: type=${b.type}, start=${b.start}, end=${b.end}`));
26+
const { raw } = descriptor;
27+
const content = buildContent(target, raw, blocks);
28+
debug(`build content:\n${content}`);
29+
debug(`content size: raw=${raw.length}, content=${content.length}`);
30+
return format(content, 'vue');
31+
}
32+
function getTargetLocaleMessages(locales, messages, descriptor) {
33+
return locales.reduce((target, locale) => {
34+
const obj = messages[locale];
35+
if (obj) {
36+
let o = obj;
37+
const hierarchy = descriptor.hierarchy.concat();
38+
while (hierarchy.length > 0) {
39+
const key = hierarchy.shift();
40+
if (!key) {
41+
break;
42+
}
43+
o = o[key];
44+
}
45+
return Object.assign(target, { [locale]: o });
46+
}
47+
else {
48+
return target;
49+
}
50+
}, {});
51+
}
52+
function getBlocks(descriptor) {
53+
const { template, script, styles, customBlocks } = descriptor;
54+
const blocks = [...styles, ...customBlocks];
55+
template && blocks.push(template);
56+
script && blocks.push(script);
57+
blocks.sort((a, b) => { return a.start - b.start; });
58+
return blocks;
59+
}
60+
function buildContent(target, raw, blocks) {
61+
let offset = 0;
62+
let contents = [];
63+
let targetLocales = Object.keys(target);
64+
contents = blocks.reduce((contents, block) => {
65+
if (block.type === 'i18n') {
66+
let lang = block.attrs.lang;
67+
lang = (!lang || typeof lang !== 'string') ? 'json' : lang;
68+
let messages = null;
69+
const locale = block.attrs.locale;
70+
if (!locale || typeof locale !== 'string') {
71+
const obj = utils_1.parseContent(block.content, lang);
72+
const locales = Object.keys(obj);
73+
messages = locales.reduce((messages, locale) => {
74+
return Object.assign(messages, { [locale]: target[locale] });
75+
}, {});
76+
locales.forEach(locale => {
77+
targetLocales = targetLocales.filter(l => l !== locale);
78+
});
79+
}
80+
else {
81+
messages = Object.assign({}, target[locale]);
82+
targetLocales = targetLocales.filter(l => l !== locale);
83+
}
84+
contents = contents.concat(raw.slice(offset, block.start));
85+
const serialized = `\n${format(utils_1.stringfyContent(messages, lang), lang)}`;
86+
contents = contents.concat(serialized);
87+
offset = block.end;
88+
}
89+
else {
90+
contents = contents.concat(raw.slice(offset, block.end));
91+
offset = block.end;
92+
}
93+
return contents;
94+
}, contents);
95+
contents = contents.concat(raw.slice(offset, raw.length));
96+
if (targetLocales.length > 0) {
97+
contents = targetLocales.reduce((contents, locale) => {
98+
contents.push(`\n
99+
<i18n locale="${locale}">
100+
${format(utils_1.stringfyContent(target[locale], 'json'), 'json')}</i18n>`);
101+
return contents;
102+
}, contents);
103+
}
104+
return contents.join('');
105+
}
106+
function format(source, lang) {
107+
switch (lang) {
108+
case 'vue':
109+
return prettier_1.default.format(source, { parser: 'vue' });
110+
case 'yaml':
111+
case 'yml':
112+
return prettier_1.default.format(source, { parser: 'yaml', tabWidth: 2 });
113+
case 'json5':
114+
return prettier_1.default.format(source, { parser: 'json5', tabWidth: 2 });
115+
case 'json':
116+
default:
117+
return prettier_1.default.format(source, { parser: 'json-stringify', tabWidth: 2 });
118+
}
119+
}

lib/squeezer.js

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,35 @@
11
"use strict";
2-
var __importDefault = (this && this.__importDefault) || function (mod) {
3-
return (mod && mod.__esModule) ? mod : { "default": mod };
4-
};
52
Object.defineProperty(exports, "__esModule", { value: true });
6-
const json5_1 = __importDefault(require("json5"));
7-
const js_yaml_1 = __importDefault(require("js-yaml"));
3+
const utils_1 = require("./utils");
84
const debug_1 = require("debug");
95
const debug = debug_1.debug('vue-i18n-locale-message:squeezer');
10-
function sqeeze(meta) {
11-
const messages = {};
12-
meta.forEach(target => {
13-
const blockMessages = squeezeFromI18nBlock(target.blocks);
6+
function sqeeze(basePath, files) {
7+
const descriptors = utils_1.reflectSFCDescriptor(basePath, files);
8+
return descriptors.reduce((messages, descriptor) => {
9+
const blockMessages = squeezeFromI18nBlock(descriptor.customBlocks);
1410
const locales = Object.keys(blockMessages);
15-
const collects = locales.reduce((messages, locale) => {
16-
const ret = target.hierarchy.reduce((messages, key) => {
17-
return Object.assign({}, { [key]: messages });
18-
}, blockMessages[locale]);
19-
return Object.assign(messages, { [locale]: ret });
20-
}, {});
21-
debug('collects', collects);
22-
locales.forEach(locale => {
23-
messages[locale] = messages[locale] || {};
24-
messages[locale] = Object.assign(messages[locale], collects[locale]);
25-
});
26-
});
27-
return messages;
11+
return locales.reduce((messages, locale) => {
12+
if (!messages[locale]) {
13+
messages[locale] = {};
14+
}
15+
const localeMessages = messages[locale];
16+
const localeBlockMessages = blockMessages[locale];
17+
let target = localeMessages;
18+
const hierarchy = descriptor.hierarchy.concat();
19+
while (hierarchy.length >= 0) {
20+
const key = hierarchy.shift();
21+
if (!key) {
22+
break;
23+
}
24+
if (!target[key]) {
25+
target[key] = {};
26+
}
27+
target = target[key];
28+
}
29+
Object.assign(target, localeBlockMessages);
30+
return messages;
31+
}, messages);
32+
}, {});
2833
}
2934
exports.default = sqeeze;
3035
function squeezeFromI18nBlock(blocks) {
@@ -33,7 +38,7 @@ function squeezeFromI18nBlock(blocks) {
3338
if (block.type === 'i18n') {
3439
let lang = block.attrs.lang;
3540
lang = (!lang || typeof lang !== 'string') ? 'json' : lang;
36-
const obj = parseContent(block.content, lang);
41+
const obj = utils_1.parseContent(block.content, lang);
3742
const locale = block.attrs.locale;
3843
if (!locale || typeof locale !== 'string') {
3944
return Object.assign(messages, obj);
@@ -47,15 +52,3 @@ function squeezeFromI18nBlock(blocks) {
4752
}
4853
}, {});
4954
}
50-
function parseContent(content, lang) {
51-
switch (lang) {
52-
case 'yaml':
53-
case 'yml':
54-
return js_yaml_1.default.safeLoad(content);
55-
case 'json5':
56-
return json5_1.default.parse(content);
57-
case 'json':
58-
default:
59-
return JSON.parse(content);
60-
}
61-
}

0 commit comments

Comments
 (0)