Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/bundle-utils/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
"@intlify/message-compiler": "next",
"@intlify/shared": "catalog:intlify",
"acorn": "^8.8.2",
"esbuild": "^0.25.1",
"escodegen": "^2.1.0",
"estree-walker": "^2.0.2",
"jsonc-eslint-parser": "^2.3.0",
"oxc-transform": "^0.95.0",
"source-map-js": "^1.0.1",
"yaml-eslint-parser": "^1.2.2"
},
Expand Down
18 changes: 8 additions & 10 deletions packages/bundle-utils/src/ts.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,29 @@
/**
* Code generator for i18n ts resource
*
* An async wrapper for the js generator which transforms ts to js before generating
* A wrapper for the js generator which transforms ts to js before generating
*/

import { transform } from 'esbuild'
import { Node } from 'estree'
import { transform } from 'oxc-transform'
import { CodeGenOptions, CodeGenResult } from './codegen'
import { DEFAULT_OPTIONS, generate as generateJavaScript } from './js'

/**
* @internal
*/
export async function generate(
export function generate(
targetSource: string | Buffer,
options: CodeGenOptions
): Promise<CodeGenResult<Node>> {
): CodeGenResult<Node> {
let value = Buffer.isBuffer(targetSource) ? targetSource.toString() : targetSource

const _options = Object.assign({}, DEFAULT_OPTIONS, options, { source: value })
if (_options.filename && /.[c|m]?ts$/.test(_options.filename)) {
const transformed = await transform(value, { loader: 'ts' })

if (transformed && transformed.code) {
value = transformed.code
_options.source = transformed.code
}
const transformed = transform(_options.filename ?? '', value, { lang: 'ts' })
if (transformed && transformed.code) {
value = transformed.code
_options.source = transformed.code
}

return generateJavaScript(value, _options)
Expand Down
9 changes: 9 additions & 0 deletions packages/bundle-utils/test/fixtures/codegen/simple.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export default {
hi: 'hi there!',
hello: 'hello world!' as string,
named: `hi, {name} !` as string,
list: 'hi, {0} !' as string,
literal: "hi, { 'kazupon' } !" as string,
linked: 'hi, @:name !' as string,
plural: "@.caml:{'no apples'} | {0} apple | {n} apples"
} as Record<string, string>
24 changes: 24 additions & 0 deletions packages/bundle-utils/test/generator/ts.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { generate } from '../../src/ts'
import { readFile, validateSyntax } from '../utils'

test('simple', async () => {
const { source } = await readFile('./fixtures/codegen/simple.ts')
const { code } = await generate(source, {
sourceMap: true,
env: 'development'
})

expect(validateSyntax(code)).toBe(true)
expect(code).toMatchInlineSnapshot(`
"const resource = {
"hi": (()=>{const fn=(ctx) => {const { normalize: _normalize } = ctx;return _normalize(["hi there!"])};fn.source="hi there!";return fn;})(),
"hello": (()=>{const fn=(ctx) => {const { normalize: _normalize } = ctx;return _normalize(["hello world!"])};fn.source="hello world!";return fn;})(),
"named": (()=>{const fn=(ctx) => {const { normalize: _normalize, interpolate: _interpolate, named: _named } = ctx;return _normalize(["hi, ", _interpolate(_named("name")), " !"])};fn.source="hi, {name} !";return fn;})(),
"list": (()=>{const fn=(ctx) => {const { normalize: _normalize, interpolate: _interpolate, list: _list } = ctx;return _normalize(["hi, ", _interpolate(_list(0)), " !"])};fn.source="hi, {0} !";return fn;})(),
"literal": (()=>{const fn=(ctx) => {const { normalize: _normalize } = ctx;return _normalize(["hi, ", "kazupon", " !"])};fn.source="hi, { 'kazupon' } !";return fn;})(),
"linked": (()=>{const fn=(ctx) => {const { normalize: _normalize, linked: _linked, type: _type } = ctx;return _normalize(["hi, ", _linked("name", undefined, _type), " !"])};fn.source="hi, @:name !";return fn;})(),
"plural": (()=>{const fn=(ctx) => {const { normalize: _normalize, linked: _linked, type: _type, interpolate: _interpolate, list: _list, named: _named, plural: _plural } = ctx;return _plural([_normalize([_linked("no apples", "caml", _type)]), _normalize([_interpolate(_list(0)), " apple"]), _normalize([_interpolate(_named("n")), " apples"])])};fn.source="@.caml:{'no apples'} | {0} apple | {n} apples";return fn;})()
}
export default resource"
`)
})
9 changes: 3 additions & 6 deletions packages/unplugin-vue-i18n/src/core/resource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ export function resourcePlugin(opts: ResolvedOptions, meta: UnpluginContextMeta)
debug('parseOptions', parseOptions)

try {
const { code: generatedCode, map } = await generate(code, parseOptions)
const { code: generatedCode, map } = generate(code, parseOptions)

debug('generated code', generatedCode)
debug('sourcemap', map, ctx.sourceMap)
Expand Down Expand Up @@ -328,7 +328,7 @@ export function resourcePlugin(opts: ResolvedOptions, meta: UnpluginContextMeta)
}

const generate = getGenerator(langInfo, generateYAML)
const { code: generatedCode, map } = await generate(source, parseOptions)
const { code: generatedCode, map } = generate(source, parseOptions)
debug('generated code', generatedCode)
debug('sourcemap', map, ctx.sourceMap)

Expand All @@ -339,10 +339,7 @@ export function resourcePlugin(opts: ResolvedOptions, meta: UnpluginContextMeta)
}
} as UnpluginOptions
}
type GeneratorLike = (
source: string | Buffer,
options: CodeGenOptions
) => Promise<CodeGenResult<unknown>> | CodeGenResult<unknown>
type GeneratorLike = (source: string | Buffer, options: CodeGenOptions) => CodeGenResult<unknown>
function getGenerator(ext: string, fallback: GeneratorLike = generateJSON) {
if (/\.?json5?$/.test(ext)) {
return generateJSON
Expand Down
Loading
Loading