aboutsummaryrefslogtreecommitdiffstats
path: root/config/webpack/plugins
diff options
context:
space:
mode:
authorArpit Chakladar <54011232+arpitchakladar@users.noreply.github.com>2023-02-05 22:57:54 +0530
committerArpit Chakladar <54011232+arpitchakladar@users.noreply.github.com>2023-02-05 22:57:54 +0530
commit1a301791bb621fa01fa76e9403b23fe1f4a120af (patch)
treeebfff3e1b7c366c738750644f4fdefaa4fef21b7 /config/webpack/plugins
parentc690f47a786eef27900873ac9fe75134995f156a (diff)
downloadbanglar-bhumi-utils-1a301791bb621fa01fa76e9403b23fe1f4a120af.tar.gz
banglar-bhumi-utils-1a301791bb621fa01fa76e9403b23fe1f4a120af.zip
Added a more extensive way to automate script development.
Diffstat (limited to 'config/webpack/plugins')
-rw-r--r--config/webpack/plugins/create-manifest-webpack-plugin/index.js52
-rw-r--r--config/webpack/plugins/create-manifest-webpack-plugin/manifest-template.json9
-rw-r--r--config/webpack/plugins/inject-script-webpack-plugin.js55
3 files changed, 116 insertions, 0 deletions
diff --git a/config/webpack/plugins/create-manifest-webpack-plugin/index.js b/config/webpack/plugins/create-manifest-webpack-plugin/index.js
new file mode 100644
index 0000000..2ab2721
--- /dev/null
+++ b/config/webpack/plugins/create-manifest-webpack-plugin/index.js
@@ -0,0 +1,52 @@
+const path = require("path");
+
+const { version } = require(path.resolve(process.env.ROOT_DIR, "package.json"));
+
+const scriptTypeRunAtMap = {
+ injected: "document_start",
+ rendered: "document_end",
+ loaded: "document_idle"
+};
+
+class CreateManifestPlugin {
+ constructor(scripts) {
+ this.scripts = scripts;
+ this.manifest = require("./manifest-template.json");
+ this.scripts.injected = this.scripts.injected
+ ? { ...this.scripts.injected, ...(this.scripts.injected_and_loaded || {}) }
+ : this.scripts.injected_and_loaded;
+ this.scripts.injected_and_loaded = undefined;
+ }
+
+ apply(compiler) {
+ compiler.hooks.compilation.tap("CreateManifestPlugin", compilation => {
+ compilation.hooks.processAssets.tap(
+ {
+ name: "CreateManifestPlugin",
+ stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE,
+ additionalAssets: true
+ },
+ assets => {
+ this.manifest.version = version;
+ this.manifest.content_scripts = []
+
+ for (const scriptType in scriptTypeRunAtMap) {
+ if (this.scripts[scriptType]) {
+ this.manifest.content_scripts.push({
+ matches: ["https://banglarbhumi.gov.in/*", "http://banglarbhumi.gov.in/*"],
+ js: Object.keys(this.scripts[scriptType]),
+ run_at: scriptTypeRunAtMap[scriptType]
+ });
+ }
+ }
+
+ const encoder = new TextEncoder("UTF-8");
+ const { RawSource } = compiler.webpack.sources;
+ assets["manifest.json"] = new RawSource(Buffer.from(encoder.encode(JSON.stringify(this.manifest).buffer)));
+ }
+ );
+ });
+ }
+}
+
+module.exports = CreateManifestPlugin;
diff --git a/config/webpack/plugins/create-manifest-webpack-plugin/manifest-template.json b/config/webpack/plugins/create-manifest-webpack-plugin/manifest-template.json
new file mode 100644
index 0000000..0c59ef2
--- /dev/null
+++ b/config/webpack/plugins/create-manifest-webpack-plugin/manifest-template.json
@@ -0,0 +1,9 @@
+{
+ "manifest_version": 3,
+ "name": "Banglar Bhumi Utils",
+ "permissions": ["scripting"],
+ "description": "A chrome extension to improve functionality of the banglarbhumi.gov.in website.",
+ "icons": {
+ "512": "icon512.png"
+ }
+}
diff --git a/config/webpack/plugins/inject-script-webpack-plugin.js b/config/webpack/plugins/inject-script-webpack-plugin.js
new file mode 100644
index 0000000..63bab27
--- /dev/null
+++ b/config/webpack/plugins/inject-script-webpack-plugin.js
@@ -0,0 +1,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;