Skip to content

Commit 7c7821c

Browse files
authored
feat!: use oxc-transform and synchronous ts generator (#525)
* feat!: use `oxc-transform` and synchronous ts generator * test: remove redundant await
1 parent da45971 commit 7c7821c

File tree

6 files changed

+213
-188
lines changed

6 files changed

+213
-188
lines changed

packages/bundle-utils/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121
"@intlify/message-compiler": "next",
2222
"@intlify/shared": "catalog:intlify",
2323
"acorn": "^8.8.2",
24-
"esbuild": "^0.25.1",
2524
"escodegen": "^2.1.0",
2625
"estree-walker": "^2.0.2",
2726
"jsonc-eslint-parser": "^2.3.0",
27+
"oxc-transform": "^0.95.0",
2828
"source-map-js": "^1.0.1",
2929
"yaml-eslint-parser": "^1.2.2"
3030
},

packages/bundle-utils/src/ts.ts

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,29 @@
11
/**
22
* Code generator for i18n ts resource
33
*
4-
* An async wrapper for the js generator which transforms ts to js before generating
4+
* A wrapper for the js generator which transforms ts to js before generating
55
*/
66

7-
import { transform } from 'esbuild'
87
import { Node } from 'estree'
8+
import { transform } from 'oxc-transform'
99
import { CodeGenOptions, CodeGenResult } from './codegen'
1010
import { DEFAULT_OPTIONS, generate as generateJavaScript } from './js'
1111

1212
/**
1313
* @internal
1414
*/
15-
export async function generate(
15+
export function generate(
1616
targetSource: string | Buffer,
1717
options: CodeGenOptions
18-
): Promise<CodeGenResult<Node>> {
18+
): CodeGenResult<Node> {
1919
let value = Buffer.isBuffer(targetSource) ? targetSource.toString() : targetSource
2020

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

25-
if (transformed && transformed.code) {
26-
value = transformed.code
27-
_options.source = transformed.code
28-
}
23+
const transformed = transform(_options.filename ?? '', value, { lang: 'ts' })
24+
if (transformed && transformed.code) {
25+
value = transformed.code
26+
_options.source = transformed.code
2927
}
3028

3129
return generateJavaScript(value, _options)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export default {
2+
hi: 'hi there!',
3+
hello: 'hello world!' as string,
4+
named: `hi, {name} !` as string,
5+
list: 'hi, {0} !' as string,
6+
literal: "hi, { 'kazupon' } !" as string,
7+
linked: 'hi, @:name !' as string,
8+
plural: "@.caml:{'no apples'} | {0} apple | {n} apples"
9+
} as Record<string, string>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { generate } from '../../src/ts'
2+
import { readFile, validateSyntax } from '../utils'
3+
4+
test('simple', async () => {
5+
const { source } = await readFile('./fixtures/codegen/simple.ts')
6+
const { code } = generate(source, {
7+
sourceMap: true,
8+
env: 'development'
9+
})
10+
11+
expect(validateSyntax(code)).toBe(true)
12+
expect(code).toMatchInlineSnapshot(`
13+
"const resource = {
14+
"hi": (()=>{const fn=(ctx) => {const { normalize: _normalize } = ctx;return _normalize(["hi there!"])};fn.source="hi there!";return fn;})(),
15+
"hello": (()=>{const fn=(ctx) => {const { normalize: _normalize } = ctx;return _normalize(["hello world!"])};fn.source="hello world!";return fn;})(),
16+
"named": (()=>{const fn=(ctx) => {const { normalize: _normalize, interpolate: _interpolate, named: _named } = ctx;return _normalize(["hi, ", _interpolate(_named("name")), " !"])};fn.source="hi, {name} !";return fn;})(),
17+
"list": (()=>{const fn=(ctx) => {const { normalize: _normalize, interpolate: _interpolate, list: _list } = ctx;return _normalize(["hi, ", _interpolate(_list(0)), " !"])};fn.source="hi, {0} !";return fn;})(),
18+
"literal": (()=>{const fn=(ctx) => {const { normalize: _normalize } = ctx;return _normalize(["hi, ", "kazupon", " !"])};fn.source="hi, { 'kazupon' } !";return fn;})(),
19+
"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;})(),
20+
"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;})()
21+
}
22+
export default resource"
23+
`)
24+
})

packages/unplugin-vue-i18n/src/core/resource.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ export function resourcePlugin(opts: ResolvedOptions, meta: UnpluginContextMeta)
279279
debug('parseOptions', parseOptions)
280280

281281
try {
282-
const { code: generatedCode, map } = await generate(code, parseOptions)
282+
const { code: generatedCode, map } = generate(code, parseOptions)
283283

284284
debug('generated code', generatedCode)
285285
debug('sourcemap', map, ctx.sourceMap)
@@ -328,7 +328,7 @@ export function resourcePlugin(opts: ResolvedOptions, meta: UnpluginContextMeta)
328328
}
329329

330330
const generate = getGenerator(langInfo, generateYAML)
331-
const { code: generatedCode, map } = await generate(source, parseOptions)
331+
const { code: generatedCode, map } = generate(source, parseOptions)
332332
debug('generated code', generatedCode)
333333
debug('sourcemap', map, ctx.sourceMap)
334334

@@ -339,10 +339,7 @@ export function resourcePlugin(opts: ResolvedOptions, meta: UnpluginContextMeta)
339339
}
340340
} as UnpluginOptions
341341
}
342-
type GeneratorLike = (
343-
source: string | Buffer,
344-
options: CodeGenOptions
345-
) => Promise<CodeGenResult<unknown>> | CodeGenResult<unknown>
342+
type GeneratorLike = (source: string | Buffer, options: CodeGenOptions) => CodeGenResult<unknown>
346343
function getGenerator(ext: string, fallback: GeneratorLike = generateJSON) {
347344
if (/\.?json5?$/.test(ext)) {
348345
return generateJSON

0 commit comments

Comments
 (0)