@ikaros-cli/ikaros 1.3.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin.mjs CHANGED
@@ -1,2 +1,2 @@
1
- #!/usr/bin/env node
2
- import './dist/index.mjs'
1
+ #!/usr/bin/env node
2
+ import './dist/index.mjs'
package/dist/index.d.mts CHANGED
@@ -1,7 +1,8 @@
1
- import * as _rspack_core2 from "@rspack/core";
1
+ import { LoggerSystem } from "@ikaros-cli/infra-contrlibs";
2
+ import * as _rspack_core0 from "@rspack/core";
2
3
  import { DefinePluginOptions, LightningcssLoaderOptions, Loader, ModuleFederationPluginOptions, Plugin } from "@rspack/core";
3
4
  import * as _rspack_dev_server0 from "@rspack/dev-server";
4
- import * as https1 from "https";
5
+ import * as https0 from "https";
5
6
 
6
7
  //#region src/types/env.d.ts
7
8
  interface ImportMetaBaseEnv {
@@ -10,9 +11,9 @@ interface ImportMetaBaseEnv {
10
11
  /** 路径前缀 */
11
12
  BASE?: string;
12
13
  /** 平台 */
13
- PLATFORM: 'web';
14
+ PLATFORM: "web";
14
15
  }
15
- type ImportMetaEnv = Record<string, any>;
16
+ interface ImportMetaEnv {}
16
17
  interface ImportMeta {
17
18
  readonly env: Readonly<ImportMetaEnv & ImportMetaBaseEnv>;
18
19
  }
@@ -34,19 +35,19 @@ interface CssLoaderOptions {
34
35
  stylus?: Record<string, any>;
35
36
  }
36
37
  //#endregion
37
- //#region src/node/utils/loader-plugin-helper.d.ts
38
+ //#region src/node/utils/loaders-plugins-helper.d.ts
38
39
  type RspackExperiments = {
39
- import: Record<string, unknown>[];
40
+ import: Record<string, any>[];
40
41
  };
41
42
  type Pages = {
42
43
  [key: string]: {
43
44
  html: string;
44
45
  entry: string;
45
- library?: _rspack_core2.LibraryOptions;
46
+ library?: _rspack_core0.LibraryOptions;
46
47
  options?: {
47
48
  title: string;
48
49
  inject: boolean;
49
- meta: Record<string, string>;
50
+ meta: Record<string, any>;
50
51
  };
51
52
  };
52
53
  };
@@ -69,6 +70,8 @@ interface CdnPluginOptions {
69
70
  prodUrl?: string;
70
71
  devUrl?: string;
71
72
  crossOrigin?: boolean | string;
73
+ sri?: boolean;
74
+ useLocal?: boolean;
72
75
  }
73
76
  //#endregion
74
77
  //#region src/node/user-config.d.ts
@@ -85,6 +88,21 @@ interface UserConfig {
85
88
  * @future 该功能受限,目前仅支持 'pc'
86
89
  */
87
90
  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';
88
106
  /**
89
107
  * 页面配置
90
108
  * @default
@@ -97,10 +115,19 @@ interface UserConfig {
97
115
  */
98
116
  pages?: Pages;
99
117
  /**
100
- * 可选页面启动,当pages为多个对象时,可选择启动哪些页面,当设置为false或者不设置时,启动所有页面
118
+ * @description 可选页面启动,当pages为多个对象时,可选择启动哪些页面
101
119
  * @default false
102
120
  */
103
121
  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';
104
131
  /**
105
132
  * 全局变量
106
133
  * @default {}
@@ -155,14 +182,14 @@ interface UserConfig {
155
182
  * @see {@link https://webpack.js.org/configuration/dev-server/#devserverhttps}
156
183
  * @default false
157
184
  */
158
- https?: boolean | https1.ServerOptions;
185
+ https?: boolean | https0.ServerOptions;
159
186
  };
160
187
  /**
161
188
  * css loader 配置
162
189
  * @see {@link lightningcssOptions https://rspack.dev/zh/guide/features/builtin-lightningcss-loader#%E9%80%89%E9%A1%B9}
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}
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}
166
193
  */
167
194
  css?: CssLoaderOptions;
168
195
  /**
@@ -204,6 +231,12 @@ interface UserConfig {
204
231
  * @default false
205
232
  */
206
233
  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;
207
240
  /**
208
241
  * 是否开启循环依赖检查
209
242
  */
@@ -222,14 +255,15 @@ interface UserConfig {
222
255
  /**
223
256
  * 默认后缀
224
257
  * @see {@link https://webpack.js.org/configuration/resolve/#resolveextensions}
225
- * @default [".js", ".json", ".wasm",'.mjs', '.jsx', '.ts', '.tsx']
258
+ * @default ['.js', '.mjs', '.ts', '.tsx', '.vue']
259
+ * @warning 此处将会覆盖默认配置,如果你想保留默认配置添加默认配置即可
226
260
  */
227
261
  extensions?: string[];
228
262
  };
229
263
  }
230
264
  type ConfigEnvPre = Readonly<{
231
265
  mode: string;
232
- env: Omit<ImportMeta['env'], 'BASE'>;
266
+ env: ImportMeta['env'];
233
267
  command: Command;
234
268
  }>;
235
269
  type UserConfigFn<C> = (envPre: ConfigEnvPre) => C | Promise<C>;
package/dist/index.mjs CHANGED
@@ -1,7 +1,6 @@
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(`
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(`
2
2
 
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(`
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: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};
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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ikaros-cli/ikaros",
3
- "version": "1.3.1",
3
+ "version": "1.4.0",
4
4
  "description": "",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/",
@@ -14,11 +14,6 @@
14
14
  "bugs": {
15
15
  "url": "https://github.com/umbrella22/ikaros/issues"
16
16
  },
17
- "scripts": {
18
- "dev": "tsdown --watch",
19
- "dts": "tsdown --dts",
20
- "build": "tsdown"
21
- },
22
17
  "keywords": [
23
18
  "vue",
24
19
  "rspack"
@@ -41,36 +36,43 @@
41
36
  "npm": ">=9.5.0"
42
37
  },
43
38
  "dependencies": {
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",
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",
49
43
  "chalk": "^5.4.1",
50
44
  "cli-cursor": "^5.0.0",
51
- "commander": "^13.1.0",
45
+ "commander": "^14.0.0",
52
46
  "compression-webpack-plugin": "^11.1.0",
53
47
  "css-loader": "^7.1.2",
54
48
  "detect-port": "^2.1.0",
55
- "dotenv": "^16.5.0",
49
+ "dotenv": "^17.2.1",
56
50
  "easy-table": "^1.2.0",
51
+ "eslint-webpack-plugin": "^5.0.2",
57
52
  "fs-extra": "^11.3.0",
58
- "glob": "^10.4.5",
53
+ "glob": "^11.0.3",
59
54
  "less-loader": "^12.3.0",
60
55
  "minimist": "^1.2.8",
61
56
  "ora": "^8.2.0",
62
57
  "picocolors": "^1.1.1",
63
- "pretty-bytes": "^6.1.1",
64
- "radashi": "^12.5.1",
58
+ "pretty-bytes": "^7.0.0",
59
+ "radashi": "^12.6.0",
65
60
  "sass-loader": "^16.0.5",
61
+ "stylelint-webpack-plugin": "^5.0.1",
66
62
  "stylus-loader": "^8.1.1",
67
63
  "vue-style-loader": "^4.1.3",
68
64
  "yaml": "^2.8.0",
69
- "zod": "^3.25.48"
65
+ "zod": "^4.0.10",
66
+ "@ikaros-cli/infra-contrlibs": "1.4.0"
70
67
  },
71
68
  "devDependencies": {
72
69
  "@types/fs-extra": "^11.0.4",
73
70
  "@types/minimist": "^1.2.5",
74
- "vitest": "^3.2.0"
71
+ "vitest": "^3.2.4"
72
+ },
73
+ "scripts": {
74
+ "dev": "tsdown --watch",
75
+ "dts": "tsdown --dts",
76
+ "build": "tsdown"
75
77
  }
76
- }
78
+ }