Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions packages/vite/src/node/__tests__/plugins/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@ describe('hook filter with plugin container', async () => {
{
name: 'test',
resolveId: {
filter: { id: '*.js' },
filter: { id: /\.js$/ },
handler: resolveId,
},
load: {
filter: { id: '*.js' },
filter: { id: '**/*.js' },
handler: load,
},
transform: {
filter: { id: '*.js' },
filter: { id: '**/*.js' },
handler: transformWithId,
},
},
Expand Down Expand Up @@ -97,15 +97,15 @@ describe('hook filter with build', async () => {
{
name: 'test',
resolveId: {
filter: { id: '*.js' },
filter: { id: /\.js$/ },
handler: resolveId,
},
load: {
filter: { id: '*.js' },
filter: { id: '**/*.js' },
handler: load,
},
transform: {
filter: { id: '*.js' },
filter: { id: '**/*.js' },
handler: transformWithId,
},
},
Expand Down
13 changes: 10 additions & 3 deletions packages/vite/src/node/__tests__/plugins/pluginFilter.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ describe('createIdFilter', () => {
cases: [
{ id: 'foo.js', expected: true },
{ id: 'foo.ts', expected: FALLBACK_FALSE },
{ id: path.resolve('foo.js'), expected: true },
{ id: '\0foo.js', expected: FALLBACK_FALSE },
{ id: '\0' + path.resolve('foo.js'), expected: FALLBACK_FALSE },
],
Expand Down Expand Up @@ -111,11 +110,15 @@ describe('createIdFilter', () => {
{ id: 'foo.ts', expected: false },
],
},
{
inputFilter: '/virtual/foo',
cases: [{ id: '/virtual/foo', expected: true }],
},
]

for (const filter of filters) {
test(`${util.inspect(filter.inputFilter)}`, () => {
const idFilter = createIdFilter(filter.inputFilter)
const idFilter = createIdFilter(filter.inputFilter, '')
if (!filter.cases) {
expect(idFilter).toBeUndefined()
return
Expand Down Expand Up @@ -264,7 +267,11 @@ describe('createFilterForTransform', () => {
for (const filter of filters) {
test(`${util.inspect(filter.inputFilter)}`, () => {
const [idFilter, codeFilter] = filter.inputFilter
const filterForTransform = createFilterForTransform(idFilter, codeFilter)
const filterForTransform = createFilterForTransform(
idFilter,
codeFilter,
'',
)
if (!filter.cases) {
expect(filterForTransform).toBeUndefined()
return
Expand Down
2 changes: 1 addition & 1 deletion packages/vite/src/node/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ export interface Plugin<A = any> extends RollupPlugin<A> {
isEntry: boolean
},
) => Promise<ResolveIdResult> | ResolveIdResult,
{ filter?: { id?: StringFilter } }
{ filter?: { id?: StringFilter<RegExp> } }
>
load?: ObjectHook<
(
Expand Down
39 changes: 26 additions & 13 deletions packages/vite/src/node/plugins/pluginFilter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,32 @@ export type PluginFilterWithFallback = (
) => boolean | FallbackValues
export type TransformHookFilter = (id: string, code: string) => boolean

export type StringFilter =
| string
| RegExp
| Array<string | RegExp>
export type StringFilter<Value = string | RegExp> =
| Value
| Array<Value>
| {
include?: string | RegExp | Array<string | RegExp>
exclude?: string | RegExp | Array<string | RegExp>
include?: Value | Array<Value>
exclude?: Value | Array<Value>
}

type NormalizedStringFilter = {
include?: Array<string | RegExp>
exclude?: Array<string | RegExp>
}

function patternToIdFilter(pattern: string | RegExp): PluginFilter {
function getMatcherString(glob: string, cwd: string) {
if (glob.startsWith('**') || path.isAbsolute(glob)) {
return slash(glob)
}

const resolved = path.join(cwd, glob)
return slash(resolved)
}

function patternToIdFilter(
pattern: string | RegExp,
cwd: string,
): PluginFilter {
if (pattern instanceof RegExp) {
return (id: string) => {
const normalizedId = slash(id)
Expand All @@ -37,10 +48,10 @@ function patternToIdFilter(pattern: string | RegExp): PluginFilter {
}
}

const cwd = process.cwd()
const matcher = picomatch(pattern, { dot: true })
const glob = getMatcherString(pattern, cwd)
const matcher = picomatch(glob, { dot: true })
return (id: string) => {
const normalizedId = slash(path.relative(cwd, id))
const normalizedId = slash(id)
return matcher(normalizedId)
}
}
Expand Down Expand Up @@ -94,11 +105,12 @@ function normalizeFilter(filter: StringFilter): NormalizedStringFilter {

export function createIdFilter(
filter: StringFilter | undefined,
cwd = process.cwd(),
): PluginFilterWithFallback | undefined {
if (!filter) return
const { exclude, include } = normalizeFilter(filter)
const excludeFilter = exclude?.map(patternToIdFilter)
const includeFilter = include?.map(patternToIdFilter)
const excludeFilter = exclude?.map((p) => patternToIdFilter(p, cwd))
const includeFilter = include?.map((p) => patternToIdFilter(p, cwd))
return createFilter(excludeFilter, includeFilter)
}

Expand All @@ -115,9 +127,10 @@ export function createCodeFilter(
export function createFilterForTransform(
idFilter: StringFilter | undefined,
codeFilter: StringFilter | undefined,
cwd?: string,
): TransformHookFilter | undefined {
if (!idFilter && !codeFilter) return
const idFilterFn = createIdFilter(idFilter)
const idFilterFn = createIdFilter(idFilter, cwd)
const codeFilterFn = createCodeFilter(codeFilter)
return (id, code) => {
let fallback = true
Expand Down