Skip to content

Commit 2fb2cb8

Browse files
committed
Merge branch 'develop'
2 parents eb3cbd7 + 019a41d commit 2fb2cb8

File tree

7 files changed

+78
-4
lines changed

7 files changed

+78
-4
lines changed

__tests__/HtmlInlineScriptPlugin.test.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import ignoreScriptsConfig from './cases/ignore-scripts/webpack.config';
1313
import ignoreHtmlsConfig from './cases/ignore-htmls/webpack.config';
1414
import ignoreScriptsAndHtmlsConfig from './cases/ignore-scripts-and-htmls/webpack.config';
1515
import filenameWithSpecialCharactersConfig from './cases/filename-with-special-characters/webpack.config';
16+
import escapeScriptTagEndConfig from './cases/escape-script-end-tag/webpack.config';
1617

1718
describe('HtmlInlineScriptPlugin', () => {
1819
it('should build simple webpack config without error', async () => {
@@ -358,6 +359,38 @@ describe('HtmlInlineScriptPlugin', () => {
358359
await webpackPromise;
359360
});
360361

362+
it('should escape any "</script>" appears in source', async () => {
363+
const webpackPromise = new Promise((resolve) => {
364+
const compiler = webpack(escapeScriptTagEndConfig);
365+
366+
compiler.run((error, stats) => {
367+
expect(error).toBeNull();
368+
369+
const statsErrors = stats?.compilation.errors;
370+
expect(statsErrors?.length).toBe(0);
371+
372+
const result = fs.readFileSync(
373+
path.join(__dirname, 'cases/escape-script-end-tag/dist/index.html'),
374+
'utf8',
375+
);
376+
377+
const expected = fs.readFileSync(
378+
path.join(__dirname, 'cases/escape-script-end-tag/expected/index.html'),
379+
'utf8',
380+
);
381+
expect(result).toBe(expected);
382+
383+
const expectedFileList = fs.readdirSync(path.join(__dirname, 'cases/escape-script-end-tag/expected/'));
384+
const generatedFileList = fs.readdirSync(path.join(__dirname, 'cases/escape-script-end-tag/dist/'));
385+
expect(expectedFileList.sort()).toEqual(generatedFileList.sort());
386+
387+
resolve(true);
388+
});
389+
});
390+
391+
await webpackPromise;
392+
});
393+
361394
it('should build throw error if options passed to plugin is old options format', async () => {
362395
const initializedPlugin = () => {
363396
// eslint-disable-next-line @typescript-eslint/no-explicit-any, no-new
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<!doctype html><html lang="en"><head><meta charset="utf-8"/><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><meta name="language" content="English"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="minimum-scale=1,initial-scale=1,width=device-width,shrink-to-fit=no"/><title>webpack test</title></head><body><p>This is minimal code to demonstrate webpack usage</p><script defer="defer">document.write('<script>console.log("Hello world");<\/script>'),document.write('<script>console.log("Goodbye world");<\/script>');</script></body></html>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8" />
5+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6+
<meta name="language" content="English" />
7+
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
8+
<meta name="viewport" content="minimum-scale=1, initial-scale=1, width=device-width, shrink-to-fit=no" />
9+
<title>webpack test</title>
10+
</head>
11+
<body>
12+
<p>This is minimal code to demonstrate webpack usage</p>
13+
</body>
14+
</html>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// eslint-disable-next-line no-console
2+
document.write('<script>console.log("Hello world");</script>');
3+
document.write('<script>console.log("Goodbye world");</script>');
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import path from 'path';
2+
import type { Configuration } from 'webpack';
3+
import HtmlWebpackPlugin from 'html-webpack-plugin';
4+
import Self from '../../../dist';
5+
6+
const config: Configuration = {
7+
mode: 'production',
8+
entry: path.join(__dirname, './fixtures/index.js'),
9+
output: {
10+
path: path.join(__dirname, './dist'),
11+
filename: '[name].js'
12+
},
13+
plugins: [
14+
new HtmlWebpackPlugin({
15+
template: path.resolve(__dirname, './fixtures/index.html'),
16+
inject: 'body'
17+
}),
18+
new Self()
19+
]
20+
};
21+
22+
export default config;

src/HtmlInlineScriptPlugin.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ class HtmlInlineScriptPlugin implements WebpackPluginInstance {
8282

8383
return {
8484
tagName: 'script',
85-
innerHTML: asset.source() as string,
85+
// escape '</script>' appears in source
86+
innerHTML: (asset.source() as string).replace(/(<)(\/script>)/g, '\\x3C$2'),
8687
voidTag: false,
8788
attributes: attributesWithoutSrc,
8889
meta: { plugin: 'html-inline-script-webpack-plugin' }

yarn.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2171,9 +2171,9 @@ eslint-plugin-import@^2.22.0:
21712171
tsconfig-paths "^3.14.1"
21722172

21732173
eslint-plugin-jest@^26.1.1:
2174-
version "26.6.0"
2175-
resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-26.6.0.tgz#546804fa42da75d7d58d4d3b278d5186abd3f6c0"
2176-
integrity sha512-f8n46/97ZFdU4KqeQYqO8AEVGIhHWvkpgNBWHH3jrM28/y8llnbf3IjfIKv6p2pZIMinK1PCqbbROxs9Eud02Q==
2174+
version "26.7.0"
2175+
resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-26.7.0.tgz#41d405ac9143e1284a3401282db47ed459436778"
2176+
integrity sha512-/YNitdfG3o3cC6juZziAdkk6nfJt01jXVfj4AgaYVLs7bupHzRDL5K+eipdzhDXtQsiqaX1TzfwSuRlEgeln1A==
21772177
dependencies:
21782178
"@typescript-eslint/utils" "^5.10.0"
21792179

0 commit comments

Comments
 (0)