Skip to content

Commit da18426

Browse files
committed
🆙 update: design API
1 parent 2fc5f5e commit da18426

19 files changed

+239
-40
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ i18n locale messages management tool for vue-i18n
55
:construction_worker: WIP
66

77
## :white_check_mark: TODO
8-
- [ ] API design
8+
- [x] API design
99
- [ ] extract locale messages from SFC
1010
- [ ] infuse to SFC from locale mesasges
1111
- [ ] CLI tool

lib/index.js

Lines changed: 124 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,126 @@
11
"use strict";
2+
var __importStar = (this && this.__importStar) || function (mod) {
3+
if (mod && mod.__esModule) return mod;
4+
var result = {};
5+
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
6+
result["default"] = mod;
7+
return result;
8+
};
9+
var __importDefault = (this && this.__importDefault) || function (mod) {
10+
return (mod && mod.__esModule) ? mod : { "default": mod };
11+
};
212
Object.defineProperty(exports, "__esModule", { value: true });
3-
exports.default = {};
13+
const component_compiler_utils_1 = require("@vue/component-compiler-utils");
14+
const compiler = __importStar(require("vue-template-compiler"));
15+
const path_1 = __importDefault(require("path"));
16+
const debug_1 = require("debug");
17+
const debug = debug_1.debug('vue-i18n-extract-locale-messages');
18+
const messages = [{
19+
fullPath: '/project1/src/App.vue',
20+
content: `
21+
<i18n>
22+
{
23+
"en": { "title": "Application" },
24+
"ja": { "title": "アプリケーション" }
25+
}
26+
</i18n>
27+
`
28+
}, {
29+
fullPath: '/project1/src/components/Modal.vue',
30+
content: `
31+
<i18n locale="en">
32+
{
33+
"ok": "OK",
34+
"cancel": "Cancel"
35+
}
36+
</i18n>
37+
<i18n locale="ja">
38+
{
39+
"ok": "OK",
40+
"cancel": "キャンセル"
41+
}
42+
</i18n>
43+
`
44+
}, {
45+
fullPath: '/project1/src/components/nest/RankingTable.vue',
46+
content: `
47+
<i18n locale="en">
48+
{
49+
"headers": {
50+
"rank": "Rank",
51+
"name": "Name",
52+
"score": "Score"
53+
}
54+
}
55+
</i18n>
56+
`
57+
}, {
58+
fullPath: '/project1/src/pages/Login.vue',
59+
content: `
60+
<i18n>
61+
{
62+
"ja": {
63+
"id": "ユーザーID",
64+
"passowrd": "パスワード",
65+
"confirm": "パスワードの確認入力",
66+
"button": "ログイン"
67+
}
68+
}
69+
</i18n>
70+
`
71+
}];
72+
function parseTargets(base, targets) {
73+
const messages = {};
74+
targets.forEach(target => {
75+
const nestKeypaths = parsePath(base, target);
76+
debug('nestKeypaths', nestKeypaths);
77+
const blockMessages = parseI18nBlock(target.content);
78+
const locales = Object.keys(blockMessages);
79+
const collects = locales.reduce((messages, locale) => {
80+
const ret = nestKeypaths.reduce((messages, key) => {
81+
return Object.assign({}, { [key]: messages });
82+
}, blockMessages[locale]);
83+
return Object.assign(messages, { [locale]: ret });
84+
}, {});
85+
debug('collects', collects);
86+
locales.forEach(locale => {
87+
messages[locale] = messages[locale] || {};
88+
messages[locale] = Object.assign(messages[locale], collects[locale]);
89+
});
90+
});
91+
return messages;
92+
}
93+
exports.parseTargets = parseTargets;
94+
function parsePath(base, target) {
95+
const pathObj = path_1.default.parse(target.fullPath);
96+
const [_, keypathRaw] = pathObj.dir.split(base);
97+
const keypaths = keypathRaw.split(path_1.default.sep);
98+
keypaths.shift();
99+
return [pathObj.name, ...keypaths.reverse()];
100+
}
101+
function parseI18nBlock(content) {
102+
const desc = component_compiler_utils_1.parse({
103+
source: content,
104+
compiler: compiler
105+
});
106+
return desc.customBlocks.reduce((messages, block) => {
107+
if (block.type === 'i18n') {
108+
const obj = JSON.parse(block.content);
109+
if (block.attrs.locale) {
110+
return Object.assign(messages, { [block.attrs.locale]: obj });
111+
}
112+
else {
113+
return Object.assign(messages, obj);
114+
}
115+
}
116+
else {
117+
return messages;
118+
}
119+
}, {});
120+
}
121+
const res = parseTargets('/project1/src', messages);
122+
console.log('extract locale messages', JSON.stringify(res, null, 2));
123+
function add(a, b) {
124+
return a + b;
125+
}
126+
exports.default = add;

lib/infuser.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"use strict";

lib/reflector.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"use strict";

lib/squeezer.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"use strict";

lib/src/index.js

Lines changed: 0 additions & 6 deletions
This file was deleted.

lib/test/index.test.js

Lines changed: 0 additions & 17 deletions
This file was deleted.

package.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
"bugs": {
1010
"url": "https://github.com/kazupon/vue-i18n-locale-message/issues"
1111
},
12+
"types": "types/index.d.ts",
1213
"files": [
14+
"types",
1315
"lib",
1416
"src"
1517
],
@@ -34,7 +36,9 @@
3436
"opener": "^1.5.1",
3537
"ts-jest": "^24.0.2",
3638
"typescript": "^3.5.3",
37-
"typescript-eslint-language-service": "^1.1.2"
39+
"typescript-eslint-language-service": "^1.1.2",
40+
"vue": "^2.6.10",
41+
"vue-template-compiler": "^2.6.10"
3842
},
3943
"engines": {
4044
"node": ">= 8"
@@ -48,9 +52,6 @@
4852
],
4953
"license": "MIT",
5054
"main": "lib/index.js",
51-
"peerDependencies": {
52-
"vue-template-compiler": "*"
53-
},
5455
"private": true,
5556
"repository": {
5657
"type": "git",

src/index.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1-
export default function add (a: number, b: number) {
2-
return a + b
1+
import getLocaleMessageMeta from './reflector'
2+
import squeeze from './squeezer'
3+
import infuse from './infuser'
4+
5+
export {
6+
getLocaleMessageMeta,
7+
squeeze,
8+
infuse
39
}

src/infuser.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { LocaleMessages, LocaleMessageMeta } from '../types'
2+
3+
export default function infuse (messages: LocaleMessages, meta: LocaleMessageMeta[]): void {
4+
}

0 commit comments

Comments
 (0)