aboutsummaryrefslogtreecommitdiffstats
path: root/config/webpack/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'config/webpack/plugins')
-rw-r--r--config/webpack/plugins/create-manifest-webpack-plugin/index.js50
-rw-r--r--config/webpack/plugins/inject-script-webpack-plugin.js79
-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
-rw-r--r--config/webpack/plugins/sanitize-scripts-import-webpack-plugin.js54
5 files changed, 45 insertions, 169 deletions
diff --git a/config/webpack/plugins/create-manifest-webpack-plugin/index.js b/config/webpack/plugins/create-manifest-webpack-plugin/index.js
index 7852d62..3a16770 100644
--- a/config/webpack/plugins/create-manifest-webpack-plugin/index.js
+++ b/config/webpack/plugins/create-manifest-webpack-plugin/index.js
@@ -1,22 +1,11 @@
const { sources } = require("webpack");
const path = require("path");
-const scripts = require(path.resolve(SOURCE_DIR, "scripts.json"));
-
-const { version } = require(path.resolve(ROOT_DIR, "package.json"));
const { getScriptRuntimeFromType } = webpackRequire("utils/script-runtime");
const { getFileNameHash } = webpackRequire("utils/file-name-hash");
+const { formatScripts } = webpackRequire("utils/format-scripts");
class CreateManifestPlugin {
- constructor() {
- this.scripts = {};
- this.manifest = webpackRequire("plugins/create-manifest-webpack-plugin/manifest-template.json");
- for (const scriptType in scripts) {
- const scriptRuntime = getScriptRuntimeFromType(scriptType);
- this.scripts[scriptRuntime] = { ...this.scripts[scriptRuntime], ...scripts[scriptType] };
- }
- }
-
apply(compiler) {
compiler.hooks.compilation.tap("CreateManifestPlugin", compilation => {
compilation.hooks.processAssets.tap(
@@ -26,35 +15,24 @@ class CreateManifestPlugin {
additionalAssets: true
},
() => {
- this.manifest.version = version;
- this.manifest.content_scripts = []
-
- for (const scriptRuntime in this.scripts) {
- if (Object.keys(this.scripts[scriptRuntime]).length > 0) {
- const currentScripts = this.scripts[scriptRuntime];
-
- let paths = {};
- for (const scriptName in currentScripts) {
- const scriptPath = currentScripts[scriptName];
- if (!path[scriptPath]) {
- paths[scriptPath] = [];
- }
- paths[scriptPath].push(scriptName);
- }
-
- for (const scriptPath in paths) {
- this.manifest.content_scripts.push({
- matches: [`*://banglarbhumi.gov.in/${scriptPath}`],
- js: [`scripts/${getFileNameHash(scriptPath)}/${scriptRuntime}.js`],
- run_at: scriptRuntime
- });
- }
+ const scripts = formatScripts(require(path.resolve(SOURCE_DIR, "scripts.json")));
+ const manifest = webpackRequire("plugins/create-manifest-webpack-plugin/manifest-template.json");
+ manifest.version = require(path.resolve(ROOT_DIR, "package.json")).version;
+ manifest.content_scripts = []
+
+ for (const scriptPath in scripts) {
+ for (const scriptType in scripts[scriptPath]) {
+ manifest.content_scripts.push({
+ matches: [`*://banglarbhumi.gov.in/BanglarBhumi/${scriptPath}`],
+ js: [`scripts/${getFileNameHash(scriptPath)}/${scriptType}.js`],
+ run_at: getScriptRuntimeFromType(scriptType)
+ });
}
}
compilation.emitAsset(
"manifest.json",
- new sources.RawSource(JSON.stringify(this.manifest))
+ new sources.RawSource(JSON.stringify(manifest))
);
}
);
diff --git a/config/webpack/plugins/inject-script-webpack-plugin.js b/config/webpack/plugins/inject-script-webpack-plugin.js
deleted file mode 100644
index b6525f6..0000000
--- a/config/webpack/plugins/inject-script-webpack-plugin.js
+++ /dev/null
@@ -1,79 +0,0 @@
-const { sources } = require("webpack");
-const terser = require("terser");
-
-const getScriptCodeScoped = (scriptCode, loaded) => scriptCode
- ? (loaded
- ? `document.addEventListener(\"DOMContentLoaded\", () => {${scriptCode}});`
- : `(() => {${scriptCode}})();`)
- : "";
-
-class InjectScriptPlugin {
- apply(compiler) {
- compiler.hooks.compilation.tap("InjectScriptPlugin", compilation => {
- compilation.hooks.processAssets.tapPromise(
- {
- name: "InjectScriptPlugin",
- stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE,
- additionalAssets: true
- },
- async assets => {
- for (const assetName in assets) {
- if (assetName.endsWith("document_start.js")) {
- const currentAssetContent = compilation.getAsset(assetName).source.source();
- const scripts = {
- before: "",
- injected: "",
- injected_and_loaded: ""
- };
- let scriptEnd = 0;
- while (true) {
- const start = currentAssetContent.indexOf("/*<--\t", scriptEnd + 1);
- if (start < 0) {
- break;
- } else {
- const end = currentAssetContent.indexOf("\t-->*/", start + 1);
- if (end < 0) {
- throw Error("Failed to parse scripts with document_start runtime");
- } else {
- scriptEnd = currentAssetContent.indexOf("\n/*<---->*/", end + 1);
- if (scriptEnd < 0) {
- throw Error("Failed to parse scripts with document_start runtime");
- }
- const scriptType = currentAssetContent.substring(start + 6, end);
- scripts[scriptType.trim()] += currentAssetContent.substring(end + 6, scriptEnd);
- scriptEnd += 11;
- }
- }
- }
- for (const scriptType in scripts) {
- const currentScriptCode = (await terser.minify(scripts[scriptType].replaceAll("`", "\\`"))).code;
- scripts[scriptType] = currentScriptCode
- ? (scriptType === "injected_and_loaded"
- ? `document.addEventListener(\"DOMContentLoaded\", () => {${currentScriptCode}});`
- : `(() => {${currentScriptCode}})();`)
- : "";
- }
- const injectedCode = (scripts.injected || scripts.injected_and_loaded)
- ? `const o = new MutationObserver(() => {
- const s = document.querySelector("head > script:nth-child(54)");
- if (s) {
- s.innerHTML = \`${scripts.injected}${scripts.injected_and_loaded}\`;
- o.disconnect();
- }
- });
- o.observe(document, {childList: true, subtree: true});`
- : "";
- const resultantCode = scripts.before + injectedCode;
- compilation.updateAsset(
- assetName,
- new sources.RawSource(resultantCode)
- );
- }
- }
- }
- );
- });
- }
-}
-
-module.exports = InjectScriptPlugin;
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;
diff --git a/config/webpack/plugins/sanitize-scripts-import-webpack-plugin.js b/config/webpack/plugins/sanitize-scripts-import-webpack-plugin.js
deleted file mode 100644
index 37c2cf4..0000000
--- a/config/webpack/plugins/sanitize-scripts-import-webpack-plugin.js
+++ /dev/null
@@ -1,54 +0,0 @@
-const { sources } = require("webpack");
-
-const perpectualIndexOf = (string, characterList, start) => {
- if (start > 0) {
- let x = start;
- for (let i = 0; i < characterList.length; i++) {
- x = string.indexOf(characterList[i], x + 1);
- if (x < 0) {
- return -1;
- }
- }
- return x;
- } else {
- return -1;
- }
-};
-
-class SanitizeScriptsImportPlugin {
- apply(compiler) {
- compiler.hooks.compilation.tap("SanitizeScriptsImportPlugin", compilation => {
- compilation.hooks.processAssets.tap(
- {
- name: "SanitizeScriptsImportPlugin",
- stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE,
- additionalAssets: true
- },
- assets => {
- for (const assetName in assets) {
- if (assetName.endsWith(".js")) {
- const currentAssetContent = compilation.getAsset(assetName).source.source();
- let previouslyEnded = 0;
- let code = "";
- while (true) {
- const start = perpectualIndexOf(currentAssetContent, ["\n/***/", "\n/***/", "\n"], previouslyEnded + 1);
- previouslyEnded = perpectualIndexOf(currentAssetContent, ["\n/***/"], start + 1);
- if (previouslyEnded < 0) {
- break;
- } else {
- code += currentAssetContent.substring(start, previouslyEnded);
- }
- }
- compilation.updateAsset(
- assetName,
- new sources.RawSource(code)
- );
- }
- }
- }
- );
- });
- }
-}
-
-module.exports = SanitizeScriptsImportPlugin;