Skip to content

Commit 0bbdd2c

Browse files
authored
fix: align plugin hook filter behavior with pluginutils (#19736)
1 parent 66b2d91 commit 0bbdd2c

File tree

4 files changed

+43
-23
lines changed

4 files changed

+43
-23
lines changed

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

+6-6
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ describe('hook filter with plugin container', async () => {
2525
{
2626
name: 'test',
2727
resolveId: {
28-
filter: { id: '*.js' },
28+
filter: { id: /\.js$/ },
2929
handler: resolveId,
3030
},
3131
load: {
32-
filter: { id: '*.js' },
32+
filter: { id: '**/*.js' },
3333
handler: load,
3434
},
3535
transform: {
36-
filter: { id: '*.js' },
36+
filter: { id: '**/*.js' },
3737
handler: transformWithId,
3838
},
3939
},
@@ -97,15 +97,15 @@ describe('hook filter with build', async () => {
9797
{
9898
name: 'test',
9999
resolveId: {
100-
filter: { id: '*.js' },
100+
filter: { id: /\.js$/ },
101101
handler: resolveId,
102102
},
103103
load: {
104-
filter: { id: '*.js' },
104+
filter: { id: '**/*.js' },
105105
handler: load,
106106
},
107107
transform: {
108-
filter: { id: '*.js' },
108+
filter: { id: '**/*.js' },
109109
handler: transformWithId,
110110
},
111111
},

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

+10-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ describe('createIdFilter', () => {
1717
cases: [
1818
{ id: 'foo.js', expected: true },
1919
{ id: 'foo.ts', expected: FALLBACK_FALSE },
20-
{ id: path.resolve('foo.js'), expected: true },
2120
{ id: '\0foo.js', expected: FALLBACK_FALSE },
2221
{ id: '\0' + path.resolve('foo.js'), expected: FALLBACK_FALSE },
2322
],
@@ -111,11 +110,15 @@ describe('createIdFilter', () => {
111110
{ id: 'foo.ts', expected: false },
112111
],
113112
},
113+
{
114+
inputFilter: '/virtual/foo',
115+
cases: [{ id: '/virtual/foo', expected: true }],
116+
},
114117
]
115118

116119
for (const filter of filters) {
117120
test(`${util.inspect(filter.inputFilter)}`, () => {
118-
const idFilter = createIdFilter(filter.inputFilter)
121+
const idFilter = createIdFilter(filter.inputFilter, '')
119122
if (!filter.cases) {
120123
expect(idFilter).toBeUndefined()
121124
return
@@ -264,7 +267,11 @@ describe('createFilterForTransform', () => {
264267
for (const filter of filters) {
265268
test(`${util.inspect(filter.inputFilter)}`, () => {
266269
const [idFilter, codeFilter] = filter.inputFilter
267-
const filterForTransform = createFilterForTransform(idFilter, codeFilter)
270+
const filterForTransform = createFilterForTransform(
271+
idFilter,
272+
codeFilter,
273+
'',
274+
)
268275
if (!filter.cases) {
269276
expect(filterForTransform).toBeUndefined()
270277
return

packages/vite/src/node/plugin.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ export interface Plugin<A = any> extends RollupPlugin<A> {
141141
isEntry: boolean
142142
},
143143
) => Promise<ResolveIdResult> | ResolveIdResult,
144-
{ filter?: { id?: StringFilter } }
144+
{ filter?: { id?: StringFilter<RegExp> } }
145145
>
146146
load?: ObjectHook<
147147
(

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

+26-13
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,32 @@ export type PluginFilterWithFallback = (
1313
) => boolean | FallbackValues
1414
export type TransformHookFilter = (id: string, code: string) => boolean
1515

16-
export type StringFilter =
17-
| string
18-
| RegExp
19-
| Array<string | RegExp>
16+
export type StringFilter<Value = string | RegExp> =
17+
| Value
18+
| Array<Value>
2019
| {
21-
include?: string | RegExp | Array<string | RegExp>
22-
exclude?: string | RegExp | Array<string | RegExp>
20+
include?: Value | Array<Value>
21+
exclude?: Value | Array<Value>
2322
}
2423

2524
type NormalizedStringFilter = {
2625
include?: Array<string | RegExp>
2726
exclude?: Array<string | RegExp>
2827
}
2928

30-
function patternToIdFilter(pattern: string | RegExp): PluginFilter {
29+
function getMatcherString(glob: string, cwd: string) {
30+
if (glob.startsWith('**') || path.isAbsolute(glob)) {
31+
return slash(glob)
32+
}
33+
34+
const resolved = path.join(cwd, glob)
35+
return slash(resolved)
36+
}
37+
38+
function patternToIdFilter(
39+
pattern: string | RegExp,
40+
cwd: string,
41+
): PluginFilter {
3142
if (pattern instanceof RegExp) {
3243
return (id: string) => {
3344
const normalizedId = slash(id)
@@ -37,10 +48,10 @@ function patternToIdFilter(pattern: string | RegExp): PluginFilter {
3748
}
3849
}
3950

40-
const cwd = process.cwd()
41-
const matcher = picomatch(pattern, { dot: true })
51+
const glob = getMatcherString(pattern, cwd)
52+
const matcher = picomatch(glob, { dot: true })
4253
return (id: string) => {
43-
const normalizedId = slash(path.relative(cwd, id))
54+
const normalizedId = slash(id)
4455
return matcher(normalizedId)
4556
}
4657
}
@@ -94,11 +105,12 @@ function normalizeFilter(filter: StringFilter): NormalizedStringFilter {
94105

95106
export function createIdFilter(
96107
filter: StringFilter | undefined,
108+
cwd = process.cwd(),
97109
): PluginFilterWithFallback | undefined {
98110
if (!filter) return
99111
const { exclude, include } = normalizeFilter(filter)
100-
const excludeFilter = exclude?.map(patternToIdFilter)
101-
const includeFilter = include?.map(patternToIdFilter)
112+
const excludeFilter = exclude?.map((p) => patternToIdFilter(p, cwd))
113+
const includeFilter = include?.map((p) => patternToIdFilter(p, cwd))
102114
return createFilter(excludeFilter, includeFilter)
103115
}
104116

@@ -115,9 +127,10 @@ export function createCodeFilter(
115127
export function createFilterForTransform(
116128
idFilter: StringFilter | undefined,
117129
codeFilter: StringFilter | undefined,
130+
cwd?: string,
118131
): TransformHookFilter | undefined {
119132
if (!idFilter && !codeFilter) return
120-
const idFilterFn = createIdFilter(idFilter)
133+
const idFilterFn = createIdFilter(idFilter, cwd)
121134
const codeFilterFn = createCodeFilter(codeFilter)
122135
return (id, code) => {
123136
let fallback = true

0 commit comments

Comments
 (0)