@flatjs/evolve 2.1.0-next.10 → 2.1.0-next.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. package/dist/constants.js +36 -1
  2. package/dist/create-webpack/create-externals.js +6 -1
  3. package/dist/create-webpack/create-optimization.js +43 -1
  4. package/dist/create-webpack/create-output.js +35 -1
  5. package/dist/create-webpack/create-performance.js +7 -1
  6. package/dist/create-webpack/create-plugins.js +78 -1
  7. package/dist/create-webpack/create-resolve.js +37 -1
  8. package/dist/create-webpack/create-rule-sets.js +20 -1
  9. package/dist/create-webpack/load-webpack-config.js +57 -1
  10. package/dist/create-webpack/resolve-public-path.js +15 -1
  11. package/dist/create-webpack/rule-sets/constants.js +3 -1
  12. package/dist/create-webpack/rule-sets/rule-assets.js +52 -1
  13. package/dist/create-webpack/rule-sets/rule-css.js +111 -1
  14. package/dist/create-webpack/rule-sets/rule-less.js +44 -1
  15. package/dist/create-webpack/rule-sets/rule-scripts.js +34 -1
  16. package/dist/create-webpack/rule-sets/rule-svg-icon.js +25 -1
  17. package/dist/create-webpack/rule-sets/rule-utils.js +10 -1
  18. package/dist/create-webpack/types.js +1 -1
  19. package/dist/default-options.js +83 -1
  20. package/dist/define-config/define-config.js +4 -1
  21. package/dist/define-config/index.js +1 -1
  22. package/dist/dev-server/add-compiler-to-dev-server.js +58 -1
  23. package/dist/dev-server/create-app-page-route.js +13 -1
  24. package/dist/dev-server/create-dev-server-compiler-task.js +55 -1
  25. package/dist/dev-server/create-dev-server-entries.js +25 -1
  26. package/dist/dev-server/create-dev-server.js +24 -1
  27. package/dist/dev-server/index.js +6 -1
  28. package/dist/dev-server/middlewares/create-page-middleware.js +33 -1
  29. package/dist/dev-server/middlewares/create-public-assets-middleware.js +25 -1
  30. package/dist/dev-server/middlewares/get-all-sorted-modules.js +24 -1
  31. package/dist/dev-server/middlewares/get-bundle-asset.js +7 -1
  32. package/dist/dev-server/middlewares/get-dev-server-host-uri.js +5 -1
  33. package/dist/dev-server/middlewares/get-hmr-runtime-chunks.js +14 -1
  34. package/dist/dev-server/middlewares/get-normalized-entry-name.js +14 -1
  35. package/dist/dev-server/middlewares/get-page-main-html.js +49 -1
  36. package/dist/dev-server/middlewares/get-page-module-html.js +123 -1
  37. package/dist/dev-server/middlewares/get-project-virtual-path.js +3 -1
  38. package/dist/dev-server/middlewares/get-runtime-manifest.js +25 -1
  39. package/dist/dev-server/middlewares/index.js +2 -1
  40. package/dist/dev-server/middlewares/types.js +1 -1
  41. package/dist/errors/evolve-build-error.js +10 -1
  42. package/dist/helpers/allow-px2rem-for-module.js +6 -1
  43. package/dist/helpers/assert-group-entry-item.js +19 -1
  44. package/dist/helpers/assert-single-compiler.js +45 -1
  45. package/dist/helpers/chunk-entry-map.js +21 -1
  46. package/dist/helpers/delete-object-keys.js +20 -1
  47. package/dist/helpers/enable-bundle-hashname-for-module.js +6 -1
  48. package/dist/helpers/filter-actived-entries.js +42 -1
  49. package/dist/helpers/flat-entry-map.js +11 -1
  50. package/dist/helpers/get-bundle-file-name.js +23 -1
  51. package/dist/helpers/get-git-root.js +4 -1
  52. package/dist/helpers/get-html-plugin-config.js +47 -1
  53. package/dist/helpers/get-max-process-tasks.js +7 -1
  54. package/dist/helpers/get-pacakge-dir.js +13 -1
  55. package/dist/helpers/get-runtime-cdn-base.js +21 -1
  56. package/dist/helpers/index.js +27 -1
  57. package/dist/helpers/is-deep-equal.js +67 -1
  58. package/dist/helpers/json-serializer.js +52 -1
  59. package/dist/helpers/merge-babel-options.js +45 -1
  60. package/dist/helpers/normalize-check-entry-options.js +28 -1
  61. package/dist/helpers/normalize-entry-map.js +59 -1
  62. package/dist/helpers/normalize-group-name.js +16 -1
  63. package/dist/helpers/normalize-page-proxy.js +9 -1
  64. package/dist/helpers/normalize-resolve-alias.js +7 -1
  65. package/dist/helpers/normalize-template-inject-tokens.js +22 -1
  66. package/dist/helpers/open-page.js +15 -1
  67. package/dist/helpers/print-log.js +49 -1
  68. package/dist/helpers/refresh-evolve-mock-options.js +34 -1
  69. package/dist/helpers/resolve-entry-map-input-files.js +20 -1
  70. package/dist/helpers/script-injects.js +39 -1
  71. package/dist/helpers/should-enable-react-fast-refresh.js +14 -1
  72. package/dist/helpers/split-to-entry-group.d.ts +5 -5
  73. package/dist/helpers/split-to-entry-group.js +139 -1
  74. package/dist/helpers/verify-group-entry-options.js +21 -1
  75. package/dist/index.js +5 -1
  76. package/dist/load-config/index.js +1 -1
  77. package/dist/load-config/load-evolve-config.js +41 -1
  78. package/dist/load-config/types.js +1 -1
  79. package/dist/main/create-thread-worker.js +51 -1
  80. package/dist/main/env-verify.js +21 -1
  81. package/dist/main/get-worker-path.js +5 -1
  82. package/dist/main/index.js +4 -1
  83. package/dist/main/prepare-build.js +39 -1
  84. package/dist/main/prepare-serve.js +69 -1
  85. package/dist/main/prepare-static.js +30 -1
  86. package/dist/main/start-build-dynamic.js +171 -1
  87. package/dist/main/start-build-worker.js +44 -1
  88. package/dist/main/start-build.js +69 -1
  89. package/dist/main/start-group-entry-build.js +32 -1
  90. package/dist/main/start-serve.js +34 -1
  91. package/dist/main/start-static.js +19 -1
  92. package/dist/minimizer/create-minimizers.js +25 -1
  93. package/dist/minimizer/default-options.js +14 -1
  94. package/dist/minimizer/image-minimizer.js +65 -1
  95. package/dist/minimizer/index.js +1 -1
  96. package/dist/minimizer/terser-minimizer.js +15 -3
  97. package/dist/minimizer/types.js +1 -1
  98. package/dist/plugins/circular-dependency/circular-dependency-plugin.js +119 -1
  99. package/dist/plugins/circular-dependency/index.js +15 -1
  100. package/dist/plugins/clean-webpack/clean-webpack-plugin.js +173 -1
  101. package/dist/plugins/clean-webpack/index.js +22 -1
  102. package/dist/plugins/define-variable/define-variable-plugin.js +28 -1
  103. package/dist/plugins/define-variable/index.js +1 -1
  104. package/dist/plugins/html-inject-scripts/plugin-html-inject-script.js +27 -1
  105. package/dist/plugins/module-federation/external-template-remotes.js +92 -1
  106. package/dist/plugins/module-federation/index.js +1 -1
  107. package/dist/plugins/module-federation/module-federation.js +100 -1
  108. package/dist/plugins/multi-html/index.js +16 -1
  109. package/dist/plugins/multi-html/multi-html-cdn-plugin.js +83 -1
  110. package/dist/plugins/multi-html/multi-html-plugin.js +65 -1
  111. package/dist/plugins/ts-checker/index.js +1 -1
  112. package/dist/plugins/ts-checker/ts-checker-plugin.js +24 -1
  113. package/dist/types/index.js +8 -1
  114. package/dist/types/types-ci.js +1 -1
  115. package/dist/types/types-dev-server.js +1 -1
  116. package/dist/types/types-entry-map.js +1 -1
  117. package/dist/types/types-federation.js +1 -1
  118. package/dist/types/types-loader-options.d.ts +30 -3
  119. package/dist/types/types-loader-options.js +1 -1
  120. package/dist/types/types-modular-import.js +1 -1
  121. package/dist/types/types-multi-html.js +1 -1
  122. package/dist/types/types-options.js +1 -1
  123. package/dist/types/types-plugin-options.js +1 -1
  124. package/dist/types/types-threads-options.js +1 -1
  125. package/dist/types/types-webpack.js +1 -1
  126. package/package.json +2 -2
@@ -1 +1,123 @@
1
- import{existsSync,readFileSync}from"node:fs";import{isAbsolute,join}from"node:path";import{ensureSlash,urlJoin}from"@flatjs/common";import _ from"lodash";import{allowPx2remForModule}from"../../helpers/allow-px2rem-for-module.js";import{getHtmlPluginConfig}from"../../helpers/get-html-plugin-config.js";import{getPackageDir}from"../../helpers/get-pacakge-dir.js";import{getRuntimeCDNBase}from"../../helpers/get-runtime-cdn-base.js";import{normalizeEvolveEntryName}from"../../helpers/normalize-entry-map.js";import{normalizePageProxy}from"../../helpers/normalize-page-proxy.js";import{normalizeTemplateInjectTokens}from"../../helpers/normalize-template-inject-tokens.js";import{injectFederationScripts}from"../../helpers/script-injects.js";import{getBundleAsset}from"./get-bundle-asset.js";import{getDevServerHostUri}from"./get-dev-server-host-uri.js";import{getHmrRuntimeChunks}from"./get-hmr-runtime-chunks.js";import{getNormalizedEntryName}from"./get-normalized-entry-name.js";export const getPageModuleHtml=async(e,t,r,o,l)=>{const{entryMap:a,projectVirtualPath:i}=l,n=Object.keys(a).sort(((e,t)=>t.length-e.length)),m=getPackageDir(),s=n.find((e=>{const r=normalizeEvolveEntryName(e,i);return ensureSlash(t.path.replace(/^\//,""),!0).startsWith(ensureSlash(r,!0))}));if(!s){const e=readFileSync(join(m,"./templates/module-404.html"),"utf-8");return _.template(e)({title:"404 Not Found",errorMeta:[{name:"@flatjs/evolve workspace",value:m},{name:"served entry names",value:JSON.stringify(n)},{name:"module path",value:`${t.path}`}]})}const p=a[s],u=p.options,c=getDevServerHostUri(e,s,r),g=u?.serveModuleTemplate||"./templates/module.html",d=join(l.projectCwd,"./templates/module.html"),f=readFileSync(isAbsolute(g)?g:existsSync(d)?d:join(m,"./templates/module.html"),"utf-8"),h=l.devServer,v=h?.defaultServeGlobalData?await h.defaultServeGlobalData(p,r):{},j={mode:"development",envCdn:urlJoin(r,["public"])},y=getNormalizedEntryName(s,i,e,h),S=normalizePageProxy(h?.pageProxy||"/pages"),H=[getRuntimeCDNBase(l.multiHtmlCdn,l.multiHtmlCdnEnvResolver||function cdnResolver(){})],P=normalizeTemplateInjectTokens(j,u),C={title:getHtmlPluginConfig("title",j,u?.title),favicon:getHtmlPluginConfig("favicon",j,u?.favicon),viewport:allowPx2remForModule([s,p],l)?getHtmlPluginConfig("viewport",j,u?.viewport):"",...P,inlineScripts:P.inlineScripts?.concat(H),moduleFederationScripts:injectFederationScripts({me:[urlJoin(r,["public"])]},l.multiHtmlCdnEnvResolver),global:{hostUrl:r,apiBase:urlJoin(r,[o]),virtualPath:join(S,i),moduleName:s.replace(i,"").replace(/^\//,""),...v,...u?.serveGlobalData||{}},styles:[getBundleAsset(c,y,".css")],scripts:[getBundleAsset(c,y,".js")]};C.headBeforeHtmlTags?C.headBeforeHtmlTags=C.headBeforeHtmlTags.slice(0):C.headBeforeHtmlTags=[];return getHmrRuntimeChunks(e,s,y,p,l,c).forEach((e=>{C.headBeforeHtmlTags?.push(`<script src="${e}"><\/script>`)})),_.template(f)(C)};
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { isAbsolute, join } from 'node:path';
3
+ import { ensureSlash, urlJoin } from '@flatjs/common';
4
+ import _ from 'lodash';
5
+ import { allowPx2remForModule } from '../../helpers/allow-px2rem-for-module.js';
6
+ import { getHtmlPluginConfig, } from '../../helpers/get-html-plugin-config.js';
7
+ import { getPackageDir } from '../../helpers/get-pacakge-dir.js';
8
+ import { getRuntimeCDNBase } from '../../helpers/get-runtime-cdn-base.js';
9
+ import { normalizeEvolveEntryName } from '../../helpers/normalize-entry-map.js';
10
+ import { normalizePageProxy } from '../../helpers/normalize-page-proxy.js';
11
+ import { normalizeTemplateInjectTokens } from '../../helpers/normalize-template-inject-tokens.js';
12
+ import { injectFederationScripts } from '../../helpers/script-injects.js';
13
+ import { getBundleAsset } from './get-bundle-asset.js';
14
+ import { getDevServerHostUri } from './get-dev-server-host-uri.js';
15
+ import { getHmrRuntimeChunks } from './get-hmr-runtime-chunks.js';
16
+ import { getNormalizedEntryName } from './get-normalized-entry-name.js';
17
+ export const getPageModuleHtml = async (servedDevServerEntries, req, devHostUri, apiContext, evolveOptions
18
+ // eslint-disable-next-line sonarjs/cognitive-complexity
19
+ ) => {
20
+ const { entryMap, projectVirtualPath } = evolveOptions;
21
+ // normalize to ['a/b','a/b/c','inn/app/transfer_list','inn/app/transfer']
22
+ const entryNames = Object.keys(entryMap).sort((a, b) => b.length - a.length);
23
+ const evolveCwd = getPackageDir();
24
+ const currEntryName = entryNames.find((entryName) => {
25
+ const normalizedEntryName = normalizeEvolveEntryName(entryName, projectVirtualPath);
26
+ return ensureSlash(req.path.replace(/^\//, ''), true).startsWith(ensureSlash(normalizedEntryName, true));
27
+ });
28
+ if (!currEntryName) {
29
+ const notFoundTemplateStr = readFileSync(join(evolveCwd, `./templates/module-404.html`), 'utf-8');
30
+ return _.template(notFoundTemplateStr)({
31
+ title: '404 Not Found',
32
+ errorMeta: [
33
+ {
34
+ name: `@flatjs/evolve workspace`,
35
+ value: evolveCwd,
36
+ },
37
+ {
38
+ name: `served entry names`,
39
+ value: JSON.stringify(entryNames),
40
+ },
41
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
42
+ { name: `module path`, value: `${req.path}` },
43
+ ],
44
+ });
45
+ }
46
+ const currEntryItem = entryMap[currEntryName];
47
+ const currEntryOption = currEntryItem.options;
48
+ // currEntry: `home`
49
+ const devServerHostUri = getDevServerHostUri(servedDevServerEntries, currEntryName, devHostUri);
50
+ const moduleTemplate =
51
+ // eslint-disable-next-line sonarjs/no-duplicate-string
52
+ currEntryOption?.serveModuleTemplate || './templates/module.html';
53
+ const projectHostedModuleTemplate = join(evolveOptions.projectCwd, './templates/module.html');
54
+ const templateStr = readFileSync(isAbsolute(moduleTemplate)
55
+ ? moduleTemplate
56
+ : existsSync(projectHostedModuleTemplate)
57
+ ? projectHostedModuleTemplate
58
+ : join(evolveCwd, './templates/module.html'), 'utf-8');
59
+ const devServer = evolveOptions.devServer;
60
+ const defaultGlobalData = devServer?.defaultServeGlobalData
61
+ ? await devServer.defaultServeGlobalData(currEntryItem, devHostUri)
62
+ : {};
63
+ const configData = {
64
+ mode: 'development',
65
+ // FIXME: always use `devHostUri` as served local `cdn`, if you want to serve `anther` module
66
+ // you need to generate cdn path manually.
67
+ envCdn: urlJoin(devHostUri, ['public']),
68
+ };
69
+ // Get normalized entry name
70
+ const normalizedEntryName = getNormalizedEntryName(currEntryName, projectVirtualPath, servedDevServerEntries, devServer);
71
+ const pageProxy = normalizePageProxy(devServer?.pageProxy || '/pages');
72
+ const injectInlineScripts = [
73
+ // inject runtime cdn base
74
+ getRuntimeCDNBase(evolveOptions.multiHtmlCdn, evolveOptions.multiHtmlCdnEnvResolver ||
75
+ function cdnResolver() {
76
+ return undefined;
77
+ }),
78
+ ];
79
+ const templateInjectTokens = normalizeTemplateInjectTokens(configData, currEntryOption);
80
+ const templateData = {
81
+ // title
82
+ title: getHtmlPluginConfig('title', configData, currEntryOption?.title),
83
+ // favicon
84
+ favicon: getHtmlPluginConfig('favicon', configData, currEntryOption?.favicon),
85
+ // `allowPx2rem` default is true
86
+ viewport: allowPx2remForModule([currEntryName, currEntryItem], evolveOptions)
87
+ ? getHtmlPluginConfig('viewport', configData, currEntryOption?.viewport)
88
+ : '',
89
+ ...templateInjectTokens,
90
+ // Allow us customized inline scripts into compiled html template.
91
+ inlineScripts: templateInjectTokens.inlineScripts?.concat(injectInlineScripts),
92
+ // Module Federation, Only for `static` mode, `serve` mode it will use entryItemConfig.endpoint()
93
+ moduleFederationScripts: injectFederationScripts({
94
+ me: [urlJoin(devHostUri, ['public'])],
95
+ }, evolveOptions.multiHtmlCdnEnvResolver),
96
+ // The global data.
97
+ global: {
98
+ hostUrl: devHostUri,
99
+ apiBase: urlJoin(devHostUri, [apiContext]),
100
+ virtualPath: join(pageProxy, projectVirtualPath),
101
+ moduleName: currEntryName
102
+ .replace(projectVirtualPath, '')
103
+ .replace(/^\//, ''),
104
+ ...defaultGlobalData,
105
+ ...(currEntryOption?.serveGlobalData || {}),
106
+ },
107
+ styles: [getBundleAsset(devServerHostUri, normalizedEntryName, '.css')],
108
+ scripts: [getBundleAsset(devServerHostUri, normalizedEntryName, '.js')],
109
+ };
110
+ if (!templateData.headBeforeHtmlTags) {
111
+ templateData.headBeforeHtmlTags = [];
112
+ }
113
+ else {
114
+ // Avoid deep object reference here.
115
+ templateData.headBeforeHtmlTags = templateData.headBeforeHtmlTags.slice(0);
116
+ }
117
+ // Indicates current we use `hot` mode for `webpack-dev-server` hot reload true.
118
+ const devRuntimeChunks = getHmrRuntimeChunks(servedDevServerEntries, currEntryName, normalizedEntryName, currEntryItem, evolveOptions, devServerHostUri);
119
+ devRuntimeChunks.forEach((runtimeChunk) => {
120
+ templateData.headBeforeHtmlTags?.push(`<script src="${runtimeChunk}"></script>`);
121
+ });
122
+ return _.template(templateStr)(templateData);
123
+ };
@@ -1 +1,3 @@
1
- export const getProjectVirtualPath=t=>t.projectVirtualPath.replace(/^\//,"");
1
+ export const getProjectVirtualPath = (evolveOptions) => {
2
+ return evolveOptions.projectVirtualPath.replace(/^\//, '');
3
+ };
@@ -1 +1,25 @@
1
- import{getSortedModules}from"./get-all-sorted-modules.js";import{getBundleAsset}from"./get-bundle-asset.js";import{getHmrRuntimeChunks}from"./get-hmr-runtime-chunks.js";export const getRuntimeManifest=async(e,t,s)=>{const r=getSortedModules(s,e,t),n={};for(const t of r){const{entryName:r,isServedEntry:o,entryContent:m,devServerHostUri:u,normalizedEntryName:d}=t,i=[getBundleAsset(u,d,".js")],g=[getBundleAsset(u,d,".css")],l=getHmrRuntimeChunks(e,r,d,m,s,u);n[d]={entryName:r,styles:g,scripts:i,isServed:o,runtimeChunks:l}}return n};
1
+ import { getSortedModules } from './get-all-sorted-modules.js';
2
+ import { getBundleAsset } from './get-bundle-asset.js';
3
+ import { getHmrRuntimeChunks } from './get-hmr-runtime-chunks.js';
4
+ export const getRuntimeManifest = async (servedDevServerEntries, devHostUri, evolveOptions) => {
5
+ const sortedModules = getSortedModules(evolveOptions, servedDevServerEntries, devHostUri);
6
+ const runtimeManifest = {};
7
+ for (const moduleItem of sortedModules) {
8
+ const { entryName, isServedEntry, entryContent, devServerHostUri, normalizedEntryName, } = moduleItem;
9
+ const bundleScripts = [
10
+ getBundleAsset(devServerHostUri, normalizedEntryName, '.js'),
11
+ ];
12
+ const bundleStyles = [
13
+ getBundleAsset(devServerHostUri, normalizedEntryName, '.css'),
14
+ ];
15
+ const hmrRuntimeChunks = getHmrRuntimeChunks(servedDevServerEntries, entryName, normalizedEntryName, entryContent, evolveOptions, devServerHostUri);
16
+ runtimeManifest[normalizedEntryName] = {
17
+ entryName,
18
+ styles: bundleStyles,
19
+ scripts: bundleScripts,
20
+ isServed: isServedEntry,
21
+ runtimeChunks: hmrRuntimeChunks,
22
+ };
23
+ }
24
+ return runtimeManifest;
25
+ };
@@ -1 +1,2 @@
1
- export*from"./create-page-middleware.js";export*from"./create-public-assets-middleware.js";
1
+ export * from './create-page-middleware.js';
2
+ export * from './create-public-assets-middleware.js';
@@ -1 +1 @@
1
- export{};
1
+ export {};
@@ -1 +1,10 @@
1
- export class EvolveBuildError extends Error{constructor(r,e){let o=r;e&&(o+=": "+JSON.stringify(e)),super(o),this.code=r}}
1
+ export class EvolveBuildError extends Error {
2
+ constructor(code, messages) {
3
+ let message = code;
4
+ if (messages) {
5
+ message += ': ' + JSON.stringify(messages);
6
+ }
7
+ super(message);
8
+ this.code = code;
9
+ }
10
+ }
@@ -1 +1,6 @@
1
- export const allowPx2remForModule=(o,e)=>{const l=e?.loaderOptions?.pixelOptions;return!!((o&&o[1]?.options?.allowPx2rem)??l)};
1
+ export const allowPx2remForModule = (entryItem, evolveOptions) => {
2
+ // Global settings for `AllowPx2Rem`
3
+ const globalAllowPx2Rem = evolveOptions?.loaderOptions?.pixelOptions;
4
+ const currItemPx2Rem = (entryItem && entryItem[1]?.options?.allowPx2rem) ?? globalAllowPx2Rem;
5
+ return !!currItemPx2Rem;
6
+ };
@@ -1 +1,19 @@
1
- import{normalizeEvolveEntryName}from"./normalize-entry-map.js";export const assertGroupEntryItem=(r,e)=>{const o=[];for(const[e,t]of Object.entries(r))o.push([e,t]);if(!o.length)throw new Error('No entry map found while "serve", "build" process!');return o.map((([r,o])=>[normalizeEvolveEntryName(r,e.projectVirtualPath),o]))};
1
+ import { normalizeEvolveEntryName } from './normalize-entry-map.js';
2
+ /**
3
+ * Only fetch group entry map once `serve`,`build` recycle.
4
+ * @returns
5
+ */
6
+ export const assertGroupEntryItem = (entryMap, evolveOptions) => {
7
+ const result = [];
8
+ for (const [entryChunkName, entryItem] of Object.entries(entryMap)) {
9
+ result.push([entryChunkName, entryItem]);
10
+ }
11
+ if (!result.length) {
12
+ throw new Error(`No entry map found while "serve", "build" process!`);
13
+ }
14
+ return result.map(([entryName, entryConfig]) => {
15
+ // Make sure that we have correct `virtualPath` for each webpack `entry`
16
+ const normalizedEntryName = normalizeEvolveEntryName(entryName, evolveOptions.projectVirtualPath);
17
+ return [normalizedEntryName, entryConfig];
18
+ });
19
+ };
@@ -1 +1,45 @@
1
- import{dirname,join}from"path";import{searchPackageDir}from"@armit/package";import{mergeOptions,requireResolve}from"@flatjs/common";import{devReactFastRefresh}from"../constants.js";import{normalizeEvolveEntryName}from"./normalize-entry-map.js";export function assertSingleCompiler(e,r,t,o=!1){const a={};for(const[r,n]of Object.entries(e)){const e=normalizeEvolveEntryName(r,t.projectVirtualPath);if(a[e]=n.entry,o){const r=join(e,devReactFastRefresh.reactRefreshSetup),t=requireResolve(import.meta.url,"@pmmmwh/react-refresh-webpack-plugin"),o=searchPackageDir({cwd:dirname(t)});if(!o)throw new Error("react-refresh-webpack-plugin package directory not found");a[r]=[join(o,"/client/ReactRefreshEntry.js")]}}const n=Object.values(e)[0].groupName;return mergeOptions(r,{name:n,entry:a})}
1
+ import { dirname, join } from 'path';
2
+ import { searchPackageDir } from '@armit/package';
3
+ import { mergeOptions, requireResolve } from '@flatjs/common';
4
+ import { devReactFastRefresh } from '../constants.js';
5
+ import { normalizeEvolveEntryName } from './normalize-entry-map.js';
6
+ /**
7
+ * Asserts a single compiler configuration by generating a new entry object based on the served entries,
8
+ * webpack configuration, evolve options, and enabled HMR flag.
9
+ *
10
+ * @param servedEntries - The served entries object.
11
+ * @param webpackConfig `Omit<Configuration, 'entry'>` webpack final configuration
12
+ * @param evolveOptions - The flat evolve options object.
13
+ * @param enabledHmr - Flag indicating whether Hot Module Replacement (HMR) is enabled. Default is false.
14
+ * @returns The merged webpack configuration object with the new entry object.
15
+ * @throws Error if the react-refresh-webpack-plugin package directory is not found.
16
+ */
17
+ export function assertSingleCompiler(servedEntries, webpackConfig, evolveOptions, enabledHmr = false) {
18
+ const newEntry = {};
19
+ for (const [entryName, entryItem] of Object.entries(servedEntries)) {
20
+ // Make sure that we have correct `virtualPath` for each webpack `entry`
21
+ const normalizedEntryName = normalizeEvolveEntryName(entryName, evolveOptions.projectVirtualPath);
22
+ newEntry[normalizedEntryName] = entryItem.entry;
23
+ if (enabledHmr) {
24
+ // `${virtualPath}/module/reactRefreshSetup`
25
+ const fastRefreshEntryName = join(normalizedEntryName, devReactFastRefresh.reactRefreshSetup);
26
+ const reactRefresh = requireResolve(import.meta.url, '@pmmmwh/react-refresh-webpack-plugin');
27
+ const reactRefreshPackageDir = searchPackageDir({
28
+ cwd: dirname(reactRefresh),
29
+ });
30
+ // Make sure that we have a correct `react-refresh-webpack-plugin` package directory
31
+ // Sometimes the dynamic load package has been deduped and the package directory is not correct
32
+ if (!reactRefreshPackageDir) {
33
+ throw new Error('react-refresh-webpack-plugin package directory not found');
34
+ }
35
+ newEntry[fastRefreshEntryName] = [
36
+ join(reactRefreshPackageDir, '/client/ReactRefreshEntry.js'),
37
+ ];
38
+ }
39
+ }
40
+ const groupName = Object.values(servedEntries)[0].groupName;
41
+ return mergeOptions(webpackConfig, {
42
+ name: groupName,
43
+ entry: newEntry,
44
+ });
45
+ }
@@ -1 +1,21 @@
1
- import{arrayChunk}from"@flatjs/common";export const chunkEntryMap=(r,o=2)=>{const n=Object.keys(r),t=arrayChunk(n,o),c=[];for(const o of t){const n=o.reduce(((o,n)=>({...o,[n]:r[n]})),{});c.push(n)}return c};
1
+ import { arrayChunk } from '@flatjs/common';
2
+ /**
3
+ * Split entryMap into multi entryMap with a `size`
4
+ * @param entryMap
5
+ * @param size
6
+ */
7
+ export const chunkEntryMap = (entryMap, size = 2) => {
8
+ const keys = Object.keys(entryMap);
9
+ const entryKeyChunks = arrayChunk(keys, size);
10
+ const finalEntryMaps = [];
11
+ for (const keys of entryKeyChunks) {
12
+ const chunkMap = keys.reduce((prev, curr) => {
13
+ return {
14
+ ...prev,
15
+ [curr]: entryMap[curr],
16
+ };
17
+ }, {});
18
+ finalEntryMaps.push(chunkMap);
19
+ }
20
+ return finalEntryMaps;
21
+ };
@@ -1 +1,20 @@
1
- export const deleteObjectKeys=(e,t=[])=>{if(!e)return;const r={...e};return t.forEach((e=>{delete r[e]})),r};
1
+ /**
2
+ * Deletes specified keys from an object and returns a new object without those keys.
3
+ * If the input object is undefined, the function returns undefined.
4
+ *
5
+ * @param obj - The input object.
6
+ * @param keys - An array of keys to be deleted from the object.
7
+ * @returns A new object without the specified keys, or undefined if the input object is undefined.
8
+ *
9
+ * @template T - The type of the input object.
10
+ */
11
+ export const deleteObjectKeys = (obj, keys = []) => {
12
+ if (!obj) {
13
+ return undefined;
14
+ }
15
+ const newObj = { ...obj };
16
+ keys.forEach((key) => {
17
+ delete newObj[key];
18
+ });
19
+ return newObj;
20
+ };
@@ -1 +1,6 @@
1
- export const enableBundleHashNameForModule=(e,a)=>{const n=e.webpack?.enableBundleHashName;return!!(a?.enableBundleHashName??n)};
1
+ export const enableBundleHashNameForModule = (evolveOptions, entryItemOption) => {
2
+ // Global settings for `enableBundleHashName`
3
+ const globalEnabledStatus = evolveOptions.webpack?.enableBundleHashName;
4
+ const bundleHashNameEnabled = entryItemOption?.enableBundleHashName ?? globalEnabledStatus;
5
+ return !!bundleHashNameEnabled;
6
+ };
@@ -1 +1,42 @@
1
- import{arraysIntersect,normalizeSemicolonFilterParts}from"@flatjs/common";import{resolveEntryMapInputFiles}from"./resolve-entry-map-input-files.js";export const filterActivedEntriesByModule=(t,e)=>{const r=normalizeSemicolonFilterParts(e),n={};for(const[e,o]of Object.entries(t)){r.find((t=>("string"==typeof t||"number"==typeof t?new RegExp(`${t}`):t).test(e)))&&(n[e]=o)}return n};export const filterActivedEntriesByEntryInputs=async(t,e,r)=>{const n={};for(const[o,s]of Object.entries(e)){const e=await resolveEntryMapInputFiles(t,{[o]:s});arraysIntersect(e,r)&&(n[o]=s)}return n};
1
+ import { arraysIntersect, normalizeSemicolonFilterParts } from '@flatjs/common';
2
+ import { resolveEntryMapInputFiles } from './resolve-entry-map-input-files.js';
3
+ /**
4
+ * Filter to find actived entry input by entry name filter.
5
+ * @param definedEntries
6
+ * @param modules `home;mine;`
7
+ * @returns activedEntries
8
+ */
9
+ export const filterActivedEntriesByModule = (definedEntries, modules) => {
10
+ const patterns = normalizeSemicolonFilterParts(modules);
11
+ const newActivedEntries = {};
12
+ for (const [entryKey, itemConfig] of Object.entries(definedEntries)) {
13
+ const matched = patterns.find((m) => {
14
+ // Also need to support `numeric` named module.
15
+ const testRegExp = typeof m === 'string' || typeof m === 'number' ? new RegExp(`${m}`) : m;
16
+ return testRegExp.test(entryKey);
17
+ });
18
+ if (matched) {
19
+ newActivedEntries[entryKey] = itemConfig;
20
+ }
21
+ }
22
+ return newActivedEntries;
23
+ };
24
+ /**
25
+ * Filter to find actived entry input by absolute entry filepath
26
+ * @param projectCwd
27
+ * @param definedEntries
28
+ * @param entryInputs [`/xxxx/x/xxxx/src/home/index.tsx`]
29
+ * @returns activedEntries
30
+ */
31
+ export const filterActivedEntriesByEntryInputs = async (projectCwd, definedEntries, entryInputs) => {
32
+ const newActivedEntries = {};
33
+ for (const [entryKey, itemConfig] of Object.entries(definedEntries)) {
34
+ const entryAbsFiles = await resolveEntryMapInputFiles(projectCwd, {
35
+ [entryKey]: itemConfig,
36
+ });
37
+ if (arraysIntersect(entryAbsFiles, entryInputs)) {
38
+ newActivedEntries[entryKey] = itemConfig;
39
+ }
40
+ }
41
+ return newActivedEntries;
42
+ };
@@ -1 +1,11 @@
1
- export const flatEntryMap=t=>t.reduce(((t,e)=>Object.assign(t,e)),{});
1
+ /**
2
+ * Flattens an array of `EvolveDevServerEntryMap` objects into a single `EvolveDevServerEntryMap`.
3
+ *
4
+ * @param servedDevServerEntryList - The array of `EvolveDevServerEntryMap` objects to flatten.
5
+ * @returns The flattened `EvolveDevServerEntryMap`.
6
+ */
7
+ export const flatEntryMap = (servedDevServerEntryList) => {
8
+ return servedDevServerEntryList.reduce((flatMap, servedDevServerEntryMapItem) => {
9
+ return Object.assign(flatMap, servedDevServerEntryMapItem);
10
+ }, {});
11
+ };
@@ -1 +1,23 @@
1
- export const currNow=()=>Date.now().toString();export const getBundleFileName=(e,n,t=!0)=>{const o="js"===e?".js":".css";return n?`bundle${o}`:t?`bundle[contenthash]${o}`:`bundle${o}?${currNow()}`};
1
+ /**
2
+ * Get current timestramp as `string`
3
+ */
4
+ export const currNow = () => Date.now().toString();
5
+ /**
6
+ * Generate bundle file name from rules
7
+ * 1. if `serveMode`, always return `bundle
8
+ * 2. else if `enableBundleHashName` always return `bundle[contenthash].{css,js}`
9
+ * 3. otherwise return `bundle.{css,js}?${currNow}`
10
+ * @param type `js` | `css`
11
+ * @param serveMode If we are run `serve` mode
12
+ * @param enableBundleHashName If we need to generate bundle file name with `[contenthash]`
13
+ */
14
+ export const getBundleFileName = (type, serveMode, enableBundleHashName = true) => {
15
+ const fileEndFix = type === 'js' ? '.js' : '.css';
16
+ if (serveMode) {
17
+ return `bundle${fileEndFix}`;
18
+ }
19
+ if (enableBundleHashName) {
20
+ return `bundle[contenthash]${fileEndFix}`;
21
+ }
22
+ return `bundle${fileEndFix}?${currNow()}`;
23
+ };
@@ -1 +1,4 @@
1
- import{searchParentDir}from"@armit/package";export const getGitRoot=r=>searchParentDir(r,".git");
1
+ import { searchParentDir } from '@armit/package';
2
+ export const getGitRoot = (searchFrom) => {
3
+ return searchParentDir(searchFrom, '.git');
4
+ };
@@ -1 +1,47 @@
1
- import{polyfill,viewportScripts}from"../constants.js";import{getPackageDir}from"./get-pacakge-dir.js";export const defaultHtmlPluginConfig={title:"",favicon:"",headBeforeHtmlTags:[],inlineScripts:[],headBeforeStyles:[],headBeforeScripts:[...polyfill],bodyAfterScripts:[],viewport:viewportScripts,excludeCdnEnvs:["me","dev","ntv"],htmlMinify:!0,templatePath:getPackageDir("templates/html-plugin/index-{0}.html")};export const getHtmlPluginConfig=(t,e,i)=>{let o;if(void 0!==i&&(o="function"==typeof i?i(e):i),void 0===o){const i=defaultHtmlPluginConfig[t];return"function"==typeof i?i(e):i}return o};
1
+ import { polyfill, viewportScripts } from '../constants.js';
2
+ import { getPackageDir } from './get-pacakge-dir.js';
3
+ export const defaultHtmlPluginConfig = {
4
+ // The page title
5
+ title: '',
6
+ // The page favicon url地址
7
+ favicon: '',
8
+ // The customized html tags should be inject to `<header />`
9
+ headBeforeHtmlTags: [],
10
+ // Allow us customized inline scripts into compiled html template.
11
+ inlineScripts: [],
12
+ // The ordered styles will be injected start of html head.
13
+ headBeforeStyles: [],
14
+ // The ordered scripts will be injected before html head.
15
+ headBeforeScripts: [...polyfill],
16
+ // The ordered scripts will be injected end of html body.
17
+ bodyAfterScripts: [],
18
+ // `allowPx2rem` default is true
19
+ viewport: viewportScripts,
20
+ // avoid use cdn `me`, `dev`, `ntv`
21
+ excludeCdnEnvs: ['me', 'dev', 'ntv'],
22
+ // `minify` is true, `dev` always don't minify.
23
+ htmlMinify: true,
24
+ // Default use It must be an absolute path.
25
+ templatePath: getPackageDir('templates/html-plugin/index-{0}.html'),
26
+ };
27
+ /**
28
+ * 获取html plugin 模版相关定义字段.
29
+ * @param preferredValue 用户首选的值, 如果返回为undefined, 将使用默认值
30
+ * @returns
31
+ */
32
+ export const getHtmlPluginConfig = (key, configData, preferredValue) => {
33
+ let userValue;
34
+ if (typeof preferredValue !== 'undefined') {
35
+ userValue =
36
+ typeof preferredValue === 'function'
37
+ ? preferredValue(configData)
38
+ : preferredValue;
39
+ }
40
+ if (typeof userValue === 'undefined') {
41
+ const defaultValue = defaultHtmlPluginConfig[key];
42
+ return typeof defaultValue === 'function'
43
+ ? defaultValue(configData)
44
+ : defaultValue;
45
+ }
46
+ return userValue;
47
+ };
@@ -1 +1,7 @@
1
- import{cpus}from"node:os";export const getMaxProcessTasks=(t,s)=>{const e=Math.max(1,"string"==typeof s&&s.endsWith("%")?Math.round(cpus().length*Number(s.slice(0,-1))/100):Number(s));return t>e?e:Math.max(1,t)};
1
+ import { cpus } from 'node:os';
2
+ export const getMaxProcessTasks = (totalTasks, maxProcesses) => {
3
+ const maxCpu = Math.max(1, typeof maxProcesses === 'string' && maxProcesses.endsWith('%')
4
+ ? Math.round((cpus().length * Number(maxProcesses.slice(0, -1))) / 100)
5
+ : Number(maxProcesses));
6
+ return totalTasks > maxCpu ? maxCpu : Math.max(1, totalTasks);
7
+ };
@@ -1 +1,13 @@
1
- import{join}from"node:path";import{getDirname}from"@armit/file-utility";import{searchPackageDir}from"@armit/package";export const getPackageDir=(...r)=>{const e=getDirname(import.meta.url),o=searchPackageDir({cwd:e});if(!o)throw new Error("Could not resolve package root for `flatjs/evolve`");return join(o,...r)};
1
+ import { join } from 'node:path';
2
+ import { getDirname } from '@armit/file-utility';
3
+ import { searchPackageDir } from '@armit/package';
4
+ export const getPackageDir = (...paths) => {
5
+ const dir = getDirname(import.meta.url);
6
+ const packageDir = searchPackageDir({
7
+ cwd: dir,
8
+ });
9
+ if (!packageDir) {
10
+ throw new Error('Could not resolve package root for `flatjs/evolve`');
11
+ }
12
+ return join(packageDir, ...paths);
13
+ };
@@ -1 +1,21 @@
1
- import{cdnFinder}from"./script-injects.js";export const getRuntimeCDNBase=(n,e,i="")=>{const t=[`\n (function () {\n var flatjsMultiCdn = {\n cdnConfig: ${JSON.stringify(n||{})},\n cdnResolver: ${e.toString()},\n cdnFinder: ${cdnFinder.toString()}\n };\n var runtimeCDNBase = flatjsMultiCdn.cdnFinder(flatjsMultiCdn.cdnConfig, flatjsMultiCdn.cdnResolver);\n window.$evolve = window.$evolve || {};\n window.$evolve.runtimeCDNBase=runtimeCDNBase;\n `];return i&&t.push(`${i} = runtimeCDNBase || ${i};`),t.push("})();"),t.join("\n")};
1
+ import { cdnFinder } from './script-injects.js';
2
+ export const getRuntimeCDNBase = (config, cdnResolver, requireFn = '') => {
3
+ const result = [
4
+ `
5
+ (function () {
6
+ var flatjsMultiCdn = {
7
+ cdnConfig: ${JSON.stringify(config || {})},
8
+ cdnResolver: ${cdnResolver.toString()},
9
+ cdnFinder: ${cdnFinder.toString()}
10
+ };
11
+ var runtimeCDNBase = flatjsMultiCdn.cdnFinder(flatjsMultiCdn.cdnConfig, flatjsMultiCdn.cdnResolver);
12
+ window.$evolve = window.$evolve || {};
13
+ window.$evolve.runtimeCDNBase=runtimeCDNBase;
14
+ `,
15
+ ];
16
+ if (requireFn) {
17
+ result.push(`${requireFn} = runtimeCDNBase || ${requireFn};`);
18
+ }
19
+ result.push('})();');
20
+ return result.join('\n');
21
+ };
@@ -1 +1,27 @@
1
- export*from"./allow-px2rem-for-module.js";export*from"./assert-group-entry-item.js";export*from"./chunk-entry-map.js";export*from"./enable-bundle-hashname-for-module.js";export*from"./get-bundle-file-name.js";export*from"./get-html-plugin-config.js";export*from"./get-pacakge-dir.js";export*from"./get-runtime-cdn-base.js";export*from"./merge-babel-options.js";export*from"./normalize-entry-map.js";export*from"./open-page.js";export*from"./print-log.js";export*from"./refresh-evolve-mock-options.js";export*from"./script-injects.js";export*from"./should-enable-react-fast-refresh.js";export*from"./json-serializer.js";export*from"./normalize-resolve-alias.js";export*from"./is-deep-equal.js";export*from"./verify-group-entry-options.js";export*from"./split-to-entry-group.js";export*from"./delete-object-keys.js";export*from"./normalize-page-proxy.js";export*from"./flat-entry-map.js";export*from"./normalize-template-inject-tokens.js";export*from"./normalize-check-entry-options.js";export*from"./assert-single-compiler.js";export*from"./normalize-group-name.js";
1
+ export * from './allow-px2rem-for-module.js';
2
+ export * from './assert-group-entry-item.js';
3
+ export * from './chunk-entry-map.js';
4
+ export * from './enable-bundle-hashname-for-module.js';
5
+ export * from './get-bundle-file-name.js';
6
+ export * from './get-html-plugin-config.js';
7
+ export * from './get-pacakge-dir.js';
8
+ export * from './get-runtime-cdn-base.js';
9
+ export * from './merge-babel-options.js';
10
+ export * from './normalize-entry-map.js';
11
+ export * from './open-page.js';
12
+ export * from './print-log.js';
13
+ export * from './refresh-evolve-mock-options.js';
14
+ export * from './script-injects.js';
15
+ export * from './should-enable-react-fast-refresh.js';
16
+ export * from './json-serializer.js';
17
+ export * from './normalize-resolve-alias.js';
18
+ export * from './is-deep-equal.js';
19
+ export * from './verify-group-entry-options.js';
20
+ export * from './split-to-entry-group.js';
21
+ export * from './delete-object-keys.js';
22
+ export * from './normalize-page-proxy.js';
23
+ export * from './flat-entry-map.js';
24
+ export * from './normalize-template-inject-tokens.js';
25
+ export * from './normalize-check-entry-options.js';
26
+ export * from './assert-single-compiler.js';
27
+ export * from './normalize-group-name.js';
@@ -1 +1,67 @@
1
- export function isDeepEqual(t,e){if(t===e)return!0;if("function"==typeof t&&"function"==typeof e)return t.toString()===e.toString();if(t&&e&&"object"==typeof t&&"object"==typeof e){const r=Array.isArray(t),n=Array.isArray(e);let i,f,o;if(r&&n){if(f=t.length,f!==e.length)return!1;for(i=f;0!=i--;)if(!isDeepEqual(t[i],e[i]))return!1;return!0}if(r!==n)return!1;const u=t instanceof Date,c=e instanceof Date;if(u!==c)return!1;if(u&&c)return t.getTime()===e.getTime();const s=t instanceof RegExp,a=e instanceof RegExp;if(s!==a)return!1;if(s&&a)return t.toString()===e.toString();const p=Object.keys(t);if(f=p.length,f!==Object.keys(e).length)return!1;for(i=f;0!=i--;)if(!Object.prototype.hasOwnProperty.call(e,p[i]))return!1;for(i=f;0!=i--;)if(o=p[i],!isDeepEqual(t[o],e[o]))return!1;return!0}return t!=t&&e!=e}
1
+ /**
2
+ * Checks if two values are deeply equal.
3
+ *
4
+ * @template T - The type of the values being compared.
5
+ * @param a - The first value to compare.
6
+ * @param b - The second value to compare.
7
+ * @returns `true` if the values are deeply equal, `false` otherwise.
8
+ */
9
+ export function isDeepEqual(a, b) {
10
+ if (a === b)
11
+ return true;
12
+ if (typeof a === 'function' && typeof b === 'function') {
13
+ return a.toString() === b.toString();
14
+ }
15
+ if (a && b && typeof a === 'object' && typeof b === 'object') {
16
+ const arrA = Array.isArray(a);
17
+ const arrB = Array.isArray(b);
18
+ let i;
19
+ let length;
20
+ let key;
21
+ if (arrA && arrB) {
22
+ length = a.length;
23
+ if (length !== b.length) {
24
+ return false;
25
+ }
26
+ for (i = length; i-- !== 0;) {
27
+ if (!isDeepEqual(a[i], b[i])) {
28
+ return false;
29
+ }
30
+ }
31
+ return true;
32
+ }
33
+ if (arrA !== arrB) {
34
+ return false;
35
+ }
36
+ const dateA = a instanceof Date;
37
+ const dateB = b instanceof Date;
38
+ if (dateA !== dateB)
39
+ return false;
40
+ if (dateA && dateB)
41
+ return a.getTime() === b.getTime();
42
+ const regexpA = a instanceof RegExp;
43
+ const regexpB = b instanceof RegExp;
44
+ if (regexpA !== regexpB)
45
+ return false;
46
+ if (regexpA && regexpB)
47
+ return a.toString() === b.toString();
48
+ const keys = Object.keys(a);
49
+ length = keys.length;
50
+ if (length !== Object.keys(b).length) {
51
+ return false;
52
+ }
53
+ for (i = length; i-- !== 0;) {
54
+ if (!Object.prototype.hasOwnProperty.call(b, keys[i])) {
55
+ return false;
56
+ }
57
+ }
58
+ for (i = length; i-- !== 0;) {
59
+ key = keys[i];
60
+ if (!isDeepEqual(a[key], b[key])) {
61
+ return false;
62
+ }
63
+ }
64
+ return true;
65
+ }
66
+ return a !== a && b !== b;
67
+ }