Skip to content

Commit 4462907

Browse files
committed
fix: re-create filters after updating options
ref: vitejs/vite-plugin-vue@c383503
1 parent 5004b11 commit 4462907

File tree

1 file changed

+44
-36
lines changed

1 file changed

+44
-36
lines changed

src/core/index.ts

Lines changed: 44 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
type SFCTemplateCompileOptions,
1313
// eslint-disable-next-line import/no-duplicates
1414
} from 'vue/compiler-sfc'
15+
import { computed, shallowRef } from 'vue'
1516
import { resolveCompiler } from '../core/compiler'
1617
import { getResolvedScript, typeDepToSFCMap } from '../core/script'
1718
import { transformMain } from '../core/main'
@@ -142,29 +143,32 @@ function resolveOptions(rawOptions: Options): ResolvedOptions {
142143

143144
export default createUnplugin<Options | undefined, false>(
144145
(rawOptions = {}, meta) => {
145-
let options = resolveOptions(rawOptions)
146-
const { include, exclude, customElement, reactivityTransform } = options
146+
const options = shallowRef(resolveOptions(rawOptions))
147147

148-
const filter = createFilter(include, exclude)
148+
const filter = computed(() =>
149+
createFilter(options.value.include, options.value.exclude)
150+
)
149151

150-
const customElementFilter =
151-
typeof customElement === 'boolean'
152-
? () => customElement
153-
: createFilter(customElement)
152+
const customElementFilter = computed(() =>
153+
typeof options.value.customElement === 'boolean'
154+
? () => options.value.customElement as boolean
155+
: createFilter(options.value.customElement)
156+
)
154157

155-
const refTransformFilter =
156-
reactivityTransform === false
158+
const refTransformFilter = computed(() =>
159+
options.value.reactivityTransform === false
157160
? () => false
158-
: reactivityTransform === true
161+
: options.value.reactivityTransform === true
159162
? createFilter(/\.(j|t)sx?$/, /node_modules/)
160-
: createFilter(reactivityTransform)
163+
: createFilter(options.value.reactivityTransform)
164+
)
161165

162166
const api = {
163167
get options() {
164-
return options
168+
return options.value
165169
},
166170
set options(value) {
167-
options = value
171+
options.value = value
168172
},
169173
version,
170174
}
@@ -175,14 +179,14 @@ export default createUnplugin<Options | undefined, false>(
175179
vite: {
176180
api,
177181
handleHotUpdate(ctx) {
178-
if (options.compiler.invalidateTypeCache) {
179-
options.compiler.invalidateTypeCache(ctx.file)
182+
if (options.value.compiler.invalidateTypeCache) {
183+
options.value.compiler.invalidateTypeCache(ctx.file)
180184
}
181185
if (typeDepToSFCMap.has(ctx.file)) {
182186
return handleTypeDepChange(typeDepToSFCMap.get(ctx.file)!, ctx)
183187
}
184-
if (filter(ctx.file)) {
185-
return handleHotUpdate(ctx, options)
188+
if (filter.value(ctx.file)) {
189+
return handleHotUpdate(ctx, options.value)
186190
}
187191
},
188192

@@ -205,21 +209,21 @@ export default createUnplugin<Options | undefined, false>(
205209
},
206210

207211
configResolved(config) {
208-
options = {
209-
...options,
212+
options.value = {
213+
...options.value,
210214
root: config.root,
211215
sourceMap:
212216
config.command === 'build' ? !!config.build.sourcemap : true,
213217
cssDevSourcemap: config.css?.devSourcemap ?? false,
214218
isProduction: config.isProduction,
215-
compiler: options.compiler || resolveCompiler(config.root),
219+
compiler: options.value.compiler || resolveCompiler(config.root),
216220
devToolsEnabled:
217221
!!config.define!.__VUE_PROD_DEVTOOLS__ || !config.isProduction,
218222
}
219223
},
220224

221225
configureServer(server) {
222-
options.devServer = server
226+
options.value.devServer = server
223227
},
224228
},
225229

@@ -228,11 +232,11 @@ export default createUnplugin<Options | undefined, false>(
228232
},
229233

230234
buildStart() {
231-
const compiler = (options.compiler =
232-
options.compiler || resolveCompiler(options.root))
235+
const compiler = (options.value.compiler =
236+
options.value.compiler || resolveCompiler(options.value.root))
233237

234238
if (compiler.invalidateTypeCache) {
235-
options.devServer?.watcher.on('unlink', (file) => {
239+
options.value.devServer?.watcher.on('unlink', (file) => {
236240
compiler.invalidateTypeCache(file)
237241
})
238242
}
@@ -257,7 +261,7 @@ export default createUnplugin<Options | undefined, false>(
257261
},
258262

259263
load(id) {
260-
const ssr = options.ssr
264+
const ssr = options.value.ssr
261265
if (id === EXPORT_HELPER_ID) {
262266
return helperCode
263267
}
@@ -268,7 +272,7 @@ export default createUnplugin<Options | undefined, false>(
268272
if (query.src) {
269273
return fs.readFileSync(filename, 'utf-8')
270274
}
271-
const descriptor = getDescriptor(filename, options)!
275+
const descriptor = getDescriptor(filename, options.value)!
272276
let block: SFCBlock | null | undefined
273277
if (query.type === 'script') {
274278
// handle <script> + <script setup> merge via compileScript()
@@ -294,18 +298,22 @@ export default createUnplugin<Options | undefined, false>(
294298
if (query.raw || query.url) return false
295299

296300
// Not Vue SFC and refTransform
297-
if (!filter(filename) && !query.vue && !refTransformFilter(filename))
301+
if (
302+
!filter.value(filename) &&
303+
!query.vue &&
304+
!refTransformFilter.value(filename)
305+
)
298306
return false
299307

300308
return true
301309
},
302310

303311
transform(code, id) {
304-
const ssr = options.ssr
312+
const ssr = options.value.ssr
305313
const { filename, query } = parseVueRequest(id)
306-
if (!filter(filename) && !query.vue) {
307-
if (options.compiler.shouldTransformRef(code)) {
308-
return options.compiler.transformRef(code, {
314+
if (!filter.value(filename) && !query.vue) {
315+
if (options.value.compiler.shouldTransformRef(code)) {
316+
return options.value.compiler.transformRef(code, {
309317
filename,
310318
sourceMap: true,
311319
})
@@ -319,23 +327,23 @@ export default createUnplugin<Options | undefined, false>(
319327
return transformMain(
320328
code,
321329
filename,
322-
options,
330+
options.value,
323331
context,
324332
ssr,
325-
customElementFilter(filename)
333+
customElementFilter.value(filename)
326334
)
327335
} else {
328336
// sub block request
329337
const descriptor = query.src
330338
? getSrcDescriptor(filename, query) ||
331339
getTempSrcDescriptor(filename, query)
332-
: getDescriptor(filename, options)!
340+
: getDescriptor(filename, options.value)!
333341

334342
if (query.type === 'template') {
335343
return transformTemplateAsModule(
336344
code,
337345
descriptor,
338-
options,
346+
options.value,
339347
context,
340348
ssr
341349
)
@@ -344,7 +352,7 @@ export default createUnplugin<Options | undefined, false>(
344352
code,
345353
descriptor,
346354
Number(query.index || 0),
347-
options,
355+
options.value,
348356
this,
349357
filename
350358
)

0 commit comments

Comments
 (0)