Skip to content

Commit

Permalink
feat: support external locale messages only options
Browse files Browse the repository at this point in the history
  • Loading branch information
kazupon committed May 25, 2023
1 parent 0fffcfd commit 2a3fc18
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 24 deletions.
25 changes: 17 additions & 8 deletions src/commands/infuse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ type InfuseOptions = {
match?: string
unbundleTo?: string
unbundleMatch?: string
unbundleOnly?: boolean
namespace?: string
prettier?: string
vue?: number
Expand Down Expand Up @@ -78,6 +79,12 @@ export const builder = (args: Argv): Argv<InfuseOptions> => {
alias: 'M',
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`
})
.option('unbundleOnly', {
type: 'boolean',
alias: 'U',
default: false,
describe: 'infuse external locales messages only (not unbundle SFC locale messages)'
})
.option('namespace', {
type: 'string',
alias: 'n',
Expand Down Expand Up @@ -131,19 +138,21 @@ export const handler = async (args: Arguments<InfuseOptions>) => {
}
debug('namespace dictionary:', nsDictionary)

const sources = readSFC(targetPath, ig)
const sources = !args.unbundleOnly ? readSFC(targetPath, ig) : []
const messages = readLocaleMessages(messagesPath, args.match)

const { sfc, external } = splitLocaleMessages(messages, nsDictionary, args.unbundleTo, args.unbundleMatch)
VERBOSE && debug('sfc', sfc)
const { main, external } = splitLocaleMessages(messages, nsDictionary, args.unbundleTo, args.unbundleMatch)
VERBOSE && debug('main', main)
VERBOSE && debug('external', external)

const meta = squeeze(targetPath, sources)
apply(sfc, meta)
const newSources = infuse(targetPath, sources, meta)
if (!args.unbundleOnly) {
const meta = squeeze(targetPath, sources)
apply(main, meta)
const newSources = infuse(targetPath, sources, meta)

if (!args.dryRun) {
writeSFC(newSources, format, prettierConfig, vue)
if (!args.dryRun) {
writeSFC(newSources, format, prettierConfig, vue)
}
}

if (!args.dryRun && external) {
Expand Down
15 changes: 13 additions & 2 deletions src/commands/squeeze.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ type SqueezeOptions = {
split?: boolean
bundleWith?: string
bundleMatch?: string
bundleOnly?: boolean
namespace?: string
output: string
ignoreFileName?: string
Expand Down Expand Up @@ -62,6 +63,12 @@ export const builder = (args: Argv): Argv<SqueezeOptions> => {
alias: 'm',
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`
})
.option('bundleOnly', {
type: 'boolean',
alias: 'B',
default: false,
describe: 'squeeze external locales messages only (not bundle SFC locale messages)'
})
.option('namespace', {
type: 'string',
alias: 'n',
Expand Down Expand Up @@ -105,9 +112,13 @@ export const handler = async (args: Arguments<SqueezeOptions>) => {
console.warn('cannot load external locale messages failed')
}

const meta = squeeze(targetPath, readSFC(targetPath, ig))
const messages = deepmerge(generate(meta), externalMessages)
let sfcMessages = {} as LocaleMessages
if (!args.bundleOnly) {
const meta = squeeze(targetPath, readSFC(targetPath, ig))
sfcMessages = generate(meta)
}

const messages = deepmerge(sfcMessages, externalMessages)
writeLocaleMessages(messages, args)
}

Expand Down
4 changes: 2 additions & 2 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -412,7 +412,7 @@ export function splitLocaleMessages (
bundle?: string,
bundleMatch?: string
) {
if (!bundle) { return { sfc: messages } }
if (!bundle) { return { main: messages } }

const bundleTargetPaths = bundle.split(',').filter(p => p)
const externalExists = bundleTargetPaths.reduce((info, targetPath) => {
Expand Down Expand Up @@ -480,7 +480,7 @@ export function splitLocaleMessages (
debug('splitLocaleMessages: messages (after):', messages)
debug('splitLocaleMessages: metaExternalLocaleMessages:', metaExternalLocaleMessages)

return { sfc: messages, external: metaExternalLocaleMessages }
return { main: messages, external: metaExternalLocaleMessages }
}

export function getIgnore (target:string, ignoreFileNames: string, ignoreMultipleMode = false): Ignore {
Expand Down
12 changes: 6 additions & 6 deletions test/commands/infuse.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ test('absolute path', async () => {
const mockUtils = utils as jest.Mocked<typeof utils>
mockUtils.resolve.mockImplementation((...paths) => paths[0])
mockUtils.loadNamespaceDictionary.mockImplementation(async () => ({}))
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ sfc: messages }))
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ main: messages }))
const writeFiles = {}
const mockFS = fs as jest.Mocked<typeof fs>
mockFS.readFileSync.mockImplementation(path => {
Expand Down Expand Up @@ -120,7 +120,7 @@ test('relative path', async () => {
.mockImplementationOnce(() => `${TARGET_PATH}/src`)
.mockImplementationOnce((...paths) => `${TARGET_PATH}/${paths[0]}`)
mockUtils.loadNamespaceDictionary.mockImplementation(async () => ({}))
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ sfc: messages }))
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ main: messages }))
const writeFiles = {}
const mockFS = fs as jest.Mocked<typeof fs>
mockFS.readFileSync.mockImplementation(path => {
Expand Down Expand Up @@ -156,7 +156,7 @@ test('dryRun option', async () => {
.mockImplementationOnce(() => `${TARGET_PATH}/src`)
.mockImplementationOnce((...paths) => `${TARGET_PATH}/${paths[0]}`)
mockUtils.loadNamespaceDictionary.mockImplementation(async () => ({}))
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ sfc: messages }))
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ main: messages }))
const mockFS = fs as jest.Mocked<typeof fs>
mockFS.readFileSync.mockImplementation(path => {
if (MOCK_FILES[path as string]) {
Expand Down Expand Up @@ -186,7 +186,7 @@ test('match option', async () => {
.mockImplementationOnce(() => `${TARGET_PATH}/src`)
.mockImplementationOnce((...paths) => `${TARGET_PATH}/${paths[0]}`)
mockUtils.loadNamespaceDictionary.mockImplementation(async () => ({}))
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ sfc: messages }))
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ main: messages }))
const writeFiles = {}
const mockFS = fs as jest.Mocked<typeof fs>
mockFS.readFileSync.mockImplementation(p => {
Expand Down Expand Up @@ -226,7 +226,7 @@ test('bundle option', async () => {
'./test/fixtures/packages/package2/locales/**/*.json': 'package2'
}))
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({
sfc: deepmerge(messages, external),
main: deepmerge(messages, external),
external: [{
path: './test/fixtures/packages/package1/locales/en/common.json',
messages: {
Expand Down Expand Up @@ -285,7 +285,7 @@ test('ignore option', async () => {
const mockUtils = utils as jest.Mocked<typeof utils>
mockUtils.resolve.mockImplementation((...paths) => paths[0])
mockUtils.loadNamespaceDictionary.mockImplementation(async () => ({}))
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ sfc: messages }))
mockUtils.splitLocaleMessages.mockImplementation((messages) => ({ main: messages }))
const writeFiles = {}
const mockFS = fs as jest.Mocked<typeof fs>
mockFS.readFileSync.mockImplementation(path => {
Expand Down
12 changes: 6 additions & 6 deletions test/utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,9 @@ test('splitLocaleMessages: basic usage', async () => {
}
const unbundleTo = './test/fixtures/packages/package1/locales/**/*.json,./test/fixtures/packages/package2/locales/**/*.json'
const unbundleMatch = '.*/([\\w]{2})/([\\w]*)\\.json$'
const { sfc, external } = splitLocaleMessages(messages, namespaces, unbundleTo, unbundleMatch)
const { main, external } = splitLocaleMessages(messages, namespaces, unbundleTo, unbundleMatch)

expect(sfc).toEqual(messages)
expect(main).toEqual(messages)
external.forEach(ex => {
expect(ex.messages).toMatchSnapshot()
})
Expand All @@ -125,18 +125,18 @@ test('splitLocaleMessages: no bundle option', async () => {
'./test/fixtures/packages/package1/locales/**/*.json': 'package1',
'./test/fixtures/packages/package2/locales/**/*.json': 'package2'
}
const { sfc, external } = splitLocaleMessages(messages, namespaces)
const { main, external } = splitLocaleMessages(messages, namespaces)

expect(sfc).toEqual(messages)
expect(main).toEqual(messages)
expect(external).toBeUndefined()
})

test('splitLocaleMessages: no namespace', async () => {
const messages = deepmerge(squeezeLocaleMessages, externalLocaleMessages)
const namespaces: NamespaceDictionary = {}
const { sfc, external } = splitLocaleMessages(messages, namespaces)
const { main, external } = splitLocaleMessages(messages, namespaces)

expect(sfc).toEqual(messages)
expect(main).toEqual(messages)
expect(external).toBeUndefined()
})

Expand Down

0 comments on commit 2a3fc18

Please sign in to comment.