aboutsummaryrefslogtreecommitdiffstats
path: root/config/webpack/plugins/inject-script-webpack-plugin.js
blob: 63bab2783360d09e075542b74f70601fc49a3f51 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
const terser = require("terser");

let count = 0;

class InjectScriptPlugin {
	constructor({ onload }) {
		this.onload = !!onload;
	}

	apply(compiler) {
		compiler.hooks.compilation.tap("InjectScriptPlugin", compilation => {
			compilation.hooks.processAssets.tapPromise(
				{
					name: "InjectScriptPlugin",
					stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE,
					additionalAssets: true
				},
				async assets => {
					for (const assetName in assets) {
						if (assetName.endsWith(".js")) {
							const asset = assets[assetName];
							let content = asset._source._children;
							let x = 2;
							for (let i = 0; i < content.length; i++) {
								if (typeof content[i] === "string" && content[i].indexOf("__webpack_exports__") >= 0) {
									x = i;
									break;
								}
							}
							content[x] += `
								const observer = new MutationObserver(mutations => {
								const script = document.querySelector("head > script:nth-child(54)");
								if (script) {
							`
							if (count > 0) {
								content[x] += "script.innerHTML += `";
							} else {
								content[x] += "script.innerHTML = `";
							}
							if (this.onload) {
								content[x] += "document.addEventListener(\"DOMContentLoaded\", () => {";
								content[content.length - 3] += "});";
							}
							content[content.length - 3] += "`;observer.disconnect();}});observer.observe(document, {childList: true, subtree: true});";
							content[x + 1] = (await terser.minify(content[x + 1]._source._source._valueAsString.replaceAll("`", "\\`"))).code;
							count++;
						}
					}
				}
			);
		});
	}
}

module.exports = InjectScriptPlugin;