Skip to content

Commit d3724e1

Browse files
authored
feat!: transform using esbuild and separate ts generator (#478)
* feat!: transform using `esbuild` and separate ts generator * fix: update lockfile * fix: remove unused dependency * fix: remove unused ignore entry
1 parent d64e287 commit d3724e1

File tree

7 files changed

+85
-222
lines changed

7 files changed

+85
-222
lines changed

knip.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ export default {
66
'examples/rspack/rspack.config.mjs' // cannot resolve rspack plugin ...
77
],
88
ignore: ['**/fixtures/**', '.unmaintained/**'],
9-
ignoreDependencies: ['@babel/preset-typescript', 'ts-loader', 'lint-staged'],
9+
ignoreDependencies: ['ts-loader', 'lint-staged'],
1010
ignoreBinaries: ['dev']
1111
} satisfies KnipConfig

packages/bundle-utils/package.json

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,17 @@
1818
}
1919
},
2020
"dependencies": {
21-
"@babel/core": "^7.26.10",
22-
"@babel/preset-typescript": "^7.26.0",
2321
"@intlify/message-compiler": "next",
2422
"@intlify/shared": "catalog:intlify",
2523
"acorn": "^8.8.2",
24+
"esbuild": "^0.25.1",
2625
"escodegen": "^2.1.0",
2726
"estree-walker": "^2.0.2",
2827
"jsonc-eslint-parser": "^2.3.0",
2928
"source-map-js": "^1.0.1",
3029
"yaml-eslint-parser": "^1.2.2"
3130
},
3231
"devDependencies": {
33-
"@types/babel__core": "^7.20.5",
3432
"@types/escodegen": "^0.0.10",
3533
"@types/estree": "^1.0.0",
3634
"unbuild": "catalog:"

packages/bundle-utils/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ export { checkInstallPackage, getVueI18nVersion } from './deps'
33
export type { InstalledPackage } from './deps'
44
export { DynamicResourceError, generate as generateJavaScript } from './js'
55
export { generate as generateJSON } from './json'
6+
export { generate as generateTypescript } from './ts'
67
export { generate as generateYAML } from './yaml'

packages/bundle-utils/src/js.ts

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
* Code generator for i18n js resource
33
*/
44

5-
import { transform } from '@babel/core'
65
import { isBoolean, isNumber, isString } from '@intlify/shared'
76
import { parse as parseJavaScript } from 'acorn'
87
import { generate as generateJavaScript } from 'escodegen'
@@ -42,8 +41,7 @@ export function generate(
4241
jit = false
4342
}: CodeGenOptions
4443
): CodeGenResult<Node> {
45-
const target = Buffer.isBuffer(targetSource) ? targetSource.toString() : targetSource
46-
let value = target
44+
const value = Buffer.isBuffer(targetSource) ? targetSource.toString() : targetSource
4745

4846
const options = {
4947
type,
@@ -63,24 +61,6 @@ export function generate(
6361
} as CodeGenOptions
6462
const generator = createCodeGenerator(options)
6563

66-
if (options.filename && /.[c|m]?ts$/.test(options.filename)) {
67-
const transformed = transform(value, {
68-
filename: options.filename,
69-
sourceMaps: options.sourceMap,
70-
babelrc: false,
71-
configFile: false,
72-
browserslistConfigFile: false,
73-
comments: false,
74-
envName: 'development',
75-
presets: ['@babel/preset-typescript']
76-
})
77-
78-
if (transformed && transformed.code) {
79-
value = transformed.code
80-
options.source = transformed.code
81-
}
82-
}
83-
8464
const ast = parseJavaScript(value, {
8565
ecmaVersion: 'latest',
8666
sourceType: 'module',

packages/bundle-utils/src/ts.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/**
2+
* Code generator for i18n ts resource
3+
*
4+
* An async wrapper for the js generator which transforms ts to js before generating
5+
*/
6+
7+
import { transform } from 'esbuild'
8+
import { Node } from 'estree'
9+
import { CodeGenOptions, CodeGenResult } from './codegen'
10+
import { generate as generateJavaScript } from './js'
11+
12+
/**
13+
* @internal
14+
*/
15+
export async function generate(
16+
targetSource: string | Buffer,
17+
{
18+
type = 'plain',
19+
filename = 'vue-i18n-loader.js',
20+
inSourceMap = undefined,
21+
locale = '',
22+
isGlobal = false,
23+
sourceMap = false,
24+
env = 'development',
25+
forceStringify = false,
26+
onError = undefined,
27+
onWarn = undefined,
28+
strictMessage = true,
29+
escapeHtml = false,
30+
allowDynamic = false,
31+
jit = false
32+
}: CodeGenOptions
33+
): Promise<CodeGenResult<Node>> {
34+
let value = Buffer.isBuffer(targetSource) ? targetSource.toString() : targetSource
35+
36+
const options = {
37+
type,
38+
source: value,
39+
sourceMap,
40+
locale,
41+
isGlobal,
42+
inSourceMap,
43+
env,
44+
filename,
45+
forceStringify,
46+
onError,
47+
onWarn,
48+
strictMessage,
49+
escapeHtml,
50+
allowDynamic,
51+
jit
52+
} as CodeGenOptions
53+
54+
if (options.filename && /.[c|m]?ts$/.test(options.filename)) {
55+
const transformed = await transform(value, { loader: 'ts' })
56+
57+
if (transformed && transformed.code) {
58+
value = transformed.code
59+
options.source = transformed.code
60+
}
61+
}
62+
63+
return generateJavaScript(value, options)
64+
}

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

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
DynamicResourceError,
33
generateJavaScript,
44
generateJSON,
5+
generateTypescript,
56
generateYAML
67
} from '@intlify/bundle-utils'
78
import { assign, generateCodeFrame, isEmptyObject } from '@intlify/shared'
@@ -17,7 +18,7 @@ import { parse } from 'vue/compiler-sfc'
1718
import { checkVuePlugin, error, getVitePlugin, raiseError, resolveNamespace, warn } from '../utils'
1819
import { getVueCompiler, parseVueRequest } from '../vue'
1920

20-
import type { CodeGenOptions } from '@intlify/bundle-utils'
21+
import type { CodeGenOptions, CodeGenResult } from '@intlify/bundle-utils'
2122
import type { RollupPlugin, UnpluginContextMeta, UnpluginOptions } from 'unplugin'
2223
import type { ResolvedOptions } from '../core/options'
2324
import type { SFCLangFormat } from '../types'
@@ -274,7 +275,7 @@ export function resourcePlugin(opts: ResolvedOptions, meta: UnpluginContextMeta)
274275
debug('parseOptions', parseOptions)
275276

276277
try {
277-
const { code: generatedCode, map } = generate(code, parseOptions)
278+
const { code: generatedCode, map } = await generate(code, parseOptions)
278279

279280
debug('generated code', generatedCode)
280281
debug('sourcemap', map, ctx.sourceMap)
@@ -323,7 +324,7 @@ export function resourcePlugin(opts: ResolvedOptions, meta: UnpluginContextMeta)
323324
}
324325

325326
const generate = getGenerator(langInfo, generateYAML)
326-
const { code: generatedCode, map } = generate(source, parseOptions)
327+
const { code: generatedCode, map } = await generate(source, parseOptions)
327328
debug('generated code', generatedCode)
328329
debug('sourcemap', map, ctx.sourceMap)
329330

@@ -334,9 +335,11 @@ export function resourcePlugin(opts: ResolvedOptions, meta: UnpluginContextMeta)
334335
}
335336
} as UnpluginOptions
336337
}
337-
338-
type GeneratorFn = typeof generateJSON | typeof generateJavaScript | typeof generateYAML
339-
function getGenerator(ext: string, fallback: GeneratorFn = generateJSON) {
338+
type GeneratorLike = (
339+
source: string | Buffer,
340+
options: CodeGenOptions
341+
) => Promise<CodeGenResult<unknown>> | CodeGenResult<unknown>
342+
function getGenerator(ext: string, fallback: GeneratorLike = generateJSON) {
340343
if (/\.?json5?$/.test(ext)) {
341344
return generateJSON
342345
}
@@ -345,10 +348,14 @@ function getGenerator(ext: string, fallback: GeneratorFn = generateJSON) {
345348
return generateYAML
346349
}
347350

348-
if (/\.[c|m]?[j|t]s$/.test(ext)) {
351+
if (/\.[c|m]?js$/.test(ext)) {
349352
return generateJavaScript
350353
}
351354

355+
if (/\.[c|m]?ts$/.test(ext)) {
356+
return generateTypescript
357+
}
358+
352359
return fallback
353360
}
354361

0 commit comments

Comments
 (0)