Skip to content

Commit b7b5f73

Browse files
committed
fix: disallow string filters for resolveId
1 parent df34a2c commit b7b5f73

5 files changed

Lines changed: 69 additions & 40 deletions

File tree

‎docs/guide/index.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,8 @@ export const bunPlugin = unplugin.bun
294294
To optimize performance in native bundlers, leverage the `filter` option in `resolveId`, `transform`, and `load`
295295
hooks to exclude files that don’t require processing.
296296

297+
`resolveId.filter.id` only accepts a `RegExp`.
298+
297299
```ts twoslash
298300
import { createUnplugin } from 'unplugin'
299301

‎src/rollup/index.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export function toRollupPlugin(
2929
&& (!nativeFilter && typeof plugin.resolveId === 'object' && plugin.resolveId.filter)
3030
) {
3131
const resolveIdHook = plugin.resolveId
32-
const { handler, filter } = normalizeObjectHook('load', resolveIdHook)
32+
const { handler, filter } = normalizeObjectHook('resolveId', resolveIdHook)
3333

3434
replaceHookHandler('resolveId', resolveIdHook, function (...args) {
3535
const [id] = args

‎src/types.ts‎

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,19 +71,24 @@ export type FilterPattern = Arrayable<StringOrRegExp>
7171
export type StringFilter
7272
= | FilterPattern
7373
| { include?: FilterPattern | undefined, exclude?: FilterPattern | undefined }
74-
export interface HookFilter {
74+
75+
export interface ResolveIdHookFilter {
76+
id?: RegExp | undefined
77+
}
78+
79+
export interface LoadHookFilter {
7580
id?: StringFilter | undefined
81+
}
82+
83+
export interface TransformHookFilter extends LoadHookFilter {
7684
code?: StringFilter | undefined
7785
}
7886

79-
export interface ObjectHook<T extends HookFnMap[keyof HookFnMap], F extends keyof HookFilter> {
80-
filter?: Pick<HookFilter, F> | undefined
87+
export interface ObjectHook<T extends HookFnMap[keyof HookFnMap], F> {
88+
filter?: F | undefined
8189
handler: T
8290
}
83-
export type Hook<
84-
T extends HookFnMap[keyof HookFnMap],
85-
F extends keyof HookFilter,
86-
> = T | ObjectHook<T, F>
91+
export type Hook<T extends HookFnMap[keyof HookFnMap], F> = T | ObjectHook<T, F>
8792

8893
export interface HookFnMap {
8994
// Build Hooks
@@ -109,9 +114,9 @@ export interface UnpluginOptions {
109114

110115
buildStart?: HookFnMap['buildStart'] | undefined
111116
buildEnd?: HookFnMap['buildEnd'] | undefined
112-
transform?: Hook<HookFnMap['transform'], 'code' | 'id'> | undefined
113-
load?: Hook<HookFnMap['load'], 'id'> | undefined
114-
resolveId?: Hook<HookFnMap['resolveId'], 'id'> | undefined
117+
transform?: Hook<HookFnMap['transform'], TransformHookFilter> | undefined
118+
load?: Hook<HookFnMap['load'], LoadHookFilter> | undefined
119+
resolveId?: Hook<HookFnMap['resolveId'], ResolveIdHookFilter> | undefined
115120
writeBundle?: HookFnMap['writeBundle'] | undefined
116121

117122
watchChange?: ((this: UnpluginBuildContext, id: string, change: { event: 'create' | 'update' | 'delete' }) => void) | undefined

‎src/utils/filter.ts‎

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import type { Hook, HookFilter, StringFilter, StringOrRegExp } from '../types'
1+
import type {
2+
Hook,
3+
TransformHookFilter as HookFilter,
4+
LoadHookFilter,
5+
ResolveIdHookFilter,
6+
StringFilter,
7+
StringOrRegExp,
8+
} from '../types'
29
import { resolve } from 'node:path'
310
import picomatch from 'picomatch'
411
import { toArray } from './general'
@@ -142,17 +149,21 @@ function createFilterForTransform(
142149
}
143150
}
144151

145-
export function normalizeObjectHook<T extends (...args: any[]) => any, F extends keyof HookFilter>(
146-
name: 'resolveId' | 'load',
147-
hook: Hook<T, F>,
152+
export function normalizeObjectHook<T extends (...args: any[]) => any>(
153+
name: 'resolveId',
154+
hook: Hook<T, ResolveIdHookFilter>,
148155
): { handler: T, filter: PluginFilter }
149-
export function normalizeObjectHook<T extends (...args: any[]) => any, F extends keyof HookFilter>(
156+
export function normalizeObjectHook<T extends (...args: any[]) => any>(
157+
name: 'load',
158+
hook: Hook<T, LoadHookFilter>,
159+
): { handler: T, filter: PluginFilter }
160+
export function normalizeObjectHook<T extends (...args: any[]) => any>(
150161
name: 'transform',
151-
hook: Hook<T, F>,
162+
hook: Hook<T, HookFilter>,
152163
): { handler: T, filter: TransformHookFilter }
153-
export function normalizeObjectHook<T extends (...args: any[]) => any, F extends keyof HookFilter>(
164+
export function normalizeObjectHook<T extends (...args: any[]) => any>(
154165
name: 'resolveId' | 'load' | 'transform',
155-
hook: Hook<T, F>,
166+
hook: Hook<T, ResolveIdHookFilter | LoadHookFilter | HookFilter>,
156167
): {
157168
handler: T
158169
filter: PluginFilter | TransformHookFilter
@@ -165,12 +176,13 @@ export function normalizeObjectHook<T extends (...args: any[]) => any, F extends
165176
}
166177
else {
167178
handler = hook.handler
168-
const hookFilter = hook.filter as HookFilter | undefined
179+
const hookFilter = hook.filter
169180
if (name === 'resolveId' || name === 'load') {
170181
filter = createFilterForId(hookFilter?.id)
171182
}
172183
else {
173-
filter = createFilterForTransform(hookFilter?.id, hookFilter?.code)
184+
const transformFilter = hookFilter as HookFilter | undefined
185+
filter = createFilterForTransform(transformFilter?.id, transformFilter?.code)
174186
}
175187
}
176188

‎test/unit-tests/filter/filter.test.ts‎

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,25 @@ function createUnpluginWithHooks(
1919
}))
2020
}
2121

22-
function createIdHook() {
22+
function createResolveIdHook() {
2323
const handler = vi.fn()
2424
return {
2525
hook: {
2626
filter: {
27-
id: {
28-
include: [/\.js$/],
29-
exclude: [/entry.js$/, /not-expect/],
30-
},
27+
id: /^(?!.*(?:entry\.js|not-expect)).*\.js$/,
28+
},
29+
handler,
30+
},
31+
handler,
32+
}
33+
}
34+
35+
function createLoadHook() {
36+
const handler = vi.fn()
37+
return {
38+
hook: {
39+
filter: {
40+
id: '**/mod.js',
3141
},
3242
handler,
3343
},
@@ -72,8 +82,8 @@ describe('filter', () => {
7282
})
7383

7484
it('vite', async () => {
75-
const { hook: resolveId, handler: resolveIdHandler } = createIdHook()
76-
const { hook: load, handler: loadHandler } = createIdHook()
85+
const { hook: resolveId, handler: resolveIdHandler } = createResolveIdHook()
86+
const { hook: load, handler: loadHandler } = createLoadHook()
7787
const { hook: transform, handler: transformHandler } = createTransformHook()
7888
const plugin = createUnpluginWithHooks(resolveId, load, transform).vite
7989
// we need to define `enforce` here for the plugin to be run
@@ -96,8 +106,8 @@ describe('filter', () => {
96106
})
97107

98108
it('rollup', async () => {
99-
const { hook: resolveId, handler: resolveIdHandler } = createIdHook()
100-
const { hook: load, handler: loadHandler } = createIdHook()
109+
const { hook: resolveId, handler: resolveIdHandler } = createResolveIdHook()
110+
const { hook: load, handler: loadHandler } = createLoadHook()
101111
const { hook: transform, handler: transformHandler } = createTransformHook()
102112
const plugin = createUnpluginWithHooks(resolveId, load, transform).rollup
103113

@@ -110,8 +120,8 @@ describe('filter', () => {
110120
})
111121

112122
it('rolldown', async () => {
113-
const { hook: resolveId, handler: resolveIdHandler } = createIdHook()
114-
const { hook: load, handler: loadHandler } = createIdHook()
123+
const { hook: resolveId, handler: resolveIdHandler } = createResolveIdHook()
124+
const { hook: load, handler: loadHandler } = createLoadHook()
115125
const { hook: transform, handler: transformHandler } = createTransformHook()
116126
const plugin = createUnpluginWithHooks(resolveId, load, transform).rolldown
117127

@@ -124,8 +134,8 @@ describe('filter', () => {
124134
})
125135

126136
it('webpack', async () => {
127-
const { hook: resolveId, handler: resolveIdHandler } = createIdHook()
128-
const { hook: load, handler: loadHandler } = createIdHook()
137+
const { hook: resolveId, handler: resolveIdHandler } = createResolveIdHook()
138+
const { hook: load, handler: loadHandler } = createLoadHook()
129139
const { hook: transform, handler: transformHandler } = createTransformHook()
130140
const plugin = createUnpluginWithHooks(resolveId, load, transform).webpack
131141

@@ -143,8 +153,8 @@ describe('filter', () => {
143153
})
144154

145155
it('rspack', async () => {
146-
const { hook: resolveId, handler: resolveIdHandler } = createIdHook()
147-
const { hook: load, handler: loadHandler } = createIdHook()
156+
const { hook: resolveId, handler: resolveIdHandler } = createResolveIdHook()
157+
const { hook: load, handler: loadHandler } = createLoadHook()
148158
const { hook: transform, handler: transformHandler } = createTransformHook()
149159
const plugin = createUnpluginWithHooks(resolveId, load, transform).rspack
150160

@@ -162,8 +172,8 @@ describe('filter', () => {
162172
})
163173

164174
it('esbuild', async () => {
165-
const { hook: resolveId, handler: resolveIdHandler } = createIdHook()
166-
const { hook: load, handler: loadHandler } = createIdHook()
175+
const { hook: resolveId, handler: resolveIdHandler } = createResolveIdHook()
176+
const { hook: load, handler: loadHandler } = createLoadHook()
167177
const { hook: transform, handler: transformHandler } = createTransformHook()
168178
const plugin = createUnpluginWithHooks(resolveId, load, transform).esbuild
169179

@@ -178,8 +188,8 @@ describe('filter', () => {
178188
})
179189

180190
onlyBun('bun', async () => {
181-
const { hook: resolveId, handler: resolveIdHandler } = createIdHook()
182-
const { hook: load, handler: loadHandler } = createIdHook()
191+
const { hook: resolveId, handler: resolveIdHandler } = createResolveIdHook()
192+
const { hook: load, handler: loadHandler } = createLoadHook()
183193
const { hook: transform, handler: transformHandler } = createTransformHook()
184194
const plugin = createUnpluginWithHooks(resolveId, load, transform).bun
185195

0 commit comments

Comments
 (0)