From 5abbd189bae4457667a85c797481a379f1547769 Mon Sep 17 00:00:00 2001 From: patak-js Date: Fri, 15 Oct 2021 18:58:56 +0200 Subject: [PATCH 1/4] fix(html): tags prepend doctype regex --- .../playground/html/__tests__/html.spec.ts | 19 +++++++++++++++++ packages/playground/html/noHead.html | 7 +++++++ packages/playground/html/vite.config.js | 16 +++++++------- packages/vite/src/node/plugins/html.ts | 21 ++++++++++++------- 4 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 packages/playground/html/noHead.html diff --git a/packages/playground/html/__tests__/html.spec.ts b/packages/playground/html/__tests__/html.spec.ts index a129fd6ed3b07f..7a9a0a2ac45e81 100644 --- a/packages/playground/html/__tests__/html.spec.ts +++ b/packages/playground/html/__tests__/html.spec.ts @@ -165,3 +165,22 @@ if (isBuild) { }) }) } + + +describe('noHead', () => { + // If there isn't a , scripts are injected after + + beforeAll(async () => { + // viteTestUrl is globally injected in scripts/jestPerTestSetup.ts + await page.goto(viteTestUrl + '/noHead.html') + }) + + test('noHead tags transform', async () => { + const el = await page.$('meta[name=description]') + expect(await el.getAttribute('content')).toBe('a vite app') + + const kw = await page.$('meta[name=keywords]') + expect(await kw.getAttribute('content')).toBe('es modules') + }) + +}) diff --git a/packages/playground/html/noHead.html b/packages/playground/html/noHead.html new file mode 100644 index 00000000000000..b0b5947debd00c --- /dev/null +++ b/packages/playground/html/noHead.html @@ -0,0 +1,7 @@ + + + +

Hello

+ + + diff --git a/packages/playground/html/vite.config.js b/packages/playground/html/vite.config.js index 36d248e954921e..6db8f090208859 100644 --- a/packages/playground/html/vite.config.js +++ b/packages/playground/html/vite.config.js @@ -12,6 +12,7 @@ module.exports = { scriptAsync: resolve(__dirname, 'scriptAsync.html'), scriptMixed: resolve(__dirname, 'scriptMixed.html'), zeroJS: resolve(__dirname, 'zeroJS.html'), + noHead: resolve(__dirname, 'noHead.html'), inline1: resolve(__dirname, 'inline/shared-1.html'), inline2: resolve(__dirname, 'inline/shared-2.html'), inline3: resolve(__dirname, 'inline/unique.html') @@ -24,18 +25,19 @@ module.exports = { name: 'pre-transform', transformIndexHtml: { enforce: 'pre', - transform(html) { + transform(html, { filename }) { if (html.includes('/@vite/client')) { throw new Error('pre transform applied at wrong time!') } + const head = ` + + + + {{ title }} + ` return ` - - - - - {{ title }} - +${filename.includes('noHead') ? '' : head} ${html} diff --git a/packages/vite/src/node/plugins/html.ts b/packages/vite/src/node/plugins/html.ts index f050f018db1f84..00f7ea9f28e002 100644 --- a/packages/vite/src/node/plugins/html.ts +++ b/packages/vite/src/node/plugins/html.ts @@ -622,7 +622,8 @@ function toPublicPath(filename: string, config: ResolvedConfig) { } const headInjectRE = /([ \t]*)<\/head>/ -const headPrependInjectRE = [/([ \t]*)]*>/, //i] +const headPrependInjectRE = /([ \t]*)]*>/ +const doctypePrependInjectRE = //i function injectToHead( html: string, tags: HtmlTagDescriptor[], @@ -630,13 +631,17 @@ function injectToHead( ) { if (prepend) { // inject after head or doctype - for (const re of headPrependInjectRE) { - if (re.test(html)) { - return html.replace( - re, - (match, p1) => `${match}\n${serializeTags(tags, incrementIndent(p1))}` - ) - } + if (headPrependInjectRE.test(html)) { + return html.replace( + headPrependInjectRE, + (match, p1) => `${match}\n${serializeTags(tags, incrementIndent(p1))}` + ) + } + else if(doctypePrependInjectRE) { + return html.replace( + doctypePrependInjectRE, + `$&\n${serializeTags(tags)}` + ) } } else { // inject before head close From 72e41ae69b39f2448227b55a457ac0b3c9ad5059 Mon Sep 17 00:00:00 2001 From: patak Date: Fri, 15 Oct 2021 19:58:05 +0200 Subject: [PATCH 2/4] fix: test condition --- packages/vite/src/node/plugins/html.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/plugins/html.ts b/packages/vite/src/node/plugins/html.ts index 00f7ea9f28e002..ea02e6a3a59c45 100644 --- a/packages/vite/src/node/plugins/html.ts +++ b/packages/vite/src/node/plugins/html.ts @@ -637,7 +637,7 @@ function injectToHead( (match, p1) => `${match}\n${serializeTags(tags, incrementIndent(p1))}` ) } - else if(doctypePrependInjectRE) { + else if(doctypePrependInjectRE.test(html)) { return html.replace( doctypePrependInjectRE, `$&\n${serializeTags(tags)}` From 820be0a62c323cecce205195264a9c64a63348a1 Mon Sep 17 00:00:00 2001 From: patak Date: Fri, 15 Oct 2021 22:26:44 +0200 Subject: [PATCH 3/4] chore: spacing --- packages/playground/html/__tests__/html.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/playground/html/__tests__/html.spec.ts b/packages/playground/html/__tests__/html.spec.ts index 7a9a0a2ac45e81..3300bfcc89e5b6 100644 --- a/packages/playground/html/__tests__/html.spec.ts +++ b/packages/playground/html/__tests__/html.spec.ts @@ -166,7 +166,6 @@ if (isBuild) { }) } - describe('noHead', () => { // If there isn't a , scripts are injected after From 09a23c0b7a47683c1cc83373a2622693f3063495 Mon Sep 17 00:00:00 2001 From: patak Date: Fri, 15 Oct 2021 22:27:21 +0200 Subject: [PATCH 4/4] chore: spacing --- packages/playground/html/__tests__/html.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/playground/html/__tests__/html.spec.ts b/packages/playground/html/__tests__/html.spec.ts index 3300bfcc89e5b6..fbdb711d292e9c 100644 --- a/packages/playground/html/__tests__/html.spec.ts +++ b/packages/playground/html/__tests__/html.spec.ts @@ -181,5 +181,4 @@ describe('noHead', () => { const kw = await page.$('meta[name=keywords]') expect(await kw.getAttribute('content')).toBe('es modules') }) - })