From 2d8ce610aba520a6232a16eb385c9d22efa4e51a Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 08:52:48 +0800 Subject: [PATCH 01/19] wip: alias with import.meta.glob --- packages/playground/glob-import/dir/index.js | 3 +- .../playground/glob-import/vite.config.ts | 10 ++++ packages/vite/src/node/importGlob.ts | 47 ++++++++++++------- .../vite/src/node/plugins/importAnalysis.ts | 3 +- .../src/node/plugins/importAnalysisBuild.ts | 1 + 5 files changed, 45 insertions(+), 19 deletions(-) create mode 100644 packages/playground/glob-import/vite.config.ts diff --git a/packages/playground/glob-import/dir/index.js b/packages/playground/glob-import/dir/index.js index d13d470e2b2b80..78b1d1ffb48d67 100644 --- a/packages/playground/glob-import/dir/index.js +++ b/packages/playground/glob-import/dir/index.js @@ -1,3 +1,4 @@ const modules = import.meta.globEager('./*.(js|ts)') +const globWithAlias = import.meta.globEager("@asset/foo.js") -export { modules } +export { modules, globWithAlias } diff --git a/packages/playground/glob-import/vite.config.ts b/packages/playground/glob-import/vite.config.ts new file mode 100644 index 00000000000000..0d9fe8049795d1 --- /dev/null +++ b/packages/playground/glob-import/vite.config.ts @@ -0,0 +1,10 @@ +import path from "path" +import { defineConfig } from "vite" + +export default defineConfig({ + resolve: { + alias: { + "@asset": path.resolve("../assets/") + } + } +}) diff --git a/packages/vite/src/node/importGlob.ts b/packages/vite/src/node/importGlob.ts index 9ccadd8739ff61..1f8e948a05fc8f 100644 --- a/packages/vite/src/node/importGlob.ts +++ b/packages/vite/src/node/importGlob.ts @@ -6,7 +6,7 @@ import { preloadMarker } from './plugins/importAnalysisBuild' import { cleanUrl } from './utils' -import { RollupError } from 'rollup' +import { ResolvedId, RollupError } from 'rollup' export async function transformImportGlob( source: string, @@ -15,6 +15,7 @@ export async function transformImportGlob( importIndex: number, root: string, normalizeUrl?: (url: string, pos: number) => Promise<[string, string]>, + resolve?: (url: string) => Promise, preload = true ): Promise<{ importsString: string @@ -39,26 +40,38 @@ export async function transformImportGlob( const importerBasename = path.basename(importer) let [pattern, endIndex] = lexGlobPattern(source, pos) - if (!pattern.startsWith('.') && !pattern.startsWith('/')) { - throw err(`pattern must start with "." or "/" (relative to project root)`) - } - let base: string + + let base: string = "" let parentDepth = 0 - const isAbsolute = pattern.startsWith('/') - if (isAbsolute) { - base = path.resolve(root) - pattern = pattern.slice(1) - } else { - base = path.dirname(importer) - while (pattern.startsWith('../')) { - pattern = pattern.slice(3) - base = path.resolve(base, '../') - parentDepth++ + let isAbsolute: boolean + if (pattern.startsWith('.') || pattern.startsWith('/')) { + isAbsolute = pattern.startsWith('/') + if (isAbsolute) { + base = path.resolve(root) + pattern = pattern.slice(1) + } else { + base = path.dirname(importer) + while (pattern.startsWith('../')) { + pattern = pattern.slice(3) + base = path.resolve(base, '../') + parentDepth++ + } + if (pattern.startsWith('./')) { + pattern = pattern.slice(2) + } } - if (pattern.startsWith('./')) { - pattern = pattern.slice(2) + } else if (resolve) { + const resolveId = await resolve(pattern) + if (resolveId) { + isAbsolute = true + base = resolveId.id + } else { + throw err(`pattern must start with "." or "/" (relative to project root) or alias path`) } + } else { + throw err(`pattern must start with "." or "/" (relative to project root) or alias path`) } + const files = glob.sync(pattern, { cwd: base, ignore: ['**/node_modules/**'] diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index 13bb8967279af1..b21421d84c31bf 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -327,7 +327,8 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { importer, index, root, - normalizeUrl + normalizeUrl, + (url) => this.resolve(url, importer, { custom: config.plugins }) ) str().prepend(importsString) str().overwrite(expStart, endIndex, exp) diff --git a/packages/vite/src/node/plugins/importAnalysisBuild.ts b/packages/vite/src/node/plugins/importAnalysisBuild.ts index d3a7229d4eb777..08aa21d78f8ff6 100644 --- a/packages/vite/src/node/plugins/importAnalysisBuild.ts +++ b/packages/vite/src/node/plugins/importAnalysisBuild.ts @@ -155,6 +155,7 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin { index, config.root, undefined, + (url) => this.resolve(url, importer, { custom: config.plugins }), insertPreload ) str().prepend(importsString) From fe47fd6a37cc2fb2c7f03d32cefebd3c43147f5c Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 09:54:33 +0800 Subject: [PATCH 02/19] feat: format import.meta.glob relative pattern --- packages/playground/assets/foo.js | 2 + packages/playground/glob-import/dir/index.js | 2 +- packages/vite/src/node/importGlob.ts | 46 +++++++++++++++----- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/packages/playground/assets/foo.js b/packages/playground/assets/foo.js index 6687898e2a0fe2..6d70ba379e1563 100644 --- a/packages/playground/assets/foo.js +++ b/packages/playground/assets/foo.js @@ -1 +1,3 @@ console.log('hi') + +// also used by playground/glob-import diff --git a/packages/playground/glob-import/dir/index.js b/packages/playground/glob-import/dir/index.js index 78b1d1ffb48d67..0efb254fce7a72 100644 --- a/packages/playground/glob-import/dir/index.js +++ b/packages/playground/glob-import/dir/index.js @@ -1,4 +1,4 @@ const modules = import.meta.globEager('./*.(js|ts)') -const globWithAlias = import.meta.globEager("@asset/foo.js") +const globWithAlias = import.meta.glob("@asset/foo.js") export { modules, globWithAlias } diff --git a/packages/vite/src/node/importGlob.ts b/packages/vite/src/node/importGlob.ts index 1f8e948a05fc8f..7b2605a3c1bdcc 100644 --- a/packages/vite/src/node/importGlob.ts +++ b/packages/vite/src/node/importGlob.ts @@ -5,9 +5,26 @@ import { preloadMethod, preloadMarker } from './plugins/importAnalysisBuild' -import { cleanUrl } from './utils' +import { cleanUrl, normalizePath } from './utils' import { ResolvedId, RollupError } from 'rollup' +function formatGlobRelativePattern ( + base: string, + pattern: string, +) { + let parentDepth = 0 + while (pattern.startsWith('../')) { + pattern = pattern.slice(3) + base = path.resolve(base, '../') + parentDepth++ + } + if (pattern.startsWith('./')) { + pattern = pattern.slice(2) + } + + return { base, pattern, parentDepth } +} + export async function transformImportGlob( source: string, pos: number, @@ -50,21 +67,26 @@ export async function transformImportGlob( base = path.resolve(root) pattern = pattern.slice(1) } else { - base = path.dirname(importer) - while (pattern.startsWith('../')) { - pattern = pattern.slice(3) - base = path.resolve(base, '../') - parentDepth++ - } - if (pattern.startsWith('./')) { - pattern = pattern.slice(2) - } + const formatGlobResult = formatGlobRelativePattern( + path.dirname(importer), + pattern + ) + base = formatGlobResult.base + pattern = formatGlobResult.pattern + parentDepth = formatGlobResult.parentDepth } } else if (resolve) { const resolveId = await resolve(pattern) if (resolveId) { - isAbsolute = true - base = resolveId.id + isAbsolute = false + base = path.dirname(importer) + const formatGlobResult = formatGlobRelativePattern( + base, + normalizePath(path.relative(base, resolveId.id)) + ) + base = formatGlobResult.base + pattern = formatGlobResult.pattern + parentDepth = formatGlobResult.parentDepth } else { throw err(`pattern must start with "." or "/" (relative to project root) or alias path`) } From 426c30c2c3b9940369025852bcdfce3001ba80ca Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 10:02:29 +0800 Subject: [PATCH 03/19] test: alias --- packages/playground/assets/foo.js | 1 + .../playground/glob-import/__tests__/glob-import.spec.ts | 5 +++++ packages/playground/glob-import/dir/index.js | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/playground/assets/foo.js b/packages/playground/assets/foo.js index 6d70ba379e1563..17a6046ec96fbf 100644 --- a/packages/playground/assets/foo.js +++ b/packages/playground/assets/foo.js @@ -1,3 +1,4 @@ console.log('hi') // also used by playground/glob-import +export default 'hi' diff --git a/packages/playground/glob-import/__tests__/glob-import.spec.ts b/packages/playground/glob-import/__tests__/glob-import.spec.ts index 4377f7961ef229..d4ca93e5ed4405 100644 --- a/packages/playground/glob-import/__tests__/glob-import.spec.ts +++ b/packages/playground/glob-import/__tests__/glob-import.spec.ts @@ -35,6 +35,11 @@ const allResult = { msg: 'foo' }, '/dir/index.js': { + "globWithAlias": { + "../../assets/foo.js": { + "default": "hi" + } + }, modules: filteredResult }, '/dir/nested/bar.js': { diff --git a/packages/playground/glob-import/dir/index.js b/packages/playground/glob-import/dir/index.js index 0efb254fce7a72..78b1d1ffb48d67 100644 --- a/packages/playground/glob-import/dir/index.js +++ b/packages/playground/glob-import/dir/index.js @@ -1,4 +1,4 @@ const modules = import.meta.globEager('./*.(js|ts)') -const globWithAlias = import.meta.glob("@asset/foo.js") +const globWithAlias = import.meta.globEager("@asset/foo.js") export { modules, globWithAlias } From 2bce4785bfecbe7e2eb87ff488997af63cf5c936 Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 10:03:18 +0800 Subject: [PATCH 04/19] chore: format --- .../glob-import/__tests__/glob-import.spec.ts | 6 +++--- packages/playground/glob-import/dir/index.js | 2 +- packages/playground/glob-import/vite.config.ts | 6 +++--- packages/vite/src/node/importGlob.ts | 15 ++++++++------- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/playground/glob-import/__tests__/glob-import.spec.ts b/packages/playground/glob-import/__tests__/glob-import.spec.ts index d4ca93e5ed4405..a52766ae57e510 100644 --- a/packages/playground/glob-import/__tests__/glob-import.spec.ts +++ b/packages/playground/glob-import/__tests__/glob-import.spec.ts @@ -35,9 +35,9 @@ const allResult = { msg: 'foo' }, '/dir/index.js': { - "globWithAlias": { - "../../assets/foo.js": { - "default": "hi" + globWithAlias: { + '../../assets/foo.js': { + default: 'hi' } }, modules: filteredResult diff --git a/packages/playground/glob-import/dir/index.js b/packages/playground/glob-import/dir/index.js index 78b1d1ffb48d67..6f9675ab49e115 100644 --- a/packages/playground/glob-import/dir/index.js +++ b/packages/playground/glob-import/dir/index.js @@ -1,4 +1,4 @@ const modules = import.meta.globEager('./*.(js|ts)') -const globWithAlias = import.meta.globEager("@asset/foo.js") +const globWithAlias = import.meta.globEager('@asset/foo.js') export { modules, globWithAlias } diff --git a/packages/playground/glob-import/vite.config.ts b/packages/playground/glob-import/vite.config.ts index 0d9fe8049795d1..ea85864dd7c450 100644 --- a/packages/playground/glob-import/vite.config.ts +++ b/packages/playground/glob-import/vite.config.ts @@ -1,10 +1,10 @@ -import path from "path" -import { defineConfig } from "vite" +import path from 'path' +import { defineConfig } from 'vite' export default defineConfig({ resolve: { alias: { - "@asset": path.resolve("../assets/") + '@asset': path.resolve('../assets/') } } }) diff --git a/packages/vite/src/node/importGlob.ts b/packages/vite/src/node/importGlob.ts index 7b2605a3c1bdcc..d40765f4c93ef7 100644 --- a/packages/vite/src/node/importGlob.ts +++ b/packages/vite/src/node/importGlob.ts @@ -8,10 +8,7 @@ import { import { cleanUrl, normalizePath } from './utils' import { ResolvedId, RollupError } from 'rollup' -function formatGlobRelativePattern ( - base: string, - pattern: string, -) { +function formatGlobRelativePattern(base: string, pattern: string) { let parentDepth = 0 while (pattern.startsWith('../')) { pattern = pattern.slice(3) @@ -58,7 +55,7 @@ export async function transformImportGlob( let [pattern, endIndex] = lexGlobPattern(source, pos) - let base: string = "" + let base: string = '' let parentDepth = 0 let isAbsolute: boolean if (pattern.startsWith('.') || pattern.startsWith('/')) { @@ -88,10 +85,14 @@ export async function transformImportGlob( pattern = formatGlobResult.pattern parentDepth = formatGlobResult.parentDepth } else { - throw err(`pattern must start with "." or "/" (relative to project root) or alias path`) + throw err( + `pattern must start with "." or "/" (relative to project root) or alias path` + ) } } else { - throw err(`pattern must start with "." or "/" (relative to project root) or alias path`) + throw err( + `pattern must start with "." or "/" (relative to project root) or alias path` + ) } const files = glob.sync(pattern, { From 88ef37ee80d3d90a6a82cce944db88ab5c27e0a6 Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 10:19:41 +0800 Subject: [PATCH 05/19] chore: resolve method params --- packages/vite/src/node/importGlob.ts | 6 +++--- packages/vite/src/node/plugins/importAnalysis.ts | 7 ++++++- packages/vite/src/node/plugins/importAnalysisBuild.ts | 7 ++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/vite/src/node/importGlob.ts b/packages/vite/src/node/importGlob.ts index d40765f4c93ef7..4426c807f9aa69 100644 --- a/packages/vite/src/node/importGlob.ts +++ b/packages/vite/src/node/importGlob.ts @@ -29,7 +29,7 @@ export async function transformImportGlob( importIndex: number, root: string, normalizeUrl?: (url: string, pos: number) => Promise<[string, string]>, - resolve?: (url: string) => Promise, + resolve?: (url: string, importer?: string) => Promise, preload = true ): Promise<{ importsString: string @@ -73,13 +73,13 @@ export async function transformImportGlob( parentDepth = formatGlobResult.parentDepth } } else if (resolve) { - const resolveId = await resolve(pattern) + const resolveId = await resolve(pattern, importer) if (resolveId) { isAbsolute = false base = path.dirname(importer) const formatGlobResult = formatGlobRelativePattern( base, - normalizePath(path.relative(base, resolveId.id)) + normalizePath(path.relative(base, resolveId)) ) base = formatGlobResult.base pattern = formatGlobResult.pattern diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index b21421d84c31bf..b3dc8af18383ee 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -328,7 +328,12 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { index, root, normalizeUrl, - (url) => this.resolve(url, importer, { custom: config.plugins }) + async (url, importer) => { + const resolveId = await this.resolve(url, importer, { + custom: config.plugins + }) + return resolveId?.id + } ) str().prepend(importsString) str().overwrite(expStart, endIndex, exp) diff --git a/packages/vite/src/node/plugins/importAnalysisBuild.ts b/packages/vite/src/node/plugins/importAnalysisBuild.ts index 08aa21d78f8ff6..eb41cb03e55685 100644 --- a/packages/vite/src/node/plugins/importAnalysisBuild.ts +++ b/packages/vite/src/node/plugins/importAnalysisBuild.ts @@ -155,7 +155,12 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin { index, config.root, undefined, - (url) => this.resolve(url, importer, { custom: config.plugins }), + async (url, importer) => { + const resolveId = await this.resolve(url, importer, { + custom: config.plugins + }) + return resolveId?.id + }, insertPreload ) str().prepend(importsString) From cb0c22f66e18703cc167c72c49a578b209bda026 Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 10:39:55 +0800 Subject: [PATCH 06/19] fix: unless import --- packages/vite/src/node/importGlob.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/importGlob.ts b/packages/vite/src/node/importGlob.ts index 4426c807f9aa69..380b87aa65b2d6 100644 --- a/packages/vite/src/node/importGlob.ts +++ b/packages/vite/src/node/importGlob.ts @@ -6,7 +6,7 @@ import { preloadMarker } from './plugins/importAnalysisBuild' import { cleanUrl, normalizePath } from './utils' -import { ResolvedId, RollupError } from 'rollup' +import { RollupError } from 'rollup' function formatGlobRelativePattern(base: string, pattern: string) { let parentDepth = 0 From 7d90b8ec3ce68fa55e2426c710bf497d536541c2 Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 10:51:30 +0800 Subject: [PATCH 07/19] test: use playground glob --- packages/playground/assets/foo.js | 3 --- .../glob-import/__tests__/glob-import.spec.ts | 7 +++++-- packages/playground/glob-import/dir/alias.js | 1 + packages/playground/glob-import/dir/index.js | 2 +- packages/playground/glob-import/vite.config.ts | 2 +- packages/vite/src/node/optimizer/scan.ts | 11 +++++++---- 6 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 packages/playground/glob-import/dir/alias.js diff --git a/packages/playground/assets/foo.js b/packages/playground/assets/foo.js index 17a6046ec96fbf..6687898e2a0fe2 100644 --- a/packages/playground/assets/foo.js +++ b/packages/playground/assets/foo.js @@ -1,4 +1 @@ console.log('hi') - -// also used by playground/glob-import -export default 'hi' diff --git a/packages/playground/glob-import/__tests__/glob-import.spec.ts b/packages/playground/glob-import/__tests__/glob-import.spec.ts index a52766ae57e510..370ebe4807192e 100644 --- a/packages/playground/glob-import/__tests__/glob-import.spec.ts +++ b/packages/playground/glob-import/__tests__/glob-import.spec.ts @@ -9,6 +9,9 @@ import { const filteredResult = { './foo.js': { msg: 'foo' + }, + './alias.js': { + 'default': 'hi' } } @@ -36,8 +39,8 @@ const allResult = { }, '/dir/index.js': { globWithAlias: { - '../../assets/foo.js': { - default: 'hi' + './alias.js': { + 'default': 'hi' } }, modules: filteredResult diff --git a/packages/playground/glob-import/dir/alias.js b/packages/playground/glob-import/dir/alias.js new file mode 100644 index 00000000000000..9c533d93b9a98a --- /dev/null +++ b/packages/playground/glob-import/dir/alias.js @@ -0,0 +1 @@ +export default 'hi' diff --git a/packages/playground/glob-import/dir/index.js b/packages/playground/glob-import/dir/index.js index 6f9675ab49e115..345f96a466299f 100644 --- a/packages/playground/glob-import/dir/index.js +++ b/packages/playground/glob-import/dir/index.js @@ -1,4 +1,4 @@ const modules = import.meta.globEager('./*.(js|ts)') -const globWithAlias = import.meta.globEager('@asset/foo.js') +const globWithAlias = import.meta.globEager('@dir/alias.js') export { modules, globWithAlias } diff --git a/packages/playground/glob-import/vite.config.ts b/packages/playground/glob-import/vite.config.ts index ea85864dd7c450..64b430a80a18ce 100644 --- a/packages/playground/glob-import/vite.config.ts +++ b/packages/playground/glob-import/vite.config.ts @@ -4,7 +4,7 @@ import { defineConfig } from 'vite' export default defineConfig({ resolve: { alias: { - '@asset': path.resolve('../assets/') + '@dir': path.resolve('../dir/') } } }) diff --git a/packages/vite/src/node/optimizer/scan.ts b/packages/vite/src/node/optimizer/scan.ts index 5367df30bb9af3..7584ec5a9454f9 100644 --- a/packages/vite/src/node/optimizer/scan.ts +++ b/packages/vite/src/node/optimizer/scan.ts @@ -310,7 +310,7 @@ function esbuildScanPlugin( return { // transformGlob already transforms to js loader: 'js', - contents: await transformGlob(js, path, config.root, loader) + contents: await transformGlob(js, path, config.root, loader, resolve) } } @@ -427,7 +427,7 @@ function esbuildScanPlugin( } if (contents.includes('import.meta.glob')) { - return transformGlob(contents, id, config.root, ext as Loader).then( + return transformGlob(contents, id, config.root, ext as Loader, resolve).then( (contents) => ({ loader: ext as Loader, contents @@ -447,7 +447,8 @@ async function transformGlob( source: string, importer: string, root: string, - loader: Loader + loader: Loader, + resolve: (url: string, importer?: string) => Promise, ) { // transform the content first since es-module-lexer can't handle non-js if (loader !== 'js') { @@ -467,7 +468,9 @@ async function transformGlob( start, normalizePath(importer), index, - root + root, + undefined, + resolve ) s.prepend(importsString) s.overwrite(expStart, endIndex, exp) From a2136b12294371a18353b27ece1ba18e5001fcc4 Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 11:02:11 +0800 Subject: [PATCH 08/19] fix: alias option --- packages/playground/glob-import/vite.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/playground/glob-import/vite.config.ts b/packages/playground/glob-import/vite.config.ts index 64b430a80a18ce..34f6ac6ff869b0 100644 --- a/packages/playground/glob-import/vite.config.ts +++ b/packages/playground/glob-import/vite.config.ts @@ -4,7 +4,7 @@ import { defineConfig } from 'vite' export default defineConfig({ resolve: { alias: { - '@dir': path.resolve('../dir/') + '@dir': path.resolve('./dir/') } } }) From b55dfa4ec706f3715615d9db5e1a18111eea905e Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 11:02:49 +0800 Subject: [PATCH 09/19] chore: format --- .../glob-import/__tests__/glob-import.spec.ts | 4 +-- packages/vite/src/node/optimizer/scan.ts | 26 +++++++++++++------ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/packages/playground/glob-import/__tests__/glob-import.spec.ts b/packages/playground/glob-import/__tests__/glob-import.spec.ts index 370ebe4807192e..18a73334f07cf9 100644 --- a/packages/playground/glob-import/__tests__/glob-import.spec.ts +++ b/packages/playground/glob-import/__tests__/glob-import.spec.ts @@ -11,7 +11,7 @@ const filteredResult = { msg: 'foo' }, './alias.js': { - 'default': 'hi' + default: 'hi' } } @@ -40,7 +40,7 @@ const allResult = { '/dir/index.js': { globWithAlias: { './alias.js': { - 'default': 'hi' + default: 'hi' } }, modules: filteredResult diff --git a/packages/vite/src/node/optimizer/scan.ts b/packages/vite/src/node/optimizer/scan.ts index 7584ec5a9454f9..3263e154186ce6 100644 --- a/packages/vite/src/node/optimizer/scan.ts +++ b/packages/vite/src/node/optimizer/scan.ts @@ -310,7 +310,13 @@ function esbuildScanPlugin( return { // transformGlob already transforms to js loader: 'js', - contents: await transformGlob(js, path, config.root, loader, resolve) + contents: await transformGlob( + js, + path, + config.root, + loader, + resolve + ) } } @@ -427,12 +433,16 @@ function esbuildScanPlugin( } if (contents.includes('import.meta.glob')) { - return transformGlob(contents, id, config.root, ext as Loader, resolve).then( - (contents) => ({ - loader: ext as Loader, - contents - }) - ) + return transformGlob( + contents, + id, + config.root, + ext as Loader, + resolve + ).then((contents) => ({ + loader: ext as Loader, + contents + })) } return { loader: ext as Loader, @@ -448,7 +458,7 @@ async function transformGlob( importer: string, root: string, loader: Loader, - resolve: (url: string, importer?: string) => Promise, + resolve: (url: string, importer?: string) => Promise ) { // transform the content first since es-module-lexer can't handle non-js if (loader !== 'js') { From b2bc11da48ff9de276eda2c659a414d2f40bd23b Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 11:39:30 +0800 Subject: [PATCH 10/19] fix: test path --- .../playground/glob-import/__tests__/glob-import.spec.ts | 9 ++++++--- packages/playground/glob-import/vite.config.ts | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/playground/glob-import/__tests__/glob-import.spec.ts b/packages/playground/glob-import/__tests__/glob-import.spec.ts index 18a73334f07cf9..3dcb43bd6a96f7 100644 --- a/packages/playground/glob-import/__tests__/glob-import.spec.ts +++ b/packages/playground/glob-import/__tests__/glob-import.spec.ts @@ -7,11 +7,11 @@ import { } from '../../testUtils' const filteredResult = { - './foo.js': { - msg: 'foo' - }, './alias.js': { default: 'hi' + }, + './foo.js': { + msg: 'foo' } } @@ -33,6 +33,9 @@ const json = isBuild const allResult = { // JSON file should be properly transformed + '/dir/alias.js': { + default: 'hi' + }, '/dir/baz.json': json, '/dir/foo.js': { msg: 'foo' diff --git a/packages/playground/glob-import/vite.config.ts b/packages/playground/glob-import/vite.config.ts index 34f6ac6ff869b0..abc75b51656503 100644 --- a/packages/playground/glob-import/vite.config.ts +++ b/packages/playground/glob-import/vite.config.ts @@ -4,7 +4,7 @@ import { defineConfig } from 'vite' export default defineConfig({ resolve: { alias: { - '@dir': path.resolve('./dir/') + '@dir': path.resolve(__dirname, './dir/') } } }) From a28a91aee897bd9d3bcee7f98467274224d583d3 Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 11:50:21 +0800 Subject: [PATCH 11/19] fix: hmr result --- packages/playground/glob-import/__tests__/glob-import.spec.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/playground/glob-import/__tests__/glob-import.spec.ts b/packages/playground/glob-import/__tests__/glob-import.spec.ts index 3dcb43bd6a96f7..8a13e03f06af58 100644 --- a/packages/playground/glob-import/__tests__/glob-import.spec.ts +++ b/packages/playground/glob-import/__tests__/glob-import.spec.ts @@ -72,6 +72,7 @@ if (!isBuild) { '/dir/a.js': {}, ...allResult, '/dir/index.js': { + ...allResult['/dir/index.js'], modules: { './a.js': {}, ...allResult['/dir/index.js'].modules @@ -94,6 +95,7 @@ if (!isBuild) { }, ...allResult, '/dir/index.js': { + ...allResult['/dir/index.js'], modules: { './a.js': { msg: 'a' From 96d198f9a300ec4223f4e2891de5c04df3f70f00 Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 16:33:37 +0800 Subject: [PATCH 12/19] test: feat * path test --- packages/playground/glob-import/dir/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/playground/glob-import/dir/index.js b/packages/playground/glob-import/dir/index.js index 345f96a466299f..fb87f69f0f3a61 100644 --- a/packages/playground/glob-import/dir/index.js +++ b/packages/playground/glob-import/dir/index.js @@ -1,4 +1,4 @@ const modules = import.meta.globEager('./*.(js|ts)') -const globWithAlias = import.meta.globEager('@dir/alias.js') +const globWithAlias = import.meta.globEager('@dir/al*.js') export { modules, globWithAlias } From 8a06d40fe5f58f40d5073ff329e22827f3a919aa Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 17:19:08 +0800 Subject: [PATCH 13/19] fix: nice naming Co-authored-by: Bjorn Lu --- packages/vite/src/node/importGlob.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/importGlob.ts b/packages/vite/src/node/importGlob.ts index 380b87aa65b2d6..5ee2cdfeba6b6b 100644 --- a/packages/vite/src/node/importGlob.ts +++ b/packages/vite/src/node/importGlob.ts @@ -73,7 +73,7 @@ export async function transformImportGlob( parentDepth = formatGlobResult.parentDepth } } else if (resolve) { - const resolveId = await resolve(pattern, importer) + const resolvedId = await resolve(pattern, importer) if (resolveId) { isAbsolute = false base = path.dirname(importer) From ad7f1a362aff81b308de5d7d91396e3dc6811ffd Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 17:58:04 +0800 Subject: [PATCH 14/19] refactor: format glob relative pattern --- packages/vite/src/node/importGlob.ts | 73 +++++++++++++++------------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/packages/vite/src/node/importGlob.ts b/packages/vite/src/node/importGlob.ts index 5ee2cdfeba6b6b..8b66231a1d094e 100644 --- a/packages/vite/src/node/importGlob.ts +++ b/packages/vite/src/node/importGlob.ts @@ -19,7 +19,7 @@ function formatGlobRelativePattern(base: string, pattern: string) { pattern = pattern.slice(2) } - return { base, pattern, parentDepth } + return { base, pattern, parentDepth, isAbsolute: false } } export async function transformImportGlob( @@ -53,48 +53,51 @@ export async function transformImportGlob( importer = cleanUrl(importer) const importerBasename = path.basename(importer) - let [pattern, endIndex] = lexGlobPattern(source, pos) - - let base: string = '' - let parentDepth = 0 - let isAbsolute: boolean - if (pattern.startsWith('.') || pattern.startsWith('/')) { - isAbsolute = pattern.startsWith('/') - if (isAbsolute) { - base = path.resolve(root) - pattern = pattern.slice(1) - } else { - const formatGlobResult = formatGlobRelativePattern( - path.dirname(importer), - pattern - ) - base = formatGlobResult.base - pattern = formatGlobResult.pattern - parentDepth = formatGlobResult.parentDepth + const [userPattern, endIndex] = lexGlobPattern(source, pos) + + let globParams: { + base: string + pattern: string + parentDepth: number + isAbsolute: boolean + } = { + base: '', + pattern: userPattern, + parentDepth: 0, + isAbsolute: false + } + const errResolvePattern = err( + `pattern must start with "." or "/" (relative to project root) or alias path` + ) + if (userPattern.startsWith('/')) { + globParams = { + isAbsolute: true, + base: path.resolve(root), + pattern: userPattern.slice(1), + parentDepth: 0 } + } else if (userPattern.startsWith('.')) { + globParams = formatGlobRelativePattern( + path.dirname(importer), + globParams.pattern + ) } else if (resolve) { - const resolvedId = await resolve(pattern, importer) - if (resolveId) { - isAbsolute = false - base = path.dirname(importer) - const formatGlobResult = formatGlobRelativePattern( - base, - normalizePath(path.relative(base, resolveId)) + const resolvedId = await resolve(userPattern, importer) + if (resolvedId) { + const importerDirname = path.dirname(importer) + globParams = formatGlobRelativePattern( + importerDirname, + normalizePath(path.relative(importerDirname, resolvedId)) ) - base = formatGlobResult.base - pattern = formatGlobResult.pattern - parentDepth = formatGlobResult.parentDepth } else { - throw err( - `pattern must start with "." or "/" (relative to project root) or alias path` - ) + throw errResolvePattern } } else { - throw err( - `pattern must start with "." or "/" (relative to project root) or alias path` - ) + throw errResolvePattern } + const { base, parentDepth, isAbsolute, pattern } = globParams + const files = glob.sync(pattern, { cwd: base, ignore: ['**/node_modules/**'] From f65336b76bbab576c9480a9239450c24abbed53e Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 18:00:21 +0800 Subject: [PATCH 15/19] refactor: resolve -> config.createResolver --- packages/vite/src/node/plugins/importAnalysis.ts | 13 ++++++------- .../vite/src/node/plugins/importAnalysisBuild.ts | 12 ++++++------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/packages/vite/src/node/plugins/importAnalysis.ts b/packages/vite/src/node/plugins/importAnalysis.ts index b3dc8af18383ee..310a894034e2f7 100644 --- a/packages/vite/src/node/plugins/importAnalysis.ts +++ b/packages/vite/src/node/plugins/importAnalysis.ts @@ -96,7 +96,11 @@ function markExplicitImport(url: string) { export function importAnalysisPlugin(config: ResolvedConfig): Plugin { const { root, base } = config const clientPublicPath = path.posix.join(base, CLIENT_PUBLIC_PATH) - + const resolve = config.createResolver({ + preferRelative: true, + tryIndex: false, + extensions: [] + }) let server: ViteDevServer return { @@ -328,12 +332,7 @@ export function importAnalysisPlugin(config: ResolvedConfig): Plugin { index, root, normalizeUrl, - async (url, importer) => { - const resolveId = await this.resolve(url, importer, { - custom: config.plugins - }) - return resolveId?.id - } + resolve ) str().prepend(importsString) str().overwrite(expStart, endIndex, exp) diff --git a/packages/vite/src/node/plugins/importAnalysisBuild.ts b/packages/vite/src/node/plugins/importAnalysisBuild.ts index eb41cb03e55685..5491e1e96b967d 100644 --- a/packages/vite/src/node/plugins/importAnalysisBuild.ts +++ b/packages/vite/src/node/plugins/importAnalysisBuild.ts @@ -92,6 +92,11 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin { ? `'modulepreload'` : `(${detectScriptRel.toString()})()` const preloadCode = `const scriptRel = ${scriptRel};const seen = {};const base = '${preloadBaseMarker}';export const ${preloadMethod} = ${preload.toString()}` + const resolve = config.createResolver({ + preferRelative: true, + tryIndex: false, + extensions: [] + }) return { name: 'vite:build-import-analysis', @@ -155,12 +160,7 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): Plugin { index, config.root, undefined, - async (url, importer) => { - const resolveId = await this.resolve(url, importer, { - custom: config.plugins - }) - return resolveId?.id - }, + resolve, insertPreload ) str().prepend(importsString) From 65c0d5dabd246102e91948385ac52fe5c1abec71 Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 18:02:54 +0800 Subject: [PATCH 16/19] refactor: throw pattern no resolve error --- packages/vite/src/node/importGlob.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/vite/src/node/importGlob.ts b/packages/vite/src/node/importGlob.ts index 8b66231a1d094e..b15408c70aecbb 100644 --- a/packages/vite/src/node/importGlob.ts +++ b/packages/vite/src/node/importGlob.ts @@ -66,9 +66,6 @@ export async function transformImportGlob( parentDepth: 0, isAbsolute: false } - const errResolvePattern = err( - `pattern must start with "." or "/" (relative to project root) or alias path` - ) if (userPattern.startsWith('/')) { globParams = { isAbsolute: true, @@ -89,14 +86,15 @@ export async function transformImportGlob( importerDirname, normalizePath(path.relative(importerDirname, resolvedId)) ) - } else { - throw errResolvePattern } - } else { - throw errResolvePattern } const { base, parentDepth, isAbsolute, pattern } = globParams + if (!base) { + throw err( + `pattern must start with "." or "/" (relative to project root) or alias path` + ) + } const files = glob.sync(pattern, { cwd: base, From b7ae345b379883f1db74adfb2cd2ef5dd70d4e0a Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 19 Dec 2021 23:40:31 +0800 Subject: [PATCH 17/19] chore: clean code --- packages/vite/src/node/importGlob.ts | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/vite/src/node/importGlob.ts b/packages/vite/src/node/importGlob.ts index b15408c70aecbb..a31b2f9bc7b9d0 100644 --- a/packages/vite/src/node/importGlob.ts +++ b/packages/vite/src/node/importGlob.ts @@ -8,7 +8,14 @@ import { import { cleanUrl, normalizePath } from './utils' import { RollupError } from 'rollup' -function formatGlobRelativePattern(base: string, pattern: string) { +interface GlobParams { + base: string + pattern: string + parentDepth: number + isAbsolute: boolean +} + +function formatGlobRelativePattern(base: string, pattern: string): GlobParams { let parentDepth = 0 while (pattern.startsWith('../')) { pattern = pattern.slice(3) @@ -55,17 +62,7 @@ export async function transformImportGlob( const [userPattern, endIndex] = lexGlobPattern(source, pos) - let globParams: { - base: string - pattern: string - parentDepth: number - isAbsolute: boolean - } = { - base: '', - pattern: userPattern, - parentDepth: 0, - isAbsolute: false - } + let globParams: GlobParams | null = null if (userPattern.startsWith('/')) { globParams = { isAbsolute: true, @@ -76,7 +73,7 @@ export async function transformImportGlob( } else if (userPattern.startsWith('.')) { globParams = formatGlobRelativePattern( path.dirname(importer), - globParams.pattern + userPattern ) } else if (resolve) { const resolvedId = await resolve(userPattern, importer) @@ -89,12 +86,12 @@ export async function transformImportGlob( } } - const { base, parentDepth, isAbsolute, pattern } = globParams - if (!base) { + if (!globParams) { throw err( `pattern must start with "." or "/" (relative to project root) or alias path` ) } + const { base, parentDepth, isAbsolute, pattern } = globParams const files = glob.sync(pattern, { cwd: base, From 5868b115240980b178ef005ab0e55b4c5cbc3789 Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Mon, 20 Dec 2021 08:04:11 +0800 Subject: [PATCH 18/19] chore: format --- packages/vite/src/node/importGlob.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/vite/src/node/importGlob.ts b/packages/vite/src/node/importGlob.ts index 0013756303716e..7bc9f3ac684c29 100644 --- a/packages/vite/src/node/importGlob.ts +++ b/packages/vite/src/node/importGlob.ts @@ -71,10 +71,7 @@ export async function transformImportGlob( parentDepth: 0 } } else if (userPattern.startsWith('.')) { - globParams = formatGlobRelativePattern( - path.dirname(importer), - userPattern - ) + globParams = formatGlobRelativePattern(path.dirname(importer), userPattern) } else if (resolve) { const resolvedId = await resolve(userPattern, importer) if (resolvedId) { From d0eb60df880b9a5ce7eed10c64afbf15e59f2f13 Mon Sep 17 00:00:00 2001 From: poyoho <907415276@qq.com> Date: Sun, 16 Jan 2022 22:13:26 +0800 Subject: [PATCH 19/19] fix: error rebase --- packages/vite/src/node/importGlob.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/vite/src/node/importGlob.ts b/packages/vite/src/node/importGlob.ts index 106f6c44ddf9a3..4b4af85b674752 100644 --- a/packages/vite/src/node/importGlob.ts +++ b/packages/vite/src/node/importGlob.ts @@ -7,12 +7,7 @@ import { preloadMethod, preloadMarker } from './plugins/importAnalysisBuild' -import { - cleanUrl, - normalizePath, - multilineCommentsRE, - singlelineCommentsRE -} from './utils' +import { cleanUrl, normalizePath } from './utils' import type { RollupError } from 'rollup' interface GlobParams { @@ -224,6 +219,10 @@ function lexGlobPattern( return [pattern, assert, endIndex + 1] } +// reg without the 'g' option, only matches the first match +const multilineCommentsRE = /\/\*(.|[\r\n])*?\*\//m +const singlelineCommentsRE = /\/\/.*/ + function getEndIndex(code: string, i: number): number { const findStart = i const endIndex = code.indexOf(`)`, findStart)