From bf0b631e7479ed70d02b98b780cf7e4b02d0344b Mon Sep 17 00:00:00 2001
From: OneNail <31649110+OneNail@users.noreply.github.com>
Date: Mon, 30 Aug 2021 15:07:25 +0800
Subject: [PATCH] fix: don't transform new URL(url, import.meta.url) in
comments (#4732)
---
packages/playground/assets/index.html | 5 +++++
packages/vite/src/node/__tests__/scan.spec.ts | 9 ++-------
packages/vite/src/node/optimizer/scan.ts | 7 +++----
packages/vite/src/node/plugins/assetImportMetaUrl.ts | 6 +++++-
packages/vite/src/node/utils.ts | 3 +++
5 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/packages/playground/assets/index.html b/packages/playground/assets/index.html
index 9755cf40470e03..9983d7fc4a5da7 100644
--- a/packages/playground/assets/index.html
+++ b/packages/playground/assets/index.html
@@ -168,9 +168,14 @@
new URL(`./${dynamic}`, import.meta.url)
import unicodeUrl from './テスト-測試-white space.js?url'
text('.unicode-url', unicodeUrl)
+ // const url = new URL('non_existent_file.png', import.meta.url)
const metaUrl = new URL('./nested/asset.png', import.meta.url)
text('.import-meta-url', metaUrl)
document.querySelector('.import-meta-url-img').src = metaUrl
+ /**
+ * don't process the code in the comment
+ * const url = new URL('non_existent_file.png', import.meta.url)
+ */
function testDynamicImportMetaUrl(name, i) {
const metaUrl = new URL(`./nested/${name}.png`, import.meta.url)
diff --git a/packages/vite/src/node/__tests__/scan.spec.ts b/packages/vite/src/node/__tests__/scan.spec.ts
index 95f25c5a90db8e..e54361861bbdc5 100644
--- a/packages/vite/src/node/__tests__/scan.spec.ts
+++ b/packages/vite/src/node/__tests__/scan.spec.ts
@@ -1,10 +1,5 @@
-import {
- scriptRE,
- commentRE,
- importsRE,
- multilineCommentsRE,
- singlelineCommentsRE
-} from '../optimizer/scan'
+import { scriptRE, commentRE, importsRE } from '../optimizer/scan'
+import { multilineCommentsRE, singlelineCommentsRE } from '../utils'
describe('optimizer-scan:script-test', () => {
const scriptContent = `import { defineComponent } from 'vue'
diff --git a/packages/vite/src/node/optimizer/scan.ts b/packages/vite/src/node/optimizer/scan.ts
index 41f116fc1de96d..7ed6b0025a2c9b 100644
--- a/packages/vite/src/node/optimizer/scan.ts
+++ b/packages/vite/src/node/optimizer/scan.ts
@@ -15,7 +15,9 @@ import {
isObject,
cleanUrl,
externalRE,
- dataUrlRE
+ dataUrlRE,
+ multilineCommentsRE,
+ singlelineCommentsRE
} from '../utils'
import {
createPluginContainer,
@@ -40,9 +42,6 @@ const htmlTypesRE = /\.(html|vue|svelte)$/
export const importsRE =
/(?
missing: Record
diff --git a/packages/vite/src/node/plugins/assetImportMetaUrl.ts b/packages/vite/src/node/plugins/assetImportMetaUrl.ts
index 425d53c5cfdccc..c2e503058ac822 100644
--- a/packages/vite/src/node/plugins/assetImportMetaUrl.ts
+++ b/packages/vite/src/node/plugins/assetImportMetaUrl.ts
@@ -3,6 +3,7 @@ import MagicString from 'magic-string'
import path from 'path'
import { fileToUrl } from './asset'
import { ResolvedConfig } from '../config'
+import { multilineCommentsRE, singlelineCommentsRE } from '../utils'
/**
* Convert `new URL('./foo.png', import.meta.url)` to its resolved built URL
@@ -21,9 +22,12 @@ export function assetImportMetaUrlPlugin(config: ResolvedConfig): Plugin {
if (code.includes('new URL') && code.includes(`import.meta.url`)) {
const importMetaUrlRE =
/\bnew\s+URL\s*\(\s*('[^']+'|"[^"]+"|`[^`]+`)\s*,\s*import\.meta\.url\s*\)/g
+ const noCommentsCode = code
+ .replace(multilineCommentsRE, (m) => ' '.repeat(m.length))
+ .replace(singlelineCommentsRE, (m) => ' '.repeat(m.length))
let s: MagicString | null = null
let match: RegExpExecArray | null
- while ((match = importMetaUrlRE.exec(code))) {
+ while ((match = importMetaUrlRE.exec(noCommentsCode))) {
const { 0: exp, 1: rawUrl, index } = match
if (ssr) {
diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts
index 3e350e5051c221..0f8874038c9996 100644
--- a/packages/vite/src/node/utils.ts
+++ b/packages/vite/src/node/utils.ts
@@ -531,3 +531,6 @@ export function resolveHostname(
export function arraify(target: T | T[]): T[] {
return Array.isArray(target) ? target : [target]
}
+
+export const multilineCommentsRE = /\/\*(.|[\r\n])*?\*\//gm
+export const singlelineCommentsRE = /\/\/.*/g