diff options
| -rw-r--r-- | config/webpack.config.js | 41 | ||||
| -rw-r--r-- | config/webpack/loader/dynamic-imports-loader.js | 4 | ||||
| -rw-r--r-- | config/webpack/plugins/create-manifest-webpack-plugin/index.js | 4 | ||||
| -rw-r--r-- | config/webpack/plugins/inject-script-webpack-plugin.js | 24 | ||||
| -rw-r--r-- | config/webpack/utils/file-name-hash.js | 10 | ||||
| -rw-r--r-- | config/webpack/utils/scripts.js | 1 | ||||
| -rw-r--r-- | config/webpack/utils/shared-modules.js | 2 | ||||
| -rw-r--r-- | src/scripts/captcha.ts | 3 | ||||
| -rw-r--r-- | src/scripts/functionality/view-khatian.ts | 1 | ||||
| -rw-r--r-- | src/scripts/login.ts | 1 | ||||
| -rw-r--r-- | src/scripts/optimize.ts | 22 | ||||
| -rw-r--r-- | src/scripts/stop-blocking.ts | 2 | ||||
| -rw-r--r-- | src/shared/autofill-otp.ts | 2 | ||||
| -rw-r--r-- | src/shared/modify-dom.ts | 8 | ||||
| -rw-r--r-- | src/shared/observe-dom.ts | 31 | ||||
| -rw-r--r-- | src/shared/styling.ts | 1 |
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]; |
