aboutsummaryrefslogtreecommitdiffstats
path: root/config/webpack/plugins/inject-script-webpack-plugin
diff options
context:
space:
mode:
Diffstat (limited to 'config/webpack/plugins/inject-script-webpack-plugin')
-rw-r--r--config/webpack/plugins/inject-script-webpack-plugin/get-injection-code.js1
-rw-r--r--config/webpack/plugins/inject-script-webpack-plugin/index.js30
2 files changed, 31 insertions, 0 deletions
diff --git a/config/webpack/plugins/inject-script-webpack-plugin/get-injection-code.js b/config/webpack/plugins/inject-script-webpack-plugin/get-injection-code.js
new file mode 100644
index 0000000..90a1cb7
--- /dev/null
+++ b/config/webpack/plugins/inject-script-webpack-plugin/get-injection-code.js
@@ -0,0 +1 @@
+module.exports = code => `const o=new MutationObserver(()=>{let t=document.querySelector("head > script:nth-child(54)");if(t){let e=\`(()=>{${code.replaceAll("`","\\`")}})();\`;null==t.getAttribute("data-replaced")?(t.innerHTML=e,t.setAttribute("data-replaced","")):t.innerHTML+=e,o.disconnect()}});o.observe(document,{childList:!0,subtree:!0});`;
diff --git a/config/webpack/plugins/inject-script-webpack-plugin/index.js b/config/webpack/plugins/inject-script-webpack-plugin/index.js
new file mode 100644
index 0000000..b7b5940
--- /dev/null
+++ b/config/webpack/plugins/inject-script-webpack-plugin/index.js
@@ -0,0 +1,30 @@
+const { sources } = require("webpack");
+const terser = require("terser");
+
+const getInjectionCode = webpackRequire("plugins/inject-script-webpack-plugin/get-injection-code");
+
+class InjectScriptPlugin {
+ apply(compiler) {
+ compiler.hooks.compilation.tap("InjectScriptPlugin", compilation => {
+ compilation.hooks.processAssets.tapPromise(
+ {
+ name: "InjectScriptPlugin",
+ stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ANALYSE,
+ additionalAssets: true
+ },
+ async assets => {
+ for (const assetName in assets) {
+ if (assetName.endsWith("injected.js")) {
+ compilation.updateAsset(
+ assetName,
+ new sources.RawSource(getInjectionCode(compilation.getAsset(assetName).source.source()))
+ );
+ }
+ }
+ }
+ );
+ });
+ }
+}
+
+module.exports = InjectScriptPlugin;