diff --git a/packages/vite/src/node/__tests__/plugins/dynamicImportVar/__snapshots__/parse.test.ts.snap b/packages/vite/src/node/__tests__/plugins/dynamicImportVar/__snapshots__/parse.spec.ts.snap similarity index 90% rename from packages/vite/src/node/__tests__/plugins/dynamicImportVar/__snapshots__/parse.test.ts.snap rename to packages/vite/src/node/__tests__/plugins/dynamicImportVar/__snapshots__/parse.spec.ts.snap index 2aabc471889efc..adb31a0a1daa6e 100644 --- a/packages/vite/src/node/__tests__/plugins/dynamicImportVar/__snapshots__/parse.test.ts.snap +++ b/packages/vite/src/node/__tests__/plugins/dynamicImportVar/__snapshots__/parse.spec.ts.snap @@ -14,6 +14,8 @@ exports[`parse positives > with ../ and itself 1`] = `"__variableDynamicImportRu exports[`parse positives > with multi ../ and itself 1`] = `"__variableDynamicImportRuntimeHelper((import.meta.glob(\\"../../plugins/dynamicImportVar/*.js\\")), \`./\${name}.js\`)"`; +exports[`parse positives > with query 1`] = `"__variableDynamicImportRuntimeHelper((import.meta.glob(\\"./mods/*.js\\", {\\"query\\":{\\"foo\\":\\"bar\\"}})), \`./mods/\${base}.js\`)"`; + exports[`parse positives > with query raw 1`] = `"__variableDynamicImportRuntimeHelper((import.meta.glob(\\"./mods/*.js\\", {\\"as\\":\\"raw\\",\\"import\\":\\"*\\"})), \`./mods/\${base}.js\`)"`; exports[`parse positives > with query url 1`] = `"__variableDynamicImportRuntimeHelper((import.meta.glob(\\"./mods/*.js\\", {\\"as\\":\\"url\\",\\"import\\":\\"*\\"})), \`./mods/\${base}.js\`)"`; diff --git a/packages/vite/src/node/__tests__/plugins/dynamicImportVar/parse.test.ts b/packages/vite/src/node/__tests__/plugins/dynamicImportVar/parse.spec.ts similarity index 94% rename from packages/vite/src/node/__tests__/plugins/dynamicImportVar/parse.test.ts rename to packages/vite/src/node/__tests__/plugins/dynamicImportVar/parse.spec.ts index f8a94f226798f5..67e6facee82747 100644 --- a/packages/vite/src/node/__tests__/plugins/dynamicImportVar/parse.test.ts +++ b/packages/vite/src/node/__tests__/plugins/dynamicImportVar/parse.spec.ts @@ -26,6 +26,10 @@ describe('parse positives', () => { expect(await run('`@/${base}.js`')).toMatchSnapshot() }) + it('with query', async () => { + expect(await run('`./mods/${base}.js?foo=bar`')).toMatchSnapshot() + }) + it('with query raw', async () => { expect(await run('`./mods/${base}.js?raw`')).toMatchSnapshot() }) diff --git a/packages/vite/src/node/plugins/dynamicImportVars.ts b/packages/vite/src/node/plugins/dynamicImportVars.ts index 19d0f5c6342ec6..fbd12eb49b8afc 100644 --- a/packages/vite/src/node/plugins/dynamicImportVars.ts +++ b/packages/vite/src/node/plugins/dynamicImportVars.ts @@ -29,6 +29,8 @@ const hasDynamicImportRE = /\bimport\s*[(/]/ interface DynamicImportRequest { as?: keyof KnownAsTypeMap + query?: Record + import?: string } interface DynamicImportPattern { @@ -55,6 +57,7 @@ function parseDynamicImportPattern( const filename = strings.slice(1, -1) const rawQuery = parseRequest(filename) let globParams: DynamicImportRequest | null = null + const ast = ( parseJS(strings, { ecmaVersion: 'latest', @@ -70,16 +73,19 @@ function parseDynamicImportPattern( const [userPattern] = userPatternQuery.split(requestQuerySplitRE, 2) const [rawPattern] = filename.split(requestQuerySplitRE, 2) - if (rawQuery?.raw !== undefined) { - globParams = { as: 'raw' } - } - - if (rawQuery?.url !== undefined) { - globParams = { as: 'url' } - } + const as = (['worker', 'url', 'raw'] as const).find( + (key) => rawQuery && key in rawQuery, + ) - if (rawQuery?.worker !== undefined) { - globParams = { as: 'worker' } + if (as) { + globParams = { + as, + import: '*', + } + } else if (rawQuery) { + globParams = { + query: rawQuery, + } } return { @@ -121,9 +127,7 @@ export async function transformDynamicImport( return null } const { globParams, rawPattern, userPattern } = dynamicImportPattern - const params = globParams - ? `, ${JSON.stringify({ ...globParams, import: '*' })}` - : '' + const params = globParams ? `, ${JSON.stringify(globParams)}` : '' let newRawPattern = posix.relative( posix.dirname(importer),