Skip to content

Commit 7200dee

Browse files
authored
fix: correct the behavior when multiple transform filter options are specified (#19818)
1 parent b125172 commit 7200dee

File tree

3 files changed

+61
-51
lines changed

3 files changed

+61
-51
lines changed

packages/vite/src/node/__tests__/plugins/pluginFilter.spec.ts

Lines changed: 47 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import util from 'node:util'
22
import path from 'node:path'
33
import { describe, expect, test } from 'vitest'
44
import {
5-
FALLBACK_FALSE,
6-
FALLBACK_TRUE,
75
createCodeFilter,
86
createFilterForTransform,
97
createIdFilter,
@@ -16,37 +14,37 @@ describe('createIdFilter', () => {
1614
inputFilter: 'foo.js',
1715
cases: [
1816
{ id: 'foo.js', expected: true },
19-
{ id: 'foo.ts', expected: FALLBACK_FALSE },
20-
{ id: '\0foo.js', expected: FALLBACK_FALSE },
21-
{ id: '\0' + path.resolve('foo.js'), expected: FALLBACK_FALSE },
17+
{ id: 'foo.ts', expected: false },
18+
{ id: '\0foo.js', expected: false },
19+
{ id: '\0' + path.resolve('foo.js'), expected: false },
2220
],
2321
},
2422
{
2523
inputFilter: ['foo.js'],
2624
cases: [
2725
{ id: 'foo.js', expected: true },
28-
{ id: 'foo.ts', expected: FALLBACK_FALSE },
26+
{ id: 'foo.ts', expected: false },
2927
],
3028
},
3129
{
3230
inputFilter: { include: 'foo.js' },
3331
cases: [
3432
{ id: 'foo.js', expected: true },
35-
{ id: 'foo.ts', expected: FALLBACK_FALSE },
33+
{ id: 'foo.ts', expected: false },
3634
],
3735
},
3836
{
3937
inputFilter: { include: '*.js' },
4038
cases: [
4139
{ id: 'foo.js', expected: true },
42-
{ id: 'foo.ts', expected: FALLBACK_FALSE },
40+
{ id: 'foo.ts', expected: false },
4341
],
4442
},
4543
{
4644
inputFilter: { include: /\.js$/ },
4745
cases: [
4846
{ id: 'foo.js', expected: true },
49-
{ id: 'foo.ts', expected: FALLBACK_FALSE },
47+
{ id: 'foo.ts', expected: false },
5048
],
5149
},
5250
{
@@ -56,50 +54,50 @@ describe('createIdFilter', () => {
5654
...(process.platform === 'win32'
5755
? [{ id: 'a\\foo.js', expected: true }]
5856
: []),
59-
{ id: 'a_foo.js', expected: FALLBACK_FALSE },
57+
{ id: 'a_foo.js', expected: false },
6058
],
6159
},
6260
{
6361
inputFilter: { include: [/\.js$/] },
6462
cases: [
6563
{ id: 'foo.js', expected: true },
66-
{ id: 'foo.ts', expected: FALLBACK_FALSE },
64+
{ id: 'foo.ts', expected: false },
6765
],
6866
},
6967
{
7068
inputFilter: { exclude: 'foo.js' },
7169
cases: [
7270
{ id: 'foo.js', expected: false },
73-
{ id: 'foo.ts', expected: FALLBACK_TRUE },
71+
{ id: 'foo.ts', expected: true },
7472
],
7573
},
7674
{
7775
inputFilter: { exclude: '*.js' },
7876
cases: [
7977
{ id: 'foo.js', expected: false },
80-
{ id: 'foo.ts', expected: FALLBACK_TRUE },
78+
{ id: 'foo.ts', expected: true },
8179
],
8280
},
8381
{
8482
inputFilter: { exclude: /\.js$/ },
8583
cases: [
8684
{ id: 'foo.js', expected: false },
87-
{ id: 'foo.ts', expected: FALLBACK_TRUE },
85+
{ id: 'foo.ts', expected: true },
8886
],
8987
},
9088
{
9189
inputFilter: { exclude: [/\.js$/] },
9290
cases: [
9391
{ id: 'foo.js', expected: false },
94-
{ id: 'foo.ts', expected: FALLBACK_TRUE },
92+
{ id: 'foo.ts', expected: true },
9593
],
9694
},
9795
{
9896
inputFilter: { include: 'foo.js', exclude: 'bar.js' },
9997
cases: [
10098
{ id: 'foo.js', expected: true },
10199
{ id: 'bar.js', expected: false },
102-
{ id: 'baz.js', expected: FALLBACK_FALSE },
100+
{ id: 'baz.js', expected: false },
103101
],
104102
},
105103
{
@@ -140,64 +138,64 @@ describe('createCodeFilter', () => {
140138
inputFilter: 'import.meta',
141139
cases: [
142140
{ code: 'import.meta', expected: true },
143-
{ code: 'import_meta', expected: FALLBACK_FALSE },
141+
{ code: 'import_meta', expected: false },
144142
],
145143
},
146144
{
147145
inputFilter: ['import.meta'],
148146
cases: [
149147
{ code: 'import.meta', expected: true },
150-
{ code: 'import_meta', expected: FALLBACK_FALSE },
148+
{ code: 'import_meta', expected: false },
151149
],
152150
},
153151
{
154152
inputFilter: { include: 'import.meta' },
155153
cases: [
156154
{ code: 'import.meta', expected: true },
157-
{ code: 'import_meta', expected: FALLBACK_FALSE },
155+
{ code: 'import_meta', expected: false },
158156
],
159157
},
160158
{
161159
inputFilter: { include: /import\.\w+/ },
162160
cases: [
163161
{ code: 'import.meta', expected: true },
164-
{ code: 'import_meta', expected: FALLBACK_FALSE },
162+
{ code: 'import_meta', expected: false },
165163
],
166164
},
167165
{
168166
inputFilter: { include: [/import\.\w+/] },
169167
cases: [
170168
{ code: 'import.meta', expected: true },
171-
{ code: 'import_meta', expected: FALLBACK_FALSE },
169+
{ code: 'import_meta', expected: false },
172170
],
173171
},
174172
{
175173
inputFilter: { exclude: 'import.meta' },
176174
cases: [
177175
{ code: 'import.meta', expected: false },
178-
{ code: 'import_meta', expected: FALLBACK_TRUE },
176+
{ code: 'import_meta', expected: true },
179177
],
180178
},
181179
{
182180
inputFilter: { exclude: /import\.\w+/ },
183181
cases: [
184182
{ code: 'import.meta', expected: false },
185-
{ code: 'import_meta', expected: FALLBACK_TRUE },
183+
{ code: 'import_meta', expected: true },
186184
],
187185
},
188186
{
189187
inputFilter: { exclude: [/import\.\w+/] },
190188
cases: [
191189
{ code: 'import.meta', expected: false },
192-
{ code: 'import_meta', expected: FALLBACK_TRUE },
190+
{ code: 'import_meta', expected: true },
193191
],
194192
},
195193
{
196194
inputFilter: { include: 'import.meta', exclude: 'import_meta' },
197195
cases: [
198196
{ code: 'import.meta', expected: true },
199197
{ code: 'import_meta', expected: false },
200-
{ code: 'importmeta', expected: FALLBACK_FALSE },
198+
{ code: 'importmeta', expected: false },
201199
],
202200
},
203201
{
@@ -259,7 +257,30 @@ describe('createFilterForTransform', () => {
259257
{ id: 'foo.js', code: 'import.meta', expected: false },
260258
{ id: 'foo.js', code: 'import_meta', expected: false },
261259
{ id: 'foo.ts', code: 'import.meta', expected: true },
262-
{ id: 'foo.ts', code: 'import_meta', expected: true },
260+
{ id: 'foo.ts', code: 'import_meta', expected: false },
261+
],
262+
},
263+
{
264+
inputFilter: [
265+
{ include: 'a*', exclude: '*b' },
266+
{ include: 'a', exclude: 'b' },
267+
],
268+
cases: [
269+
{ id: 'ab', code: '', expected: false },
270+
{ id: 'a', code: 'b', expected: false },
271+
{ id: 'a', code: '', expected: false },
272+
{ id: 'c', code: 'a', expected: false },
273+
{ id: 'a', code: 'a', expected: true },
274+
],
275+
},
276+
{
277+
inputFilter: [{ include: 'a*', exclude: '*b' }, { exclude: 'b' }],
278+
cases: [
279+
{ id: 'ab', code: '', expected: false },
280+
{ id: 'a', code: 'b', expected: false },
281+
{ id: 'a', code: '', expected: true },
282+
{ id: 'c', code: 'a', expected: false },
283+
{ id: 'a', code: 'a', expected: true },
263284
],
264285
},
265286
]

packages/vite/src/node/plugins/index.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { metadataPlugin } from './metadata'
2323
import { dynamicImportVarsPlugin } from './dynamicImportVars'
2424
import { importGlobPlugin } from './importMetaGlob'
2525
import {
26-
type PluginFilterWithFallback,
26+
type PluginFilter,
2727
type TransformHookFilter,
2828
createFilterForTransform,
2929
createIdFilter,
@@ -165,8 +165,8 @@ export function getHookHandler<T extends ObjectHook<Function>>(
165165
}
166166

167167
type FilterForPluginValue = {
168-
resolveId?: PluginFilterWithFallback | undefined
169-
load?: PluginFilterWithFallback | undefined
168+
resolveId?: PluginFilter | undefined
169+
load?: PluginFilter | undefined
170170
transform?: TransformHookFilter | undefined
171171
}
172172
const filterForPlugin = new WeakMap<Plugin, FilterForPluginValue>()
@@ -184,7 +184,7 @@ export function getCachedFilterForPlugin<
184184
filterForPlugin.set(plugin, filters)
185185
}
186186

187-
let filter: PluginFilterWithFallback | TransformHookFilter | undefined
187+
let filter: PluginFilter | TransformHookFilter | undefined
188188
switch (hookName) {
189189
case 'resolveId': {
190190
const rawFilter =

packages/vite/src/node/plugins/pluginFilter.ts

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,7 @@ import picomatch from 'picomatch'
33
import { arraify } from '../utils'
44
import { slash } from '../../shared/utils'
55

6-
export const FALLBACK_TRUE = 1
7-
export const FALLBACK_FALSE = 0
8-
type FallbackValues = typeof FALLBACK_TRUE | typeof FALLBACK_FALSE
9-
106
export type PluginFilter = (input: string) => boolean
11-
export type PluginFilterWithFallback = (
12-
input: string,
13-
) => boolean | FallbackValues
147
export type TransformHookFilter = (id: string, code: string) => boolean
158

169
export type StringFilter<Value = string | RegExp> =
@@ -70,7 +63,7 @@ function patternToCodeFilter(pattern: string | RegExp): PluginFilter {
7063
function createFilter(
7164
exclude: Array<PluginFilter> | undefined,
7265
include: Array<PluginFilter> | undefined,
73-
): PluginFilterWithFallback | undefined {
66+
): PluginFilter | undefined {
7467
if (!exclude && !include) {
7568
return
7669
}
@@ -82,7 +75,7 @@ function createFilter(
8275
if (include?.some((filter) => filter(input))) {
8376
return true
8477
}
85-
return !!include && include.length > 0 ? FALLBACK_FALSE : FALLBACK_TRUE
78+
return !!include && include.length > 0 ? false : true
8679
}
8780
}
8881

@@ -106,7 +99,7 @@ function normalizeFilter(filter: StringFilter): NormalizedStringFilter {
10699
export function createIdFilter(
107100
filter: StringFilter | undefined,
108101
cwd = process.cwd(),
109-
): PluginFilterWithFallback | undefined {
102+
): PluginFilter | undefined {
110103
if (!filter) return
111104
const { exclude, include } = normalizeFilter(filter)
112105
const excludeFilter = exclude?.map((p) => patternToIdFilter(p, cwd))
@@ -116,7 +109,7 @@ export function createIdFilter(
116109

117110
export function createCodeFilter(
118111
filter: StringFilter | undefined,
119-
): PluginFilterWithFallback | undefined {
112+
): PluginFilter | undefined {
120113
if (!filter) return
121114
const { exclude, include } = normalizeFilter(filter)
122115
const excludeFilter = exclude?.map(patternToCodeFilter)
@@ -135,18 +128,14 @@ export function createFilterForTransform(
135128
return (id, code) => {
136129
let fallback = true
137130
if (idFilterFn) {
138-
const idResult = idFilterFn(id)
139-
if (typeof idResult === 'boolean') {
140-
return idResult
141-
}
142-
fallback &&= !!idResult
131+
fallback &&= idFilterFn(id)
132+
}
133+
if (!fallback) {
134+
return false
143135
}
136+
144137
if (codeFilterFn) {
145-
const codeResult = codeFilterFn(code)
146-
if (typeof codeResult === 'boolean') {
147-
return codeResult
148-
}
149-
fallback &&= !!codeResult
138+
fallback &&= codeFilterFn(code)
150139
}
151140
return fallback
152141
}

0 commit comments

Comments
 (0)