Skip to content

Commit 891cbbd

Browse files
committed
👕 refactor: more refactoring
1 parent 266b424 commit 891cbbd

File tree

11 files changed

+426
-161
lines changed

11 files changed

+426
-161
lines changed

src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import getLocaleMessageMeta from './reflector'
1+
import reflectSFCDescriptor from './reflector'
22
import squeeze from './squeezer'
33
import infuse from './infuser'
44

55
export {
6-
getLocaleMessageMeta,
6+
reflectSFCDescriptor,
77
squeeze,
88
infuse
99
}

src/reflector.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { LocaleMessageMeta, SFCFileInfo } from '../types'
1+
import { SFCDescriptor } from 'vue-template-compiler'
2+
import { SFCFileInfo } from '../types'
23
import { VueTemplateCompiler } from '@vue/component-compiler-utils/dist/types'
34

45
import { parse } from '@vue/component-compiler-utils'
@@ -8,14 +9,21 @@ import path from 'path'
89
import { debug as Debug } from 'debug'
910
const debug = Debug('vue-i18n-locale-message:reflector')
1011

11-
export default function reflectLocaleMessageMeta (basePath: string, components: SFCFileInfo[]): LocaleMessageMeta[] {
12+
export default function reflectSFCDescriptor (basePath: string, components: SFCFileInfo[]): SFCDescriptor[] {
1213
return components.map(target => {
13-
const { customBlocks } = parse({
14+
const { template, script, styles, customBlocks } = parse({
1415
source: target.content,
1516
filename: target.path,
1617
compiler: compiler as VueTemplateCompiler
17-
})
18-
return { ...parsePath(basePath, target.path), blocks: customBlocks }
18+
}) as SFCDescriptor
19+
return {
20+
...parsePath(basePath, target.path),
21+
raw: target.content,
22+
customBlocks,
23+
template,
24+
script,
25+
styles
26+
}
1927
})
2028
}
2129

src/squeezer.ts

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
import { LocaleMessageMeta, LocaleMessages } from '../types'
2-
import { SFCCustomBlock } from '@vue/component-compiler-utils'
3-
4-
import JSON5 from 'json5'
5-
import yaml from 'js-yaml'
1+
import { SFCDescriptor, SFCBlock } from 'vue-template-compiler'
2+
import { LocaleMessages } from '../types'
3+
import { parseContent } from './utils'
64

75
import { debug as Debug } from 'debug'
86
const debug = Debug('vue-i18n-locale-message:squeezer')
97

10-
export default function sqeeze (meta: LocaleMessageMeta[]): LocaleMessages {
8+
export default function sqeeze (meta: SFCDescriptor[]): LocaleMessages {
119
const messages: LocaleMessages = {}
1210

1311
meta.forEach(target => {
14-
const blockMessages = squeezeFromI18nBlock(target.blocks)
12+
const blockMessages = squeezeFromI18nBlock(target.customBlocks)
1513
const locales = Object.keys(blockMessages)
1614
const collects: LocaleMessages = locales.reduce((messages, locale) => {
1715
const ret = target.hierarchy.reduce((messages, key) => {
@@ -30,7 +28,7 @@ export default function sqeeze (meta: LocaleMessageMeta[]): LocaleMessages {
3028
return messages
3129
}
3230

33-
function squeezeFromI18nBlock (blocks: SFCCustomBlock[]): LocaleMessages {
31+
function squeezeFromI18nBlock (blocks: SFCBlock[]): LocaleMessages {
3432
return blocks.reduce((messages, block) => {
3533
debug('i18n block attrs', block.attrs)
3634

@@ -50,16 +48,3 @@ function squeezeFromI18nBlock (blocks: SFCCustomBlock[]): LocaleMessages {
5048
}
5149
}, {})
5250
}
53-
54-
function parseContent (content: string, lang: string): any {
55-
switch (lang) {
56-
case 'yaml':
57-
case 'yml':
58-
return yaml.safeLoad(content)
59-
case 'json5':
60-
return JSON5.parse(content)
61-
case 'json':
62-
default:
63-
return JSON.parse(content)
64-
}
65-
}

src/utils.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import JSON5 from 'json5'
2+
import yaml from 'js-yaml'
3+
4+
export function parseContent (content: string, lang: string): any {
5+
switch (lang) {
6+
case 'yaml':
7+
case 'yml':
8+
return yaml.safeLoad(content)
9+
case 'json5':
10+
return JSON5.parse(content)
11+
case 'json':
12+
default:
13+
return JSON.parse(content)
14+
}
15+
}
16+
17+
export function stringfyContent (content: any, lang: string): string {
18+
switch (lang) {
19+
case 'yaml':
20+
case 'yml':
21+
return yaml.safeDump(content)
22+
case 'json5':
23+
return JSON5.stringify(content, null, 2)
24+
case 'json':
25+
default:
26+
return JSON.stringify(content, null, 2)
27+
}
28+
}

test/fixtures/format/json.ts

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
export default [{
2+
raw: `
3+
<template>
4+
<p>template</p>
5+
</template>
6+
7+
<script>
8+
export default {}
9+
</script>
10+
11+
<i18n>
12+
{
13+
"en": { "title": "Application" },
14+
"ja": { "title": "アプリケーション" }
15+
}
16+
</i18n>
17+
`,
18+
template: {
19+
type: 'template',
20+
content: `<p>template</p>`,
21+
attrs: {}
22+
},
23+
script: {
24+
type: 'script',
25+
content: `export default {}`,
26+
attrs: {}
27+
},
28+
styles: [],
29+
customBlocks: [{
30+
type: 'i18n',
31+
content: `
32+
{
33+
"en": { "title": "Application" },
34+
"ja": { "title": "アプリケーション" }
35+
}
36+
`,
37+
attrs: {}
38+
}],
39+
contentPath: '/path/to/project1/src/App.vue',
40+
component: 'App',
41+
hierarchy: ['App']
42+
}, {
43+
raw: `
44+
<template>
45+
<p>template</p>
46+
</template>
47+
48+
<script>
49+
export default {}
50+
</script>
51+
52+
<i18n locale="en">
53+
{
54+
"ok": "OK",
55+
"cancel": "Cancel"
56+
}
57+
</i18n>
58+
59+
<i18n locale="ja">
60+
{
61+
"ok": "OK",
62+
"cancel": "キャンセル"
63+
}
64+
</i18n>
65+
`,
66+
template: {
67+
type: 'template',
68+
content: `<p>template</p>`,
69+
attrs: {}
70+
},
71+
script: {
72+
type: 'script',
73+
content: `export default {}`
74+
},
75+
styles: [],
76+
customBlocks: [{
77+
type: 'i18n',
78+
content: `
79+
{
80+
"ok": "OK",
81+
"cancel": "Cancel"
82+
}
83+
`,
84+
attrs: { locale: 'en' }
85+
}, {
86+
type: 'i18n',
87+
content: `
88+
{
89+
"ok": "OK",
90+
"cancel": "キャンセル"
91+
}
92+
`,
93+
attrs: { locale: 'ja' }
94+
}],
95+
contentPath: '/path/to/project1/src/components/Modal.vue',
96+
component: 'Modal',
97+
hierarchy: ['components', 'Modal']
98+
}, {
99+
raw: `
100+
<template>
101+
<p>template</p>
102+
</template>
103+
104+
<script>
105+
export default {}
106+
</script>
107+
108+
<i18n locale="en">
109+
{
110+
"headers": {
111+
"rank": "Rank",
112+
"name": "Name",
113+
"score": "Score"
114+
}
115+
}
116+
</i18n>
117+
`,
118+
template: {
119+
type: 'template',
120+
content: `<p>template</p>`,
121+
attrs: {}
122+
},
123+
script: {
124+
type: 'script',
125+
content: `export default {}`,
126+
attrs: {}
127+
},
128+
styles: [],
129+
customBlocks: [{
130+
type: 'i18n',
131+
content: `
132+
{
133+
"headers": {
134+
"rank": "Rank",
135+
"name": "Name",
136+
"score": "Score"
137+
}
138+
}
139+
`,
140+
attrs: { locale: 'en' }
141+
}],
142+
contentPath: '/path/to/project1/src/components/nest/RankingTable.vue',
143+
component: 'RankingTable',
144+
hierarchy: ['components', 'nest', 'RankingTable']
145+
}, {
146+
raw: `
147+
<template>
148+
<p>template</p>
149+
</template>
150+
151+
<script>
152+
export default {}
153+
</script>
154+
155+
<i18n>
156+
{
157+
"ja": {
158+
"id": "ユーザーID",
159+
"passowrd": "パスワード",
160+
"confirm": "パスワードの確認入力",
161+
"button": "ログイン"
162+
}
163+
}
164+
</i18n>
165+
`,
166+
template: {
167+
type: 'template',
168+
content: `<p>template</p>`,
169+
attrs: {}
170+
},
171+
script: {
172+
type: 'script',
173+
content: `export default {}`,
174+
attrs: {}
175+
},
176+
styles: [],
177+
customBlocks: [{
178+
type: 'i18n',
179+
content: `
180+
{
181+
"ja": {
182+
"id": "ユーザーID",
183+
"passowrd": "パスワード",
184+
"confirm": "パスワードの確認入力",
185+
"button": "ログイン"
186+
}
187+
}
188+
`,
189+
attrs: {}
190+
}],
191+
contentPath: '/path/to/project1/src/pages/Login.vue',
192+
compnent: 'Login',
193+
hierarchy: ['pages', 'Login']
194+
}]

test/fixtures/format/json5.ts

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,40 @@
11
export default [{
2-
contentPath: '/path/to/project1/src/components/Modal.vue',
3-
blocks: [{
2+
raw: `
3+
<template>
4+
<p>template</p>
5+
</template>
6+
7+
<script>
8+
export default {}
9+
</script>
10+
11+
<i18n lang="json5" locale="en">
12+
{
13+
// modal contents
14+
"ok": "OK",
15+
cancel: "Cancel"
16+
}
17+
</i18n>
18+
19+
<i18n locale="ja">
20+
{
21+
"ok": "OK",
22+
"cancel": "キャンセル"
23+
}
24+
</i18n>
25+
`,
26+
template: {
27+
type: 'template',
28+
content: `<p>template</p>`,
29+
attrs: {}
30+
},
31+
script: {
32+
type: 'script',
33+
content: `export default {}`,
34+
attrs: {}
35+
},
36+
styles: [],
37+
customBlocks: [{
438
type: 'i18n',
539
content: `
640
{
@@ -20,6 +54,7 @@ export default [{
2054
`,
2155
attrs: { locale: 'ja' }
2256
}],
57+
contentPath: '/path/to/project1/src/components/Modal.vue',
2358
component: 'Modal',
2459
hierarchy: ['components', 'Modal']
2560
}]

0 commit comments

Comments
 (0)