@metricinsights/pp-dev
Version:
Portal Page dev build tool
3 lines (2 loc) • 28.1 kB
JavaScript
;var e=require("path"),t=require("fs"),o=require("node:perf_hooks"),n=require("cac"),i=require("vite"),r=require("./index-DRre2UkM.js"),s=require("./plugin-Dx9CDaej.js"),a=require("url"),l=require("express"),c=require("winston"),d=require("dir-compare"),p=require("diff-match-patch"),f=require("isbinaryfile"),g=require("os"),h=require("crypto"),u=require("extract-zip"),m=require("svgtofont"),b=require("node:process");function v(e){var t=Object.create(null);return e&&Object.keys(e).forEach((function(o){if("default"!==o){var n=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,n.get?n:{enumerable:!0,get:function(){return e[o]}})}})),t.default=e,Object.freeze(t)}require("ejs"),require("esbuild"),require("http-proxy-middleware"),require("picocolors"),require("axios"),require("jsdom"),require("https"),require("memory-cache"),require("process"),require("child_process"),require("console"),require("zlib");var w=v(e),y=v(t),L=v(l),P=v(c),T=v(d),x=v(g),F=v(h),$=v(b);function S(e){return null!==e||void 0!==e}const C=[{key:"r",description:"restart the server",async action(e){await e.restart()}},{key:"u",description:"show server url",action(e){e.config.logger.info(""),e.printUrls()}},{key:"o",description:"open in browser",action(e){e.openBrowser()}},{key:"c",description:"clear console",action(e){e.config.logger.clearScreen("error")}},{key:"q",description:"quit",async action(e){await e.close().finally((()=>process.exit()))}},{key:"C",description:"clear proxy cache",action(e){e.cache&&(e.cache.clear(),e.config.logger.info("Proxy cache cleared"))}}];const k=/(.+)(-[a-f0-9]{6,20})(\.[a-z0-9]+)$/i;class A{oldAssetsPath;newAssetsPath;destinationPath;changelogFilename;changelogTemplate='<!DOCTYPE html>\n <html lang="en">\n <head>\n <meta charset="UTF-8" />\n <title>Changelog Diff</title>\n <style>\n tr,\n td {\n padding: 0;\n }\n .diff-file {\n margin-top: 20px;\n border: 1px solid #e1e4e8;\n border-radius: 6px;\n }\n .diff-file-title {\n padding: 10px 20px;\n background-color: #f6f8fa;\n border-bottom: 1px solid #e1e4e8;\n border-radius: 6px 6px 0 0;\n font-weight: bold;\n }\n .diff-file-title .renamed {\n font-weight: normal;\n }\n .diff-file-title .renamed .from {\n color: #cb2431;\n }\n .diff-file-title .renamed .to {\n color: #22863a;\n }\n .diff-file-title .added {\n color: #22863a;\n }\n .diff-file-title .deleted {\n color: #cb2431;\n }\n .diff-file-content {\n }\n .diff-table {\n tab-size: 8;\n width: 100%;\n border-collapse: separate;\n border-spacing: 0;\n }\n .blob-num {\n position: relative;\n color: #1f2328;\n width: 1%;\n min-width: 50px;\n padding: 0 10px;\n font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace;\n font-size: 12px;\n line-height: 20px;\n text-align: right;\n white-space: nowrap;\n vertical-align: top;\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n }\n .blob-num.addition {\n background-color: #ccffd8;\n border-color: #1f883e;\n }\n .blob-num.deletion {\n background-color: #ffd7d5;\n border-color: #cf222e;\n }\n .blob-num::before {\n content: attr(data-line-number);\n }\n .blob-code {\n position: relative;\n padding: 0 10px 0 22px;\n vertical-align: top;\n color: #1f2329;\n }\n .blob-code.code-addition {\n background-color: #e6ffec;\n }\n .blob-code.code-deletion {\n background-color: #ffebe9;\n }\n .blob-code.skip,\n .blob-code.message {\n text-align: center;\n }\n .blob-code.skip .blob-code-inner,\n .blob-code.message .blob-code-inner {\n font-weight: bold;\n color: #6a737d;\n padding: 10px 0;\n }\n .blob-code-inner {\n display: table-cell;\n overflow: visible;\n font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace;\n font-size: 12px;\n word-wrap: anywhere;\n white-space: pre-wrap;\n }\n .blob-code-inner::before {\n content: attr(data-code-prefix);\n position: absolute;\n top: 1px;\n left: 8px;\n padding-right: 8px;\n }\n </style>\n </head>\n <body>\n <h1>Changelog Diff</h1>\n\n %FILES%\n </body>\n </html>';diffFileTemplateHandler;diffLineTemplateHandler;contextLines=3;logger;constructor(e){const{oldAssetsPath:t,newAssetsPath:o,destinationPath:n,changelogTemplate:i,diffFileTemplateHandler:r,diffLineTemplateHandler:a,changelogFilename:l,contextLines:c}=e;if(this.logger=s.createLogger(),!t||!o||!n)throw new Error("Previous assets path, current assets path and destination path are required");if(t===o)throw new Error("Previous and current assets paths must be different");if(!this.isExists(t))throw new Error(`Previous assets path ${t} does not exist`);if(!this.isExists(o))throw new Error(`Current assets path ${o} does not exist`);if(this.isZipFile(t)){const e=w.resolve(x.tmpdir(),F.createHash("md5").update(t).digest("hex"));this.oldAssetsPath=this.unzipFile(t,e).then((()=>this.normalizeAssetFolderPath(e))).then((e=>{if(this.isEmptyFolder(e))throw new Error(`Previous assets path ${e} is empty`);return e}))}else{if(!this.isFolder(t))throw new Error(`Invalid previous assets path ${t}. It must be a folder or a zip file`);{const e=this.normalizeAssetFolderPath(t);if(this.isEmptyFolder(e))throw new Error(`Previous assets path ${e} is empty`);this.oldAssetsPath=Promise.resolve(e)}}if(this.isZipFile(o)){const e=w.resolve(x.tmpdir(),F.createHash("md5").update(o).digest("hex"));this.newAssetsPath=this.unzipFile(o,e).then((()=>this.normalizeAssetFolderPath(e))).then((e=>{if(this.isEmptyFolder(e))throw new Error(`Current assets path ${e} is empty`);return e}))}else{if(!this.isFolder(o))throw new Error(`Invalid current assets path ${o}. It must be a folder or a zip file`);{const e=this.normalizeAssetFolderPath(o);if(this.isEmptyFolder(e))throw new Error(`Current assets path ${o} is empty`);this.newAssetsPath=Promise.resolve(e)}}this.destinationPath=n,this.mkdirpSync(this.destinationPath),this.changelogFilename=l||"CHANGELOG.html",i&&(this.templateIsValid(i)?this.changelogTemplate=i:this.logger.warn(s.colors.yellow("Invalid changelog template, using default"))),"function"==typeof r&&(this.diffFileTemplateHandler=r),"function"==typeof a&&(this.diffLineTemplateHandler=a),c&&(this.contextLines=c)}templateIsValid(e){return e.includes("%FILES%")}isExists(e){return y.existsSync(e)}isZipFile(e){return e.endsWith(".zip")}isFolder(e){return y.lstatSync(e).isDirectory()}isEmptyFolder(e){return 0===y.readdirSync(e,{withFileTypes:!0}).length}mkdirpSync(e){y.existsSync(e)||y.mkdirSync(e,{recursive:!0})}async unzipFile(e,t){return y.rmSync(t,{force:!0,recursive:!0}),u(e,{dir:t})}normalizeAssetFolderPath(e){const t=y.readdirSync(e);return 1===t.length&&y.lstatSync(w.join(e,t[0])).isDirectory()?this.normalizeAssetFolderPath(w.join(e,t[0])):e}pathToPosix(e){return e.replace(/\\/g,"/")}diffTableTemplate(e){return`<table class="diff-table">\n <tbody>\n ${e}\n </tbody>\n </table>`}getDiffTableHTML(e){const t=e.filter(((e,t,o)=>0!==e.lineType||(t>=0&&t<this.contextLines||t>o.length-(this.contextLines+1)&&t<=o.length-1||o.slice(t-this.contextLines,t+this.contextLines+1).some((e=>0!==e.lineType))))).map(((e,t,o)=>{if(t>0){const n=o[t-1];if(e.lineNumber-n.lineNumber>1)return[{lineNumber:-1,lineContent:"",lineType:0},e]}return[e]})).flat().map((e=>this.diffLineHTML(e))).join("");return this.diffTableTemplate(t)}diffLineMessageTemplate(e){return`<tr>\n <td class="blob-num"></td>\n <td class="blob-num"></td>\n <td class="blob-code message">\n <span class="blob-code-inner">${e}</span>\n </td>\n </tr>`}diffLineSkipTemplate(){return'<tr>\n <td class="blob-num"></td>\n <td class="blob-num"></td>\n <td class="blob-code skip">\n <span class="blob-code-inner">Skip</span>\n </td>\n </tr>'}diffLineTemplate(e){const{lineNumber:t,lineContent:o,lineType:n}=e,i=1===n?"addition":-1===n?"deletion":"";return`<tr>\n <td\n class="blob-num ${i}${"addition"===i?" empty":""}"\n ${"addition"!==i?` data-line-number="${t}"`:""}\n ></td>\n <td\n class="blob-num ${i}${"deletion"===i?" empty":""}"\n ${"deletion"!==i?` data-line-number="${t}"`:""}\n ></td>\n <td class="blob-code ${1===n?"code-addition":-1===n?"code-deletion":""}">\n <span class="blob-code-inner" data-code-prefix="${1===n?"+":-1===n?"-":" "}">${r=o??"",r.replace(/[\u00A0-\u9999<>&]/g,(e=>"&#"+e.charCodeAt(0)+";"))}</span>\n </td>\n </tr>`;var r}diffLineHTML(e){if(this.diffLineTemplateHandler)return this.diffLineTemplateHandler(e);const{lineNumber:t}=e;return-1===t?this.diffLineSkipTemplate():this.diffLineTemplate(e)}diffFileTemplate(e,t){return this.diffFileTemplateHandler?this.diffFileTemplateHandler(e,t):`<div class="diff-file">\n <div class="diff-file-title">${e}</div>\n <div class="diff-file-content">${t}</div>\n </div>`}async generateAssetFoldersDiff(){this.logger.info(s.colors.blue(`Comparing asset folders ${await this.oldAssetsPath} and ${await this.newAssetsPath}`));const e=await T.compare(await this.oldAssetsPath,await this.newAssetsPath,{compareContent:!0,skipSymlinks:!0,compareSize:!0,compareDate:!1,compareNameHandler:(e,t)=>(k.test(e)&&(e=e.replace(k,"$1$3")),k.test(t)&&(t=t.replace(k,"$1$3")),0===e.localeCompare(t)?0:e.localeCompare(t)>0?1:-1)});return e.diffSet?.filter((e=>"equal"!==e.state||e.name1!==e.name2))||[]}async generateAssetFilesDiff(e,t){const o=new p,n=o.diff_linesToChars_(e,t),i=o.diff_main(n.chars1,n.chars2,!1);o.diff_charsToLines_(i,n.lineArray);let r=0;return i.map((e=>{const[t,o]=e,n=o.endsWith("\n")?o.split("\n").length-1:o.split("\n").length,i=o.split("\n").map(((e,o)=>({lineContent:e,lineNumber:r+o+1,lineType:t}))).slice(0,n);return-1!==t&&(r+=n),i})).flat()}async generateFilesDiff(e){if("equal"===e.state){const t=this.pathToPosix(w.join(".",e.relativePath,e.name1??"")),o=this.pathToPosix(w.join(".",e.relativePath,e.name2??""));return this.diffFileTemplate(`<span class="renamed"\n >Renamed <span class="from">${t}</span> -> <span class="to">${o}</span></span\n >`,this.diffTableTemplate(this.diffLineMessageTemplate("No changes")))}const t=e.path1&&e.name1?w.join(e.path1,e.name1):null,o=e.path2&&e.name2?w.join(e.path2,e.name2):null,n=this.pathToPosix(w.join(".",e.relativePath,(e.name1||e.name2)??""));if("left"===e.state&&t)return this.diffFileTemplate(`<span class="removed">Removed ${n}</span>`,this.diffTableTemplate(this.diffLineMessageTemplate("File removed")));if("right"===e.state&&o)return this.diffFileTemplate(`<span class="added">Added ${n}</span>`,this.diffTableTemplate(this.diffLineMessageTemplate("File added")));if("distinct"===e.state&&t&&o){const i=this.pathToPosix(w.join(".",e.relativePath,e.name1??"")),r=this.pathToPosix(w.join(".",e.relativePath,e.name2??"")),s=e.name1!==e.name2?`<span class="renamed"\n >Renamed <span class="from">${i}</span> -> <span class="to">${r}</span></span\n >`:n;return this.diffFileTemplate(s,await f.isBinaryFile(t)||await f.isBinaryFile(o)?this.diffTableTemplate(this.diffLineMessageTemplate("Binary file")):this.getDiffTableHTML(await this.generateAssetFilesDiff(y.readFileSync(t,"utf-8"),y.readFileSync(o,"utf-8"))))}return""}async generateChangelog(){this.logger.info(s.colors.green("Generating changelog"));const e=await this.generateAssetFoldersDiff(),t=(await Promise.all(e.map((e=>this.generateFilesDiff(e))))).join("");this.logger.info(s.colors.green("Writing changelog file"));const o=this.changelogTemplate.split("%FILES%");o.splice(1,0,t);const n=o.join("");y.writeFileSync(w.join(this.destinationPath,this.changelogFilename),n),this.logger.info(s.colors.green(`Changelog file written to ${w.join(this.destinationPath,this.changelogFilename)}`))}}class D{sourceDir;outputDir;fontName;constructor(e){this.sourceDir=e.sourceDir,this.outputDir=e.outputDir,this.fontName=e.fontName}async generate(){await m({src:this.sourceDir,dist:this.outputDir,fontName:this.fontName,css:!0,typescript:!0,startUnicode:59905,svgicons2svgfont:{fontHeight:1024}})}}const E=n.cac("pp-dev");let q=global.__pp_dev_profile_session,j=0;const z=e=>{if(q)return new Promise(((t,o)=>{q.post("Profiler.stop",((n,{profile:i})=>{if(n)o(n);else{const o=w.resolve(`./pp-dev-profile-${j++}.cpuprofile`);y.writeFileSync(o,JSON.stringify(i)),e(s.colors.yellow(`CPU profile written to ${s.colors.white(s.colors.dim(o))}`)),q=void 0,t()}}))}))},I=e=>{for(const[t,o]of Object.entries(e))Array.isArray(o)&&(e[t]=o[o.length-1])};function R(e){const t={...e};return delete t["--"],delete t.c,delete t.config,delete t.base,delete t.l,delete t.logLevel,delete t.clearScreen,delete t.d,delete t.debug,delete t.f,delete t.filter,delete t.m,delete t.mode,t}E.option("-c, --config <file>","[string] use specified config file").option("--base <path>","[string] public base path (default: /)").option("-l, --logLevel <level>","[string] info | warn | error | silent").option("--clearScreen","[boolean] allow/disable clear screen when logging").option("-d, --debug [feat]","[string | boolean] show debug logs").option("-f, --filter <filter>","[string] filter debug logs").option("-m, --mode <mode>","[string] set env mode"),E.command("[root]","start dev server").alias("serve").alias("dev").option("--host [host]","[string] specify hostname").option("--port <port>","[number] specify port").option("--https","[boolean] use TLS + HTTP/2").option("--open [path]","[boolean | string] open browser on startup").option("--cors","[boolean] enable CORS").option("--strictPort","[boolean] exit if specified port is already in use").option("--force","[boolean] force the optimizer to ignore the cache and re-bundle").action((async(e,t)=>{I(t);const{createServer:n}=await import("vite");try{const a=await i.loadConfigFromFile({mode:t.mode||"development",command:"serve"},t.config,e,t.logLevel);let l=await r.getViteConfig();const c=i.loadEnv(t.mode||"development",e??$.cwd(),"");if(c&&Object.keys(c).forEach((e=>{e.startsWith("MI_")&&($.env[e]=c[e])})),a){const{plugins:e,...t}=a.config;l=i.mergeConfig(l,t)}const d=await n(i.mergeConfig(l,{root:e,base:t.base,mode:t.mode,configFile:t.config,logLevel:t.logLevel,clearScreen:t.clearScreen,optimizeDeps:{force:t.force},server:R(t),customLogger:s.createLogger(t.logLevel)},!0));if(!d.config.base||"/"===d.config.base)throw new Error('base cannot be equal to "/" or empty string');if(!d.httpServer)throw new Error("HTTP server not available");await d.listen();const p=s.createLogger(t.logLevel),f=global.__pp_dev_start_time??!1,g=f?s.colors.dim(`ready in ${s.colors.reset(s.colors.bold(Math.ceil(o.performance.now()-f)))} ms`):"";p.info(`\n ${s.colors.green(`${s.colors.bold("PP-DEV")} v${r.VERSION}`)} ${g}\n`),d.printUrls(),function(e,t){if(!e.httpServer||!process.stdin.isTTY||process.env.CI)return;e._shortcutsOptions=t;const o=s.createLogger();t.print&&o.info(s.colors.dim(s.colors.green(" ➜"))+s.colors.dim(" press ")+s.colors.bold("h")+s.colors.dim(" to show help"));const n=(t.customShortcuts??[]).filter(S).concat(C);let i=!1;const r=async t=>{if(""===t||""===t)return void await e.close().finally((()=>process.exit(1)));if(i)return;"h"===t&&o.info(["",s.colors.bold(" Shortcuts"),...n.map((e=>s.colors.dim(" press ")+s.colors.bold(e.key)+s.colors.dim(` to ${e.description}`)))].join("\n"));const r=n.find((e=>e.key===t));r&&(i=!0,await r.action(e),i=!1)};process.stdin.setRawMode(!0),process.stdin.on("data",r).setEncoding("utf8").resume(),e.httpServer.on("close",(()=>{process.stdin.off("data",r).pause()}))}(d,{print:!0,customShortcuts:[q&&{key:"p",description:"start/stop the profiler",async action(e){if(q)await z(p.info);else{const e=await import("node:inspector").then((e=>e.default));await new Promise((t=>{q=new e.Session,q.connect(),q.post("Profiler.enable",(()=>{q?.post("Profiler.start",(()=>{p.info("Profiler started"),t()}))}))}))}}},{key:"l",description:"proxy re-login",action(e){e.ws.send({type:"custom",event:"redirect",data:{url:`/auth/index/logout?proxyRedirect=${encodeURIComponent("/")}`}})}}]})}catch(e){const o=s.createLogger(t.logLevel);o.error(s.colors.red(`error when starting dev server:\n${e.stack}`),{error:e}),z(o.info),$.exit(1)}})),E.command("next [root]","start dev server").alias("next-serve").alias("next-dev").option("--host [host]","[string] specify hostname").option("--port <port>","[number] specify port",{default:3e3}).option("--https","[boolean] use TLS + HTTP/2").option("--open [path]","[boolean | string] open browser on startup").option("--cors","[boolean] enable CORS").option("--strictPort","[boolean] exit if specified port is already in use").option("--force","[boolean] force the optimizer to ignore the cache and re-bundle").action((async(e,t)=>{I(t);const{default:n}=await import("next"),l=s.createLogger(),c=function(e="info"){const t=L.default(),o=P.createLogger({level:e,format:P.format.cli({level:!0}),transports:[new P.transports.Console]});t.config={logger:o};const n=t.listen;let i;return t.listen=function(...e){i=n.apply(this,e)},t.printUrls=function(e){if(!i)throw new Error("Server is not listening");const t=e=>s.colors.cyan(e.replace(/:(\d+)\//,((e,t)=>`:${s.colors.bold(t)}/`))),n=i.address();if(n&&"object"==typeof n)if("::"===n.address){const i=new a.URL(e||"",`http://localhost:${n.port}`);o.info(` ${s.colors.green("➜")} ${s.colors.bold("Local")}: ${t(i.toString())}`)}else{const i=new a.URL(e||"",`http://[${n.address}]:${n.port}`);o.info(` ${s.colors.green("➜")} ${s.colors.bold("Local")}: ${t(i.toString())}`)}},t}(t.logLevel),d=R(t),p=i.loadEnv(t.mode||"development",e??$.cwd(),"");p&&Object.keys(p).forEach((e=>{e.startsWith("MI_")&&($.env[e]=p[e])}));const f=n({dev:!0,hostname:d.host,port:d.port});await f.prepare();const g=await f.getServer();let h=g.nextConfig.basePath;const{assetPrefix:u}=g.nextConfig;if(h.endsWith("/")||(h+="/"),"/"===h)throw new Error('basePath cannot be equal to "/" or empty string');const m=h.substring(0,h.lastIndexOf("/")),b=g.nextConfig.serverRuntimeConfig.templateName,v=g.nextConfig.serverRuntimeConfig.ppDevConfig,{backendBaseURL:w,portalPageId:y,appId:T,templateLess:x=!0,enableProxyCache:F=!0,miHudLess:S=!0,proxyCacheTTL:C=6e5,disableSSLValidation:k=!1,v7Features:A=!1,personalAccessToken:D=$.env.MI_ACCESS_TOKEN}=v,E=T??y;if(c.use(s.initPPRedirect(h,b)),w){let e;try{e=new URL(w).host}catch(e){l.error(s.colors.red(`Invalid backendBaseURL: ${w}`)),$.exit(1)}const t=new s.MiAPI(w,{headers:{host:e,referer:w,origin:w.replace(/^(https?:\/\/)([^/]+)(\/.*)?$/i,"$1$2")},portalPageId:E,templateLess:x,disableSSLValidation:k,v7Features:A,personalAccessToken:D});if(F){let e=+C;(!e||Number.isNaN(e)||e<0)&&(e=6e5),c.use(s.initProxyCache({devServer:c,ttl:e}))}const o=["/@vite","/@metricinsights","/@",m];u&&o.push(u),c.use(s.initProxy({devServer:c,baseURL:w,proxyIgnore:o,disableSSLValidation:k,miAPI:t}));const n=new RegExp(`^((${h})|/)$`);c.use(s.initLoadPPData(n,t,v)),c.use(s.initRewriteResponse((e=>n.test(s.cutUrlParams(e))),((o,n)=>Buffer.from(s.urlReplacer(e,n.headers.host??"",t.buildPage(o,S)))))),s.internalServer.post("/@api/login",(async(e,o,n)=>{const{token:i,tokenType:r}=e.body;if(!i)return void o.status(400).json({error:"Token is required"}).end();const a=e=>(l.error(e),n(e),null);if("personal"===r){if(!await t.get("/data/page/index/auth/info",{"Content-Type":"application/json",Accept:"application/json",Authorization:`Bearer ${i}`},!0).then((async e=>{if("number"==typeof e.data?.user?.user_id)return t.personalAccessToken=i,e;o.status(400).json({error:"Token expired or invalid"}).end()})).catch(a))return;s.redirect(o,"/",302)}else if("regular"===r){if(!await t.get("/api/user",{"Content-Type":"application/json",Accept:"application/json",Token:i},!0).then((e=>{if(e.data?.users?.length)return t.personalAccessToken=void 0,o.setHeader("set-cookie",e.headers["set-cookie"]??""),e;o.status(400).json({error:"Token expired or invalid"}).end()})).catch(a))return;s.redirect(o,"/",302)}})),c.use(s.internalServer)}const q=f.getRequestHandler();c.all("*",((e,t)=>{try{if(e.url?.startsWith(u)&&u!==m){const o=e.url.replace(u,m),n=a.parse(o,!0);return n.pathname?q(e,t,n):(t.statusCode=400,void t.end("Invalid URL"))}const o=a.parse(e.url||"/",!0);if(!o.pathname)return t.statusCode=400,void t.end("Invalid URL");q(e,t,o)}catch(e){const o=e instanceof Error?e.message:"Unknown error";l.error(s.colors.red(`Error handling request: ${o}`)),t.statusCode=500,t.end("Internal Server Error")}}));try{await new Promise((e=>{d.host?e(c.listen(d.port,d.host,(()=>{}))):e(c.listen(d.port,(()=>{})))}));const e=global.__pp_dev_start_time??!1,t=e?s.colors.dim(`ready in ${s.colors.reset(s.colors.bold(Math.ceil(o.performance.now()-e)))} ms`):"";l.info(`\n ${s.colors.green(`${s.colors.bold("PP-DEV")} v${r.VERSION}`)} ${t}\n`,{clear:!0}),c.printUrls(h)}catch(e){const o=s.createLogger(t.logLevel);o.error(s.colors.red(`error when starting dev server:\n${e.stack}`),{error:e}),z(o.info),$.exit(1)}})),E.command("build [root]","build for production").option("--target <target>","[string] transpile target (default: 'modules')").option("--outDir <dir>","[string] output directory (default: dist)").option("--assetsDir <dir>","[string] directory under outDir to place assets in (default: assets)").option("--assetsInlineLimit <number>","[number] static asset base64 inline threshold in bytes (default: 4096)").option("--ssr [entry]","[string] build specified entry for server-side rendering").option("--sourcemap [output]",'[boolean | "inline" | "hidden"] output source maps for build (default: false)').option("--minify [minifier]",'[boolean | "terser" | "esbuild"] enable/disable minification, or specify minifier to use (default: esbuild)').option("--manifest [name]","[boolean | string] emit build manifest json").option("--ssrManifest [name]","[boolean | string] emit ssr manifest json").option("--force","[boolean] force the optimizer to ignore the cache and re-bundle (experimental)").option("--emptyOutDir","[boolean] force empty outDir when it's outside of root").option("-w, --watch","[boolean] rebuilds when modules have changed on disk").option("--changelog [assetsFile]","[boolean | string] generate changelog between assetsFile and current build (default: false)").action((async(e,t)=>{I(t);const o=R(t);try{const n=await i.loadConfigFromFile({mode:t.mode||"production",command:"build"},t.config,e,t.logLevel);let a=await r.getViteConfig();if(n){const{plugins:e,...t}=n.config;a=i.mergeConfig(a,t)}const l=i.mergeConfig(a,{root:e,base:t.base,mode:t.mode,configFile:t.config,logLevel:t.logLevel,clearScreen:t.clearScreen,optimizeDeps:{force:t.force},build:o},!0);if(await i.build(l),o.changelog){const n=e||$.cwd(),i=l.build?.outDir||"dist";let r="";if("string"==typeof o.changelog)r=w.resolve(n,o.changelog);else{const e=w.resolve(n,l.ppDevConfig?.syncBackupsDir||"backups");if(!y.existsSync(e))return void s.createLogger(t.logLevel).warn(s.colors.yellow("backups directory not found, skipping changelog generation"));const o=y.readdirSync(e,{withFileTypes:!0});if(!o.length)return void s.createLogger(t.logLevel).warn(s.colors.yellow("no backups found, skipping changelog generation"));const i=o.filter((e=>e.isFile()&&e.name.endsWith(".zip"))).reduce(((t,o)=>y.statSync(w.resolve(e,t.name)).mtimeMs>y.statSync(w.resolve(e,o.name)).mtimeMs?t:o),o[0]).name;r=w.resolve(e,i)}const a=w.resolve(n,i);let c="dist-zip";l.ppDevConfig&&(!1===l.ppDevConfig.distZip?c=l.build?.outDir||"dist":"object"==typeof l.ppDevConfig.distZip&&"string"==typeof l.ppDevConfig.distZip.outDir&&(c=l.ppDevConfig.distZip.outDir));const d=new A({oldAssetsPath:r,newAssetsPath:a,destinationPath:w.resolve(n,c)});await d.generateChangelog()}}catch(e){s.createLogger(t.logLevel).error(s.colors.red(`error during build:\n${e.stack}`),{error:e}),$.exit(1)}finally{z((e=>s.createLogger(t.logLevel).info(e)))}})),E.command("changelog [oldAssetPath] [newAssetPath]","generate changelog between two assets files/folders").option("--oldAssetsPath <oldAssetsPath>","[string] path to the old assets zip file or folder").option("--newAssetsPath <newAssetsPath>","[string] path to the new assets zip file or folder").option("--destination <destination>","[string] destination folder for the changelog (default: .)").option("--filename <filename>","[string] filename for the changelog (default: CHANGELOG.html)").action((async(e,t,o)=>{I(o);const{oldAssetsPath:n=e,newAssetsPath:i=t,destination:r=".",filename:a="CHANGELOG.html",logLevel:l}=o,c=$.cwd();n&&i||(s.createLogger(l).error(s.colors.red("error during changelog generation: oldAssetPath and newAssetPath are required")),$.exit(1));const d=w.resolve(c,n),p=w.resolve(c,i),f=w.resolve(c,r),g=new A({oldAssetsPath:d,newAssetsPath:p,destinationPath:f,changelogFilename:a});await g.generateChangelog()})),E.command("generate-icon-font [source] [destination]","generate icon font from SVG files").option("--source <source>","[string] path to the source directory with SVG files").option("--destination <destination>","[string] path to the destination directory to save the generated font files").option("--font-name, -n <fontName>","[string] name of the font to generate (default: 'icon-font')").action((async(e,t,o)=>{I(o);const{source:n=e,destination:i=t,fontName:r="icon-font"}=o,a=$.cwd(),l=w.resolve(a,n),c=w.resolve(a,i),d=new D({sourceDir:l,outputDir:c,fontName:r}),p=s.createLogger(o.logLevel);p.info(`Generating icon font from SVG files in ${s.colors.dim(l)}`),await d.generate(),p.info(`Icon font generated and saved to ${s.colors.dim(c)}`)})),E.command("optimize [root]","pre-bundle dependencies").option("--force","[boolean] force the optimizer to ignore the cache and re-bundle").action((async(e,t)=>{I(t);try{const o=await i.loadConfigFromFile({mode:t.mode||"production",command:"build"},t.config,e,t.logLevel);let n=await r.getViteConfig();if(o){const{plugins:e,...t}=o.config;n=i.mergeConfig(n,t)}const s=await i.resolveConfig(i.mergeConfig(n,{root:e,base:t.base,configFile:t.config,logLevel:t.logLevel,mode:t.mode}),"serve");await i.optimizeDeps(s,t.force,!0)}catch(e){s.createLogger(t.logLevel).error(s.colors.red(`error when optimizing deps:\n${e.stack}`),{error:e}),$.exit(1)}})),E.command("preview [root]","locally preview production build").option("--host [host]","[string] specify hostname").option("--port <port>","[number] specify port").option("--strictPort","[boolean] exit if specified port is already in use").option("--https","[boolean] use TLS + HTTP/2").option("--open [path]","[boolean | string] open browser on startup").option("--outDir <dir>","[string] output directory (default: dist)").action((async(e,t)=>{I(t);try{const o=await i.loadConfigFromFile({mode:t.mode||"production",command:"build"},t.config,e,t.logLevel);let n=await r.getViteConfig();if(o){const{plugins:e,...t}=o.config;n=i.mergeConfig(n,t)}(await i.preview(i.mergeConfig(n,{root:e,base:t.base,configFile:t.config,logLevel:t.logLevel,mode:t.mode,build:{outDir:t.outDir},preview:{port:t.port,strictPort:t.strictPort,host:t.host,https:t.https,open:t.open}}))).printUrls()}catch(e){s.createLogger(t.logLevel).error(s.colors.red(`error when starting preview server:\n${e.stack}`),{error:e}),$.exit(1)}finally{z((e=>s.createLogger(t.logLevel).info(e)))}})),E.help(),E.version(r.VERSION),E.parse(),exports.stopProfiler=z;
//# sourceMappingURL=cli.js.map