@flatjs/evolve 2.3.2-next.2 → 2.3.2-next.4

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.
Files changed (48) hide show
  1. package/dist/constants.d.ts +7 -0
  2. package/dist/constants.js +1 -1
  3. package/dist/core/rspack/create-plugins.js +1 -1
  4. package/dist/default-options.js +1 -1
  5. package/dist/define-config/define-config.d.ts +3 -3
  6. package/dist/define-config/define-config.js +1 -1
  7. package/dist/dev-server/create-app-page-route.js +1 -1
  8. package/dist/helpers/custom-listr-renderer.js +1 -1
  9. package/dist/helpers/custom-message-channel.d.ts +17 -0
  10. package/dist/helpers/custom-message-channel.js +1 -0
  11. package/dist/helpers/merge-inspector-evolve-config.d.ts +2 -0
  12. package/dist/helpers/merge-inspector-evolve-config.js +1 -0
  13. package/dist/helpers/print-promotion.d.ts +3 -2
  14. package/dist/helpers/print-promotion.js +1 -1
  15. package/dist/helpers/refresh-evolve-mock-options.js +1 -1
  16. package/dist/load-config/load-evolve-config.d.ts +2 -2
  17. package/dist/load-config/load-evolve-config.js +1 -1
  18. package/dist/load-config/types.d.ts +2 -4
  19. package/dist/main/create-build-server.d.ts +2 -2
  20. package/dist/main/create-thread-worker.d.ts +31 -0
  21. package/dist/main/create-thread-worker.js +1 -0
  22. package/dist/main/get-worker-path.d.ts +1 -0
  23. package/dist/main/get-worker-path.js +1 -0
  24. package/dist/main/prepare-build.js +1 -1
  25. package/dist/main/prepare-serve.d.ts +1 -2
  26. package/dist/main/prepare-serve.js +1 -1
  27. package/dist/main/start-build-dynamic.d.ts +5 -4
  28. package/dist/main/start-build-dynamic.js +1 -1
  29. package/dist/main/start-build-worker.js +1 -1
  30. package/dist/main/start-build.d.ts +2 -2
  31. package/dist/main/start-build.js +1 -1
  32. package/dist/main/start-serve.d.ts +2 -3
  33. package/dist/main/start-serve.js +1 -1
  34. package/dist/main/start-static.d.ts +2 -2
  35. package/dist/plugins/rspack/progress-plugin/index.d.ts +4 -0
  36. package/dist/plugins/rspack/progress-plugin/index.js +1 -0
  37. package/dist/plugins/rspack/progress-plugin/progress-handler.d.ts +3 -0
  38. package/dist/plugins/rspack/progress-plugin/progress-handler.js +1 -0
  39. package/dist/plugins/rspack/progress-plugin/progress-worker.d.ts +7 -0
  40. package/dist/plugins/rspack/progress-plugin/progress-worker.js +1 -0
  41. package/dist/plugins/webpack/clean-webpack/clean-webpack-plugin.js +1 -1
  42. package/dist/rules/rspack/rule-scripts.js +1 -1
  43. package/dist/rules/wepack/rule-scripts.js +1 -1
  44. package/dist/types/types-cli-options.d.ts +0 -5
  45. package/dist/types/types-entry-map.d.ts +1 -1
  46. package/dist/types/types-options.d.ts +36 -0
  47. package/dist/types/types-webpack.d.ts +1 -1
  48. package/package.json +23 -15
@@ -31,3 +31,10 @@ export declare const ignoreEntryOptionKeys: Array<keyof EvolveEntryItemOption>;
31
31
  * The directory where the webpack stats files are stored. relative to projectCwd
32
32
  */
33
33
  export declare const webpackStatsDir = ".cache/stats";
34
+ /**
35
+ * The spinner frames used for build progress indicator
36
+ * Different frames for Windows and Unix-like systems
37
+ * Windows: simple ASCII characters
38
+ * Unix: Braille patterns for smoother animation
39
+ */
40
+ export declare const buildProgressSpinnerFrames: string[];
package/dist/constants.js CHANGED
@@ -1 +1 @@
1
- export const moduleName="@flatjs/evolve";export const configFileName="flatjs-evolve";export const viewportScripts='(function(d){var j;var b=1;var i=1;var h=750;var c=100;function e(s,o){var q=d.document;var l=q.documentElement;var k=navigator.userAgent;var m=k.toLowerCase().indexOf("android")>-1;i=d.devicePixelRatio||1;if(i>3){i=3}if(m){i=1}console.log("current devicePixelRatio:",i);l.setAttribute("data-dpr",i.toString());var p=q.querySelector(\'meta[name="viewport"]\');if(!p){b=1/i;p=q.createElement("meta");p.setAttribute("name","viewport");q.head.appendChild(p);p.setAttribute(["content","width=device-width,user-scalable=no,initial-scale=",b,",maximum-scale=",b,",minimum-scale=",b].join(""))}function n(){var t=document.documentElement.clientWidth;j=t/o*(s/i)*i;q.documentElement.style.fontSize=String(j)+"px"}var r;d.addEventListener("resize",function(){clearTimeout(r);r=setTimeout(n,300)},false);d.addEventListener("onload",n,false);n()}e(c,h);window.fabricViewport={currRem:j,currDpr:i,currScale:b,dpiPX2px:function f(k){return parseFloat(k.toString())/j*100+"px"},px2DPIpx:function a(k){return parseFloat(k.toString())/100*j+"px"},px2rem:function g(k){return parseFloat(k.toString())/100+"rem"}}})(window);';export const polyfill=["https://polyfill.io/v3/polyfill.min.js?features=Array.from%2CArray.isArray%2CArray.of%2CArray.prototype.entries%2CArray.prototype.every%2CArray.prototype.fill%2CArray.prototype.filter%2CArray.prototype.find%2CArray.prototype.findIndex%2CArray.prototype.flat%2CArray.prototype.forEach%2CArray.prototype.flatMap%2CArray.prototype.keys%2CArray.prototype.indexOf%2CArray.prototype.includes%2CArray.prototype.lastIndexOf%2CArray.prototype.map%2CArray.prototype.reduce%2CArray.prototype.reduceRight%2CArray.prototype.some%2CArray.prototype.sort%2CArray.prototype.values%2CArrayBuffer%2CBlob%2CDataView%2CDate.now%2CObject.assign%2CObject.create%2CObject.defineProperties%2CObject.defineProperty%2CObject.entries%2CObject.freeze%2CObject.fromEntries%2CObject.getOwnPropertySymbols%2CObject.getOwnPropertyNames%2CObject.getOwnPropertyDescriptors%2CObject.getOwnPropertyDescriptor%2CObject.getPrototypeOf%2CObject.is%2CObject.isExtensible%2CObject.isFrozen%2CObject.isSealed%2CObject.keys%2CObject.values%2CObject.setPrototypeOf%2CPromise%2CPromise.prototype.finally%2CReflect%2CReflect.apply%2CReflect.construct%2CReflect.defineProperty%2CReflect.deleteProperty%2CReflect.getPrototypeOf%2CReflect.getOwnPropertyDescriptor%2CReflect.get%2CReflect.ownKeys%2CReflect.isExtensible%2CReflect.has%2CReflect.preventExtensions%2CReflect.set%2CReflect.setPrototypeOf%2CSet%2CString.prototype.trimStart%2CString.prototype.trimEnd%2CString.prototype.trim%2CString.prototype.startsWith%2CString.prototype.repeat%2CString.prototype.replaceAll%2CString.prototype.padStart%2CString.prototype.padEnd%2CMap%2CObject.seal%2Cconsole.groupEnd%2Cconsole.group"];export const devReactFastRefresh={runtime:"reactRefreshRuntime",reactRefreshSetup:"reactRefreshSetup"};export const ignoreEntryOptionKeys=["title"];export const webpackStatsDir=".cache/stats";
1
+ import process from"node:process";export const moduleName="@flatjs/evolve";export const configFileName="flatjs-evolve";export const viewportScripts='(function(d){var j;var b=1;var i=1;var h=750;var c=100;function e(s,o){var q=d.document;var l=q.documentElement;var k=navigator.userAgent;var m=k.toLowerCase().indexOf("android")>-1;i=d.devicePixelRatio||1;if(i>3){i=3}if(m){i=1}console.log("current devicePixelRatio:",i);l.setAttribute("data-dpr",i.toString());var p=q.querySelector(\'meta[name="viewport"]\');if(!p){b=1/i;p=q.createElement("meta");p.setAttribute("name","viewport");q.head.appendChild(p);p.setAttribute(["content","width=device-width,user-scalable=no,initial-scale=",b,",maximum-scale=",b,",minimum-scale=",b].join(""))}function n(){var t=document.documentElement.clientWidth;j=t/o*(s/i)*i;q.documentElement.style.fontSize=String(j)+"px"}var r;d.addEventListener("resize",function(){clearTimeout(r);r=setTimeout(n,300)},false);d.addEventListener("onload",n,false);n()}e(c,h);window.fabricViewport={currRem:j,currDpr:i,currScale:b,dpiPX2px:function f(k){return parseFloat(k.toString())/j*100+"px"},px2DPIpx:function a(k){return parseFloat(k.toString())/100*j+"px"},px2rem:function g(k){return parseFloat(k.toString())/100+"rem"}}})(window);';export const polyfill=["https://polyfill.io/v3/polyfill.min.js?features=Array.from%2CArray.isArray%2CArray.of%2CArray.prototype.entries%2CArray.prototype.every%2CArray.prototype.fill%2CArray.prototype.filter%2CArray.prototype.find%2CArray.prototype.findIndex%2CArray.prototype.flat%2CArray.prototype.forEach%2CArray.prototype.flatMap%2CArray.prototype.keys%2CArray.prototype.indexOf%2CArray.prototype.includes%2CArray.prototype.lastIndexOf%2CArray.prototype.map%2CArray.prototype.reduce%2CArray.prototype.reduceRight%2CArray.prototype.some%2CArray.prototype.sort%2CArray.prototype.values%2CArrayBuffer%2CBlob%2CDataView%2CDate.now%2CObject.assign%2CObject.create%2CObject.defineProperties%2CObject.defineProperty%2CObject.entries%2CObject.freeze%2CObject.fromEntries%2CObject.getOwnPropertySymbols%2CObject.getOwnPropertyNames%2CObject.getOwnPropertyDescriptors%2CObject.getOwnPropertyDescriptor%2CObject.getPrototypeOf%2CObject.is%2CObject.isExtensible%2CObject.isFrozen%2CObject.isSealed%2CObject.keys%2CObject.values%2CObject.setPrototypeOf%2CPromise%2CPromise.prototype.finally%2CReflect%2CReflect.apply%2CReflect.construct%2CReflect.defineProperty%2CReflect.deleteProperty%2CReflect.getPrototypeOf%2CReflect.getOwnPropertyDescriptor%2CReflect.get%2CReflect.ownKeys%2CReflect.isExtensible%2CReflect.has%2CReflect.preventExtensions%2CReflect.set%2CReflect.setPrototypeOf%2CSet%2CString.prototype.trimStart%2CString.prototype.trimEnd%2CString.prototype.trim%2CString.prototype.startsWith%2CString.prototype.repeat%2CString.prototype.replaceAll%2CString.prototype.padStart%2CString.prototype.padEnd%2CMap%2CObject.seal%2Cconsole.groupEnd%2Cconsole.group"];export const devReactFastRefresh={runtime:"reactRefreshRuntime",reactRefreshSetup:"reactRefreshSetup"};export const ignoreEntryOptionKeys=["title"];export const webpackStatsDir=".cache/stats";export const buildProgressSpinnerFrames="win32"===process.platform?["-","\\","|","/"]:["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];
@@ -1 +1 @@
1
- import CaseSensitivePathsPlugin from"case-sensitive-paths-webpack-plugin";import{logger}from"@flatjs/common";import{RsdoctorRspackPlugin}from"@rsdoctor/rspack-plugin";import rspack,{CssExtractRspackPlugin}from"@rspack/core";import ReactRefreshPlugin from"@rspack/plugin-react-refresh";import{enableBundleHashNameForModule}from"../../helpers/enable-bundle-hashname-for-module.js";import{getBundleFileName}from"../../helpers/get-bundle-file-name.js";import{shouldEnableReactFastRefresh}from"../../helpers/should-enable-react-fast-refresh.js";import{createBuiltinDefineVariablesRspackPlugins}from"../../plugins/rspack/define-variable/index.js";import{createModuleFederationRspackPlugins}from"../../plugins/rspack/module-federation/index.js";import{createHtmlRspackPlugins}from"../../plugins/rspack/multi-html/index.js";import{createCircularDependencyWebpackPlugins}from"../../plugins/webpack/circular-dependency/index.js";import{createCleanWebpackPlugins}from"../../plugins/webpack/clean-webpack/index.js";import{createStatsWebpackPlugins}from"../../plugins/webpack/stats-webpack/index.js";export const createRspackPlugins=async(e,a,s,r)=>{const n=a[0],[i,l]=n,c=enableBundleHashNameForModule(s,l?.options),t=[new rspack.IgnorePlugin({resourceRegExp:/\.d\.[cm]ts$/}),new CaseSensitivePathsPlugin,...createCircularDependencyWebpackPlugins(e,s),new CssExtractRspackPlugin({filename:`[name]/${getBundleFileName("css",e,c)}`,chunkFilename:c?"[id].[contenthash].css":"[id].css"}),...await createBuiltinDefineVariablesRspackPlugins(e,s),...createCleanWebpackPlugins(e,a,s),...createModuleFederationRspackPlugins(e,a,s),...createHtmlRspackPlugins(e,a,s),...createStatsWebpackPlugins(e,s,r)],o=shouldEnableReactFastRefresh(e,n,s);o&&t.push(new ReactRefreshPlugin({overlay:!1,exclude:[/node_modules/]})),!o&&e&&(s.devServer?.liveReload?logger.warn('The HMR disabled cause of "liveReload" specificed'):logger.warn(`The HMR disabled cause of \`"moduleFederation":"${i}"\``)),s.openRsdoctor&&t.push(new RsdoctorRspackPlugin);const p=s.webpack?.plugins||[];return t.concat(p)};
1
+ import CaseSensitivePathsPlugin from"case-sensitive-paths-webpack-plugin";import{logger}from"@flatjs/common";import{RsdoctorRspackPlugin}from"@rsdoctor/rspack-plugin";import rspack,{CssExtractRspackPlugin}from"@rspack/core";import ReactRefreshPlugin from"@rspack/plugin-react-refresh";import{enableBundleHashNameForModule}from"../../helpers/enable-bundle-hashname-for-module.js";import{getBundleFileName}from"../../helpers/get-bundle-file-name.js";import{shouldEnableReactFastRefresh}from"../../helpers/should-enable-react-fast-refresh.js";import{createBuiltinDefineVariablesRspackPlugins}from"../../plugins/rspack/define-variable/index.js";import{createModuleFederationRspackPlugins}from"../../plugins/rspack/module-federation/index.js";import{createHtmlRspackPlugins}from"../../plugins/rspack/multi-html/index.js";import{createProgressRspackPlugins}from"../../plugins/rspack/progress-plugin/index.js";import{createCircularDependencyWebpackPlugins}from"../../plugins/webpack/circular-dependency/index.js";import{createCleanWebpackPlugins}from"../../plugins/webpack/clean-webpack/index.js";import{createStatsWebpackPlugins}from"../../plugins/webpack/stats-webpack/index.js";export const createRspackPlugins=async(e,s,a,r)=>{const n=s[0],[i,l]=n,c=enableBundleHashNameForModule(a,l?.options),t=[...createProgressRspackPlugins(s),new rspack.IgnorePlugin({resourceRegExp:/\.d\.[cm]ts$/}),new CaseSensitivePathsPlugin,...createCircularDependencyWebpackPlugins(e,a),new CssExtractRspackPlugin({filename:`[name]/${getBundleFileName("css",e,c)}`,chunkFilename:c?"[id].[contenthash].css":"[id].css"}),...await createBuiltinDefineVariablesRspackPlugins(e,a),...createCleanWebpackPlugins(e,s,a),...createModuleFederationRspackPlugins(e,s,a),...createHtmlRspackPlugins(e,s,a),...createStatsWebpackPlugins(e,a,r)],o=shouldEnableReactFastRefresh(e,n,a);o&&t.push(new ReactRefreshPlugin({overlay:!1,exclude:[/node_modules/]})),!o&&e&&(a.devServer?.liveReload?logger.warn('The HMR disabled cause of "liveReload" specificed'):logger.warn(`The HMR disabled cause of \`"moduleFederation":"${i}"\``)),a.openRsdoctor&&t.push(new RsdoctorRspackPlugin);const p=a.webpack?.plugins||[];return t.concat(p)};
@@ -1 +1 @@
1
- export const defaultEvolveOptions={projectCwd:process.cwd(),projectVirtualPath:"flatjs/evolve",rejectWarnings:!1,devServer:{autoOpen:!0,pageProxy:"/pages",mockOptions:{mockBaseDir:"mocks"},clientOverlay:{errors:!0,warnings:!1},webSocketURL:"localIp",middlewares:[],watchOptions:{poll:1e3,ignored:["**/node_modules","**/mocks"],aggregateTimeout:500},defaultServeGlobalData:()=>Promise.resolve({}),bundleDirResolver:e=>e},webpack:{target:["web","es5"],plugins:[],ruleSets:[],publicPath:"auto",resolve:{},externals:{vue:"Vue",react:"React","react-dom":"ReactDOM"},outputDir:"public",enableBundleHashName:!0},pluginOptions:{},loaderOptions:{assetDataUrlMaxSize:4096,babelOptions:{usePreset:"react",plugins:[],presets:[]},lessOptions:{},postcssOptions:{cssnanoOptions:{}},pixelOptions:{rootValue:{px:100,rpx:1},outputUnit:"rem"},modularImports:[]},globalCompilerOptions:{runTsChecker:!0},entryMap:{},multiHtmlCdn:{},multiHtmlCdnEnvResolver:function cdnResolver(){},needVerifyPackages:{},packageInstallChecker:{enabled:!1,detectModules:["@dimjs/*"],throwError:!1,showAllInstalledGraph:!0},ci:{basedBranch:"origin/master"},isolation:!1,maxEntryGroupSize:10,openRsdoctor:!1};
1
+ export const defaultEvolveOptions={projectCwd:process.cwd(),projectVirtualPath:"flatjs/evolve",rejectWarnings:!1,devServer:{autoOpen:!0,pageProxy:"/pages",mockOptions:{mockBaseDir:"mocks"},clientOverlay:{errors:!0,warnings:!1},webSocketURL:"localIp",middlewares:[],watchOptions:{poll:1e3,ignored:["**/node_modules","**/mocks"],aggregateTimeout:500},defaultServeGlobalData:()=>Promise.resolve({}),bundleDirResolver:e=>e},webpack:{target:["web","es5"],plugins:[],ruleSets:[],publicPath:"auto",resolve:{},externals:{vue:"Vue",react:"React","react-dom":"ReactDOM"},outputDir:"public",enableBundleHashName:!0},pluginOptions:{},loaderOptions:{assetDataUrlMaxSize:4096,babelOptions:{usePreset:"react",plugins:[],presets:[]},lessOptions:{},postcssOptions:{cssnanoOptions:{}},pixelOptions:{rootValue:{px:100,rpx:1},outputUnit:"rem"},modularImports:[]},globalCompilerOptions:{runTsChecker:!0},entryMap:{},multiHtmlCdn:{},multiHtmlCdnEnvResolver:function cdnResolver(){},needVerifyPackages:{},packageInstallChecker:{enabled:!1,detectModules:["@dimjs/*"],throwError:!1,showAllInstalledGraph:!0},ci:{basedBranch:"origin/master"},isolation:!1,maxEntryGroupSize:10,compiler:"webpack",openRsdoctor:!1,inspector:{customLaunchEditorEndpoint:"/__hps_inspector",trustedEditor:"code",injectClient:!0}};
@@ -1,6 +1,6 @@
1
- import { type PartialDeep } from 'type-fest';
2
- import { type ConfigEnvBase, type UserConfigExport } from '@armit/config-loader';
3
1
  import { type requireResolve } from '@flatjs/common';
2
+ import type { DeepPartial } from '@hyperse/config-loader';
3
+ import { type ConfigEnvBase, type UserConfigExport } from '@hyperse/config-loader';
4
4
  import { type FlatEvolveOptions } from '../types/types-options.js';
5
5
  export interface EvolveConfigBase extends ConfigEnvBase {
6
6
  /**
@@ -28,6 +28,6 @@ export interface EvolveConfigBase extends ConfigEnvBase {
28
28
  */
29
29
  resolve: typeof requireResolve;
30
30
  }
31
- type DefineConfigFn = (userConfig: UserConfigExport<PartialDeep<FlatEvolveOptions>, EvolveConfigBase>) => UserConfigExport<PartialDeep<FlatEvolveOptions>, EvolveConfigBase>;
31
+ type DefineConfigFn = (userConfig: UserConfigExport<DeepPartial<FlatEvolveOptions>, EvolveConfigBase>) => UserConfigExport<DeepPartial<FlatEvolveOptions>, EvolveConfigBase>;
32
32
  export declare const defineConfig: DefineConfigFn;
33
33
  export {};
@@ -1 +1 @@
1
- import{defineConfig as myDefineConfig}from"@armit/config-loader";export const defineConfig=i=>myDefineConfig(i);
1
+ import{defineConfig as myDefineConfig}from"@hyperse/config-loader";export const defineConfig=e=>myDefineConfig(e);
@@ -1 +1 @@
1
- import{normalizePageProxy}from"../helpers/normalize-page-proxy.js";import{createPageMiddleware,createPublicAssetsMiddleware}from"./middlewares/index.js";export const createAppPageRoute=(e,r,a,o,s)=>{const{devServer:t}=s,i=normalizePageProxy(t?.pageProxy||"/pages");r.use(i,...createPageMiddleware(a,t?.mockOptions?.apiContext||"api",o,s)),r.use("*splat",createPublicAssetsMiddleware(e,i))};
1
+ import{createLaunchEditorMiddleware}from"@hyperse/inspector-middleware";import{normalizePageProxy}from"../helpers/normalize-page-proxy.js";import{createPageMiddleware,createPublicAssetsMiddleware}from"./middlewares/index.js";export const createAppPageRoute=(e,r,t,a,o)=>{const{devServer:d,inspector:i}=o,s=normalizePageProxy(d?.pageProxy||"/pages");i&&d?.middlewares?.push(createLaunchEditorMiddleware({customLaunchEditorEndpoint:i.customLaunchEditorEndpoint,trustedEditor:i.trustedEditor,projectCwd:e})),r.use(s,...createPageMiddleware(t,d?.mockOptions?.apiContext||"api",a,o)),r.use("*splat",createPublicAssetsMiddleware(e,s))};
@@ -1 +1 @@
1
- import logUpdate from"log-update";import process from"node:process";import{chalk,loggerSimpleStdWriteSteam}from"@flatjs/common";import{formatSpinnerText}from"./format-spinner-text.js";const startFrames="win32"===process.platform?["-","\\","|","/"]:["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"];let startIndex=0;export class CustomListrRenderer{constructor(t){this._tasks=[],this.renderTask=()=>{const t=[];startIndex=++startIndex%startFrames.length;const e=startFrames[startIndex];for(const r of this._tasks){const s=r.title.split("$ENTRY_KEYS")||[],o=s[1]||"",i=o?o.split(","):[];r.isCompleted()?t.push(`${chalk(["green"])("✔")} ${this.formatTextByTemp(s[0],"successfully")} \n${formatSpinnerText(i,"✔","green")}`):r.hasFailed()?t.push(`${chalk(["red"])("✘")} ${this.formatTextByTemp(s[0],"failed")} \n${formatSpinnerText(i,"✘","red")}`):r.isSkipped()?t.push(`${chalk(["gray"])("ℹ")} ${this.formatTextByTemp(s[0],"skipped")} \n${formatSpinnerText(i,"ℹ","gray")}`):t.push(`${chalk(["cyan"])(e)} ${this.formatTextByTemp(s[0],"building")} \n${formatSpinnerText(i)}`)}logUpdate(t.join("\n"))},this._tasks=t}static get nonTTY(){return!0}render(){this._id||(this._id=setInterval((()=>{this.renderTask()}),100))}end(){this._id&&(clearInterval(this._id),this._id=void 0),this.renderTask(),logUpdate.done(),this.printMemoryLogs()}formatTextByTemp(t,e,r="$STATUS"){const s={successfully:`${chalk(["green"])("done")}`,failed:`builded ${chalk(["red"])("failed")}`,skipped:`builded ${chalk(["gray"])("skipped")}`,building:chalk(["white"])("compiling...")};return t.replace(r,s[e])}printMemoryLogs(){const{stderr:t=[],stdout:e=[]}=loggerSimpleStdWriteSteam.getStdData();for(const e of t)console.error(e);for(const t of e)console.log(t)}}
1
+ import logUpdate from"log-update";import{chalk,loggerSimpleStdWriteSteam}from"@flatjs/common";import{buildProgressSpinnerFrames}from"../constants.js";import{formatSpinnerText}from"./format-spinner-text.js";let startIndex=0;export class CustomListrRenderer{constructor(e){this._tasks=[],this.renderTask=()=>{const e=[];startIndex=++startIndex%buildProgressSpinnerFrames.length;const t=buildProgressSpinnerFrames[startIndex];for(const r of this._tasks){const s=r.title.split("$ENTRY_KEYS")||[],i=s[1]||"",o=i?i.split(","):[];r.isCompleted()?e.push(`${chalk(["green"])("✔")} ${this.formatTextByTemp(s[0],"successfully")} \n${formatSpinnerText(o,"✔","green")}`):r.hasFailed()?e.push(`${chalk(["red"])("✘")} ${this.formatTextByTemp(s[0],"failed")} \n${formatSpinnerText(o,"✘","red")}`):r.isSkipped()?e.push(`${chalk(["gray"])("ℹ")} ${this.formatTextByTemp(s[0],"skipped")} \n${formatSpinnerText(o,"ℹ","gray")}`):e.push(`${chalk(["cyan"])(t)} ${this.formatTextByTemp(s[0],"building")} \n${formatSpinnerText(o)}`)}logUpdate(e.join("\n"))},this._tasks=e}static get nonTTY(){return!0}render(){this._id||(this._id=setInterval((()=>{this.renderTask()}),100))}end(){this._id&&(clearInterval(this._id),this._id=void 0),this.renderTask(),logUpdate.done(),this.printMemoryLogs()}formatTextByTemp(e,t,r="$STATUS"){const s={successfully:`${chalk(["green"])("done")}`,failed:`builded ${chalk(["red"])("failed")}`,skipped:`builded ${chalk(["gray"])("skipped")}`,building:chalk(["white"])("compiling...")};return e.replace(r,s[t])}printMemoryLogs(){const{stderr:e=[],stdout:t=[]}=loggerSimpleStdWriteSteam.getStdData();for(const t of e)console.error(t);for(const e of t)console.log(e)}}
@@ -0,0 +1,17 @@
1
+ import { MessageChannel } from 'node:worker_threads';
2
+ declare class CustomMessageChannel {
3
+ private stdoutData;
4
+ private stderrData;
5
+ private channelList;
6
+ constructor();
7
+ createMessageChannel(): MessageChannel;
8
+ addListener(channel: MessageChannel): void;
9
+ getStdData(): {
10
+ stdout: string[];
11
+ stderr: string[];
12
+ };
13
+ dispose(): void;
14
+ clean(): void;
15
+ }
16
+ export declare const customMessageChannel: CustomMessageChannel;
17
+ export {};
@@ -0,0 +1 @@
1
+ import{MessageChannel}from"node:worker_threads";class CustomMessageChannel{constructor(){this.stdoutData=[],this.stderrData=[],this.channelList=[],this.clean()}createMessageChannel(){const s=new MessageChannel;return this.channelList.push(s),this.addListener(s),s}addListener(s){const{port2:t}=s;t.on("message",(s=>{this.stdoutData.push(...s.stdout),this.stderrData.push(...s.stderr)}))}getStdData(){return{stdout:this.stdoutData,stderr:this.stderrData}}dispose(){for(const s of this.channelList){const{port1:t,port2:e}=s;t.close(),e.close(),e.removeAllListeners("message")}this.channelList=[]}clean(){this.stdoutData=[],this.stderrData=[]}}export const customMessageChannel=new CustomMessageChannel;
@@ -0,0 +1,2 @@
1
+ import type { FlatEvolveOptions } from '../types/types-options.js';
2
+ export declare const mergeInspectorEvolveConfig: (evolveOptions: FlatEvolveOptions) => FlatEvolveOptions;
@@ -0,0 +1 @@
1
+ import{dirname,join}from"path";import{fileURLToPath}from"url";import{searchPackageDir}from"@armit/package";import{logger,mergeOptions,requireResolve}from"@flatjs/common";export const mergeInspectorEvolveConfig=e=>{const{inspector:r}=e;if(!r)return e;const{externals:t}=e.webpack||{};if(t){let r=t;if("function"==typeof t&&(r=t()),r.react||r["react-dom"])return logger.warn("React and ReactDOM are external dependencies, you need to manually integrate Inspector"),e}const{keys:n,customLaunchEditorEndpoint:o="/__hps_inspector"}=r,i={"process.env.INSPECTOR_ENDPOINT":JSON.stringify(`/pages/${o}`.replace(/\/\//g,"/"))};n&&(i["process.env.INSPECTOR_KEYS"]=JSON.stringify(n.join(",")));const s=mergeOptions(e,{pluginOptions:{definePlugin:i}}),a=requireResolve(import.meta.url,"@hyperse/inspector"),c=searchPackageDir({cwd:fileURLToPath(dirname(a))});if(!c)return logger.debug("@hyperse/inspector package not found"),s;const p=join(c,"dist","client","index.js"),g=s.entryMap;for(const[e,r]of Object.entries(g)){r.entry.push(p)}return s};
@@ -1,2 +1,3 @@
1
- import type { FlatCliOptions } from '../types/types-cli-options.js';
2
- export declare const printPromotions: (cliOptions?: FlatCliOptions) => void;
1
+ import type { DeepPartial } from '@hyperse/config-loader';
2
+ import type { FlatEvolveOptions } from '../types/types-options.js';
3
+ export declare const printPromotions: (evolveOptions?: DeepPartial<FlatEvolveOptions>) => void;
@@ -1 +1 @@
1
- import{chalk,logger}from"@flatjs/common";export const printPromotions=(o={})=>{const{compilerType:r="webpack"}=o;logger.info(`Compiler type is ${chalk(["cyan"])(r)}`)};
1
+ import{chalk,logger}from"@flatjs/common";export const printPromotions=(o={})=>{const{compiler:r="webpack"}=o;logger.info(`Compiler is ${chalk(["cyan"])(r)}`)};
@@ -1 +1 @@
1
- import _ from"lodash";import{requireResolve}from"@flatjs/common";import{getMockCwd,loadMockConfig}from"@flatjs/mock";export const refreshEvolveMockOptions=async(o,t,e)=>{const s=t.devServer,r=e?.esmLoaderOptions,i=r?.externals||[],n={projectCwd:o,resolve:requireResolve},c=await loadMockConfig(n,o,s?.mockOptions||{},_.merge({},e,{configFile:"flatjs-mock",esmLoaderOptions:{externals:[...i,"@flatjs/mock"]}}));if(s){s.mockOptions=c||{},s.mockOptions&&!s.mockOptions.https&&(s.mockOptions.https=s?.https);const o=getMockCwd(c);Array.isArray(s?.watchOptions?.ignored)&&s?.watchOptions?.ignored.push(o)}return t};
1
+ import _ from"lodash";import{requireResolve}from"@flatjs/common";import{getMockCwd,loadMockConfig}from"@flatjs/mock";export const refreshEvolveMockOptions=async(o,t,e)=>{const r=t.devServer,s=e?.loaderOptions,i=s?.externals||[],n={projectCwd:o,resolve:requireResolve},c=await loadMockConfig(n,o,r?.mockOptions||{},_.merge({},e,{configFile:"flatjs-mock",loaderOptions:{externals:[...i,"@flatjs/mock"]}}));if(r){r.mockOptions=c||{},r.mockOptions&&!r.mockOptions.https&&(r.mockOptions.https=r?.https);const o=getMockCwd(c);Array.isArray(r?.watchOptions?.ignored)&&r?.watchOptions?.ignored.push(o)}return t};
@@ -1,5 +1,5 @@
1
- import { type PartialDeep } from 'type-fest';
1
+ import type { DeepPartial } from '@hyperse/config-loader';
2
2
  import { type EvolveConfigBase } from '../define-config/define-config.js';
3
3
  import { type FlatEvolveOptions } from '../types/types-options.js';
4
4
  import { type ConfigLoaderOptions } from './types.js';
5
- export declare const loadEvolveConfig: (configEnv: EvolveConfigBase, projectCwd: string, overrideOptions?: PartialDeep<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions) => Promise<FlatEvolveOptions>;
5
+ export declare const loadEvolveConfig: (configEnv: EvolveConfigBase, projectCwd: string, overrideOptions?: DeepPartial<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions) => Promise<FlatEvolveOptions>;
@@ -1 +1 @@
1
- import{searchConfig}from"@armit/config-loader";import{logger,mergeOptions}from"@flatjs/common";import{configFileName,moduleName}from"../constants.js";import{defaultEvolveOptions}from"../default-options.js";import{normalizeResolveAlias}from"../helpers/normalize-resolve-alias.js";import{refreshEvolveMockOptions}from"../helpers/refresh-evolve-mock-options.js";export const loadEvolveConfig=async(o,e,i={},s={configFile:configFileName,esmLoaderOptions:{externals:[/^@flatjs\/.*/]}})=>{const{configFile:r,esmLoaderOptions:l}=s,a=await searchConfig(r,e,{esm:{...l,projectCwd:e}});let n={};n="function"==typeof a?.config?await(a?.config(o)):a?.config||{};const t=mergeOptions(defaultEvolveOptions,n),m=mergeOptions(t,i),f=mergeOptions(m,{projectCwd:e}),c="build"===o.command?f:await refreshEvolveMockOptions(e,f,s);return logger.debug(`Load evolve config:\n${JSON.stringify(c,null,2)}`,moduleName),c.webpack?.resolve?.alias&&(c.webpack.resolve.alias=normalizeResolveAlias(e,c.webpack?.resolve?.alias)),c};
1
+ import{logger,mergeOptions}from"@flatjs/common";import{searchConfig}from"@hyperse/config-loader";import{configFileName,moduleName}from"../constants.js";import{defaultEvolveOptions}from"../default-options.js";import{normalizeResolveAlias}from"../helpers/normalize-resolve-alias.js";import{refreshEvolveMockOptions}from"../helpers/refresh-evolve-mock-options.js";export const loadEvolveConfig=async(o,e,i={},l={configFile:configFileName,loaderOptions:{externals:[/^@flatjs\/.*/]}})=>{const{configFile:r,loaderOptions:s}=l,a=await searchConfig(r,e,{...s,projectCwd:e});let n={};n="function"==typeof a?.config?await(a?.config(o)):a?.config||{};const t=mergeOptions(defaultEvolveOptions,n),m=mergeOptions(t,i),f=mergeOptions(m,{projectCwd:e}),p="build"===o.command?f:await refreshEvolveMockOptions(e,f,l);return logger.debug(`Load evolve config:\n${JSON.stringify(p,null,2)}`,moduleName),p.webpack?.resolve?.alias&&(p.webpack.resolve.alias=normalizeResolveAlias(e,p.webpack?.resolve?.alias)),p};
@@ -1,7 +1,5 @@
1
+ import type { LoaderOptions } from '@hyperse/config-loader';
1
2
  export type ConfigLoaderOptions = {
2
3
  configFile: string;
3
- esmLoaderOptions: {
4
- externals: Array<RegExp | string>;
5
- projectCwd?: string;
6
- };
4
+ loaderOptions: LoaderOptions;
7
5
  };
@@ -1,4 +1,4 @@
1
- import { type PartialDeep } from 'type-fest';
1
+ import type { DeepPartial } from '@hyperse/config-loader';
2
2
  import { type ConfigLoaderOptions } from '../load-config/types.js';
3
3
  import { type FlatEvolveOptions } from '../types/types-options.js';
4
4
  export declare class BuildServer {
@@ -10,6 +10,6 @@ export declare class BuildServer {
10
10
  * @param configLoaderOptions - The config loader options
11
11
  * @returns The build results
12
12
  */
13
- build(projectCwd: string, earlyCommit?: string, lastCommit?: string, overrideEvolveOptions?: PartialDeep<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions): Promise<import("../index.js").EvolveBuildResult[]>;
13
+ build(projectCwd: string, earlyCommit?: string, lastCommit?: string, overrideEvolveOptions?: DeepPartial<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions): Promise<import("../index.js").EvolveBuildResult[]>;
14
14
  }
15
15
  export declare const createBuildServer: () => BuildServer;
@@ -0,0 +1,31 @@
1
+ import Tinypool from 'tinypool';
2
+ import { type ThreadsOptions } from '../types/types-threads-options.js';
3
+ import startBuildWorker from './start-build-worker.js';
4
+ interface BaseThreadPool {
5
+ startBuildWorker: (options: Parameters<typeof startBuildWorker>[0]) => ReturnType<typeof startBuildWorker>;
6
+ terminate(): void;
7
+ }
8
+ /**
9
+ * Represents a thread pool for unit testing.
10
+ */
11
+ declare class ThreadPoolForUnittest implements BaseThreadPool {
12
+ startBuildWorker(options: Parameters<typeof startBuildWorker>[0]): Promise<import("../index.js").EvolveBuildResult>;
13
+ terminate(): void;
14
+ }
15
+ /**
16
+ * Represents a thread pool for executing tasks using the TinyPool library.
17
+ */
18
+ declare class ThreadPoolForTinyPool implements BaseThreadPool {
19
+ pool: Tinypool;
20
+ /**
21
+ * Creates a new instance of the `ThreadPoolForTinyPool` class.
22
+ * @param workerPath The path to the worker file.
23
+ * @param workerSize The number of worker threads to create.
24
+ * @param options Optional configuration options for the worker pool.
25
+ */
26
+ constructor(workerPath: string, options?: ThreadsOptions);
27
+ startBuildWorker(options: Parameters<typeof startBuildWorker>[0]): ReturnType<typeof startBuildWorker>;
28
+ terminate(): void;
29
+ }
30
+ export declare const createThreadWorker: (options?: ThreadsOptions) => ThreadPoolForUnittest | ThreadPoolForTinyPool;
31
+ export {};
@@ -0,0 +1 @@
1
+ import Tinypool from"tinypool";import{mergeOptions}from"@flatjs/common";import{customMessageChannel}from"../helpers/custom-message-channel.js";import{getWorkerPath}from"./get-worker-path.js";import startBuildWorker from"./start-build-worker.js";class ThreadPoolForUnittest{startBuildWorker(e){return startBuildWorker(e)}terminate(){console.warn('[WARNING] Using fake "terminate" for unittest!')}}class ThreadPoolForTinyPool{constructor(e,r){const{idleTimeout:o=6e4,minThreads:t=1,maxThreads:s}=r||{};this.pool=new Tinypool({runtime:"worker_threads",filename:e,minThreads:t,maxThreads:s,idleTimeout:o})}startBuildWorker(e){const{port1:r}=customMessageChannel.createMessageChannel(),o=mergeOptions(e,{messagePort:r});return this.pool.run(o,{transferList:[r]})}terminate(){this.pool.destroy(),customMessageChannel.dispose()}}export const createThreadWorker=e=>{const r=getWorkerPath();return"test"===process.env.NODE_ENV?(console.warn("[WARNING] Using fake thread pool worker for unittest!"),new ThreadPoolForUnittest):new ThreadPoolForTinyPool(r,e)};
@@ -0,0 +1 @@
1
+ export declare const getWorkerPath: () => string;
@@ -0,0 +1 @@
1
+ import{pathToFileURL}from"node:url";import{getDirname}from"@armit/file-utility";export const getWorkerPath=()=>pathToFileURL(getDirname(import.meta.url,"./start-build-worker.js")).toString();
@@ -1 +1 @@
1
- import{ensureSlash,mergeOptions}from"@flatjs/common";import{ignoreEntryOptionKeys}from"../constants.js";import{startRspackBuild}from"../core/rspack/start-rspack-build.js";import{startWebpackBuild}from"../core/webpack/index.js";import{EvolveBuildError}from"../errors/evolve-build-error.js";import{printCompilerError}from"../helpers/print-log.js";import{verifyGroupEntryOptions}from"../helpers/verify-group-entry-options.js";export const prepareBuild=async(r,o,t)=>{const{compilerType:e="webpack"}=t||{},p=Object.values(r)[0];if(!verifyGroupEntryOptions(r,ignoreEntryOptionKeys,!0))throw new Error("The entry options in a group must be the same.");const s=o.multiHtmlCdn?.prod||[];if(!s.length)throw new Error(`No CDN config for env:"prod", groupName: ${p.groupName}`);const i=ensureSlash(s[Math.floor(Math.random()*s.length)],!0);try{const s=p.options?.useRelativeAssetPath,n=mergeOptions(o,{webpack:{publicPath:s?"auto":i}});return"webpack"===e?await startWebpackBuild(r,n,t):await startRspackBuild(r,n,t)}catch(r){const o=printCompilerError(r);throw new EvolveBuildError("BUILD_ERROR",o)}};
1
+ import{ensureSlash,mergeOptions}from"@flatjs/common";import{ignoreEntryOptionKeys}from"../constants.js";import{startRspackBuild}from"../core/rspack/start-rspack-build.js";import{startWebpackBuild}from"../core/webpack/index.js";import{EvolveBuildError}from"../errors/evolve-build-error.js";import{printCompilerError}from"../helpers/print-log.js";import{verifyGroupEntryOptions}from"../helpers/verify-group-entry-options.js";export const prepareBuild=async(r,o,t)=>{const{compiler:e}=o,s=Object.values(r)[0];if(!verifyGroupEntryOptions(r,ignoreEntryOptionKeys,!0))throw new Error("The entry options in a group must be the same.");const i=o.multiHtmlCdn?.prod||[];if(!i.length)throw new Error(`No CDN config for env:"prod", groupName: ${s.groupName}`);const p=ensureSlash(i[Math.floor(Math.random()*i.length)],!0);try{const i=s.options?.useRelativeAssetPath,n=mergeOptions(o,{webpack:{publicPath:i?"auto":p}});return"webpack"===e?await startWebpackBuild(r,n,t):await startRspackBuild(r,n,t)}catch(r){const o=printCompilerError(r);throw new EvolveBuildError("BUILD_ERROR",o)}};
@@ -1,4 +1,3 @@
1
- import type { FlatCliOptions } from '../types/types-cli-options.js';
2
1
  import { type EvolveEntryMap } from '../types/types-entry-map.js';
3
2
  import { type FlatEvolveOptions } from '../types/types-options.js';
4
3
  /**
@@ -7,4 +6,4 @@ import { type FlatEvolveOptions } from '../types/types-options.js';
7
6
  * @param servedEntries All normalized webpack entries we have served.
8
7
  * @param evolveOptions FlatEvolveOptions
9
8
  */
10
- export declare const prepareServe: (projectCwd: string, servedEntries: EvolveEntryMap, evolveOptions: FlatEvolveOptions, cliOptions?: FlatCliOptions) => Promise<import("express-serve-static-core").Express | undefined>;
9
+ export declare const prepareServe: (projectCwd: string, servedEntries: EvolveEntryMap, evolveOptions: FlatEvolveOptions) => Promise<import("express-serve-static-core").Express | undefined>;
@@ -1 +1 @@
1
- import{arrayUnique,chalk,logger,urlJoin}from"@flatjs/common";import{attachMockMiddlewares}from"@flatjs/mock";import{ignoreEntryOptionKeys,moduleName}from"../constants.js";import{createRspackCompilerTask}from"../core/rspack/dev-serve/create-rspack-compiler-task.js";import{createWebpackCompilerTask}from"../core/webpack/dev-serve/create-webpack-compiler-task.js";import{createAppPageRoute,createDevServer,createDevServerEntries}from"../dev-server/index.js";import{flatEntryMap,openPage}from"../helpers/index.js";import{normalizePageProxy}from"../helpers/normalize-page-proxy.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{verifyGroupEntryOptions}from"../helpers/verify-group-entry-options.js";import{envVerify}from"./env-verify.js";export const prepareServe=async(e,r,o,t={})=>{const{compilerType:a="webpack"}=t;await envVerify(e,o);const s=splitToEntryGroup(r,o,ignoreEntryOptionKeys,!0);if(!s.length)return void logger.warn("No served entries provided!");const p=[],{app:n,devPort:i,devHostUri:c,publicIp:m}=await createDevServer(o),l=o.devServer?.mockOptions?.mockFilters||[];for(const[,e]of Object.entries(r))l.push(...e.options?.mockFilters||[]);await attachMockMiddlewares(n,{...o.devServer?.mockOptions,mockFilters:arrayUnique(l),projectCwd:e});let v=i;const d=[];for(const e of s){if(!verifyGroupEntryOptions(e,ignoreEntryOptionKeys,!0))throw new Error("The entry options in a group must be the same.");v++;const r=await createDevServerEntries(v,e,o);d.push(r)}const f=flatEntryMap(d);createAppPageRoute(e,n,c,f,o);const y=normalizePageProxy(o.devServer?.pageProxy||"/pages"),g=urlJoin(c,[y]);o.devServer?.autoOpen&&openPage(g);for(const e of d){const r="webpack"===a?createWebpackCompilerTask(m,e,d,o):createRspackCompilerTask(m,e,d,o);p.push(r)}return Promise.all(p).then((()=>(logger.info(`debug page ➩ ${chalk(["cyan"])(g)}`,moduleName),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",(e=>{const r=e.toString();12===r.charCodeAt(0)?console.clear():[102,70].includes(r.charCodeAt(0))&&logger.info(`debug page ➩ ${chalk(["cyan"])(g)}`,moduleName)})),n)))};
1
+ import{arrayUnique,chalk,logger,urlJoin}from"@flatjs/common";import{attachMockMiddlewares}from"@flatjs/mock";import{ignoreEntryOptionKeys,moduleName}from"../constants.js";import{createRspackCompilerTask}from"../core/rspack/dev-serve/create-rspack-compiler-task.js";import{createWebpackCompilerTask}from"../core/webpack/dev-serve/create-webpack-compiler-task.js";import{createAppPageRoute,createDevServer,createDevServerEntries}from"../dev-server/index.js";import{flatEntryMap,openPage}from"../helpers/index.js";import{normalizePageProxy}from"../helpers/normalize-page-proxy.js";import{printPromotions}from"../helpers/print-promotion.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{verifyGroupEntryOptions}from"../helpers/verify-group-entry-options.js";import{envVerify}from"./env-verify.js";export const prepareServe=async(e,r,o)=>{await envVerify(e,o);const t=splitToEntryGroup(r,o,ignoreEntryOptionKeys,!0);if(!t.length)return void logger.warn("No served entries provided!");const s=[],{app:a,devPort:n,devHostUri:p,publicIp:i}=await createDevServer(o),c=o.devServer?.mockOptions?.mockFilters||[];for(const[,e]of Object.entries(r))c.push(...e.options?.mockFilters||[]);await attachMockMiddlewares(a,{...o.devServer?.mockOptions,mockFilters:arrayUnique(c),projectCwd:e});let m=n;const l=[];for(const e of t){if(!verifyGroupEntryOptions(e,ignoreEntryOptionKeys,!0))throw new Error("The entry options in a group must be the same.");m++;const r=await createDevServerEntries(m,e,o);l.push(r)}const v=flatEntryMap(l);createAppPageRoute(e,a,p,v,o);const d=normalizePageProxy(o.devServer?.pageProxy||"/pages"),f=urlJoin(p,[d]);o.devServer?.autoOpen&&openPage(f);const{compiler:g}=o;printPromotions(o);for(const e of l){const r="webpack"===g?createWebpackCompilerTask(i,e,l,o):createRspackCompilerTask(i,e,l,o);s.push(r)}return Promise.all(s).then((()=>(logger.info(`debug page ➩ ${chalk(["cyan"])(f)}`,moduleName),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",(e=>{const r=e.toString();12===r.charCodeAt(0)?console.clear():[102,70].includes(r.charCodeAt(0))&&logger.info(`debug page ➩ ${chalk(["cyan"])(f)}`,moduleName)})),a)))};
@@ -1,15 +1,16 @@
1
- import { type PartialDeep } from 'type-fest';
1
+ import type { DeepPartial } from '@hyperse/config-loader';
2
2
  import { type ConfigLoaderOptions } from '../load-config/types.js';
3
3
  import type { EvolveBuildResult } from '../types/types-build.js';
4
4
  import type { FlatCliOptions } from '../types/types-cli-options.js';
5
+ import type { EvolveEntryMap } from '../types/types-entry-map.js';
5
6
  import { type FlatEvolveOptions } from '../types/types-options.js';
6
7
  export declare function getBuildEntryFiles(projectCwd: string, diffFiles: string[], allEntryInputs: string[], resolveAlias?: Record<string, string>, graphTreeNodeFilter?: (moduleId: string) => boolean): Promise<string[]>;
7
8
  /**
8
9
  * Dynamic check which entry modules need to build.
9
10
  * @returns
10
11
  */
11
- export declare function dynamicCheckBuildEntryMap(projectCwd: string, earlyCommit?: string | null, lastCommit?: string, overrideEvolveOptions?: PartialDeep<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions): Promise<{
12
- buildEntries: import("../index.js").EvolveEntryMap;
12
+ export declare function dynamicCheckBuildEntryMap(projectCwd: string, earlyCommit?: string | null, lastCommit?: string, overrideEvolveOptions?: DeepPartial<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions): Promise<{
13
+ buildEntries: EvolveEntryMap;
13
14
  newEvolveOptions: FlatEvolveOptions;
14
15
  }>;
15
16
  /**
@@ -18,4 +19,4 @@ export declare function dynamicCheckBuildEntryMap(projectCwd: string, earlyCommi
18
19
  * @param earlyCommit The diff based earlier commit hash
19
20
  * @param lastCommit If is omitted, it will have the same effect as using HEAD instead.
20
21
  */
21
- export declare const startDynamicBuild: (projectCwd: string, earlyCommit?: string, lastCommit?: string, overrideEvolveOptions?: PartialDeep<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions, cliOptions?: FlatCliOptions) => Promise<EvolveBuildResult[]>;
22
+ export declare const startDynamicBuild: (projectCwd: string, earlyCommit?: string, lastCommit?: string, overrideEvolveOptions?: DeepPartial<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions, cliOptions?: FlatCliOptions) => Promise<EvolveBuildResult[]>;
@@ -1 +1 @@
1
- import Listr from"listr";import{isAbsolute,join}from"node:path";import{getCommitIdOfBranch,getDiffFiles}from"@armit/git";import{arraysIntersect,chalk,logger,requireResolve,resetLoggerConfig}from"@flatjs/common";import{traverseGraph}from"@flatjs/graph";import{createGlobalCompiler}from"../compiler/create-global-compiler.js";import{ignoreEntryOptionKeys,moduleName}from"../constants.js";import{isCI}from"../helpers/check-runtime-env.js";import{CustomListrRenderer}from"../helpers/custom-listr-renderer.js";import{filterActivedEntriesByEntryInputs,filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{getGitRoot}from"../helpers/get-git-root.js";import{getMaxProcessTasks}from"../helpers/get-max-process-tasks.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{printPromotions}from"../helpers/print-promotion.js";import{resolveEntryMapInputFiles}from"../helpers/resolve-entry-map-input-files.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{envVerify}from"./env-verify.js";import startBuildWorker from"./start-build-worker.js";export async function getBuildEntryFiles(e,r,t,o,i){const n=[],s=[];for(const e of t)r.includes(e)?n.push(e):s.push(e);if(i&&logger.info("Use custom graph traverse filter",moduleName),s.length){const t=await traverseGraph({input:s,projectCwd:e,treeNodeFilter:i||(()=>!0),lessImportOptions:{projectCwd:e,aliases:o}});if(!t)return n;logger.debug(`DependencyGraph:\n${JSON.stringify(t,null,2)}`);for(const e of s){const o=t[e]||[];arraysIntersect(o,r)&&n.push(e)}}return n}export async function dynamicCheckBuildEntryMap(e,r,t,o,i){const n={projectCwd:e,command:"build",resolve:requireResolve},s=await loadEvolveConfig(n,e,o,i);if(s.ci?.fixedBuildModules&&s.ci?.fixedBuildModules.length){logger.info("Use `fixedBuildModules` configuration to build...");return{buildEntries:filterActivedEntriesByModule(s.entryMap,s.ci?.fixedBuildModules),newEvolveOptions:s}}if(logger.info("Dynamicly checking code changed modules ..."),!r){const e=s.ci?.basedBranch||"origin/master";r=await getCommitIdOfBranch(e),logger.info(`Resolving base branch "${e}" commit hash "${r}" ...`)}logger.info(`diffCommits: \n${JSON.stringify({earlyCommit:r,lastCommit:t},null,2)}`,moduleName);let l=r?await getDiffFiles(r,t):[];const a=getGitRoot(e);if(!a)throw new Error(`No .git root (${e}) found`);if(l=l.map((e=>isAbsolute(e)?e:join(a,e))),logger.debug(`Diff files: \n${JSON.stringify(l,null,2)}`),!l.length)return logger.warn("It seems that there are no code files changed."),{buildEntries:{},newEvolveOptions:s};const p=await resolveEntryMapInputFiles(e,s.entryMap),m=await getBuildEntryFiles(e,l,p,s.webpack?.resolve?.alias,s.ci?.graphTreeNodeFilter);logger.debug(`To build entry files: \n${JSON.stringify(m,null,2)}`);return{buildEntries:await filterActivedEntriesByEntryInputs(e,s.entryMap,m),newEvolveOptions:s}}export const startDynamicBuild=async(e,r,t,o={},i,n={})=>{const{buildEntries:s,newEvolveOptions:l}=await dynamicCheckBuildEntryMap(e,r,t,o,i);printPromotions(n),await envVerify(e,l);const a=normalizeEvolveEntryMap(s,l.entryMap),p=splitToEntryGroup(a,l,ignoreEntryOptionKeys,!1);if(!p.length)return logger.warn("No build entries provided!"),[];await createGlobalCompiler(!1,l);const{threads:m={}}=l,c=getMaxProcessTasks(p.length,m?.maxThreads);logger.info(`Start dynamic build with (${chalk(["magenta"])(String(c))}) workers`);const f=new Listr([],{concurrent:c,exitOnError:!0,renderer:isCI()?void 0:CustomListrRenderer}),g=[];for(const r of p){const t=Object.values(r)?.[0]?.groupName||"",s=Object.keys(r);let l=`Group ${chalk(["magenta"])(t)} $STATUS $ENTRY_KEYS${s.join(",")}`;isCI()&&(l=`Group ${chalk(["magenta"])(t)} compiling... $ENTRY_KEYS${s.join(",")}`),f.add({title:l,task:async()=>{const r=await startBuildWorker({projectCwd:e,entryKeys:s,serializedEvolveOptions:jsonSerializer.stringify(o),configLoaderOptions:i,groupName:t,cliOptions:n});g.push(r)}})}return f.tasks.length&&await f.run(),isCI()||resetLoggerConfig(),g};
1
+ import Listr from"listr";import{isAbsolute,join}from"node:path";import{getCommitIdOfBranch,getDiffFiles}from"@armit/git";import{arraysIntersect,chalk,logger,requireResolve}from"@flatjs/common";import{traverseGraph}from"@flatjs/graph";import{createGlobalCompiler}from"../compiler/create-global-compiler.js";import{ignoreEntryOptionKeys,moduleName}from"../constants.js";import{isCI}from"../helpers/check-runtime-env.js";import{CustomListrRenderer}from"../helpers/custom-listr-renderer.js";import{filterActivedEntriesByEntryInputs,filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{getGitRoot}from"../helpers/get-git-root.js";import{getMaxProcessTasks}from"../helpers/get-max-process-tasks.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{printPromotions}from"../helpers/print-promotion.js";import{resolveEntryMapInputFiles}from"../helpers/resolve-entry-map-input-files.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{createThreadWorker}from"./create-thread-worker.js";import{envVerify}from"./env-verify.js";import startBuildWorker from"./start-build-worker.js";const runWebpackTask=async(e,r,t,o,i,s={})=>{const{threads:n={}}=t,a=getMaxProcessTasks(r.length,n?.maxThreads);logger.info(`Start dynamic build with (${chalk(["magenta"])(String(a))}) workers`);const l=createThreadWorker({...n,maxThreads:a}),p=new Listr([],{concurrent:a,exitOnError:!0,renderer:isCI()?void 0:CustomListrRenderer}),c=[];for(const t of r){const r=Object.values(t)?.[0]?.groupName||"",n=Object.keys(t);let a=`Group ${chalk(["magenta"])(r)} $STATUS $ENTRY_KEYS${n.join(",")}`;isCI()&&(a=`Group ${chalk(["magenta"])(r)} compiling... $ENTRY_KEYS${n.join(",")}`),p.add({title:a,task:async()=>{const t=await l.startBuildWorker({projectCwd:e,entryKeys:n,serializedEvolveOptions:jsonSerializer.stringify(o),configLoaderOptions:i,groupName:r,cliOptions:s});c.push(t)}})}if(p.tasks.length)try{await p.run()}catch(e){throw l.terminate(),e}return l.terminate(),c},runRspackTask=async(e,r,t,o,i={})=>{const s=[];for(const n of r){const r=Object.values(n)?.[0]?.groupName||"",a=Object.keys(n),l=await startBuildWorker({projectCwd:e,entryKeys:a,serializedEvolveOptions:jsonSerializer.stringify(t),configLoaderOptions:o,groupName:r,cliOptions:i});s.push(l)}return s};export async function getBuildEntryFiles(e,r,t,o,i){const s=[],n=[];for(const e of t)r.includes(e)?s.push(e):n.push(e);if(i&&logger.info("Use custom graph traverse filter",moduleName),n.length){const t=await traverseGraph({input:n,projectCwd:e,treeNodeFilter:i||(()=>!0),lessImportOptions:{projectCwd:e,aliases:o}});if(!t)return s;logger.debug(`DependencyGraph:\n${JSON.stringify(t,null,2)}`);for(const e of n){const o=t[e]||[];arraysIntersect(o,r)&&s.push(e)}}return s}export async function dynamicCheckBuildEntryMap(e,r,t,o,i){const s={projectCwd:e,command:"build",resolve:requireResolve},n=await loadEvolveConfig(s,e,o,i);if(n.ci?.fixedBuildModules&&n.ci?.fixedBuildModules.length){logger.info("Use `fixedBuildModules` configuration to build...");return{buildEntries:filterActivedEntriesByModule(n.entryMap,n.ci?.fixedBuildModules),newEvolveOptions:n}}if(logger.info("Dynamicly checking code changed modules ..."),!r){const e=n.ci?.basedBranch||"origin/master";r=await getCommitIdOfBranch(e),logger.info(`Resolving base branch "${e}" commit hash "${r}" ...`)}logger.info(`diffCommits: \n${JSON.stringify({earlyCommit:r,lastCommit:t},null,2)}`,moduleName);let a=r?await getDiffFiles(r,t):[];const l=getGitRoot(e);if(!l)throw new Error(`No .git root (${e}) found`);if(a=a.map((e=>isAbsolute(e)?e:join(l,e))),logger.debug(`Diff files: \n${JSON.stringify(a,null,2)}`),!a.length)return logger.warn("It seems that there are no code files changed."),{buildEntries:{},newEvolveOptions:n};const p=await resolveEntryMapInputFiles(e,n.entryMap),c=await getBuildEntryFiles(e,a,p,n.webpack?.resolve?.alias,n.ci?.graphTreeNodeFilter);logger.debug(`To build entry files: \n${JSON.stringify(c,null,2)}`);return{buildEntries:await filterActivedEntriesByEntryInputs(e,n.entryMap,c),newEvolveOptions:n}}export const startDynamicBuild=async(e,r,t,o={},i,s={})=>{const{buildEntries:n,newEvolveOptions:a}=await dynamicCheckBuildEntryMap(e,r,t,o,i);await envVerify(e,a);const l=normalizeEvolveEntryMap(n,a.entryMap),p=splitToEntryGroup(l,a,ignoreEntryOptionKeys,!1);if(!p.length)return logger.warn("No build entries provided!"),[];await createGlobalCompiler(!1,a);const{compiler:c}=a;printPromotions(a);let m=[];return"webpack"===c?m=await runWebpackTask(e,p,a,o,i,s):"rspack"===c&&(m=await runRspackTask(e,p,o,i,s)),m};
@@ -1 +1 @@
1
- import{configLoggerStdWriteSteam,requireResolve}from"@flatjs/common";import{ignoreEntryOptionKeys}from"../constants.js";import{isCI}from"../helpers/check-runtime-env.js";import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{prepareBuild}from"./prepare-build.js";export default async e=>{isCI()||configLoggerStdWriteSteam();const{projectCwd:r,entryKeys:o,serializedEvolveOptions:i,configLoaderOptions:t,groupName:n="flatjs_evolve_group",cliOptions:p}=e,s={projectCwd:r,command:"build",resolve:requireResolve},l=jsonSerializer.parse(i)||{},a=await loadEvolveConfig(s,r,l,t),m=o.map((e=>new RegExp(`^${e}$`))),f=filterActivedEntriesByModule(a.entryMap,m),d=normalizeEvolveEntryMap(f,a.entryMap),v=splitToEntryGroup(d,a,ignoreEntryOptionKeys,!1)[0];for(const[,e]of Object.entries(v))e.groupName=n;return prepareBuild(v,a,p).then((e=>e))};
1
+ import{configLoggerStdWriteSteam,requireResolve}from"@flatjs/common";import{ignoreEntryOptionKeys}from"../constants.js";import{isCI}from"../helpers/check-runtime-env.js";import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{prepareBuild}from"./prepare-build.js";export default async e=>{const{projectCwd:r,entryKeys:o,serializedEvolveOptions:i,configLoaderOptions:t,groupName:n="flatjs_evolve_group",cliOptions:p}=e,s={projectCwd:r,command:"build",resolve:requireResolve},l=jsonSerializer.parse(i)||{},{compiler:a}=l;isCI()||"webpack"!==a||configLoggerStdWriteSteam();const m=await loadEvolveConfig(s,r,l,t),f=o.map((e=>new RegExp(`^${e}$`))),c=filterActivedEntriesByModule(m.entryMap,f),d=normalizeEvolveEntryMap(c,m.entryMap),v=splitToEntryGroup(d,m,ignoreEntryOptionKeys,!1)[0];for(const[,e]of Object.entries(v))e.groupName=n;return prepareBuild(v,m,p).then((e=>e))};
@@ -1,6 +1,6 @@
1
- import { type PartialDeep } from 'type-fest';
1
+ import type { DeepPartial } from '@hyperse/config-loader';
2
2
  import { type ConfigLoaderOptions } from '../load-config/types.js';
3
3
  import type { EvolveBuildResult } from '../types/types-build.js';
4
4
  import type { FlatCliOptions } from '../types/types-cli-options.js';
5
5
  import { type FlatEvolveOptions } from '../types/types-options.js';
6
- export declare const startBuild: (projectCwd: string, buildModules: string[], overrideEvolveOptions?: PartialDeep<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions, cliOptions?: FlatCliOptions) => Promise<EvolveBuildResult[]>;
6
+ export declare const startBuild: (projectCwd: string, buildModules: string[], overrideEvolveOptions?: DeepPartial<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions, cliOptions?: FlatCliOptions) => Promise<EvolveBuildResult[]>;
@@ -1 +1 @@
1
- import Listr from"listr";import{chalk,logger,requireResolve,resetLoggerConfig}from"@flatjs/common";import{createGlobalCompiler}from"../compiler/create-global-compiler.js";import{ignoreEntryOptionKeys}from"../constants.js";import{isCI}from"../helpers/check-runtime-env.js";import{CustomListrRenderer}from"../helpers/custom-listr-renderer.js";import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{getMaxProcessTasks}from"../helpers/get-max-process-tasks.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{printPromotions}from"../helpers/print-promotion.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{envVerify}from"./env-verify.js";import{startAnalyzer}from"./start-analyzer.js";import startBuildWorker from"./start-build-worker.js";export const startBuild=async(r,e,o={},t,i={})=>{const{analyzer:s=!1}=i,n={projectCwd:r,command:"build",resolve:requireResolve};printPromotions(i);const a=await loadEvolveConfig(n,r,o,t);await envVerify(r,a);const l=filterActivedEntriesByModule(a.entryMap,e),m=normalizeEvolveEntryMap(l,a.entryMap),p=splitToEntryGroup(m,a,ignoreEntryOptionKeys,!1);if(!p.length)return logger.warn("No build entries provided!"),[];await createGlobalCompiler(!1,a);const{threads:c={}}=a,f=getMaxProcessTasks(p.length,c?.maxThreads);logger.info(`Start standard build with (${chalk(["magenta"])(String(f))}) workers`);const g=new Listr([],{concurrent:f,exitOnError:!0,renderer:isCI()?void 0:CustomListrRenderer}),d=[];for(const e of p){const s=Object.values(e)?.[0]?.groupName||"",n=Object.keys(e);let a=`Group ${chalk(["magenta"])(s)} $STATUS $ENTRY_KEYS${n.join(",")}`;isCI()&&(a=`Group ${chalk(["magenta"])(s)} compiling... $ENTRY_KEYS${n.join(",")}`),g.add({title:a,task:async()=>{const e=await startBuildWorker({projectCwd:r,entryKeys:n,groupName:s,serializedEvolveOptions:jsonSerializer.stringify(o),configLoaderOptions:t,cliOptions:i});d.push(e)}})}return g.tasks.length&&await g.run(),s&&startAnalyzer(a),isCI()||resetLoggerConfig(),d};
1
+ import Listr from"listr";import{chalk,logger,requireResolve}from"@flatjs/common";import{createGlobalCompiler}from"../compiler/create-global-compiler.js";import{ignoreEntryOptionKeys}from"../constants.js";import{isCI}from"../helpers/check-runtime-env.js";import{CustomListrRenderer}from"../helpers/custom-listr-renderer.js";import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{getMaxProcessTasks}from"../helpers/get-max-process-tasks.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{printPromotions}from"../helpers/print-promotion.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{createThreadWorker}from"./create-thread-worker.js";import{envVerify}from"./env-verify.js";import{startAnalyzer}from"./start-analyzer.js";import startBuildWorker from"./start-build-worker.js";const runWebpackTask=async(r,e,t,o,s,i={})=>{const{threads:a={}}=t,n=getMaxProcessTasks(e.length,a?.maxThreads);logger.info(`Start standard build with (${chalk(["magenta"])(String(n))}) workers`);const l=createThreadWorker({...a,maxThreads:n}),p=new Listr([],{concurrent:n,exitOnError:!0,renderer:isCI()?void 0:CustomListrRenderer}),m=[];for(const t of e){const e=Object.values(t)?.[0]?.groupName||"",a=Object.keys(t);let n=`Group ${chalk(["magenta"])(e)} $STATUS $ENTRY_KEYS${a.join(",")}`;isCI()&&(n=`Group ${chalk(["magenta"])(e)} compiling... $ENTRY_KEYS${a.join(",")}`),p.add({title:n,task:async()=>{const t=await l.startBuildWorker({projectCwd:r,entryKeys:a,groupName:e,serializedEvolveOptions:jsonSerializer.stringify(o),configLoaderOptions:s,cliOptions:i});m.push(t)}})}if(p.tasks.length)try{await p.run()}catch(r){throw l.terminate(),r}return l.terminate(),m},runRspackTask=async(r,e,t,o,s={})=>{const i=[];for(const a of e){const e=Object.values(a)?.[0]?.groupName||"",n=Object.keys(a),l=await startBuildWorker({projectCwd:r,entryKeys:n,groupName:e,serializedEvolveOptions:jsonSerializer.stringify(t),configLoaderOptions:o,cliOptions:s});i.push(l)}return i};export const startBuild=async(r,e,t={},o,s={})=>{const{analyzer:i=!1}=s,a={projectCwd:r,command:"build",resolve:requireResolve},n=await loadEvolveConfig(a,r,t,o);await envVerify(r,n);const l=filterActivedEntriesByModule(n.entryMap,e),p=normalizeEvolveEntryMap(l,n.entryMap),m=splitToEntryGroup(p,n,ignoreEntryOptionKeys,!1);if(!m.length)return logger.warn("No build entries provided!"),[];await createGlobalCompiler(!1,n);const{compiler:c}=n;printPromotions(n);let d=[];return"webpack"===c?d=await runWebpackTask(r,m,n,t,o,s):"rspack"===c&&(d=await runRspackTask(r,m,t,o,s)),i&&startAnalyzer(n),d};
@@ -1,6 +1,5 @@
1
- import { type PartialDeep } from 'type-fest';
1
+ import type { DeepPartial } from '@hyperse/config-loader';
2
2
  import { type ConfigLoaderOptions } from '../load-config/types.js';
3
- import type { FlatCliOptions } from '../types/types-cli-options.js';
4
3
  import { type FlatEvolveOptions } from '../types/types-options.js';
5
4
  /**
6
5
  * The main entry to start evolve serve
@@ -9,4 +8,4 @@ import { type FlatEvolveOptions } from '../types/types-options.js';
9
8
  * @param overrideEvolveOptions The overrided evolve options
10
9
  * @param configLoaderOptions Evolve config loader options
11
10
  */
12
- export declare const startServe: (projectCwd: string, serveModules: string[], overrideEvolveOptions?: PartialDeep<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions, cliOptions?: FlatCliOptions) => Promise<never[] | import("express-serve-static-core").Express | undefined>;
11
+ export declare const startServe: (projectCwd: string, serveModules: string[], overrideEvolveOptions?: DeepPartial<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions) => Promise<never[] | import("express-serve-static-core").Express | undefined>;
@@ -1 +1 @@
1
- import{logger,requireResolve}from"@flatjs/common";import{createGlobalCompiler}from"../compiler/create-global-compiler.js";import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{printPromotions}from"../helpers/print-promotion.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{prepareServe}from"./prepare-serve.js";export const startServe=async(e,r,o={},t,i={})=>{const l={projectCwd:e,command:"serve",resolve:requireResolve};printPromotions(i);const n=await loadEvolveConfig(l,e,o,t),p=filterActivedEntriesByModule(n.entryMap,r),a=Object.keys(p);if(!a.length)return logger.warn("No served entries providered!"),[];logger.info({servedEntries:a});const s=normalizeEvolveEntryMap(p,n.entryMap);return await createGlobalCompiler(!0,n),prepareServe(e,s,n,i)};
1
+ import{logger,requireResolve}from"@flatjs/common";import{createGlobalCompiler}from"../compiler/create-global-compiler.js";import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{mergeInspectorEvolveConfig}from"../helpers/merge-inspector-evolve-config.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{prepareServe}from"./prepare-serve.js";export const startServe=async(e,r,o={},t)=>{const i={projectCwd:e,command:"serve",resolve:requireResolve};let l=await loadEvolveConfig(i,e,o,t);const{inspector:n}=l;n&&n?.injectClient&&(l=mergeInspectorEvolveConfig(l));const s=filterActivedEntriesByModule(l.entryMap,r),p=Object.keys(s);if(!p.length)return logger.warn("No served entries providered!"),[];logger.info({servedEntries:p});const a=normalizeEvolveEntryMap(s,l.entryMap);return await createGlobalCompiler(!0,l),prepareServe(e,a,l)};
@@ -1,4 +1,4 @@
1
- import { type PartialDeep } from 'type-fest';
1
+ import type { DeepPartial } from '@hyperse/config-loader';
2
2
  import { type ConfigLoaderOptions } from '../load-config/types.js';
3
3
  import { type FlatEvolveOptions } from '../types/types-options.js';
4
4
  /**
@@ -7,4 +7,4 @@ import { type FlatEvolveOptions } from '../types/types-options.js';
7
7
  * @param overrideEvolveOptions The overrided evolve options
8
8
  * @param configLoaderOptions Evolve config loader options
9
9
  */
10
- export declare const startStatic: (projectCwd: string, overrideEvolveOptions?: PartialDeep<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions) => Promise<void>;
10
+ export declare const startStatic: (projectCwd: string, overrideEvolveOptions?: DeepPartial<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions) => Promise<void>;
@@ -0,0 +1,4 @@
1
+ import type { Plugin as RspackPlugin } from '@rspack/core';
2
+ import { type ProgressPluginArgument } from '@rspack/core';
3
+ import type { EntryMapItem } from '../../../types/types-entry-map.js';
4
+ export declare const createProgressRspackPlugins: (entryMapItemList: EntryMapItem[], pluginOptions?: ProgressPluginArgument) => RspackPlugin[];
@@ -0,0 +1 @@
1
+ import{Worker}from"node:worker_threads";import{resolve}from"path";import{getDirname}from"@armit/file-utility";import{mergeOptions}from"@hyperse/config-loader";import{ProgressPlugin}from"@rspack/core";import{progressHandler}from"./progress-handler.js";export const createProgressRspackPlugins=(r,e={})=>{if("test"===process.env.NODE_ENV)return console.warn("[WARNING] Using fake thread pool worker for unittest!"),[new ProgressPlugin({prefix:"[ evolve vite progress ]"})];const o=resolve(getDirname(import.meta.url),"./progress-worker.js"),s=new Worker(o,{env:{...process.env,FORCE_COLOR:"3"}}),t=mergeOptions(progressHandler(s,r),e);return[new ProgressPlugin(t),{apply(r){r.hooks.done.tap("shutdown",(()=>{s.terminate()}))}}]};
@@ -0,0 +1,3 @@
1
+ import type { Worker } from 'node:worker_threads';
2
+ import type { EntryMapItem } from '../../../types/types-entry-map.js';
3
+ export declare const progressHandler: (worker: Worker, entryMapItemList: EntryMapItem[]) => (percentage: number, _: string) => void;
@@ -0,0 +1 @@
1
+ export const progressHandler=(s,t)=>{const e=t[0],[r,a]=e,o=a?.groupName||"",n=t.map((([s])=>s));return(t,e)=>{const r={status:t>0&&t<1?"start":"end",data:{groupName:o,entryKeys:n}};s.postMessage(r)}};
@@ -0,0 +1,7 @@
1
+ export type ProgressWorkerMessage = {
2
+ status: 'start' | 'end';
3
+ data: {
4
+ groupName: string;
5
+ entryKeys: string[];
6
+ };
7
+ };
@@ -0,0 +1 @@
1
+ import logUpdate from"log-update";import{parentPort}from"worker_threads";import{chalk}from"@flatjs/common";import{buildProgressSpinnerFrames}from"../../../constants.js";import{formatSpinnerText}from"../../../helpers/format-spinner-text.js";let startIndex=0;class ProgressWorker{constructor(){this.intervalId=null}start(r,e){this.intervalId||(this.intervalId=setInterval((()=>{startIndex=++startIndex%buildProgressSpinnerFrames.length;const t=buildProgressSpinnerFrames[startIndex],n=`Group ${chalk(["magenta"])(r)} compiling...`;logUpdate(`${chalk(["cyan"])(t)} ${n} \n${formatSpinnerText(e)}`)}),100))}end(r,e){this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null);const t=`Group ${chalk(["magenta"])(r)} ${chalk(["green"])("done")}`;logUpdate(`${chalk(["green"])("✔")} ${t} \n${formatSpinnerText(e,"✔","green")}`),logUpdate.done()}}const progressWorker=new ProgressWorker;parentPort?.on("message",(({status:r,data:e})=>{const{groupName:t,entryKeys:n}=e;"start"===r?progressWorker.start(t,n):"end"===r&&progressWorker.end(t,n)}));
@@ -1 +1 @@
1
- import{rmSync}from"node:fs";import{relative}from"node:path";import{fileWalkSync}from"@armit/file-utility";import{logger}from"@flatjs/common";import{moduleName}from"../../../constants.js";export class CleanWebpackPlugin{constructor(e={}){this.verbose=!0===e.verbose||!1,this.projectCwd=e.projectCwd||process.cwd(),this.cleanStaleWebpackAssets=!0!==e.cleanStaleWebpackAssets&&!1!==e.cleanStaleWebpackAssets||e.cleanStaleWebpackAssets,this.protectWebpackAssets=!0!==e.protectWebpackAssets&&!1!==e.protectWebpackAssets||e.protectWebpackAssets,this.cleanAfterEveryBuildPatterns=Array.isArray(e.cleanAfterEveryBuildPatterns)?e.cleanAfterEveryBuildPatterns:[],this.cleanOnceBeforeBuildPatterns=Array.isArray(e.cleanOnceBeforeBuildPatterns)?e.cleanOnceBeforeBuildPatterns:["**/*"],this.currentAssets=[],this.initialClean=!1,this.outputPath="",this.apply=this.apply.bind(this),this.handleInitial=this.handleInitial.bind(this),this.handleDone=this.handleDone.bind(this),this.removeFiles=this.removeFiles.bind(this)}apply(e){if(!e.options.output||!e.options.output.path)return void logger.warn("clean-webpack-plugin: options.output.path not defined. Plugin disabled...",moduleName);this.outputPath=e.options.output.path;const t=e.hooks;0!==this.cleanOnceBeforeBuildPatterns.length&&t.emit.tap("clean-webpack-plugin",(e=>{this.handleInitial(e)})),t.done.tap("clean-webpack-plugin",(e=>{this.handleDone(e)}))}handleInitial(e){if(this.initialClean)return;e.getStats().hasErrors()||(this.initialClean=!0,this.removeFiles(this.cleanOnceBeforeBuildPatterns))}handleDone(e){if(e.hasErrors())return void(this.verbose&&logger.warn("clean-webpack-plugin: pausing due to webpack errors",moduleName));const t=(e.toJson({assets:!0}).assets||[]).map((e=>e.name)),s=this.currentAssets.filter((e=>!1===t.includes(e)));this.currentAssets=t.sort();const i=[];!0===this.cleanStaleWebpackAssets&&0!==s.length&&i.push(...s),0!==this.cleanAfterEveryBuildPatterns.length&&i.push(...this.cleanAfterEveryBuildPatterns),0!==i.length&&this.removeFiles(i)}removeFiles(e){try{const t=fileWalkSync(e,{absolute:!0,unique:!0,cwd:this.outputPath,dot:!0,ignore:this.protectWebpackAssets?this.currentAssets:[]});for(const e of t)rmSync(e,{force:!0,recursive:!0});this.verbose&&t.forEach((e=>{const t=relative(this.projectCwd,e);logger.debug(`clean-webpack-plugin: removed ${t}`,moduleName)}))}catch(e){if(/Cannot delete files\/folders outside the current working directory\./.test(e.message)){throw new Error("clean-webpack-plugin: Cannot delete files/folders outside the current working directory. Can be overridden with the `dangerouslyAllowCleanPatternsOutsideProject` option.")}throw e}}}
1
+ import{rmSync}from"node:fs";import{relative}from"node:path";import{fileWalkSync}from"@armit/file-utility";import{logger}from"@flatjs/common";import{moduleName}from"../../../constants.js";export class CleanWebpackPlugin{constructor(e={}){this.verbose=!0===e.verbose||!1,this.projectCwd=e.projectCwd||process.cwd(),this.cleanStaleWebpackAssets=!0!==e.cleanStaleWebpackAssets&&!1!==e.cleanStaleWebpackAssets||e.cleanStaleWebpackAssets,this.protectWebpackAssets=!0!==e.protectWebpackAssets&&!1!==e.protectWebpackAssets||e.protectWebpackAssets,this.cleanAfterEveryBuildPatterns=Array.isArray(e.cleanAfterEveryBuildPatterns)?e.cleanAfterEveryBuildPatterns:[],this.cleanOnceBeforeBuildPatterns=Array.isArray(e.cleanOnceBeforeBuildPatterns)?e.cleanOnceBeforeBuildPatterns:["**/*"],this.currentAssets=[],this.initialClean=!1,this.outputPath="",this.apply=this.apply.bind(this),this.handleInitial=this.handleInitial.bind(this),this.handleDone=this.handleDone.bind(this),this.removeFiles=this.removeFiles.bind(this)}apply(e){if(!e.options.output||!e.options.output.path)return void logger.warn("clean-webpack-plugin: options.output.path not defined. Plugin disabled...",moduleName);this.outputPath=e.options.output.path;const t=e.hooks;0!==this.cleanOnceBeforeBuildPatterns.length&&t.emit.tap("clean-webpack-plugin",(e=>{this.handleInitial(e)})),t.done.tap("clean-webpack-plugin",(e=>{logger.info("start clean cache..."),this.handleDone(e)}))}handleInitial(e){if(this.initialClean)return;e.getStats().hasErrors()||(this.initialClean=!0,this.removeFiles(this.cleanOnceBeforeBuildPatterns))}handleDone(e){if(e.hasErrors())return void(this.verbose&&logger.warn("clean-webpack-plugin: pausing due to webpack errors",moduleName));const t=(e.toJson({assets:!0}).assets||[]).map((e=>e.name)),s=this.currentAssets.filter((e=>!1===t.includes(e)));this.currentAssets=t.sort();const i=[];!0===this.cleanStaleWebpackAssets&&0!==s.length&&i.push(...s),0!==this.cleanAfterEveryBuildPatterns.length&&i.push(...this.cleanAfterEveryBuildPatterns),0!==i.length&&this.removeFiles(i)}removeFiles(e){try{const t=fileWalkSync(e,{absolute:!0,unique:!0,cwd:this.outputPath,dot:!0,ignore:this.protectWebpackAssets?this.currentAssets:[]});for(const e of t)rmSync(e,{force:!0,recursive:!0});this.verbose&&t.forEach((e=>{const t=relative(this.projectCwd,e);logger.debug(`clean-webpack-plugin: removed ${t}`,moduleName)}))}catch(e){if(/Cannot delete files\/folders outside the current working directory\./.test(e.message)){throw new Error("clean-webpack-plugin: Cannot delete files/folders outside the current working directory. Can be overridden with the `dangerouslyAllowCleanPatternsOutsideProject` option.")}throw e}}}
@@ -1 +1 @@
1
- import{assertSwcImportOptions}from"@flatjs/babel-plugin-import/helpers";import{shouldEnableReactFastRefresh}from"../../helpers/should-enable-react-fast-refresh.js";export const rspackRuleScripts=(e,t,r)=>{const{loaderOptions:s,projectCwd:a}=r,{modularImports:o=[]}=s,p=assertSwcImportOptions(a,o),l=shouldEnableReactFastRefresh(e,t,r);return{test:/\.(jsx|tsx|ts|js|mjs|cjs|mts|cts)$/,exclude:/node_modules/,use:[{loader:"builtin:swc-loader",options:{jsc:{parser:{decorators:!0,syntax:"typescript",tsx:!0},externalHelpers:!0,experimental:{keepImportAttributes:!0,plugins:[["@flatjs/swc-plugin-import",{modularImports:p}]]},transform:{legacyDecorator:!0,react:{runtime:"automatic",pragma:"React.createElement",pragmaFrag:"React.Fragment",throwIfNamespace:!0,development:l,refresh:l}}},env:{mode:"entry",targets:{browsers:["ie >= 11","safari > 10"]}}}}]}};
1
+ import{assertSwcImportOptions}from"@flatjs/babel-plugin-import/helpers";import{requireResolve}from"@flatjs/common";import{shouldEnableReactFastRefresh}from"../../helpers/should-enable-react-fast-refresh.js";export const rspackRuleScripts=(e,r,t)=>{const{loaderOptions:s,projectCwd:o,inspector:a}=t,{modularImports:p=[]}=s,l=assertSwcImportOptions(o,p),m=shouldEnableReactFastRefresh(e,r,t),c=[];return c.push([requireResolve(import.meta.url,"@flatjs/swc-plugin-import"),{modularImports:l}]),e&&a&&c.push(["@hyperse/inspector-swc-plugin",{projectCwd:o}]),{test:/\.(jsx|tsx|ts|js|mjs|cjs|mts|cts)$/,exclude:/node_modules/,use:[{loader:"builtin:swc-loader",options:{jsc:{parser:{decorators:!0,syntax:"typescript",tsx:!0},externalHelpers:!0,experimental:{keepImportAttributes:!0,plugins:[...c]},transform:{legacyDecorator:!0,react:{runtime:"automatic",pragma:"React.createElement",pragmaFrag:"React.Fragment",throwIfNamespace:!0,development:m,refresh:m}}},env:{mode:"entry",targets:{browsers:["ie >= 11","safari > 10"]}}}}]}};
@@ -1 +1 @@
1
- import{requireResolve}from"@flatjs/common";import{mergeBabelOption}from"../../helpers/merge-babel-options.js";import{shouldEnableReactFastRefresh}from"../../helpers/should-enable-react-fast-refresh.js";export const ruleBabel=e=>({test:/\.(tsx|ts|js|jsx|mjs|cjs|mts|cts)$/,use:[{loader:requireResolve(import.meta.url,"babel-loader"),options:e}]});export const webpackRuleScripts=(e,r,s)=>{const{projectCwd:t}=s,{babelOptions:o={},modularImports:l=[]}=s.loaderOptions,a=mergeBabelOption(e,l,o,t);return shouldEnableReactFastRefresh(e,r,s)&&(a.plugins?a.plugins.push(requireResolve(import.meta.url,"react-refresh/babel")):a.plugins=[requireResolve(import.meta.url,"react-refresh/babel")]),ruleBabel(a)};
1
+ import{requireResolve}from"@flatjs/common";import{mergeBabelOption}from"../../helpers/merge-babel-options.js";import{shouldEnableReactFastRefresh}from"../../helpers/should-enable-react-fast-refresh.js";export const ruleBabel=e=>({test:/\.(tsx|ts|js|jsx|mjs|cjs|mts|cts)$/,use:[{loader:requireResolve(import.meta.url,"babel-loader"),options:e}]});export const webpackRuleScripts=(e,r,s)=>{const{projectCwd:t,inspector:l}=s,{babelOptions:o={},modularImports:p=[]}=s.loaderOptions,a=mergeBabelOption(e,p,o,t);return shouldEnableReactFastRefresh(e,r,s)&&(a.plugins?a.plugins.push(requireResolve(import.meta.url,"react-refresh/babel")):a.plugins=[requireResolve(import.meta.url,"react-refresh/babel")]),e&&l&&(a.plugins?a.plugins.push([requireResolve(import.meta.url,"@hyperse/inspector-babel-plugin"),{projectCwd:t}]):a.plugins=[[requireResolve(import.meta.url,"@hyperse/inspector-babel-plugin"),{projectCwd:t}]]),ruleBabel(a)};
@@ -9,9 +9,4 @@ export interface FlatCliOptions {
9
9
  * @default false
10
10
  */
11
11
  analyzer?: boolean;
12
- /**
13
- * The kernel types used for building currently offer webpack and rspack
14
- * @default 'webpack'
15
- */
16
- compilerType?: 'webpack' | 'rspack';
17
12
  }
@@ -81,7 +81,7 @@ export interface EvolveEntryItemOption extends MultiHtmlCDNEntryItem {
81
81
  output?: Omit<Required<Configuration>['output'], 'chunkFilename' | 'cssChunkFilename'>;
82
82
  }
83
83
  export type EvolveEntryMapContent = {
84
- entry: [string, ...string[]];
84
+ entry: string[];
85
85
  options?: EvolveEntryItemOption;
86
86
  /**
87
87
  * An alias used when grouping builds
@@ -1,4 +1,5 @@
1
1
  import { type VerifyPackagePattern } from '@armit/package';
2
+ import type { TrustedEditor } from '@hyperse/inspector-common';
2
3
  import { type FlatEvolveCI } from './types-ci.js';
3
4
  import { type FlatEvolveDevServerOptions } from './types-dev-server.js';
4
5
  import { type EvolveEntryMap } from './types-entry-map.js';
@@ -134,9 +135,44 @@ export interface FlatEvolveOptions {
134
135
  * @default 10
135
136
  */
136
137
  maxEntryGroupSize?: number;
138
+ /**
139
+ * The kernel types used for building currently offer webpack and rspack
140
+ * @default 'webpack'
141
+ */
142
+ compiler?: 'webpack' | 'rspack';
137
143
  /**
138
144
  * Whether to open the rs-evolve doctor plugin.
139
145
  * @default false
140
146
  */
141
147
  openRsdoctor?: boolean;
148
+ /**
149
+ * The options of code inspector.
150
+ *
151
+ * If `serveMode` is `false`, it will be ignored. and close code inspector.
152
+ *
153
+ */
154
+ inspector?: false | {
155
+ /**
156
+ * Inspector Component toggle hotkeys,
157
+ *
158
+ * @default - `['$mod', 'i']` on macOS, `['Ctrl', 'i']` on other platforms.
159
+ *
160
+ */
161
+ keys?: string[];
162
+ /**
163
+ * Whether to automatically inject the code inspector client entry.
164
+ * @default true
165
+ */
166
+ injectClient?: boolean;
167
+ /**
168
+ * The base path of the launch editor endpoint.
169
+ * @default '/__hps_inspector'
170
+ */
171
+ customLaunchEditorEndpoint?: string;
172
+ /**
173
+ * The trusted editors that can be launched from browser.
174
+ * @default 'code'
175
+ */
176
+ trustedEditor?: `${TrustedEditor}`;
177
+ };
142
178
  }
@@ -6,7 +6,7 @@ export type WebpackPlugin = ((this: Compiler, compiler: Compiler) => void) | Web
6
6
  * The webpack entry configuration.
7
7
  */
8
8
  export interface WebpackEntryObject {
9
- [index: string]: string | [string, ...string[]];
9
+ [index: string]: string[];
10
10
  }
11
11
  export interface FlatEvolveWebpackOptions extends Pick<Configuration, 'infrastructureLogging'> {
12
12
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flatjs/evolve",
3
- "version": "2.3.2-next.2",
3
+ "version": "2.3.2-next.4",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {
@@ -18,8 +18,9 @@
18
18
  "./templates"
19
19
  ],
20
20
  "scripts": {
21
- "serve": "yarn node --import=@hyperse/ts-node-paths/register ./tests/dev-server/dev-server.ts",
22
- "analyzer": "yarn node --import=@hyperse/ts-node-paths/register ./tests/build-analyzer/start-analyzer.ts",
21
+ "serve:react19": "yarn node --import=@hyperse/ts-node/register ./tests/dev-server-react19/dev-server.ts",
22
+ "serve": "yarn node --import=@hyperse/ts-node/register ./tests/dev-server/dev-server.ts",
23
+ "analyzer": "yarn node --import=@hyperse/ts-node/register ./tests/build-analyzer/start-analyzer.ts",
23
24
  "build": "rimraf dist && tsc -p ./tsconfig.build.json && npm run minify",
24
25
  "?build-release": "When https://github.com/atlassian/changesets/issues/432 has a solution we can remove this trick",
25
26
  "build-release": "yarn build && rimraf ./_release && yarn pack && mkdir ./_release && tar zxvf ./package.tgz --directory ./_release && rm ./package.tgz",
@@ -42,24 +43,30 @@
42
43
  },
43
44
  "dependencies": {
44
45
  "@armit/babel-merge": "^0.2.11",
45
- "@armit/config-loader": "^0.3.5",
46
46
  "@armit/file-utility": "^0.2.11",
47
47
  "@armit/git": "^0.2.11",
48
48
  "@armit/package": "^0.2.15",
49
49
  "@babel/core": "^7.26.10",
50
50
  "@clack/prompts": "^0.10.1",
51
51
  "@discoveryjs/json-ext": "0.6.3",
52
- "@flatjs/babel-plugin-import": "2.2.9-next.1",
53
- "@flatjs/common": "2.2.4-next.0",
54
- "@flatjs/evolve-preset-babel": "2.2.4-next.0",
55
- "@flatjs/forge-postcss-plugin-pixel": "2.2.4-next.0",
56
- "@flatjs/forge-ts-checker": "1.1.2-next.0",
57
- "@flatjs/graph": "2.2.9-next.1",
58
- "@flatjs/mock": "2.4.1-next.1",
52
+ "@flatjs/babel-plugin-import": "2.2.9-next.3",
53
+ "@flatjs/common": "2.2.4-next.1",
54
+ "@flatjs/evolve-preset-babel": "2.2.4-next.1",
55
+ "@flatjs/forge-postcss-plugin-pixel": "2.2.4-next.1",
56
+ "@flatjs/forge-ts-checker": "1.1.2-next.1",
57
+ "@flatjs/graph": "2.2.9-next.3",
58
+ "@flatjs/mock": "2.4.1-next.3",
59
+ "@flatjs/swc-plugin-import": "1.0.0-next.4",
60
+ "@hyperse/config-loader": "^1.0.5",
61
+ "@hyperse/inspector": "^1.1.6",
62
+ "@hyperse/inspector-babel-plugin": "^1.1.5",
63
+ "@hyperse/inspector-common": "^1.1.3",
64
+ "@hyperse/inspector-middleware": "^1.1.5",
65
+ "@hyperse/inspector-swc-plugin": "^1.1.7",
59
66
  "@pmmmwh/react-refresh-webpack-plugin": "^0.5.16",
60
67
  "@rsdoctor/rspack-plugin": "^1.1.2",
61
- "@rspack/core": "^1.3.10",
62
- "@rspack/dev-server": "^1.1.1",
68
+ "@rspack/core": "^1.3.13",
69
+ "@rspack/dev-server": "^1.1.2",
63
70
  "@rspack/plugin-react-refresh": "^1.4.3",
64
71
  "@swc/helpers": "^0.5.17",
65
72
  "@types/babel__core": "^7.20.5",
@@ -87,6 +94,7 @@
87
94
  "svgo": "^3.3.2",
88
95
  "tarjan-graph": "^3.0.0",
89
96
  "terser-webpack-plugin": "^5.3.14",
97
+ "tinypool": "^1.0.2",
90
98
  "tsconfig-paths-webpack-plugin": "^4.2.0",
91
99
  "type-fest": "^4.40.0",
92
100
  "typescript": "^5.8.3",
@@ -100,7 +108,7 @@
100
108
  "@dimjs/model": "2.1.1",
101
109
  "@dimjs/model-react": "2.1.1",
102
110
  "@dimjs/utils": "2.1.2",
103
- "@flatjs/testing": "2.2.4-next.0",
111
+ "@flatjs/testing": "2.2.4-next.1",
104
112
  "@hyperse/eslint-config-hyperse": "^1.4.1",
105
113
  "@swc/core": "1.11.21",
106
114
  "@types/express": "5.0.1",
@@ -115,7 +123,7 @@
115
123
  "react": "19.1.0",
116
124
  "rimraf": "6.0.1",
117
125
  "vite-tsconfig-paths": "5.1.4",
118
- "vitest": "3.1.4",
126
+ "vitest": "3.2.2",
119
127
  "vue-loader": "17.4.2"
120
128
  },
121
129
  "peerDependencies": {