From 0436ebd39835e7c07baf426949690747cf2546e0 Mon Sep 17 00:00:00 2001 From: fireairforce <1344492820@qq.com> Date: Thu, 7 May 2026 14:22:29 +0800 Subject: [PATCH] fix(pack): add & as escape chunk filename character --- crates/pack-core/src/library/chunking_context.rs | 9 ++++++--- .../snapshot/style/css-filename-escape/config.json | 11 +++++++++++ .../css-filename-escape/input/RuleEdit&Vidw.less | 3 +++ .../snapshot/style/css-filename-escape/input/index.js | 1 + .../output/input_RuleEdit_Vidw_less_29d5bafe.css | 4 ++++ .../output/input_index_d45174ac.js | 8 ++++++++ .../snapshot/style/css-filename-escape/output/main.js | 5 +++++ next.js | 2 +- 8 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 crates/pack-tests/tests/snapshot/style/css-filename-escape/config.json create mode 100644 crates/pack-tests/tests/snapshot/style/css-filename-escape/input/RuleEdit&Vidw.less create mode 100644 crates/pack-tests/tests/snapshot/style/css-filename-escape/input/index.js create mode 100644 crates/pack-tests/tests/snapshot/style/css-filename-escape/output/input_RuleEdit_Vidw_less_29d5bafe.css create mode 100644 crates/pack-tests/tests/snapshot/style/css-filename-escape/output/input_index_d45174ac.js create mode 100644 crates/pack-tests/tests/snapshot/style/css-filename-escape/output/main.js diff --git a/crates/pack-core/src/library/chunking_context.rs b/crates/pack-core/src/library/chunking_context.rs index 3e3ff8bdc..a0a851c4b 100644 --- a/crates/pack-core/src/library/chunking_context.rs +++ b/crates/pack-core/src/library/chunking_context.rs @@ -314,8 +314,9 @@ impl LibraryChunkingContext { let root = &this.root_path; if let Some(filename) = self.await?.filename.as_ref() { let mut filename = filename.to_string(); + let name = escape_file_path(name); if match_name_placeholder(&filename) { - filename = replace_name_placeholder(&filename, name); + filename = replace_name_placeholder(&filename, &name); } if match_content_hash_placeholder(&filename) { let content_hash = self.ecmascript_chunk_content_hash(ecmascript_chunk).await?; @@ -445,11 +446,12 @@ impl ChunkingContext for LibraryChunkingContext { let query = QString::from(ident.await?.query.as_str()); let name = query.get("name").unwrap_or(output_name.as_str()); + let name = escape_file_path(name); let mut filename = filename_template.to_string(); if match_name_placeholder(&filename) { - filename = replace_name_placeholder(&filename, name); + filename = replace_name_placeholder(&filename, &name); } if match_content_hash_placeholder(&filename) { @@ -550,9 +552,10 @@ impl ChunkingContext for LibraryChunkingContext { let mut filename = filename_template.to_string(); let (_, name, ext) = source_path.split_file_stem_extension(); + let name = escape_file_path(name); if match_name_placeholder(&filename) { - filename = replace_name_placeholder(&filename, name); + filename = replace_name_placeholder(&filename, &name); } if match_content_hash_placeholder(&filename) { diff --git a/crates/pack-tests/tests/snapshot/style/css-filename-escape/config.json b/crates/pack-tests/tests/snapshot/style/css-filename-escape/config.json new file mode 100644 index 000000000..7f32f73e7 --- /dev/null +++ b/crates/pack-tests/tests/snapshot/style/css-filename-escape/config.json @@ -0,0 +1,11 @@ +{ + "config": { + "entry": [ + { + "import": "input/index.js", + "name": "main" + } + ], + "sourceMaps": false + } +} diff --git a/crates/pack-tests/tests/snapshot/style/css-filename-escape/input/RuleEdit&Vidw.less b/crates/pack-tests/tests/snapshot/style/css-filename-escape/input/RuleEdit&Vidw.less new file mode 100644 index 000000000..db251cba4 --- /dev/null +++ b/crates/pack-tests/tests/snapshot/style/css-filename-escape/input/RuleEdit&Vidw.less @@ -0,0 +1,3 @@ +.rule-edit { + color: #1677ff; +} diff --git a/crates/pack-tests/tests/snapshot/style/css-filename-escape/input/index.js b/crates/pack-tests/tests/snapshot/style/css-filename-escape/input/index.js new file mode 100644 index 000000000..8782d349d --- /dev/null +++ b/crates/pack-tests/tests/snapshot/style/css-filename-escape/input/index.js @@ -0,0 +1 @@ +import "./RuleEdit&Vidw.less"; diff --git a/crates/pack-tests/tests/snapshot/style/css-filename-escape/output/input_RuleEdit_Vidw_less_29d5bafe.css b/crates/pack-tests/tests/snapshot/style/css-filename-escape/output/input_RuleEdit_Vidw_less_29d5bafe.css new file mode 100644 index 000000000..f703515ac --- /dev/null +++ b/crates/pack-tests/tests/snapshot/style/css-filename-escape/output/input_RuleEdit_Vidw_less_29d5bafe.css @@ -0,0 +1,4 @@ +/* [project]/style/css-filename-escape/input/RuleEdit&Vidw.less.css [client] (css) */ +.rule-edit { + color: #1677ff; +} \ No newline at end of file diff --git a/crates/pack-tests/tests/snapshot/style/css-filename-escape/output/input_index_d45174ac.js b/crates/pack-tests/tests/snapshot/style/css-filename-escape/output/input_index_d45174ac.js new file mode 100644 index 000000000..b636ee046 --- /dev/null +++ b/crates/pack-tests/tests/snapshot/style/css-filename-escape/output/input_index_d45174ac.js @@ -0,0 +1,8 @@ +(globalThis["TURBOPACK"] || (globalThis["TURBOPACK"] = [])).push([typeof document === "object" ? document.currentScript : undefined, +"[project]/style/css-filename-escape/input/index.js [client] (ecmascript)", ((__turbopack_context__) => { +"use strict"; + +; +__turbopack_context__.s([]); +}), +]); \ No newline at end of file diff --git a/crates/pack-tests/tests/snapshot/style/css-filename-escape/output/main.js b/crates/pack-tests/tests/snapshot/style/css-filename-escape/output/main.js new file mode 100644 index 000000000..510cdbd0d --- /dev/null +++ b/crates/pack-tests/tests/snapshot/style/css-filename-escape/output/main.js @@ -0,0 +1,5 @@ +(globalThis["TURBOPACK"] || (globalThis["TURBOPACK"] = [])).push([ + typeof document === "object" ? document.currentScript : undefined, + {"otherChunks":["input_RuleEdit_Vidw_less_29d5bafe.css","input_index_d45174ac.js"],"runtimeModuleIds":["[project]/style/css-filename-escape/input/index.js [client] (ecmascript)"]} +]); +// Dummy runtime \ No newline at end of file diff --git a/next.js b/next.js index bc888e2a7..996cf5423 160000 --- a/next.js +++ b/next.js @@ -1 +1 @@ -Subproject commit bc888e2a746697020cacf6af575d86339a657874 +Subproject commit 996cf54239dcd18451d2a678d32cbacb217d12aa