From 269a07945168add6deaa768514e6b24ab79796e1 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 13 Sep 2023 14:16:42 +0000 Subject: [PATCH 1/2] fix(nuxt): use original escapes/quotes in page re-exports --- packages/nuxt/src/pages/plugins/page-meta.ts | 16 ++++++++++++---- .../basic/components/global/NonAs\303\247ii.vue" | 5 +++++ .../fixtures/basic/pages/non-ascii/\303\247.vue" | 8 ++++++++ 3 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 "test/fixtures/basic/components/global/NonAs\303\247ii.vue" create mode 100644 "test/fixtures/basic/pages/non-ascii/\303\247.vue" diff --git a/packages/nuxt/src/pages/plugins/page-meta.ts b/packages/nuxt/src/pages/plugins/page-meta.ts index 867098146bc0..01cce87cf215 100644 --- a/packages/nuxt/src/pages/plugins/page-meta.ts +++ b/packages/nuxt/src/pages/plugins/page-meta.ts @@ -65,8 +65,10 @@ export const PageMetaPlugin = createUnplugin((options: PageMetaPluginOptions) => // [vite] Re-export any script imports const scriptImport = imports.find(i => parseMacroQuery(i.specifier).type === 'script') if (scriptImport) { - const specifier = rewriteQuery(scriptImport.specifier) - s.overwrite(0, code.length, `export { default } from ${JSON.stringify(specifier)}`) + const reorderedQuery = rewriteQuery(scriptImport.specifier) + // Avoid using JSON.stringify which can add extra escapes to paths with non-ASCII characters + const quotedSpecifier = getQuotedSpecifier(scriptImport.code)?.replace(scriptImport.specifier, reorderedQuery) ?? JSON.stringify(reorderedQuery) + s.overwrite(0, code.length, `export { default } from ${quotedSpecifier}`) return result() } @@ -77,8 +79,10 @@ export const PageMetaPlugin = createUnplugin((options: PageMetaPluginOptions) => continue } - const specifier = rewriteQuery(match.specifier) - s.overwrite(0, code.length, `export { default } from ${JSON.stringify(specifier)}`) + const reorderedQuery = rewriteQuery(match.specifier) + // Avoid using JSON.stringify which can add extra escapes to paths with non-ASCII characters + const quotedSpecifier = getQuotedSpecifier(match.code)?.replace(match.specifier, reorderedQuery) ?? JSON.stringify(reorderedQuery) + s.overwrite(0, code.length, `export { default } from ${quotedSpecifier}`) return result() } @@ -183,3 +187,7 @@ function parseMacroQuery (id: string) { } return query } + +function getQuotedSpecifier (id: string) { + return id.match(/(["']).*\1/)?.[0] +} diff --git "a/test/fixtures/basic/components/global/NonAs\303\247ii.vue" "b/test/fixtures/basic/components/global/NonAs\303\247ii.vue" new file mode 100644 index 000000000000..66307e17368d --- /dev/null +++ "b/test/fixtures/basic/components/global/NonAs\303\247ii.vue" @@ -0,0 +1,5 @@ + diff --git "a/test/fixtures/basic/pages/non-ascii/\303\247.vue" "b/test/fixtures/basic/pages/non-ascii/\303\247.vue" new file mode 100644 index 000000000000..047335e97111 --- /dev/null +++ "b/test/fixtures/basic/pages/non-ascii/\303\247.vue" @@ -0,0 +1,8 @@ + + + From 56dbf4286e140f7832bc55a5d59effaab14dbc72 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 13 Sep 2023 21:26:10 +0100 Subject: [PATCH 2/2] test: remove nonascii component test as incompatible with webpack --- "test/fixtures/basic/components/global/NonAs\303\247ii.vue" | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 "test/fixtures/basic/components/global/NonAs\303\247ii.vue" diff --git "a/test/fixtures/basic/components/global/NonAs\303\247ii.vue" "b/test/fixtures/basic/components/global/NonAs\303\247ii.vue" deleted file mode 100644 index 66307e17368d..000000000000 --- "a/test/fixtures/basic/components/global/NonAs\303\247ii.vue" +++ /dev/null @@ -1,5 +0,0 @@ -