Skip to content

Commit 59331bc

Browse files
authored
feat: support external locale messages only options (#262)
1 parent 0fffcfd commit 59331bc

File tree

5 files changed

+44
-24
lines changed

5 files changed

+44
-24
lines changed

src/commands/infuse.ts

+17-8
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ type InfuseOptions = {
3838
match?: string
3939
unbundleTo?: string
4040
unbundleMatch?: string
41+
unbundleOnly?: boolean
4142
namespace?: string
4243
prettier?: string
4344
vue?: number
@@ -78,6 +79,12 @@ export const builder = (args: Argv): Argv<InfuseOptions> => {
7879
alias: 'M',
7980
describe: `option should be accepted regex filename of external locale messages, must be specified if it's directory path of external locale messages with --unbundle-to`
8081
})
82+
.option('unbundleOnly', {
83+
type: 'boolean',
84+
alias: 'U',
85+
default: false,
86+
describe: 'infuse external locales messages only (not unbundle SFC locale messages)'
87+
})
8188
.option('namespace', {
8289
type: 'string',
8390
alias: 'n',
@@ -131,19 +138,21 @@ export const handler = async (args: Arguments<InfuseOptions>) => {
131138
}
132139
debug('namespace dictionary:', nsDictionary)
133140

134-
const sources = readSFC(targetPath, ig)
141+
const sources = !args.unbundleOnly ? readSFC(targetPath, ig) : []
135142
const messages = readLocaleMessages(messagesPath, args.match)
136143

137-
const { sfc, external } = splitLocaleMessages(messages, nsDictionary, args.unbundleTo, args.unbundleMatch)
138-
VERBOSE && debug('sfc', sfc)
144+
const { main, external } = splitLocaleMessages(messages, nsDictionary, args.unbundleTo, args.unbundleMatch)
145+
VERBOSE && debug('main', main)
139146
VERBOSE && debug('external', external)
140147

141-
const meta = squeeze(targetPath, sources)
142-
apply(sfc, meta)
143-
const newSources = infuse(targetPath, sources, meta)
148+
if (!args.unbundleOnly) {
149+
const meta = squeeze(targetPath, sources)
150+
apply(main, meta)
151+
const newSources = infuse(targetPath, sources, meta)
144152

145-
if (!args.dryRun) {
146-
writeSFC(newSources, format, prettierConfig, vue)
153+
if (!args.dryRun) {
154+
writeSFC(newSources, format, prettierConfig, vue)
155+
}
147156
}
148157

149158
if (!args.dryRun && external) {

src/commands/squeeze.ts

+13-2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type SqueezeOptions = {
2727
split?: boolean
2828
bundleWith?: string
2929
bundleMatch?: string
30+
bundleOnly?: boolean
3031
namespace?: string
3132
output: string
3233
ignoreFileName?: string
@@ -62,6 +63,12 @@ export const builder = (args: Argv): Argv<SqueezeOptions> => {
6263
alias: 'm',
6364
describe: `option should be accepted regex filename of external locale messages, must be specified if it's directory path of external locale messages with --with-bundle`
6465
})
66+
.option('bundleOnly', {
67+
type: 'boolean',
68+
alias: 'B',
69+
default: false,
70+
describe: 'squeeze external locales messages only (not bundle SFC locale messages)'
71+
})
6572
.option('namespace', {
6673
type: 'string',
6774
alias: 'n',
@@ -105,9 +112,13 @@ export const handler = async (args: Arguments<SqueezeOptions>) => {
105112
console.warn('cannot load external locale messages failed')
106113
}
107114

108-
const meta = squeeze(targetPath, readSFC(targetPath, ig))
109-
const messages = deepmerge(generate(meta), externalMessages)
115+
let sfcMessages = {} as LocaleMessages
116+
if (!args.bundleOnly) {
117+
const meta = squeeze(targetPath, readSFC(targetPath, ig))
118+
sfcMessages = generate(meta)
119+
}
110120

121+
const messages = deepmerge(sfcMessages, externalMessages)
111122
writeLocaleMessages(messages, args)
112123
}
113124

src/utils.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ export function splitLocaleMessages (
412412
bundle?: string,
413413
bundleMatch?: string
414414
) {
415-
if (!bundle) { return { sfc: messages } }
415+
if (!bundle) { return { main: messages } }
416416

417417
const bundleTargetPaths = bundle.split(',').filter(p => p)
418418
const externalExists = bundleTargetPaths.reduce((info, targetPath) => {
@@ -480,7 +480,7 @@ export function splitLocaleMessages (
480480
debug('splitLocaleMessages: messages (after):', messages)
481481
debug('splitLocaleMessages: metaExternalLocaleMessages:', metaExternalLocaleMessages)
482482

483-
return { sfc: messages, external: metaExternalLocaleMessages }
483+
return { main: messages, external: metaExternalLocaleMessages }
484484
}
485485

486486
export function getIgnore (target:string, ignoreFileNames: string, ignoreMultipleMode = false): Ignore {

test/commands/infuse.test.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ test('absolute path', async () => {
8484
const mockUtils = utils as jest.Mocked<typeof utils>
8585
mockUtils.resolve.mockImplementation((...paths) => paths[0])
8686
mockUtils.loadNamespaceDictionary.mockImplementation(async () => ({}))
87-
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ sfc: messages }))
87+
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ main: messages }))
8888
const writeFiles = {}
8989
const mockFS = fs as jest.Mocked<typeof fs>
9090
mockFS.readFileSync.mockImplementation(path => {
@@ -120,7 +120,7 @@ test('relative path', async () => {
120120
.mockImplementationOnce(() => `${TARGET_PATH}/src`)
121121
.mockImplementationOnce((...paths) => `${TARGET_PATH}/${paths[0]}`)
122122
mockUtils.loadNamespaceDictionary.mockImplementation(async () => ({}))
123-
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ sfc: messages }))
123+
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ main: messages }))
124124
const writeFiles = {}
125125
const mockFS = fs as jest.Mocked<typeof fs>
126126
mockFS.readFileSync.mockImplementation(path => {
@@ -156,7 +156,7 @@ test('dryRun option', async () => {
156156
.mockImplementationOnce(() => `${TARGET_PATH}/src`)
157157
.mockImplementationOnce((...paths) => `${TARGET_PATH}/${paths[0]}`)
158158
mockUtils.loadNamespaceDictionary.mockImplementation(async () => ({}))
159-
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ sfc: messages }))
159+
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ main: messages }))
160160
const mockFS = fs as jest.Mocked<typeof fs>
161161
mockFS.readFileSync.mockImplementation(path => {
162162
if (MOCK_FILES[path as string]) {
@@ -186,7 +186,7 @@ test('match option', async () => {
186186
.mockImplementationOnce(() => `${TARGET_PATH}/src`)
187187
.mockImplementationOnce((...paths) => `${TARGET_PATH}/${paths[0]}`)
188188
mockUtils.loadNamespaceDictionary.mockImplementation(async () => ({}))
189-
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ sfc: messages }))
189+
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ main: messages }))
190190
const writeFiles = {}
191191
const mockFS = fs as jest.Mocked<typeof fs>
192192
mockFS.readFileSync.mockImplementation(p => {
@@ -226,7 +226,7 @@ test('bundle option', async () => {
226226
'./test/fixtures/packages/package2/locales/**/*.json': 'package2'
227227
}))
228228
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({
229-
sfc: deepmerge(messages, external),
229+
main: deepmerge(messages, external),
230230
external: [{
231231
path: './test/fixtures/packages/package1/locales/en/common.json',
232232
messages: {
@@ -285,7 +285,7 @@ test('ignore option', async () => {
285285
const mockUtils = utils as jest.Mocked<typeof utils>
286286
mockUtils.resolve.mockImplementation((...paths) => paths[0])
287287
mockUtils.loadNamespaceDictionary.mockImplementation(async () => ({}))
288-
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ sfc: messages }))
288+
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ main: messages }))
289289
const writeFiles = {}
290290
const mockFS = fs as jest.Mocked<typeof fs>
291291
mockFS.readFileSync.mockImplementation(path => {

test/utils.test.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,9 @@ test('splitLocaleMessages: basic usage', async () => {
111111
}
112112
const unbundleTo = './test/fixtures/packages/package1/locales/**/*.json,./test/fixtures/packages/package2/locales/**/*.json'
113113
const unbundleMatch = '.*/([\\w]{2})/([\\w]*)\\.json$'
114-
const { sfc, external } = splitLocaleMessages(messages, namespaces, unbundleTo, unbundleMatch)
114+
const { main, external } = splitLocaleMessages(messages, namespaces, unbundleTo, unbundleMatch)
115115

116-
expect(sfc).toEqual(messages)
116+
expect(main).toEqual(messages)
117117
external.forEach(ex => {
118118
expect(ex.messages).toMatchSnapshot()
119119
})
@@ -125,18 +125,18 @@ test('splitLocaleMessages: no bundle option', async () => {
125125
'./test/fixtures/packages/package1/locales/**/*.json': 'package1',
126126
'./test/fixtures/packages/package2/locales/**/*.json': 'package2'
127127
}
128-
const { sfc, external } = splitLocaleMessages(messages, namespaces)
128+
const { main, external } = splitLocaleMessages(messages, namespaces)
129129

130-
expect(sfc).toEqual(messages)
130+
expect(main).toEqual(messages)
131131
expect(external).toBeUndefined()
132132
})
133133

134134
test('splitLocaleMessages: no namespace', async () => {
135135
const messages = deepmerge(squeezeLocaleMessages, externalLocaleMessages)
136136
const namespaces: NamespaceDictionary = {}
137-
const { sfc, external } = splitLocaleMessages(messages, namespaces)
137+
const { main, external } = splitLocaleMessages(messages, namespaces)
138138

139-
expect(sfc).toEqual(messages)
139+
expect(main).toEqual(messages)
140140
expect(external).toBeUndefined()
141141
})
142142

0 commit comments

Comments
 (0)