UNPKG

vite-plugin-bundle-obfuscator

Version:
3 lines (2 loc) 8.74 kB
"use strict";var fe=Object.create;var E=Object.defineProperty;var ge=Object.getOwnPropertyDescriptor;var me=Object.getOwnPropertyNames;var be=Object.getPrototypeOf,he=Object.prototype.hasOwnProperty;var ye=(t,e)=>{for(var n in e)E(t,n,{get:e[n],enumerable:!0})},$=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of me(e))!he.call(t,o)&&o!==n&&E(t,o,{get:()=>e[o],enumerable:!(r=ge(e,o))||r.enumerable});return t};var k=(t,e,n)=>(n=t!=null?fe(be(t)):{},$(e||!t||!t.__esModule?E(n,"default",{value:t,enumerable:!0}):n,t)),xe=t=>$(E({},"__esModule",{value:!0}),t);var Oe={};ye(Oe,{default:()=>le});module.exports=xe(Oe);var j=k(require("vite")),U=require("worker_threads"),X=k(require("path")),q=k(require("os")),Q=require("zlib"),T=k(require("javascript-obfuscator"));var S=require("fs"),h=require("path"),{toString:O}=Object.prototype;function w(t){return O.call(t)==="[object RegExp]"}function N(t){return O.call(t)==="[object String]"}function m(t){return O.call(t)==="[object Object]"}function A(t){return Array.isArray(t)}function H(t){let e=O.call(t);return e==="[object Function]"||e==="[object AsyncFunction]"}function M(t){return O.call(t)==="[object Boolean]"}function I(t,e){return e?A(e)?e.some(n=>N(n)?t.includes(n):w(n)?n.test(t):!1):N(e)?t.includes(e):w(e)?e.test(t):!1:!1}function V(t){return!!t.build?.lib}function D(t){let e=t.root||process.cwd(),n=(0,h.resolve)(e,"package.json");if((0,S.existsSync)(n))try{let o=JSON.parse((0,S.readFileSync)(n,"utf-8"));if({...o.dependencies,...o.devDependencies}.nuxt)return!0}catch{}return[(0,h.resolve)(e,"nuxt.config.js"),(0,h.resolve)(e,"nuxt.config.ts"),(0,h.resolve)(e,".nuxt"),(0,h.resolve)(e,".output")].some(o=>(0,S.existsSync)(o))}var W={excludes:[],enable:!0,log:!0,apply:"build",autoExcludeNodeModules:!1,threadPool:!1,options:{compact:!0,controlFlowFlattening:!0,controlFlowFlatteningThreshold:1,deadCodeInjection:!1,debugProtection:!1,debugProtectionInterval:0,disableConsoleOutput:!1,identifierNamesGenerator:"hexadecimal",log:!1,numbersToExpressions:!1,renameGlobals:!1,selfDefending:!0,simplify:!0,splitStrings:!1,ignoreImports:!0,stringArray:!0,stringArrayCallsTransform:!0,stringArrayCallsTransformThreshold:.5,stringArrayEncoding:[],stringArrayIndexShift:!0,stringArrayRotate:!0,stringArrayShuffle:!0,stringArrayWrappersCount:1,stringArrayWrappersChainedCalls:!0,stringArrayWrappersParametersMaxCount:2,stringArrayWrappersType:"variable",stringArrayThreshold:.75,unicodeEscapeSequence:!1}},J="node_modules",B="vendor-modules",G="vendor-",P=(r=>(r.B="B",r.KB="KB",r.MB="MB",r))(P||{}),y=Object.freeze({info:"\x1B[36m",warn:"\x1B[33m",success:"\x1B[32m"});var x=class{constructor(e){this._log=e?console.log.bind(console):this.noop}noop(){}forceLog(...e){console.log(...e)}info(e){this._log(e)}};function Y(){return j?.version?Number(j.version.split(".")[0]):2}function Se(t){let e=Math.floor(t/36e5),n=Math.floor(t%36e5/6e4),r=Math.floor(t%6e4/1e3);return[e?`${e}h `:"",n?`${n}m `:"",r||!e&&!n?`${r}s`:""].filter(Boolean).join("")}function Z(t){return M(t)?t:m(t)&&"enable"in t?t.enable:!1}function ee(t){return Z(t.threadPool)}function te(t){return Z(t.autoExcludeNodeModules)}function ne(t){let{autoExcludeNodeModules:e}=t;return M(e)?[]:m(e)&&e.enable?e.manualChunks||[]:[]}function _(t){return G+t}function oe(t){let{threadPool:e}=t,n=q.default.cpus().length;return M(e)?n:m(e)&&e.enable&&e.size?e.size:n}function re(t,e){let n=[];return Object.entries(e).forEach(([r,o])=>{"code"in o&&o.code&&!I(r,t.excludes)&&n.push([r,o])}),n}function ie(t,e){for(let n of e)if(t.includes(n))return _(n);return B}var z=class t{constructor(){this.obfuscatedFiles=new Set}static getInstance(){return t.instance||(t.instance=new t),t.instance}markAsObfuscated(e){e&&this.obfuscatedFiles.add(e)}isObfuscated(e){return e?this.obfuscatedFiles.has(e):!1}getAllObfuscatedFiles(){return Array.from(this.obfuscatedFiles)}clear(){this.obfuscatedFiles.clear()}serialize(){return Array.from(this.obfuscatedFiles)}updateFromSerialized(e){!e||!Array.isArray(e)||e.forEach(n=>{this.obfuscatedFiles.add(n)})}};function se(t,e,n){let r=new x(t.log),o=z.getInstance();if(o.isObfuscated(e))return r.info(`skipping ${e} (already in obfuscated registry)`),{code:n.code,map:n.map};r.info(`obfuscating ${e}...`);let u=t.options.sourceMap?{...t.options,inputFileName:e,sourceMapFileName:`${e}.map`}:t.options,i=T.default.obfuscate(n.code,u);r.info(`obfuscation complete for ${e}.`),o.markAsObfuscated(e),r.info(`added ${e} to obfuscated files registry`);let b=i.getSourceMap();return{code:i.getObfuscatedCode(),map:b?JSON.parse(b):null}}function ae(t,e,n){let r=new x(t.log),o=z.getInstance();if(o.isObfuscated(e))return r.info(`skipping ${e} (already in obfuscated registry)`),{code:n,map:null};r.info(`obfuscating ${e}...`);let u=t.options.sourceMap?{...t.options,inputFileName:e,sourceMapFileName:`${e}.map`}:t.options,i=T.default.obfuscate(n,u);return r.info(`obfuscation complete for ${e}.`),o.markAsObfuscated(e),r.info(`added ${e} to obfuscated files registry`),{code:i.getObfuscatedCode(),map:JSON.parse(i.getSourceMap()||"null")}}function ue(t,e){return new Promise((n,r)=>{let o=new U.Worker(X.default.join(__dirname,"./worker/index.js")),u=z.getInstance();o.postMessage({config:t,chunk:JSON.parse(JSON.stringify(e)),registryState:u.serialize()}),o.on("message",i=>{i.results&&Array.isArray(i.results)&&e.forEach(([b,C])=>{let g=i.results.find(F=>F.fileName===b);g&&g.obfuscatedCode&&(C.code=g.obfuscatedCode,C.map=g.map||null)}),i.registryState&&Array.isArray(i.registryState)&&u.updateFromSerialized(i.registryState),n(i),o.unref()}),o.on("error",i=>{r(i),o.unref()})})}function K(t){let e=Object.values(P),n=0;for(;t>=1024&&n<e.length-1;)t/=1024,n++;return{value:Number(t.toFixed(2)),unit:e[n]}}var v=class{constructor(e){this._log=e,this.originalSize=this.createEmptySizeResult(),this.obfuscatedSize=this.createEmptySizeResult(),this.startTime=0,this.endTime=0}createEmptySizeResult(){return{original:{value:0,unit:"B"},gzip:{value:0,unit:"B"}}}start(e){this.startTime=performance.now(),this.originalSize=this.calculateBundleSize(e)}end(e){this.obfuscatedSize=this.calculateBundleSize(e),this.endTime=performance.now(),this.logResult()}calculateBundleSize(e){let{totalSize:n,gzipSize:r}=e.reduce((o,[,u])=>{if(u.code){let{code:i}=u;o.totalSize+=Buffer.byteLength(i,"utf-8"),o.gzipSize+=(0,Q.gzipSync)(i,{level:9}).byteLength}return o},{totalSize:0,gzipSize:0});return{original:K(n),gzip:K(r)}}analyze(){let{originalSize:e,obfuscatedSize:n}=this,r=Se(this.endTime-this.startTime),o=((n.original.value-e.original.value)/e.original.value*100).toFixed(2),u=((n.gzip.value-e.gzip.value)/e.gzip.value*100).toFixed(2);return`\u2713 obfuscated in ${r} | \u{1F4E6} ${e.original.value}${e.original.unit} (gzip: ${e.gzip.value}${e.gzip.unit}) \u2192 \u{1F512} ${n.original.value}${n.original.unit} (gzip: ${n.gzip.value}${n.gzip.unit}) | \u{1F4C8} ${o}% (gzip: ${u}%)`}logResult(){this._log.forceLog(y.success+"%s\x1B[0m",this.analyze())}};function le(t){let e={...W,...t},n=new x(e.log),r=!1,o=!1,u=!1,i=async s=>{n.forceLog(y.info+` starting obfuscation process...`);let l=new v(n),a=re(e,s);if(l.start(a),ee(e)){let d=Math.min(oe(e),a.length),c=Math.ceil(a.length/d),f=[];for(let p=0;p<d;p++){let R=a.slice(p*c,(p+1)*c);f.push(ue(e,R))}await Promise.all(f)}else a.forEach(([d,c])=>{let{code:f,map:p}=se(e,d,c);c.code=f,c.map=p});l.end(a)},b=(s,l)=>{if(u=!!l.isSsrBuild,r=V(s),o=D(s),!e.enable||!te(e)||r||o)return;s.build=s.build||{},s.build.rollupOptions=s.build.rollupOptions||{};let{output:a}=s.build.rollupOptions,d=[...ne(e)],c=()=>{e.excludes.push(B,...d.map(_))},f=p=>{if(p.includes(J))return ie(p,d)};if(!a){c(),s.build.rollupOptions.output={manualChunks:f};return}if(A(a)){n.forceLog(y.warn,"rollupOptions.output is an array, ignoring autoExcludeNodeModules configuration.");return}if(m(a)){if(!a.manualChunks)c(),a.manualChunks=f;else if(m(a.manualChunks))n.forceLog(y.warn,"rollupOptions.output.manualChunks is an object, ignoring autoExcludeNodeModules configuration.");else if(H(a.manualChunks)){let p=a.manualChunks;c(),a.manualChunks=(R,de)=>f(R)||p(R,de)}}},C=s=>{let l=s.build.sourcemap;l&&(e.options={...e.options,sourceMap:!0,sourceMapMode:l==="inline"?"inline":"separate"})},g=async(s,{bundle:l})=>(!e.enable||!l||o||u||await i(l),s),F=async(s,l)=>{!e.enable||!l||r||!o||u||await i(l)},ce=(s,l)=>{if(!e.enable||!r||u)return null;let a=new v(n),d=[[l.name,{code:s}]];a.start(d);let{code:c,map:f}=ae(e,l.name,s);return a.end(d),{code:c,map:f}},pe=()=>Y()>=5?{order:"post",handler:g}:{enforce:"post",transform:g};return{name:"vite-plugin-bundle-obfuscator",apply:e.apply,config:b,configResolved:C,renderChunk:ce,transformIndexHtml:pe(),generateBundle:F}}