Skip to content

Commit 03e03a7

Browse files
authored
fix(unpluing-vue-i18n): Support for transform.handler in vite:json plugin (#484)
1 parent d3724e1 commit 03e03a7

File tree

2 files changed

+55
-4
lines changed

2 files changed

+55
-4
lines changed

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

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,16 @@ import { createHash } from 'node:crypto'
1515
import fs from 'node:fs'
1616
import { dirname, parse as parsePath, resolve } from 'node:path'
1717
import { parse } from 'vue/compiler-sfc'
18-
import { checkVuePlugin, error, getVitePlugin, raiseError, resolveNamespace, warn } from '../utils'
18+
import {
19+
checkVuePlugin,
20+
error,
21+
getVitePlugin,
22+
getVitePluginTransform,
23+
overrideVitePluginTransform,
24+
raiseError,
25+
resolveNamespace,
26+
warn
27+
} from '../utils'
1928
import { getVueCompiler, parseVueRequest } from '../vue'
2029

2130
import type { CodeGenOptions, CodeGenResult } from '@intlify/bundle-utils'
@@ -169,12 +178,23 @@ export function resourcePlugin(opts: ResolvedOptions, meta: UnpluginContextMeta)
169178
ctx.sourceMap = config.command === 'build' ? !!config.build.sourcemap : false
170179
debug(`configResolved: isProduction = ${ctx.prod}, sourceMap = ${ctx.sourceMap}`)
171180

181+
/**
182+
* NOTE:
183+
* For the native rolldown plugin, we need to change to another solution from the current workaround.
184+
* Currently, the rolldown team and vite team are discussing this issue.
185+
* https://github.com/vitejs/rolldown-vite/issues/120
186+
*/
187+
172188
// json transform handling
173189
const jsonPlugin = getVitePlugin(config, 'vite:json')
174190
if (jsonPlugin) {
175-
// backup @rollup/plugin-json
176-
const orgTransform = jsonPlugin.transform
177-
jsonPlugin.transform = async function (code: string, id: string) {
191+
// saving `vite:json` plugin instance
192+
const [orgTransform, transformWay] = getVitePluginTransform(jsonPlugin)
193+
if (!orgTransform) {
194+
throw new Error('vite:json plugin not found!')
195+
}
196+
197+
async function overrideViteJsonPlugin(code: string, id: string) {
178198
if (!/\.json$/.test(id) || filter(id)) {
179199
return
180200
}
@@ -196,6 +216,9 @@ export function resourcePlugin(opts: ResolvedOptions, meta: UnpluginContextMeta)
196216
// @ts-expect-error
197217
return orgTransform!.apply(this, [code, id])
198218
}
219+
220+
// override `vite:json` plugin transform function
221+
overrideVitePluginTransform(jsonPlugin, overrideViteJsonPlugin, transformWay!)
199222
}
200223
}
201224
},

packages/unplugin-vue-i18n/src/utils/plugin.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,34 @@ export function getVitePlugin(config: UserConfig, name: string): RollupPlugin |
1515
return config.plugins.find(p => p.name === name) as RollupPlugin
1616
}
1717

18+
export function getVitePluginTransform(
19+
plugin: RollupPlugin
20+
): [RollupPlugin['transform'], 'handler' | 'transform' | undefined] {
21+
if (plugin.transform) {
22+
return 'handler' in plugin.transform
23+
? [plugin.transform.handler, 'handler']
24+
: [plugin.transform, 'transform']
25+
} else {
26+
return [undefined, undefined]
27+
}
28+
}
29+
30+
// TODO: `override` type, we need more strict type
31+
export function overrideVitePluginTransform(
32+
plugin: RollupPlugin,
33+
override: Function,
34+
to: 'handler' | 'transform'
35+
): void {
36+
if (plugin.transform == undefined) {
37+
throw new Error('plugin.transform is undefined')
38+
}
39+
if (to === 'handler' && 'handler' in plugin.transform) {
40+
plugin.transform.handler = override as typeof plugin.transform.handler
41+
} else {
42+
plugin.transform = override as typeof plugin.transform
43+
}
44+
}
45+
1846
export function checkVuePlugin(vuePlugin: RollupPlugin | null): boolean {
1947
if (vuePlugin == null || !vuePlugin.api) {
2048
error(

0 commit comments

Comments
 (0)