@ikaros-cli/ikaros 1.2.0 → 1.3.1

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/index.mjs'
package/dist/index.d.mts CHANGED
@@ -16,7 +16,6 @@ type ImportMetaEnv = Record<string, any>;
16
16
  interface ImportMeta {
17
17
  readonly env: Readonly<ImportMetaEnv & ImportMetaBaseEnv>;
18
18
  }
19
-
20
19
  //#endregion
21
20
  //#region src/node/compile/base-compile-service.d.ts
22
21
  /** 命令 */
@@ -24,7 +23,7 @@ declare const enum Command {
24
23
  SERVER = "server",
25
24
  BUILD = "build",
26
25
  }
27
-
26
+ /** 命令选项 */
28
27
  //#endregion
29
28
  //#region src/node/utils/css-loaders-helper.d.ts
30
29
  interface CssLoaderOptions {
@@ -34,7 +33,6 @@ interface CssLoaderOptions {
34
33
  sass?: Record<string, any>;
35
34
  stylus?: Record<string, any>;
36
35
  }
37
-
38
36
  //#endregion
39
37
  //#region src/node/utils/loader-plugin-helper.d.ts
40
38
  type RspackExperiments = {
@@ -51,7 +49,8 @@ type Pages = {
51
49
  meta: Record<string, string>;
52
50
  };
53
51
  };
54
- }; //#endregion
52
+ };
53
+ //#endregion
55
54
  //#region src/node/plugins/cdn-plugin.d.ts
56
55
  interface CdnModule {
57
56
  name: string;
@@ -71,12 +70,11 @@ interface CdnPluginOptions {
71
70
  devUrl?: string;
72
71
  crossOrigin?: boolean | string;
73
72
  }
74
-
75
73
  //#endregion
76
74
  //#region src/node/user-config.d.ts
77
75
  /**
78
- * 这里复写了 ModuleFederationPluginOptions,因为 ModuleFederationPluginOptions 是从 module-federation/sdk 导入的,remoteType和rspack的remoteType不一样
79
- */
76
+ * 这里复写了 ModuleFederationPluginOptions,因为 ModuleFederationPluginOptions 是从 module-federation/sdk 导入的,remoteType和rspack的remoteType不一样
77
+ */
80
78
  interface ModuleFederationOptions extends Omit<ModuleFederationPluginOptions, 'remoteType'> {
81
79
  remoteType?: 'var' | 'module' | 'assign' | 'this' | 'window' | 'self' | 'global' | 'commonjs' | 'commonjs2' | 'commonjs-module' | 'commonjs-static' | 'amd' | 'amd-require' | 'umd' | 'umd2' | 'jsonp' | 'system' | 'promise' | 'import' | 'script' | 'module-import' | 'node-commonjs';
82
80
  }
@@ -235,7 +233,8 @@ type ConfigEnvPre = Readonly<{
235
233
  command: Command;
236
234
  }>;
237
235
  type UserConfigFn<C> = (envPre: ConfigEnvPre) => C | Promise<C>;
238
- type UserConfigWebExport = UserConfig | Promise<UserConfig> | UserConfigFn<UserConfig>; /** 辅助工具函数 */
239
-
240
- declare const defineConfig: (config: UserConfigWebExport) => UserConfigWebExport; //#endregion
236
+ type UserConfigWebExport = UserConfig | Promise<UserConfig> | UserConfigFn<UserConfig>;
237
+ /** 辅助工具函数 */
238
+ declare const defineConfig: (config: UserConfigWebExport) => UserConfigWebExport;
239
+ //#endregion
241
240
  export { ConfigEnvPre, ModuleFederationOptions, UserConfig, UserConfigFn, UserConfigWebExport, defineConfig };
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
- import{Option as e,program as t}from"commander";import n from"chalk";import{rspack as r}from"@rspack/core";import{RsdoctorRspackPlugin as i}from"@rsdoctor/rspack-plugin";import a from"compression-webpack-plugin";import{ModuleFederationPlugin as o}from"@module-federation/enhanced/rspack";import{isArray as s,isEmpty as c,isFunction as l,isObject as u,isString as d}from"radashi";import{RspackDevServer as f}from"@rspack/dev-server";import p,{dirname as m,extname as h,join as g,resolve as _}from"node:path";import{detect as v}from"detect-port";import{createRequire as y}from"node:module";import b,{join as x}from"path";import ee from"node:fs";import S from"node:fs/promises";import C from"fs/promises";import{z as w}from"zod";import T,{pathToFileURL as E}from"node:url";import{parse as te}from"yaml";import D from"fs-extra";import{transform as ne}from"@swc/core";import{config as O}from"dotenv";import re from"ora";import ie from"node:os";import k from"pretty-bytes";import ae from"easy-table";import oe from"cli-cursor";import A from"node:process";var se=`@ikaros-cli/ikaros`,j=`1.2.0`;const M=(e,t)=>{for(let n in t)e[n]=u(t[n])&&n in e?M(e[n],t[n]):t[n];return e};async function N(e){try{let t=x(process.cwd(),`node_modules`,e);return await C.access(t,C.constants.F_OK),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}const ce=w.object({target:w.enum([`pc`,`mobile`]).optional().default(`pc`),pages:w.custom().optional(),enablePages:w.union([w.array(w.string()),w.boolean()]).optional().default(!1),moduleFederation:w.union([w.custom(),w.array(w.custom())]).optional(),plugins:w.union([w.custom(),w.array(w.custom())]).optional(),loaders:w.array(w.custom()).optional(),experiments:w.custom().optional(),cdnOptions:w.custom().optional(),server:w.object({port:w.number().int().min(1024).max(65535).optional(),proxy:w.custom().optional(),https:w.union([w.boolean(),w.record(w.any())]).optional().default(!1)}).optional(),css:w.object({lightningcssOptions:w.record(w.any()).optional(),sourceMap:w.boolean().optional(),lessOptions:w.record(w.unknown()).optional(),sassOptions:w.record(w.unknown()).optional(),stylusOptions:w.record(w.unknown()).optional()}).optional(),build:w.object({base:w.string().optional().default(`/`),assetsDir:w.string().optional(),gzip:w.boolean().optional().default(!1),sourceMap:w.boolean().optional().default(!1),outDirName:w.string().optional().default(`dist`),outReport:w.boolean().optional().default(!1),cache:w.boolean().optional().default(!1),dependencyCycleCheck:w.boolean().optional().default(!1)}).optional(),resolve:w.object({alias:w.record(w.string()).optional(),extensions:w.array(w.string()).optional()}).optional()});async function P(e,t){let{code:n}=await ne(e,{filename:e,sourceMaps:`inline`,jsc:{parser:{syntax:t?`typescript`:`ecmascript`,decorators:!0,dynamicImport:!0},target:`es2022`,loose:!0,keepClassNames:!0,externalHelpers:!0},minify:!1});return{code:n}}async function le(e,t){let n=`${e}.timestamp-${Date.now()}-${Math.random().toString(16).slice(2)}`,r=`${n}.mjs`,i=`${E(n)}.mjs`;await S.writeFile(r,t);try{let e=await import(i);return e.default}finally{await S.unlink(r)}}async function ue(e,t=!1){let{code:n}=await P(e,t);return le(e,n)}const F=new Map;F.set(`.mjs`,async e=>{let t=E(e),n=await import(t.href);return n.default}),F.set(`.ts`,async e=>await ue(e,!0)),F.set(`.json`,async e=>await D.readJson(e)),F.set(`.yaml`,async e=>{let t=await S.readFile(e,`utf8`);return te(t)});async function de({configFile:e}){let t,n=process.cwd(),r=`ikaros.config`,i=[`ts`,`mjs`,`json`,`yaml`].map(e=>`${g(n,r)}.${e}`),a=await Promise.all(i.map(e=>D.pathExists(e))),o=a.findIndex(Boolean);if(!(o<0)){if(t=h(i[o]),n=_(n,`${r}${t}`),e&&(n=m(e),t=h(e)),!F.has(t))throw Error(`No configuration file ! `);return F.get(t)(n)}}const I=[],L=()=>{let e=(e,t)=>{let r={DONE:n.bgGreen.white,ERROR:n.bgRed.white,OKAY:n.bgBlue.white,WARNING:n.bgYellow.white,INFO:n.bgCyan.white};return r[e](` ${e} `)+` ${t}`},t=({text:t,onlyText:n})=>{if(n)return e(`DONE`,t);console.log(e(`DONE`,t))},r=({text:t,onlyText:n})=>{if(n)return e(`ERROR`,t);console.error(e(`ERROR`,t))},i=({text:t,onlyText:n})=>{if(n)return e(`OKAY`,t);console.log(e(`OKAY`,t))},a=({text:t,onlyText:n})=>{if(n)return e(`WARNING`,t);console.warn(e(`WARNING`,t))},o=({text:t,onlyText:n})=>{if(n)return e(`INFO`,t);console.info(e(`INFO`,t))},s=e=>{let t=new Date().toLocaleTimeString(`en-US`,{hour12:!1}).split(` `)[0];I.push(`[${t}] ${e}`)},c=()=>{I.length=0};return{done:t,error:r,okay:i,warning:a,info:o,emitEvent:s,clearEventArray:c,eventArray:I}},R=e=>e?x(z,`env`,`.env.${e}`):x(z,`env`,`.env`),fe=async e=>{let{warning:t,emitEvent:n}=L(),r=await D.pathExists(x(z,`env`));if(!r)return n(t({text:`env folder not found`,onlyText:!0})),!1;if(e){let r=await D.pathExists(R(e));if(!r)return n(t({text:`.env.${e} file not found`,onlyText:!0})),!1}else{let e=await D.pathExists(R());return e?!0:(n(t({text:`.env file not found`,onlyText:!0})),!1)}return!0},z=process.cwd(),B=async e=>{let t=await fe(e);return t?e?O({path:R(e)}).parsed??{}:O({path:R()}).parsed??{}:{}};let V=function(e){return e.SERVER=`server`,e.BUILD=`build`,e}({});var pe=class{set env(e){this._env=e}get env(){return this._env}set contextPkg(e){this._contextPkg=e}get contextPkg(){return this._contextPkg}constructor(e){let{command:t,options:n,configFile:r}=e;this.command=t,this.options=n,this.configFile=r,this.context=x(process.cwd(),`./`),this.contextRequire=y(this.context),this.initialize()}async initialize(){await this.initContextPkg(),await this.initEnv(),await this.getUserConfig(),this.startCompile()}resolveContext(...e){return x(this.context,...e)}async initContextPkg(){let e=this.resolveContext(`package.json`);try{await S.access(e,ee.constants.F_OK)}catch{return}this.contextPkg=JSON.parse(await S.readFile(e,{encoding:`utf8`}))}async initEnv(){let{platform:e,mode:t}=this.options,n={PLATFORM:e,MODE:t},r=await B(t);this.env={...n,...r}}resolveContextModule(e){try{return this.contextRequire.resolve(e)}catch{return}}loadContextModule(e){return this.contextRequire(e)}async getUserConfig(){let{configFile:e}=this,t=await de({configFile:e}),n;if(t){if(l(t)){let e={PLATFORM:this.options.platform},r={mode:this.options.mode??``,env:Object.assign(e,this.env),command:this.command};n=await t(r)}u(t)&&(n=t),this.userConfig=ce.parse(n)}}startCompile(){switch(this.command){case V.SERVER:this.dev?.();break;case V.BUILD:this.build?.();break;default:break}}};const H=x(process.cwd(),`./`),me=[`...`,`.mjs`,`.jsx`,`.ts`,`.tsx`],he=x(H,`tsconfig.json`),U=T.fileURLToPath(new T.URL(`../`,import.meta.url)),ge=y(U),_e=(...e)=>x(U,...e),W=(e,t)=>({loader:e.includes(`builtin`)?e:ge.resolve(e),options:t}),ve=(e,t)=>{let{lightningcss:n,sourceMap:r}=t??{},i=W(`builtin:lightningcss-loader`,{...n}),a=(e,n)=>{let a=[i],o=t&&t[`${e}`];return e&&e!==`css`&&a.push(W(`${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`)}},ye=(e,t)=>{let n=ve(e,t);return Object.entries(n).map(([e,t])=>({test:RegExp(`\\.${e}$`),use:t,type:`css/auto`}))};var G=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&&(s(e)?this.list=this.list.concat(e):this.list.push(e)),this}end(){return this.list}},be=class extends G{constructor({env:e=`development`,mode:t=``}){super({env:e,mode:t}),this.defaultScriptLoader=e=>({test:/\.m?[j]s$/,loader:`builtin:swc-loader`,options:{isModule:`unknown`,rspackExperiments:e},type:`javascript/auto`}),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){let t=ye(this.env,e);return t.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}},K=class extends G{constructor({env:e=`development`,mode:t=``}){super({env:e,mode:t})}useDefaultEnvPlugin(e){let{frameworkEnv:t={},extEnv:n={},env:r={}}=e??{};return this.add(Se({frameworkEnv:t,extEnv:n,env:r})),this}useCopyPlugin(){return this.env===`production`&&this.add(new r.CopyRspackPlugin({patterns:[{context:x(H,`public`),from:`./`,noErrorOnMissing:!0,globOptions:{ignore:[`**/index.html`,`.*`]}}]})),this}useHtmlPlugin(e){return this.add(new r.HtmlRspackPlugin({template:e??x(H,`index.html`)})),this}},xe=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(!c(this.pages)&&s(this.enablePages)){let n={},r=[];if(this.enablePages.forEach(e=>{this.pages[e]?n[e]=this.pages[e]:r.push(e)}),c(r)&&t(e({text:`当前设置页面${r.join()}不存在`,onlyText:!0})),c(n))return;this.pages=n}}};const Se=({frameworkEnv:e={},extEnv:t={},env:n={}})=>{let i=Object.assign({},M(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)},q={name:se,version:j},J=`@rspack/ikaros-stats-plugin`,Y=n.hex(`#222222`);var Ce=class{constructor(e){this.startCompileHrtime=void 0,this.userConfig=e,this.ora=re({color:`cyan`,prefixText:``,hideCursor:!1})}apply(e){this.compiler=e,this.isDev=e.options.mode===`development`,new r.ProgressPlugin(this.progressHandler.bind(this)).apply(e),oe.hide(),this.isDev?this.initDevHook():this.initProdHook()}progressHandler(e,t,...r){let i=`${(e*100).toFixed(2)}%`;i+=` ${t} `,i+=n.gray(r?.join(` `)),this.lastProgressText!==i&&(this.lastProgressText=i,this.isDev?this.ora.text=`${i}\n`:console.log(i))}updateStartCompileTime(){this.startCompileHrtime=A.hrtime()}getCurrentEndCompileTime(){let e=A.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=>`${Y.bgRed(` ERROR `)} ${e.message.trim()}`).join(`
1
+ import{createRequire as e}from"node:module";import{Option as t,program as n}from"commander";import r from"chalk";import{rspack as i}from"@rspack/core";import{RsdoctorRspackPlugin as a}from"@rsdoctor/rspack-plugin";import o from"compression-webpack-plugin";import{ModuleFederationPlugin as s}from"@module-federation/enhanced/rspack";import{isArray as c,isEmpty as l,isFunction as u,isObject as d,isString as f}from"radashi";import{RspackDevServer as p}from"@rspack/dev-server";import m,{dirname as h,extname as g,join as _,resolve as v}from"node:path";import{detect as ee}from"detect-port";import y,{join as b}from"path";import te from"node:fs";import x from"node:fs/promises";import S from"fs/promises";import{z as C}from"zod/v4";import w,{pathToFileURL as T}from"node:url";import{parse as ne}from"yaml";import E from"fs-extra";import{transform as re}from"@swc/core";import{config as D}from"dotenv";import ie from"ora";import ae from"node:os";import O from"pretty-bytes";import k from"easy-table";import A from"cli-cursor";import j from"node:process";var oe=`@ikaros-cli/ikaros`,M=`1.3.0`;const N=(e,t)=>{for(let n in t)e[n]=d(t[n])&&n in e?N(e[n],t[n]):t[n];return e};async function P(e){try{let t=b(process.cwd(),`node_modules`,e);return await S.access(t,S.constants.F_OK),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}const se=C.object({target:C.enum([`pc`,`mobile`]).optional().default(`pc`),pages:C.custom().optional(),enablePages:C.union([C.array(C.string())]).optional(),moduleFederation:C.union([C.custom(),C.array(C.custom())]).optional(),plugins:C.union([C.custom(),C.array(C.custom())]).optional(),loaders:C.array(C.custom()).optional(),experiments:C.custom().optional(),cdnOptions:C.custom().optional(),server:C.object({port:C.number().int().min(1024).max(65535).optional(),proxy:C.custom().optional(),https:C.union([C.boolean(),C.record(C.string(),C.any())]).optional().default(!1)}).optional(),css:C.object({lightningcssOptions:C.record(C.string(),C.any()).optional(),sourceMap:C.boolean().optional(),lessOptions:C.record(C.string(),C.any()).optional(),sassOptions:C.record(C.string(),C.any()).optional(),stylusOptions:C.record(C.string(),C.any()).optional()}).optional(),build:C.object({base:C.string().optional().default(`/`),assetsDir:C.string().optional(),gzip:C.boolean().optional().default(!1),sourceMap:C.boolean().optional().default(!1),outDirName:C.string().optional().default(`dist`),outReport:C.boolean().optional().default(!1),cache:C.boolean().optional().default(!1),dependencyCycleCheck:C.boolean().optional().default(!1)}).optional(),resolve:C.object({alias:C.record(C.string(),C.string()).optional(),extensions:C.array(C.string()).optional()}).optional()});async function ce(e,t){let{code:n}=await re(e,{filename:e,sourceMaps:`inline`,jsc:{parser:{syntax:t?`typescript`:`ecmascript`,decorators:!0,dynamicImport:!0},target:`es2022`,loose:!0,keepClassNames:!0,externalHelpers:!0},minify:!1});return{code:n}}async function le(e,t){let n=`${e}.timestamp-${Date.now()}-${Math.random().toString(16).slice(2)}`,r=`${n}.mjs`,i=`${T(n)}.mjs`;await x.writeFile(r,t);try{let e=await import(i);return e.default}finally{await x.unlink(r)}}async function ue(e,t=!1){let{code:n}=await ce(e,t);return le(e,n)}const F=new Map;F.set(`.mjs`,async e=>{let t=T(e),n=await import(t.href);return n.default}),F.set(`.ts`,async e=>await ue(e,!0)),F.set(`.json`,async e=>await E.readJson(e)),F.set(`.yaml`,async e=>{let t=await x.readFile(e,`utf8`);return ne(t)});async function de({configFile:e}){let t,n=process.cwd(),r=`ikaros.config`,i=[`ts`,`mjs`,`json`,`yaml`].map(e=>`${_(n,r)}.${e}`),a=await Promise.all(i.map(e=>E.pathExists(e))),o=a.findIndex(Boolean);if(!(o<0)){if(t=g(i[o]),n=v(n,`${r}${t}`),e&&(n=h(e),t=g(e)),!F.has(t))throw Error(`No configuration file ! `);return F.get(t)(n)}}const I=[],L=()=>{let e=(e,t)=>{let n={DONE:r.bgGreen.white,ERROR:r.bgRed.white,OKAY:r.bgBlue.white,WARNING:r.bgYellow.white,INFO:r.bgCyan.white};return n[e](` ${e} `)+` ${t}`},t=({text:t,onlyText:n})=>{if(n)return e(`DONE`,t);console.log(e(`DONE`,t))},n=({text:t,onlyText:n})=>{if(n)return e(`ERROR`,t);console.error(e(`ERROR`,t))},i=({text:t,onlyText:n})=>{if(n)return e(`OKAY`,t);console.log(e(`OKAY`,t))},a=({text:t,onlyText:n})=>{if(n)return e(`WARNING`,t);console.warn(e(`WARNING`,t))},o=({text:t,onlyText:n})=>{if(n)return e(`INFO`,t);console.info(e(`INFO`,t))},s=e=>{let t=new Date().toLocaleTimeString(`en-US`,{hour12:!1}).split(` `)[0];I.push(`[${t}] ${e}`)},c=()=>{I.length=0};return{done:t,error:n,okay:i,warning:a,info:o,emitEvent:s,clearEventArray:c,eventArray:I}},R=e=>e?b(z,`env`,`.env.${e}`):b(z,`env`,`.env`),fe=async e=>{let{warning:t,emitEvent:n}=L(),r=await E.pathExists(b(z,`env`));if(!r)return n(t({text:`env folder not found`,onlyText:!0})),!1;if(e){let r=await E.pathExists(R(e));if(!r)return n(t({text:`.env.${e} file not found`,onlyText:!0})),!1}else{let e=await E.pathExists(R());return e?!0:(n(t({text:`.env file not found`,onlyText:!0})),!1)}return!0},z=process.cwd(),B=async e=>{let t=await fe(e);return t?e?D({path:R(e)}).parsed??{}:D({path:R()}).parsed??{}:{}};let V=function(e){return e.SERVER=`server`,e.BUILD=`build`,e}({});var pe=class{command;context;options;contextRequire;_env;configFile;set env(e){this._env=e}get env(){return this._env}_contextPkg;userConfig;set contextPkg(e){this._contextPkg=e}get contextPkg(){return this._contextPkg}constructor(t){let{command:n,options:r,configFile:i}=t;this.command=n,this.options=r,this.configFile=i,this.context=b(process.cwd(),`./`),this.contextRequire=e(this.context),this.initialize()}async initialize(){await this.initContextPkg(),await this.initEnv(),await this.getUserConfig(),this.startCompile()}resolveContext(...e){return b(this.context,...e)}async initContextPkg(){let e=this.resolveContext(`package.json`);try{await x.access(e,te.constants.F_OK)}catch{return}this.contextPkg=JSON.parse(await x.readFile(e,{encoding:`utf8`}))}async initEnv(){let{platform:e,mode:t}=this.options,n={PLATFORM:e,MODE:t},r=await B(t);this.env={...n,...r}}resolveContextModule(e){try{return this.contextRequire.resolve(e)}catch{return}}loadContextModule(e){return this.contextRequire(e)}async getUserConfig(){let{configFile:e}=this,t=await de({configFile:e}),n;if(t){if(u(t)){let e={PLATFORM:this.options.platform},r={mode:this.options.mode??``,env:Object.assign(e,this.env),command:this.command};n=await t(r)}d(t)&&(n=t),this.userConfig=se.parse(n)}}startCompile(){switch(this.command){case V.SERVER:this.dev?.();break;case V.BUILD:this.build?.();break;default:break}}};const H=b(process.cwd(),`./`),me=[`...`,`.mjs`,`.jsx`,`.ts`,`.tsx`],he=b(H,`tsconfig.json`),U=w.fileURLToPath(new w.URL(`../`,import.meta.url)),ge=e(U),_e=(...e)=>b(U,...e),W=(e,t)=>({loader:e.includes(`builtin`)?e:ge.resolve(e),options:t}),ve=(e,t)=>{let{lightningcss:n,sourceMap:r}=t??{},i=W(`builtin:lightningcss-loader`,{...n}),a=(e,n)=>{let a=[i],o=t&&t[`${e}`];return e&&e!==`css`&&a.push(W(`${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`)}},ye=(e,t)=>{let n=ve(e,t);return Object.entries(n).map(([e,t])=>({test:RegExp(`\\.${e}$`),use:t,type:`css/auto`}))};var G=class{list=[];env=`development`;mode=``;isDev=!0;constructor({env:e=`development`,mode:t=``}){this.env=e,this.mode=t,this.isDev=e===`development`}add(e){return e&&(c(e)?this.list=this.list.concat(e):this.list.push(e)),this}end(){return this.list}},K=class extends G{constructor({env:e=`development`,mode:t=``}){super({env:e,mode:t})}defaultScriptLoader=e=>({test:/\.m?[j]s$/,loader:`builtin:swc-loader`,options:{isModule:`unknown`,rspackExperiments:e},type:`javascript/auto`});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){let t=ye(this.env,e);return t.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}},be=class extends G{constructor({env:e=`development`,mode:t=``}){super({env:e,mode:t})}useDefaultEnvPlugin(e){let{frameworkEnv:t={},extEnv:n={},env:r={}}=e??{};return this.add(Se({frameworkEnv:t,extEnv:n,env:r})),this}useCopyPlugin(){return this.env===`production`&&this.add(new i.CopyRspackPlugin({patterns:[{context:b(H,`public`),from:`./`,noErrorOnMissing:!0,globOptions:{ignore:[`**/index.html`,`.*`]}}]})),this}useHtmlPlugin(e){return this.add(new i.HtmlRspackPlugin({template:e??b(H,`index.html`)})),this}},xe=class{pages;enablePages;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 i.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(!l(this.pages)&&c(this.enablePages)){let n={},r=[];if(this.enablePages.forEach(e=>{this.pages[e]?n[e]=this.pages[e]:r.push(e)}),l(r)&&t(e({text:`当前设置页面${r.join()}不存在`,onlyText:!0})),l(n))return;this.pages=n}}};const Se=({frameworkEnv:e={},extEnv:t={},env:n={}})=>{let r=Object.assign({},N(t,n)),a=Object.fromEntries(Object.entries(r).map(([e,t])=>[`import.meta.env.${e}`,JSON.stringify(t)])),o=Object.fromEntries(Object.entries({...a,...e}).map(([e,t])=>[e,t]));return new i.DefinePlugin(o)},q={name:oe,version:M},J=`@rspack/ikaros-stats-plugin`,Y=r.hex(`#222222`);var Ce=class{compiler;ora;userConfig;startCompileHrtime=void 0;isDev;lastProgressText;constructor(e){this.userConfig=e,this.ora=ie({color:`cyan`,prefixText:``,hideCursor:!1})}apply(e){this.compiler=e,this.isDev=e.options.mode===`development`,new i.ProgressPlugin(this.progressHandler.bind(this)).apply(e),A.hide(),this.isDev?this.initDevHook():this.initProdHook()}progressHandler(e,t,...n){let i=`${(e*100).toFixed(2)}%`;i+=` ${t} `,i+=r.gray(n?.join(` `)),this.lastProgressText!==i&&(this.lastProgressText=i,this.isDev?this.ora.text=`${i}\n`:console.log(i))}updateStartCompileTime(){this.startCompileHrtime=j.hrtime()}getCurrentEndCompileTime(){let e=j.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=>`${Y.bgRed(` ERROR `)} ${e.message.trim()}`).join(`
2
2
 
3
3
  `)}getWarn(e){let{warnings:t,warningsCount:n=0}=e;if(!(!t||n===0))return t.map(e=>`${Y.bgYellow(` WARN `)} ${e.message.trim()}`).join(`
4
4
 
5
- `)}getEndTips(e,t){let{gray:r,cyan:i,red:a,green:o,yellow:s}=n,{errorsCount:c=-1,warningsCount:l=-1}=e,u=(t/1e3).toFixed(2);return r(c>0?`${i(q.name)} compiled with${a(` ${c} error`)}`:l>0?`compile ${o(`success`)} and with ${s(`${l} warning`)}, time: ${u}s`:`compile ${o(`success`)}, time: ${u}s.`)}getTableInfo(e){let{assets:t}=e;if(!t||t.length===0)return;let r=new ae,i=this.userConfig?.build?.gzip??!1,a=0,o=0,c=!1;for(let e=0;e<t.length;e++){let{name:n,size:l,related:u,info:d}=t[e];if(d.development)continue;let f=i&&s(u)?u.find(e=>e.type===`gzipped`).size:0;if(a+=l,o+=f,t.length>20&&e>=4&&e<t.length-1-4){c||(c=!0,r.cell(`name`,`....`),r.cell(`size`,`....`),i&&r.cell(`gzip`,`....`),r.newRow());continue}r.cell(`name`,n),r.cell(`size`,k(l)),i&&r.cell(`gzip`,k(f)),r.newRow()}return r.pushDelimeter(),r.cell(`name`,`There are ${t.length} files`),r.cell(`size`,k(a)),i&&r.cell(`gzip`,k(o)),r.newRow(),n.cyan.dim(r.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=[],o=``,s=Object.values(ie.networkInterfaces());if(e){o=e.build?.base??``,(!o||o===`auto`)&&(o=`/`);let t=Object.keys(e?.pages||{})[0];t&&t!==`index`?o=p.join(o,`${t}.html`):o.endsWith(`/`)||(o+=`/`)}for(let e of s){let{address:t}=e?.find(e=>e.family===`IPv4`)||{};if(!t)continue;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])continue;return Number(r[t])-Number(e[t])}return 0});let c=a.indexOf(`127.0.0.1`);return c!==-1&&(a.splice(c,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));let t=new URL(o,e);return t.href}),a}initDevHook(){let{compiler:e,ora:t}=this,r=this.getHostList(),{blue:i,cyan:a,gray:o}=n;e.hooks.environment.intercept({name:J,call(){t.start(`Preparing resource files....`)}}),e.hooks.watchRun.intercept({name:J,call:()=>{t.isSpinning||console.clear(),t.start(),this.updateStartCompileTime()}}),e.hooks.done.intercept({name:J,call:e=>{t.stop(),console.clear();let n=e.toJson({preset:`errors-warnings`,colors:!0}),{eventArray:s}=L(),{errorsCount:c=0,warningsCount:l=0}=n;if(c>0)console.log(this.getError(n)),console.log();else{l>0&&(console.log(this.getWarn(n)),console.log()),s.length>0&&(console.log(s.map(e=>e).join(`
6
- `)),console.log());let{name:e,version:t}=q,c=`${a(`${e} v${t}`)} entry address:\n\n`;for(let e of r)c+=i(` ${e}\n`);console.log(o(c))}console.log(this.getEndTips(n,this.getCurrentEndCompileTime())),console.log()}})}initProdHook(){let{compiler:e}=this,t;e.hooks.environment.intercept({name:J,call:()=>{console.log(n.gray(`start build...`)),this.updateStartCompileTime()}}),e.hooks.done.intercept({name:J,call:e=>{t=e.toJson({preset:`normal`,colors:!0,assetsSort:`size`})}}),e.cache.hooks.shutdown.intercept({name:J,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 X=`@rspack/ikaros-cdn-plugin`,we=`https://unpkg.com/:name@:version/:path`,Te=`:name/:path`,Z=/:([a-z]+)/gi;var Ee=class{constructor(e){this.isDev=!1,this.options={prodUrl:we,devUrl:Te,crossOrigin:!1,...e}}apply(e){this.compiler=e,this.isDev=e.options.mode===`development`,this.handleExternals(),e.hooks.compilation.tap(X,e=>{let t=r.HtmlRspackPlugin.getCompilationHooks(e);t.alterAssetTags.tapAsync(X,(e,t)=>{try{this.injectResources(e),t(null,e)}catch(e){t(e)}})})}handleExternals(){let e=this.compiler.options.externals||{};this.options.modules.filter(e=>!e.cssOnly).forEach(t=>{e[t.name]=t.var||t.name}),this.compiler.options.externals=e}injectResources(e){let t=this.options.modules,n=[];t.forEach(e=>{let t=this.getStyles(e);t.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=>{let t=this.getScripts(e);t.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(Z)?n.replace(Z,(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(e){try{return y(b.join(process.cwd(),`node_modules`))(b.join(e,`package.json`)).version}catch{return console.warn(n.yellow(`[${X}] 无法获取模块 "${e}" 的版本信息`)),`latest`}}};const{error:De}=L();var Oe=class extends pe{constructor(...e){super(...e),this.isVue=!1,this.isReact=!1}async dev(){await this.initPreConfig(),await this.createRspackBuilder({isLive:!0})}async build(){await this.initPreConfig(),await this.createRspackBuilder()}async initPreConfig(){await Promise.all([this.initUserConfig(),this.initBrowserslist(),this.initOtherConfig()]),await this.createRspackConfig()}async initUserConfig(){let e=this.command===V.SERVER,t=this.userConfig;if(this.base=t?.build?.base??`/`,e&&d(this.base)&&/^https?:/.test(this.base)){let e=n.cyan(`build.base`);De({text:`本地开发时 ${e} 不应该为外部 Host!`}),process.exit(0)}this.target=t?.target??`pc`,this.pages=t?.pages??{index:{html:this.resolveContext(`index.html`),entry:this.resolveContext(`src/index`)}},this.port=t?.server?.port??await v(`8080`)}async initBrowserslist(){let e=this.target===`mobile`,t=[`defaults`];e?t.push(`IOS >= 10`,`Chrome >= 56`):t.push(`>0.2%`,`Chrome >= 56`,`Safari >= 10`,`last 2 versions`,`not dead`),this.browserslist=t.join(`,`)}async initOtherConfig(){try{let[e,t]=await Promise.all([N(`react`),N(`vue`)]);this.isVue=t,this.isReact=e}catch{}}joinAssetsDir(...e){let t=this.userConfig?.build?.assetsDir??``;return g(t,...e).replaceAll(`\\`,`/`)}getOutDirPath(){let e=this.userConfig?.build?.outDirName;return d(e)?this.resolveContext(e):this.resolveContext(`dist`)}async createRspackConfig(){let e=this.command===V.SERVER,t=e?`development`:`production`,{userConfig:n,context:r,browserslist:i,pages:a,contextPkg:o,port:s,base:c}=this,l=new be({env:t,mode:this.options.mode}),u=new K({env:t,mode:this.options.mode}),d=new xe({pages:a,enablePages:n?.enablePages}),{entry:f,plugins:p}=d.create(),{env:m,noParse:h}=this.createVueOrReactConfig(),_=l.useDefaultResourceLoader().useDefaultScriptLoader(n?.experiments).useDefaultCssLoader(n?.css).add(n?.loaders).end(),v=u.useDefaultEnvPlugin({extEnv:{...n?.define},frameworkEnv:m,env:this.env}).useCopyPlugin().add(p).add(new Ce).add(this.createSourceMapPlugin()).add(this.createCssExtractPlugin()).add(this.createDoctorPlugin()).add(this.createGzipPlugin()).add(this.createCdnPlugin()).add(this.createModuleFederationPlugin()).add(this.createDependencyCyclePlugin()).add(n?.plugins).end();this.rspackConfig={mode:t,target:[`web`,`es5`,`browserslist:${i}`],context:r,entry:f,resolve:{alias:{"@":this.resolveContext(`src`),...n?.resolve?.alias},extensions:n?.resolve?.extensions||me,modules:[`node_modules`,this.resolveContext(`node_modules`),_e(`node_modules`)]},output:{clean:!0,path:this.getOutDirPath(),publicPath:c,filename:e?`[id].js`:this.joinAssetsDir(`assets/js/[contenthash].js`),chunkLoadingGlobal:`${o?.name||`ikaros`}_chunk`,pathinfo:!1},optimization:this.createOptimization(),stats:`none`,watchOptions:{aggregateTimeout:500,ignored:/node_modules/},module:{rules:_,noParse:h},plugins:v,devServer:{hot:!0,port:s,server:(()=>{let e=n?.server?.https;return e?e===!0?`https`:{type:`https`,options:e}:`http`})(),allowedHosts:`all`,proxy:n?.server?.proxy,historyApiFallback:{rewrites:[{from:RegExp(`^${c}`),to:g(c,`index.html`)}]},headers:{"Access-Control-Allow-Origin":`*`},static:{directory:this.resolveContext(`public`),publicPath:c},client:{logging:`none`,overlay:{errors:!0,warnings:!1,runtimeErrors:!1},webSocketURL:`auto://0.0.0.0:${s}/ws`}},experiments:{css:!0},...this.createCacheConfig()}}createSourceMapPlugin(){let{userConfig:e,command:t}=this,n=t===V.SERVER;if(n)return new r.EvalSourceMapDevToolPlugin({columns:!1,module:!0});if(e?.build?.sourceMap??!1)return new r.SourceMapDevToolPlugin({test:[/.js/,/.mjs/],filename:`[file].map[query]`})}createCssExtractPlugin(){if(this.command!==V.SERVER)return new r.CssExtractRspackPlugin({filename:this.joinAssetsDir(`assets/css/[contenthash].css`),ignoreOrder:!0})}createDoctorPlugin(){if(this.command!==V.SERVER&&this.userConfig?.build?.outReport)return new i}createGzipPlugin(){if(this.command!==V.SERVER&&this.userConfig?.build?.gzip)return new a}createOptimization(){return this.command===V.SERVER?{minimize:!1,removeAvailableModules:!1,removeEmptyChunks:!1,splitChunks:!1}:{minimize:!0,minimizer:[new r.LightningCssMinimizerRspackPlugin,new r.SwcJsMinimizerRspackPlugin],splitChunks:{chunks:`all`,minSize:2e4,minChunks:2,maxAsyncRequests:30,maxInitialRequests:30,cacheGroups:{defaultVendors:{test:/[/\\]node_modules[/\\]/,priority:-10,reuseExistingChunk:!0},default:{minChunks:2,priority:-20,reuseExistingChunk:!0}}}}}createCacheConfig(){if(this.command!==V.SERVER&&this.userConfig?.build?.cache)return{cache:!0,experiments:{cache:{type:`persistent`}}}}createVueOrReactConfig(){return this.isVue?{noParse:/^(vue|vue-router|vuex|vuex-router-sync)$/,env:{__VUE_OPTIONS_API__:!0,__VUE_PROD_DEVTOOLS__:!1,__VUE_PROD_HYDRATION_MISMATCH_DETAILS__:!1}}:this.isReact?{noParse:e=>/(react|react-dom|react-is)\.production\.min\.js$/.test(e),env:{REACT_APP_ENABLE_DEVTOOLS:!1}}:{env:void 0,noParse:void 0}}createCdnPlugin(){let{cdnOptions:e}=this.userConfig??{};if(!(!e||c(e.modules)))return new Ee(e)}createModuleFederationPlugin(){let e=this.userConfig?.moduleFederation;if(e)return s(e)?e.map(e=>new o(e)):new o(e)}createDependencyCyclePlugin(){if(this.command!==V.SERVER&&this.userConfig?.build?.dependencyCycleCheck)return new r.CircularDependencyRspackPlugin({exclude:/node_modules/,failOnError:!1})}createRspackBuilder(e){let{isLive:t=!1}=e||{};return new Promise((e,n)=>{let i=r(this.rspackConfig);if(t){let t=new f(this.rspackConfig.devServer,i);t.startCallback(t=>{if(t)return n(t);e(void 0)});return}let a=``;i.run((t,r)=>{i.close(i=>t||i?(console.error(t||i),n(t||i)):r?.hasErrors()?(a+=`Build failed with errors.
7
- `,r.toString({chunks:!1,colors:!0}).split(/\r?\n/).forEach(e=>{a+=` ${e}\n`}),n(Error(a))):e(r?.toString({chunks:!1,colors:!0})))})})}};const Q={WEB:`web`},ke=[new e(`-m, --mode <name>`,`Environment variable`),new e(`-p, --platform <type>`,`build platform type`).default(Q.WEB).choices(Object.values(Q))],$=e=>{switch(e.options.platform){case Q.WEB:new Oe(e);break;default:{let e=Object.values(Q).join(`,`);console.error(`No corresponding compilation service was found, platform: ${e}`),process.exit(1)}}},Ae=e=>{let t=e.command(V.SERVER,{isDefault:!0}).description(`Start local develop serve`).action(e=>{$({command:V.SERVER,options:e})}),n=e.command(V.BUILD).description(`Start build`).action(e=>{$({command:V.BUILD,options:e})});for(let e of ke)t.addOption(e),n.addOption(e)},je=e=>e,Me=Number(process.versions.node.split(`.`)[0]);if(Me<18){let e=n.bgRed.white(` ERROR `);console.error(e+` The Node.js version is greater than v18!`),console.log(),process.exit(1)}t.version(j,`-v, --version`),Ae(t),t.parse();export{je as defineConfig};
5
+ `)}getEndTips(e,t){let{gray:n,cyan:i,red:a,green:o,yellow:s}=r,{errorsCount:c=-1,warningsCount:l=-1}=e,u=(t/1e3).toFixed(2);return n(c>0?`${i(q.name)} compiled with${a(` ${c} error`)}`:l>0?`compile ${o(`success`)} and with ${s(`${l} warning`)}, time: ${u}s`:`compile ${o(`success`)}, time: ${u}s.`)}getTableInfo(e){let{assets:t}=e;if(!t||t.length===0)return;let n=new k,i=this.userConfig?.build?.gzip??!1,a=0,o=0,s=!1;for(let e=0;e<t.length;e++){let{name:r,size:l,related:u,info:d}=t[e];if(d.development)continue;let f=i&&c(u)?u.find(e=>e.type===`gzipped`).size:0;if(a+=l,o+=f,t.length>20&&e>=4&&e<t.length-1-4){s||(s=!0,n.cell(`name`,`....`),n.cell(`size`,`....`),i&&n.cell(`gzip`,`....`),n.newRow());continue}n.cell(`name`,r),n.cell(`size`,O(l)),i&&n.cell(`gzip`,O(f)),n.newRow()}return n.pushDelimeter(),n.cell(`name`,`There are ${t.length} files`),n.cell(`size`,O(a)),i&&n.cell(`gzip`,O(o)),n.newRow(),r.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=[],o=``,s=Object.values(ae.networkInterfaces());if(e){o=e.build?.base??``,(!o||o===`auto`)&&(o=`/`);let t=Object.keys(e?.pages||{})[0];t&&t!==`index`?o=m.join(o,`${t}.html`):o.endsWith(`/`)||(o+=`/`)}for(let e of s){let{address:t}=e?.find(e=>e.family===`IPv4`)||{};if(!t)continue;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])continue;return Number(r[t])-Number(e[t])}return 0});let c=a.indexOf(`127.0.0.1`);return c!==-1&&(a.splice(c,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));let t=new URL(o,e);return t.href}),a}initDevHook(){let{compiler:e,ora:t}=this,n=this.getHostList(),{blue:i,cyan:a,gray:o}=r;e.hooks.environment.intercept({name:J,call(){t.start(`Preparing resource files....`)}}),e.hooks.watchRun.intercept({name:J,call:()=>{t.isSpinning||console.clear(),t.start(),this.updateStartCompileTime()}}),e.hooks.done.intercept({name:J,call:e=>{t.stop(),console.clear();let r=e.toJson({preset:`errors-warnings`,colors:!0}),{eventArray:s}=L(),{errorsCount:c=0,warningsCount:l=0}=r;if(c>0)console.log(this.getError(r)),console.log();else{l>0&&(console.log(this.getWarn(r)),console.log()),s.length>0&&(console.log(s.map(e=>e).join(`
6
+ `)),console.log());let{name:e,version:t}=q,c=`${a(`${e} v${t}`)} entry address:\n\n`;for(let e of n)c+=i(` ${e}\n`);console.log(o(c))}console.log(this.getEndTips(r,this.getCurrentEndCompileTime())),console.log()}})}initProdHook(){let{compiler:e}=this,t;e.hooks.environment.intercept({name:J,call:()=>{console.log(r.gray(`start build...`)),this.updateStartCompileTime()}}),e.hooks.done.intercept({name:J,call:e=>{t=e.toJson({preset:`normal`,colors:!0,assetsSort:`size`})}}),e.cache.hooks.shutdown.intercept({name:J,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 X=`@rspack/ikaros-cdn-plugin`,we=`https://unpkg.com/:name@:version/:path`,Te=`:name/:path`,Z=/:([a-z]+)/gi;var Ee=class{compiler;options;isDev=!1;constructor(e){this.options={prodUrl:we,devUrl:Te,crossOrigin:!1,...e}}apply(e){this.compiler=e,this.isDev=e.options.mode===`development`,this.handleExternals(),e.hooks.compilation.tap(X,e=>{let t=i.HtmlRspackPlugin.getCompilationHooks(e);t.alterAssetTags.tapAsync(X,(e,t)=>{try{this.injectResources(e),t(null,e)}catch(e){t(e)}})})}handleExternals(){let e=this.compiler.options.externals||{};this.options.modules.filter(e=>!e.cssOnly).forEach(t=>{e[t.name]=t.var||t.name}),this.compiler.options.externals=e}injectResources(e){let t=this.options.modules,n=[];t.forEach(e=>{let t=this.getStyles(e);t.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=>{let t=this.getScripts(e);t.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(Z)?n.replace(Z,(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){try{return e(y.join(process.cwd(),`node_modules`))(y.join(t,`package.json`)).version}catch{return console.warn(r.yellow(`[${X}] 无法获取模块 "${t}" 的版本信息`)),`latest`}}};const{error:De}=L();var Oe=class extends pe{browserslist;rspackConfig;target;pages;port;base;isVue=!1;isReact=!1;async dev(){await this.initPreConfig(),await this.createRspackBuilder({isLive:!0})}async build(){await this.initPreConfig(),await this.createRspackBuilder()}async initPreConfig(){await Promise.all([this.initUserConfig(),this.initBrowserslist(),this.initOtherConfig()]),await this.createRspackConfig()}async initUserConfig(){let e=this.command===V.SERVER,t=this.userConfig;if(this.base=t?.build?.base??`/`,e&&f(this.base)&&/^https?:/.test(this.base)){let e=r.cyan(`build.base`);De({text:`本地开发时 ${e} 不应该为外部 Host!`}),process.exit(0)}this.target=t?.target??`pc`,this.pages=t?.pages??{index:{html:this.resolveContext(`index.html`),entry:this.resolveContext(`src/index`)}},this.port=t?.server?.port??await ee(`8080`)}async initBrowserslist(){let e=this.target===`mobile`,t=[`defaults`];e?t.push(`IOS >= 10`,`Chrome >= 56`):t.push(`>0.2%`,`Chrome >= 56`,`Safari >= 10`,`last 2 versions`,`not dead`),this.browserslist=t.join(`,`)}async initOtherConfig(){try{let[e,t]=await Promise.all([P(`react`),P(`vue`)]);this.isVue=t,this.isReact=e}catch{}}joinAssetsDir(...e){let t=this.userConfig?.build?.assetsDir??``;return _(t,...e).replaceAll(`\\`,`/`)}getOutDirPath(){let e=this.userConfig?.build?.outDirName;return f(e)?this.resolveContext(e):this.resolveContext(`dist`)}async createRspackConfig(){let e=this.command===V.SERVER,t=e?`development`:`production`,{userConfig:n,context:r,browserslist:i,pages:a,contextPkg:o,port:s,base:c}=this,l=new K({env:t,mode:this.options.mode}),u=new be({env:t,mode:this.options.mode}),d=new xe({pages:a,enablePages:n?.enablePages}),{entry:f,plugins:p}=d.create(),{env:m,noParse:h}=this.createVueOrReactConfig(),g=l.useDefaultResourceLoader().useDefaultScriptLoader(n?.experiments).useDefaultCssLoader(n?.css).add(n?.loaders).end(),v=u.useDefaultEnvPlugin({extEnv:{...n?.define},frameworkEnv:m,env:this.env}).useCopyPlugin().add(p).add(new Ce).add(this.createSourceMapPlugin()).add(this.createCssExtractPlugin()).add(this.createDoctorPlugin()).add(this.createGzipPlugin()).add(this.createCdnPlugin()).add(this.createModuleFederationPlugin()).add(this.createDependencyCyclePlugin()).add(n?.plugins).end();this.rspackConfig={mode:t,target:[`web`,`es5`,`browserslist:${i}`],context:r,entry:f,resolve:{alias:{"@":this.resolveContext(`src`),...n?.resolve?.alias},extensions:n?.resolve?.extensions||me,modules:[`node_modules`,this.resolveContext(`node_modules`),_e(`node_modules`)]},output:{clean:!0,path:this.getOutDirPath(),publicPath:c,filename:e?`[id].js`:this.joinAssetsDir(`assets/js/[contenthash].js`),chunkLoadingGlobal:`${o?.name||`ikaros`}_chunk`,pathinfo:!1},optimization:this.createOptimization(),stats:`none`,watchOptions:{aggregateTimeout:500,ignored:/node_modules/},module:{rules:g,noParse:h},plugins:v,devServer:{hot:!0,port:s,server:(()=>{let e=n?.server?.https;return e?e===!0?`https`:{type:`https`,options:e}:`http`})(),allowedHosts:`all`,proxy:n?.server?.proxy,historyApiFallback:{rewrites:[{from:RegExp(`^${c}`),to:_(c,`index.html`)}]},headers:{"Access-Control-Allow-Origin":`*`},static:{directory:this.resolveContext(`public`),publicPath:c},client:{logging:`none`,overlay:{errors:!0,warnings:!1,runtimeErrors:!1},webSocketURL:`auto://0.0.0.0:${s}/ws`}},experiments:{css:!0},...this.createCacheConfig()}}createSourceMapPlugin(){let{userConfig:e,command:t}=this,n=t===V.SERVER;if(n)return new i.EvalSourceMapDevToolPlugin({columns:!1,module:!0});if(e?.build?.sourceMap??!1)return new i.SourceMapDevToolPlugin({test:[/.js/,/.mjs/],filename:`[file].map[query]`})}createCssExtractPlugin(){if(this.command!==V.SERVER)return new i.CssExtractRspackPlugin({filename:this.joinAssetsDir(`assets/css/[contenthash].css`),ignoreOrder:!0})}createDoctorPlugin(){if(this.command!==V.SERVER&&this.userConfig?.build?.outReport)return new a}createGzipPlugin(){if(this.command!==V.SERVER&&this.userConfig?.build?.gzip)return new o}createOptimization(){return this.command===V.SERVER?{minimize:!1,removeAvailableModules:!1,removeEmptyChunks:!1,splitChunks:!1}:{minimize:!0,minimizer:[new i.LightningCssMinimizerRspackPlugin,new i.SwcJsMinimizerRspackPlugin],splitChunks:{chunks:`all`,minSize:2e4,minChunks:2,maxAsyncRequests:30,maxInitialRequests:30,cacheGroups:{defaultVendors:{test:/[/\\]node_modules[/\\]/,priority:-10,reuseExistingChunk:!0},default:{minChunks:2,priority:-20,reuseExistingChunk:!0}}}}}createCacheConfig(){if(this.command!==V.SERVER&&this.userConfig?.build?.cache)return{cache:!0,experiments:{cache:{type:`persistent`}}}}createVueOrReactConfig(){return this.isVue?{noParse:/^(vue|vue-router|vuex|vuex-router-sync)$/,env:{__VUE_OPTIONS_API__:!0,__VUE_PROD_DEVTOOLS__:!1,__VUE_PROD_HYDRATION_MISMATCH_DETAILS__:!1}}:this.isReact?{noParse:e=>/(react|react-dom|react-is)\.production\.min\.js$/.test(e),env:{REACT_APP_ENABLE_DEVTOOLS:!1}}:{env:void 0,noParse:void 0}}createCdnPlugin(){let{cdnOptions:e}=this.userConfig??{};if(!(!e||l(e.modules)))return new Ee(e)}createModuleFederationPlugin(){let e=this.userConfig?.moduleFederation;if(e)return c(e)?e.map(e=>new s(e)):new s(e)}createDependencyCyclePlugin(){if(this.command!==V.SERVER&&this.userConfig?.build?.dependencyCycleCheck)return new i.CircularDependencyRspackPlugin({exclude:/node_modules/,failOnError:!1})}createRspackBuilder(e){let{isLive:t=!1}=e||{};return new Promise((e,n)=>{let r=i(this.rspackConfig);if(t){let t=new p(this.rspackConfig.devServer,r);t.startCallback(t=>{if(t)return n(t);e(void 0)});return}let a=``;r.run((t,i)=>{r.close(r=>t||r?(console.error(t||r),n(t||r)):i?.hasErrors()?(a+=`Build failed with errors.
7
+ `,i.toString({chunks:!1,colors:!0}).split(/\r?\n/).forEach(e=>{a+=` ${e}\n`}),n(Error(a))):e(i?.toString({chunks:!1,colors:!0})))})})}};const Q={WEB:`web`},ke=[new t(`-m, --mode <name>`,`Environment variable`),new t(`-p, --platform <type>`,`build platform type`).default(Q.WEB).choices(Object.values(Q))],$=e=>{switch(e.options.platform){case Q.WEB:new Oe(e);break;default:{let e=Object.values(Q).join(`,`);console.error(`No corresponding compilation service was found, platform: ${e}`),process.exit(1)}}},Ae=e=>{let t=e.command(V.SERVER,{isDefault:!0}).description(`Start local develop serve`).action(e=>{$({command:V.SERVER,options:e})}),n=e.command(V.BUILD).description(`Start build`).action(e=>{$({command:V.BUILD,options:e})});for(let e of ke)t.addOption(e),n.addOption(e)},je=e=>e,Me=Number(process.versions.node.split(`.`)[0]);if(Me<18){let e=r.bgRed.white(` ERROR `);console.error(e+` The Node.js version is greater than v18!`),console.log(),process.exit(1)}n.version(M,`-v, --version`),Ae(n),n.parse();export{je as defineConfig};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ikaros-cli/ikaros",
3
- "version": "1.2.0",
3
+ "version": "1.3.1",
4
4
  "description": "",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/",
@@ -41,11 +41,11 @@
41
41
  "npm": ">=9.5.0"
42
42
  },
43
43
  "dependencies": {
44
- "@module-federation/enhanced": "^0.8.12",
45
- "@rsdoctor/rspack-plugin": "^0.4.13",
46
- "@rspack/core": "^1.3.8",
47
- "@rspack/dev-server": "^1.1.1",
48
- "@swc/core": "^1.11.24",
44
+ "@module-federation/enhanced": "^0.14.3",
45
+ "@rsdoctor/rspack-plugin": "^1.1.2",
46
+ "@rspack/core": "^1.3.13",
47
+ "@rspack/dev-server": "^1.1.2",
48
+ "@swc/core": "^1.11.29",
49
49
  "chalk": "^5.4.1",
50
50
  "cli-cursor": "^5.0.0",
51
51
  "commander": "^13.1.0",
@@ -54,25 +54,23 @@
54
54
  "detect-port": "^2.1.0",
55
55
  "dotenv": "^16.5.0",
56
56
  "easy-table": "^1.2.0",
57
- "esbuild": "^0.21.5",
58
57
  "fs-extra": "^11.3.0",
59
58
  "glob": "^10.4.5",
60
- "inquirer": "^9.3.7",
61
- "less-loader": "^12.2.0",
59
+ "less-loader": "^12.3.0",
62
60
  "minimist": "^1.2.8",
63
61
  "ora": "^8.2.0",
64
62
  "picocolors": "^1.1.1",
65
63
  "pretty-bytes": "^6.1.1",
66
- "radashi": "^12.4.0",
64
+ "radashi": "^12.5.1",
67
65
  "sass-loader": "^16.0.5",
68
66
  "stylus-loader": "^8.1.1",
69
67
  "vue-style-loader": "^4.1.3",
70
- "yaml": "^2.7.1",
71
- "zod": "^3.24.3"
68
+ "yaml": "^2.8.0",
69
+ "zod": "^3.25.48"
72
70
  },
73
71
  "devDependencies": {
74
72
  "@types/fs-extra": "^11.0.4",
75
73
  "@types/minimist": "^1.2.5",
76
- "vitest": "^3.1.2"
74
+ "vitest": "^3.2.0"
77
75
  }
78
- }
76
+ }