@ikaros-cli/ikaros 2.2.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin.mjs CHANGED
@@ -1,2 +1,2 @@
1
- #!/usr/bin/env node
2
- import './dist/index.mjs'
1
+ #!/usr/bin/env node
2
+ import './dist/cli.mjs'
package/dist/cli.d.mts ADDED
@@ -0,0 +1 @@
1
+ export { };
package/dist/cli.mjs ADDED
@@ -0,0 +1 @@
1
+ import{g as e,n as t,u as n,y as r}from"./compile-pipeline-DuG5l8nW.mjs";import{Option as i,program as a}from"commander";const o={WEB:`web`,DESKTOPCLIENT:`desktopClient`,ELECTRON:`desktopClient`},s=[new i(`-m, --mode <name>`,`Environment variable`),new i(`-p, --platform <type>`,`build platform type`).default(o.WEB).choices(Object.values(o))];async function c(e){try{await t(e)}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`${t}\n`),process.exit(1)}}function l(e){let t=e.command(r.SERVER,{isDefault:!0}).description(`Start local develop serve`).action(async e=>{await c({command:r.SERVER,options:e})}),n=e.command(r.BUILD).description(`Start build`).action(async e=>{await c({command:r.BUILD,options:e})});for(let e of s)t.addOption(e),n.addOption(e)}function u(){n(22),a.version(e,`-v, --version`),l(a),a.parse()}u();export{};
@@ -0,0 +1,13 @@
1
+ import{createRequire as e}from"node:module";import t from"node:fs";import n,{rm as r}from"node:fs/promises";import i,{dirname as a,extname as o,isAbsolute as s,join as c,relative as l,resolve as u}from"node:path";import{escapeRegExp as d,isFunction as f,isString as p}from"es-toolkit";import{isArray as m,isEmpty as h,isObject as g}from"es-toolkit/compat";import{z as _}from"zod/v4";import v,{join as y}from"path";import{URL as b,fileURLToPath as x,pathToFileURL as S}from"node:url";import C from"fs-extra";import{config as ee}from"dotenv";import{parse as te}from"yaml";import{transform as w}from"oxc-transform";import{rspack as T}from"@rspack/core";import E from"chalk";import ne from"node:os";import D from"pretty-bytes";import re from"easy-table";import ie from"cli-cursor";import ae from"node:process";import{RsdoctorRspackPlugin as oe}from"@rsdoctor/rspack-plugin";import se from"compression-webpack-plugin";import{ModuleFederationPlugin as ce}from"@module-federation/enhanced/rspack";import{RspackDevServer as le}from"@rspack/dev-server";import{detect as ue}from"detect-port";import de from"chokidar";const O=[`...`,`.mjs`,`.jsx`,`.ts`,`.tsx`],fe=x(new b(`../`,import.meta.url)),pe=e(fe),me=(...e)=>y(fe,...e),k=`dist`,he=`public`,A=`index.html`,ge=`ikaros.config`,_e=[`ts`,`mjs`,`json`,`yaml`],j={js:`assets/js/[contenthash:8].js`,jsChunk:`assets/js/[contenthash:8].chunk.js`,css:`assets/css/[contenthash:8].css`,cssChunk:`assets/css/[contenthash:8].chunk.css`,cssExtract:`assets/css/[contenthash].css`,img:`assets/img/[contenthash][ext]`,media:`assets/media/[contenthash][ext]`,fonts:`assets/fonts/[contenthash][ext]`},M={mobile:[`defaults`,`IOS >= 16`,`Chrome >= 80`],pc:[`>0.2%`,`Chrome >= 90`,`Safari >= 16`,`last 2 versions`,`not dead`]},ve=_.enum([`es`,`cjs`,`umd`,`iife`]),ye=_.object({entry:_.union([_.string(),_.array(_.string()),_.record(_.string(),_.string())]),name:_.string().optional(),formats:_.array(ve).optional(),fileName:_.union([_.string(),_.custom()]).optional(),cssFileName:_.string().optional(),externals:_.array(_.union([_.string(),_.instanceof(RegExp)])).optional(),globals:_.record(_.string(),_.string()).optional()}).superRefine((e,t)=>{(e.formats??[]).some(e=>e===`umd`||e===`iife`)&&!e.name&&t.addIssue({code:_.ZodIssueCode.custom,path:[`name`],message:`library.name 在使用 'umd' 或 'iife' 格式时必须指定`})}).optional(),N={target:_.enum([`pc`,`mobile`]).optional().default(`pc`),quiet:_.boolean().optional().default(!1),pages:_.custom().optional(),enablePages:_.union([_.array(_.string()),_.literal(!1)]).optional(),define:_.custom().optional(),library:ye,build:_.object({base:_.string().optional().default(`/`),assetsDir:_.string().optional(),sourceMap:_.boolean().optional().default(!1),outDirName:_.string().optional().default(k)}).optional(),resolve:_.object({alias:_.record(_.string(),_.string()).optional(),extensions:_.array(_.string()).optional()}).optional(),server:_.object({port:_.number().int().min(1024).max(65535).optional()}).optional(),electron:_.unknown().optional()},be=_.object({bundler:_.custom().optional().default(`rspack`).refine(e=>e===`rspack`,{message:`bundler must be 'rspack' for rspack config`}),...N,moduleFederation:_.union([_.custom(),_.array(_.custom())]).optional(),plugins:_.union([_.custom(),_.array(_.custom())]).optional(),loaders:_.array(_.custom()).optional(),experiments:_.custom().optional(),cdnOptions:_.custom().optional(),server:_.object({port:_.number().int().min(1024).max(65535).optional(),proxy:_.custom().optional(),https:_.union([_.boolean(),_.record(_.string(),_.unknown())]).optional().default(!1)}).optional(),css:_.object({lightningcssOptions:_.record(_.string(),_.unknown()).optional(),sourceMap:_.boolean().optional(),lessOptions:_.record(_.string(),_.unknown()).optional(),sassOptions:_.record(_.string(),_.unknown()).optional(),stylusOptions:_.record(_.string(),_.unknown()).optional()}).optional(),build:_.object({base:_.string().optional().default(`/`),assetsDir:_.string().optional(),gzip:_.boolean().optional().default(!1),sourceMap:_.boolean().optional().default(!1),outDirName:_.string().optional().default(k),outReport:_.boolean().optional().default(!1),cache:_.boolean().optional().default(!1),dependencyCycleCheck:_.boolean().optional().default(!1)}).optional()}),xe=_.object({bundler:_.literal(`vite`),...N,server:_.object({port:_.number().int().min(1024).max(65535).optional(),proxy:_.record(_.string(),_.unknown()).optional(),https:_.union([_.boolean(),_.record(_.string(),_.unknown())]).optional()}).optional(),vite:_.object({plugins:_.unknown().optional()}).strict().optional()}).passthrough().superRefine((e,t)=>{for(let n of[`plugins`,`loaders`,`experiments`,`cdnOptions`,`moduleFederation`,`css`]){let r=e;n in r&&r[n]!==void 0&&t.addIssue({code:_.ZodIssueCode.custom,path:[n],message:`bundler='vite' 时不支持 ${n},请使用 vite.plugins 或 Vite 原生配置能力`})}}),P=_.union([xe,be]);function Se(e){return y(e,`env`)}function F(e,t){return t?[y(e,`env`,`.env.${t}`)]:[y(e,`env`,`.env`)]}function I(e,t){return F(e,t)[0]}async function Ce(e,t,n){if(!await C.pathExists(Se(e)))return t.push({source:`env-loader`,message:`env folder not found`}),!1;let r=I(e,n);if(!await C.pathExists(r)){let e=n?`.env.${n}`:`.env`;return t.push({source:`env-loader`,message:`${e} file not found`}),!1}return!0}async function we(e,t){let n=[];return await Ce(e,n,t)?{env:ee({path:I(e,t),quiet:!0}).parsed??{},warnings:n}:{env:{},warnings:n}}async function Te(e,t){let{code:r,errors:i}=await w(e,await n.readFile(e,`utf-8`),{lang:t?`ts`:`js`});if(i.length>0)throw Error(`Transformation failed: `+i.map(e=>e.message).join(`, `));return{code:r}}async function Ee(e,t){let r=`${e}.timestamp-${Date.now()}-${Math.random().toString(16).slice(2)}`,i=`${r}.mjs`,a=`${S(r)}.mjs`;await n.writeFile(i,t);try{return(await import(a)).default}finally{await n.unlink(i).catch(()=>{})}}async function De(e,t=!1){let{code:n}=await Te(e,t);return Ee(e,n)}const L=[`.mjs`,`.js`,`.ts`,`.json`,`.yaml`],Oe=[/(?:import|export)\s+(?:[^'"`]*?\s+from\s+)?['"]([^'"`]+)['"]/g,/import\s*\(\s*['"]([^'"`]+)['"]\s*\)/g,/require\(\s*['"]([^'"`]+)['"]\s*\)/g],R=new Map;R.set(`.mjs`,async e=>(await import(S(e).href)).default),R.set(`.ts`,async e=>await De(e,!0)),R.set(`.json`,async e=>await C.readJson(e)),R.set(`.yaml`,async e=>te(await n.readFile(e,`utf8`)));function ke(e,t){return s(t)?t:u(e,t)}async function z({configFile:e,context:t}){let n=t??process.cwd();if(e)return ke(n,e);let r=_e.map(e=>u(n,`${ge}.${e}`)),i=(await Promise.all(r.map(e=>C.pathExists(e)))).findIndex(Boolean);return i<0?void 0:r[i]}function Ae(e){let t=new Set;for(let n of Oe){n.lastIndex=0;let r=null;for(;(r=n.exec(e))!==null;){let e=r[1];e?.startsWith(`.`)&&t.add(e)}}return[...t]}async function je(e,t){let n=u(a(e),t),r=o(n)?[n]:[...L.map(e=>`${n}${e}`),...L.map(e=>c(n,`index${e}`))];for(let e of r)if(await C.pathExists(e))return e}async function Me(e,t){if(t.has(e))return;t.add(e);let r=o(e);if(r===`.json`||r===`.yaml`)return;let i=Ae(await n.readFile(e,`utf8`));for(let n of i){let r=await je(e,n);r&&await Me(r,t)}}async function Ne({configFile:e,context:t}){let n=await z({configFile:e,context:t});if(!n)return[];let r=new Set;return await Me(n,r),[...r]}async function Pe({configFile:e,context:t}){let n=await z({configFile:e,context:t});if(!n)return;let r=o(n);if(!R.has(r))throw Error(`No configuration file ! `);return R.get(r)(n)}let B=function(e){return e.SERVER=`server`,e.BUILD=`build`,e}({});async function Fe(t){let{command:n,options:r,configFile:i,onBuildStatus:a}=t,o=t.context??process.cwd(),s=e(c(o,`./`)),l=(...e)=>c(o,...e),u=e=>s(e),d=e=>{try{return s.resolve(e)}catch{return}},f=await Ie(l),{env:p,preWarnings:m}=await Le(r,o);return{context:o,command:n,options:r,env:p,userConfig:await Re({configFile:i,context:o,options:r,env:p,command:n}),contextPkg:f,resolveContext:l,loadContextModule:u,resolveContextModule:d,contextRequire:s,isElectron:r.platform===`desktopClient`,configFile:i,onBuildStatus:a,preWarnings:m}}async function Ie(e){let r=e(`package.json`);try{await n.access(r,t.constants.F_OK)}catch{return}return JSON.parse(await n.readFile(r,{encoding:`utf8`}))}async function Le(e,t){let{platform:n,mode:r}=e,i={PLATFORM:n,MODE:r},{env:a,warnings:o}=await we(t,r);return{env:{...i,...a},preWarnings:o}}async function Re(e){let{configFile:t,context:n,options:r,env:i,command:a}=e,o=await Pe({configFile:t,context:n});if(o){if(f(o)){let e={mode:r.mode??``,env:{...i,PLATFORM:r.platform,MODE:r.mode??i?.MODE},command:a};return P.parse(await o(e))}if(g(o))return P.parse(o)}}function ze(e,t){return{loader:e.includes(`builtin`)?e:pe.resolve(e),options:t}}function Be(e,t){let{lightningcss:n,sourceMap:r}=t??{},i=ze(`builtin:lightningcss-loader`,{...n}),a=(e,n)=>{let a=[i],o=t?.[e];return e!==`css`&&a.push(ze(`${e}-loader`,{...o,...n,sourceMap:r})),a};return{less:a(`less`),sass:a(`sass`,{sassOptions:{indentedSyntax:!0,api:`modern-compiler`}}),scss:a(`sass`,{sassOptions:{api:`modern-compiler`}}),stylus:a(`stylus`),styl:a(`stylus`),css:a(`css`)}}function Ve(e,t){let n=Be(e,t);return Object.entries(n).map(([e,t])=>({test:RegExp(`\\.${e}$`),use:t,type:`css/auto`}))}function He(e,t){let n={...e},r=t;for(let e of Object.keys(r)){let t=r[e],i=n[e];g(t)&&g(i)?n[e]=He(i,t):n[e]=t}return n}function Ue(t,n=process.cwd()){try{return e(y(n,`./`)).resolve(t),!0}catch{return!1}}var We=class{constructor({env:e=`development`,mode:t=``,context:n=process.cwd()}){this.list=[],this.env=`development`,this.mode=``,this.isDev=!0,this.env=e,this.mode=t,this.isDev=e===`development`,this.context=n}add(e){return e&&(m(e)?this.list=this.list.concat(e):this.list.push(e)),this}end(){return this.list}},Ge=class extends We{constructor(...e){super(...e),this.defaultScriptLoader=e=>[{test:/\.m?ts$/i,loader:`builtin:swc-loader`,options:{jsc:{parser:{syntax:`typescript`}}},type:`javascript/auto`,exclude:[y(this.context,`node_modules`)]},{test:/\.m?js$/i,loader:`builtin:swc-loader`,options:{isModule:`unknown`,rspackExperiments:e},type:`javascript/auto`,exclude:[y(this.context,`node_modules`)]}],this.defaultResourceLoader=[{test:/\.(png|jpe?g|gif|svg|ico)(\?.*)?$/,type:`asset/resource`,generator:{filename:this.isDev?`[id][ext]`:j.img}},{test:/\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,type:`asset/resource`,generator:{filename:this.isDev?`[id][ext]`:j.media}},{test:/\.(woff2?|eot|ttf|otf)(\?.*)?$/,type:`asset/resource`,generator:{filename:this.isDev?`[id][ext]`:j.fonts}}]}useDefaultCssLoader(e){return Ve(this.env,e).forEach(e=>this.add(e)),this}useDefaultScriptLoader(e){return this.add(this.defaultScriptLoader(e)),this}useDefaultResourceLoader(){return this.defaultResourceLoader.forEach(e=>this.add(e)),this}},Ke=class extends We{useDefaultEnvPlugin(e){let{frameworkEnv:t={},extEnv:n={},env:r={}}=e??{};return this.add(Je({frameworkEnv:t,extEnv:n,env:r})),this}useCopyPlugin(){return this.env===`production`&&this.add(new T.CopyRspackPlugin({patterns:[{context:y(this.context,he),from:`./`,noErrorOnMissing:!0,globOptions:{ignore:[`**/index.html`,`.*`]}}]})),this}useHtmlPlugin(e){return this.add(new T.HtmlRspackPlugin({template:e??y(this.context,`index.html`)})),this}},qe=class{constructor({pages:e,enablePages:t}){this.warnings=[],this.pages=e,this.enablePages=t,this.getEnablePages()}create(){let e={},t=[];for(let n of Object.keys(this.pages))e[n]={import:this.pages[n].entry,library:this.pages[n].library},t.push(new T.HtmlRspackPlugin({template:this.pages[n].html,filename:`${n}.html`,chunks:[n],scriptLoading:`blocking`,...this.pages[n].options}));return{entry:e,plugins:t}}getEnablePages(){if(!h(this.pages)&&m(this.enablePages)){let e={},t=[];for(let n of this.enablePages)this.pages[n]?e[n]=this.pages[n]:t.push(n);if(h(t)||this.warnings.push({source:`enable-pages`,message:`当前设置页面${t.join(`、`)}不存在`}),h(e))return;this.pages=e}}};function Je({frameworkEnv:e={},extEnv:t={},env:n={}}){let r=He(t,n),i=Object.fromEntries(Object.entries(r).map(([e,t])=>[`import.meta.env.${e}`,JSON.stringify(t)]));return new T.DefinePlugin({...i,...e})}var Ye=`@ikaros-cli/ikaros`,Xe=`2.3.0`;const Ze={name:Ye,version:Xe},V=`@rspack/ikaros-stats-plugin`,H=E.hex(`#222222`);var Qe=class{constructor(e){this.startCompileHrtime=void 0,this.userConfig=e}apply(e){this.compiler=e,this.isDev=e.options.mode===`development`,new T.ProgressPlugin().apply(e),ie.hide(),this.isDev?this.initDevHook():this.initProdHook()}updateStartCompileTime(){this.startCompileHrtime=ae.hrtime()}getCurrentEndCompileTime(){let e=ae.hrtime(this.startCompileHrtime);return(e[0]*1e9+e[1])/1e6}getError(e){let{errors:t,errorsCount:n=0}=e;if(!(!t||n===0))return t.map(e=>`${H.bgRed(` ERROR `)} ${e.message.trim()}`).join(`
2
+
3
+ `)}getWarn(e){let{warnings:t,warningsCount:n=0}=e;if(!(!t||n===0))return t.map(e=>`${H.bgYellow(` WARN `)} ${e.message.trim()}`).join(`
4
+
5
+ `)}getInfraWarnings(e){let{logging:t}=e;if(!t)return;let n=[];for(let[e,r]of Object.entries(t))for(let t of r.entries)if(t.type===`warn`){let r=(t.args??[t.message]).join(` `);n.push(`${H.bgYellow(` WARN `)} [${e}] ${r}`)}if(n.length!==0)return n.join(`
6
+ `)}getEndTips(e,t){let{gray:n,cyan:r,red:i,green:a,yellow:o}=E,{errorsCount:s=-1,warningsCount:c=-1}=e,l=(t/1e3).toFixed(2);return n(s>0?`${r(Ze.name)} compiled with${i(` ${s} error`)}`:c>0?`compile ${a(`success`)} and with ${o(`${c} warning`)}, time: ${l}s`:`compile ${a(`success`)}, time: ${l}s.`)}getTableInfo(e){let{assets:t}=e;if(!t||t.length===0)return;let n=new re,r=this.userConfig?.build?.gzip??!1,i=0,a=0,o=!1;for(let e=0;e<t.length;e++){let{name:s,size:c,related:l,info:u}=t[e];if(u.development)continue;let d=r&&m(l)?l.find(e=>e.type===`gzipped`).size:0;if(i+=c,a+=d,t.length>20&&e>=4&&e<t.length-1-4){o||(o=!0,n.cell(`name`,`....`),n.cell(`size`,`....`),r&&n.cell(`gzip`,`....`),n.newRow());continue}n.cell(`name`,s),n.cell(`size`,D(c)),r&&n.cell(`gzip`,D(d)),n.newRow()}return n.pushDelimeter(),n.cell(`name`,`There are ${t.length} files`),n.cell(`size`,D(i)),r&&n.cell(`gzip`,D(a)),n.newRow(),E.cyan.dim(n.toString().trim())}getHostList(){let{userConfig:e,compiler:t}=this,{devServer:n}=t.options,r=n?.server===`https`||typeof n?.server==`object`,a=Number(n?.port),o=[],s=``,c=Object.values(ne.networkInterfaces());if(e){s=e.build?.base??``,(!s||s===`auto`)&&(s=`/`);let t=Object.keys(e?.pages||{})[0];t&&t!==`index`?s=i.join(s,`${t}.html`):s.endsWith(`/`)||(s+=`/`)}for(let e of c){let{address:t}=e?.find(e=>e.family===`IPv4`)||{};t&&o.push(t)}o.sort((e,t)=>{let n=e.split(`.`),r=t.split(`.`);for(let[e]of n.entries())if(n[e]!==r[e])return Number(r[e])-Number(n[e]);return 0});let l=o.indexOf(`127.0.0.1`);return l!==-1&&(o.splice(l,1),o.unshift(`localhost`)),o=o.map(e=>(r?(e=`https://${e}`,a!==443&&(e=e+`:`+a)):(e=`http://`+e,a!==80&&(e=e+`:`+a)),new URL(s,e).href)),o}initDevHook(){let{compiler:e}=this,t=this.getHostList(),{blue:n,cyan:r,gray:i}=E;e.hooks.environment.intercept({name:V}),e.hooks.watchRun.intercept({name:V,call:()=>{this.updateStartCompileTime()}}),e.hooks.done.intercept({name:V,call:e=>{console.clear();let a=e.toJson({preset:`errors-warnings`,colors:!0,logging:`warn`,loggingTrace:!1}),{errorsCount:o=0,warningsCount:s=0}=a;if(o>0)console.log(this.getError(a)),console.log();else{s>0&&(console.log(this.getWarn(a)),console.log());let e=this.userConfig?.quiet?void 0:this.getInfraWarnings(a);e&&(console.log(e),console.log());let{name:o,version:c}=Ze,l=`${r(`${o} v${c}`)} entry address:\n\n`;for(let e of t)l+=n(` ${e}\n`);console.log(i(l))}console.log(this.getEndTips(a,this.getCurrentEndCompileTime())),console.log()}})}initProdHook(){let{compiler:e}=this,t;e.hooks.environment.intercept({name:V,call:()=>{console.log(E.gray(`start build...`)),this.updateStartCompileTime()}}),e.hooks.done.intercept({name:V,call:e=>{t=e.toJson({preset:`normal`,colors:!0,assetsSort:`size`,logging:`warn`,loggingTrace:!1})}}),e.cache.hooks.shutdown.intercept({name:V,done:()=>{let{errorsCount:e=0,warningsCount:n=0}=t;if(console.log(),e>0)console.log(this.getError(t)),console.log();else{n>0&&(console.log(this.getWarn(t)),console.log());let e=this.userConfig?.quiet?void 0:this.getInfraWarnings(t);e&&(console.log(e),console.log()),console.log(this.getTableInfo(t)),console.log()}console.log(this.getEndTips(t,this.getCurrentEndCompileTime()))}})}},$e=class{constructor(e,t=!1){this.warnings=e,this.quiet=t}apply(e){this.quiet||this.warnings.length===0||e.hooks.thisCompilation.tap(`@rspack/ikaros-pre-warnings-plugin`,e=>{for(let{source:t,message:n}of this.warnings)e.getLogger(t).warn(n)})}};const U=`@rspack/ikaros-cdn-plugin`,et=/:([a-z]+)/i;function tt(e){return e.filter(e=>!e.cssOnly).reduce((e,t)=>(e[t.name]=t.var||t.name,e),{})}var nt=class{constructor(e){this.isDev=!1,this.versionCache=new Map,this.context=e.context??process.cwd(),this.options={prodUrl:`https://unpkg.com/:name@:version/:path`,devUrl:`:name/:path`,crossOrigin:!1,...e}}apply(e){this.isDev=e.options.mode===`development`,e.hooks.compilation.tap(U,e=>{T.HtmlRspackPlugin.getCompilationHooks(e).alterAssetTags.tapAsync(U,(e,t)=>{try{this.injectResources(e),t(null,e)}catch(e){t(e)}})})}injectResources(e){let t=this.options.modules,n=[];for(let e of t){let t=this.getAssets(e,`style`,`styles`);for(let e of t)n.push({tagName:`link`,voidTag:!0,attributes:{rel:`stylesheet`,href:e,...this.options.crossOrigin&&{crossorigin:this.options.crossOrigin}}})}for(let e of t){if(e.cssOnly)continue;let t=this.getAssets(e,`path`,`paths`);for(let e of t)n.push({tagName:`script`,voidTag:!0,attributes:{src:e,...this.options.crossOrigin&&{crossorigin:this.options.crossOrigin}}})}e.assetTags&&(e.assetTags.styles.unshift(...n.filter(e=>e.tagName===`link`)),e.assetTags.scripts.unshift(...n.filter(e=>e.tagName===`script`)))}getAssets(e,t,n){let r=[...e[n]||[]],i=e[t];return i&&r.unshift(i),r.map(t=>this.generateUrl(e,t))}joinUrl(e,t){return`${e.replace(/\/+$/,``)}/${t.replace(/^\/+/,``)}`}generateUrl(e,t){let n=this.isDev?e.devUrl||this.options.devUrl:e.prodUrl||this.options.prodUrl;return et.test(n)?n.replace(/:([a-z]+)/gi,(n,r)=>{switch(r){case`name`:return e.name;case`version`:return e.version||this.getModuleVersion(e.name);case`path`:return t;default:return n}}):this.joinUrl(n,t)}getModuleVersion(t){let n=this.versionCache.get(t);if(n)return n;try{let n=e(v.join(this.context,`./`))(v.join(t,`package.json`)).version;return this.versionCache.set(t,n),n}catch{return console.warn(E.yellow(`[${U}] 无法获取模块 "${t}" 的版本信息`)),`latest`}}},rt=class{constructor(e){this.options=e}createSourceMapPlugin(){let{isDev:e,userConfig:t}=this.options;if(e)return new T.EvalSourceMapDevToolPlugin({columns:!1,module:!0});if(t?.build?.sourceMap??!1)return new T.SourceMapDevToolPlugin({test:[/.js/,/.mjs/],filename:`[file].map[query]`})}createCssExtractPlugin(){if(!this.options.isDev)return new T.CssExtractRspackPlugin({filename:this.joinAssetsDir(j.cssExtract),ignoreOrder:!0})}createDoctorPlugin(){let{isDev:e,userConfig:t}=this.options;if(!(e||!t?.build?.outReport))return new oe}createGzipPlugin(){let{isDev:e,userConfig:t}=this.options;if(!(e||!t?.build?.gzip))return new se}createCdnPlugin(){let{cdnOptions:e}=this.options.userConfig??{};if(!(!e||h(e.modules)))return new nt({...e,context:this.options.context})}createModuleFederationPlugin(){let e=this.options.userConfig?.moduleFederation;if(e)return m(e)?e.map(e=>new ce(e)):new ce(e)}createDependencyCyclePlugin(){let{isDev:e,userConfig:t}=this.options;if(!(e||!t?.build?.dependencyCycleCheck))return new T.CircularDependencyRspackPlugin({exclude:/node_modules/,failOnError:!1})}joinAssetsDir(...e){return[this.options.assetsDir,...e].join(`/`).replace(/\/+/g,`/`)}};const it=e=>{let{isVue:t,isReact:n}=e;return t?{noParse:/^(vue|vue-router|vuex|vuex-router-sync)$/}:n?{noParse:e=>/(react|react-dom|react-is)\.production\.min\.js$/.test(e),env:{REACT_APP_ENABLE_DEVTOOLS:!1}}:{}};function at(e){return e===B.SERVER?{minimize:!1,removeAvailableModules:!1,removeEmptyChunks:!1,splitChunks:!1}:{minimize:!0,minimizer:[new T.LightningCssMinimizerRspackPlugin,new T.SwcJsMinimizerRspackPlugin],splitChunks:{chunks:`all`,minSize:3e4,minChunks:1,maxAsyncRequests:5,maxInitialRequests:3,cacheGroups:{vendor:{test:/[\\/]node_modules[\\/]/,name:`vendors`,priority:10,chunks:`all`},common:{name:`common`,minChunks:2,priority:5,reuseExistingChunk:!0}}}}}function ot(e){if(e.command!==B.SERVER&&e.userConfig?.build?.cache)return{cache:!0,experiments:{cache:{type:`persistent`}}}}function st(e){let{userConfig:t,isElectron:n,resolveContext:r}=e,i=t?.build?.outDirName;if(n){let e=t?.electron,n=r(`dist/electron/renderer`);return e?.build?.outDir?c(r(e.build.outDir),`renderer`):n}return p(i)?r(i):r(k)}function W(e,t){return[e,t].filter(Boolean).join(`/`).replace(/\/+/g,`/`)}function ct(e){let{command:t,mode:n,env:r,context:i,contextPkg:a,userConfig:o,pages:s,browserslist:l,base:u,port:f,isElectron:p,resolveContext:m}=e,h=t===B.SERVER,g=h?`development`:`production`,_=new Ge({env:g,mode:n,context:i}),v=new Ke({env:g,mode:n,context:i}),y=new qe({pages:s,enablePages:o?.enablePages}),{entry:b,plugins:x}=y.create(),S=[...e.preWarnings??[],...y.warnings],{env:C,noParse:ee}=it({isVue:e.isVue,isReact:e.isReact}),te=_.useDefaultResourceLoader().useDefaultScriptLoader(o?.experiments).useDefaultCssLoader(o?.css).add(o?.loaders).end(),w=o?.build?.assetsDir??``,T=new rt({command:t,userConfig:o,isDev:h,assetsDir:w,context:i}),E=v.useDefaultEnvPlugin({extEnv:{...o?.define},frameworkEnv:C,env:r}).useCopyPlugin().add(x).add(new Qe(o)).add(new $e(S,o?.quiet)).add(T.createSourceMapPlugin()).add(T.createCssExtractPlugin()).add(T.createDoctorPlugin()).add(T.createGzipPlugin()).add(T.createCdnPlugin()).add(T.createModuleFederationPlugin()).add(T.createDependencyCyclePlugin()).add(o?.plugins).end();return{mode:g,context:i,entry:b,target:p?`electron-renderer`:[`web`,`es2015`,`browserslist:${l}`],externals:o?.cdnOptions?.modules?tt(o.cdnOptions.modules):void 0,resolve:{alias:{"@":m(`src`),...o?.resolve?.alias},extensions:o?.resolve?.extensions||O,modules:[`node_modules`,m(`node_modules`),me(`node_modules`)]},output:{clean:!h,path:st({userConfig:o,isElectron:p,resolveContext:m}),publicPath:p&&!h?`./`:u,filename:h?`[name].js`:W(w,j.js),chunkFilename:h?`[name].chunk.js`:W(w,j.jsChunk),cssFilename:h?`[name].css`:W(w,j.css),cssChunkFilename:h?`[name].chunk.css`:W(w,j.cssChunk),chunkLoadingGlobal:`${a?.name||`ikaros`}_chunk`,pathinfo:!1},optimization:at(t),stats:`none`,watchOptions:{aggregateTimeout:500,ignored:/node_modules/},module:{rules:te,noParse:ee},plugins:E,devServer:{hot:!0,port:f,server:(()=>{let e=o?.server?.https;return e?e===!0?`https`:{type:`https`,options:e}:`http`})(),allowedHosts:`all`,proxy:o?.server?.proxy,historyApiFallback:{rewrites:[{from:/\.(js|css|json|png|jpe?g|gif|svg|ico|woff2?|eot|ttf|otf|mp4|webm|ogg|mp3|wav|flac|aac|map)(\?.*)?$/,to:e=>e.parsedUrl.pathname??``},{from:RegExp(`^${d(u)}`),to:c(u,A)}]},headers:{"Access-Control-Allow-Origin":`*`},static:{directory:m(he),publicPath:u},client:{logging:`none`,overlay:{errors:!0,warnings:!1,runtimeErrors:!1},webSocketURL:`auto://0.0.0.0:${f}/ws`}},experiments:{css:!0},...ot({command:t,userConfig:o})}}const lt=e=>{switch(e){case`es`:return`module`;case`cjs`:return`commonjs2`;case`umd`:return`umd`;case`iife`:return`iife`}},ut=e=>{switch(e){case`es`:return`.mjs`;case`cjs`:return`.cjs`;case`umd`:return`.umd.cjs`;case`iife`:return`.iife.js`}},dt=(e,t)=>typeof e==`string`?t(e):Array.isArray(e)?e.length===1?t(e[0]):Object.fromEntries(e.map((e,n)=>[`entry${n}`,t(e)])):Object.fromEntries(Object.entries(e).map(([e,n])=>[e,t(n)])),ft=e=>typeof e==`string`?!1:Array.isArray(e)?e.length>1:Object.keys(e).length>1,pt=(e,t,n)=>{if(e?.length){if((n===`umd`||n===`iife`)&&t){let n={};for(let r of e)if(typeof r==`string`){let e=t[r];e?n[r]={root:e,commonjs:r,commonjs2:r,amd:r}:n[r]=r}let r=e.filter(e=>e instanceof RegExp);return r.length>0?[n,...r]:n}return e.map(e=>e)}},mt=(e,t,n,r)=>{if(typeof e==`function`){let r=e(t,n);return/\.[cm]?[jt]sx?$/.test(r)?r:`${r}.js`}return`${e??r??`index`}${ut(t)}`},ht=e=>{let{userConfig:t,resolveContext:n}=e,r=t?.build?.outDirName;return n(typeof r==`string`&&r?r:k)},gt=e=>{let{format:t,library:n,configParams:r}=e,{context:i,contextPkg:a,userConfig:o,browserslist:s,resolveContext:c}=r,l=t===`es`,u=dt(n.entry,c),d=ht({userConfig:o,resolveContext:c}),f=t===`umd`||t===`iife`,p=mt(n.fileName,t,typeof u==`string`?`index`:Object.keys(u)[0],a?.name);return{mode:`production`,context:i,entry:u,target:l?[`web`,`es2015`]:[`web`,`es2015`,`browserslist:${s}`],resolve:{alias:{"@":c(`src`),...o?.resolve?.alias},extensions:o?.resolve?.extensions||O},output:{clean:!1,path:d,filename:p,...l?{module:!0}:{},library:{...f&&n.name?{name:n.name}:{},type:lt(t)},globalObject:t===`umd`?`this`:void 0},externals:pt(n.externals,n.globals,t),externalsType:l?`module`:void 0,optimization:{minimize:!0,minimizer:[new T.LightningCssMinimizerRspackPlugin,new T.SwcJsMinimizerRspackPlugin]},plugins:[...o?.define?[new T.DefinePlugin(o.define)]:[],...o?.plugins?Array.isArray(o.plugins)?o.plugins:[o.plugins]:[]],module:{rules:[{test:/\.(j|t)sx?$/,use:[{loader:`builtin:swc-loader`,options:{jsc:{parser:{syntax:`typescript`,tsx:!0}}}}],type:`javascript/auto`}]},experiments:{...l?{outputModule:!0}:{},css:!0},devtool:o?.build?.sourceMap?`source-map`:!1,stats:`none`}},_t=e=>{let t=e.userConfig?.library;if(!t)throw Error(`[ikaros] library config is required for library mode`);let n=ft(t.entry),r=(t.formats??(n?[`es`,`cjs`]:[`es`,`umd`])).map(n=>gt({format:n,library:t,configParams:e}));return r.length===1?r[0]:r},vt=[];function G(e){vt.push(e)}async function yt(){let e=vt.splice(0),t=(await Promise.allSettled(e.map(async e=>e()))).filter(e=>e.status===`rejected`);if(t.length>0){let e=t.map(e=>e.reason instanceof Error?e.reason.message:String(e.reason));throw Error(`${t.length} cleanup(s) failed:\n${e.join(`
7
+ `)}`)}}function bt(e){return`Build failed with errors.\n${e.toString({chunks:!1,colors:!0}).split(/\r?\n/).map(e=>` ${e}`).join(`
8
+ `)}\n`}function xt(e,t){let{onBuildStatus:n}=t??{};return new Promise((t,r)=>{let i=T(e);i.run((e,a)=>{i.close(i=>{let o=e&&i?AggregateError([e,i],`Build failed: ${e.message}; Close failed: ${i.message}`):e||i;if(o)return n?.({success:!1,message:o.message||`build error`}),r(o);if(a?.hasErrors()){let e=bt(a);return n?.({success:!1,message:e}),r(Error(e))}let s=a?.toString({chunks:!1,colors:!0});return n?.({success:!0,message:s}),t(s)})})})}async function St(e,t){let{port:n,onBuildStatus:r}=t??{},i=T(e),a=new le(e.devServer,i);G(async()=>{await a.stop()}),await new Promise((e,t)=>{a.startCallback(i=>i?(r?.({success:!1,port:n,message:i.message}),t(i)):(r?.({success:!0,port:n}),e()))})}function Ct(e,t){let{onBuildStatus:n,...r}=t??{};return new Promise((t,i)=>{let a=T(e).watch({ignored:/node_modules/,aggregateTimeout:300,poll:!1,...r},(e,r)=>{if(e)return n?.({success:!1,message:e.message||`watch build error`}),i(e);if(r?.hasErrors()){let e=bt(r);return n?.({success:!1,message:e}),i(Error(e))}let a=r?.toString({chunks:!1,colors:!0});return n?.({success:!0,message:a}),t(a)});G(()=>new Promise((e,t)=>{a.close(n=>{if(n){t(n);return}e()})}))})}var wt=class{constructor(){this.name=`rspack`}createConfig(e){return e.command===`build`&&e.userConfig?.library?_t(e):ct({command:e.command===`server`?B.SERVER:B.BUILD,mode:e.mode,env:e.env,context:e.context,contextPkg:e.contextPkg,userConfig:e.userConfig,pages:e.pages,browserslist:e.browserslist,base:e.base,port:e.port,isElectron:e.isElectron,isVue:e.isVue,isReact:e.isReact,resolveContext:e.resolveContext,preWarnings:e.preWarnings})}async runDev(e,t){await St(Array.isArray(e)?e[0]:e,{port:t.port,onBuildStatus:t.onBuildStatus})}async runBuild(e,t){let n=(Array.isArray(e)?e:[e])[0]?.output?.path;return n&&await r(n,{recursive:!0,force:!0}),xt(e,{onBuildStatus:t.onBuildStatus})}};function Tt(e){let t=Number(process.versions.node.split(`.`)[0]);if(Number.isFinite(t)&&t<e){let t=E.bgRed.white(` ERROR `);process.stderr.write(`${t} Node.js version must be greater than or equal to v${e}! (current: v${process.versions.node})\n\n`),process.exit(1)}}var K=class extends Error{constructor(e,t){super(e,t),this.name=`ViteAdapterError`}};const Et=()=>{let e=`@ikaros-cli/ikaros-bundler-vite`;return new K([`你启用了 bundler='vite',但未安装可选依赖 ${e}。`,``,`请安装后重试:`,` pnpm add -D ${e}`].join(`
9
+ `))},Dt=e=>new K([`@ikaros-cli/ikaros-bundler-vite 已安装但加载失败。`,`请确认依赖版本与当前 Node.js 版本兼容。`,``,`原始错误: ${e instanceof Error?e.message:String(e)}`].join(`
10
+ `),{cause:e}),Ot=()=>new K([`@ikaros-cli/ikaros-bundler-vite 已安装但加载失败:未找到 ViteBundlerAdapter 导出。`,`请确认安装的版本与 @ikaros-cli/ikaros 兼容。`].join(`
11
+ `));var kt=class{constructor(e){this.name=`vite`,this.loadContextModule=e.loadContextModule,this.resolveContextModule=e.resolveContextModule}ensureAdapter(){if(this.adapter)return this.adapter;Tt(22);let e=`@ikaros-cli/ikaros-bundler-vite`;if(!this.resolveContextModule(e))throw Et();let t;try{t=this.loadContextModule(e)}catch(e){throw Dt(e)}let n=(t.default??t).ViteBundlerAdapter;if(typeof n!=`function`)throw Ot();return this.adapter=new n,this.adapter}createConfig(e){return this.ensureAdapter().createConfig(e)}async runDev(e,t){return this.ensureAdapter().runDev(e,t)}async runBuild(e,t){return this.ensureAdapter().runBuild(e,t)}};function At(e){let{bundler:t,loadContextModule:n,resolveContextModule:r}=e;switch(t){case`vite`:return new kt({loadContextModule:n,resolveContextModule:r});default:return new wt}}function jt(e){return(e===`mobile`?M.mobile:M.pc).join(`,`)}function Mt(e,t){return t?{index:{html:e(`src/renderer/${A}`),entry:e(`src/renderer/index`)}}:{index:{html:e(A),entry:e(`src/index`)}}}async function q(e){let{command:t,context:n,resolveContext:r,getUserConfig:i,isElectron:a}=e,o=await i(),s=o?.build?.base??`/`;if(t===B.SERVER&&/^https?:/.test(s)){let e=E.cyan(`build.base`);throw Error(`本地开发时 ${e} 不应该为外部 Host!`)}let c=o?.target??`pc`,l=o?.pages??Mt(r,!!a),u=o?.server?.port??await ue(`8080`),d=Ue(`react`,n),f=Ue(`vue`,n);return{userConfig:o,base:s,target:c,pages:l,port:u,browserslist:jt(c),isVue:f,isReact:d}}var Nt=class{constructor(){this.name=`web`}async resolvePreConfig(e){return q({command:e.command,context:e.context,resolveContext:e.resolveContext,getUserConfig:async()=>e.userConfig,isElectron:e.isElectron})}async compile(e,t){let{command:n,preConfig:r,compileContext:i}=t,a=await e.createConfig({command:n,mode:i.options.mode,env:i.env,context:i.context,contextPkg:i.contextPkg,userConfig:r.userConfig,pages:r.pages,base:r.base,port:r.port,browserslist:r.browserslist,isElectron:i.isElectron,isVue:r.isVue,isReact:r.isReact,resolveContext:i.resolveContext,preWarnings:i.preWarnings});n===`server`?await e.runDev(a,{port:r.port,onBuildStatus:i.onBuildStatus,registerCleanup:G}):await e.runBuild(a,{onBuildStatus:i.onBuildStatus})}};function Pt(e,t={}){switch(e){case`desktopClient`:return Ft(t.context);default:return new Nt}}function Ft(e){let t,n=async()=>t||(t=await It(e??process.cwd()),t);return{name:`desktopClient`,async resolvePreConfig(e){return(await n()).resolvePreConfig(e)},async compile(e,t){return(await n()).compile(e,t)}}}async function It(t){let n=`@ikaros-cli/ikaros-platform-desktop-client`,r=e=>{let t=[`你启用了 platform='desktopClient',但未安装可选依赖 ${n}。`,``,`请安装后重试:`,` pnpm add -D ${n}`];if(e){let n=e instanceof Error?e.message:String(e);t.push(``,`原始错误: ${n}`)}return Error(t.join(`
12
+ `))},i;try{i=await import(S(e(c(t,`./`)).resolve(n)).href)}catch(e){throw r(e)}let a=(i.default??i).ElectronDesktopPlatformInstance;if(!a||typeof a.resolvePreConfig!=`function`)throw Error([`${n} 已安装但加载失败:未找到 ElectronDesktopPlatformInstance 导出。`,`请确认安装的版本与 @ikaros-cli/ikaros 兼容(需 >=3.0)。`].join(`
13
+ `));return a}const Lt={DONE:E.bgGreen.white,ERROR:E.bgRed.white,OKAY:E.bgBlue.white,WARNING:E.bgYellow.white,INFO:E.bgCyan.white},Rt=(e,t)=>Lt[e](` ${e} `)+` ${t}`,J=(e,t)=>({text:n,onlyText:r})=>{let i=Rt(e,n);if(r)return i;t(i)},Y=(()=>{let e={done:J(`DONE`,console.log),error:J(`ERROR`,console.error),okay:J(`OKAY`,console.log),warning:J(`WARNING`,console.warn),info:J(`INFO`,console.info)};return()=>e})(),X=Y(),zt={stabilityThreshold:200,pollInterval:50};function Bt(e){let{context:t,configFile:n,mode:r,onRestart:i,debounceMs:a=1e3,watchOptions:o}=e,s=F(t,r),l=n?[Z(t,n)]:_e.map(e=>c(t,`${ge}.${e}`)),u=new Set([...l,...s].map(e=>Z(t,e))),d=null,f=!1,p=!1,m=null,h=new Set(u),g=new Set(h),{awaitWriteFinish:_,...v}=o??{},y=de.watch([...g],{ignoreInitial:!0,ignorePermissionErrors:!0,awaitWriteFinish:_??zt,...v}),b=async()=>{let e=await Ne({context:t,configFile:n}),r=new Set([...u,...e.map(e=>Z(t,e))]),i=new Set(r),a=[...i].filter(e=>!g.has(e)),o=[...g].filter(e=>!i.has(e));h=r,g=i,!f&&(a.length>0&&y.add(a),o.length>0&&await y.unwatch(o))},x=e=>{if(f){X.info({text:`看门狗已关闭,忽略变更事件: ${Q(t,e)}`});return}if(p){m=e;return}d&&clearTimeout(d),d=setTimeout(async()=>{if(!f){d=null,p=!0,X.info({text:`检测到 ${Q(t,e)},正在重启整个服务...`});try{await i(e),X.done({text:`服务已重启,原因: ${Q(t,e)}`})}catch(n){let r=n instanceof Error?n.message:String(n);X.error({text:`重启失败 (${Q(t,e)}): ${r}`})}finally{try{await b()}catch(e){if(f)return;let t=e instanceof Error?e.message:String(e);X.warning({text:`刷新监听目标失败: ${t}`})}if(p=!1,f){m&&X.info({text:`看门狗已关闭,丢弃挂起重启: ${Q(t,m)}`}),m=null;return}if(m){let e=m;m=null,x(e)}}}},a)},S=(e,n)=>{let r=Z(t,n);h.has(r)&&x({file:r,event:e})};return y.on(`change`,e=>S(`change`,e)),y.on(`add`,e=>S(`add`,e)),y.on(`unlink`,e=>S(`unlink`,e)),y.on(`ready`,()=>{X.info({text:`看门狗已就绪,正在监听配置文件和环境变量变更...`})}),y.on(`error`,e=>{let t=e instanceof Error?e.message:String(e);X.error({text:`看门狗监听异常: ${t}`})}),X.info({text:`看门狗已启动,正在初始化监听目标...`}),b().catch(e=>{if(f)return;let t=e instanceof Error?e.message:String(e);X.warning({text:`初始化监听目标失败: ${t}`})}),{close:async()=>{f=!0,m=null,await y.close(),d&&=(clearTimeout(d),null)}}}function Z(e,t){return s(t)?t:u(e,t)}function Q(e,t){return`${l(e,t.file)||t.file} (${t.event})`}async function $(e){let t=await Fe(e),n=Pt(t.options.platform,{context:t.context}),r=await n.resolvePreConfig(t),i={...t,userConfig:r.userConfig},a=At({bundler:i.userConfig?.bundler??`rspack`,loadContextModule:i.loadContextModule,resolveContextModule:i.resolveContextModule});await n.compile(a,{command:i.command,preConfig:r,compileContext:i})}async function Vt(e){if(e.command!==B.SERVER)return $(e);let t=e.context??process.cwd(),n=Y();await $(e);let r=Bt({context:t,configFile:e.configFile,mode:e.options.mode,onRestart:async()=>{try{await yt()}catch(e){let t=e instanceof Error?e.message:String(e);n.error({text:`清理失败,中止本次重启: ${t}`});return}await $(e)}}),i=()=>{r.close()};process.once(`SIGINT`,i),process.once(`SIGTERM`,i)}export{me as S,Ge as _,Pt as a,Fe as b,At as c,wt as d,xt as f,Xe as g,yt as h,Y as i,kt as l,G as m,Vt as n,Nt as o,Ct as p,Bt as r,q as s,$ as t,Tt as u,Ke as v,O as x,B as y};
package/dist/index.d.mts CHANGED
@@ -1,7 +1,8 @@
1
- import * as _rspack_core0 from "@rspack/core";
1
+ import * as _$_rspack_core0 from "@rspack/core";
2
2
  import { Configuration, DefinePluginOptions, LightningcssLoaderOptions, Loader, ModuleFederationPluginOptions, Plugin, RuleSetRule, WatchOptions, rspack } from "@rspack/core";
3
- import * as _rspack_dev_server0 from "@rspack/dev-server";
4
- import * as https from "https";
3
+ import * as _$_rspack_dev_server0 from "@rspack/dev-server";
4
+ import chokidar from "chokidar";
5
+ import * as _$https from "https";
5
6
 
6
7
  //#region src/types/env.d.ts
7
8
  interface ImportMetaBaseEnv {
@@ -26,6 +27,12 @@ interface CssLoaderOptions {
26
27
  stylus?: Record<string, unknown>;
27
28
  }
28
29
  //#endregion
30
+ //#region src/node/plugins/pre-warnings-plugin.d.ts
31
+ type PreWarning = {
32
+ source: string;
33
+ message: string;
34
+ };
35
+ //#endregion
29
36
  //#region src/node/bundler/rspack/loader-plugin-helper.d.ts
30
37
  type ListItemType = RuleSetRule | Plugin;
31
38
  type RspackExperiments = {
@@ -41,24 +48,20 @@ declare class BaseCreate<T extends ListItemType> {
41
48
  protected env: 'development' | 'none' | 'production';
42
49
  protected mode: string;
43
50
  protected isDev: boolean;
51
+ protected context: string;
44
52
  constructor({
45
53
  env,
46
- mode
54
+ mode,
55
+ context
47
56
  }: {
48
57
  env: 'development' | 'none' | 'production';
49
58
  mode?: string;
59
+ context?: string;
50
60
  });
51
61
  add(item: T | T[] | undefined): this;
52
62
  end(): T[];
53
63
  }
54
64
  declare class CreateLoader extends BaseCreate<RuleSetRule> {
55
- constructor({
56
- env,
57
- mode
58
- }: {
59
- env: 'development' | 'none' | 'production';
60
- mode?: string;
61
- });
62
65
  private defaultScriptLoader;
63
66
  private defaultResourceLoader;
64
67
  useDefaultCssLoader(options?: CssLoaderOptions): this;
@@ -66,13 +69,6 @@ declare class CreateLoader extends BaseCreate<RuleSetRule> {
66
69
  useDefaultResourceLoader(): this;
67
70
  }
68
71
  declare class CreatePlugins extends BaseCreate<Plugin> {
69
- constructor({
70
- env,
71
- mode
72
- }: {
73
- env: 'development' | 'none' | 'production';
74
- mode?: string;
75
- });
76
72
  useDefaultEnvPlugin(otherEnv?: OtherEnv): this;
77
73
  useCopyPlugin(): this;
78
74
  useHtmlPlugin(templatePath?: string): this;
@@ -81,7 +77,7 @@ type Pages = {
81
77
  [key: string]: {
82
78
  html: string;
83
79
  entry: string;
84
- library?: _rspack_core0.LibraryOptions;
80
+ library?: _$_rspack_core0.LibraryOptions;
85
81
  options?: {
86
82
  title: string;
87
83
  inject: boolean;
@@ -139,10 +135,12 @@ interface CreateConfigParams {
139
135
  isVue: boolean;
140
136
  isReact: boolean;
141
137
  resolveContext: (...paths: string[]) => string;
138
+ preWarnings?: PreWarning[];
142
139
  }
143
140
  interface BundlerDevOptions {
144
141
  port?: number;
145
142
  onBuildStatus?: (status: BuildStatus) => void;
143
+ registerCleanup?: (cleanup: () => Promise<void> | void) => void;
146
144
  }
147
145
  interface BundlerBuildOptions {
148
146
  onBuildStatus?: (status: BuildStatus) => void;
@@ -202,6 +200,8 @@ interface CompileContext {
202
200
  readonly configFile?: string;
203
201
  /** 构建状态回调 */
204
202
  onBuildStatus?: (status: BuildStatus) => void;
203
+ /** 编译器创建前收集的警告,会通过 PreWarningsPlugin 注入 rspack logger */
204
+ readonly preWarnings: PreWarning[];
205
205
  }
206
206
  /**
207
207
  * 创建编译上下文
@@ -236,6 +236,63 @@ interface CdnPluginOptions {
236
236
  //#endregion
237
237
  //#region src/node/config/user-config.d.ts
238
238
  type Bundler = 'rspack' | 'vite';
239
+ /**
240
+ * 库模式输出格式
241
+ * - 'es': ESM (import/export)
242
+ * - 'cjs': CommonJS (module.exports)
243
+ * - 'umd': Universal Module Definition
244
+ * - 'iife': Immediately Invoked Function Expression
245
+ */
246
+ type LibraryFormat = 'es' | 'cjs' | 'umd' | 'iife';
247
+ /**
248
+ * 库模式配置(仅在 build 时生效)
249
+ *
250
+ * 启用后 ikaros 将以库模式构建,而非应用模式。
251
+ * 统一适配 Vite build.lib 与 Rspack output.library,
252
+ * 切换 bundler 时无需修改配置。
253
+ *
254
+ * @see Vite https://cn.vitejs.dev/guide/build#library-mode
255
+ * @see Rspack https://rspack.rs/zh/config/output#outputlibrary
256
+ */
257
+ interface LibraryConfig {
258
+ /**
259
+ * 库入口文件路径(相对于项目根目录)
260
+ * @example 'src/index.ts'
261
+ * @example ['src/index.ts']
262
+ * @example { main: 'src/index.ts', utils: 'src/utils.ts' }
263
+ */
264
+ entry: string | string[] | Record<string, string>;
265
+ /**
266
+ * 库的全局变量名(UMD/IIFE 格式必须指定)
267
+ * @example 'MyLib'
268
+ */
269
+ name?: string;
270
+ /**
271
+ * 输出格式
272
+ * - 单入口默认: ['es', 'umd']
273
+ * - 多入口默认: ['es', 'cjs']
274
+ */
275
+ formats?: LibraryFormat[];
276
+ /**
277
+ * 输出文件名(不含扩展名),可以是固定字符串或函数
278
+ * @default 基于 package.json 的 name 字段
279
+ */
280
+ fileName?: string | ((format: LibraryFormat, entryName: string) => string);
281
+ /**
282
+ * CSS 输出文件名
283
+ */
284
+ cssFileName?: string;
285
+ /**
286
+ * 不打包的外部依赖
287
+ * @example ['vue', 'react', /^@shared\//]
288
+ */
289
+ externals?: (string | RegExp)[];
290
+ /**
291
+ * UMD/IIFE 格式下外部依赖的全局变量映射
292
+ * @example { vue: 'Vue', react: 'React' }
293
+ */
294
+ globals?: Record<string, string>;
295
+ }
239
296
  interface ElectronConfig {
240
297
  main?: {
241
298
  entry?: string;
@@ -273,6 +330,11 @@ interface UserConfig {
273
330
  * @default 'rspack'
274
331
  */
275
332
  bundler?: Bundler;
333
+ /**
334
+ * 静默模式,抑制非关键警告(如缺少 env 文件、页面配置等)
335
+ * @default false
336
+ */
337
+ quiet?: boolean;
276
338
  /**
277
339
  * 编译的平台,该值影响底层优化逻辑
278
340
  * @default 'pc'
@@ -358,13 +420,13 @@ interface UserConfig {
358
420
  * - vite 模式:同 Vite server.proxy
359
421
  * @default undefined
360
422
  */
361
- proxy?: _rspack_dev_server0.Configuration['proxy'] | Record<string, string | Record<string, unknown>>;
423
+ proxy?: _$_rspack_dev_server0.Configuration['proxy'];
362
424
  /**
363
425
  * https
364
426
  * @see {@link https://webpack.js.org/configuration/dev-server/#devserverhttps}
365
427
  * @default false
366
428
  */
367
- https?: boolean | https.ServerOptions;
429
+ https?: boolean | _$https.ServerOptions;
368
430
  };
369
431
  /**
370
432
  * css loader 配置
@@ -435,6 +497,26 @@ interface UserConfig {
435
497
  */
436
498
  extensions?: string[];
437
499
  };
500
+ /**
501
+ * 库模式配置(仅在 build 时生效)
502
+ *
503
+ * 启用后 ikaros 将以库模式构建,而非应用模式。
504
+ * 同一份配置在 rspack / vite 之间无缝切换。
505
+ *
506
+ * @example
507
+ * ```ts
508
+ * library: {
509
+ * entry: 'src/index.ts',
510
+ * name: 'MyLib',
511
+ * formats: ['es', 'umd'],
512
+ * externals: ['vue'],
513
+ * globals: { vue: 'Vue' },
514
+ * }
515
+ * ```
516
+ * @see https://cn.vitejs.dev/guide/build#library-mode
517
+ * @see https://rspack.rs/zh/config/output#outputlibrary
518
+ */
519
+ library?: LibraryConfig;
438
520
  /**
439
521
  * Electron应用配置
440
522
  * @default undefined
@@ -463,6 +545,14 @@ declare const defineConfig: (config: UserConfigWebExport) => UserConfigWebExport
463
545
  * 5. platform.compile — 通过平台适配器执行编译
464
546
  */
465
547
  declare function runCompile(params: CompileServeParams): Promise<void>;
548
+ /**
549
+ * 带看门狗的编译管线
550
+ *
551
+ * 在 dev 模式下自动监听 env/ 目录和配置文件变更,
552
+ * 变更时自动清理资源并重新执行完整编译流程。
553
+ * build 模式下直接委托给 runCompile(),不启用看门狗。
554
+ */
555
+ declare function runCompileWithWatchdog(params: CompileServeParams): Promise<void>;
466
556
  //#endregion
467
557
  //#region src/node/platform/types.d.ts
468
558
  /**
@@ -519,6 +609,9 @@ interface PlatformCompileParams {
519
609
  }
520
610
  //#endregion
521
611
  //#region src/node/platform/platform-factory.d.ts
612
+ interface CreatePlatformAdapterOptions {
613
+ context?: string;
614
+ }
522
615
  /**
523
616
  * 根据平台类型创建平台适配器实例
524
617
  *
@@ -526,7 +619,7 @@ interface PlatformCompileParams {
526
619
  * - 'web': 直接实例化内部的 WebPlatformAdapter
527
620
  * - 'desktopClient': 懒加载 @ikaros-cli/ikaros-platform-desktop-client 包
528
621
  */
529
- declare function createPlatformAdapter(platform: string): PlatformAdapter;
622
+ declare function createPlatformAdapter(platform: string, options?: CreatePlatformAdapterOptions): PlatformAdapter;
530
623
  //#endregion
531
624
  //#region src/node/platform/web/web-platform.d.ts
532
625
  /**
@@ -560,15 +653,13 @@ type ResolveWebPreConfigParams = {
560
653
  getUserConfig: () => Promise<UserConfig | undefined>;
561
654
  isElectron?: boolean;
562
655
  };
563
- declare const resolveWebPreConfig: (params: ResolveWebPreConfigParams) => Promise<WebPreConfig>;
656
+ declare function resolveWebPreConfig(params: ResolveWebPreConfigParams): Promise<WebPreConfig>;
564
657
  //#endregion
565
658
  //#region src/node/shared/logger.d.ts
566
659
  /**
567
660
  * 日志系统
568
661
  *
569
- * 每次调用返回同一组方法,事件数组内聚在闭包内,避免模块级可变状态。
570
- * 注意:多次调用 LoggerSystem() 会创建独立的事件数组。
571
- * 如需共享状态,请在模块级缓存调用结果。
662
+ * 提供统一的格式化日志输出方法。
572
663
  */
573
664
  declare const LoggerSystem: () => {
574
665
  done: ({
@@ -606,38 +697,69 @@ declare const LoggerSystem: () => {
606
697
  text: string;
607
698
  onlyText?: boolean;
608
699
  }) => string | undefined;
609
- emitEvent: (event: string) => void;
610
- clearEventArray: () => void;
611
- eventArray: string[];
612
700
  };
613
701
  //#endregion
614
- //#region src/node/shared/check-env.d.ts
702
+ //#region src/node/watchdog/watchdog.d.ts
703
+ type WatchdogEvent = 'add' | 'change' | 'unlink';
704
+ type ChokidarWatchOptions = Parameters<typeof chokidar.watch>[1];
705
+ type WatchdogRestartReason = {
706
+ file: string;
707
+ event: WatchdogEvent;
708
+ };
709
+ type WatchdogOptions = {
710
+ /** 项目根目录 */context: string; /** 自定义配置文件路径 */
711
+ configFile?: string; /** 当前 mode,用于推导实际生效的 env 文件 */
712
+ mode?: string; /** 变更后触发的重启回调 */
713
+ onRestart: (reason: WatchdogRestartReason) => Promise<void>; /** 防抖延迟(毫秒),默认 1000 */
714
+ debounceMs?: number; /** chokidar 监听选项 */
715
+ watchOptions?: ChokidarWatchOptions;
716
+ };
717
+ type WatchdogInstance = {
718
+ /** 关闭看门狗,停止文件监听 */close: () => Promise<void>;
719
+ };
615
720
  /**
616
- * 断言 Node.js 版本满足最低要求
721
+ * 创建看门狗实例
617
722
  *
618
- * @param minMajor - 最低的主版本号
619
- * @throws Node.js 版本低于要求时终止进程
723
+ * 监听:
724
+ * - 项目根目录下的 ikaros.config.{ts,mjs,json,yaml}
725
+ * - env/ 目录中的所有 .env 文件
726
+ *
727
+ * 当上述文件发生变更时,执行 onRestart 回调(清理资源 → 重新编译)。
620
728
  */
621
- declare function assertNodeVersion(minMajor: number): void;
729
+ declare function createWatchdog(options: WatchdogOptions): WatchdogInstance;
730
+ //#endregion
731
+ //#region src/node/watchdog/cleanup-registry.d.ts
732
+ type CleanupFn = () => Promise<void> | void;
622
733
  /**
623
- * 检查 Node.js 版本是否满足最低要求(不终止进程,抛出错误)
734
+ * 注册一个清理函数
624
735
  *
625
- * @param minMajor - 最低的主版本号
626
- * @throws Error 当 Node.js 版本低于要求时
736
+ * 当看门狗触发重启时,所有注册的清理函数会先被执行。
627
737
  */
628
- declare function checkNodeVersion(minMajor: number): void;
738
+ declare function registerCleanup(fn: CleanupFn): void;
739
+ /**
740
+ * 执行并清空所有已注册的清理函数
741
+ *
742
+ * 使用 Promise.allSettled 确保所有清理函数都有机会执行,
743
+ * 即使其中某个抛出异常也不影响其他清理函数。
744
+ * 如果存在失败的清理函数,会抛出聚合错误。
745
+ */
746
+ declare function runCleanups(): Promise<void>;
629
747
  //#endregion
630
748
  //#region src/node/bundler/rspack/rspack-runner.d.ts
631
- type BuildStatus$1 = {
632
- success: boolean;
633
- port?: number;
634
- message?: string;
635
- };
636
749
  type WatchRspackBuildOptions = WatchOptions & {
637
- onBuildStatus?: (status: BuildStatus$1) => void;
750
+ onBuildStatus?: (status: BuildStatus) => void;
638
751
  };
639
- declare const runRspackBuild: (config: Configuration | Configuration[], options?: WatchRspackBuildOptions) => Promise<string | undefined>;
640
- declare const watchRspackBuild: (config: Configuration | Configuration[], options?: WatchRspackBuildOptions) => Promise<string | undefined>;
752
+ declare function runRspackBuild(config: Configuration | Configuration[], options?: WatchRspackBuildOptions): Promise<string | undefined>;
753
+ declare function watchRspackBuild(config: Configuration | Configuration[], options?: WatchRspackBuildOptions): Promise<string | undefined>;
754
+ //#endregion
755
+ //#region src/node/shared/check-env.d.ts
756
+ /**
757
+ * 断言 Node.js 版本满足最低要求
758
+ *
759
+ * @param minMajor - 最低的主版本号
760
+ * @throws 当 Node.js 版本低于要求时终止进程
761
+ */
762
+ declare function assertNodeVersion(minMajor: number): void;
641
763
  //#endregion
642
764
  //#region src/node/shared/constants.d.ts
643
765
  declare const extensions: string[];
@@ -653,6 +775,8 @@ interface CreateBundlerAdapterParams {
653
775
  bundler: 'rspack' | 'vite';
654
776
  /** 基于工作目录加载模块的能力(ViteAdapterLoader 需要) */
655
777
  loadContextModule: <T>(id: string) => T;
778
+ /** 基于工作目录解析模块路径的能力(用于区分缺依赖与加载失败) */
779
+ resolveContextModule: (id: string) => string | undefined;
656
780
  }
657
781
  /**
658
782
  * 根据 bundler 类型创建编译器适配器实例
@@ -666,13 +790,14 @@ declare function createBundlerAdapter(params: CreateBundlerAdapterParams): Bundl
666
790
  /**
667
791
  * Rspack 编译器适配器
668
792
  *
669
- * 实现 BundlerAdapter<Configuration>,将现有 rspack 相关逻辑封装为统一接口
793
+ * 实现 BundlerAdapter<Configuration | Configuration[]>,将现有 rspack 相关逻辑封装为统一接口。
794
+ * 库模式下 createConfig 可能返回 Configuration[](多格式构建)。
670
795
  */
671
- declare class RspackAdapter implements BundlerAdapter<Configuration> {
796
+ declare class RspackAdapter implements BundlerAdapter<Configuration | Configuration[]> {
672
797
  readonly name: "rspack";
673
- createConfig(params: CreateConfigParams): Configuration;
674
- runDev(config: Configuration, options: BundlerDevOptions): Promise<void>;
675
- runBuild(config: Configuration, options: BundlerBuildOptions): Promise<string | undefined>;
798
+ createConfig(params: CreateConfigParams): Configuration | Configuration[];
799
+ runDev(config: Configuration | Configuration[], options: BundlerDevOptions): Promise<void>;
800
+ runBuild(config: Configuration | Configuration[], options: BundlerBuildOptions): Promise<string | undefined>;
676
801
  }
677
802
  //#endregion
678
803
  //#region src/node/bundler/vite/vite-adapter-loader.d.ts
@@ -688,8 +813,10 @@ declare class ViteAdapterLoader implements BundlerAdapter<unknown> {
688
813
  readonly name: "vite";
689
814
  private adapter;
690
815
  private readonly loadContextModule;
816
+ private readonly resolveContextModule;
691
817
  constructor(params: {
692
818
  loadContextModule: <T>(id: string) => T;
819
+ resolveContextModule: (id: string) => string | undefined;
693
820
  });
694
821
  private ensureAdapter;
695
822
  createConfig(params: CreateConfigParams): unknown | Promise<unknown>;
@@ -697,4 +824,4 @@ declare class ViteAdapterLoader implements BundlerAdapter<unknown> {
697
824
  runBuild(config: unknown, options: BundlerBuildOptions): Promise<string | undefined>;
698
825
  }
699
826
  //#endregion
700
- export { type BuildStatus, Bundler, type BundlerAdapter, type BundlerBuildOptions, type BundlerDevOptions, Command, type CompileContext, type CompileOptions, type CompileServeParams, ConfigEnvPre, type CreateBundlerAdapterParams, type CreateConfigParams, CreateLoader, CreatePlugins, ElectronConfig, LoggerSystem, ModuleFederationOptions, type PackageJson, type PlatformAdapter, type PlatformCompileParams, type PlatformPreConfig, type ResolveWebPreConfigParams, RspackAdapter, UserConfig, UserConfigFn, UserConfigWebExport, ViteAdapterLoader, WebPlatformAdapter, type WebPreConfig, assertNodeVersion, checkNodeVersion, createBundlerAdapter, createCompileContext, createPlatformAdapter, defineConfig, extensions, resolveCLI, resolveWebPreConfig, runCompile, runRspackBuild, watchRspackBuild };
827
+ export { type BuildStatus, Bundler, type BundlerAdapter, type BundlerBuildOptions, type BundlerDevOptions, Command, type CompileContext, type CompileOptions, type CompileServeParams, ConfigEnvPre, type CreateBundlerAdapterParams, type CreateConfigParams, CreateLoader, CreatePlugins, ElectronConfig, LibraryConfig, LibraryFormat, LoggerSystem, ModuleFederationOptions, type PackageJson, type PlatformAdapter, type PlatformCompileParams, type PlatformPreConfig, type ResolveWebPreConfigParams, RspackAdapter, UserConfig, UserConfigFn, UserConfigWebExport, ViteAdapterLoader, type WatchdogInstance, type WatchdogOptions, WebPlatformAdapter, type WebPreConfig, assertNodeVersion, createBundlerAdapter, createCompileContext, createPlatformAdapter, createWatchdog, defineConfig, extensions, registerCleanup, resolveCLI, resolveWebPreConfig, runCleanups, runCompile, runCompileWithWatchdog, runRspackBuild, watchRspackBuild };
package/dist/index.mjs CHANGED
@@ -1,10 +1 @@
1
- import{createRequire as e}from"node:module";import{Option as t,program as n}from"commander";import{rspack as r}from"@rspack/core";import{isFunction as i,isString as a}from"es-toolkit";import o,{dirname as s,extname as c,join as l,resolve as u}from"node:path";import d,{join as f}from"path";import p,{pathToFileURL as m}from"node:url";import{isArray as h,isEmpty as g,isObject as _}from"es-toolkit/compat";import v from"chalk";import y from"fs/promises";import b from"node:os";import x from"pretty-bytes";import S from"easy-table";import C from"cli-cursor";import w from"node:process";import{RsdoctorRspackPlugin as T}from"@rsdoctor/rspack-plugin";import ee from"compression-webpack-plugin";import{ModuleFederationPlugin as E}from"@module-federation/enhanced/rspack";import te from"node:fs";import D,{readFile as ne}from"node:fs/promises";import{z as O}from"zod/v4";import k from"fs-extra";import{config as re}from"dotenv";import{parse as ie}from"yaml";import{transform as ae}from"oxc-transform";import{RspackDevServer as oe}from"@rspack/dev-server";import{detect as se}from"detect-port";var ce=`@ikaros-cli/ikaros`,A=`2.2.1`;const j=f(process.cwd(),`./`),M=[`...`,`.mjs`,`.jsx`,`.ts`,`.tsx`];f(j,`tsconfig.json`);const N=p.fileURLToPath(new p.URL(`../`,import.meta.url)),le=e(N),P=(...e)=>f(N,...e),F=(e,t)=>({loader:e.includes(`builtin`)?e:le.resolve(e),options:t}),ue=(e,t)=>{let{lightningcss:n,sourceMap:r}=t??{},i=F(`builtin:lightningcss-loader`,{...n}),a=(e,n)=>{let a=[i],o=t&&t[`${e}`];return e&&e!==`css`&&a.push(F(`${e}-loader`,Object.assign(o??{},n,{sourceMap:r}))),a};return{less:a(`less`),sass:a(`sass`,{sassOptions:{indentedSyntax:!0,api:`modern-compiler`}}),scss:a(`sass`,{sassOptions:{api:`modern-compiler`}}),stylus:a(`stylus`),styl:a(`stylus`),css:a(`css`)}},de=(e,t)=>{let n=ue(e,t);return Object.entries(n).map(([e,t])=>({test:RegExp(`\\.${e}$`),use:t,type:`css/auto`}))},fe={DONE:v.bgGreen.white,ERROR:v.bgRed.white,OKAY:v.bgBlue.white,WARNING:v.bgYellow.white,INFO:v.bgCyan.white},pe=(e,t)=>fe[e](` ${e} `)+` ${t}`,I=(e,t)=>({text:n,onlyText:r})=>{let i=pe(e,n);if(r)return i;t(i)},L=(()=>{let e=[],t={done:I(`DONE`,console.log),error:I(`ERROR`,console.error),okay:I(`OKAY`,console.log),warning:I(`WARNING`,console.warn),info:I(`INFO`,console.info),emitEvent:t=>{let n=new Date().toLocaleTimeString(`en-US`,{hour12:!1}).split(` `)[0];e.push(`[${n}] ${t}`)},clearEventArray:()=>{e.length=0},eventArray:e};return()=>t})(),R=(e,t)=>{let n=e,r=t;for(let e of Object.keys(r)){let t=r[e],i=n[e];_(t)&&_(i)?n[e]=R(i,t):n[e]=t}return e};async function z(e,t=process.cwd()){try{let n=f(t,`node_modules`,e);return await y.access(n,y.constants.F_OK),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}var B=class{constructor({env:e=`development`,mode:t=``}){this.list=[],this.env=`development`,this.mode=``,this.isDev=!0,this.env=e,this.mode=t,this.isDev=e===`development`}add(e){return e&&(h(e)?this.list=this.list.concat(e):this.list.push(e)),this}end(){return this.list}},V=class extends B{constructor({env:e=`development`,mode:t=``}){super({env:e,mode:t}),this.defaultScriptLoader=e=>[{test:/\.m?ts$/i,loader:`builtin:swc-loader`,options:{jsc:{parser:{syntax:`typescript`}}},type:`javascript/auto`,exclude:[f(j,`node_modules`)]},{test:/\.m?js$/i,loader:`builtin:swc-loader`,options:{isModule:`unknown`,rspackExperiments:e},type:`javascript/auto`,exclude:[f(j,`node_modules`)]}],this.defaultResourceLoader=[{test:/\.(png|jpe?g|gif|svg|ico)(\?.*)?$/,type:`asset/resource`,generator:{filename:this.isDev?`[id][ext]`:`assets/img/[contenthash][ext]`}},{test:/\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,type:`asset/resource`,generator:{filename:this.isDev?`[id][ext]`:`assets/media/[contenthash][ext]`}},{test:/\.(woff2?|eot|ttf|otf)(\?.*)?$/,type:`asset/resource`,generator:{filename:this.isDev?`[id][ext]`:`assets/fonts/[contenthash][ext]`}}]}useDefaultCssLoader(e){return de(this.env,e).forEach(e=>this.add(e)),this}useDefaultScriptLoader(e){return this.add(this.defaultScriptLoader(e)),this}useDefaultResourceLoader(){return this.defaultResourceLoader.forEach(e=>this.add(e)),this}},H=class extends B{constructor({env:e=`development`,mode:t=``}){super({env:e,mode:t})}useDefaultEnvPlugin(e){let{frameworkEnv:t={},extEnv:n={},env:r={}}=e??{};return this.add(he({frameworkEnv:t,extEnv:n,env:r})),this}useCopyPlugin(){return this.env===`production`&&this.add(new r.CopyRspackPlugin({patterns:[{context:f(j,`public`),from:`./`,noErrorOnMissing:!0,globOptions:{ignore:[`**/index.html`,`.*`]}}]})),this}useHtmlPlugin(e){return this.add(new r.HtmlRspackPlugin({template:e??f(j,`index.html`)})),this}},me=class{constructor({pages:e,enablePages:t}){this.pages=e,this.enablePages=t,this.getEnablePages()}create(){let e={},t=[];return Object.keys(this.pages).forEach(n=>{e[n]={import:this.pages[n].entry,library:this.pages[n].library},t.push(new r.HtmlRspackPlugin({template:this.pages[n].html,filename:`${n}.html`,chunks:[n],scriptLoading:`blocking`,...this.pages[n].options}))}),{entry:e,plugins:t}}getEnablePages(){let{warning:e,emitEvent:t}=L();if(!g(this.pages)&&h(this.enablePages)){let n={},r=[];if(this.enablePages.forEach(e=>{this.pages[e]?n[e]=this.pages[e]:r.push(e)}),g(r)&&t(e({text:`当前设置页面${r.join()}不存在`,onlyText:!0})),g(n))return;this.pages=n}}};const he=({frameworkEnv:e={},extEnv:t={},env:n={}})=>{let i=Object.assign({},R(t,n)),a=Object.fromEntries(Object.entries(i).map(([e,t])=>[`import.meta.env.${e}`,JSON.stringify(t)])),o=Object.fromEntries(Object.entries({...a,...e}).map(([e,t])=>[e,t]));return new r.DefinePlugin(o)},U={name:ce,version:A},W=`@rspack/ikaros-stats-plugin`,G=v.hex(`#222222`);var ge=class{constructor(e){this.startCompileHrtime=void 0,this.userConfig=e}apply(e){this.compiler=e,this.isDev=e.options.mode===`development`,new r.ProgressPlugin().apply(e),C.hide(),this.isDev?this.initDevHook():this.initProdHook()}updateStartCompileTime(){this.startCompileHrtime=w.hrtime()}getCurrentEndCompileTime(){let e=w.hrtime(this.startCompileHrtime);return(e[0]*1e9+e[1])/1e6}getError(e){let{errors:t,errorsCount:n=0}=e;if(!(!t||n===0))return t.map(e=>`${G.bgRed(` ERROR `)} ${e.message.trim()}`).join(`
2
-
3
- `)}getWarn(e){let{warnings:t,warningsCount:n=0}=e;if(!(!t||n===0))return t.map(e=>`${G.bgYellow(` WARN `)} ${e.message.trim()}`).join(`
4
-
5
- `)}getEndTips(e,t){let{gray:n,cyan:r,red:i,green:a,yellow:o}=v,{errorsCount:s=-1,warningsCount:c=-1}=e,l=(t/1e3).toFixed(2);return n(s>0?`${r(U.name)} compiled with${i(` ${s} error`)}`:c>0?`compile ${a(`success`)} and with ${o(`${c} warning`)}, time: ${l}s`:`compile ${a(`success`)}, time: ${l}s.`)}getTableInfo(e){let{assets:t}=e;if(!t||t.length===0)return;let n=new S,r=this.userConfig?.build?.gzip??!1,i=0,a=0,o=!1;for(let e=0;e<t.length;e++){let{name:s,size:c,related:l,info:u}=t[e];if(u.development)continue;let d=r&&h(l)?l.find(e=>e.type===`gzipped`).size:0;if(i+=c,a+=d,t.length>20&&e>=4&&e<t.length-1-4){o||(o=!0,n.cell(`name`,`....`),n.cell(`size`,`....`),r&&n.cell(`gzip`,`....`),n.newRow());continue}n.cell(`name`,s),n.cell(`size`,x(c)),r&&n.cell(`gzip`,x(d)),n.newRow()}return n.pushDelimeter(),n.cell(`name`,`There are ${t.length} files`),n.cell(`size`,x(i)),r&&n.cell(`gzip`,x(a)),n.newRow(),v.cyan.dim(n.toString().trim())}getHostList(){let{userConfig:e,compiler:t}=this,{devServer:n}=t.options,r=n?.server===`https`||typeof n?.server==`object`,i=Number(n?.port),a=[],s=``,c=Object.values(b.networkInterfaces());if(e){s=e.build?.base??``,(!s||s===`auto`)&&(s=`/`);let t=Object.keys(e?.pages||{})[0];t&&t!==`index`?s=o.join(s,`${t}.html`):s.endsWith(`/`)||(s+=`/`)}for(let e of c){let{address:t}=e?.find(e=>e.family===`IPv4`)||{};t&&a.push(t)}a.sort((e,t)=>{let n=e.split(`.`),r=t.split(`.`);for(let[t]of n.entries())if(e[t]!==r[t])return Number(r[t])-Number(e[t]);return 0});let l=a.indexOf(`127.0.0.1`);return l!==-1&&(a.splice(l,1),a.unshift(`localhost`)),a=a.map(e=>(r?(e=`https://${e}`,i!==443&&(e=e+`:`+i)):(e=`http://`+e,i!==80&&(e=e+`:`+i)),new URL(s,e).href)),a}initDevHook(){let{compiler:e}=this,t=this.getHostList(),{blue:n,cyan:r,gray:i}=v;e.hooks.environment.intercept({name:W}),e.hooks.watchRun.intercept({name:W,call:()=>{this.updateStartCompileTime()}}),e.hooks.done.intercept({name:W,call:e=>{console.clear();let a=e.toJson({preset:`errors-warnings`,colors:!0}),{eventArray:o}=L(),{errorsCount:s=0,warningsCount:c=0}=a;if(s>0)console.log(this.getError(a)),console.log();else{c>0&&(console.log(this.getWarn(a)),console.log()),o.length>0&&(console.log(o.map(e=>e).join(`
6
- `)),console.log());let{name:e,version:s}=U,l=`${r(`${e} v${s}`)} entry address:\n\n`;for(let e of t)l+=n(` ${e}\n`);console.log(i(l))}console.log(this.getEndTips(a,this.getCurrentEndCompileTime())),console.log()}})}initProdHook(){let{compiler:e}=this,t;e.hooks.environment.intercept({name:W,call:()=>{console.log(v.gray(`start build...`)),this.updateStartCompileTime()}}),e.hooks.done.intercept({name:W,call:e=>{t=e.toJson({preset:`normal`,colors:!0,assetsSort:`size`})}}),e.cache.hooks.shutdown.intercept({name:W,done:()=>{let{errorsCount:e=0,warningsCount:n=0}=t;console.log(),e>0?(console.log(this.getError(t)),console.log()):(n>0&&(console.log(this.getWarn(t)),console.log()),console.log(this.getTableInfo(t)),console.log()),console.log(this.getEndTips(t,this.getCurrentEndCompileTime()))}})}};const K=`@rspack/ikaros-cdn-plugin`,_e=/:([a-z]+)/gi;function ve(e){return e.filter(e=>!e.cssOnly).reduce((e,t)=>(e[t.name]=t.var||t.name,e),{})}var ye=class{constructor(e){this.isDev=!1,this.versionCache=new Map,this.options={prodUrl:`https://unpkg.com/:name@:version/:path`,devUrl:`:name/:path`,crossOrigin:!1,...e}}apply(e){this.isDev=e.options.mode===`development`,e.hooks.compilation.tap(K,e=>{r.HtmlRspackPlugin.getCompilationHooks(e).alterAssetTags.tapAsync(K,(e,t)=>{try{this.injectResources(e),t(null,e)}catch(e){t(e)}})})}injectResources(e){let t=this.options.modules,n=[];t.forEach(e=>{this.getStyles(e).forEach(e=>{n.push({tagName:`link`,voidTag:!0,attributes:{rel:`stylesheet`,href:e,...this.options.crossOrigin&&{crossorigin:this.options.crossOrigin}}})})}),t.filter(e=>!e.cssOnly).forEach(e=>{this.getScripts(e).forEach(e=>{n.push({tagName:`script`,voidTag:!0,attributes:{src:e,...this.options.crossOrigin&&{crossorigin:this.options.crossOrigin}}})})}),e.assetTags&&(e.assetTags.styles.unshift(...n.filter(e=>e.tagName===`link`)),e.assetTags.scripts.unshift(...n.filter(e=>e.tagName===`script`)))}getStyles(e){let t=[...e.styles||[]];return e.style&&t.unshift(e.style),t.map(t=>this.generateUrl(e,t))}getScripts(e){let t=[...e.paths||[]];return e.path&&t.unshift(e.path),t.map(t=>this.generateUrl(e,t))}joinUrl(e,t){return e=e.replace(/\/+$/,``),t=t.replace(/^\/+/,``),`${e}/${t}`}generateUrl(e,t){let n=this.isDev?e.devUrl||this.options.devUrl:e.prodUrl||this.options.prodUrl;return n.match(_e)?n.replace(_e,(n,r)=>{switch(r){case`name`:return e.name;case`version`:return e.version||this.getModuleVersion(e.name);case`path`:return t;default:return n}}):this.joinUrl(n,t)}getModuleVersion(t){let n=this.versionCache.get(t);if(n)return n;try{let n=e(d.join(process.cwd(),`node_modules`))(d.join(t,`package.json`)).version;return this.versionCache.set(t,n),n}catch{return console.warn(v.yellow(`[${K}] 无法获取模块 "${t}" 的版本信息`)),`latest`}}},be=class{constructor(e){this.options=e}createSourceMapPlugin(){let{isDev:e,userConfig:t}=this.options;if(e)return new r.EvalSourceMapDevToolPlugin({columns:!1,module:!0});if(t?.build?.sourceMap??!1)return new r.SourceMapDevToolPlugin({test:[/.js/,/.mjs/],filename:`[file].map[query]`})}createCssExtractPlugin(){if(!this.options.isDev)return new r.CssExtractRspackPlugin({filename:this.joinAssetsDir(`assets/css/[contenthash].css`),ignoreOrder:!0})}createDoctorPlugin(){let{isDev:e,userConfig:t}=this.options;if(!(e||!t?.build?.outReport))return new T}createGzipPlugin(){let{isDev:e,userConfig:t}=this.options;if(!(e||!t?.build?.gzip))return new ee}createCdnPlugin(){let{cdnOptions:e}=this.options.userConfig??{};if(!(!e||g(e.modules)))return new ye(e)}createModuleFederationPlugin(){let e=this.options.userConfig?.moduleFederation;if(e)return h(e)?e.map(e=>new E(e)):new E(e)}createDependencyCyclePlugin(){let{isDev:e,userConfig:t}=this.options;if(!(e||!t?.build?.dependencyCycleCheck))return new r.CircularDependencyRspackPlugin({exclude:/node_modules/,failOnError:!1})}joinAssetsDir(...e){return[this.options.assetsDir,...e].join(`/`).replace(/\/+/g,`/`)}};const q={target:O.enum([`pc`,`mobile`]).optional().default(`pc`),pages:O.custom().optional(),enablePages:O.union([O.array(O.string()),O.literal(!1)]).optional(),define:O.custom().optional(),build:O.object({base:O.string().optional().default(`/`),assetsDir:O.string().optional(),sourceMap:O.boolean().optional().default(!1),outDirName:O.string().optional().default(`dist`)}).optional(),resolve:O.object({alias:O.record(O.string(),O.string()).optional(),extensions:O.array(O.string()).optional()}).optional(),server:O.object({port:O.number().int().min(1024).max(65535).optional()}).optional(),electron:O.unknown().optional()},xe=O.object({bundler:O.custom().optional().default(`rspack`).refine(e=>e===`rspack`,{message:`bundler must be 'rspack' for rspack config`}),...q,moduleFederation:O.union([O.custom(),O.array(O.custom())]).optional(),plugins:O.union([O.custom(),O.array(O.custom())]).optional(),loaders:O.array(O.custom()).optional(),experiments:O.custom().optional(),cdnOptions:O.custom().optional(),server:O.object({port:O.number().int().min(1024).max(65535).optional(),proxy:O.custom().optional(),https:O.union([O.boolean(),O.record(O.string(),O.unknown())]).optional().default(!1)}).optional(),css:O.object({lightningcssOptions:O.record(O.string(),O.unknown()).optional(),sourceMap:O.boolean().optional(),lessOptions:O.record(O.string(),O.unknown()).optional(),sassOptions:O.record(O.string(),O.unknown()).optional(),stylusOptions:O.record(O.string(),O.unknown()).optional()}).optional(),build:O.object({base:O.string().optional().default(`/`),assetsDir:O.string().optional(),gzip:O.boolean().optional().default(!1),sourceMap:O.boolean().optional().default(!1),outDirName:O.string().optional().default(`dist`),outReport:O.boolean().optional().default(!1),cache:O.boolean().optional().default(!1),dependencyCycleCheck:O.boolean().optional().default(!1)}).optional()}),Se=O.object({bundler:O.literal(`vite`),...q,server:O.object({port:O.number().int().min(1024).max(65535).optional(),proxy:O.record(O.string(),O.unknown()).optional(),https:O.union([O.boolean(),O.record(O.string(),O.unknown())]).optional()}).optional(),vite:O.object({plugins:O.unknown().optional()}).strict().optional()}).passthrough().superRefine((e,t)=>{for(let n of[`plugins`,`loaders`,`experiments`,`cdnOptions`,`moduleFederation`,`css`]){let r=e;n in r&&r[n]!==void 0&&t.addIssue({code:O.ZodIssueCode.custom,path:[n],message:`bundler='vite' 时不支持 ${String(n)},请使用 vite.plugins 或 Vite 原生配置能力`})}}),J=O.union([Se,xe]),Y=(e,t)=>t?f(e,`env`,`.env.${t}`):f(e,`env`,`.env`),Ce=async(e,t)=>{let{warning:n,emitEvent:r}=L();if(!await k.pathExists(f(e,`env`)))return r(n({text:`env folder not found`,onlyText:!0})),!1;if(t){if(!await k.pathExists(Y(e,t)))return r(n({text:`.env.${t} file not found`,onlyText:!0})),!1}else return await k.pathExists(Y(e))?!0:(r(n({text:`.env file not found`,onlyText:!0})),!1);return!0},we=async(e,t)=>await Ce(e,t)?t?re({path:Y(e,t),quiet:!0}).parsed??{}:re({path:Y(e),quiet:!0}).parsed??{}:{};async function Te(e,t){let{code:n,errors:r}=await ae(e,await ne(e,`utf-8`),{lang:t?`ts`:`js`});if(r.length>0)throw Error(`Transformation failed: `+r.map(e=>e.message).join(`, `));return{code:n}}async function Ee(e,t){let n=`${e}.timestamp-${Date.now()}-${Math.random().toString(16).slice(2)}`,r=`${n}.mjs`,i=`${m(n)}.mjs`;await D.writeFile(r,t);try{return(await import(i)).default}finally{await D.unlink(r)}}async function De(e,t=!1){let{code:n}=await Te(e,t);return Ee(e,n)}const X=new Map;X.set(`.mjs`,async e=>(await import(m(e).href)).default),X.set(`.ts`,async e=>await De(e,!0)),X.set(`.json`,async e=>await k.readJson(e)),X.set(`.yaml`,async e=>ie(await D.readFile(e,`utf8`)));async function Oe({configFile:e,context:t}){let n,r=t??process.cwd(),i=`ikaros.config`,a=[`ts`,`mjs`,`json`,`yaml`].map(e=>`${l(r,i)}.${e}`),o=(await Promise.all(a.map(e=>k.pathExists(e)))).findIndex(Boolean);if(!(o<0)){if(n=c(a[o]),r=u(r,`${i}${n}`),e&&(r=s(e),n=c(e)),!X.has(n))throw Error(`No configuration file ! `);return X.get(n)(r)}}let Z=function(e){return e.SERVER=`server`,e.BUILD=`build`,e}({});async function ke(t){let{command:n,options:r,configFile:i,onBuildStatus:a}=t,o=t.context??process.cwd(),s=e(l(o,`./`)),c=(...e)=>l(o,...e),u=e=>s(e),d=e=>{try{return s.resolve(e)}catch{return}},f=await Ae(c),p=await je(r,o);return{context:o,command:n,options:r,env:p,userConfig:await Me({configFile:i,context:o,options:r,env:p,command:n}),contextPkg:f,resolveContext:c,loadContextModule:u,resolveContextModule:d,contextRequire:s,isElectron:r.platform===`desktopClient`,configFile:i,onBuildStatus:a}}async function Ae(e){let t=e(`package.json`);try{await D.access(t,te.constants.F_OK)}catch{return}return JSON.parse(await D.readFile(t,{encoding:`utf8`}))}async function je(e,t){let{platform:n,mode:r}=e,i={PLATFORM:n,MODE:r},a=await we(t,r);return{...i,...a}}async function Me(e){let{configFile:t,context:n,options:r,env:a,command:o}=e,s=await Oe({configFile:t,context:n});if(s){if(i(s)){let e={mode:r.mode??``,env:{...a,PLATFORM:r.platform,MODE:r.mode??a?.MODE},command:o};return J.parse(await s(e))}if(_(s))return J.parse(s)}}const Ne=e=>{let{isVue:t,isReact:n}=e;return t?{noParse:/^(vue|vue-router|vuex|vuex-router-sync)$/}:n?{noParse:e=>/(react|react-dom|react-is)\.production\.min\.js$/.test(e),env:{REACT_APP_ENABLE_DEVTOOLS:!1}}:{env:void 0,noParse:void 0}},Pe=e=>e===Z.SERVER?{minimize:!1,removeAvailableModules:!1,removeEmptyChunks:!1,splitChunks:!1}:{minimize:!0,minimizer:[new r.LightningCssMinimizerRspackPlugin,new r.SwcJsMinimizerRspackPlugin],splitChunks:{chunks:`all`,minSize:3e4,minChunks:1,maxAsyncRequests:5,maxInitialRequests:3,cacheGroups:{vendor:{test:/[\\/]node_modules[\\/]/,name:`vendors`,priority:10,chunks:`all`},common:{name:`common`,minChunks:2,priority:5,reuseExistingChunk:!0}}}},Fe=e=>{if(e.command!==Z.SERVER&&e.userConfig?.build?.cache)return{cache:!0,experiments:{cache:{type:`persistent`}}}},Ie=e=>{let{userConfig:t,isElectron:n,resolveContext:r}=e,i=t?.build?.outDirName;if(n){let e=t?.electron,n=r(`dist/electron/renderer`);return e?.build?.outDir?l(r(e.build.outDir),`renderer`):n}return a(i)?r(i):r(`dist`)},Q=(e,t)=>[e,t].filter(Boolean).join(`/`).replace(/\/+/g,`/`),Le=e=>{let{command:t,mode:n,env:r,context:i,contextPkg:a,userConfig:o,pages:s,browserslist:c,base:u,port:d,isElectron:f,resolveContext:p}=e,m=t===Z.SERVER,h=m?`development`:`production`,g=new V({env:h,mode:n}),_=new H({env:h,mode:n}),{entry:v,plugins:y}=new me({pages:s,enablePages:o?.enablePages}).create(),{env:b,noParse:x}=Ne({isVue:e.isVue,isReact:e.isReact}),S=g.useDefaultResourceLoader().useDefaultScriptLoader(o?.experiments).useDefaultCssLoader(o?.css).add(o?.loaders).end(),C=o?.build?.assetsDir??``,w=new be({command:t,userConfig:o,isDev:m,assetsDir:C}),T=_.useDefaultEnvPlugin({extEnv:{...o?.define},frameworkEnv:b,env:r}).useCopyPlugin().add(y).add(new ge).add(w.createSourceMapPlugin()).add(w.createCssExtractPlugin()).add(w.createDoctorPlugin()).add(w.createGzipPlugin()).add(w.createCdnPlugin()).add(w.createModuleFederationPlugin()).add(w.createDependencyCyclePlugin()).add(o?.plugins).end();return{mode:h,context:i,entry:v,target:f?`electron-renderer`:[`web`,`es2015`,`browserslist:${c}`],externals:o?.cdnOptions?.modules?ve(o.cdnOptions.modules):void 0,resolve:{alias:{"@":p(`src`),...o?.resolve?.alias},extensions:o?.resolve?.extensions||M,modules:[`node_modules`,p(`node_modules`),P(`node_modules`)]},output:{clean:!m,path:Ie({userConfig:o,isElectron:f,resolveContext:p}),publicPath:f&&!m?`./`:u,filename:m?`[name].js`:Q(C,`assets/js/[contenthash:8].js`),chunkFilename:m?`[name].chunk.js`:Q(C,`assets/js/[contenthash:8].chunk.js`),cssFilename:m?`[name].css`:Q(C,`assets/css/[contenthash:8].css`),cssChunkFilename:m?`[name].chunk.css`:Q(C,`assets/css/[contenthash:8].chunk.css`),chunkLoadingGlobal:`${a?.name||`ikaros`}_chunk`,pathinfo:!1},optimization:Pe(t),stats:`none`,watchOptions:{aggregateTimeout:500,ignored:/node_modules/},module:{rules:S,noParse:x},plugins:T,devServer:{hot:!0,port:d,server:(()=>{let e=o?.server?.https;return e?e===!0?`https`:{type:`https`,options:e}:`http`})(),allowedHosts:`all`,proxy:o?.server?.proxy,historyApiFallback:{rewrites:[{from:/\.(js|css|json|png|jpe?g|gif|svg|ico|woff2?|eot|ttf|otf|mp4|webm|ogg|mp3|wav|flac|aac|map)(\?.*)?$/,to:e=>e.parsedUrl.pathname},{from:RegExp(`^${u}`),to:l(u,`index.html`)}]},headers:{"Access-Control-Allow-Origin":`*`},static:{directory:p(`public`),publicPath:u},client:{logging:`none`,overlay:{errors:!0,warnings:!1,runtimeErrors:!1},webSocketURL:`auto://0.0.0.0:${d}/ws`}},experiments:{css:!0},...Fe({command:t,userConfig:o})}},Re=e=>{let t=`Build failed with errors.
7
- `;return e.toString({chunks:!1,colors:!0}).split(/\r?\n/).forEach(e=>{t+=` ${e}\n`}),t},ze=(e,t)=>{let{onBuildStatus:n}=t??{};return new Promise((t,i)=>{let a=r(e);a.run((e,r)=>{a.close(a=>{let o=e||a;if(o)return n?.({success:!1,message:o.message||`build error`}),i(o);if(r?.hasErrors()){let e=Re(r);return n?.({success:!1,message:e}),i(Error(e))}let s=r?.toString({chunks:!1,colors:!0});return n?.({success:!0,message:s}),t(s)})})})},Be=async(e,t)=>{let{port:n,onBuildStatus:i}=t??{},a=r(e),o=new oe(e.devServer,a);await new Promise((e,t)=>{o.startCallback(r=>r?(i?.({success:!1,port:n,message:r.message}),t(r)):(i?.({success:!0,port:n}),e()))})},Ve=(e,t)=>{let{onBuildStatus:n,...i}=t??{};return new Promise((t,a)=>{r(e).watch({ignored:/node_modules/,aggregateTimeout:300,poll:!1,...i},(e,r)=>{if(e)return n?.({success:!1,message:e.message||`watch build error`}),a(e);if(r?.hasErrors()){let e=Re(r);return n?.({success:!1,message:e}),a(Error(e))}let i=r?.toString({chunks:!1,colors:!0});return n?.({success:!0,message:i}),t(i)})})};var He=class{constructor(){this.name=`rspack`}createConfig(e){return Le({command:e.command===`server`?Z.SERVER:Z.BUILD,mode:e.mode,env:e.env,context:e.context,contextPkg:e.contextPkg,userConfig:e.userConfig,pages:e.pages,browserslist:e.browserslist,base:e.base,port:e.port,isElectron:e.isElectron,isVue:e.isVue,isReact:e.isReact,resolveContext:e.resolveContext})}async runDev(e,t){await Be(e,{port:t.port,onBuildStatus:t.onBuildStatus})}async runBuild(e,t){return ze(e,{onBuildStatus:t.onBuildStatus})}};function Ue(e){let t=Number(process.versions.node.split(`.`)[0]);if(Number.isFinite(t)&&t<e){let t=v.bgRed.white(` ERROR `);process.stderr.write(`${t} Node.js version must be greater than or equal to v${e}! (current: v${process.versions.node})\n\n`),process.exit(1)}}function We(e){let t=Number(process.versions.node.split(`.`)[0]);if(Number.isFinite(t)&&t<e)throw Error(`Node.js >= ${e} is required (current: v${process.versions.node})`)}const Ge=()=>{let e=`@ikaros-cli/ikaros-bundler-vite`,t=[`你启用了 bundler='vite',但未安装可选依赖 ${e}。`,``,`请安装后重试:`,` pnpm add -D ${e}`];return Error(t.join(`
8
- `))};var Ke=class{constructor(e){this.name=`vite`,this.loadContextModule=e.loadContextModule}ensureAdapter(){if(this.adapter)return this.adapter;We(22);try{let e=this.loadContextModule(`@ikaros-cli/ikaros-bundler-vite`),t=(e.default??e).ViteBundlerAdapter;if(typeof t!=`function`)throw Ge();return this.adapter=new t,this.adapter}catch(e){throw e instanceof Error&&e.message.includes(`bundler='vite'`)?e:Ge()}}createConfig(e){return this.ensureAdapter().createConfig(e)}async runDev(e,t){return this.ensureAdapter().runDev(e,t)}async runBuild(e,t){return this.ensureAdapter().runBuild(e,t)}};function qe(e){let{bundler:t,loadContextModule:n}=e;switch(t){case`vite`:return new Ke({loadContextModule:n});default:return new He}}const Je=e=>{let t=e===`mobile`,n=[`defaults`];return t?n.push(`IOS >= 16`,`Chrome >= 80`):n.push(`>0.2%`,`Chrome >= 90`,`Safari >= 16`,`last 2 versions`,`not dead`),n.join(`,`)},Ye=(e,t)=>t?{index:{html:e(`src/renderer/index.html`),entry:e(`src/renderer/index`)}}:{index:{html:e(`index.html`),entry:e(`src/index`)}},Xe=async e=>{let{command:t,context:n,resolveContext:r,getUserConfig:i,isElectron:a}=e,o=await i(),s=o?.build?.base??`/`;if(t===Z.SERVER&&/^https?:/.test(s)){let e=v.cyan(`build.base`);throw Error(`本地开发时 ${e} 不应该为外部 Host!`)}let c=o?.target??`pc`,l=o?.pages??Ye(r,!!a),u=o?.server?.port??await se(`8080`),d=!1,f=!1;try{let[e,t]=await Promise.all([z(`react`,n),z(`vue`,n)]);d=t,f=e}catch{}return{userConfig:o,base:s,target:c,pages:l,port:u,browserslist:Je(c),isVue:d,isReact:f}};var Ze=class{constructor(){this.name=`web`}async resolvePreConfig(e){return Xe({command:e.command,context:e.context,resolveContext:e.resolveContext,getUserConfig:async()=>e.userConfig,isElectron:e.isElectron})}async compile(e,t){let{command:n,preConfig:r,compileContext:i}=t,a=await e.createConfig({command:n,mode:i.options.mode,env:i.env,context:i.context,contextPkg:i.contextPkg,userConfig:r.userConfig,pages:r.pages,base:r.base,port:r.port,browserslist:r.browserslist,isElectron:i.isElectron,isVue:r.isVue,isReact:r.isReact,resolveContext:i.resolveContext});n===`server`?await e.runDev(a,{port:r.port,onBuildStatus:i.onBuildStatus}):await e.runBuild(a,{onBuildStatus:i.onBuildStatus})}};function Qe(e){switch(e){case`desktopClient`:return $e();default:return new Ze}}function $e(){let e,t=async()=>e||(e=await et(),e);return{name:`desktopClient`,async resolvePreConfig(e){return(await t()).resolvePreConfig(e)},async compile(e,n){return(await t()).compile(e,n)}}}async function et(){let t=`@ikaros-cli/ikaros-platform-desktop-client`,n=e=>{let n=[`你启用了 platform='desktopClient',但未安装可选依赖 ${t}。`,``,`请安装后重试:`,` pnpm add -D ${t}`];if(e){let t=e instanceof Error?e.message:String(e);n.push(``,`原始错误: ${t}`)}return Error(n.join(`
9
- `))},r;try{r=await import(m(e(l(process.cwd(),`./`)).resolve(t)).href)}catch(e){throw n(e)}let i=(r.default??r).ElectronDesktopPlatformInstance;if(!i||typeof i.resolvePreConfig!=`function`)throw Error([`${t} 已安装但加载失败:未找到 ElectronDesktopPlatformInstance 导出。`,`请确认安装的版本与 @ikaros-cli/ikaros 兼容(需 >=3.0)。`].join(`
10
- `));return i}async function tt(e){let t=await ke(e),n=Qe(t.options.platform),r=await n.resolvePreConfig(t),i={...t,userConfig:r.userConfig},a=qe({bundler:i.userConfig?.bundler??`rspack`,loadContextModule:i.loadContextModule});await n.compile(a,{command:i.command,preConfig:r,compileContext:i})}const nt={WEB:`web`,DESKTOPCLIENT:`desktopClient`,ELECTRON:`desktopClient`},rt=[new t(`-m, --mode <name>`,`Environment variable`),new t(`-p, --platform <type>`,`build platform type`).default(nt.WEB).choices(Object.values(nt))],$=async e=>{try{await tt(e)}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`${t}\n`),process.exit(1)}},it=e=>{let t=e.command(Z.SERVER,{isDefault:!0}).description(`Start local develop serve`).action(async e=>{await $({command:Z.SERVER,options:e})}),n=e.command(Z.BUILD).description(`Start build`).action(async e=>{await $({command:Z.BUILD,options:e})});for(let e of rt)t.addOption(e),n.addOption(e)},at=e=>e;Ue(22),n.version(A,`-v, --version`),it(n),n.parse();export{Z as Command,V as CreateLoader,H as CreatePlugins,L as LoggerSystem,He as RspackAdapter,Ke as ViteAdapterLoader,Ze as WebPlatformAdapter,Ue as assertNodeVersion,We as checkNodeVersion,qe as createBundlerAdapter,ke as createCompileContext,Qe as createPlatformAdapter,at as defineConfig,M as extensions,P as resolveCLI,Xe as resolveWebPreConfig,tt as runCompile,ze as runRspackBuild,Ve as watchRspackBuild};
1
+ import{S as e,_ as t,a as n,b as r,c as i,d as a,f as o,h as s,i as c,l,m as u,n as d,o as f,p,r as m,s as h,t as g,u as _,v,x as y,y as b}from"./compile-pipeline-DuG5l8nW.mjs";const x=e=>e;export{b as Command,t as CreateLoader,v as CreatePlugins,c as LoggerSystem,a as RspackAdapter,l as ViteAdapterLoader,f as WebPlatformAdapter,_ as assertNodeVersion,i as createBundlerAdapter,r as createCompileContext,n as createPlatformAdapter,m as createWatchdog,x as defineConfig,y as extensions,u as registerCleanup,e as resolveCLI,h as resolveWebPreConfig,s as runCleanups,g as runCompile,d as runCompileWithWatchdog,o as runRspackBuild,p as watchRspackBuild};