@flatjs/evolve 2.3.2-next.3 → 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 (32) hide show
  1. package/dist/default-options.js +1 -1
  2. package/dist/define-config/define-config.d.ts +3 -3
  3. package/dist/define-config/define-config.js +1 -1
  4. package/dist/dev-server/create-app-page-route.js +1 -1
  5. package/dist/helpers/merge-inspector-evolve-config.d.ts +2 -0
  6. package/dist/helpers/merge-inspector-evolve-config.js +1 -0
  7. package/dist/helpers/print-promotion.d.ts +3 -2
  8. package/dist/helpers/print-promotion.js +1 -1
  9. package/dist/helpers/refresh-evolve-mock-options.js +1 -1
  10. package/dist/load-config/load-evolve-config.d.ts +2 -2
  11. package/dist/load-config/load-evolve-config.js +1 -1
  12. package/dist/load-config/types.d.ts +2 -4
  13. package/dist/main/create-build-server.d.ts +2 -2
  14. package/dist/main/prepare-build.js +1 -1
  15. package/dist/main/prepare-serve.d.ts +1 -2
  16. package/dist/main/prepare-serve.js +1 -1
  17. package/dist/main/start-build-dynamic.d.ts +3 -3
  18. package/dist/main/start-build-dynamic.js +1 -1
  19. package/dist/main/start-build-worker.js +1 -1
  20. package/dist/main/start-build.d.ts +2 -2
  21. package/dist/main/start-build.js +1 -1
  22. package/dist/main/start-serve.d.ts +2 -3
  23. package/dist/main/start-serve.js +1 -1
  24. package/dist/main/start-static.d.ts +2 -2
  25. package/dist/plugins/rspack/progress-plugin/index.js +1 -1
  26. package/dist/rules/rspack/rule-scripts.js +1 -1
  27. package/dist/rules/wepack/rule-scripts.js +1 -1
  28. package/dist/types/types-cli-options.d.ts +0 -5
  29. package/dist/types/types-entry-map.d.ts +1 -1
  30. package/dist/types/types-options.d.ts +36 -0
  31. package/dist/types/types-webpack.d.ts +1 -1
  32. package/package.json +22 -16
@@ -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))};
@@ -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;
@@ -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,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 { EvolveBuildResult } from '../types/types-build.js';
4
4
  import type { FlatCliOptions } from '../types/types-cli-options.js';
@@ -9,7 +9,7 @@ export declare function getBuildEntryFiles(projectCwd: string, diffFiles: string
9
9
  * Dynamic check which entry modules need to build.
10
10
  * @returns
11
11
  */
12
- export declare function dynamicCheckBuildEntryMap(projectCwd: string, earlyCommit?: string | null, lastCommit?: string, overrideEvolveOptions?: PartialDeep<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions): Promise<{
12
+ export declare function dynamicCheckBuildEntryMap(projectCwd: string, earlyCommit?: string | null, lastCommit?: string, overrideEvolveOptions?: DeepPartial<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions): Promise<{
13
13
  buildEntries: EvolveEntryMap;
14
14
  newEvolveOptions: FlatEvolveOptions;
15
15
  }>;
@@ -19,4 +19,4 @@ export declare function dynamicCheckBuildEntryMap(projectCwd: string, earlyCommi
19
19
  * @param earlyCommit The diff based earlier commit hash
20
20
  * @param lastCommit If is omitted, it will have the same effect as using HEAD instead.
21
21
  */
22
- 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}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{compilerType:n="webpack"}=s,{buildEntries:a,newEvolveOptions:l}=await dynamicCheckBuildEntryMap(e,r,t,o,i);printPromotions(s),await envVerify(e,l);const p=normalizeEvolveEntryMap(a,l.entryMap),c=splitToEntryGroup(p,l,ignoreEntryOptionKeys,!1);if(!c.length)return logger.warn("No build entries provided!"),[];await createGlobalCompiler(!1,l);let m=[];return"webpack"===n?m=await runWebpackTask(e,c,l,o,i,s):"rspack"===n&&(m=await runRspackTask(e,c,o,i,s)),m};
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=>{const{compilerType:r="webpack"}=e.cliOptions||{};isCI()||"webpack"!==r||configLoggerStdWriteSteam();const{projectCwd:o,entryKeys:i,serializedEvolveOptions:t,configLoaderOptions:p,groupName:n="flatjs_evolve_group",cliOptions:s}=e,l={projectCwd:o,command:"build",resolve:requireResolve},a=jsonSerializer.parse(t)||{},m=await loadEvolveConfig(l,o,a,p),c=i.map((e=>new RegExp(`^${e}$`))),f=filterActivedEntriesByModule(m.entryMap,c),d=normalizeEvolveEntryMap(f,m.entryMap),v=splitToEntryGroup(d,m,ignoreEntryOptionKeys,!1)[0];for(const[,e]of Object.entries(v))e.groupName=n;return prepareBuild(v,m,s).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}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}),c=[];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});c.push(t)}})}if(p.tasks.length)try{await p.run()}catch(r){throw l.terminate(),r}return l.terminate(),c},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,compilerType:a="webpack"}=s,n={projectCwd:r,command:"build",resolve:requireResolve};printPromotions(s);const l=await loadEvolveConfig(n,r,t,o);await envVerify(r,l);const p=filterActivedEntriesByModule(l.entryMap,e),c=normalizeEvolveEntryMap(p,l.entryMap),m=splitToEntryGroup(c,l,ignoreEntryOptionKeys,!1);if(!m.length)return logger.warn("No build entries provided!"),[];await createGlobalCompiler(!1,l);let d=[];return"webpack"===a?d=await runWebpackTask(r,m,l,t,o,s):"rspack"===a&&(d=await runRspackTask(r,m,t,o,s)),i&&startAnalyzer(l),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>;
@@ -1 +1 @@
1
- import{Worker}from"node:worker_threads";import{resolve}from"path";import{mergeOptions}from"@armit/config-loader";import{getDirname}from"@armit/file-utility";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()}))}}]};
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()}))}}]};
@@ -1 +1 @@
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:a}=t,{modularImports:o=[]}=s,p=assertSwcImportOptions(a,o),l=shouldEnableReactFastRefresh(e,r,t);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:[[requireResolve(import.meta.url,"@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.3",
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,25 +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.2",
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.2",
58
- "@flatjs/mock": "2.4.1-next.2",
59
- "@flatjs/swc-plugin-import": "1.0.0-next.3",
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",
60
66
  "@pmmmwh/react-refresh-webpack-plugin": "^0.5.16",
61
67
  "@rsdoctor/rspack-plugin": "^1.1.2",
62
- "@rspack/core": "^1.3.10",
63
- "@rspack/dev-server": "^1.1.1",
68
+ "@rspack/core": "^1.3.13",
69
+ "@rspack/dev-server": "^1.1.2",
64
70
  "@rspack/plugin-react-refresh": "^1.4.3",
65
71
  "@swc/helpers": "^0.5.17",
66
72
  "@types/babel__core": "^7.20.5",
@@ -102,7 +108,7 @@
102
108
  "@dimjs/model": "2.1.1",
103
109
  "@dimjs/model-react": "2.1.1",
104
110
  "@dimjs/utils": "2.1.2",
105
- "@flatjs/testing": "2.2.4-next.0",
111
+ "@flatjs/testing": "2.2.4-next.1",
106
112
  "@hyperse/eslint-config-hyperse": "^1.4.1",
107
113
  "@swc/core": "1.11.21",
108
114
  "@types/express": "5.0.1",
@@ -117,7 +123,7 @@
117
123
  "react": "19.1.0",
118
124
  "rimraf": "6.0.1",
119
125
  "vite-tsconfig-paths": "5.1.4",
120
- "vitest": "3.1.4",
126
+ "vitest": "3.2.2",
121
127
  "vue-loader": "17.4.2"
122
128
  },
123
129
  "peerDependencies": {