@flatjs/evolve 2.1.0-next.11 → 2.1.0-next.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants.js +36 -1
- package/dist/create-webpack/create-externals.js +6 -1
- package/dist/create-webpack/create-optimization.js +43 -1
- package/dist/create-webpack/create-output.js +35 -1
- package/dist/create-webpack/create-performance.js +7 -1
- package/dist/create-webpack/create-plugins.js +78 -1
- package/dist/create-webpack/create-resolve.js +37 -1
- package/dist/create-webpack/create-rule-sets.js +20 -1
- package/dist/create-webpack/load-webpack-config.js +57 -1
- package/dist/create-webpack/resolve-public-path.js +15 -1
- package/dist/create-webpack/rule-sets/constants.js +3 -1
- package/dist/create-webpack/rule-sets/rule-assets.js +52 -1
- package/dist/create-webpack/rule-sets/rule-css.js +111 -1
- package/dist/create-webpack/rule-sets/rule-less.js +44 -1
- package/dist/create-webpack/rule-sets/rule-scripts.js +34 -1
- package/dist/create-webpack/rule-sets/rule-svg-icon.js +25 -1
- package/dist/create-webpack/rule-sets/rule-utils.js +10 -1
- package/dist/create-webpack/types.js +1 -1
- package/dist/default-options.js +83 -1
- package/dist/define-config/define-config.js +4 -1
- package/dist/define-config/index.js +1 -1
- package/dist/dev-server/add-compiler-to-dev-server.js +58 -1
- package/dist/dev-server/create-app-page-route.js +13 -1
- package/dist/dev-server/create-dev-server-compiler-task.js +55 -1
- package/dist/dev-server/create-dev-server-entries.js +25 -1
- package/dist/dev-server/create-dev-server.js +24 -1
- package/dist/dev-server/index.js +6 -1
- package/dist/dev-server/middlewares/create-page-middleware.js +33 -1
- package/dist/dev-server/middlewares/create-public-assets-middleware.js +25 -1
- package/dist/dev-server/middlewares/get-all-sorted-modules.js +24 -1
- package/dist/dev-server/middlewares/get-bundle-asset.js +7 -1
- package/dist/dev-server/middlewares/get-dev-server-host-uri.js +5 -1
- package/dist/dev-server/middlewares/get-hmr-runtime-chunks.js +14 -1
- package/dist/dev-server/middlewares/get-normalized-entry-name.js +14 -1
- package/dist/dev-server/middlewares/get-page-main-html.js +49 -1
- package/dist/dev-server/middlewares/get-page-module-html.js +123 -1
- package/dist/dev-server/middlewares/get-project-virtual-path.js +3 -1
- package/dist/dev-server/middlewares/get-runtime-manifest.js +25 -1
- package/dist/dev-server/middlewares/index.js +2 -1
- package/dist/dev-server/middlewares/types.js +1 -1
- package/dist/errors/evolve-build-error.js +10 -1
- package/dist/helpers/allow-px2rem-for-module.js +6 -1
- package/dist/helpers/assert-group-entry-item.js +19 -1
- package/dist/helpers/assert-single-compiler.js +45 -1
- package/dist/helpers/chunk-entry-map.js +21 -1
- package/dist/helpers/delete-object-keys.js +20 -1
- package/dist/helpers/enable-bundle-hashname-for-module.js +6 -1
- package/dist/helpers/filter-actived-entries.js +42 -1
- package/dist/helpers/flat-entry-map.js +11 -1
- package/dist/helpers/get-bundle-file-name.js +23 -1
- package/dist/helpers/get-git-root.js +4 -1
- package/dist/helpers/get-html-plugin-config.js +47 -1
- package/dist/helpers/get-max-process-tasks.js +7 -1
- package/dist/helpers/get-pacakge-dir.js +13 -1
- package/dist/helpers/get-runtime-cdn-base.js +21 -1
- package/dist/helpers/index.js +27 -1
- package/dist/helpers/is-deep-equal.js +67 -1
- package/dist/helpers/json-serializer.js +52 -1
- package/dist/helpers/merge-babel-options.js +45 -1
- package/dist/helpers/normalize-check-entry-options.js +28 -1
- package/dist/helpers/normalize-entry-map.js +59 -1
- package/dist/helpers/normalize-group-name.js +16 -1
- package/dist/helpers/normalize-page-proxy.js +9 -1
- package/dist/helpers/normalize-resolve-alias.js +7 -1
- package/dist/helpers/normalize-template-inject-tokens.js +22 -1
- package/dist/helpers/open-page.js +15 -1
- package/dist/helpers/print-log.js +49 -1
- package/dist/helpers/refresh-evolve-mock-options.js +34 -1
- package/dist/helpers/resolve-entry-map-input-files.js +20 -1
- package/dist/helpers/script-injects.js +39 -1
- package/dist/helpers/should-enable-react-fast-refresh.js +14 -1
- package/dist/helpers/split-to-entry-group.js +139 -1
- package/dist/helpers/verify-group-entry-options.js +21 -1
- package/dist/index.js +5 -1
- package/dist/load-config/index.js +1 -1
- package/dist/load-config/load-evolve-config.js +41 -1
- package/dist/load-config/types.js +1 -1
- package/dist/main/create-thread-worker.js +51 -1
- package/dist/main/env-verify.js +21 -1
- package/dist/main/get-worker-path.js +5 -1
- package/dist/main/index.js +4 -1
- package/dist/main/prepare-build.js +39 -1
- package/dist/main/prepare-serve.js +69 -1
- package/dist/main/prepare-static.js +30 -1
- package/dist/main/start-build-dynamic.js +171 -1
- package/dist/main/start-build-worker.js +44 -1
- package/dist/main/start-build.js +69 -1
- package/dist/main/start-group-entry-build.js +32 -1
- package/dist/main/start-serve.js +34 -1
- package/dist/main/start-static.js +19 -1
- package/dist/minimizer/create-minimizers.js +25 -1
- package/dist/minimizer/default-options.js +14 -1
- package/dist/minimizer/image-minimizer.js +65 -1
- package/dist/minimizer/index.js +1 -1
- package/dist/minimizer/terser-minimizer.js +15 -3
- package/dist/minimizer/types.js +1 -1
- package/dist/plugins/circular-dependency/circular-dependency-plugin.js +119 -1
- package/dist/plugins/circular-dependency/index.js +15 -1
- package/dist/plugins/clean-webpack/clean-webpack-plugin.js +173 -1
- package/dist/plugins/clean-webpack/index.js +22 -1
- package/dist/plugins/define-variable/define-variable-plugin.js +28 -1
- package/dist/plugins/define-variable/index.js +1 -1
- package/dist/plugins/html-inject-scripts/plugin-html-inject-script.js +27 -1
- package/dist/plugins/module-federation/external-template-remotes.js +92 -1
- package/dist/plugins/module-federation/index.js +1 -1
- package/dist/plugins/module-federation/module-federation.js +100 -1
- package/dist/plugins/multi-html/index.js +16 -1
- package/dist/plugins/multi-html/multi-html-cdn-plugin.js +83 -1
- package/dist/plugins/multi-html/multi-html-plugin.js +65 -1
- package/dist/plugins/ts-checker/index.js +1 -1
- package/dist/plugins/ts-checker/ts-checker-plugin.js +24 -1
- package/dist/types/index.js +8 -1
- package/dist/types/types-ci.js +1 -1
- package/dist/types/types-dev-server.js +1 -1
- package/dist/types/types-entry-map.js +1 -1
- package/dist/types/types-federation.js +1 -1
- package/dist/types/types-loader-options.d.ts +30 -3
- package/dist/types/types-loader-options.js +1 -1
- package/dist/types/types-modular-import.js +1 -1
- package/dist/types/types-multi-html.js +1 -1
- package/dist/types/types-options.js +1 -1
- package/dist/types/types-plugin-options.js +1 -1
- package/dist/types/types-threads-options.js +1 -1
- package/dist/types/types-webpack.js +1 -1
- package/package.json +2 -2
|
@@ -1 +1,123 @@
|
|
|
1
|
-
import
|
|
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,25 @@
|
|
|
1
|
-
import{getSortedModules}from
|
|
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
|
|
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{
|
|
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=(
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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=(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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,47 @@
|
|
|
1
|
-
import{polyfill,viewportScripts}from
|
|
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
|
|
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
|
|
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
|
|
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
|
+
};
|
package/dist/helpers/index.js
CHANGED
|
@@ -1 +1,27 @@
|
|
|
1
|
-
export*from
|
|
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
|
-
|
|
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
|
+
}
|