aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/webpack.config.js41
-rw-r--r--config/webpack/loader/dynamic-imports-loader.js4
-rw-r--r--config/webpack/plugins/create-manifest-webpack-plugin/index.js4
-rw-r--r--config/webpack/plugins/inject-script-webpack-plugin.js24
-rw-r--r--config/webpack/utils/file-name-hash.js10
-rw-r--r--config/webpack/utils/scripts.js1
-rw-r--r--config/webpack/utils/shared-modules.js2
-rw-r--r--src/scripts/captcha.ts3
-rw-r--r--src/scripts/functionality/view-khatian.ts1
-rw-r--r--src/scripts/login.ts1
-rw-r--r--src/scripts/optimize.ts22
-rw-r--r--src/scripts/stop-blocking.ts2
-rw-r--r--src/shared/autofill-otp.ts2
-rw-r--r--src/shared/modify-dom.ts8
-rw-r--r--src/shared/observe-dom.ts31
-rw-r--r--src/shared/styling.ts1
16 files changed, 118 insertions, 39 deletions
diff --git a/config/webpack.config.js b/config/webpack.config.js
index 206eea1..010a51f 100644
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -6,6 +6,7 @@ const CopyPlugin = require("copy-webpack-plugin");
global.ROOT_DIR = path.resolve(__dirname, "..");
global.CONFIG_DIR = path.resolve(ROOT_DIR, "config");
global.SOURCE_DIR = path.resolve(ROOT_DIR, "src");
+global.production = process.env.NODE_ENV === "production";
global.webpackRequire = modulePath => require(path.resolve(CONFIG_DIR, "webpack", modulePath));
@@ -21,24 +22,38 @@ const scripts = webpackRequire("utils/scripts");
const sharedModules = webpackRequire("utils/shared-modules");
const uninjectedScriptEntries = {};
-const injectedScriptEntries = {};
+const injectedAfterScriptEntries = {};
+const injectedBeforeScriptEntries = {};
const sharedModuleEntries = {};
const sharedModuleExternals = {};
for (const scriptPath in scripts) {
for (const scriptType in scripts[scriptPath]) {
const currentScripts = scripts[scriptPath][scriptType];
- const scriptEntries = scriptType.startsWith("injected") ? injectedScriptEntries : uninjectedScriptEntries;
+ let scriptEntries;
+
+ switch (scriptType) {
+ case "injected":
+ scriptEntries = injectedAfterScriptEntries;
+ break;
+
+ case "injected-before":
+ scriptEntries = injectedBeforeScriptEntries;
+ break;
+
+ default:
+ scriptEntries = uninjectedScriptEntries;
+ }
scriptEntries[`${scriptType} - "${scriptPath}"`] = {
import: inlineJavascript(currentScripts.map(script => `import "${path.resolve(SOURCE_DIR, "scripts", script)}";`).join("\n")),
- filename: `scripts/${getFileNameHash(scriptPath)}-${scriptType}.js`
+ filename: `scripts/${getFileNameHash(scriptType, scriptPath)}.js`
};
}
}
for (const sharedModule of sharedModules) {
- const sharedModuleNameHash = getFileNameHash(sharedModule);
+ const sharedModuleNameHash = getFileNameHash(sharedModule, "shared");
sharedModuleEntries[sharedModule] = {
import: path.resolve(SOURCE_DIR, "shared", sharedModule),
filename: `shared/${sharedModuleNameHash}.js`
@@ -110,17 +125,28 @@ const uninjectedScriptConfiguration = merge(
}
);
-const injectedScriptConfiguration = merge(
+const injectedAfterScriptConfiguration = merge(
commonOptions,
scriptOptions,
{
- entry: injectedScriptEntries,
+ entry: injectedAfterScriptEntries,
plugins: [
new InjectScriptPlugin()
]
}
);
+const injectedBeforeScriptConfiguration = merge(
+ commonOptions,
+ scriptOptions,
+ {
+ entry: injectedBeforeScriptEntries,
+ plugins: [
+ new InjectScriptPlugin(true)
+ ]
+ }
+);
+
const sharedModulesConfiguration = merge(
commonOptions,
ecmaScriptModuleOptions,
@@ -137,6 +163,7 @@ const sharedModulesConfiguration = merge(
module.exports = [
uninjectedScriptConfiguration,
- injectedScriptConfiguration,
+ injectedAfterScriptConfiguration,
+ injectedBeforeScriptConfiguration,
sharedModulesConfiguration
];
diff --git a/config/webpack/loader/dynamic-imports-loader.js b/config/webpack/loader/dynamic-imports-loader.js
index 06f9704..12eb5b7 100644
--- a/config/webpack/loader/dynamic-imports-loader.js
+++ b/config/webpack/loader/dynamic-imports-loader.js
@@ -5,18 +5,18 @@ const sharedModules = webpackRequire("utils/shared-modules.js");
module.exports = source => {
const manager = new ImportManager(source);
-
let modified = false;
for (const unit of manager.imports.es6.units) {
const moduleIndex = sharedModules.indexOf(unit.module.name);
+
if (moduleIndex >= 0 && unit.type === "es6") {
const importedModuleNames = unit.members.entities
.map(entity => `\t${entity.name}`)
.concat(unit.defaultMembers.entities.map(entity => `\tdefault: ${entity.name}`))
.join(",\n");
- const importStatement = `const {\n${importedModuleNames}\n} = await import(/* webpackIgnore: true */ "/shared/${getFileNameHash(sharedModules[moduleIndex])}.js");\n`;
+ const importStatement = `const {\n${importedModuleNames}\n} = await import(/* webpackIgnore: true */ "/shared/${getFileNameHash(sharedModules[moduleIndex], "shared")}.js");\n`;
unit.methods = {
makeUntraceable() {}
diff --git a/config/webpack/plugins/create-manifest-webpack-plugin/index.js b/config/webpack/plugins/create-manifest-webpack-plugin/index.js
index 4ab363f..785d604 100644
--- a/config/webpack/plugins/create-manifest-webpack-plugin/index.js
+++ b/config/webpack/plugins/create-manifest-webpack-plugin/index.js
@@ -29,7 +29,7 @@ class CreateManifestPlugin {
manifest.content_scripts.push({
matches,
- js: [`scripts/${getFileNameHash(scriptPath)}-${scriptType}.js`],
+ js: [`scripts/${getFileNameHash(scriptType, scriptPath)}.js`],
run_at: getScriptRuntimeFromType(scriptType)
});
}
@@ -44,7 +44,7 @@ class CreateManifestPlugin {
}
for (const sharedModule of sharedModules) {
- resources.push(`shared/${getFileNameHash(sharedModule)}.js`);
+ resources.push(`shared/${getFileNameHash(sharedModule, "shared")}.js`);
}
if (resources.length > 0) {
diff --git a/config/webpack/plugins/inject-script-webpack-plugin.js b/config/webpack/plugins/inject-script-webpack-plugin.js
index 862b3f0..c597e9a 100644
--- a/config/webpack/plugins/inject-script-webpack-plugin.js
+++ b/config/webpack/plugins/inject-script-webpack-plugin.js
@@ -3,6 +3,10 @@ const { sources } = require("webpack");
const { getInjectionCode } = webpackRequire("utils/get-injection-code");
class InjectScriptPlugin {
+ constructor(insertedBefore = false) {
+ this.insertedBefore = insertedBefore;
+ }
+
apply(compiler) {
compiler.hooks.compilation.tap("InjectScriptPlugin", compilation => {
compilation.hooks.processAssets.tapPromise(
@@ -13,21 +17,15 @@ class InjectScriptPlugin {
},
async assets => {
for (const assetName in assets) {
- let injected = false;
- let injected_before = false;
-
- if (assetName.endsWith("injected.js"))
- injected = true;
-
- else if (assetName.endsWith("injected-before.js")) {
- injected = true;
- injected_before = true;
- }
-
- if (injected) {
+ if (/\.js$/.test(assetName)) {
compilation.updateAsset(
assetName,
- new sources.RawSource(getInjectionCode(compilation.getAsset(assetName).source.source(), injected_before))
+ new sources.RawSource(
+ getInjectionCode(
+ compilation.getAsset(assetName).source.source(),
+ this.insertedBefore
+ )
+ )
);
}
}
diff --git a/config/webpack/utils/file-name-hash.js b/config/webpack/utils/file-name-hash.js
index e3988a9..889e9a4 100644
--- a/config/webpack/utils/file-name-hash.js
+++ b/config/webpack/utils/file-name-hash.js
@@ -1,3 +1,11 @@
const crypto = require("crypto");
-module.exports.getFileNameHash = fileName => crypto.createHash("md5").update(fileName).digest("hex").substring(16);
+module.exports.getFileNameHash = (fileName, prefix) => {
+ const finalFileName = `${prefix}-${fileName}`;
+ const hash = crypto
+ .createHash("md5")
+ .update(finalFileName)
+ .digest("hex");
+
+ return production ? hash : `${fileName}-${hash.substring(16)}`;
+};
diff --git a/config/webpack/utils/scripts.js b/config/webpack/utils/scripts.js
index 2196737..427aaab 100644
--- a/config/webpack/utils/scripts.js
+++ b/config/webpack/utils/scripts.js
@@ -5,6 +5,7 @@ const formattedScripts = {};
for (const scriptType in scripts) {
const currentScripts = scripts[scriptType];
+
for (const scriptName in currentScripts) {
const scriptPath = currentScripts[scriptName];
formattedScripts[scriptPath] = formattedScripts[scriptPath] || {};
diff --git a/config/webpack/utils/shared-modules.js b/config/webpack/utils/shared-modules.js
index f10d4a1..974145f 100644
--- a/config/webpack/utils/shared-modules.js
+++ b/config/webpack/utils/shared-modules.js
@@ -3,6 +3,6 @@ const fs = require("fs");
const sharedModules = fs.readdirSync(path.resolve(SOURCE_DIR, "shared"))
.filter(sharedModule => !sharedModule.endsWith("import-shared.js"))
- .map(sharedModule => sharedModule.substring(0, sharedModule.length - 3));4
+ .map(sharedModule => sharedModule.substring(0, sharedModule.length - 3));
module.exports = sharedModules;
diff --git a/src/scripts/captcha.ts b/src/scripts/captcha.ts
index 0eb36c9..453443c 100644
--- a/src/scripts/captcha.ts
+++ b/src/scripts/captcha.ts
@@ -1,9 +1,12 @@
const autofillCaptcha = () => {
const captchas = Array.from(document.querySelectorAll("#captchaText")) as HTMLInputElement[];
+
for (const captcha of captchas) {
const captchaParentElement = captcha.parentElement!;
+
if (captchaParentElement.id === "drawTextSpan") {
const captchaInput = captchaParentElement.parentElement!.querySelector("#drawText1") as HTMLInputElement | null;
+
if (captchaInput) {
captchaInput.value = captcha.value.replaceAll(" ", "");
captchaParentElement.parentElement!.style.display = "none";
diff --git a/src/scripts/functionality/view-khatian.ts b/src/scripts/functionality/view-khatian.ts
index 9f35762..e1d3831 100644
--- a/src/scripts/functionality/view-khatian.ts
+++ b/src/scripts/functionality/view-khatian.ts
@@ -9,6 +9,7 @@ document.addEventListener("DOMContentLoaded", () => {
arguments[2] = (data: any) => {
callback(data);
const tableElement = document.querySelector("#khdetails > table > tbody > tr > td:nth-child(1) > div:nth-child(5) > table > tbody") as HTMLElement | null;
+
if (tableElement) {
tableElement.style.height = "auto";
tableElement.style.width = "100%";
diff --git a/src/scripts/login.ts b/src/scripts/login.ts
index e2d5d5b..390131c 100644
--- a/src/scripts/login.ts
+++ b/src/scripts/login.ts
@@ -36,6 +36,7 @@ document.addEventListener("DOMContentLoaded", () => {
if (!data.exception && data.checkmsg === "success") {
loginData = arguments[1];
}
+
callback(data);
};
}
diff --git a/src/scripts/optimize.ts b/src/scripts/optimize.ts
index c8125ee..55492b6 100644
--- a/src/scripts/optimize.ts
+++ b/src/scripts/optimize.ts
@@ -1,7 +1,23 @@
import { modifyDOM } from "@/shared/modify-dom";
modifyDOM([
- ["head > script:nth-child(34)", { src: null }],
- ["head > script:nth-child(36)", { src: null, innerHTML: "$.prototype.nivoSlider = () => {};" }],
- ["head > script:nth-child(43)", { src: null }]
+ [
+ "head > script:nth-child(34)",
+ {
+ src: null
+ }
+ ],
+ [
+ "head > script:nth-child(36)",
+ {
+ src: null,
+ innerHTML: "$.prototype.nivoSlider = () => {};"
+ }
+ ],
+ [
+ "head > script:nth-child(43)",
+ {
+ src: null
+ }
+ ]
]);
diff --git a/src/scripts/stop-blocking.ts b/src/scripts/stop-blocking.ts
index 57357f8..f418f66 100644
--- a/src/scripts/stop-blocking.ts
+++ b/src/scripts/stop-blocking.ts
@@ -4,6 +4,7 @@ $.prototype.bind = function() {
if (arguments[0].trim() === "cut copy paste") {
arguments[1] = (e: any) => {};
}
+
return proxiedBind.apply(this, Array.from(arguments) as any);
}
@@ -11,6 +12,7 @@ const proxiedKeydown = $.prototype.keydown;
$.prototype.keydown = function() {
arguments[0] = (e: any) => true;
+
return proxiedKeydown.apply(this, Array.from(arguments) as any);
}
diff --git a/src/shared/autofill-otp.ts b/src/shared/autofill-otp.ts
index e05ea7c..b359cb4 100644
--- a/src/shared/autofill-otp.ts
+++ b/src/shared/autofill-otp.ts
@@ -26,6 +26,6 @@ document.addEventListener("DOMContentLoaded", () => {
};
});
-export const addAutofillOtps = (addedOTPAutofillList: AutofillOTPRule[]) => {
+export const addAutofillOtps = (addedOTPAutofillList: readonly AutofillOTPRule[]) => {
otpAutofillList = otpAutofillList.concat(addedOTPAutofillList);
};
diff --git a/src/shared/modify-dom.ts b/src/shared/modify-dom.ts
index b3baffb..337c879 100644
--- a/src/shared/modify-dom.ts
+++ b/src/shared/modify-dom.ts
@@ -14,12 +14,16 @@ export const modifyDOM = (modificationRules: (DOMModificaitonRule | null)[]) =>
for (let i = 0; i < modificationRules.length; i++) {
if (modificationRules[i]) {
const element = document.querySelector(modificationRules[i]![0]) as HTMLElement | null;
+
if (element) {
- const attributes = modificationRules[i]![1] as DOMReplacements;
+ const attributes = modificationRules[i]![1];
+
if (attributes.innerHTML) {
element.innerHTML = attributes.innerHTML as string;
}
+
delete attributes.innerHTML;
+
for (const attribute in attributes) {
if (attributes[attribute] === null) {
element.removeAttribute(attribute);
@@ -27,8 +31,10 @@ export const modifyDOM = (modificationRules: (DOMModificaitonRule | null)[]) =>
element.setAttribute(attribute, attributes[attribute] as string);
}
}
+
modificationRules[i] = null;
count++;
+
if (count >= modificationRules.length) {
return true;
}
diff --git a/src/shared/observe-dom.ts b/src/shared/observe-dom.ts
index 4a447a0..dc2cb45 100644
--- a/src/shared/observe-dom.ts
+++ b/src/shared/observe-dom.ts
@@ -1,12 +1,27 @@
-export const observeDOM = (callback: () => boolean) => {
- const observer = new MutationObserver(() => {
- if (callback()) {
+type ObserveDOMCallback = () => boolean;
+
+let callbacks: (ObserveDOMCallback | null)[] = [];
+let count = 0;
+
+const observer = new MutationObserver(() => {
+ for (const callback of callbacks) {
+ if (callback && callback()) {
+ count++;
+ }
+
+ if (count >= callbacks.length) {
observer.disconnect();
+
+ break;
}
- });
+ }
+});
+
+observer.observe(document, {
+ childList: true,
+ subtree: true
+});
- observer.observe(document, {
- childList: true,
- subtree: true
- });
+export const observeDOM = (callback: ObserveDOMCallback) => {
+ callbacks.push(callback);
};
diff --git a/src/shared/styling.ts b/src/shared/styling.ts
index 0e527d9..3ec25c8 100644
--- a/src/shared/styling.ts
+++ b/src/shared/styling.ts
@@ -1,5 +1,6 @@
export const styles = (selector: string, styles: { [key: string]: string }) => {
const elements = Array.from(document.querySelectorAll(selector)) as HTMLElement[];
+
for (const element of elements) {
for (const styleType in styles) {
element.style[styleType as any] = styles[styleType];