From 79ede21d7193cfe3bbd961e06383fcfe226383f0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 19 Sep 2025 05:27:41 +0000 Subject: [PATCH 1/7] Initial plan From c72611e3d6aea95153fcc97a854574c507caa585 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 19 Sep 2025 05:32:25 +0000 Subject: [PATCH 2/7] Initial setup: reproduce dot folder glob import issue Co-authored-by: sapphi-red <49056869+sapphi-red@users.noreply.github.com> --- playground/glob-import/.foo/test.ts | 1 + playground/glob-import/index.html | 19 +++++++++++++++++++ playground/glob-import/inner/.foo/test.ts | 1 + 3 files changed, 21 insertions(+) create mode 100644 playground/glob-import/.foo/test.ts create mode 100644 playground/glob-import/inner/.foo/test.ts diff --git a/playground/glob-import/.foo/test.ts b/playground/glob-import/.foo/test.ts new file mode 100644 index 00000000000000..63239baf13bdde --- /dev/null +++ b/playground/glob-import/.foo/test.ts @@ -0,0 +1 @@ +export const msg = 'dot-folder-test' diff --git a/playground/glob-import/index.html b/playground/glob-import/index.html index 69f9f2854d5012..20cdf51bd124df 100644 --- a/playground/glob-import/index.html +++ b/playground/glob-import/index.html @@ -29,6 +29,8 @@

In package


 

Base


+

Dot Folder Issue

+

 
 
 
+
+
diff --git a/playground/glob-import/inner/.foo/test.ts b/playground/glob-import/inner/.foo/test.ts
new file mode 100644
index 00000000000000..31c469f3dd7f51
--- /dev/null
+++ b/playground/glob-import/inner/.foo/test.ts
@@ -0,0 +1 @@
+export const msg = 'inner-dot-folder-test'

From dfc28a9d3900fb6919f34fd5d9fa897d51505183 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 19 Sep 2025 05:39:09 +0000
Subject: [PATCH 3/7] Fix: handle glob imports from folders starting with dot

Co-authored-by: sapphi-red <49056869+sapphi-red@users.noreply.github.com>
---
 .../__snapshots__/fixture.spec.ts.snap           |  8 ++++----
 packages/vite/src/node/plugins/importMetaGlob.ts |  2 +-
 .../glob-import/__tests__/glob-import.spec.ts    |  6 +++++-
 playground/glob-import/simple-test.html          | 16 ++++++++++++++++
 4 files changed, 26 insertions(+), 6 deletions(-)
 create mode 100644 playground/glob-import/simple-test.html

diff --git a/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap b/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap
index 1f4c94203e1fb6..a02e55268a9ca7 100644
--- a/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap
+++ b/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap
@@ -81,14 +81,14 @@ export const parent = /* #__PURE__ */ Object.assign({
 
 
 });
-export const rootMixedRelative = /* #__PURE__ */ Object.assign({"/fixture-b/a.ts": () => import("../fixture-b/a.ts?url").then(m => m["default"]),"/fixture-b/b.ts": () => import("../fixture-b/b.ts?url").then(m => m["default"]),"/fixture-b/index.ts": () => import("../fixture-b/index.ts?url").then(m => m["default"]),"/fixture.spec.ts": () => import("../fixture.spec.ts?url").then(m => m["default"]),"/parse.spec.ts": () => import("../parse.spec.ts?url").then(m => m["default"]),"/utils.spec.ts": () => import("../utils.spec.ts?url").then(m => m["default"])
+export const rootMixedRelative = /* #__PURE__ */ Object.assign({"/fixture-b/a.ts": () => import("./../fixture-b/a.ts?url").then(m => m["default"]),"/fixture-b/b.ts": () => import("./../fixture-b/b.ts?url").then(m => m["default"]),"/fixture-b/index.ts": () => import("./../fixture-b/index.ts?url").then(m => m["default"]),"/fixture.spec.ts": () => import("./../fixture.spec.ts?url").then(m => m["default"]),"/parse.spec.ts": () => import("./../parse.spec.ts?url").then(m => m["default"]),"/utils.spec.ts": () => import("./../utils.spec.ts?url").then(m => m["default"])
 
 
 });
 export const cleverCwd1 = /* #__PURE__ */ Object.assign({"./node_modules/framework/pages/hello.page.js": () => import("./node_modules/framework/pages/hello.page.js")
 
 });
-export const cleverCwd2 = /* #__PURE__ */ Object.assign({"./modules/a.ts": () => import("./modules/a.ts"),"./modules/b.ts": () => import("./modules/b.ts"),"../fixture-b/a.ts": () => import("../fixture-b/a.ts"),"../fixture-b/b.ts": () => import("../fixture-b/b.ts")
+export const cleverCwd2 = /* #__PURE__ */ Object.assign({"./modules/a.ts": () => import("./modules/a.ts"),"./modules/b.ts": () => import("./modules/b.ts"),"./../fixture-b/a.ts": () => import("./../fixture-b/a.ts"),"./../fixture-b/b.ts": () => import("./../fixture-b/b.ts")
 
 
 
@@ -184,14 +184,14 @@ export const parent = /* #__PURE__ */ Object.assign({
 
 
 });
-export const rootMixedRelative = /* #__PURE__ */ Object.assign({"/fixture-b/a.ts": () => import("../fixture-b/a.ts?url&lang.ts").then(m => m["default"]),"/fixture-b/b.ts": () => import("../fixture-b/b.ts?url&lang.ts").then(m => m["default"]),"/fixture-b/index.ts": () => import("../fixture-b/index.ts?url&lang.ts").then(m => m["default"]),"/fixture.spec.ts": () => import("../fixture.spec.ts?url&lang.ts").then(m => m["default"]),"/parse.spec.ts": () => import("../parse.spec.ts?url&lang.ts").then(m => m["default"]),"/utils.spec.ts": () => import("../utils.spec.ts?url&lang.ts").then(m => m["default"])
+export const rootMixedRelative = /* #__PURE__ */ Object.assign({"/fixture-b/a.ts": () => import("./../fixture-b/a.ts?url&lang.ts").then(m => m["default"]),"/fixture-b/b.ts": () => import("./../fixture-b/b.ts?url&lang.ts").then(m => m["default"]),"/fixture-b/index.ts": () => import("./../fixture-b/index.ts?url&lang.ts").then(m => m["default"]),"/fixture.spec.ts": () => import("./../fixture.spec.ts?url&lang.ts").then(m => m["default"]),"/parse.spec.ts": () => import("./../parse.spec.ts?url&lang.ts").then(m => m["default"]),"/utils.spec.ts": () => import("./../utils.spec.ts?url&lang.ts").then(m => m["default"])
 
 
 });
 export const cleverCwd1 = /* #__PURE__ */ Object.assign({"./node_modules/framework/pages/hello.page.js": () => import("./node_modules/framework/pages/hello.page.js")
 
 });
-export const cleverCwd2 = /* #__PURE__ */ Object.assign({"./modules/a.ts": () => import("./modules/a.ts"),"./modules/b.ts": () => import("./modules/b.ts"),"../fixture-b/a.ts": () => import("../fixture-b/a.ts"),"../fixture-b/b.ts": () => import("../fixture-b/b.ts")
+export const cleverCwd2 = /* #__PURE__ */ Object.assign({"./modules/a.ts": () => import("./modules/a.ts"),"./modules/b.ts": () => import("./modules/b.ts"),"./../fixture-b/a.ts": () => import("./../fixture-b/a.ts"),"./../fixture-b/b.ts": () => import("./../fixture-b/b.ts")
 
 
 
diff --git a/packages/vite/src/node/plugins/importMetaGlob.ts b/packages/vite/src/node/plugins/importMetaGlob.ts
index 50613331bcb162..350a8ca9cefd14 100644
--- a/packages/vite/src/node/plugins/importMetaGlob.ts
+++ b/packages/vite/src/node/plugins/importMetaGlob.ts
@@ -465,7 +465,7 @@ export async function transformGlobImport(
             }
 
             let importPath = relative(dir, file)
-            if (importPath[0] !== '.') importPath = `./${importPath}`
+            if (!importPath.startsWith('./')) importPath = `./${importPath}`
 
             let filePath: string
             if (options.base) {
diff --git a/playground/glob-import/__tests__/glob-import.spec.ts b/playground/glob-import/__tests__/glob-import.spec.ts
index c29e3d03e58a75..6b123e6b893add 100644
--- a/playground/glob-import/__tests__/glob-import.spec.ts
+++ b/playground/glob-import/__tests__/glob-import.spec.ts
@@ -56,7 +56,7 @@ const allResult = {
       },
   '/dir/nested/bar.js': {
     modules: {
-      '../baz.json': json,
+      './../baz.json': json,
     },
     msg: 'bar',
   },
@@ -125,6 +125,10 @@ test('unassigned import processes', async () => {
   )
 })
 
+test('dot folder issue', async () => {
+  expect(await page.textContent('.dot-folder-test')).toMatch(/SUCCESS:/)
+})
+
 test('import glob in package', async () => {
   expect(await page.textContent('.in-package')).toBe(
     JSON.stringify(['/pkg-pages/foo.js']),
diff --git a/playground/glob-import/simple-test.html b/playground/glob-import/simple-test.html
new file mode 100644
index 00000000000000..6355c37c9d2261
--- /dev/null
+++ b/playground/glob-import/simple-test.html
@@ -0,0 +1,16 @@
+
+
+  
+    Test
+  
+  
+    
+ + + From c22ed85161ad30f2a834209bcddc62a25ff915c6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 19 Sep 2025 06:08:37 +0000 Subject: [PATCH 4/7] refine fix: preserve ../paths without adding ./ prefix Co-authored-by: sapphi-red <49056869+sapphi-red@users.noreply.github.com> --- .../plugins/importGlob/__snapshots__/fixture.spec.ts.snap | 8 ++++---- packages/vite/src/node/plugins/importMetaGlob.ts | 4 +++- playground/glob-import/__tests__/glob-import.spec.ts | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap b/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap index a02e55268a9ca7..1f4c94203e1fb6 100644 --- a/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap +++ b/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap @@ -81,14 +81,14 @@ export const parent = /* #__PURE__ */ Object.assign({ }); -export const rootMixedRelative = /* #__PURE__ */ Object.assign({"/fixture-b/a.ts": () => import("./../fixture-b/a.ts?url").then(m => m["default"]),"/fixture-b/b.ts": () => import("./../fixture-b/b.ts?url").then(m => m["default"]),"/fixture-b/index.ts": () => import("./../fixture-b/index.ts?url").then(m => m["default"]),"/fixture.spec.ts": () => import("./../fixture.spec.ts?url").then(m => m["default"]),"/parse.spec.ts": () => import("./../parse.spec.ts?url").then(m => m["default"]),"/utils.spec.ts": () => import("./../utils.spec.ts?url").then(m => m["default"]) +export const rootMixedRelative = /* #__PURE__ */ Object.assign({"/fixture-b/a.ts": () => import("../fixture-b/a.ts?url").then(m => m["default"]),"/fixture-b/b.ts": () => import("../fixture-b/b.ts?url").then(m => m["default"]),"/fixture-b/index.ts": () => import("../fixture-b/index.ts?url").then(m => m["default"]),"/fixture.spec.ts": () => import("../fixture.spec.ts?url").then(m => m["default"]),"/parse.spec.ts": () => import("../parse.spec.ts?url").then(m => m["default"]),"/utils.spec.ts": () => import("../utils.spec.ts?url").then(m => m["default"]) }); export const cleverCwd1 = /* #__PURE__ */ Object.assign({"./node_modules/framework/pages/hello.page.js": () => import("./node_modules/framework/pages/hello.page.js") }); -export const cleverCwd2 = /* #__PURE__ */ Object.assign({"./modules/a.ts": () => import("./modules/a.ts"),"./modules/b.ts": () => import("./modules/b.ts"),"./../fixture-b/a.ts": () => import("./../fixture-b/a.ts"),"./../fixture-b/b.ts": () => import("./../fixture-b/b.ts") +export const cleverCwd2 = /* #__PURE__ */ Object.assign({"./modules/a.ts": () => import("./modules/a.ts"),"./modules/b.ts": () => import("./modules/b.ts"),"../fixture-b/a.ts": () => import("../fixture-b/a.ts"),"../fixture-b/b.ts": () => import("../fixture-b/b.ts") @@ -184,14 +184,14 @@ export const parent = /* #__PURE__ */ Object.assign({ }); -export const rootMixedRelative = /* #__PURE__ */ Object.assign({"/fixture-b/a.ts": () => import("./../fixture-b/a.ts?url&lang.ts").then(m => m["default"]),"/fixture-b/b.ts": () => import("./../fixture-b/b.ts?url&lang.ts").then(m => m["default"]),"/fixture-b/index.ts": () => import("./../fixture-b/index.ts?url&lang.ts").then(m => m["default"]),"/fixture.spec.ts": () => import("./../fixture.spec.ts?url&lang.ts").then(m => m["default"]),"/parse.spec.ts": () => import("./../parse.spec.ts?url&lang.ts").then(m => m["default"]),"/utils.spec.ts": () => import("./../utils.spec.ts?url&lang.ts").then(m => m["default"]) +export const rootMixedRelative = /* #__PURE__ */ Object.assign({"/fixture-b/a.ts": () => import("../fixture-b/a.ts?url&lang.ts").then(m => m["default"]),"/fixture-b/b.ts": () => import("../fixture-b/b.ts?url&lang.ts").then(m => m["default"]),"/fixture-b/index.ts": () => import("../fixture-b/index.ts?url&lang.ts").then(m => m["default"]),"/fixture.spec.ts": () => import("../fixture.spec.ts?url&lang.ts").then(m => m["default"]),"/parse.spec.ts": () => import("../parse.spec.ts?url&lang.ts").then(m => m["default"]),"/utils.spec.ts": () => import("../utils.spec.ts?url&lang.ts").then(m => m["default"]) }); export const cleverCwd1 = /* #__PURE__ */ Object.assign({"./node_modules/framework/pages/hello.page.js": () => import("./node_modules/framework/pages/hello.page.js") }); -export const cleverCwd2 = /* #__PURE__ */ Object.assign({"./modules/a.ts": () => import("./modules/a.ts"),"./modules/b.ts": () => import("./modules/b.ts"),"./../fixture-b/a.ts": () => import("./../fixture-b/a.ts"),"./../fixture-b/b.ts": () => import("./../fixture-b/b.ts") +export const cleverCwd2 = /* #__PURE__ */ Object.assign({"./modules/a.ts": () => import("./modules/a.ts"),"./modules/b.ts": () => import("./modules/b.ts"),"../fixture-b/a.ts": () => import("../fixture-b/a.ts"),"../fixture-b/b.ts": () => import("../fixture-b/b.ts") diff --git a/packages/vite/src/node/plugins/importMetaGlob.ts b/packages/vite/src/node/plugins/importMetaGlob.ts index 350a8ca9cefd14..4d6ee8928d0bb1 100644 --- a/packages/vite/src/node/plugins/importMetaGlob.ts +++ b/packages/vite/src/node/plugins/importMetaGlob.ts @@ -465,7 +465,9 @@ export async function transformGlobImport( } let importPath = relative(dir, file) - if (!importPath.startsWith('./')) importPath = `./${importPath}` + if (!importPath.startsWith('./') && !importPath.startsWith('../')) { + importPath = `./${importPath}` + } let filePath: string if (options.base) { diff --git a/playground/glob-import/__tests__/glob-import.spec.ts b/playground/glob-import/__tests__/glob-import.spec.ts index 6b123e6b893add..f4d0e63ebbe855 100644 --- a/playground/glob-import/__tests__/glob-import.spec.ts +++ b/playground/glob-import/__tests__/glob-import.spec.ts @@ -56,7 +56,7 @@ const allResult = { }, '/dir/nested/bar.js': { modules: { - './../baz.json': json, + '../baz.json': json, }, msg: 'bar', }, From db5ca5f5f23235df1172701dc2183b3bf73d06c4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 19 Sep 2025 06:43:32 +0000 Subject: [PATCH 5/7] refactor: move dot folder test to unit test fixture Co-authored-by: sapphi-red <49056869+sapphi-red@users.noreply.github.com> --- .../__snapshots__/fixture.spec.ts.snap | 6 ++++-- .../importGlob/fixture-a}/.foo/test.ts | 0 .../plugins/importGlob/fixture-a/index.ts | 2 ++ .../glob-import/__tests__/glob-import.spec.ts | 4 ---- playground/glob-import/index.html | 19 ------------------- playground/glob-import/inner/.foo/test.ts | 1 - playground/glob-import/simple-test.html | 16 ---------------- 7 files changed, 6 insertions(+), 42 deletions(-) rename {playground/glob-import => packages/vite/src/node/__tests__/plugins/importGlob/fixture-a}/.foo/test.ts (100%) delete mode 100644 playground/glob-import/inner/.foo/test.ts delete mode 100644 playground/glob-import/simple-test.html diff --git a/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap b/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap index 1f4c94203e1fb6..ff2b01e567efe5 100644 --- a/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap +++ b/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap @@ -1,7 +1,7 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`fixture > transform 1`] = ` -"import * as __vite_glob_3_0 from "./modules/a.ts";import * as __vite_glob_3_1 from "./modules/b.ts";import * as __vite_glob_3_2 from "./modules/index.ts";import * as __vite_glob_5_0 from "./modules/a.ts";import * as __vite_glob_5_1 from "./modules/b.ts";import * as __vite_glob_5_2 from "./modules/index.ts";import { name as __vite_glob_9_0 } from "./modules/a.ts";import { name as __vite_glob_9_1 } from "./modules/b.ts";import { name as __vite_glob_9_2 } from "./modules/index.ts";import { name as __vite_glob_11_0 } from "./modules/a.ts";import { name as __vite_glob_11_1 } from "./modules/b.ts";import { name as __vite_glob_11_2 } from "./modules/index.ts";import { default as __vite_glob_15_0 } from "./modules/a.ts?raw";import { default as __vite_glob_15_1 } from "./modules/b.ts?raw";import "types/importMeta"; +"import * as __vite_glob_3_0 from "./modules/a.ts";import * as __vite_glob_3_1 from "./modules/b.ts";import * as __vite_glob_3_2 from "./modules/index.ts";import * as __vite_glob_5_0 from "./modules/a.ts";import * as __vite_glob_5_1 from "./modules/b.ts";import * as __vite_glob_5_2 from "./modules/index.ts";import { name as __vite_glob_9_0 } from "./modules/a.ts";import { name as __vite_glob_9_1 } from "./modules/b.ts";import { name as __vite_glob_9_2 } from "./modules/index.ts";import { name as __vite_glob_11_0 } from "./modules/a.ts";import { name as __vite_glob_11_1 } from "./modules/b.ts";import { name as __vite_glob_11_2 } from "./modules/index.ts";import { default as __vite_glob_15_0 } from "./modules/a.ts?raw";import { default as __vite_glob_15_1 } from "./modules/b.ts?raw";import * as __vite_glob_28_0 from "./.foo/test.ts";import "types/importMeta"; export const basic = /* #__PURE__ */ Object.assign({"./modules/a.ts": () => import("./modules/a.ts"),"./modules/b.ts": () => import("./modules/b.ts"),"./modules/index.ts": () => import("./modules/index.ts")}); export const basicWithObjectKeys = Object.keys({"./modules/a.ts": 0,"./modules/b.ts": 0,"./modules/index.ts": 0}); export const basicWithObjectValues = Object.values([() => import("./modules/a.ts"),() => import("./modules/b.ts"),() => import("./modules/index.ts")]); @@ -100,11 +100,12 @@ export const customRootBase = /* #__PURE__ */ Object.assign({"./a.ts": () => imp export const customBaseParent = /* #__PURE__ */ Object.assign({"../fixture-b/a.ts": () => import("/fixture-b/a.ts"),"../fixture-b/b.ts": () => import("/fixture-b/b.ts"),"../fixture-b/index.ts": () => import("/fixture-b/index.ts") }); +export const dotFolder = /* #__PURE__ */ Object.assign({"./.foo/test.ts": __vite_glob_28_0}); " `; exports[`fixture > transform with restoreQueryExtension 1`] = ` -"import * as __vite_glob_3_0 from "./modules/a.ts";import * as __vite_glob_3_1 from "./modules/b.ts";import * as __vite_glob_3_2 from "./modules/index.ts";import * as __vite_glob_5_0 from "./modules/a.ts";import * as __vite_glob_5_1 from "./modules/b.ts";import * as __vite_glob_5_2 from "./modules/index.ts";import { name as __vite_glob_9_0 } from "./modules/a.ts";import { name as __vite_glob_9_1 } from "./modules/b.ts";import { name as __vite_glob_9_2 } from "./modules/index.ts";import { name as __vite_glob_11_0 } from "./modules/a.ts";import { name as __vite_glob_11_1 } from "./modules/b.ts";import { name as __vite_glob_11_2 } from "./modules/index.ts";import { default as __vite_glob_15_0 } from "./modules/a.ts?raw";import { default as __vite_glob_15_1 } from "./modules/b.ts?raw";import "types/importMeta"; +"import * as __vite_glob_3_0 from "./modules/a.ts";import * as __vite_glob_3_1 from "./modules/b.ts";import * as __vite_glob_3_2 from "./modules/index.ts";import * as __vite_glob_5_0 from "./modules/a.ts";import * as __vite_glob_5_1 from "./modules/b.ts";import * as __vite_glob_5_2 from "./modules/index.ts";import { name as __vite_glob_9_0 } from "./modules/a.ts";import { name as __vite_glob_9_1 } from "./modules/b.ts";import { name as __vite_glob_9_2 } from "./modules/index.ts";import { name as __vite_glob_11_0 } from "./modules/a.ts";import { name as __vite_glob_11_1 } from "./modules/b.ts";import { name as __vite_glob_11_2 } from "./modules/index.ts";import { default as __vite_glob_15_0 } from "./modules/a.ts?raw";import { default as __vite_glob_15_1 } from "./modules/b.ts?raw";import * as __vite_glob_28_0 from "./.foo/test.ts";import "types/importMeta"; export const basic = /* #__PURE__ */ Object.assign({"./modules/a.ts": () => import("./modules/a.ts"),"./modules/b.ts": () => import("./modules/b.ts"),"./modules/index.ts": () => import("./modules/index.ts")}); export const basicWithObjectKeys = Object.keys({"./modules/a.ts": 0,"./modules/b.ts": 0,"./modules/index.ts": 0}); export const basicWithObjectValues = Object.values([() => import("./modules/a.ts"),() => import("./modules/b.ts"),() => import("./modules/index.ts")]); @@ -203,6 +204,7 @@ export const customRootBase = /* #__PURE__ */ Object.assign({"./a.ts": () => imp export const customBaseParent = /* #__PURE__ */ Object.assign({"../fixture-b/a.ts": () => import("/fixture-b/a.ts"),"../fixture-b/b.ts": () => import("/fixture-b/b.ts"),"../fixture-b/index.ts": () => import("/fixture-b/index.ts") }); +export const dotFolder = /* #__PURE__ */ Object.assign({"./.foo/test.ts": __vite_glob_28_0}); " `; diff --git a/playground/glob-import/.foo/test.ts b/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/.foo/test.ts similarity index 100% rename from playground/glob-import/.foo/test.ts rename to packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/.foo/test.ts diff --git a/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts b/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts index 5ca5cff8e4f344..50e6b0e509971c 100644 --- a/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts +++ b/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts @@ -120,3 +120,5 @@ export const customRootBase = import.meta.glob('./**/*.ts', { export const customBaseParent = import.meta.glob('/fixture-b/**/*.ts', { base: '/fixture-a', }) + +export const dotFolder = import.meta.glob('./.foo/*.ts', { eager: true }) diff --git a/playground/glob-import/__tests__/glob-import.spec.ts b/playground/glob-import/__tests__/glob-import.spec.ts index f4d0e63ebbe855..c29e3d03e58a75 100644 --- a/playground/glob-import/__tests__/glob-import.spec.ts +++ b/playground/glob-import/__tests__/glob-import.spec.ts @@ -125,10 +125,6 @@ test('unassigned import processes', async () => { ) }) -test('dot folder issue', async () => { - expect(await page.textContent('.dot-folder-test')).toMatch(/SUCCESS:/) -}) - test('import glob in package', async () => { expect(await page.textContent('.in-package')).toBe( JSON.stringify(['/pkg-pages/foo.js']), diff --git a/playground/glob-import/index.html b/playground/glob-import/index.html index 20cdf51bd124df..69f9f2854d5012 100644 --- a/playground/glob-import/index.html +++ b/playground/glob-import/index.html @@ -29,8 +29,6 @@

In package


 

Base


-

Dot Folder Issue

-

 
 
 
-
-
diff --git a/playground/glob-import/inner/.foo/test.ts b/playground/glob-import/inner/.foo/test.ts
deleted file mode 100644
index 31c469f3dd7f51..00000000000000
--- a/playground/glob-import/inner/.foo/test.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const msg = 'inner-dot-folder-test'
diff --git a/playground/glob-import/simple-test.html b/playground/glob-import/simple-test.html
deleted file mode 100644
index 6355c37c9d2261..00000000000000
--- a/playground/glob-import/simple-test.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-  
-    Test
-  
-  
-    
- - - From 97831eb008f39f6c359ade90e1b1ccfd03fa0f53 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 19 Sep 2025 09:11:43 +0000 Subject: [PATCH 6/7] fix: apply dot folder fix to all filePath[0] !== '.' patterns Co-authored-by: sapphi-red <49056869+sapphi-red@users.noreply.github.com> --- .../importGlob/__snapshots__/fixture.spec.ts.snap | 12 ++++++++++-- .../__tests__/plugins/importGlob/fixture-a/index.ts | 5 +++++ packages/vite/src/node/plugins/importMetaGlob.ts | 12 +++++++++--- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap b/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap index ff2b01e567efe5..93fdff8925de36 100644 --- a/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap +++ b/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap @@ -1,7 +1,7 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`fixture > transform 1`] = ` -"import * as __vite_glob_3_0 from "./modules/a.ts";import * as __vite_glob_3_1 from "./modules/b.ts";import * as __vite_glob_3_2 from "./modules/index.ts";import * as __vite_glob_5_0 from "./modules/a.ts";import * as __vite_glob_5_1 from "./modules/b.ts";import * as __vite_glob_5_2 from "./modules/index.ts";import { name as __vite_glob_9_0 } from "./modules/a.ts";import { name as __vite_glob_9_1 } from "./modules/b.ts";import { name as __vite_glob_9_2 } from "./modules/index.ts";import { name as __vite_glob_11_0 } from "./modules/a.ts";import { name as __vite_glob_11_1 } from "./modules/b.ts";import { name as __vite_glob_11_2 } from "./modules/index.ts";import { default as __vite_glob_15_0 } from "./modules/a.ts?raw";import { default as __vite_glob_15_1 } from "./modules/b.ts?raw";import * as __vite_glob_28_0 from "./.foo/test.ts";import "types/importMeta"; +"import * as __vite_glob_3_0 from "./modules/a.ts";import * as __vite_glob_3_1 from "./modules/b.ts";import * as __vite_glob_3_2 from "./modules/index.ts";import * as __vite_glob_5_0 from "./modules/a.ts";import * as __vite_glob_5_1 from "./modules/b.ts";import * as __vite_glob_5_2 from "./modules/index.ts";import { name as __vite_glob_9_0 } from "./modules/a.ts";import { name as __vite_glob_9_1 } from "./modules/b.ts";import { name as __vite_glob_9_2 } from "./modules/index.ts";import { name as __vite_glob_11_0 } from "./modules/a.ts";import { name as __vite_glob_11_1 } from "./modules/b.ts";import { name as __vite_glob_11_2 } from "./modules/index.ts";import { default as __vite_glob_15_0 } from "./modules/a.ts?raw";import { default as __vite_glob_15_1 } from "./modules/b.ts?raw";import * as __vite_glob_28_0 from "./.foo/test.ts";import * as __vite_glob_29_0 from "./.foo/test.ts";import "types/importMeta"; export const basic = /* #__PURE__ */ Object.assign({"./modules/a.ts": () => import("./modules/a.ts"),"./modules/b.ts": () => import("./modules/b.ts"),"./modules/index.ts": () => import("./modules/index.ts")}); export const basicWithObjectKeys = Object.keys({"./modules/a.ts": 0,"./modules/b.ts": 0,"./modules/index.ts": 0}); export const basicWithObjectValues = Object.values([() => import("./modules/a.ts"),() => import("./modules/b.ts"),() => import("./modules/index.ts")]); @@ -101,11 +101,15 @@ export const customBaseParent = /* #__PURE__ */ Object.assign({"../fixture-b/a.t }); export const dotFolder = /* #__PURE__ */ Object.assign({"./.foo/test.ts": __vite_glob_28_0}); +export const dotFolderWithBase = /* #__PURE__ */ Object.assign({"./.foo/test.ts": __vite_glob_29_0 + + +}); " `; exports[`fixture > transform with restoreQueryExtension 1`] = ` -"import * as __vite_glob_3_0 from "./modules/a.ts";import * as __vite_glob_3_1 from "./modules/b.ts";import * as __vite_glob_3_2 from "./modules/index.ts";import * as __vite_glob_5_0 from "./modules/a.ts";import * as __vite_glob_5_1 from "./modules/b.ts";import * as __vite_glob_5_2 from "./modules/index.ts";import { name as __vite_glob_9_0 } from "./modules/a.ts";import { name as __vite_glob_9_1 } from "./modules/b.ts";import { name as __vite_glob_9_2 } from "./modules/index.ts";import { name as __vite_glob_11_0 } from "./modules/a.ts";import { name as __vite_glob_11_1 } from "./modules/b.ts";import { name as __vite_glob_11_2 } from "./modules/index.ts";import { default as __vite_glob_15_0 } from "./modules/a.ts?raw";import { default as __vite_glob_15_1 } from "./modules/b.ts?raw";import * as __vite_glob_28_0 from "./.foo/test.ts";import "types/importMeta"; +"import * as __vite_glob_3_0 from "./modules/a.ts";import * as __vite_glob_3_1 from "./modules/b.ts";import * as __vite_glob_3_2 from "./modules/index.ts";import * as __vite_glob_5_0 from "./modules/a.ts";import * as __vite_glob_5_1 from "./modules/b.ts";import * as __vite_glob_5_2 from "./modules/index.ts";import { name as __vite_glob_9_0 } from "./modules/a.ts";import { name as __vite_glob_9_1 } from "./modules/b.ts";import { name as __vite_glob_9_2 } from "./modules/index.ts";import { name as __vite_glob_11_0 } from "./modules/a.ts";import { name as __vite_glob_11_1 } from "./modules/b.ts";import { name as __vite_glob_11_2 } from "./modules/index.ts";import { default as __vite_glob_15_0 } from "./modules/a.ts?raw";import { default as __vite_glob_15_1 } from "./modules/b.ts?raw";import * as __vite_glob_28_0 from "./.foo/test.ts";import * as __vite_glob_29_0 from "./.foo/test.ts";import "types/importMeta"; export const basic = /* #__PURE__ */ Object.assign({"./modules/a.ts": () => import("./modules/a.ts"),"./modules/b.ts": () => import("./modules/b.ts"),"./modules/index.ts": () => import("./modules/index.ts")}); export const basicWithObjectKeys = Object.keys({"./modules/a.ts": 0,"./modules/b.ts": 0,"./modules/index.ts": 0}); export const basicWithObjectValues = Object.values([() => import("./modules/a.ts"),() => import("./modules/b.ts"),() => import("./modules/index.ts")]); @@ -205,6 +209,10 @@ export const customBaseParent = /* #__PURE__ */ Object.assign({"../fixture-b/a.t }); export const dotFolder = /* #__PURE__ */ Object.assign({"./.foo/test.ts": __vite_glob_28_0}); +export const dotFolderWithBase = /* #__PURE__ */ Object.assign({"./.foo/test.ts": __vite_glob_29_0 + + +}); " `; diff --git a/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts b/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts index 50e6b0e509971c..d8c3c6b99e0d9b 100644 --- a/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts +++ b/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts @@ -122,3 +122,8 @@ export const customBaseParent = import.meta.glob('/fixture-b/**/*.ts', { }) export const dotFolder = import.meta.glob('./.foo/*.ts', { eager: true }) + +export const dotFolderWithBase = import.meta.glob('./.foo/*.ts', { + eager: true, + base: './', +}) diff --git a/packages/vite/src/node/plugins/importMetaGlob.ts b/packages/vite/src/node/plugins/importMetaGlob.ts index 4d6ee8928d0bb1..87c8e987e965c6 100644 --- a/packages/vite/src/node/plugins/importMetaGlob.ts +++ b/packages/vite/src/node/plugins/importMetaGlob.ts @@ -458,7 +458,11 @@ export async function transformGlobImport( let filePath = options.base ? `${relative(posix.join(root, options.base), file)}` : importPath - if (options.base && filePath[0] !== '.') { + if ( + options.base && + !filePath.startsWith('./') && + !filePath.startsWith('../') + ) { filePath = `./${filePath}` } return { filePath, importPath } @@ -476,7 +480,9 @@ export async function transformGlobImport( posix.join(resolvedBasePath, options.base), file, ) - if (filePath[0] !== '.') filePath = `./${filePath}` + if (!filePath.startsWith('./') && !filePath.startsWith('../')) { + filePath = `./${filePath}` + } if (options.base[0] === '/') { importPath = `/${relative(root, file)}` } @@ -484,7 +490,7 @@ export async function transformGlobImport( filePath = importPath } else { filePath = relative(root, file) - if (filePath[0] !== '.') filePath = `/${filePath}` + filePath = `/${filePath}` } return { filePath, importPath } From e6ad129934455ecf79671f0ce20d824bcb8aee93 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Fri, 19 Sep 2025 22:21:27 +0900 Subject: [PATCH 7/7] chore: update --- .../importGlob/__snapshots__/fixture.spec.ts.snap | 12 ++---------- .../__tests__/plugins/importGlob/fixture-a/index.ts | 5 ----- packages/vite/src/node/plugins/importMetaGlob.ts | 4 +++- 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap b/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap index 93fdff8925de36..ff2b01e567efe5 100644 --- a/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap +++ b/packages/vite/src/node/__tests__/plugins/importGlob/__snapshots__/fixture.spec.ts.snap @@ -1,7 +1,7 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`fixture > transform 1`] = ` -"import * as __vite_glob_3_0 from "./modules/a.ts";import * as __vite_glob_3_1 from "./modules/b.ts";import * as __vite_glob_3_2 from "./modules/index.ts";import * as __vite_glob_5_0 from "./modules/a.ts";import * as __vite_glob_5_1 from "./modules/b.ts";import * as __vite_glob_5_2 from "./modules/index.ts";import { name as __vite_glob_9_0 } from "./modules/a.ts";import { name as __vite_glob_9_1 } from "./modules/b.ts";import { name as __vite_glob_9_2 } from "./modules/index.ts";import { name as __vite_glob_11_0 } from "./modules/a.ts";import { name as __vite_glob_11_1 } from "./modules/b.ts";import { name as __vite_glob_11_2 } from "./modules/index.ts";import { default as __vite_glob_15_0 } from "./modules/a.ts?raw";import { default as __vite_glob_15_1 } from "./modules/b.ts?raw";import * as __vite_glob_28_0 from "./.foo/test.ts";import * as __vite_glob_29_0 from "./.foo/test.ts";import "types/importMeta"; +"import * as __vite_glob_3_0 from "./modules/a.ts";import * as __vite_glob_3_1 from "./modules/b.ts";import * as __vite_glob_3_2 from "./modules/index.ts";import * as __vite_glob_5_0 from "./modules/a.ts";import * as __vite_glob_5_1 from "./modules/b.ts";import * as __vite_glob_5_2 from "./modules/index.ts";import { name as __vite_glob_9_0 } from "./modules/a.ts";import { name as __vite_glob_9_1 } from "./modules/b.ts";import { name as __vite_glob_9_2 } from "./modules/index.ts";import { name as __vite_glob_11_0 } from "./modules/a.ts";import { name as __vite_glob_11_1 } from "./modules/b.ts";import { name as __vite_glob_11_2 } from "./modules/index.ts";import { default as __vite_glob_15_0 } from "./modules/a.ts?raw";import { default as __vite_glob_15_1 } from "./modules/b.ts?raw";import * as __vite_glob_28_0 from "./.foo/test.ts";import "types/importMeta"; export const basic = /* #__PURE__ */ Object.assign({"./modules/a.ts": () => import("./modules/a.ts"),"./modules/b.ts": () => import("./modules/b.ts"),"./modules/index.ts": () => import("./modules/index.ts")}); export const basicWithObjectKeys = Object.keys({"./modules/a.ts": 0,"./modules/b.ts": 0,"./modules/index.ts": 0}); export const basicWithObjectValues = Object.values([() => import("./modules/a.ts"),() => import("./modules/b.ts"),() => import("./modules/index.ts")]); @@ -101,15 +101,11 @@ export const customBaseParent = /* #__PURE__ */ Object.assign({"../fixture-b/a.t }); export const dotFolder = /* #__PURE__ */ Object.assign({"./.foo/test.ts": __vite_glob_28_0}); -export const dotFolderWithBase = /* #__PURE__ */ Object.assign({"./.foo/test.ts": __vite_glob_29_0 - - -}); " `; exports[`fixture > transform with restoreQueryExtension 1`] = ` -"import * as __vite_glob_3_0 from "./modules/a.ts";import * as __vite_glob_3_1 from "./modules/b.ts";import * as __vite_glob_3_2 from "./modules/index.ts";import * as __vite_glob_5_0 from "./modules/a.ts";import * as __vite_glob_5_1 from "./modules/b.ts";import * as __vite_glob_5_2 from "./modules/index.ts";import { name as __vite_glob_9_0 } from "./modules/a.ts";import { name as __vite_glob_9_1 } from "./modules/b.ts";import { name as __vite_glob_9_2 } from "./modules/index.ts";import { name as __vite_glob_11_0 } from "./modules/a.ts";import { name as __vite_glob_11_1 } from "./modules/b.ts";import { name as __vite_glob_11_2 } from "./modules/index.ts";import { default as __vite_glob_15_0 } from "./modules/a.ts?raw";import { default as __vite_glob_15_1 } from "./modules/b.ts?raw";import * as __vite_glob_28_0 from "./.foo/test.ts";import * as __vite_glob_29_0 from "./.foo/test.ts";import "types/importMeta"; +"import * as __vite_glob_3_0 from "./modules/a.ts";import * as __vite_glob_3_1 from "./modules/b.ts";import * as __vite_glob_3_2 from "./modules/index.ts";import * as __vite_glob_5_0 from "./modules/a.ts";import * as __vite_glob_5_1 from "./modules/b.ts";import * as __vite_glob_5_2 from "./modules/index.ts";import { name as __vite_glob_9_0 } from "./modules/a.ts";import { name as __vite_glob_9_1 } from "./modules/b.ts";import { name as __vite_glob_9_2 } from "./modules/index.ts";import { name as __vite_glob_11_0 } from "./modules/a.ts";import { name as __vite_glob_11_1 } from "./modules/b.ts";import { name as __vite_glob_11_2 } from "./modules/index.ts";import { default as __vite_glob_15_0 } from "./modules/a.ts?raw";import { default as __vite_glob_15_1 } from "./modules/b.ts?raw";import * as __vite_glob_28_0 from "./.foo/test.ts";import "types/importMeta"; export const basic = /* #__PURE__ */ Object.assign({"./modules/a.ts": () => import("./modules/a.ts"),"./modules/b.ts": () => import("./modules/b.ts"),"./modules/index.ts": () => import("./modules/index.ts")}); export const basicWithObjectKeys = Object.keys({"./modules/a.ts": 0,"./modules/b.ts": 0,"./modules/index.ts": 0}); export const basicWithObjectValues = Object.values([() => import("./modules/a.ts"),() => import("./modules/b.ts"),() => import("./modules/index.ts")]); @@ -209,10 +205,6 @@ export const customBaseParent = /* #__PURE__ */ Object.assign({"../fixture-b/a.t }); export const dotFolder = /* #__PURE__ */ Object.assign({"./.foo/test.ts": __vite_glob_28_0}); -export const dotFolderWithBase = /* #__PURE__ */ Object.assign({"./.foo/test.ts": __vite_glob_29_0 - - -}); " `; diff --git a/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts b/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts index d8c3c6b99e0d9b..50e6b0e509971c 100644 --- a/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts +++ b/packages/vite/src/node/__tests__/plugins/importGlob/fixture-a/index.ts @@ -122,8 +122,3 @@ export const customBaseParent = import.meta.glob('/fixture-b/**/*.ts', { }) export const dotFolder = import.meta.glob('./.foo/*.ts', { eager: true }) - -export const dotFolderWithBase = import.meta.glob('./.foo/*.ts', { - eager: true, - base: './', -}) diff --git a/packages/vite/src/node/plugins/importMetaGlob.ts b/packages/vite/src/node/plugins/importMetaGlob.ts index 87c8e987e965c6..8a822693bab036 100644 --- a/packages/vite/src/node/plugins/importMetaGlob.ts +++ b/packages/vite/src/node/plugins/importMetaGlob.ts @@ -490,7 +490,9 @@ export async function transformGlobImport( filePath = importPath } else { filePath = relative(root, file) - filePath = `/${filePath}` + if (!filePath.startsWith('./') && !filePath.startsWith('../')) { + filePath = `/${filePath}` + } } return { filePath, importPath }