diff options
Diffstat (limited to 'config')
| -rw-r--r-- | config/webpack.config.js | 252 | ||||
| -rw-r--r-- | config/webpack/plugins/create-injected-shared-modules-webpack-plugin.js | 2 | ||||
| -rw-r--r-- | config/webpack/plugins/create-manifest-webpack-plugin/index.js | 2 | ||||
| -rw-r--r-- | config/webpack/plugins/create-rules-webpack-plugin.js | 2 | ||||
| -rw-r--r-- | config/webpack/plugins/inject-script-webpack-plugin.js | 2 | ||||
| -rw-r--r-- | config/webpack/utils/build-file.js | 2 | ||||
| -rw-r--r-- | config/webpack/utils/injected-code.js | 2 | ||||
| -rw-r--r-- | config/webpack/utils/inline-javascript.js | 4 | ||||
| -rw-r--r-- | config/webpack/utils/script-runtime.js | 2 |
9 files changed, 10 insertions, 260 deletions
diff --git a/config/webpack.config.js b/config/webpack.config.js deleted file mode 100644 index b0c1641..0000000 --- a/config/webpack.config.js +++ /dev/null @@ -1,252 +0,0 @@ -/** - * Webpack configuration for the Banglar Bhumi Utils Chrome extension. - * - * Produces four separate bundles: - * 1. **Background script** – service worker entry point. - * 2. **Uninjected scripts** – content scripts that run as-is. - * 3. **Injected scripts** – content scripts that are further processed - * so they can be injected into the page DOM. - * 4. **Shared modules** – libraries compiled as standalone files and - * referenced via global variables (`$<hash>`). - * - * Custom loaders and plugins handle dependency ordering, import counting, - * asset-URL rewriting, manifest generation, and declarative-net-rule creation. - */ -import path from "path"; -import fs from "fs"; -import { fileURLToPath } from "url"; -import webpack from "webpack"; -import { merge } from "webpack-merge"; -import CopyPlugin from "copy-webpack-plugin"; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - -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"; - -import CreateManifestPlugin from "./webpack/plugins/create-manifest-webpack-plugin/index.js"; -import CreateRulesPlugin from "./webpack/plugins/create-rules-webpack-plugin.js"; -import InjectScriptPlugin from "./webpack/plugins/inject-script-webpack-plugin.js"; -import CreateInjectedSharedModulesPlugin from "./webpack/plugins/create-injected-shared-modules-webpack-plugin.js"; - -import { inlineJavascript } from "./webpack/utils/inline-javascript.js"; -import { getScriptRuntimeFromType } from "./webpack/utils/script-runtime.js"; -import { getFileName } from "./webpack/utils/build-file.js"; - -import scripts from "./webpack/utils/scripts.js"; -import sharedModules from "./webpack/utils/shared-modules.js"; - -const sharedModulesImportedCount = {}; - -for (const sharedModule of sharedModules) { - sharedModulesImportedCount[sharedModule] = 0; -} - -const injectedSharedModulesImportedCount = {}; - -for (const sharedModule of sharedModules) { - injectedSharedModulesImportedCount[sharedModule] = 0; -} - -const backgroundScriptEntries = {}; -const uninjectedScriptEntries = {}; -const injectedAfterScriptEntries = {}; -const injectedBeforeScriptEntries = {}; -const sharedModuleEntries = {}; -const sharedModuleExternals = {}; - -const backgroundScriptImports = fs.readdirSync(path.resolve(SOURCE_DIR, "background")) - .map(scriptName => `import "${path.resolve(SOURCE_DIR, "background", scriptName)}";`) - .join("\n"); -backgroundScriptEntries["background script"] = { - import: inlineJavascript(backgroundScriptImports), - filename: "background.js" -}; - -for (const scriptPath in scripts) { - for (const scriptType in scripts[scriptPath]) { - const currentScripts = scripts[scriptPath][scriptType]; - let scriptEntries; - let destinationFolder = "scripts"; - - switch (scriptType) { - case "injected": - scriptEntries = injectedAfterScriptEntries; - destinationFolder = "scripts/injected"; - break; - - default: - scriptEntries = uninjectedScriptEntries; - } - - scriptEntries[`${scriptType} - "${scriptPath}"`] = { - import: inlineJavascript(currentScripts.map(script => `import "${path.resolve(SOURCE_DIR, "scripts", script)}";`).join("\n")), - filename: `${destinationFolder}/${getFileName(scriptType, scriptPath)}.js` - }; - } -} - -for (const sharedModule of sharedModules) { - const sharedModuleNameHash = getFileName(sharedModule, "shared"); - const sharedModuleGlobalVariableName = `$${sharedModuleNameHash.substring(sharedModuleNameHash.length - 16)}`; - sharedModuleEntries[sharedModule] = { - import: path.resolve(SOURCE_DIR, "shared", sharedModule), - filename: `shared/${sharedModuleNameHash}.js`, - library: { - name: sharedModuleGlobalVariableName, - type: "var" - } - }; - sharedModuleExternals[`@/shared/${sharedModule}`] = sharedModuleGlobalVariableName; -} - -const commonOptions = { - mode: "production", - target: "web", - resolve: { - extensions: [".ts", ".js", ".html"], - alias: { - "@": global.SOURCE_DIR, - }, - }, - module: { - rules: [ - { - test: /\.ts$/, - loader: "ts-loader", - options: { - configFile: "tsconfig.json", - } - }, - { - test: /\.html$/, - loader: path.resolve(CONFIG_DIR, "webpack/loader/to-string-loader.js"), - }, - ], - }, - optimization: { - minimize: process.env.NODE_ENV === "production", - runtimeChunk: false, - }, - output: { - iife: true, - }, - plugins: [ - new webpack.optimize.LimitChunkCountPlugin({ - maxChunks: 1, - }), - ], -}; - -const sharedModuleOptions = { - externals: sharedModuleExternals, - externalsType: "var", - module: { - rules: [ - { - test: /banglar-bhumi-utils\/src\/.*.(^.?|\.[^d]|[^.]d|[^.][^d])\.(t|j)s$/, - loader: path.resolve(CONFIG_DIR, "webpack/loader/count-imports-loader.js"), - options: { - sharedModulesImportedCount, - }, - enforce: "post", - } - ] - } -}; - -const backgroundScriptConfiguration = merge( - commonOptions, - sharedModuleOptions, - { - entry: backgroundScriptEntries, - }, -); - -const uninjectedScriptConfiguration = merge( - commonOptions, - sharedModuleOptions, - { - entry: uninjectedScriptEntries - } -); - -const injectedScriptConfiguration = merge( - commonOptions, - { - externals: sharedModuleExternals, - externalsType: "var", - module: { - rules: [ - { - test: /banglar-bhumi-utils\/src\/.*.(^.?|\.[^d]|[^.]d|[^.][^d])\.(t|j)s$/, - loader: path.resolve(CONFIG_DIR, "webpack/loader/count-imports-loader.js"), - options: { - sharedModulesImportedCount: injectedSharedModulesImportedCount - }, - enforce: "post" - } - ] - }, - entry: injectedAfterScriptEntries, - plugins: [ - new InjectScriptPlugin() - ] - } -); - -const sortedSharedModules = [] - -const sharedModulesConfiguration = merge( - commonOptions, - sharedModuleOptions, - { - entry: sharedModuleEntries, - plugins: [ - new CopyPlugin({ - patterns: [ - { - from: path.resolve("static"), - to: "./", - }, - { - from: path.resolve("src/offscreen"), - to: "./offscreen", - }, - ], - }), - new CreateInjectedSharedModulesPlugin({ - injectedSharedModulesImportedCount, - sortedSharedModules - }), - new CreateRulesPlugin(), - new CreateManifestPlugin({ - sharedModulesImportedCount, - injectedSharedModulesImportedCount, - sortedSharedModules - }) - ], - module: { - rules: [ - { - test: /banglar-bhumi-utils\/src\/.*.(^.?|\.[^d]|[^.]d|[^.][^d])\.(t|j)s$/, - loader: path.resolve(CONFIG_DIR, "webpack/loader/arrange-shared-module-loader.js"), - options: { - sortedSharedModules - }, - enforce: "post" - } - ] - } - } -); - -export default [ - backgroundScriptConfiguration, - uninjectedScriptConfiguration, - injectedScriptConfiguration, - sharedModulesConfiguration -]; diff --git a/config/webpack/plugins/create-injected-shared-modules-webpack-plugin.js b/config/webpack/plugins/create-injected-shared-modules-webpack-plugin.js index 6201a01..21cff34 100644 --- a/config/webpack/plugins/create-injected-shared-modules-webpack-plugin.js +++ b/config/webpack/plugins/create-injected-shared-modules-webpack-plugin.js @@ -28,7 +28,7 @@ class CreateInjectedSharedModulesPlugin { name: "CreateInjectedSharedModulesPlugin", stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL }, - assets => { + (_assets) => { const injectedSharedScripts = this.sortedSharedModules .filter(sharedModule => this.injectedSharedModulesImportedCount[sharedModule] > 0) .map(sharedModule => `shared/${getFileName(sharedModule, "shared")}.js`); diff --git a/config/webpack/plugins/create-manifest-webpack-plugin/index.js b/config/webpack/plugins/create-manifest-webpack-plugin/index.js index f012f1e..7328d5d 100644 --- a/config/webpack/plugins/create-manifest-webpack-plugin/index.js +++ b/config/webpack/plugins/create-manifest-webpack-plugin/index.js @@ -38,7 +38,7 @@ class CreateManifestPlugin { * @param {import("webpack").Compiler} compiler */ apply(compiler) { - compiler.hooks.compilation.tap("CreateManifestPlugin", compilation => { + compiler.hooks.compilation.tap("CreateManifestPlugin", (compilation) => { compilation.hooks.processAssets.tap( { name: "CreateManifestPlugin", diff --git a/config/webpack/plugins/create-rules-webpack-plugin.js b/config/webpack/plugins/create-rules-webpack-plugin.js index 55b60f7..993ac31 100644 --- a/config/webpack/plugins/create-rules-webpack-plugin.js +++ b/config/webpack/plugins/create-rules-webpack-plugin.js @@ -18,7 +18,7 @@ class CreateRulesPlugin { name: "CreateRulesPlugin", stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL }, - assets => { + (_assets) => { const ruleFileNames = fs.readdirSync(path.resolve(SOURCE_DIR, "rules")); const rules = []; let ruleId = 1; diff --git a/config/webpack/plugins/inject-script-webpack-plugin.js b/config/webpack/plugins/inject-script-webpack-plugin.js index 43c5d9f..4f76ca8 100644 --- a/config/webpack/plugins/inject-script-webpack-plugin.js +++ b/config/webpack/plugins/inject-script-webpack-plugin.js @@ -22,7 +22,7 @@ class InjectScriptPlugin { stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL, additionalAssets: true }, - async assets => { + async (assets) => { for (const assetName in assets) { if (/\.js$/.test(assetName)) { const injectedCodeResponse = getInjectedCode(compilation.getAsset(assetName).source.source()) diff --git a/config/webpack/utils/build-file.js b/config/webpack/utils/build-file.js index 17f0b03..e09747d 100644 --- a/config/webpack/utils/build-file.js +++ b/config/webpack/utils/build-file.js @@ -10,7 +10,7 @@ import crypto from "crypto"; * @param {boolean} justHash - When true, always return only the hash part. * @returns {string} The transformed filename. */ -export const getFileName = (fileName, prefix, justHash = false) => { +export function getFileName(fileName, prefix, justHash = false) { let hash = crypto .createHash("md5") .update(`${prefix}-${fileName}`) diff --git a/config/webpack/utils/injected-code.js b/config/webpack/utils/injected-code.js index 2b8f750..f91fd4a 100644 --- a/config/webpack/utils/injected-code.js +++ b/config/webpack/utils/injected-code.js @@ -23,7 +23,7 @@ const getHash = url => * @param {string} code - The compiled JavaScript bundle. * @returns {[string, string]} A tuple of [transformedCode, extensionAssetsJSON]. */ -export const getInjectedCode = code => { +export function getInjectedCode(code) { const extensionAssets = {}; let i = 0; diff --git a/config/webpack/utils/inline-javascript.js b/config/webpack/utils/inline-javascript.js index 205bda4..501f852 100644 --- a/config/webpack/utils/inline-javascript.js +++ b/config/webpack/utils/inline-javascript.js @@ -5,4 +5,6 @@ * @param {string} code - The JavaScript source to inline. * @returns {string} A `data:text/javascript;base64,…` URI. */ -export const inlineJavascript = code => `data:text/javascript;base64,${Buffer.from(code).toString("base64")}`; +export function inlineJavascript(code) { + return `data:text/javascript;base64,${Buffer.from(code).toString("base64")}`; +} diff --git a/config/webpack/utils/script-runtime.js b/config/webpack/utils/script-runtime.js index 1c23922..2745d54 100644 --- a/config/webpack/utils/script-runtime.js +++ b/config/webpack/utils/script-runtime.js @@ -9,7 +9,7 @@ * @param {string} scriptType - The script type from scripts.json. * @returns {string} The corresponding `run_at` value. */ -export const getScriptRuntimeFromType = scriptType => { +export function getScriptRuntimeFromType(scriptType) { switch (scriptType) { case "before": case "injected-after": |
