From 4fc02105298d43c7fe74c66e178c323a69501e66 Mon Sep 17 00:00:00 2001 From: Elizabeth Cray Date: Wed, 12 Nov 2025 15:53:45 -0500 Subject: [PATCH] Prep for addon signing --- README.md | 1 + addon/assets/icon-32.png | Bin 0 -> 1456 bytes addon/assets/icon-400.png | Bin 0 -> 24839 bytes addon/assets/icon-48.png | Bin 0 -> 2616 bytes addon/assets/icon.svg | 125 +++++++++++++++++++++++++ addon/manifest.json | 9 +- addon/metadata.json | 19 ++++ background/background.js | 6 +- package-lock.json | 187 ++++++++++++++++++++++++++++++++++++++ package.json | 3 + webpack.config.js | 16 +++- 11 files changed, 356 insertions(+), 10 deletions(-) create mode 100644 addon/assets/icon-32.png create mode 100644 addon/assets/icon-400.png create mode 100644 addon/assets/icon-48.png create mode 100644 addon/assets/icon.svg create mode 100644 addon/metadata.json diff --git a/README.md b/README.md index 907af36..78b3b55 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,4 @@ This is currently a WIP, but in active development (as of Nov 2025). - Add option to keep model loaded vs load each time - model load progress monitoring in popup +- Fix webpacked web-llm as it's 0.73MB over Mozilla's signing limit diff --git a/addon/assets/icon-32.png b/addon/assets/icon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..ddf8419dfa1fac01365734dbd2c9c5a92b4951b4 GIT binary patch literal 1456 zcmV;h1yA~kP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv00000008+zyMF)x z010qNS#tmY4#NNd4#NS*Z>VGd000McNliru=?e@LG8iSQsmK5T1nfyfK~z}7#g|=k z97h#~pL4orc6MiXwIAA*WXqB*l3(^kGEtc8Mq#0 z>4e461hs~AcZhG*$V6Ek&k4@c-0Tnrj;x*n(2Tn1Bw}?k$2KC;+e4OehV{W?HD-0V z;EO-}iQ(;CR_+X#WPj<1v`}NK91yz}&P36vy-bSqQ z?Bhd@KKYFDS&q3CQ_c#iA}83u?$7TdkuZID%9juRN;Y4x_rbf^%?Nkq`1|iZIr}Q%^x}b{Xd9S4FVo()F6dWW;xA42Nz0Igh(4Kr&FRNL0bw= z$fgU@VGpnMnqwLilO;BeF{uFpMh#&ZsEd-Mmx6j~Eg1ZGo8DVv&OSNf=;0%hUYq3Y z6tyNv92QfI=u&8O?qNCl&IXb3P|&r_cxpU`6&MCaKiI>@4NPnSkBv-&{CtTTgKb-K0;-BuhHN@#c=tA#fLl1~vLxxX zsKOGXig6LyWJYH^#2bgyLS$l=XA4XeVOj=PmVEV>PZ1-G-@M24=!CT2Bi-L%;hv(A zNl2P0+ix78EkyuTL#zq?oo#x1TOfhhHW?q>r7>s{f=5+}G+|?F%;4^=^{Z1MG6~IA zo9#Eh2eGG0GVXowLy~rzvwuD&?f2OK**oOXx<1ISfBCD>Few0qTjE>=KqG2nuy|^U zIwOhNND!)!Q`PweC&duqapd&^Lco}a%l+yF&eue?NlX*G;7vv07I^R1y&&*)wGt83 zC;*jPQ4$aYQ7Gy;f$*OkpHZ;_1XTf)fFpO)b=kh)x=@f&tecx>eXNaH3y7NWciN0> z+)TKB1#-n-^m74eeSaefwW^{L9a%BK_cXuvnZfkR6VQ^(GZ*pgw?mQX*0000< KMNUMnLSTX^n52pT literal 0 HcmV?d00001 diff --git a/addon/assets/icon-400.png b/addon/assets/icon-400.png new file mode 100644 index 0000000000000000000000000000000000000000..173d1f0bd6e6a72d200e05081743aa18c65222f4 GIT binary patch literal 24839 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 literal 0 HcmV?d00001 diff --git a/addon/assets/icon-48.png b/addon/assets/icon-48.png new file mode 100644 index 0000000000000000000000000000000000000000..bab727e286e3cf822090f82188847f929b676e27 GIT binary patch literal 2616 zcmV-83di+{P)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv00000008+zyMF)x z010qNS#tmY4#NNd4#NS*Z>VGd000McNliru=?e@LGB2GM495Tf33N$BK~!ko)tXt8 zTt`;NerCa+FlE5?G5CJhj*aI`f82BplA$W%O`6fib3q*iz7_c=kLyTms z#Vt$S>aF&wyXC^etuD2smMmLxs5$-Ab@F8X|0hqLJeheVl)`j0Vb~jxr8&WSPNIki zakaw2(gO8X0}(;I_o2VnWB<_}&N`6q8AW*Y4z$)RZ>+Mox`Y{a2W)-y09#m)r_hI| zMw4Uvdn1zFdx+K=^JsI6$#C)v_LD9lWNdG4VS2k=thKy2c8^l9BC+04j%#pk0^!KF(QKZ z4(AT{ji&$|wIiUEL2CnmwX;K#NLiu_XdR)Hh7ho>Ab2+`=btUts+vLS`?&;;`St3`55YP=no==g9 z!S-`dLcCC6qI-;{d(^8PT6zUP^4O$68HH)ZWYL(xbcYc9kr@!V$G9 zRTr#zU@u^w-!u&;Ne@FHA=RLI7mVEgu$6nTb-qSkD4^-ungGnaqJ_->ysZ+ymZe-CFZ zq7>Celk@Ms&C<2A?2k8rfQYctJV$mn<>r5V%DCSpgg~WQ`lHx|LhO` z{BH=Lm7$imx%b(Blcx#2M_W9&c@rH)R2xm4EwDw-sCPifgq6!@7-v1=sD^Y6_kaBx ztS#8NcbD$gLu#!yCW;r0N zS_Boa`vo`u>0^@di2kE(PUlwvh;)^tHzE)y(uDTP3fF$}Bcur`Xu3DIxbxZPjQc&l z_>WKNtgUnTkFTQ_4GKl?iydzN@;`C5pm%?ph4mFOHKCF;xpm{0gy6Y+{W`1fp2PJm zcmM4MMVjF=kI|LG5DG-P#S7C$?lkJIzdMf%a_j3bq|RbYFzs0eL@I`5%wqhhXg#asxq7b>HN+* z(Wwf1!%YMs1jucIslhj$JUMVaSBFriWc z0XnDFnYzJ|Y#GohqDV3zP-`}Ey6ix5MLHg#l%~D0!n7D5vs9==A%!AO5=1H58>>u< z!8}!pD3sHsUW8hwh4mSEkx*T4uzKbkdk;3*-TaD!hYx9X7TLIZg^l06%1&|z=PXJ@ z(AuDKO)?&%w5GAVK<=g}k@E6L6cJUD;Sdn&iybT}k%@5=OP;2fD5BD-QP>Po3K7AW z7(aF7X@W5k)x`#dO;Lw>9TAd1mQ2wmqS9$lxRekA2li_&{`5WG`tSpmPoD*W!ND%K zKK+FK8(*_n-zfJR5g{@$c3eE_}{Rz$% zRO)q9T@!*UNds|IBOgq0wji$7&<%t4_K3bpK1{HAPF$&Cnh_y*DshbD1R*bC+oM*I2Wc z&?;hUbc^V0#PX@rgy4y)Rf6*6tpozGsnhT7mO$EVym7P5L;-==RLS=fY>`uKG%(E= z?+aq7G3k}-rm?h0L52vkH6SznCWJs^v4fQi=K4UaY8-U8N_}Smr*brgyPy7w-TU`w zc9!_TUwz1_P91uR-lJ_qG^-cSk@_-G7$u6BY6&Dz4n$h|UZmXpq8igfPc>Rl36Kcd z8j|4v5k+HZfx;&!QGg(#F)m^{7=S1mOC1WIKGvhk3^o{m$Xu_Lp}n@k&gNalgC76$ z_y0_zv&e9Nk7PVzz%40oqGKYF=Gi=Ca|4Vs(cuI_l z^oh8jdMP>P&}K{}diEjXBp{p1i;t$p#Ac5Fi5o?EaknQ$W;5_Dtxga#V=6J<{vz0rEo5t{p1gi0y#_(zc;%Z!8)tva~IUb;isuf;sBY65X*r75tet;q@G?BYH+21dOCVs3 zVg3BZ>|>Ap9tV&1aqh`bIysZ_WEd)~SzceEv$BZHKeriA8TAI_X^s#6<=6FVVfnmQ z;3wNCCB&7O*5U&7W*rgX{{WBI(vq%S<9Gl702y>eSaefwW^{L9a%BK_cXuvnZfkR6 aVQ^(GZ*pgw?mQX*0000 + + + + + + + + + + + + + + + + + + + + + + + nms + + diff --git a/addon/manifest.json b/addon/manifest.json index 47e2d45..ed30fae 100644 --- a/addon/manifest.json +++ b/addon/manifest.json @@ -5,10 +5,10 @@ "description": "AI Job Application Assistant", "homepage_url": "https://git.corrupt.link/liz/nms", "icons": { - "32": "assets/logo-32.png" + "32": "assets/icon-32.png" }, "browser_action": { - "default_icon": "assets/logo-32.png", + "default_icon": "assets/icon-32.png", "default_title": "Notice Me Senpai", "default_popup": "popup/popup.html", "browser_style": true @@ -34,7 +34,10 @@ "browser_specific_settings": { "gecko": { "id": "nms@cray.software", - "strict_min_version": "58.0" + "strict_min_version": "79.0", + "data_collection_permissions": { + "required": ["none"] + } } } } diff --git a/addon/metadata.json b/addon/metadata.json new file mode 100644 index 0000000..dcd0d1e --- /dev/null +++ b/addon/metadata.json @@ -0,0 +1,19 @@ +{ + "summary": { + "en-US": "Job application ML assistant tool with local LLM support" + }, + "name": { + "en-US": "Notice Me Senpai" + }, + "homepage": "https://git.corrupt.link/liz/nms", + "is_experimental": true, + "categories": [ + "other" + ], + "version": { + "license": "MPL-2.0", + "compatibility": [ + "firefox" + ] + } +} diff --git a/background/background.js b/background/background.js index ca04719..c194c3e 100644 --- a/background/background.js +++ b/background/background.js @@ -1,4 +1,4 @@ -import { CreateMLCEngine } from "@mlc-ai/web-llm"; +import { CreateMLCEngine } from "@mlc-ai/web-llm" var engine = null var resume = "" @@ -12,7 +12,7 @@ const loadProgress = (progress) => { const loadResources = async () => { let modelName = (await browser.storage.local.get("model")).model || "Llama-3.2-1B-Instruct-q4f32_1-MLC" console.log(`Loading model: ${modelName}`) - engine = await CreateMLCEngine(modelName, { initProgressCallback: loadProgress }); + engine = await CreateMLCEngine(modelName, { initProgressCallback: loadProgress }) console.log("Model loaded") resume = (await browser.storage.local.get("resume")).resume || "No resume, halt and ask for resume." resourcesLoaded = true @@ -44,7 +44,7 @@ browser.contextMenus.create({ browser.contextMenus.onClicked.addListener((info, tab) => { if (info.menuItemId === "nms-cmenu" && info.selectionText) { // Handle context menu click with selected text - console.log("Context menu clicked with selection:", info.selectionText); + console.log("Context menu clicked with selection:", info.selectionText) runMatch(info.selectionText) } }) diff --git a/package-lock.json b/package-lock.json index 1246a97..17a7f66 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,9 @@ "style-loader": "^4.0.0", "webpack": "^5.102.1", "webpack-cli": "^6.0.1" + }, + "devDependencies": { + "webpack-bundle-analyzer": "^4.10.2" } }, "node_modules/@discoveryjs/json-ext": { @@ -379,6 +382,13 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -657,6 +667,19 @@ "acorn": "^8.14.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", @@ -913,6 +936,13 @@ "node": ">=4" } }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true, + "license": "MIT" + }, "node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -926,6 +956,13 @@ "node": ">=0.10" } }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.249", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.249.tgz", @@ -972,6 +1009,19 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -1111,6 +1161,22 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1132,6 +1198,13 @@ "node": ">= 0.4" } }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, "node_modules/icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", @@ -1367,6 +1440,16 @@ "node": ">= 0.6" } }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -1410,6 +1493,16 @@ "integrity": "sha512-/AD7JGJbcp1pB5XwYkJyivqdeXofUP5u2lkif6vLGLc+SsV9OCC0JFNpVwM5pqHuFqbyojRt6xILuidJOwwJDQ==", "license": "(Apache-2.0 AND CC-BY-SA-4.0)" }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -1844,6 +1937,21 @@ "node": ">=8" } }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1993,6 +2101,16 @@ "node": ">=8.0" } }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/undici-types": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", @@ -2096,6 +2214,53 @@ } } }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/webpack-cli": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", @@ -2190,6 +2355,28 @@ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "license": "MIT" + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } } } } diff --git a/package.json b/package.json index 6b89234..6fac05b 100644 --- a/package.json +++ b/package.json @@ -21,5 +21,8 @@ "style-loader": "^4.0.0", "webpack": "^5.102.1", "webpack-cli": "^6.0.1" + }, + "devDependencies": { + "webpack-bundle-analyzer": "^4.10.2" } } diff --git a/webpack.config.js b/webpack.config.js index 7736ef4..ac61aa8 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,4 +1,6 @@ -const path = require("path") +const path = require("path"); +const { optimize } = require("webpack"); +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; module.exports = { entry: { @@ -13,8 +15,11 @@ module.exports = { mode: "none", watch: false, watchOptions: { - ignored: '**/node_modules', - }, + ignored: '**/node_modules', + }, + optimization: { + minimize: false + }, module: { rules: [ { @@ -29,5 +34,8 @@ module.exports = { ], }, ], - } + }, + plugins: [ + new BundleAnalyzerPlugin() + ] }