@flatjs/evolve 2.1.0-next.12 → 2.1.0-next.13
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/compiler/create-global-compiler.d.ts +2 -0
- package/dist/compiler/create-global-compiler.js +1 -0
- package/dist/constants.js +1 -36
- package/dist/create-webpack/create-externals.js +1 -6
- package/dist/create-webpack/create-optimization.js +1 -43
- package/dist/create-webpack/create-output.js +1 -35
- package/dist/create-webpack/create-performance.js +1 -7
- package/dist/create-webpack/create-plugins.js +1 -78
- package/dist/create-webpack/create-resolve.js +1 -37
- package/dist/create-webpack/create-rule-sets.js +1 -20
- package/dist/create-webpack/load-watch-options.d.ts +12 -0
- package/dist/create-webpack/load-watch-options.js +1 -0
- package/dist/create-webpack/load-webpack-config.js +1 -57
- package/dist/create-webpack/resolve-public-path.js +1 -15
- package/dist/create-webpack/rule-sets/constants.js +1 -3
- package/dist/create-webpack/rule-sets/rule-assets.js +1 -52
- package/dist/create-webpack/rule-sets/rule-css.js +1 -111
- package/dist/create-webpack/rule-sets/rule-less.js +1 -44
- package/dist/create-webpack/rule-sets/rule-scripts.d.ts +2 -0
- package/dist/create-webpack/rule-sets/rule-scripts.js +1 -34
- package/dist/create-webpack/rule-sets/rule-svg-icon.js +1 -25
- package/dist/create-webpack/rule-sets/rule-utils.js +1 -10
- package/dist/create-webpack/types.d.ts +1 -1
- package/dist/create-webpack/types.js +1 -1
- package/dist/default-options.js +1 -83
- package/dist/define-config/define-config.d.ts +2 -2
- package/dist/define-config/define-config.js +1 -4
- package/dist/define-config/index.js +1 -1
- package/dist/dev-server/add-compiler-to-dev-server.js +1 -58
- package/dist/dev-server/create-app-page-route.js +1 -13
- package/dist/dev-server/create-dev-server-compiler-task.js +1 -55
- package/dist/dev-server/create-dev-server-entries.js +1 -25
- package/dist/dev-server/create-dev-server.js +1 -24
- package/dist/dev-server/index.d.ts +3 -3
- package/dist/dev-server/index.js +1 -6
- package/dist/dev-server/middlewares/create-page-middleware.js +1 -33
- package/dist/dev-server/middlewares/create-public-assets-middleware.js +1 -25
- package/dist/dev-server/middlewares/get-all-sorted-modules.js +1 -24
- package/dist/dev-server/middlewares/get-bundle-asset.js +1 -7
- package/dist/dev-server/middlewares/get-dev-server-host-uri.js +1 -5
- package/dist/dev-server/middlewares/get-hmr-runtime-chunks.js +1 -14
- package/dist/dev-server/middlewares/get-normalized-entry-name.js +1 -14
- package/dist/dev-server/middlewares/get-page-main-html.js +1 -49
- package/dist/dev-server/middlewares/get-page-module-html.js +1 -123
- package/dist/dev-server/middlewares/get-project-virtual-path.js +1 -3
- package/dist/dev-server/middlewares/get-runtime-manifest.js +1 -25
- package/dist/dev-server/middlewares/index.js +1 -2
- package/dist/dev-server/middlewares/types.js +1 -1
- package/dist/errors/evolve-build-error.js +1 -10
- package/dist/helpers/allow-px2rem-for-module.js +1 -6
- package/dist/helpers/assert-group-entry-item.js +1 -19
- package/dist/helpers/assert-single-compiler.js +1 -45
- package/dist/helpers/chunk-entry-map.js +1 -21
- package/dist/helpers/delete-object-keys.js +1 -20
- package/dist/helpers/enable-bundle-hashname-for-module.js +1 -6
- package/dist/helpers/filter-actived-entries.js +1 -42
- package/dist/helpers/flat-entry-map.js +1 -11
- package/dist/helpers/get-bundle-file-name.js +1 -23
- package/dist/helpers/get-git-root.js +1 -4
- package/dist/helpers/get-html-plugin-config.js +1 -47
- package/dist/helpers/get-max-process-tasks.js +1 -7
- package/dist/helpers/get-pacakge-dir.js +1 -13
- package/dist/helpers/get-runtime-cdn-base.d.ts +1 -1
- package/dist/helpers/get-runtime-cdn-base.js +1 -21
- package/dist/helpers/index.d.ts +11 -11
- package/dist/helpers/index.js +1 -27
- package/dist/helpers/is-deep-equal.js +1 -67
- package/dist/helpers/json-serializer.js +1 -52
- package/dist/helpers/merge-babel-options.js +1 -45
- package/dist/helpers/normalize-check-entry-options.js +1 -28
- package/dist/helpers/normalize-entry-map.js +1 -59
- package/dist/helpers/normalize-group-name.js +1 -16
- package/dist/helpers/normalize-page-proxy.js +1 -9
- package/dist/helpers/normalize-resolve-alias.js +1 -7
- package/dist/helpers/normalize-template-inject-tokens.js +1 -22
- package/dist/helpers/open-page.js +1 -15
- package/dist/helpers/print-log.js +1 -49
- package/dist/helpers/refresh-evolve-mock-options.js +1 -34
- package/dist/helpers/resolve-entry-map-input-files.js +1 -20
- package/dist/helpers/script-injects.d.ts +1 -1
- package/dist/helpers/script-injects.js +1 -39
- package/dist/helpers/should-enable-react-fast-refresh.js +1 -14
- package/dist/helpers/split-to-entry-group.d.ts +1 -1
- package/dist/helpers/split-to-entry-group.js +1 -139
- package/dist/helpers/verify-group-entry-options.js +1 -21
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -5
- package/dist/load-config/index.js +1 -1
- package/dist/load-config/load-evolve-config.js +1 -41
- package/dist/load-config/types.js +1 -1
- package/dist/loaders/loader-icon.cjs +2 -1
- package/dist/main/create-thread-worker.js +1 -51
- package/dist/main/env-verify.js +1 -21
- package/dist/main/get-worker-path.js +1 -5
- package/dist/main/index.d.ts +1 -1
- package/dist/main/index.js +1 -4
- package/dist/main/prepare-build.js +1 -39
- package/dist/main/prepare-serve.js +1 -69
- package/dist/main/prepare-static.js +1 -30
- package/dist/main/start-build-dynamic.js +1 -171
- package/dist/main/start-build-worker.js +1 -44
- package/dist/main/start-build.js +1 -69
- package/dist/main/start-group-entry-build.d.ts +1 -1
- package/dist/main/start-group-entry-build.js +1 -32
- package/dist/main/start-serve.js +1 -34
- package/dist/main/start-static.js +1 -19
- package/dist/minimizer/create-minimizers.js +1 -25
- package/dist/minimizer/default-options.js +1 -14
- package/dist/minimizer/image-minimizer.js +1 -65
- package/dist/minimizer/index.js +1 -1
- package/dist/minimizer/terser-minimizer.js +3 -15
- package/dist/minimizer/types.js +1 -1
- package/dist/plugins/circular-dependency/circular-dependency-plugin.js +1 -119
- package/dist/plugins/circular-dependency/index.js +1 -15
- package/dist/plugins/clean-webpack/clean-webpack-plugin.js +1 -173
- package/dist/plugins/clean-webpack/index.js +1 -22
- package/dist/plugins/define-variable/define-variable-plugin.js +1 -28
- package/dist/plugins/define-variable/index.js +1 -1
- package/dist/plugins/html-inject-scripts/plugin-html-inject-script.js +1 -27
- package/dist/plugins/module-federation/external-template-remotes.js +1 -92
- package/dist/plugins/module-federation/index.js +1 -1
- package/dist/plugins/module-federation/module-federation.js +1 -100
- package/dist/plugins/multi-html/index.js +1 -16
- package/dist/plugins/multi-html/multi-html-cdn-plugin.js +1 -83
- package/dist/plugins/multi-html/multi-html-plugin.js +1 -65
- package/dist/plugins/ts-checker/ts-checker-guard-plugin.d.ts +13 -0
- package/dist/plugins/ts-checker/ts-checker-guard-plugin.js +1 -0
- package/dist/plugins/ts-checker/ts-checker-plugin.d.ts +1 -2
- package/dist/plugins/ts-checker/ts-checker-plugin.js +1 -24
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.js +1 -8
- package/dist/types/types-ci.js +1 -1
- package/dist/types/types-dev-server.d.ts +5 -6
- 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-global-compiler-options.d.ts +7 -0
- package/dist/types/types-global-compiler-options.js +1 -0
- package/dist/types/types-loader-options.d.ts +2 -7
- 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.d.ts +6 -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.d.ts +1 -1
- package/dist/types/types-webpack.js +1 -1
- package/package.json +30 -32
- package/dist/plugins/ts-checker/index.d.ts +0 -1
- package/dist/plugins/ts-checker/index.js +0 -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
|
-
}
|
|
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,52 +1 @@
|
|
|
1
|
-
function stringifyWithFns(
|
|
2
|
-
return JSON.stringify(obj, function (key, value) {
|
|
3
|
-
if (typeof value === 'function') {
|
|
4
|
-
// handle property function
|
|
5
|
-
try {
|
|
6
|
-
// try test if it is a property function string
|
|
7
|
-
// e.g. var x = { inlineScripts () { console.log('Hello, world!'); } }
|
|
8
|
-
// eval(x.inlineScripts) will throw error
|
|
9
|
-
makeFunctionFromString(value);
|
|
10
|
-
return value.toString();
|
|
11
|
-
}
|
|
12
|
-
catch (err) {
|
|
13
|
-
// fix: ` inlineScripts () { console.log('Hello, world!'); }` to `function inlineScripts () { console.log('Hello, world!'); }`
|
|
14
|
-
return `function ${value.toString()}`;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
return value;
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
function looksLikeAFunctionString(value) {
|
|
21
|
-
const funPattern = [
|
|
22
|
-
/^function[^(]*\(([^()]*)\)\s*\{[\s\S]*\}$/m,
|
|
23
|
-
// eslint-disable-next-line regexp/no-super-linear-backtracking
|
|
24
|
-
/^(\s*async\s*)?(\w*\s*)\(([^)]*)\)\s*=>\s*(.*)$/m,
|
|
25
|
-
// 仅包含一个参数的箭头
|
|
26
|
-
/^\s*\w+\s*=>/m,
|
|
27
|
-
];
|
|
28
|
-
const matchFn = funPattern.find((s) => s.test(value));
|
|
29
|
-
return !!matchFn;
|
|
30
|
-
}
|
|
31
|
-
function makeFunctionFromString(funcString) {
|
|
32
|
-
return eval('(' + funcString + ')');
|
|
33
|
-
}
|
|
34
|
-
function parseWithFns(json) {
|
|
35
|
-
try {
|
|
36
|
-
return JSON.parse(json, function (key, value) {
|
|
37
|
-
if (looksLikeAFunctionString(value)) {
|
|
38
|
-
return makeFunctionFromString(value);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
return value;
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
catch (err) {
|
|
46
|
-
return {};
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
export const jsonSerializer = {
|
|
50
|
-
stringify: stringifyWithFns,
|
|
51
|
-
parse: parseWithFns,
|
|
52
|
-
};
|
|
1
|
+
import vm from"node:vm";function stringifyWithFns(n){return JSON.stringify(n,(function(n,t){if("function"==typeof t)try{return makeFunctionFromString(t),t.toString()}catch{return`function ${t.toString()}`}return t}))}function looksLikeAFunctionString(n){return!![/^function[^(]*\(([^()]*)\)\s*\{[\s\S]*\}$/m,/^(\s*async\s*)?(\w*\s*)\(([^)]*)\)\s*=>\s*(.*)$/m,/^\s*\w+\s*=>/m].find((t=>t.test(n)))}function makeFunctionFromString(n){return vm.runInNewContext("("+n+")")}function parseWithFns(n){try{return JSON.parse(n,(function(n,t){return looksLikeAFunctionString(t)?makeFunctionFromString(t):t}))}catch{return{}}}export const jsonSerializer={stringify:stringifyWithFns,parse:parseWithFns};
|
|
@@ -1,45 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import babelPluginImport from '@flatjs/babel-plugin-import';
|
|
3
|
-
import { logger } from '@flatjs/common';
|
|
4
|
-
import { reactBabelPreset, vueBabelPreset } from '@flatjs/evolve-preset-babel';
|
|
5
|
-
import { moduleName } from '../constants.js';
|
|
6
|
-
export const mergeBabelOption = (modularImports = [], options = { usePreset: 'react' }) => {
|
|
7
|
-
const babelImports = modularImports.map((importItem) => {
|
|
8
|
-
return [
|
|
9
|
-
babelPluginImport,
|
|
10
|
-
{
|
|
11
|
-
transformToDefaultImport: false,
|
|
12
|
-
libraryDirectory: 'dist',
|
|
13
|
-
...importItem,
|
|
14
|
-
},
|
|
15
|
-
importItem.libraryName,
|
|
16
|
-
];
|
|
17
|
-
});
|
|
18
|
-
const { usePreset = 'react', ...overrideBabelOption } = options;
|
|
19
|
-
const baseBabelOption = usePreset === 'react'
|
|
20
|
-
? reactBabelPreset()
|
|
21
|
-
: usePreset === 'vue'
|
|
22
|
-
? vueBabelPreset()
|
|
23
|
-
: reactBabelPreset();
|
|
24
|
-
let mergedBabelOption = {};
|
|
25
|
-
try {
|
|
26
|
-
mergedBabelOption = babelMerge(baseBabelOption, overrideBabelOption);
|
|
27
|
-
// babelMerge only the last one will be retained, since there are multiple `@flatjs/babel-plugin-import` plugins with the same plugin id.
|
|
28
|
-
if (mergedBabelOption.plugins) {
|
|
29
|
-
mergedBabelOption.plugins.unshift(...babelImports);
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
mergedBabelOption.plugins = babelImports;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
catch (err) {
|
|
36
|
-
logger.error(err, moduleName);
|
|
37
|
-
}
|
|
38
|
-
const finalBabelOptions = {
|
|
39
|
-
...mergedBabelOption,
|
|
40
|
-
babelrc: false,
|
|
41
|
-
// Turns out the compact option is set to auto by default which removes "superfluous whitespace characters and line terminators [...] on input sizes >100KB".
|
|
42
|
-
compact: false,
|
|
43
|
-
};
|
|
44
|
-
return finalBabelOptions;
|
|
45
|
-
};
|
|
1
|
+
import{babelMerge}from"@armit/babel-merge";import babelPluginImport from"@flatjs/babel-plugin-import";import{logger}from"@flatjs/common";import{reactBabelPreset,vueBabelPreset}from"@flatjs/evolve-preset-babel";import{moduleName}from"../constants.js";export const mergeBabelOption=(e=[],r={usePreset:"react"})=>{const t=e.map((e=>[babelPluginImport,{transformToDefaultImport:!1,libraryDirectory:"dist",...e},e.libraryName])),{usePreset:a="react",...l}=r,o="react"===a?reactBabelPreset():"vue"===a?vueBabelPreset():reactBabelPreset();let m={};try{m=babelMerge(o,l),m.plugins?m.plugins.unshift(...t):m.plugins=t}catch(e){logger.error(e,moduleName)}return{...m,babelrc:!1,compact:!1}};
|
|
@@ -1,28 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { ignoreEntryOptionKeys } from '../constants.js';
|
|
3
|
-
import { deleteObjectKeys } from './delete-object-keys.js';
|
|
4
|
-
import { normalizeTemplateInjectTokens } from './normalize-template-inject-tokens.js';
|
|
5
|
-
/**
|
|
6
|
-
* Normalizes the check entry options.
|
|
7
|
-
*
|
|
8
|
-
* @param serveMode - A boolean indicating whether the serve mode is enabled.
|
|
9
|
-
* @param currEntryOption - The current entry option.
|
|
10
|
-
* @param ignoreOptionKeys - An array of keys to ignore in the entry option.
|
|
11
|
-
* @returns The normalized entry options.
|
|
12
|
-
*/
|
|
13
|
-
export const normalizeCheckEntryOptions = (serveMode, currEntryOption, ignoreOptionKeys = ignoreEntryOptionKeys) => {
|
|
14
|
-
const mode = serveMode ? 'development' : 'production';
|
|
15
|
-
const envCdnDomain = serveMode
|
|
16
|
-
? 'http://dev.flatjs.com'
|
|
17
|
-
: 'https://file.40017.cn/jinfu';
|
|
18
|
-
const configData = {
|
|
19
|
-
mode: mode,
|
|
20
|
-
envCdn: urlJoin(envCdnDomain, ['public']),
|
|
21
|
-
};
|
|
22
|
-
const normalizeEntryOption = normalizeTemplateInjectTokens(configData, currEntryOption);
|
|
23
|
-
const normalizedEntryOptions = {
|
|
24
|
-
...currEntryOption,
|
|
25
|
-
...normalizeEntryOption,
|
|
26
|
-
};
|
|
27
|
-
return deleteObjectKeys(normalizedEntryOptions, ignoreOptionKeys);
|
|
28
|
-
};
|
|
1
|
+
import{urlJoin}from"@flatjs/common";import{ignoreEntryOptionKeys}from"../constants.js";import{deleteObjectKeys}from"./delete-object-keys.js";import{normalizeTemplateInjectTokens}from"./normalize-template-inject-tokens.js";export const normalizeCheckEntryOptions=(e,t,o=ignoreEntryOptionKeys)=>{const n={mode:e?"development":"production",envCdn:urlJoin(e?"http://dev.flatjs.com":"https://file.40017.cn/jinfu",["public"])},r=normalizeTemplateInjectTokens(n,t),i={...t,...r};return deleteObjectKeys(i,o)};
|
|
@@ -1,59 +1 @@
|
|
|
1
|
-
import { join }
|
|
2
|
-
import _ from 'lodash';
|
|
3
|
-
/**
|
|
4
|
-
* Normalizes the entry group options based on the provided entry map content.
|
|
5
|
-
* If the entry map content has a group name, the grouping source will be set to 'manual'.
|
|
6
|
-
* Otherwise, the grouping source will be set to 'auto'.
|
|
7
|
-
*
|
|
8
|
-
* @param entryMapContent - The entry map content to normalize.
|
|
9
|
-
* @returns The normalized entry group options containing the group name and grouping source.
|
|
10
|
-
*/
|
|
11
|
-
const normalizeEntryGroupOptions = (entryMapContent) => {
|
|
12
|
-
if (entryMapContent && entryMapContent.groupName) {
|
|
13
|
-
return {
|
|
14
|
-
groupName: entryMapContent.groupName,
|
|
15
|
-
groupingSource: 'manual',
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
return {
|
|
19
|
-
groupingSource: 'auto',
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* Make sure that we have correct `virtualPath` for each webpack `entry`
|
|
24
|
-
* @param entryName the entryName defined via `flatjs-evolve.config.ts`.
|
|
25
|
-
* @param evolveOptions
|
|
26
|
-
* @returns
|
|
27
|
-
*/
|
|
28
|
-
export const normalizeEvolveEntryName = (entryName, projectVirtualPath) => {
|
|
29
|
-
const servedEntryName = entryName.replace(/^\//, '');
|
|
30
|
-
const virtualPath = projectVirtualPath.replace(/^\//, '');
|
|
31
|
-
const withVirtualPath = servedEntryName.startsWith(virtualPath);
|
|
32
|
-
// Make sure that we have correct `virtualPath` for each webpack `entry`
|
|
33
|
-
const finalEntryName = withVirtualPath
|
|
34
|
-
? servedEntryName
|
|
35
|
-
: join(virtualPath, servedEntryName);
|
|
36
|
-
return finalEntryName.replace(/\/$/, '');
|
|
37
|
-
};
|
|
38
|
-
/**
|
|
39
|
-
* Normalize flatjs.evolve entry map definition data.
|
|
40
|
-
* Merge default entry item configuration values.
|
|
41
|
-
* @param activedEntryMap actived entries
|
|
42
|
-
* @param definedEntryMap defined entries in flatjs.evolve.js
|
|
43
|
-
* @param projectVirtualPath virtual path for current `project`
|
|
44
|
-
*/
|
|
45
|
-
export const normalizeEvolveEntryMap = (activedEntryMap = {}, definedEntryMap = {}) => {
|
|
46
|
-
const newActivedEntries = {};
|
|
47
|
-
for (const [entryKey, itemConfig] of Object.entries(definedEntryMap)) {
|
|
48
|
-
// Setup default entry options.
|
|
49
|
-
const defaultEntryItemConfig = {
|
|
50
|
-
options: {},
|
|
51
|
-
};
|
|
52
|
-
if (activedEntryMap[entryKey]) {
|
|
53
|
-
// Perfect entry group option
|
|
54
|
-
const entryItemGroupConfig = normalizeEntryGroupOptions(itemConfig);
|
|
55
|
-
newActivedEntries[entryKey] = _.merge({}, defaultEntryItemConfig, itemConfig, activedEntryMap[entryKey], entryItemGroupConfig);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return newActivedEntries;
|
|
59
|
-
};
|
|
1
|
+
import _ from"lodash";import{join}from"node:path";const normalizeEntryGroupOptions=o=>o&&o.groupName?{groupName:o.groupName,groupingSource:"manual"}:{groupingSource:"auto"};export const normalizeEvolveEntryName=(o,r)=>{const e=o.replace(/^\//,""),n=r.replace(/^\//,"");return(e.startsWith(n)?e:join(n,e)).replace(/\/$/,"")};export const normalizeEvolveEntryMap=(o={},r={})=>{const e={};for(const[n,t]of Object.entries(r)){const r={options:{}};if(o[n]){const p=normalizeEntryGroupOptions(t);e[n]=_.merge({},r,t,o[n],p)}}return e};
|
|
@@ -1,16 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
/**
|
|
3
|
-
* Normalizes the group name based on the project virtual path and index.
|
|
4
|
-
*
|
|
5
|
-
* @param projectVirtualPath - The virtual path of the project.
|
|
6
|
-
* @param index - The index used to generate the group name.
|
|
7
|
-
* @returns The normalized group name.
|
|
8
|
-
*/
|
|
9
|
-
export const normalizeGroupName = (projectVirtualPath, index) => {
|
|
10
|
-
const upperCase = Array.from({ length: 26 }, (_, i) => String.fromCharCode(65 + i));
|
|
11
|
-
const lowerCase = Array.from({ length: 26 }, (_, i) => String.fromCharCode(97 + i));
|
|
12
|
-
const alphabetArray = [...lowerCase, ...upperCase];
|
|
13
|
-
const time = Math.floor(index / 52);
|
|
14
|
-
const alphabetCode = alphabetArray[index % 52];
|
|
15
|
-
return normalizeEvolveEntryName(`${alphabetCode}${time || ''}`, projectVirtualPath);
|
|
16
|
-
};
|
|
1
|
+
import{normalizeEvolveEntryName}from"./normalize-entry-map.js";export const normalizeGroupName=(r,o)=>{const e=Array.from({length:26},((r,o)=>String.fromCharCode(65+o))),m=[...Array.from({length:26},((r,o)=>String.fromCharCode(97+o))),...e],n=Math.floor(o/52);return normalizeEvolveEntryName(`${m[o%52]}${n||""}`,r)};
|
|
@@ -1,9 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* We need to normalize the page proxy to make sure that we have prefix slash.
|
|
3
|
-
* @param pageProxy `/pages`
|
|
4
|
-
* @returns The normalized page proxy
|
|
5
|
-
*/
|
|
6
|
-
export const normalizePageProxy = (pageProxy = '/pages') => {
|
|
7
|
-
const proxy = pageProxy.replace(/^\//, '').replace(/\/$/, '');
|
|
8
|
-
return `/` + (proxy || 'pages');
|
|
9
|
-
};
|
|
1
|
+
export const normalizePageProxy=(e="/pages")=>"/"+(e.replace(/^\//,"").replace(/\/$/,"")||"pages");
|
|
@@ -1,7 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
export const normalizeResolveAlias = (projectCwd, alias = {}) => {
|
|
3
|
-
for (const [symbol, path] of Object.entries(alias)) {
|
|
4
|
-
alias[symbol] = resolve(projectCwd, path);
|
|
5
|
-
}
|
|
6
|
-
return alias;
|
|
7
|
-
};
|
|
1
|
+
import{resolve}from"node:path";export const normalizeResolveAlias=(e,o={})=>{for(const[r,t]of Object.entries(o))o[r]=resolve(e,t);return o};
|
|
@@ -1,22 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
/**
|
|
3
|
-
* Normalizes the template inject tokens based on the provided configuration data and entry options.
|
|
4
|
-
*
|
|
5
|
-
* @param configData - The configuration data for the HTML plugin.
|
|
6
|
-
* @param currEntryOption - The current entry option for the evolve item.
|
|
7
|
-
* @returns An object containing the normalized template inject tokens.
|
|
8
|
-
*/
|
|
9
|
-
export const normalizeTemplateInjectTokens = (configData, currEntryOption) => {
|
|
10
|
-
return {
|
|
11
|
-
// The customized html tags should be inject to <header />
|
|
12
|
-
headBeforeHtmlTags: getHtmlPluginConfig('headBeforeHtmlTags', configData, currEntryOption?.headBeforeHtmlTags),
|
|
13
|
-
// Allow us customized inline scripts into compiled html template.
|
|
14
|
-
inlineScripts: getHtmlPluginConfig('inlineScripts', configData, currEntryOption?.inlineScripts),
|
|
15
|
-
// The ordered styles will be injected start of html head.
|
|
16
|
-
headBeforeStyles: getHtmlPluginConfig('headBeforeStyles', configData, currEntryOption?.headBeforeStyles),
|
|
17
|
-
// The ordered scripts will be injected before html head.
|
|
18
|
-
headBeforeScripts: getHtmlPluginConfig('headBeforeScripts', configData, currEntryOption?.headBeforeScripts),
|
|
19
|
-
// The ordered scripts will be injected end of html body.
|
|
20
|
-
bodyAfterScripts: getHtmlPluginConfig('bodyAfterScripts', configData, currEntryOption?.bodyAfterScripts),
|
|
21
|
-
};
|
|
22
|
-
};
|
|
1
|
+
import{getHtmlPluginConfig}from"./get-html-plugin-config.js";export const normalizeTemplateInjectTokens=(e,t)=>({headBeforeHtmlTags:getHtmlPluginConfig("headBeforeHtmlTags",e,t?.headBeforeHtmlTags),inlineScripts:getHtmlPluginConfig("inlineScripts",e,t?.inlineScripts),headBeforeStyles:getHtmlPluginConfig("headBeforeStyles",e,t?.headBeforeStyles),headBeforeScripts:getHtmlPluginConfig("headBeforeScripts",e,t?.headBeforeScripts),bodyAfterScripts:getHtmlPluginConfig("bodyAfterScripts",e,t?.bodyAfterScripts)});
|
|
@@ -1,15 +1 @@
|
|
|
1
|
-
import opn from
|
|
2
|
-
/**
|
|
3
|
-
* A better opn. Reuse the same tab on Chrome for
|
|
4
|
-
* @example
|
|
5
|
-
* `http://xxx.domain.com:3001/pages`
|
|
6
|
-
* @param openUrl the page url try to open.
|
|
7
|
-
*/
|
|
8
|
-
export const openPage = (openUrl) => {
|
|
9
|
-
try {
|
|
10
|
-
opn(openUrl);
|
|
11
|
-
}
|
|
12
|
-
catch (err) {
|
|
13
|
-
console.warn(`Unable to open browser. If you are running in a headless environment\n`);
|
|
14
|
-
}
|
|
15
|
-
};
|
|
1
|
+
import opn from"better-opn";export const openPage=n=>{try{opn(n)}catch{console.warn("Unable to open browser. If you are running in a headless environment\n")}};
|
|
@@ -1,49 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { moduleName } from '../constants.js';
|
|
3
|
-
export const printInfo = (message, silent = false) => {
|
|
4
|
-
if (!silent) {
|
|
5
|
-
logger.info(message, moduleName);
|
|
6
|
-
}
|
|
7
|
-
};
|
|
8
|
-
export const printError = (message) => {
|
|
9
|
-
logger.error(message, moduleName);
|
|
10
|
-
};
|
|
11
|
-
const formatCompilerError = (errors, formattedMessages = []) => {
|
|
12
|
-
if (!errors) {
|
|
13
|
-
return formattedMessages;
|
|
14
|
-
}
|
|
15
|
-
if (typeof errors === 'string') {
|
|
16
|
-
formattedMessages.push(errors);
|
|
17
|
-
}
|
|
18
|
-
else if (Array.isArray(errors)) {
|
|
19
|
-
for (const error of errors) {
|
|
20
|
-
formatCompilerError(error, formattedMessages);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
else if (typeof errors === 'object') {
|
|
24
|
-
// Only need to show `stack` or `message`
|
|
25
|
-
const onlyOneMsg = errors.stack || errors.message;
|
|
26
|
-
delete errors.stack;
|
|
27
|
-
delete errors.message;
|
|
28
|
-
const newErrors = {
|
|
29
|
-
...errors,
|
|
30
|
-
_newMsg: onlyOneMsg,
|
|
31
|
-
};
|
|
32
|
-
for (const [, value] of Object.entries(newErrors)) {
|
|
33
|
-
formatCompilerError(value, formattedMessages);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return formattedMessages;
|
|
37
|
-
};
|
|
38
|
-
/**
|
|
39
|
-
* Do not use `logger` to print webpack compiler error, cause of it may have it's message formatting.
|
|
40
|
-
* @param errors
|
|
41
|
-
* @returns
|
|
42
|
-
*/
|
|
43
|
-
export const printCompilerError = (errors) => {
|
|
44
|
-
const newErrors = formatCompilerError(errors, []);
|
|
45
|
-
for (const message of newErrors) {
|
|
46
|
-
console.log(message);
|
|
47
|
-
}
|
|
48
|
-
return newErrors;
|
|
49
|
-
};
|
|
1
|
+
import{logger}from"@flatjs/common";import{moduleName}from"../constants.js";export const printInfo=(r,o=!1)=>{o||logger.info(r,moduleName)};export const printError=r=>{logger.error(r,moduleName)};const formatCompilerError=(r,o=[])=>{if(!r)return o;if("string"==typeof r)o.push(r);else if(Array.isArray(r))for(const e of r)formatCompilerError(e,o);else if("object"==typeof r){const e=r.stack||r.message;delete r.stack,delete r.message;const t={...r,_newMsg:e};for(const[,r]of Object.entries(t))formatCompilerError(r,o)}return o};export const printCompilerError=r=>{const o=formatCompilerError(r,[]);for(const r of o)console.log(r);return o};
|
|
@@ -1,34 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { loadMockConfig, getMockCwd, } from '@flatjs/mock';
|
|
3
|
-
import _ from 'lodash';
|
|
4
|
-
export const refreshEvolveMockOptions = async (projectCwd, evolveOptions, configLoaderOptions) => {
|
|
5
|
-
const devServer = evolveOptions.devServer;
|
|
6
|
-
const esmLoaderOptions = configLoaderOptions?.esmLoaderOptions;
|
|
7
|
-
const externals = esmLoaderOptions?.externals || [];
|
|
8
|
-
const command = {
|
|
9
|
-
projectCwd,
|
|
10
|
-
resolve: requireResolve,
|
|
11
|
-
};
|
|
12
|
-
// Try to load mock configuration from `flatjs-mock.config.ts`
|
|
13
|
-
const newMockOptions = await loadMockConfig(command, projectCwd, (devServer?.mockOptions || {}), _.merge({}, configLoaderOptions, {
|
|
14
|
-
configFile: 'flatjs-mock',
|
|
15
|
-
esmLoaderOptions: {
|
|
16
|
-
// load `flatjs-mock.config.ts` it will always import { defineConfig } from `@flatjs/mock`
|
|
17
|
-
externals: [...externals, '@flatjs/mock'],
|
|
18
|
-
},
|
|
19
|
-
}));
|
|
20
|
-
// we always has `devServer` config node.
|
|
21
|
-
if (devServer) {
|
|
22
|
-
devServer.mockOptions = newMockOptions || {};
|
|
23
|
-
if (devServer.mockOptions && !devServer.mockOptions.https) {
|
|
24
|
-
devServer.mockOptions.https = devServer?.https;
|
|
25
|
-
}
|
|
26
|
-
// Dynamic resolve mock work root directory
|
|
27
|
-
const mockCwd = getMockCwd(newMockOptions);
|
|
28
|
-
// always push mockCwd into watchOptions ignored.
|
|
29
|
-
if (Array.isArray(devServer?.watchOptions?.ignored)) {
|
|
30
|
-
devServer?.watchOptions?.ignored.push(mockCwd);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return evolveOptions;
|
|
34
|
-
};
|
|
1
|
+
import _ from"lodash";import{requireResolve}from"@flatjs/common";import{getMockCwd,loadMockConfig}from"@flatjs/mock";export const refreshEvolveMockOptions=async(o,t,e)=>{const s=t.devServer,r=e?.esmLoaderOptions,i=r?.externals||[],n={projectCwd:o,resolve:requireResolve},c=await loadMockConfig(n,o,s?.mockOptions||{},_.merge({},e,{configFile:"flatjs-mock",esmLoaderOptions:{externals:[...i,"@flatjs/mock"]}}));if(s){s.mockOptions=c||{},s.mockOptions&&!s.mockOptions.https&&(s.mockOptions.https=s?.https);const o=getMockCwd(c);Array.isArray(s?.watchOptions?.ignored)&&s?.watchOptions?.ignored.push(o)}return t};
|
|
@@ -1,20 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { arrayUnique } from '@flatjs/common';
|
|
3
|
-
/**
|
|
4
|
-
* Transform all entry files via `entryMap`
|
|
5
|
-
* @param projectCwd The project root directory
|
|
6
|
-
* @param entryMap The evolve entryMap definition
|
|
7
|
-
* @returns The absolute entry input files.
|
|
8
|
-
*/
|
|
9
|
-
export const resolveEntryMapInputFiles = async (projectCwd, entryMap) => {
|
|
10
|
-
const pattern = [];
|
|
11
|
-
for (const [, config] of Object.entries(entryMap)) {
|
|
12
|
-
const entries = config.entry.map((s) => s.replace(/.(?:js|jsx|tsx|ts)$/, '') + '.*');
|
|
13
|
-
pattern.push(...entries);
|
|
14
|
-
}
|
|
15
|
-
const walkPattern = arrayUnique(pattern);
|
|
16
|
-
return await fileWalk(walkPattern, {
|
|
17
|
-
cwd: projectCwd,
|
|
18
|
-
absolute: true,
|
|
19
|
-
});
|
|
20
|
-
};
|
|
1
|
+
import{fileWalk}from"@armit/file-utility";import{arrayUnique}from"@flatjs/common";export const resolveEntryMapInputFiles=async(t,r)=>{const e=[];for(const[,t]of Object.entries(r)){const r=t.entry.map((t=>t.replace(/.(?:js|jsx|tsx|ts)$/,"")+".*"));e.push(...r)}const o=arrayUnique(e);return await fileWalk(o,{cwd:t,absolute:!0})};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type EvolveMultiCDNConfig, type EvolveMultiCDNEnvResolver, type EvolveMultiCdnEnvType } from '../types/types-multi-html.js';
|
|
2
2
|
export declare function httpUrlJoin(first?: string, second?: string): string;
|
|
3
3
|
/**
|
|
4
4
|
* To extract the best matched CDN configuration url address, either use URL `query.env` or customize the `envRresolver`
|
|
@@ -1,39 +1 @@
|
|
|
1
|
-
export function httpUrlJoin(
|
|
2
|
-
return first.replace(/\/$/, '') + '/' + second.replace(/^\//, '');
|
|
3
|
-
}
|
|
4
|
-
/**
|
|
5
|
-
* To extract the best matched CDN configuration url address, either use URL `query.env` or customize the `envRresolver`
|
|
6
|
-
* @param cdnConfig List of pre-configured cdn urls for each environment
|
|
7
|
-
* @param envResolver Get the specific environment variable by the currently requested host url address.
|
|
8
|
-
* @returns Returns the best matching address with a suffix (`/`)
|
|
9
|
-
*/
|
|
10
|
-
export function cdnFinder(cdnConfig, envResolver) {
|
|
11
|
-
// eslint-disable-next-line regexp/no-unused-capturing-group
|
|
12
|
-
const regex = /[?&]env(=([^&#]*)|&|#|$)/;
|
|
13
|
-
const locationHref = window.location.href;
|
|
14
|
-
const results = regex.exec(locationHref);
|
|
15
|
-
let env = results && results[2]
|
|
16
|
-
? decodeURIComponent(results[2].replace(/\+/g, ' '))
|
|
17
|
-
: 'prod';
|
|
18
|
-
// If we have customized cdn resolver using it first.
|
|
19
|
-
env = (envResolver && envResolver(locationHref)) || env;
|
|
20
|
-
const matchedCdnList = cdnConfig[env] || cdnConfig['prod'] || [];
|
|
21
|
-
const matchedCdn = matchedCdnList[Math.floor(Math.random() * matchedCdnList.length)];
|
|
22
|
-
// ensure has endfix slash
|
|
23
|
-
return matchedCdn.replace(/\/$/, '') + '/';
|
|
24
|
-
}
|
|
25
|
-
export function findEnvCdn(cdnConfig = {}, env = 'prod') {
|
|
26
|
-
const matchedCdnList = cdnConfig[env] || cdnConfig['prod'] || [];
|
|
27
|
-
return matchedCdnList[Math.floor(Math.random() * matchedCdnList.length)];
|
|
28
|
-
}
|
|
29
|
-
export function injectFederationScripts(cdnConfig, cdnResolver = function cdnResolver() {
|
|
30
|
-
return undefined;
|
|
31
|
-
}) {
|
|
32
|
-
return `window.evolveFetchMicroWidgets = function () {
|
|
33
|
-
var cdnConfig = ${JSON.stringify(cdnConfig)};
|
|
34
|
-
var cdnResolver = ${cdnResolver.toString()};
|
|
35
|
-
var cdnFinder = ${cdnFinder.toString()};
|
|
36
|
-
return (cdnFinder(cdnConfig, cdnResolver) || '').replace(/\\/$/, '');
|
|
37
|
-
}
|
|
38
|
-
`;
|
|
39
|
-
}
|
|
1
|
+
export function httpUrlJoin(n="",e=""){return n.replace(/\/$/,"")+"/"+e.replace(/^\//,"")}export function cdnFinder(n,e){const r=window.location.href,o=/[?&]env(=([^&#]*)|&|#|$)/.exec(r);let t=o&&o[2]?decodeURIComponent(o[2].replace(/\+/g," ")):"prod";t=e&&e(r)||t;const c=n[t]||n.prod||[];return c[Math.floor(Math.random()*c.length)].replace(/\/$/,"")+"/"}export function findEnvCdn(n={},e="prod"){const r=n[e]||n.prod||[];return r[Math.floor(Math.random()*r.length)]}export function injectFederationScripts(n,e=function cdnResolver(){}){return`window.evolveFetchMicroWidgets = function () {\n var cdnConfig = ${JSON.stringify(n)};\n var cdnResolver = ${e.toString()};\n var cdnFinder = ${cdnFinder.toString()};\n return (cdnFinder(cdnConfig, cdnResolver) || '').replace(/\\/$/, '');\n }\n `}
|
|
@@ -1,14 +1 @@
|
|
|
1
|
-
export const shouldEnableReactFastRefresh
|
|
2
|
-
const entryItemOption = entryMapItem[1];
|
|
3
|
-
// Check if the entry item has module federation
|
|
4
|
-
const hasModuleFederation = !!entryItemOption.options?.moduleFederation;
|
|
5
|
-
// Check if the entry item is a library, The library module can not run in the browser individually.
|
|
6
|
-
const isEntryItemLibrary = !!entryItemOption.options?.output?.library;
|
|
7
|
-
// Inject `react-refresh` if we are using preset `react`
|
|
8
|
-
return (serveMode &&
|
|
9
|
-
evolveOptions.loaderOptions.babelOptions?.usePreset === 'react' &&
|
|
10
|
-
!hasModuleFederation &&
|
|
11
|
-
!isEntryItemLibrary &&
|
|
12
|
-
// No specificed `liveReload` config
|
|
13
|
-
evolveOptions.devServer?.liveReload !== true);
|
|
14
|
-
};
|
|
1
|
+
export const shouldEnableReactFastRefresh=(e,o,t)=>{const r=o[1],s=!!r.options?.moduleFederation,a=!!r.options?.output?.library;return e&&"react"===t.loaderOptions.babelOptions?.usePreset&&!s&&!a&&!0!==t.devServer?.liveReload};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type EvolveEntryItemOption, type EvolveEntryMap, type EvolveEntryMapContent } from '../types/types-entry-map.js';
|
|
2
2
|
import { type FlatEvolveOptions } from '../types/types-options.js';
|
|
3
3
|
/**
|
|
4
4
|
* Groups the manual entries based on their group names.
|