@flatjs/evolve 2.1.0-next.11 → 2.1.0-next.12
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
}
|