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 }