@ikaros-cli/ikaros 1.4.0 → 2.0.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/dist/index.d.mts CHANGED
@@ -1,4 +1,3 @@
1
- import { LoggerSystem } from "@ikaros-cli/infra-contrlibs";
2
1
  import * as _rspack_core0 from "@rspack/core";
3
2
  import { DefinePluginOptions, LightningcssLoaderOptions, Loader, ModuleFederationPluginOptions, Plugin } from "@rspack/core";
4
3
  import * as _rspack_dev_server0 from "@rspack/dev-server";
@@ -11,9 +10,9 @@ interface ImportMetaBaseEnv {
11
10
  /** 路径前缀 */
12
11
  BASE?: string;
13
12
  /** 平台 */
14
- PLATFORM: "web";
13
+ PLATFORM: 'web';
15
14
  }
16
- interface ImportMetaEnv {}
15
+ type ImportMetaEnv = Record<string, any>;
17
16
  interface ImportMeta {
18
17
  readonly env: Readonly<ImportMetaEnv & ImportMetaBaseEnv>;
19
18
  }
@@ -35,9 +34,9 @@ interface CssLoaderOptions {
35
34
  stylus?: Record<string, any>;
36
35
  }
37
36
  //#endregion
38
- //#region src/node/utils/loaders-plugins-helper.d.ts
37
+ //#region src/node/utils/loader-plugin-helper.d.ts
39
38
  type RspackExperiments = {
40
- import: Record<string, any>[];
39
+ import: Record<string, unknown>[];
41
40
  };
42
41
  type Pages = {
43
42
  [key: string]: {
@@ -47,7 +46,7 @@ type Pages = {
47
46
  options?: {
48
47
  title: string;
49
48
  inject: boolean;
50
- meta: Record<string, any>;
49
+ meta: Record<string, string>;
51
50
  };
52
51
  };
53
52
  };
@@ -70,8 +69,6 @@ interface CdnPluginOptions {
70
69
  prodUrl?: string;
71
70
  devUrl?: string;
72
71
  crossOrigin?: boolean | string;
73
- sri?: boolean;
74
- useLocal?: boolean;
75
72
  }
76
73
  //#endregion
77
74
  //#region src/node/user-config.d.ts
@@ -88,21 +85,6 @@ interface UserConfig {
88
85
  * @future 该功能受限,目前仅支持 'pc'
89
86
  */
90
87
  target?: 'pc' | 'mobile';
91
- /**
92
- * 编译的引擎
93
- * @default 'rspack'
94
- * @see {@link https://rspack.dev/zh/guide/introduction}
95
- * @see {@link https://webpack.js.org/}
96
- * @see {@link https://vitejs.dev/}
97
- * @warning 该值会影响编译的速度和兼容性,建议使用 rspack
98
- */
99
- engine?: 'rspack' | 'vite';
100
- /**
101
- * 编译的平台
102
- * @default 'web'
103
- * @description web: 浏览器端 desktop: 桌面端(基于electron)
104
- */
105
- platform?: 'web' | 'desktop';
106
88
  /**
107
89
  * 页面配置
108
90
  * @default
@@ -115,19 +97,10 @@ interface UserConfig {
115
97
  */
116
98
  pages?: Pages;
117
99
  /**
118
- * @description 可选页面启动,当pages为多个对象时,可选择启动哪些页面
100
+ * 可选页面启动,当pages为多个对象时,可选择启动哪些页面,当设置为false或者不设置时,启动所有页面
119
101
  * @default false
120
102
  */
121
103
  enablePages?: string[] | false;
122
- /**
123
- * @description 编译时规范检查,一般建议让IDE去做这个工作,关闭该选项以节省构建时间 true:检查错误 false:关闭检查 fix:检查且修复 error:检查错误当出现错误时退出构建
124
- * @default false
125
- */
126
- eslint?: boolean | 'fix' | 'error';
127
- /**
128
- *
129
- */
130
- stylelint?: boolean | 'fix' | 'error';
131
104
  /**
132
105
  * 全局变量
133
106
  * @default {}
@@ -187,9 +160,9 @@ interface UserConfig {
187
160
  /**
188
161
  * css loader 配置
189
162
  * @see {@link lightningcssOptions https://rspack.dev/zh/guide/features/builtin-lightningcss-loader#%E9%80%89%E9%A1%B9}
190
- * @see {@link https://webpack.js.org/loaders/stylus-loader/#options}
191
- * @see {@link https://webpack.js.org/loaders/less-loader/#options}
192
- * @see {@link https://webpack.js.org/loaders/sass-loader/#options}
163
+ * @see {@link stylusOptions https://webpack.js.org/loaders/stylus-loader/#options}
164
+ * @see {@link lessOptions https://webpack.js.org/loaders/less-loader/#options}
165
+ * @see {@link sassOptions https://webpack.js.org/loaders/sass-loader/#options}
193
166
  */
194
167
  css?: CssLoaderOptions;
195
168
  /**
@@ -231,12 +204,6 @@ interface UserConfig {
231
204
  * @default false
232
205
  */
233
206
  cache?: boolean;
234
- /**
235
- * 默认最大chunk数量
236
- * @see {@link https://rspack.dev/zh/plugins/webpack/limit-chunk-count-plugin}
237
- * @default false
238
- */
239
- maxChunks?: false | number;
240
207
  /**
241
208
  * 是否开启循环依赖检查
242
209
  */
@@ -255,15 +222,14 @@ interface UserConfig {
255
222
  /**
256
223
  * 默认后缀
257
224
  * @see {@link https://webpack.js.org/configuration/resolve/#resolveextensions}
258
- * @default ['.js', '.mjs', '.ts', '.tsx', '.vue']
259
- * @warning 此处将会覆盖默认配置,如果你想保留默认配置添加默认配置即可
225
+ * @default [".js", ".json", ".wasm",'.mjs', '.jsx', '.ts', '.tsx']
260
226
  */
261
227
  extensions?: string[];
262
228
  };
263
229
  }
264
230
  type ConfigEnvPre = Readonly<{
265
231
  mode: string;
266
- env: ImportMeta['env'];
232
+ env: Omit<ImportMeta['env'], 'BASE'>;
267
233
  command: Command;
268
234
  }>;
269
235
  type UserConfigFn<C> = (envPre: ConfigEnvPre) => C | Promise<C>;
package/dist/index.mjs CHANGED
@@ -1,6 +1,7 @@
1
- import e from"node:module";import{Option as t,program as n}from"commander";import r,{join as i}from"path";import a from"node:fs";import o from"node:fs/promises";import s from"fs-extra";import{config as c}from"dotenv";import{LoggerQueue as l,LoggerSystem as u,transformCode as d}from"@ikaros-cli/infra-contrlibs";import f,{dirname as ee,extname as p,join as m,resolve as h}from"node:path";import g,{pathToFileURL as _}from"node:url";import{parse as te}from"yaml";import{isArray as v,isEmpty as y,isFunction as b,isObject as x,isString as S}from"radashi";import{detect as ne}from"detect-port";import C from"chalk";import{rspack as w}from"@rspack/core";import{RsdoctorRspackPlugin as re}from"@rsdoctor/rspack-plugin";import ie from"compression-webpack-plugin";import ae from"eslint-webpack-plugin";import oe from"stylelint-webpack-plugin";import{RspackDevServer as se}from"@rspack/dev-server";import T from"fs/promises";import{z as E}from"zod";import ce from"ora";import le from"node:os";import D from"pretty-bytes";import ue from"easy-table";import de from"cli-cursor";import O from"node:process";import{ModuleFederationPlugin as k}from"@module-federation/enhanced/rspack";var fe=`@ikaros-cli/ikaros`,A=`1.4.0`;const j=e=>e?i(M,`env`,`.env.${e}`):i(M,`env`,`.env`),pe=async e=>{let{emitEvent:t}=l(),{warning:n}=new u,r=await s.pathExists(i(M,`env`));if(!r)return t(n({text:`env folder not found`,onlyText:!0})),!1;if(e){let r=await s.pathExists(j(e));if(!r)return t(n({text:`.env.${e} file not found`,onlyText:!0})),!1}else{let e=await s.pathExists(j());return e?!0:(t(n({text:`.env file not found`,onlyText:!0})),!1)}return!0},M=process.cwd(),N=async e=>{let t=await pe(e);return t?e?c({quiet:!1,path:j(e)}).parsed??{}:c({quiet:!1,path:j()}).parsed??{}:{}};async function me(e,t){let{code:n}=await d(e,{lang:t?`ts`:`js`});return{code:n}}async function P(e,t){let n=`${e}.timestamp-${Date.now()}-${Math.random().toString(16).slice(2)}`,r=`${n}.mjs`,i=`${_(n)}.mjs`;await o.writeFile(r,t);try{let e=await import(i);return e.default}finally{await o.unlink(r)}}async function F(e,t){let{code:n}=await me(e,t);return P(e,n)}const I=new Map;I.set(`.mjs`,async e=>{let t=_(e),n=await import(t.href);return n.default}),I.set(`.ts`,async e=>await F(e,!0)),I.set(`.json`,async e=>await s.readJson(e)),I.set(`.yaml`,async e=>{let t=await o.readFile(e,`utf8`);return te(t)});async function L({configFile:e}){let t,n=process.cwd(),r=`ikaros.config`,i=[`ts`,`mjs`,`json`,`yaml`].map(e=>`${m(n,r)}.${e}`),a=await Promise.all(i.map(e=>s.pathExists(e))),o=a.findIndex(Boolean);if(!(o<0)){if(t=p(i[o]),n=h(n,`${r}${t}`),e&&(n=ee(e),t=p(e)),!I.has(t))throw Error(`No configuration file ! `);return{filePath:n,config:await I.get(t)(n)}}}let R=function(e){return e.SERVER=`server`,e.BUILD=`build`,e}({});var z=class{command;context;options;contextRequire;_env;configFile;logger=new u;version=A;set env(e){this._env=e}get env(){return this._env}_contextPkg;set contextPkg(e){this._contextPkg=e}get contextPkg(){return this._contextPkg}constructor(t){let{command:n,options:r,configFile:a}=t;this.command=n,this.options=r,this.configFile=a,this.context=i(process.cwd(),`./`),this.contextRequire=e.createRequire(this.context)}async initialize(){await this.initContextPkg(),await this.initEnv()}resolveContext(...e){return i(this.context,...e)}async initContextPkg(){let e=this.resolveContext(`package.json`);try{await o.access(e,a.constants.F_OK)}catch{return}let t=await o.readFile(e,{encoding:`utf8`});this.contextPkg=JSON.parse(t)}async initEnv(){let{platform:e,mode:t}=this.options,n={PLATFORM:e,MODE:t},r=await N(t),i=await N(`local`);this.env={...n,...r,...i}}resolveContextModule(e){try{return this.contextRequire.resolve(e)}catch{return}}loadContextModule(e){return this.contextRequire(e)}async getUserConfig(){let{configFile:e}=this,t=await L({configFile:e}),n;if(t){if(b(t.config)){let e={PLATFORM:this.options.platform},r={mode:this.options.mode??``,env:Object.assign(e,this.env),command:this.command};n=await t.config(r)}return x(t.config)&&(n=t.config),n}}watchDogServer(){}};const B=i(process.cwd(),`./`),he=[`...`,`.css`,`.less`,`.sass`,`.scss`,`.mjs`,`.jsx`,`.ts`,`.tsx`,`.node`,`.vue`];i(B,`tsconfig.json`);const V=g.fileURLToPath(new g.URL(`../`,import.meta.url)),ge=e.createRequire(V),_e=(...e)=>i(V,...e),H=(e,t)=>({loader:e.includes(`builtin`)?e:ge.resolve(e),parallel:!e.includes(`sass`),options:t}),ve=(e,t)=>{let{lightningcss:n,sourceMap:r}=t??{},i=H(`builtin:lightningcss-loader`,{...n}),a=(e,n)=>{let a=[i],o=t&&t[`${e}`];return e&&e!==`css`&&a.push(H(`${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`}))},U=(e,t)=>{for(let n in t)e[n]=x(t[n])&&n in e?U(e[n],t[n]):t[n];return e};async function W(e){try{let t=i(process.cwd(),`node_modules`,e);return await T.access(t,T.constants.F_OK),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}}E.object({target:E.enum([`pc`,`mobile`]).optional().default(`pc`),pages:E.custom().optional(),enablePages:E.union([E.array(E.string())]).optional(),moduleFederation:E.union([E.custom(),E.array(E.custom())]).optional(),plugins:E.union([E.custom(),E.array(E.custom())]).optional(),loaders:E.array(E.custom()).optional(),experiments:E.custom().optional(),cdnOptions:E.custom().optional(),server:E.object({port:E.number().int().min(1024).max(65535).optional(),proxy:E.custom().optional(),https:E.union([E.boolean(),E.record(E.string(),E.any())]).optional().default(!1)}).optional(),css:E.object({lightningcssOptions:E.record(E.string(),E.any()).optional(),sourceMap:E.boolean().optional(),lessOptions:E.record(E.string(),E.any()).optional(),sassOptions:E.record(E.string(),E.any()).optional(),stylusOptions:E.record(E.string(),E.any()).optional()}).optional(),build:E.object({base:E.string().optional().default(`/`),assetsDir:E.string().optional(),gzip:E.boolean().optional().default(!1),sourceMap:E.boolean().optional().default(!1),outDirName:E.string().optional().default(`dist`),outReport:E.boolean().optional().default(!1),cache:E.boolean().optional().default(!1),dependencyCycleCheck:E.boolean().optional().default(!1)}).optional(),resolve:E.object({alias:E.record(E.string(),E.string()).optional(),extensions:E.array(E.string()).optional()}).optional()});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 v(e)?this.list=this.list.concat(e):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})}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}},xe=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(Ce({frameworkEnv:t,extEnv:n,env:r})),this}useCopyPlugin(){return this.env===`production`&&this.add(new w.CopyRspackPlugin({patterns:[{context:i(B,`public`),from:`./`,noErrorOnMissing:!0,globOptions:{ignore:[`**/index.html`,`.*`]}}]})),this}useHtmlPlugin(e){return this.add(new w.HtmlRspackPlugin({template:e??i(B,`index.html`)})),this}},Se=class{pages;enablePages;logger=l();loggerSystem=new u;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 w.HtmlRspackPlugin({template:this.pages[n].html,filename:`${n}.html`,chunks:[n],scriptLoading:`blocking`,...this.pages[n].options}))}),{entry:e,plugins:t}}getEnablePages(){if(!y(this.pages)&&v(this.enablePages)){let e={},t=[];if(this.enablePages.forEach(n=>{this.pages[n]?e[n]=this.pages[n]:t.push(n)}),t.length&&this.logger.emitEvent(this.loggerSystem.warning({text:`当前设置页面${t.join()}不存在`,onlyText:!0})),y(e))return;this.pages=e}}};const Ce=({frameworkEnv:e={},extEnv:t={},env:n={}})=>{let r=Object.assign({},U(t,n)),i=Object.fromEntries(Object.entries(r).map(([e,t])=>[`import.meta.env.${e}`,JSON.stringify(t)])),a=Object.fromEntries(Object.entries({...i,...e,"import.meta.env":JSON.stringify({})}).map(([e,t])=>[e,t]));return new w.DefinePlugin(a)},K={name:fe,version:A},q=`@rspack/ikaros-stats-plugin`,J=C.hex(`#222222`);var we=class{compiler;ora;config;startCompileHrtime=void 0;isDev;lastProgressText;constructor(e){this.config=e,this.ora=ce({color:`cyan`,prefixText:``,hideCursor:!1})}apply(e){this.compiler=e,this.isDev=e.options.mode===`development`,new w.ProgressPlugin(this.progressHandler.bind(this)).apply(e),de.hide(),this.isDev?this.initDevHook():this.initProdHook()}progressHandler(e,t,...n){let r=`${(e*100).toFixed(2)}%`;r+=` ${t} `,r+=C.gray(n?.join(` `)),this.lastProgressText!==r&&(this.lastProgressText=r,this.isDev?this.ora.text=`${r}\n`:console.log(r))}updateStartCompileTime(){this.startCompileHrtime=O.hrtime()}getCurrentEndCompileTime(){let e=O.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=>`${J.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{isFunction as c,isString as l}from"es-toolkit";import{isArray as u,isEmpty as d,isObject as f}from"es-toolkit/compat";import{RspackDevServer as p}from"@rspack/dev-server";import m,{dirname as h,extname as g,join as _,resolve as ee}from"node:path";import{detect as te}from"detect-port";import v,{join as y}from"path";import ne from"node:fs";import b,{readFile as 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 re}from"yaml";import E from"fs-extra";import{transform as ie}from"oxc-transform";import{config as D}from"dotenv";import ae from"ora";import oe from"node:os";import O from"pretty-bytes";import se from"easy-table";import ce from"cli-cursor";import k from"node:process";var le=`@ikaros-cli/ikaros`,A=`2.0.0`;const j=(e,t)=>{for(let n in t)e[n]=f(t[n])&&n in e?j(e[n],t[n]):t[n];return e};async function M(e){try{let t=y(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 N=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 ue(e,t){let n=e,r=await x(e,`utf-8`),{code:i,errors:a}=ie(n,r,{lang:t?`ts`:`js`});if(a.length>0)throw Error(`Transformation failed: `+a.map(e=>e.message).join(`, `));return{code:i}}async function de(e,t){let n=`${e}.timestamp-${Date.now()}-${Math.random().toString(16).slice(2)}`,r=`${n}.mjs`,i=`${T(n)}.mjs`;await b.writeFile(r,t);try{return(await import(i)).default}finally{await b.unlink(r)}}async function fe(e,t=!1){let{code:n}=await ue(e,t);return de(e,n)}const P=new Map;P.set(`.mjs`,async e=>(await import(T(e).href)).default),P.set(`.ts`,async e=>await fe(e,!0)),P.set(`.json`,async e=>await E.readJson(e)),P.set(`.yaml`,async e=>{let t=await b.readFile(e,`utf8`);return re(t)});async function pe({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)))).findIndex(Boolean);if(!(a<0)){if(t=g(i[a]),n=ee(n,`${r}${t}`),e&&(n=h(e),t=g(e)),!P.has(t))throw Error(`No configuration file ! `);return P.get(t)(n)}}const F=[],I=()=>{let e=(e,t)=>({DONE:r.bgGreen.white,ERROR:r.bgRed.white,OKAY:r.bgBlue.white,WARNING:r.bgYellow.white,INFO:r.bgCyan.white})[e](` ${e} `)+` ${t}`;return{done:({text:t,onlyText:n})=>{if(n)return e(`DONE`,t);console.log(e(`DONE`,t))},error:({text:t,onlyText:n})=>{if(n)return e(`ERROR`,t);console.error(e(`ERROR`,t))},okay:({text:t,onlyText:n})=>{if(n)return e(`OKAY`,t);console.log(e(`OKAY`,t))},warning:({text:t,onlyText:n})=>{if(n)return e(`WARNING`,t);console.warn(e(`WARNING`,t))},info:({text:t,onlyText:n})=>{if(n)return e(`INFO`,t);console.info(e(`INFO`,t))},emitEvent:e=>{let t=new Date().toLocaleTimeString(`en-US`,{hour12:!1}).split(` `)[0];F.push(`[${t}] ${e}`)},clearEventArray:()=>{F.length=0},eventArray:F}},L=e=>e?y(z,`env`,`.env.${e}`):y(z,`env`,`.env`),R=async e=>{let{warning:t,emitEvent:n}=I();if(!await E.pathExists(y(z,`env`)))return n(t({text:`env folder not found`,onlyText:!0})),!1;if(e){if(!await E.pathExists(L(e)))return n(t({text:`.env.${e} file not found`,onlyText:!0})),!1}else return await E.pathExists(L())?!0:(n(t({text:`.env file not found`,onlyText:!0})),!1);return!0},z=process.cwd(),B=async e=>await R(e)?e?D({path:L(e)}).parsed??{}:D({path:L()}).parsed??{}:{};let V=function(e){return e.SERVER=`server`,e.BUILD=`build`,e}({});var me=class{set env(e){this._env=e}get env(){return this._env}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=y(process.cwd(),`./`),this.contextRequire=e(this.context),this.initialize()}async initialize(){await this.initContextPkg(),await this.initEnv(),this.startCompile()}resolveContext(...e){return y(this.context,...e)}async initContextPkg(){let e=this.resolveContext(`package.json`);try{await b.access(e,ne.constants.F_OK)}catch{return}this.contextPkg=JSON.parse(await b.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 pe({configFile:e});if(t){if(c(t)){let e={PLATFORM:this.options.platform},n={mode:this.options.mode??``,env:Object.assign(e,this.env),command:this.command};return N.parse(await t(n))}if(f(t))return N.parse(void 0)}}startCompile(){switch(this.command){case V.SERVER:this.dev?.();break;case V.BUILD:this.build?.();break;default:break}}};const H=y(process.cwd(),`./`),he=[`...`,`.mjs`,`.jsx`,`.ts`,`.tsx`];y(H,`tsconfig.json`);const U=w.fileURLToPath(new w.URL(`../`,import.meta.url)),ge=e(U),_e=(...e)=>y(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&&(u(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?ts$/i,loader:`builtin:swc-loader`,options:{jsc:{parser:{syntax:`typescript`}}},type:`javascript/auto`,exclude:[y(H,`node_modules`)]},{test:/\.m?js$/i,loader:`builtin:swc-loader`,options:{isModule:`unknown`,rspackExperiments:e},type:`javascript/auto`,exclude:[y(H,`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 ye(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}},xe=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(Ce({frameworkEnv:t,extEnv:n,env:r})),this}useCopyPlugin(){return this.env===`production`&&this.add(new i.CopyRspackPlugin({patterns:[{context:y(H,`public`),from:`./`,noErrorOnMissing:!0,globOptions:{ignore:[`**/index.html`,`.*`]}}]})),this}useHtmlPlugin(e){return this.add(new i.HtmlRspackPlugin({template:e??y(H,`index.html`)})),this}},Se=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 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}=I();if(!d(this.pages)&&u(this.enablePages)){let n={},r=[];if(this.enablePages.forEach(e=>{this.pages[e]?n[e]=this.pages[e]:r.push(e)}),d(r)&&t(e({text:`当前设置页面${r.join()}不存在`,onlyText:!0})),d(n))return;this.pages=n}}};const Ce=({frameworkEnv:e={},extEnv:t={},env:n={}})=>{let r=Object.assign({},j(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)},K={name:le,version:A},q=`@rspack/ikaros-stats-plugin`,J=r.hex(`#222222`);var Y=class{constructor(e){this.startCompileHrtime=void 0,this.userConfig=e,this.ora=ae({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),ce.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=k.hrtime()}getCurrentEndCompileTime(){let e=k.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=>`${J.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=>`${J.bgYellow(` WARN `)} ${e.message.trim()}`).join(`
4
4
 
5
- `)}getEndTips(e,t){let{gray:n,cyan:r,red:i,green:a,yellow:o}=C,{errorsCount:s=-1,warningsCount:c=-1}=e,l=(t/1e3).toFixed(2);return n(s>0?`${r(K.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 ue,r=this.config?.gzip??!1,i=0,a=0,o=!1,s=0,c;for(let e=0;e<t.length;e++){let{name:l,size:u,related:d,info:f}=t[e];if(!f.development){if(r&&v(d)&&(c=d.find(e=>e.type===`gzipped`),c&&(s=c.size,a+=s)),i+=u,t.length>20&&e>=4&&e<t.length-1-4){o||(o=!0,n.cell(`name`,`....`),n.cell(`size`,`....`),r&&c&&n.cell(`gzip`,`....`),n.newRow());continue}n.cell(`name`,l),n.cell(`size`,D(u)),r&&c&&n.cell(`gzip`,D(s)),n.newRow()}}return n.pushDelimeter(),n.cell(`name`,`There are ${t.length} files`),n.cell(`size`,D(i)),r&&c&&n.cell(`gzip`,D(a)),n.newRow(),C.cyan.dim(n.toString().trim())}getHostList(){let{config: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(le.networkInterfaces());if(e){o=e.base??``,(!o||o===`auto`)&&(o=`/`);let t=Object.keys(e?.pages||{})[0];t&&t!==`index`?o=f.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:r,cyan:i,gray:a}=C;e.hooks.environment.intercept({name:q,call(){t.start(`Preparing resource files....`)}}),e.hooks.watchRun.intercept({name:q,call:()=>{t.isSpinning||console.clear(),t.start(),this.updateStartCompileTime()}}),e.hooks.done.intercept({name:q,call:e=>{t.stop(),console.clear();let{eventArray:o}=l(),s=e.toJson({preset:`errors-warnings`,colors:!0,timings:!0}),{errorsCount:c=0,warningsCount:u=0}=s;if(o.length>0&&(console.log(o.map(e=>e).join(`
6
- `)),console.log()),c>0)console.log(this.getError(s)),console.log();else{u>0&&(console.log(this.getWarn(s)),console.log());let{name:e,version:t}=K,o=`${i(`${e} v${t}`)} entry address:\n\n`;for(let e of n)o+=r(` ${e}\n`);console.log(a(o))}console.log(this.getEndTips(s,this.getCurrentEndCompileTime())),console.log()}})}initProdHook(){let{compiler:e}=this,t,n=!1;e.hooks.environment.intercept({name:q,call:()=>{console.log(C.gray(`start build...`)),this.updateStartCompileTime()}}),e.hooks.failed.intercept({name:q,call:()=>{n=!0,console.log(C.red(`build failed`)),console.clear()}}),e.hooks.done.intercept({name:q,call:e=>{t=e.toJson({preset:`normal`,colors:!0,assetsSort:`size`}),this.handleProOutput(t,n)}})}handleProOutput(e,t){if(t)return;console.clear();let{errorsCount:n=0,warningsCount:r=0}=e;console.log(),n>0?(console.log(this.getError(e)),console.log()):(r>0&&(console.log(this.getWarn(e)),console.log()),e&&console.log(this.getTableInfo(e)),console.log()),console.log(this.getEndTips(e,this.getCurrentEndCompileTime()))}};const Y=`@rspack/ikaros-cdn-plugin`,Te=`https://unpkg.com/:name@:version/:path`,Ee=`:name/:path`,X=/:([a-z]+)/gi;var De=class{compiler;options;isDev=!1;logger=l();loggerSystem=new u;constructor(e){this.options={prodUrl:Te,devUrl:Ee,crossOrigin:!1,sri:!1,useLocal:!1,...e}}apply(e){this.compiler=e,this.isDev=e.options.mode===`development`,!this.options.useLocal&&this.handleExternals(),e.hooks.compilation.tap(Y,e=>{let t=w.HtmlRspackPlugin.getCompilationHooks(e);t.beforeAssetTagGeneration.tapAsync(Y,(e,t)=>{if(e.plugin.options.meta&&!y(e.plugin.options.meta.assetsLoadFilePath)&&!this.isDev)return e.assets.js=this.removeChunkJs(e),t(null,e);t(null,e)}),t.alterAssetTags.tapAsync(Y,(e,t)=>{try{!this.options.useLocal&&this.injectResources(e),t(null,e)}catch(e){t(e)}}),t.beforeEmit.tapAsync(Y,async(e,t)=>{if(e.plugin.options.meta&&!y(e.plugin.options.meta.assetsLoadFilePath)&&!this.isDev){let n=e.plugin.options.meta.assetsLoadFilePath??``;return e.html=this.removeLink(e),e.html=await this.inlineJs(n,e),t(null,e)}t(null,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(X)?n.replace(X,(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.createRequire(r.join(process.cwd(),`node_modules`))(r.join(t,`package.json`)).version}catch{return this.logger.emitEvent(this.loggerSystem.warning({text:`[${Y}] 无法获取模块 "${t}" 的版本信息,回退到 "latest"`,onlyText:!0})),`latest`}}removeChunkJs(e){let t=this.options.modules,n=t.filter(e=>!e.cssOnly).flatMap(e=>this.getScripts(e));return!e?.assets||!e.assets.js?[]:e.assets.js.filter(e=>n.includes(e))}removeLink(e){return e.html.replace(/<link(.*?)>/g,``)}async inlineJs(e,t){if(!a.existsSync(e))return t.html.toString();let{code:n}=await this.compiler.rspack.experiments.swc.minify(a.readFileSync(e,`utf-8`)||``,{ecma:5,compress:{drop_console:!0,drop_debugger:!0}}),r=`<script>${n}<\/script>`,i=t.html.toString();return i.replace(RegExp(`</body>`,`g`),`</body>`+r)}},Oe=class{devServer;resolvedContext;browserslist;base;userConfig;pages;port;logger=new u;isVue=!1;isReact=!1;constructor(e){this.resolvedContext=e,this.browserslist=e.browserslist??`defaults`,this.base=e.base,this.userConfig=e.userConfig,this.pages=e.pages,this.port=e.port}joinAssetsDir(...e){let t=this.userConfig?.build?.assetsDir??``;return m(t,...e).replaceAll(`\\`,`/`)}getOutDirPath(){let e=this.userConfig?.build?.outDirName;return S(e)?this.resolvedContext.resolveContext(e):this.resolvedContext.resolveContext(`dist`)}async initOtherConfig(){try{let[e,t]=await Promise.all([W(`react`),W(`vue`)]);this.isVue=t,this.isReact=e}catch{}}},Z=class extends Oe{createSourceMapPlugin(){let e=this.resolvedContext.command===R.SERVER;if(e)return new w.EvalSourceMapDevToolPlugin({columns:!1,module:!0});if(this.userConfig?.build?.sourceMap??!1)return new w.SourceMapDevToolPlugin({test:[/.js/,/.mjs/],filename:`[file].map[query]`})}createEslintPlugin(){let e=this.userConfig?.eslint||!1,t=this.userConfig?.stylelint||!1,n=this.resolvedContext.command===R.SERVER,r=[];return e&&r.push(new ae({context:this.resolvedContext.context,eslintPath:this.resolvedContext.resolveContext(`node_modules/eslint`),extensions:[`js`,`vue`,`ts`,`tsx`],fix:e===`fix`,cache:!0,threads:!0,lintDirtyModulesOnly:n,failOnError:!1,failOnWarning:!1})),t&&r.push(new oe({context:this.resolvedContext.context,extensions:[`css`,`scss`,`less`,`vue`],fix:t===`fix`,cache:!0,threads:!0,lintDirtyModulesOnly:n,failOnError:!1,failOnWarning:!1})),r}createDoctorPlugin(){if(this.resolvedContext.command!==R.SERVER&&this.userConfig?.build?.outReport)return new re}createGzipPlugin(){if(this.resolvedContext.command!==R.SERVER&&this.userConfig?.build?.gzip)return new ie}createOptimization(){return this.resolvedContext.command===R.SERVER?{minimize:!1,removeEmptyChunks:!1,splitChunks:!1}:{minimize:!0,splitChunks:{chunks:`async`,minSize:2e4,minChunks:2,cacheGroups:{defaultVendors:{name:`chunk-vendors`,test:/[\\/]node_modules[\\/]/,priority:-10,reuseExistingChunk:!0,chunks:`initial`},default:{name:`chunk-common`,minChunks:2,priority:-20,reuseExistingChunk:!0,chunks:`initial`}}}}}createCacheConfig(){if(this.resolvedContext.command!==R.SERVER&&this.userConfig?.build?.cache)return{cache:!0,experiments:{cache:{type:`persistent`}}}}createCdnPlugin(){let{cdnOptions:e}=this.userConfig??{};if(!(!e||y(e.modules)))return new De(e)}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}}createModuleFederationPlugin(){let e=this.userConfig?.moduleFederation;if(e)return v(e)?e.map(e=>new k(e)):new k(e)}createLimitChunksPlugin(){if(this.resolvedContext.command===R.SERVER||!this.userConfig?.build?.maxChunks)return;let e=this.userConfig?.build?.maxChunks??1;return(typeof e==`boolean`&&!e||e<1)&&(e=1),new w.optimize.LimitChunkCountPlugin({maxChunks:e})}createDependencyCyclePlugin(){if(this.resolvedContext.command!==R.SERVER&&this.userConfig?.build?.dependencyCycleCheck)return new w.CircularDependencyRspackPlugin({exclude:/node_modules/,failOnError:!1})}async createRspackConfig(){let e=this.resolvedContext.command===R.SERVER,t=e?`development`:`production`,n=new be({env:t,mode:this.resolvedContext.options.mode}),r=new xe({env:t,mode:this.resolvedContext.options.mode}),i=new Se({pages:this.pages,enablePages:this.userConfig?.enablePages}),{entry:a,plugins:o}=i.create(),{env:s,noParse:c}=this.createVueOrReactConfig(),l=n.useDefaultResourceLoader().useDefaultScriptLoader(this.userConfig?.experiments).useDefaultCssLoader(this.userConfig?.css).add(this.userConfig?.loaders).end(),u=r.useDefaultEnvPlugin({extEnv:{CLI_VER:this.resolvedContext.version,frameworkEnv:s,...this.userConfig?.define},frameworkEnv:{__VUE_OPTIONS_API__:!0,__VUE_PROD_DEVTOOLS__:!1,__VUE_PROD_HYDRATION_MISMATCH_DETAILS__:!1},env:this.resolvedContext.env}).useCopyPlugin().add(o).add(new we({pages:this.pages,base:this.base,gzip:this.userConfig?.build?.gzip??!1})).add(this.createSourceMapPlugin()).add(this.createDoctorPlugin()).add(this.createGzipPlugin()).add(this.createCdnPlugin()).add(this.createModuleFederationPlugin()).add(this.createEslintPlugin()).add(this.createLimitChunksPlugin()).add(this.createDependencyCyclePlugin()).add(this.userConfig?.plugins).end();return{mode:t,target:[`web`,`es5`,`browserslist:${this.browserslist}`],context:this.resolvedContext.context,entry:a,resolve:{alias:{"@":this.resolvedContext.resolveContext(`src`),...this.userConfig?.resolve?.alias},extensions:this.userConfig?.resolve?.extensions||he,modules:[`node_modules`,this.resolvedContext.resolveContext(`node_modules`),_e(`node_modules`)]},output:{clean:!0,path:this.getOutDirPath(),publicPath:this.base,filename:e?`[id].js`:this.joinAssetsDir(`assets/js/[name].[contenthash].js`),chunkLoadingGlobal:`${this.resolvedContext.contextPkg?.name||`ikaros`}_chunk`,pathinfo:!1},optimization:this.createOptimization(),stats:`none`,watchOptions:{aggregateTimeout:500,ignored:/node_modules/},module:{rules:l,noParse:c},plugins:u,devServer:{hot:!0,port:this.port,server:(()=>{let e=this.userConfig?.server?.https;return e?e===!0?`https`:{type:`https`,options:e}:`http`})(),allowedHosts:`all`,proxy:this.userConfig?.server?.proxy,historyApiFallback:{rewrites:[{from:RegExp(`^${this.base}`),to:m(this.base,`index.html`)}]},headers:{"Access-Control-Allow-Origin":`*`},static:{directory:this.resolvedContext.resolveContext(`public`),publicPath:this.base},client:{logging:`none`,overlay:{errors:!0,warnings:!1,runtimeErrors:!1},webSocketURL:`auto://0.0.0.0:${this.port}/ws`}},experiments:{css:!0,lazyCompilation:!0,parallelLoader:!0,incremental:!0},...this.createCacheConfig()}}async createRspackBuilder({isLive:e,config:t}){return new Promise((n,r)=>{let i=w(t);if(e){this.devServer=new se(t.devServer,i),this.devServer.startCallback(e=>{if(e)return r(e);n(void 0)});return}i.run((e,t)=>{i.close(r=>((e||r)&&process.exit(2),t?.hasErrors()&&(this.logger.error({text:`Build failed with errors.`}),process.exit(2)),n(t?.toString({timings:!0,colors:!0}))))})})}async restartServer(){if(this.devServer){await this.devServer.stop();let e=await this.createRspackConfig();await this.createRspackBuilder({isLive:!0,config:e})}}async serve(){let e=await this.createRspackConfig();await this.createRspackBuilder({isLive:!0,config:e})}async build(){let e=await this.createRspackConfig();await this.createRspackBuilder({config:e})}};const ke={rspack:Z};var Ae=class extends z{userConfig;base;browserslist;isVue=!1;isReact=!1;target;platform;engine=`rspack`;port;pages;async initUserConfig(){let e=this.command===R.SERVER,t=await this.getUserConfig();if(this.userConfig=t,this.base=t?.build?.base??`/`,e&&S(this.base)&&/^https?:/.test(this.base)){let e=C.cyan(`build.base`);throw this.logger.error({text:` 本地开发时 ${e} 不应该为外部 Host!`}),Error(`错误的配置: ${e} 不应为外部 Host`)}this.target=t?.target??`pc`,this.platform=t?.platform??`web`,this.pages=t?.pages??{index:{html:this.resolveContext(`index.html`),entry:this.resolveContext(`src/index`)}},this.port=await ne(t?.server?.port||`8080`),this.engine=t?.engine??`rspack`}async initBrowserslist(){let e=this.target===`mobile`,t=[`defaults`];e?t.push(`IOS >= 10`,`Chrome >= 51`):t.push(`>=0.1%`,`Chrome >= 56`,`Safari >= 10`,`last 2 versions`,`not dead`),this.browserslist=t.join(`,`)}async initOtherConfig(){try{let[e,t]=await Promise.all([W(`react`),W(`vue`)]);this.isVue=t,this.isReact=e}catch{}}async initPreConfig(){return await this.initialize(),await Promise.all([this.initUserConfig(),this.initOtherConfig(),this.initBrowserslist()]),{userConfig:this.userConfig,command:this.command,options:this.options,context:this.context,contextPkg:this.contextPkg,version:this.version,env:this.env,base:this.base,port:this.port,pages:this.pages,browserslist:this.browserslist,resolveContext:this.resolveContext.bind(this)}}async createEngine(){let e=await this.initPreConfig();if(!this.userConfig)throw this.logger.error({text:`用户配置未加载,请检查配置文件。`}),Error(`userConfig is not loaded`);let t=ke[this.engine];if(!t)throw Error(`Unsupported build engine: ${this.engine}`);return new t(e)}async dev(){let e=await this.createEngine();e.serve()}async build(){let e=await this.createEngine();e.build()}};const Q={WEB:`web`},je=[new t(`-m, --mode <name>`,`Environment variable`),new t(`-p, --platform <type>`,`build platform type`).default(Q.WEB).choices(Object.values(Q))],$=async e=>{let{error:t}=new u,n=null;try{switch(e.options.platform){case Q.WEB:n=new Ae(e);break;default:{let n=Object.values(Q).join(`,`);throw t({text:`No corresponding compilation service was found, platform: ${n}`}),Error(`No corresponding compilation service was found, platform: ${e.options.platform}`)}}}catch(e){throw Error(e instanceof Error?e.message:String(e))}return n},Me=e=>{let t=e.command(R.SERVER,{isDefault:!0}).description(`Start local develop serve`).action(async e=>{let t=await $({command:R.SERVER,options:e});t.dev()}),n=e.command(R.BUILD).description(`Start build`).action(async e=>{let t=await $({command:R.BUILD,options:e});t.build()});for(let e of je)t.addOption(e),n.addOption(e)},Ne=e=>e,{error:Pe}=new u,Fe=Number(process.versions.node.split(`.`)[0]);if(Fe<20)throw Pe({text:`The Node.js version is greater than v20!`}),Error(`The Node.js version is greater than v20!`);n.version(A,`-v, --version`),Me(n),n.parse();export{Ne 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(K.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 se,i=this.userConfig?.build?.gzip??!1,a=0,o=0,s=!1;for(let e=0;e<t.length;e++){let{name:r,size:c,related:l,info:d}=t[e];if(d.development)continue;let f=i&&u(l)?l.find(e=>e.type===`gzipped`).size:0;if(a+=c,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(c)),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(oe.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)),new URL(o,e).href)),a}initDevHook(){let{compiler:e,ora:t}=this,n=this.getHostList(),{blue:i,cyan:a,gray:o}=r;e.hooks.environment.intercept({name:q,call(){t.start(`Preparing resource files....`)}}),e.hooks.watchRun.intercept({name:q,call:()=>{t.isSpinning||console.clear(),t.start(),this.updateStartCompileTime()}}),e.hooks.done.intercept({name:q,call:e=>{t.stop(),console.clear();let r=e.toJson({preset:`errors-warnings`,colors:!0}),{eventArray:s}=I(),{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}=K,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:q,call:()=>{console.log(r.gray(`start build...`)),this.updateStartCompileTime()}}),e.hooks.done.intercept({name:q,call:e=>{t=e.toJson({preset:`normal`,colors:!0,assetsSort:`size`})}}),e.cache.hooks.shutdown.intercept({name:q,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`,Z=/:([a-z]+)/gi;var we=class{constructor(e){this.isDev=!1,this.options={prodUrl:`https://unpkg.com/:name@:version/:path`,devUrl:`:name/:path`,crossOrigin:!1,...e}}apply(e){this.compiler=e,this.isDev=e.options.mode===`development`,this.handleExternals(),e.hooks.compilation.tap(X,e=>{i.HtmlRspackPlugin.getCompilationHooks(e).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=>{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(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(v.join(process.cwd(),`node_modules`))(v.join(t,`package.json`)).version}catch{return console.warn(r.yellow(`[${X}] 无法获取模块 "${t}" 的版本信息`)),`latest`}}};const{error:Te}=I();var Ee=class extends me{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=await this.getUserConfig();if(this.userConfig=t,this.base=t?.build?.base??`/`,e&&l(this.base)&&/^https?:/.test(this.base)){let e=r.cyan(`build.base`);Te({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 te(`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([M(`react`),M(`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 l(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 xe({env:t,mode:this.options.mode}),{entry:d,plugins:f}=new Se({pages:a,enablePages:n?.enablePages}).create(),{env:p,noParse:m}=this.createVueOrReactConfig(),h=l.useDefaultResourceLoader().useDefaultScriptLoader(n?.experiments).useDefaultCssLoader(n?.css).add(n?.loaders).end(),g=u.useDefaultEnvPlugin({extEnv:{...n?.define},frameworkEnv:p,env:this.env}).useCopyPlugin().add(f).add(new Y).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:d,resolve:{alias:{"@":this.resolveContext(`src`),...n?.resolve?.alias},extensions:n?.resolve?.extensions||he,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:h,noParse:m},plugins:g,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;if(t===V.SERVER)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||d(e.modules)))return new we(e)}createModuleFederationPlugin(){let e=this.userConfig?.moduleFederation;if(e)return u(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){new p(this.rspackConfig.devServer,r).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`},De=[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 Ee(e);break;default:{let e=Object.values(Q).join(`,`);console.error(`No corresponding compilation service was found, platform: ${e}`),process.exit(1)}}},Oe=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 De)t.addOption(e),n.addOption(e)},ke=e=>e;if(Number(process.versions.node.split(`.`)[0])<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(A,`-v, --version`),Oe(n),n.parse();export{ke as defineConfig};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ikaros-cli/ikaros",
3
- "version": "1.4.0",
3
+ "version": "2.0.0",
4
4
  "description": "",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/",
@@ -36,38 +36,34 @@
36
36
  "npm": ">=9.5.0"
37
37
  },
38
38
  "dependencies": {
39
- "@module-federation/enhanced": "^0.17.1",
40
- "@rsdoctor/rspack-plugin": "^1.1.10",
41
- "@rspack/core": "^1.4.10",
42
- "@rspack/dev-server": "^1.1.3",
43
- "chalk": "^5.4.1",
39
+ "@module-federation/enhanced": "^0.18.4",
40
+ "@rsdoctor/rspack-plugin": "^1.2.3",
41
+ "@rspack/core": "^1.5.2",
42
+ "@rspack/dev-server": "^1.1.4",
43
+ "chalk": "^5.6.2",
44
44
  "cli-cursor": "^5.0.0",
45
45
  "commander": "^14.0.0",
46
46
  "compression-webpack-plugin": "^11.1.0",
47
47
  "css-loader": "^7.1.2",
48
48
  "detect-port": "^2.1.0",
49
- "dotenv": "^17.2.1",
49
+ "dotenv": "^17.2.2",
50
50
  "easy-table": "^1.2.0",
51
- "eslint-webpack-plugin": "^5.0.2",
52
- "fs-extra": "^11.3.0",
51
+ "es-toolkit": "^1.39.10",
52
+ "fs-extra": "^11.3.1",
53
53
  "glob": "^11.0.3",
54
54
  "less-loader": "^12.3.0",
55
- "minimist": "^1.2.8",
56
55
  "ora": "^8.2.0",
56
+ "oxc-transform": "^0.86.0",
57
57
  "picocolors": "^1.1.1",
58
- "pretty-bytes": "^7.0.0",
59
- "radashi": "^12.6.0",
58
+ "pretty-bytes": "^7.0.1",
60
59
  "sass-loader": "^16.0.5",
61
- "stylelint-webpack-plugin": "^5.0.1",
62
- "stylus-loader": "^8.1.1",
60
+ "stylus-loader": "^8.1.2",
63
61
  "vue-style-loader": "^4.1.3",
64
- "yaml": "^2.8.0",
65
- "zod": "^4.0.10",
66
- "@ikaros-cli/infra-contrlibs": "1.4.0"
62
+ "yaml": "^2.8.1",
63
+ "zod": "^4.1.5"
67
64
  },
68
65
  "devDependencies": {
69
66
  "@types/fs-extra": "^11.0.4",
70
- "@types/minimist": "^1.2.5",
71
67
  "vitest": "^3.2.4"
72
68
  },
73
69
  "scripts": {