edon-service
Version:
一个开箱即用的前端构建工具,基于Webpack封装,简化了前端项目的开发与构建流程。无论是开发环境的热更新、资源处理,还是生产环境的代码优化、打包部署,都能提供便捷的配置和稳定的性能
21 lines (20 loc) • 21.4 kB
JavaScript
import re from"webpack";import Ae from"webpack-dev-server";import{merge as ze}from"webpack-merge";import Be from"fs-extra";import se from"portfinder";import{getDotEnvObject as ne}from"edon-helper";import{fileURLToPath as ie}from"url";function n(){return process.env.NODE_ENV==="production"}var O=async(o,s)=>{let e=3e3,t=await ne(o);if(t.PORT&&(e=+JSON.parse(t.PORT)),s&&(e=s),e===80)return 80;try{return await se.getPortPromise({port:e,stopPort:e+10})}catch(r){throw new Error((r==null?void 0:r.message)||"No open ports found")}},L=()=>{if(typeof __filename<"u")return __filename;try{let o=import.meta.url;if(!o)throw new Error("\u8BF7\u5728 ESM \u73AF\u5883\u4E0B\u4F20\u5165 import.meta");return ie(o)}catch{return typeof __filename<"u"?__filename:""}};import{register as ae}from"ts-node";import{getDefineConfig as le}from"edon-define";import{joinRoot as b}from"edon-helper";ae({compilerOptions:{module:"CommonJS"}});var P={entryPath:b("src/index.tsx"),outputPath:b("dist"),assetsPath:"assets",publicPath:"/",cdnAddress:"",antdDayjs:!1,autoTypingEnvTypeFile:!0,swagger:[],errorOverlay:!1,extraIncludes:[],forkTSChecker:!1,zipPassword:"123456",devServer:{},http2:!1,limit:10*1024,rem:{enable:!1},styleLoader:!1,cacheDirectory:b("node_modules",".cache","webpack"),statsDirectory:b("node_modules",".edon"),nodePolyfill:!1,legacy:{targets:{chrome:"53",safari:"10"},corejs:"3.24"},svgmin:!0,html:{template:b("public/index.html"),filename:"index.html",hash:n(),inject:"body",minify:{removeComments:n(),collapseWhitespace:n(),removeRedundantAttributes:n(),useShortDoctype:n(),removeEmptyAttributes:n(),removeStyleLinkTypeAttributes:n(),keepClosingSlash:n(),minifyJS:n(),minifyCSS:n(),minifyURLs:n()},chunksSortMode:"auto"}},E=async()=>{let o=await le({});return{...P,...o,rem:{...P.rem,...o.rem},html:{...P.html,...o.html},legacy:{...P.legacy,...o.legacy}}};import x from"path";import Te from"webpack-chain";import ue from"mini-css-extract-plugin";import me from"html-webpack-plugin";import{CleanWebpackPlugin as de}from"clean-webpack-plugin";import d from"chalk";import ce from"webpack";import B from"path";var j=class{lastPercent=0;startTime=Date.now();lastUpdate=Date.now();changedFiles=[];isRunning=!1;apply(s){s.hooks.watchRun.tap("EnhancedProgressPlugin",e=>{e.modifiedFiles&&(this.changedFiles=Array.from(e.modifiedFiles)),this.isRunning||(this.isRunning=!0,this.lastPercent=0,this.startTime=Date.now(),this.lastUpdate=Date.now(),console.log(d.cyan(`
\u{1F504} \u5F00\u59CB\u7F16\u8BD1...`))),this.changedFiles.length>0&&(this.changedFiles.length===1?this.changedFiles.forEach(t=>{let r=B.relative(process.cwd(),t);console.log(`
${d.yellow("\u{1F4DD} \u53D8\u66F4\u6587\u4EF6: ")}${d.gray(`${r}`)}
`)}):(console.log(d.yellow(`
\u{1F4DD} \u53D8\u66F4\u6587\u4EF6:`)),this.changedFiles.forEach(t=>{let r=B.relative(process.cwd(),t);console.log(d.gray(` - ${r}`))}),console.log(`
`)))}),new ce.ProgressPlugin(e=>{if(!this.isRunning)return;let t=Date.now();if(t-this.lastUpdate<100)return;let r=Math.floor(e*100);if(r>=this.lastPercent){process.stdout.clearLine(0),process.stdout.cursorTo(0);let i=this.generateProgressBar(r);process.stdout.write(`\u{1F680} ${d.cyan("\u7F16\u8BD1")} ${i} ${d.green(r+"%")}`),this.lastPercent=r,this.lastUpdate=t}}).apply(s),s.hooks.done.tap("EnhancedProgressPlugin",e=>{var l,c,a;let r=(Date.now()-this.startTime)/1e3;this.isRunning=!1,process.stdout.clearLine(0),process.stdout.cursorTo(0);let i=this.generateProgressBar(100);if(process.stdout.write(`\u{1F680} ${d.cyan("\u7F16\u8BD1")} ${i} ${d.green("100%")}
`),e.hasErrors()||e.hasWarnings()){let p=e.toJson();if(e.hasErrors()){(l=p.errors)==null||l.forEach(u=>{console.log(d.gray(`
- ${u.message}`))}),console.log(d.red(`
\u274C \u7F16\u8BD1\u9519\u8BEF: ${(c=p.errors)==null?void 0:c.length}\u5904
`));return}e.hasWarnings()&&(console.log(d.yellow(`
\u26A0\uFE0F \u7F16\u8BD1\u8B66\u544A:`)),(a=p.warnings)==null||a.forEach(u=>{console.log(d.yellow(` - ${u.message}`))}))}console.log(d.green(`
\u2705 \u7F16\u8BD1\u5B8C\u6210\uFF01\u231B \u8017\u65F6: ${r.toFixed(2)}s
`))})}generateProgressBar(s){let t=Math.floor(20*s/100),r=20-t,i;return s===100?i="#".repeat(t-1)+"-".repeat(r):i="#".repeat(t)+"\u{1F680}"+"-".repeat(Math.max(0,r-1)),`[${i}]`}},W=j;import fe from"@pmmmwh/react-refresh-webpack-plugin";import ge from"copy-webpack-plugin";import m from"chalk";import pe from"webpack";import{convertBytesSize as I}from"edon-helper";var T=class{startTime=0;lastPercent=0;lastUpdate=0;isRunning=!1;apply(s){s.hooks.beforeRun.tap("BuildCompilePlugin",()=>{this.startTime=Date.now(),this.lastPercent=0,this.lastUpdate=Date.now(),this.isRunning=!0}),new pe.ProgressPlugin(e=>{if(!this.isRunning)return;let t=Date.now();if(t-this.lastUpdate<100)return;let r=Math.floor(e*100);if(r!==this.lastPercent){process.stdout.clearLine(0),process.stdout.cursorTo(0);let i=this.generateProgressBar(r);process.stdout.write(`\u{1F528} ${m.blue("\u6784\u5EFA\u4E2D")} ${i} ${m.green(r+"%")}`),this.lastPercent=r,this.lastUpdate=t}}).apply(s),s.hooks.done.tap("BuildCompilePlugin",e=>{var l,c;this.isRunning=!1;let r=(Date.now()-this.startTime)/1e3;if(process.stdout.clearLine(0),process.stdout.cursorTo(0),e.hasErrors()){console.log(m.red(`
\u274C \u6784\u5EFA\u5931\u8D25\uFF0C\u5B58\u5728\u9519\u8BEF:`)),(l=e.toJson().errors)==null||l.forEach((p,u)=>{console.log(m.red(`
\u9519\u8BEF ${u+1}:`)),console.log(m.red(` ${p.message}`)),p.stack&&console.log(m.gray(` \u5806\u6808: ${p.stack.substring(0,200)}...`))}),console.log(m.red(`
\u8BF7\u4FEE\u590D\u4E0A\u8FF0\u9519\u8BEF\u540E\u91CD\u65B0\u6784\u5EFA\u3002`));return}e.hasWarnings()&&(console.log(m.yellow(`
\u26A0\uFE0F \u6784\u5EFA\u5B58\u5728\u8B66\u544A:`)),(c=e.toJson().warnings)==null||c.forEach((p,u)=>{console.log(m.yellow(` ${u+1}. ${p.message.substring(0,150)}`))}));let i=this.displayBuildStats(e);console.log(m.green(`
\u2705 \u6784\u5EFA\u6210\u529F\uFF01`)),console.log(m.gray(`\u603B\u8BA1: ${i}`)),console.log(m.gray(`\u603B\u8017\u65F6: ${r.toFixed(2)}s`)),console.log(m.gray(`\u5B8C\u6210\u65F6\u95F4: ${new Date().toLocaleTimeString()}
`))})}generateProgressBar(s){let t=Math.floor(20*s/100),r=20-t,i;return s===100?i="#".repeat(t-1)+"-".repeat(r):i="#".repeat(t)+"\u{1F680}"+"-".repeat(Math.max(0,r-1)),`[${i}]`}displayBuildStats(s){let t=s.toJson().assets||[];if(t.length===0)return I(0);let r=t.length>10,i=r?`\uFF08\u5171${t.length}\u4EFD\u6587\u4EF6\uFF0C\u53EA\u663E\u793A\u524D10\u4EFD\uFF09`:"";console.log(m.cyan(`
\u{1F4CA} \u6784\u5EFA\u7ED3\u679C\u7EDF\u8BA1${i}:`)),[...t].sort((a,p)=>(p.size||0)-(a.size||0)).filter(a=>!a.name.includes("/images/")).slice(0,10).forEach(a=>{a.name&&a.size&&console.log(` ${m.gray("-")} ${m.white(a.name.padEnd(45," "))} ${m.green(I(a.size))}`)}),r&&console.log(` ${m.gray("-")} \u5176\u4ED6\u7701\u7565...`);let c=t.reduce((a,p)=>a+(p.size||0),0);return I(c)}},U=T;import{joinRoot as M}from"edon-helper";import{VueLoaderPlugin as he}from"vue-loader";import ve from"unplugin-auto-import/webpack";import ye from"unplugin-vue-components/webpack";import{ElementPlusResolver as V}from"unplugin-vue-components/resolvers";import be from"webpack";import we from"fork-ts-checker-webpack-plugin";var N=(o,s,e)=>{let{html:t,forkTSChecker:r,framework:i,uiFramework:l,elementPlusOptions:c}=s,a=i==="vue",p=i==="react",u=l==="element-plus";return a&&o.plugin("vue-loader-plugin").use(he).end(),u&&(o.plugin("auto-import").use(ve({resolvers:[V()],dts:`${(c==null?void 0:c.dtsDir)||"./types"}/auto-import.d.ts`,include:[/\.vue$/,/\.vue\?vue/,/\.[tj]sx?$/],exclude:[/[\\/]node_modules[\\/]/]})),o.plugin("components").use(ye({resolvers:[V({importStyle:(c==null?void 0:c.importStyle)||"css"})],dts:`${(c==null?void 0:c.dtsDir)||"./types"}/components.d.ts`,include:[/\.vue$/,/\.vue\?vue/,/\.[tj]sx?$/],exclude:[/[\\/]node_modules[\\/]/]}))),n()?(o.plugin("build-compile-info").use(U),o.plugin("mini-css-extract").use(ue,[{filename:"assets/css/[name].[contenthash:8].css",chunkFilename:"assets/css/[name].[contenthash:8].chunk.css"}])):(o.plugin("clean").use(de),o.plugin("compile-info").use(W),p&&o.plugin("react-refresh").use(fe).tap(()=>[{overlay:!1,include:/\.(jsx|tsx)$/,exclude:[/node_modules/,/\.test\.(js|ts)x?$/]}]),r&&o.plugin("fork-ts-checker").use(we,[{typescript:{configFile:M("tsconfig.json"),memoryLimit:4096},async:!0,issue:{include:[{file:"**/*.{ts,tsx,vue}"},{file:"**/*.{js,jsx,vue}"}],exclude:[{file:"**/node_modules/**/*"}]}}])),o.plugin("define").use(be.DefinePlugin,[{"process.env":e,env:e}]),o.plugin("html").use(me,[{template:(t==null?void 0:t.template)||M("public/index.html"),filename:(t==null?void 0:t.filename)||"index.html",inject:(t==null?void 0:t.inject)==="body"?"body":(t==null?void 0:t.inject)==="head"?"head":!0,minify:n()?{...t==null?void 0:t.minify,collapseWhitespace:!0,removeComments:!0}:!1}]),o.plugin("copy-public").use(ge,[{patterns:[{from:M("public"),to:o.output.get("path"),globOptions:{ignore:["**/index.html","**/.DS_Store","**/unused-*","**/large-assets/**/*"]},noErrorOnMissing:!0}]}]),o};import{safeRequire as H}from"edon-helper";var J=o=>{let s=o.module.rule("images").test(/\.(png|jpe?g|gif|webp)$/i);return s.set("type","asset"),s.set("generator",{filename:`assets/images/${n()?"[name].[contenthash:8][ext]":"[name].[hash:8][ext]"}`}),s.set("parser",{dataUrlCondition:{maxSize:n()?4*1024:10*1024}}),o.module.rule("svg-resource").test(/\.svg$/).exclude.add(/\.inline\.svg$/).add(/src\/icons\/svg\//).end().set("type","asset/resource").set("generator",{filename:`assets/svgs/${n()?"[name].[contenthash:8][ext]":"[name].[hash:8][ext]"}`}),o.module.rule("svg-component").test(/(\.inline\.svg$|src\/icons\/svg\/.*\.svg$)/).use("@svgr/webpack").loader(H.resolve("@svgr/webpack")).options({svgo:n(),svgoConfig:n()?{plugins:[{name:"removeViewBox",active:!1},{name:"removeEmptyAttrs",active:!0},{name:"cleanupIds",active:!0},{name:"removeUselessDefs",active:!0}]}:{plugins:[{name:"removeViewBox",active:!1}]},icon:!0,dimensions:!1}).end().use("url-loader").loader(H.resolve("url-loader")).options({limit:10*1024,name:`assets/svgs/${n()?"[name].[contenthash:8][ext]":"[name].[hash:8][ext]"}`}),o};import q from"mini-css-extract-plugin";import{isEmpty as Ce,safeRequire as w}from"edon-helper";import ke from"autoprefixer";import xe from"postcss-pxtorem";import Pe from"@tailwindcss/postcss";var C=(o,s,e,t)=>{let{rem:r={},framework:i,uiFramework:l}=t||{},c=i==="vue",a=l==="tailwind",p=o.module.rule(s).test(e),u=!n(),g=n()?{}:{injectType:"styleTag",esModule:!0},R=y=>y.use("css-loader").loader(w.resolve("css-loader")).options({importLoaders:2,sourceMap:u,modules:{auto:te=>/\.module\.(css|less)$/.test(te),localIdentName:n()?"[local]-[hash:base64:8]":"[local]-[hash:base64:5]"}}).end().use("postcss-loader").loader(w.resolve("postcss-loader")).options({postcssOptions:{parser:"postcss-safe-parser",plugins:[a&&Pe(),ke(),r!=null&&r.enable?xe(Ce(r==null?void 0:r.options)?{rootValue:10,propList:["*"],selectorBlackList:["ignore-","#root","html"],replace:!0,mediaQuery:!1,minPixelValue:1}:r==null?void 0:r.options):!1].filter(Boolean)},sourceMap:u}).end();return c?(R(p.oneOf("vue-sfc-style").resourceQuery(/\?vue/).use("vue-style-loader").loader(w.resolve("vue-style-loader")).options({sourceMap:u}).end()),R(p.oneOf("vue-normal-style").use("style-loader").loader(n()?q.loader:w.resolve("style-loader")).when(Object.keys(g).length>0,y=>y.options(g)).end())):R(p.use("style-loader").loader(n()?q.loader:w.resolve("style-loader")).when(Object.keys(g).length>0,y=>y.options(g)).end()),p};import{safeRequire as h}from"edon-helper";import $e from"os";import{safeRequire as k}from"edon-helper";import Ee from"os";var Q=(o,s)=>{o.module.rule("vue").test(/\.vue$/).use("vue-loader").loader(k.resolve("vue-loader")).options({cacheDirectory:!n(),cacheIdentifier:`vue-loader-${n()?"prod":"dev"}`});let e=!0,t={};try{t={jsc:{parser:{syntax:"typescript",tsx:!0,jsx:!0},target:n()?"es2015":"es2020",externalHelpers:n(),transform:{}},cacheDirectory:!n(),cacheCompression:n(),sourceMaps:!n(),isModule:!0}}catch{e=!1}let r=o.module.rule("vue:script").enforce("post").test(/\.vue$/).resourceQuery(/type=script/);n()||r.use("thread-loader").loader(k.resolve("thread-loader")).options({workers:Math.max(2,Math.min(Ee.cpus().length-1,4))}).end(),e?r.use("swc-loader").loader(k.resolve("swc-loader")).options({...t,jsc:{...t.jsc||{},parser:{syntax:"typescript",tsx:!0,jsx:!0}}}):r.use("babel-loader").loader(k.resolve("babel-loader")).options({presets:[["@babel/preset-env"],["@babel/preset-typescript",{allowDeclareFields:!0,allExtensions:!0}]],cacheDirectory:!0}),o.module.rule("vue:template-post").enforce("post").test(/\.vue$/).resourceQuery(/type=template/).use("babel-loader").loader(k.resolve("babel-loader")).options({presets:[["@babel/preset-typescript",{allowDeclareFields:!0,allExtensions:!0}]],cacheDirectory:!0})};var G=(o,s)=>{let{framework:e}=s,t=e==="vue",r=e==="react";t&&Q(o,s);let i=o.module.rule("compile").test(/\.[jt]sx?$/).exclude.add(/node_modules/).end().resourceQuery({not:[/vue/]});n()||i.use("thread-loader").loader(h.resolve("thread-loader")).options({workers:Math.max(2,Math.min($e.cpus().length-1,4))}).end();try{let l={jsc:{parser:{syntax:"typescript",tsx:!0,jsx:!0},target:n()?"es2015":"es2020",externalHelpers:n(),transform:{}},cacheDirectory:!n(),cacheCompression:n(),sourceMaps:!n(),isModule:!0};r&&(l.jsc.transform.react={refresh:!n(),runtime:"automatic",development:!n()}),i.use("swc-loader").loader(h.resolve("swc-loader")).options({...l})}catch{i.use("babel-loader").loader(h.resolve("babel-loader")).options({presets:["@babel/preset-env","@babel/preset-typescript","@babel/preset-react"],plugins:[n()&&"@babel/plugin-transform-runtime",!n()&&"react-refresh/babel"].filter(Boolean),cacheDirectory:!0})}return J(o),C(o,"css",/\.css$/,s),C(o,"less",/\.less$/,s).use("less-loader").loader(h.resolve("less-loader")).options({lessOptions:{javascriptEnabled:!0,math:"always"},sourceMap:!n()}),C(o,"scss",/\.s[ac]ss$/,s).use("sass-loader").loader(h.resolve("sass-loader")).options({sourceMap:!n(),sassOptions:{outputStyle:n()?"compressed":"expanded"}}),C(o,"stylus",/\.styl$/,s).use("stylus-loader").loader(h.resolve("stylus-loader")).options({sourceMap:!n()}),o};import{EsbuildPlugin as K}from"esbuild-loader";var X=(o,s)=>{let{framework:e,uiFramework:t}=s,r=e==="vue",i=e==="react",l=t==="antd",c=t==="element-plus";return o.optimization.splitChunks({chunks:"all",minSize:2e4,maxSize:7e4,minChunks:2,maxAsyncRequests:30,maxInitialRequests:30,cacheGroups:{vendors:{test:/[\\/]node_modules[\\/]/,priority:-10,reuseExistingChunk:!0},...i&&{react:{test:/[\\/]node_modules[\\/](react|react-dom|react-router)[\\/]/,name:"react-vendor",priority:20,reuseExistingChunk:!0}},...r&&{vue:{test:/[\\/]node_modules[\\/](vue|vue-router|pinia)[\\/]/,name:"vue-vendor",priority:20,reuseExistingChunk:!0}},...l&&{antd:{test:/[\\/]node_modules[\\/]antd[\\/]/,name:"antd-vendor",priority:15,reuseExistingChunk:!0}},...c&&{elementPlus:{test:/[\\/]node_modules[\\/]element-plus[\\/]/,name:"element-vendor",priority:15,reuseExistingChunk:!0}}}}).runtimeChunk("multiple"),n()?(o.optimization.minimizer("js").use(K,[{target:r?"es2016":"es2015",css:!1,minify:!0,legalComments:"none",drop:["console","debugger"]}]),o.optimization.minimizer("css").use(K,[{target:"es2015",minify:!0,css:!0}]),o.optimization.usedExports(!0).concatenateModules(!0)):o.optimization.removeAvailableModules(!1).removeEmptyChunks(!1).splitChunks({chunks:"all",minSize:1/0}).minimize(!1),o};import De from"path";import Se from"fs-extra";import Y from"mini-css-extract-plugin";import Re from"speed-measure-webpack-plugin";import{joinRoot as je}from"edon-helper";import{BundleAnalyzerPlugin as Ie}from"webpack-bundle-analyzer";var Z=(o,s,e)=>{var i,l,c;let{statsDirectory:t}=s,r=De.join(t||je("node_modules",".edon"),"webpack.config.js");if(Se.writeFileSync(r,`module.exports = ${o.toString()}`,{encoding:"utf8"}),e.analyzer&&o.plugin("analyzer").use(Ie,[{analyzerMode:"server",analyzerHost:"localhost",analyzerPort:8888,reportFilename:"bundle-report.html",defaultSizes:"gzip",openAnalyzer:!0,generateStatsFile:!0,statsFilename:"stats.json",statsOptions:{source:!1,modules:!0,chunks:!0,assets:!0},excludeAssets:[/\.map$/],logLevel:"info"}]),e.speed){let a=o.toConfig(),p=(i=a==null?void 0:a.plugins)==null?void 0:i.filter(g=>!(g instanceof Y));a.plugins=[...p];let u=new Re().wrap(a);return(c=(l=u==null?void 0:u.plugins)==null?void 0:l.push)==null||c.call(l,new Y({})),u}return o};import{joinRoot as $}from"edon-helper";var ee=(o,s,e)=>{let{errorOverlay:t,cacheDirectory:r}=s;return o.devServer.hot(!0).open(!0).port((e==null?void 0:e.port)||3e3).host((e==null?void 0:e.host)||"0.0.0.0").historyApiFallback(!0).merge({client:{logging:"none",overlay:{errors:t??!0,warnings:!1},progress:!0,webSocketTransport:"ws"},devMiddleware:{stats:{all:!1,errors:!0,warnings:!0,timings:!0},writeToDisk:!0},watchFiles:{paths:["src/**/*","public/**/*"],options:{aggregateTimeout:100,poll:300,followSymlinks:!1,ignored:/node_modules/}},static:{directory:$("public"),watch:{poll:300,ignored:/node_modules/}},headers:{"Access-Control-Allow-Origin":"*"}}),o.merge({cache:{type:"filesystem",buildDependencies:{config:[L()],tsconfig:[$("tsconfig.json")],packagejson:[$("package.json")]},name:"development-cache",version:"1.0.0",cacheDirectory:r||$("node_modules",".cache","webpack"),compression:n()?"gzip":!1,maxAge:864e5},infrastructureLogging:{level:"none",debug:!1},stats:{logging:"none",loggingDebug:!1,loggingTrace:!1}}),o};import oe from"fs-extra";import{generateEnvTypes as Me,getDotEnvObject as Fe,joinRoot as F}from"edon-helper";var _e=async(o,s)=>{let e=new Te,t=await Fe(o.mode),r=await E();await Me("edon-service",t,{framework:r==null?void 0:r.framework});let i=o.mode==="prod"?"production":"development";process.env.NODE_ENV=i,r.cacheDirectory&&oe.ensureDirSync(r.cacheDirectory),r.statsDirectory&&oe.ensureDirSync(r.statsDirectory);let{entryPath:l,outputPath:c,chainWebpack:a}=r;e.mode(i),e.set("target",["web",n()?"es5":void 0].filter(Boolean)),e.entry("index").add(l||F("src/index.tsx")).end(),e.output.path(c||F("dist")).publicPath("/").filename(`assets/js/[name]${n()?".[contenthash:8]":""}.js`).pathinfo(!n()),n()?o.sourceMap?e.devtool("hidden-source-map").end():e.devtool(!1).end():e.devtool("eval-cheap-module-source-map").end(),e.resolve.extensions.merge([".tsx",".ts",".json",".js",".jsx",".vue"]).end(),e.resolve.alias.set("src",x.resolve(process.cwd(),"src")).set("@",x.resolve(process.cwd(),"src")).set("assets",F("public/assets")).end(),r.framework==="react"?e.resolve.alias.set("react",x.resolve(process.cwd(),"node_modules/react")).set("react-dom",x.resolve(process.cwd(),"node_modules/react-dom")).end():r.framework==="vue"&&e.resolve.alias.set("vue",x.resolve(process.cwd(),"node_modules/vue")).end(),e.resolve.symlinks(!0).end(),e.performance.hints(!1),N(e,r,t),G(e,r),X(e,r),a&&await a(e,{isProd:n(),dotEnv:t,mode:o.mode}),n()||ee(e,r,s);let p=Z(e,r,o);return o.speed?p:e.toConfig()},_=_e;import f from"chalk";var D={padding:0,margin:0,borderStyle:"round",borderColor:"blue"},S=async()=>{let{default:o}=await import("boxen");return o},v={info:async(o,s={})=>{if(s.simple){console.log(f.blue(`\u2139\uFE0F ${o}`));return}let e=await S();console.log(e(f.blue(o),{...D,...s,borderColor:s.borderColor||"blue"}))},success:async(o,s={})=>{if(s.simple){console.log(f.green(`\u2705 ${o}`));return}let e=await S();console.log(e(f.green(o),{...D,...s,borderColor:s.borderColor||"green"}))},error:async(o,s={})=>{if(s.simple){console.error(f.red(`\u274C ${o}`));return}let e=await S();console.error(e(f.red(o),{...D,...s,borderColor:s.borderColor||"red"}))},warning:async(o,s={})=>{if(s.simple){console.warn(f.yellow(`\u26A0\uFE0F ${o}`));return}let e=await S();console.warn(e(f.yellow(o),{...D,...s,borderColor:s.borderColor||"yellow"}))},progress:async o=>{console.log(f.cyan(`\u{1F504} ${o}`))}};import{getLocalIPs as Oe,joinRoot as A}from"edon-helper";var z=class{setEnv(s){process.env.NODE_ENV=s}checkArgv(s,e){s.mode||(e(),process.exit(1))}async start(s){this.setEnv(s.mode==="prod"?"production":"development");let e=await O(s.mode,s.port),t=Oe(),r=await _(s,{port:e}),i=re(r),l=await E(),c={port:e,hot:!0,liveReload:!1,open:!1,compress:!0,host:"0.0.0.0",server:l.http2?"spdy":"http",historyApiFallback:!0,setupExitSignals:!1,allowedHosts:"all",static:{directory:A("public","source"),watch:!0},devMiddleware:{stats:"none",writeToDisk:!1},client:{logging:"warn",overlay:l.errorOverlay,progress:!0,reconnect:!0},watchFiles:{paths:[A("src"),A("public")],options:{followSymlinks:!0,ignored:["**/node_modules/**","**/.git/**","**/dist/**"],usePolling:!1,interval:100,aggregateTimeout:300,awaitWriteFinish:{stabilityThreshold:200,pollInterval:50}}}};if(!i)return Promise.reject(new Error("compiler is null"));let a=new Ae(ze(c,(l==null?void 0:l.devServer)||{}),i);if(await v.success("\u5F00\u53D1\u670D\u52A1\u5668\u542F\u52A8\u5728:",{simple:!0}),await v.success(`- \u672C\u5730\u8BBF\u95EE: http://localhost:${e}`,{simple:!0}),t.ipv4.length>0)if(t.ipv4.length===1)await v.success(`- IP\u8BBF\u95EE: http://${t.ipv4[0]}:${e}`,{simple:!0});else{await v.success("- \u7F51\u7EDC\u8BBF\u95EE (IPv4):",{simple:!0});for(let p of t.ipv4)await v.success(` http://${p}:${e}`,{simple:!0})}await a.start()}async build(s){this.setEnv(s.mode==="prod"?"production":"development");let e=await _(s),t=re(e);t==null||t.run(()=>{})}},Er=new z;export{Er as default};