From ee9eeb30ea42661f89a7c194c4cec932cd1de024 Mon Sep 17 00:00:00 2001 From: voldemort <5692900+yell0wsuit@users.noreply.github.com> Date: Tue, 22 Jul 2025 10:55:02 +0700 Subject: [PATCH] feat: add js minification during file copy in build process --- README.md | 1 + buildext.js | 57 ++++++++++++++++++- package-lock.json | 136 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 + 4 files changed, 194 insertions(+), 3 deletions(-) create mode 100644 package-lock.json diff --git a/README.md b/README.md index 4cb2211..48c514f 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ To update the version across the entire project, simply change the version numbe - Run the build script: ```bash +npm install npm run buildext ``` diff --git a/buildext.js b/buildext.js index 632d6fb..c6b7bcb 100644 --- a/buildext.js +++ b/buildext.js @@ -1,6 +1,7 @@ import { execSync } from "child_process"; import fs from "fs"; import path from "path"; +import { minify } from "terser"; import url from "url"; import syncVersion from "./syncVersion.js"; @@ -25,6 +26,56 @@ const copyDir = async (src, dest) => { }); }; +const minifyJS = async (jsContent) => { + try { + const result = await minify(jsContent, { + compress: { + drop_console: false, // Keep console logs for debugging + drop_debugger: true, + pure_funcs: ["console.debug"], + }, + mangle: { + reserved: ["chrome"], // Don't mangle chrome API + }, + }); + return result.code; + } catch (error) { + console.warn("⚠️ Minification failed, using original:", error.message); + return jsContent; + } +}; + +// Copy and minify JavaScript files from src directory +const copyAndMinifySrcFiles = async (src, dest) => { + await fs.promises.mkdir(dest, { recursive: true }); + + const entries = await fs.promises.readdir(src, { withFileTypes: true }); + + for (const entry of entries) { + const srcPath = path.join(src, entry.name); + const destPath = path.join(dest, entry.name); + + if (entry.isDirectory()) { + await copyAndMinifySrcFiles(srcPath, destPath); + } else if (entry.name.endsWith(".js")) { + // Minify JavaScript files + console.log(`🗜️ Minifying ${entry.name}...`); + const content = await fs.promises.readFile(srcPath, "utf8"); + const originalSize = Buffer.byteLength(content, "utf8"); + const minified = await minifyJS(content, entry.name); + const minifiedSize = Buffer.byteLength(minified, "utf8"); + const savings = (((originalSize - minifiedSize) / originalSize) * 100).toFixed(1); + console.log( + ` 📊 ${entry.name}: ${originalSize} → ${minifiedSize} bytes (${savings}% smaller)` + ); + await fs.promises.writeFile(destPath, minified, "utf8"); + } else { + // Copy other files as-is + await fs.promises.copyFile(srcPath, destPath); + } + } +}; + const main = async () => { await syncVersion(); @@ -47,9 +98,9 @@ const main = async () => { } await fs.promises.mkdir(releaseDir); - // 4. Copy src files (manifest, background, etc) to release - console.log("📦 Copying src files to extension-release..."); - await copyDir(srcDir, releaseDir); + // 4. Copy and minify src files + console.log("📦 Copying and minifying src files..."); + await copyAndMinifySrcFiles(srcDir, releaseDir); // 5. Copy frontend dist files to release (merged at root) console.log("📦 Copying frontend dist files to extension-release..."); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..df2901f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,136 @@ +{ + "name": "cdrm-extension", + "version": "2.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cdrm-extension", + "version": "2.1.0", + "license": "ISC", + "devDependencies": { + "terser": "^5.43.1" + }, + "engines": { + "node": ">=21.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", + "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/terser": { + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + } + } +} diff --git a/package.json b/package.json index 2372915..2288e3a 100644 --- a/package.json +++ b/package.json @@ -17,5 +17,8 @@ "type": "module", "engines": { "node": ">=21.0.0" + }, + "devDependencies": { + "terser": "^5.43.1" } }