Skip to content

Commit

Permalink
🆙 update: design API
Browse files Browse the repository at this point in the history
  • Loading branch information
kazupon committed Jul 29, 2019
1 parent 2fc5f5e commit da18426
Show file tree
Hide file tree
Showing 19 changed files with 239 additions and 40 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ i18n locale messages management tool for vue-i18n
:construction_worker: WIP

## :white_check_mark: TODO
- [ ] API design
- [x] API design
- [ ] extract locale messages from SFC
- [ ] infuse to SFC from locale mesasges
- [ ] CLI tool
Expand Down
125 changes: 124 additions & 1 deletion lib/index.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,126 @@
"use strict";
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = {};
const component_compiler_utils_1 = require("@vue/component-compiler-utils");
const compiler = __importStar(require("vue-template-compiler"));
const path_1 = __importDefault(require("path"));
const debug_1 = require("debug");
const debug = debug_1.debug('vue-i18n-extract-locale-messages');
const messages = [{
fullPath: '/project1/src/App.vue',
content: `
<i18n>
{
"en": { "title": "Application" },
"ja": { "title": "アプリケーション" }
}
</i18n>
`
}, {
fullPath: '/project1/src/components/Modal.vue',
content: `
<i18n locale="en">
{
"ok": "OK",
"cancel": "Cancel"
}
</i18n>
<i18n locale="ja">
{
"ok": "OK",
"cancel": "キャンセル"
}
</i18n>
`
}, {
fullPath: '/project1/src/components/nest/RankingTable.vue',
content: `
<i18n locale="en">
{
"headers": {
"rank": "Rank",
"name": "Name",
"score": "Score"
}
}
</i18n>
`
}, {
fullPath: '/project1/src/pages/Login.vue',
content: `
<i18n>
{
"ja": {
"id": "ユーザーID",
"passowrd": "パスワード",
"confirm": "パスワードの確認入力",
"button": "ログイン"
}
}
</i18n>
`
}];
function parseTargets(base, targets) {
const messages = {};
targets.forEach(target => {
const nestKeypaths = parsePath(base, target);
debug('nestKeypaths', nestKeypaths);
const blockMessages = parseI18nBlock(target.content);
const locales = Object.keys(blockMessages);
const collects = locales.reduce((messages, locale) => {
const ret = nestKeypaths.reduce((messages, key) => {
return Object.assign({}, { [key]: messages });
}, blockMessages[locale]);
return Object.assign(messages, { [locale]: ret });
}, {});
debug('collects', collects);
locales.forEach(locale => {
messages[locale] = messages[locale] || {};
messages[locale] = Object.assign(messages[locale], collects[locale]);
});
});
return messages;
}
exports.parseTargets = parseTargets;
function parsePath(base, target) {
const pathObj = path_1.default.parse(target.fullPath);
const [_, keypathRaw] = pathObj.dir.split(base);
const keypaths = keypathRaw.split(path_1.default.sep);
keypaths.shift();
return [pathObj.name, ...keypaths.reverse()];
}
function parseI18nBlock(content) {
const desc = component_compiler_utils_1.parse({
source: content,
compiler: compiler
});
return desc.customBlocks.reduce((messages, block) => {
if (block.type === 'i18n') {
const obj = JSON.parse(block.content);
if (block.attrs.locale) {
return Object.assign(messages, { [block.attrs.locale]: obj });
}
else {
return Object.assign(messages, obj);
}
}
else {
return messages;
}
}, {});
}
const res = parseTargets('/project1/src', messages);
console.log('extract locale messages', JSON.stringify(res, null, 2));
function add(a, b) {
return a + b;
}
exports.default = add;
1 change: 1 addition & 0 deletions lib/infuser.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"use strict";
1 change: 1 addition & 0 deletions lib/reflector.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"use strict";
1 change: 1 addition & 0 deletions lib/squeezer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"use strict";
6 changes: 0 additions & 6 deletions lib/src/index.js

This file was deleted.

17 changes: 0 additions & 17 deletions lib/test/index.test.js

This file was deleted.

9 changes: 5 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
"bugs": {
"url": "https://github.com/kazupon/vue-i18n-locale-message/issues"
},
"types": "types/index.d.ts",
"files": [
"types",
"lib",
"src"
],
Expand All @@ -34,7 +36,9 @@
"opener": "^1.5.1",
"ts-jest": "^24.0.2",
"typescript": "^3.5.3",
"typescript-eslint-language-service": "^1.1.2"
"typescript-eslint-language-service": "^1.1.2",
"vue": "^2.6.10",
"vue-template-compiler": "^2.6.10"
},
"engines": {
"node": ">= 8"
Expand All @@ -48,9 +52,6 @@
],
"license": "MIT",
"main": "lib/index.js",
"peerDependencies": {
"vue-template-compiler": "*"
},
"private": true,
"repository": {
"type": "git",
Expand Down
10 changes: 8 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
export default function add (a: number, b: number) {
return a + b
import getLocaleMessageMeta from './reflector'
import squeeze from './squeezer'
import infuse from './infuser'

export {
getLocaleMessageMeta,
squeeze,
infuse
}
4 changes: 4 additions & 0 deletions src/infuser.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { LocaleMessages, LocaleMessageMeta } from '../types'

export default function infuse (messages: LocaleMessages, meta: LocaleMessageMeta[]): void {
}
5 changes: 5 additions & 0 deletions src/reflector.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { LocaleMessageMeta } from '../types'

export default function getLocaleMessageMeta (components: string[]): LocaleMessageMeta[] {
return []
}
5 changes: 5 additions & 0 deletions src/squeezer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { LocaleMessageMeta, LocaleMessages } from '../types'

export default function sqeeze (meta: LocaleMessageMeta[]): LocaleMessages {
return {}
}
5 changes: 0 additions & 5 deletions test/index.test.ts

This file was deleted.

4 changes: 4 additions & 0 deletions test/infuser.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import infuse from '../src/infuser'

test('infuse', () => {
})
4 changes: 4 additions & 0 deletions test/reflector.tst.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import getLocaleMessageMeta from '../src/reflector'

test('getLocaleMessageMeta', () => {
})
4 changes: 4 additions & 0 deletions test/squeezer.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import squeeze from '../src/squeezer'

test('squeeze', () => {
})
5 changes: 4 additions & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
/* List of folders to include type definitions from. */
// "typeRoots": [
// "node_modules/@types",
// "node_modules/@vue/component-compiler-utils/dist"
// "node_modules/@vue/component-compiler-utils/dist/index"
// ],
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
Expand All @@ -64,6 +64,9 @@
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
},
"include": [
"src"
],
"plugins": [
{
"name": "typescript-eslint-language-service"
Expand Down
60 changes: 60 additions & 0 deletions types/index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/**
* Locale Message Recursive Structure
* e.g.
* {
* "en": { // 'en' Locale
* "key1": "this is message1", // basic
* "nested": { // nested
* "message1": "this is nested message1"
* },
* "errors": [ // array
* "this is 0 error code message",
* { // object in array
* "internal1": "this is internal 1 error message"
* },
* [ // array in array
* "this is nested array error 1"
* ]
* ]
* },
* "ja": { // 'ja' Locale
* // ...
* }
* }
*/

export type LocaleMessage = string | LocaleMessageObject | LocaleMessageArray
export interface LocaleMessageArray extends Array<LocaleMessage> {}
export interface LocaleMessageObject { [key: string]: LocaleMessage }
export type LocaleMessages = { [key: string]: LocaleMessageObject }

/**
* Locale Message Meta to squeeze / infuse.
* e.g.
* {
* contentPath: '/path/to/project1/src/components/common/Modal.vue',
* content: `
* <i18n>
* {
* "en": {
* "ok": "OK",
* "cancel": "Cancel"
* },
* "ja": {
* "ok": "OK",
* "cancel": "キャンセル"
* }
* }
* </i18n>
* `,
* component: 'Modal',
* messagePath: '/components/common'
* }
*/

export type LocaleMessageMeta = {
contentPath: string
content: string
component: string
messagePath: string
}
11 changes: 8 additions & 3 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4957,9 +4957,9 @@ type-check@~0.3.2:
prelude-ls "~1.1.2"

typescript-eslint-language-service@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/typescript-eslint-language-service/-/typescript-eslint-language-service-1.1.2.tgz#20aaba6543edd7e19429438336f5e9e2bcd9fd18"
integrity sha512-Nai2BJo5G3hBmmmGWSyU/W5fLeU0NLE4CtY7oU2zZCxsVrjOxZJ3fZp75Zutj1uCigYts4xHIUhlFoif4s5/Mw==
version "1.2.3"
resolved "https://registry.yarnpkg.com/typescript-eslint-language-service/-/typescript-eslint-language-service-1.2.3.tgz#33d0e677c89952b568430c9470146bb82ba9258b"
integrity sha512-6n1saBgS3pQIlzCTgvdXnuObg9MSqfbhrodDDydtpXrYoL1Ii/GXq2CL+zj9ykIb5lu7DsZ77BnzcjqjeVyyVw==

typescript@^3.5.3:
version "3.5.3"
Expand Down Expand Up @@ -5096,6 +5096,11 @@ vue-template-es2015-compiler@^1.9.0:
resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825"
integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==

vue@^2.6.10:
version "2.6.10"
resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.10.tgz#a72b1a42a4d82a721ea438d1b6bf55e66195c637"
integrity sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ==

w3c-hr-time@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
Expand Down

0 comments on commit da18426

Please sign in to comment.