@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,119 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { mergeOptions } from '@flatjs/common';
|
|
3
|
-
import Graph from 'tarjan-graph';
|
|
4
|
-
import webpack from 'webpack';
|
|
5
|
-
const BASE_ERROR = 'Circular dependency detected:\r\n';
|
|
6
|
-
const PLUGIN_TITLE = `CircularDependencyPlugin`;
|
|
7
|
-
export class CircularDependencyPlugin {
|
|
8
|
-
constructor(options = {}) {
|
|
9
|
-
this.options = mergeOptions({
|
|
10
|
-
exclude: /node_modules/,
|
|
11
|
-
include: /.*/,
|
|
12
|
-
failOnError: false,
|
|
13
|
-
allowAsyncCycles: false,
|
|
14
|
-
projectCwd: process.cwd(),
|
|
15
|
-
}, options);
|
|
16
|
-
}
|
|
17
|
-
apply(compiler) {
|
|
18
|
-
const cwd = this.options.projectCwd;
|
|
19
|
-
// eslint-disable-next-line sonarjs/cognitive-complexity
|
|
20
|
-
compiler.hooks.compilation.tap(PLUGIN_TITLE, (compilation) => {
|
|
21
|
-
// eslint-disable-next-line sonarjs/cognitive-complexity
|
|
22
|
-
compilation.hooks.optimizeModules.tap(PLUGIN_TITLE, (modules) => {
|
|
23
|
-
if (this.options.onStart) {
|
|
24
|
-
this.options.onStart({ compilation });
|
|
25
|
-
}
|
|
26
|
-
const dependencyGraph = new (Graph.default || Graph)();
|
|
27
|
-
for (const module of modules) {
|
|
28
|
-
// Iterate over the current modules dependencies
|
|
29
|
-
const dependedModuleIds = [];
|
|
30
|
-
for (const dependency of module.dependencies) {
|
|
31
|
-
if (dependency.constructor &&
|
|
32
|
-
dependency.constructor.name === 'CommonJsSelfReferenceDependency') {
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
let depModule = null;
|
|
36
|
-
if (compilation.moduleGraph) {
|
|
37
|
-
// handle getting a module for webpack 5
|
|
38
|
-
depModule = compilation.moduleGraph.getModule(dependency);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
// handle getting a module for webpack 4
|
|
42
|
-
depModule = dependency.module;
|
|
43
|
-
}
|
|
44
|
-
if (!depModule) {
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
// ignore dependencies that don't have an associated resource
|
|
48
|
-
if (!(depModule instanceof webpack.NormalModule) ||
|
|
49
|
-
!depModule.resource) {
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
// optionally ignore dependencies that are resolved asynchronously
|
|
53
|
-
if (this.options.allowAsyncCycles && dependency.weak) {
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
// the dependency was resolved to the current module due to how webpack internals
|
|
57
|
-
// setup dependencies like CommonJsSelfReferenceDependency and ModuleDecoratorDependency
|
|
58
|
-
if (module === depModule) {
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
dependedModuleIds.push(depModule.identifier());
|
|
62
|
-
}
|
|
63
|
-
dependencyGraph.add(module.identifier(), dependedModuleIds);
|
|
64
|
-
}
|
|
65
|
-
const cycles = dependencyGraph.getCycles();
|
|
66
|
-
this.isCyclic(cycles, compilation, cwd);
|
|
67
|
-
if (this.options.onEnd) {
|
|
68
|
-
this.options.onEnd({ compilation });
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
isCyclic(cycles, compilation, cwd) {
|
|
74
|
-
cycles.forEach((vertices) => {
|
|
75
|
-
// Convert the array of vertices into an array of module paths
|
|
76
|
-
const cyclicAbsolutePaths = vertices
|
|
77
|
-
.slice()
|
|
78
|
-
.reverse()
|
|
79
|
-
.map((vertex) => {
|
|
80
|
-
const module = compilation.findModule(vertex.name);
|
|
81
|
-
if (!(module instanceof webpack.NormalModule)) {
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
84
|
-
return module.resource || null;
|
|
85
|
-
});
|
|
86
|
-
if (cyclicAbsolutePaths.every((resource) => !resource ||
|
|
87
|
-
this.options.exclude.test(resource) ||
|
|
88
|
-
!this.options.include.test(resource))) {
|
|
89
|
-
// If all modules in the cycle are excluded by the config, don't report an error
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
const cyclicPaths = cyclicAbsolutePaths.map((resource) => relative(cwd, resource));
|
|
93
|
-
// allow consumers to override all behavior with onDetected
|
|
94
|
-
if (this.options.onDetected) {
|
|
95
|
-
try {
|
|
96
|
-
this.options.onDetected({
|
|
97
|
-
paths: cyclicPaths.concat([cyclicPaths[0]]),
|
|
98
|
-
compilation: compilation,
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
catch (err) {
|
|
102
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
103
|
-
compilation.errors.push(err);
|
|
104
|
-
}
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
// mark warnings or errors on webpack compilation
|
|
108
|
-
const error = new Error(BASE_ERROR.concat(cyclicPaths.concat([cyclicPaths[0]]).join(' -> ')));
|
|
109
|
-
if (this.options.failOnError) {
|
|
110
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
111
|
-
compilation.errors.push(error);
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
115
|
-
compilation.warnings.push(error);
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
}
|
|
1
|
+
import{relative}from"node:path";import Graph from"tarjan-graph";import webpack from"webpack";import{mergeOptions}from"@flatjs/common";const BASE_ERROR="Circular dependency detected:\r\n",PLUGIN_TITLE="CircularDependencyPlugin";export class CircularDependencyPlugin{constructor(o={}){this.options=mergeOptions({exclude:/node_modules/,include:/.*/,failOnError:!1,allowAsyncCycles:!1,projectCwd:process.cwd()},o)}apply(o){const e=this.options.projectCwd;o.hooks.compilation.tap(PLUGIN_TITLE,(o=>{o.hooks.optimizeModules.tap(PLUGIN_TITLE,(t=>{this.options.onStart&&this.options.onStart({compilation:o});const n=new(Graph.default||Graph);for(const e of t){const t=[];for(const n of e.dependencies){if(n.constructor&&"CommonJsSelfReferenceDependency"===n.constructor.name)continue;let r=null;r=o.moduleGraph?o.moduleGraph.getModule(n):n.module,r&&(r instanceof webpack.NormalModule&&r.resource&&(this.options.allowAsyncCycles&&n.weak||e!==r&&t.push(r.identifier())))}n.add(e.identifier(),t)}const r=n.getCycles();this.isCyclic(r,o,e),this.options.onEnd&&this.options.onEnd({compilation:o})}))}))}isCyclic(o,e,t){o.forEach((o=>{const n=o.slice().reverse().map((o=>{const t=e.findModule(o.name);return t instanceof webpack.NormalModule&&t.resource||null}));if(n.every((o=>!o||this.options.exclude.test(o)||!this.options.include.test(o))))return;const r=n.map((o=>relative(t,o)));if(this.options.onDetected){try{this.options.onDetected({paths:r.concat([r[0]]),compilation:e})}catch(o){e.errors.push(o)}return}const s=new Error(BASE_ERROR.concat(r.concat([r[0]]).join(" -> ")));this.options.failOnError?e.errors.push(s):e.warnings.push(s)}))}}
|
|
@@ -1,15 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
/**
|
|
3
|
-
* Detect modules with circular dependencies when bundling with webpack for `development` mode.
|
|
4
|
-
* @returns
|
|
5
|
-
*/
|
|
6
|
-
export const createCircularDependencyPlugin = (serveMode, evolveOptions) => {
|
|
7
|
-
if (!serveMode) {
|
|
8
|
-
return [];
|
|
9
|
-
}
|
|
10
|
-
return [
|
|
11
|
-
new CircularDependencyPlugin({
|
|
12
|
-
projectCwd: evolveOptions.projectCwd,
|
|
13
|
-
}),
|
|
14
|
-
];
|
|
15
|
-
};
|
|
1
|
+
import{CircularDependencyPlugin}from"./circular-dependency-plugin.js";export const createCircularDependencyPlugin=(e,n)=>e?[new CircularDependencyPlugin({projectCwd:n.projectCwd})]:[];
|
|
@@ -1,173 +1 @@
|
|
|
1
|
-
import { rmSync }
|
|
2
|
-
import { relative } from 'node:path';
|
|
3
|
-
import { fileWalkSync } from '@armit/file-utility';
|
|
4
|
-
import { logger } from '@flatjs/common';
|
|
5
|
-
import { moduleName } from '../../constants.js';
|
|
6
|
-
export class CleanWebpackPlugin {
|
|
7
|
-
constructor(options = {}) {
|
|
8
|
-
this.verbose = options.verbose === true || false;
|
|
9
|
-
this.projectCwd = options.projectCwd || process.cwd();
|
|
10
|
-
this.cleanStaleWebpackAssets =
|
|
11
|
-
options.cleanStaleWebpackAssets === true ||
|
|
12
|
-
options.cleanStaleWebpackAssets === false
|
|
13
|
-
? options.cleanStaleWebpackAssets
|
|
14
|
-
: true;
|
|
15
|
-
this.protectWebpackAssets =
|
|
16
|
-
options.protectWebpackAssets === true ||
|
|
17
|
-
options.protectWebpackAssets === false
|
|
18
|
-
? options.protectWebpackAssets
|
|
19
|
-
: true;
|
|
20
|
-
this.cleanAfterEveryBuildPatterns = Array.isArray(options.cleanAfterEveryBuildPatterns)
|
|
21
|
-
? options.cleanAfterEveryBuildPatterns
|
|
22
|
-
: [];
|
|
23
|
-
this.cleanOnceBeforeBuildPatterns = Array.isArray(options.cleanOnceBeforeBuildPatterns)
|
|
24
|
-
? options.cleanOnceBeforeBuildPatterns
|
|
25
|
-
: ['**/*'];
|
|
26
|
-
/**
|
|
27
|
-
* Store webpack build assets
|
|
28
|
-
*/
|
|
29
|
-
this.currentAssets = [];
|
|
30
|
-
/**
|
|
31
|
-
* Only used with cleanOnceBeforeBuildPatterns
|
|
32
|
-
*/
|
|
33
|
-
this.initialClean = false;
|
|
34
|
-
this.outputPath = '';
|
|
35
|
-
this.apply = this.apply.bind(this);
|
|
36
|
-
this.handleInitial = this.handleInitial.bind(this);
|
|
37
|
-
this.handleDone = this.handleDone.bind(this);
|
|
38
|
-
this.removeFiles = this.removeFiles.bind(this);
|
|
39
|
-
}
|
|
40
|
-
apply(compiler) {
|
|
41
|
-
if (!compiler.options.output || !compiler.options.output.path) {
|
|
42
|
-
logger.warn('clean-webpack-plugin: options.output.path not defined. Plugin disabled...', moduleName);
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
this.outputPath = compiler.options.output.path;
|
|
46
|
-
/**
|
|
47
|
-
* webpack 4+ comes with a new plugin system.
|
|
48
|
-
*
|
|
49
|
-
* Check for hooks in-order to support old plugin system
|
|
50
|
-
*/
|
|
51
|
-
const hooks = compiler.hooks;
|
|
52
|
-
if (this.cleanOnceBeforeBuildPatterns.length !== 0) {
|
|
53
|
-
hooks.emit.tap('clean-webpack-plugin', (compilation) => {
|
|
54
|
-
this.handleInitial(compilation);
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
hooks.done.tap('clean-webpack-plugin', (stats) => {
|
|
58
|
-
this.handleDone(stats);
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Initially remove files from output directory prior to build.
|
|
63
|
-
*
|
|
64
|
-
* Only happens once.
|
|
65
|
-
*
|
|
66
|
-
* Warning: It is recommended to initially clean your build directory outside of webpack to minimize unexpected behavior.
|
|
67
|
-
*/
|
|
68
|
-
handleInitial(compilation) {
|
|
69
|
-
if (this.initialClean) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Do not remove files if there are compilation errors
|
|
74
|
-
*
|
|
75
|
-
* Handle logging inside this.handleDone
|
|
76
|
-
*/
|
|
77
|
-
const stats = compilation.getStats();
|
|
78
|
-
if (stats.hasErrors()) {
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
this.initialClean = true;
|
|
82
|
-
this.removeFiles(this.cleanOnceBeforeBuildPatterns);
|
|
83
|
-
}
|
|
84
|
-
handleDone(stats) {
|
|
85
|
-
/**
|
|
86
|
-
* Do nothing if there is a webpack error
|
|
87
|
-
*/
|
|
88
|
-
if (stats.hasErrors()) {
|
|
89
|
-
if (this.verbose) {
|
|
90
|
-
logger.warn('clean-webpack-plugin: pausing due to webpack errors', moduleName);
|
|
91
|
-
}
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Fetch Webpack's output asset files
|
|
96
|
-
*/
|
|
97
|
-
const assets = stats.toJson({
|
|
98
|
-
assets: true,
|
|
99
|
-
}).assets || [];
|
|
100
|
-
const assetList = assets.map((asset) => {
|
|
101
|
-
return asset.name;
|
|
102
|
-
});
|
|
103
|
-
/**
|
|
104
|
-
* Get all files that were in the previous build but not the current
|
|
105
|
-
*
|
|
106
|
-
* (relies on del's cwd: outputPath option)
|
|
107
|
-
*/
|
|
108
|
-
const staleFiles = this.currentAssets.filter((previousAsset) => {
|
|
109
|
-
return assetList.includes(previousAsset) === false;
|
|
110
|
-
});
|
|
111
|
-
/**
|
|
112
|
-
* Save assets for next compilation
|
|
113
|
-
*/
|
|
114
|
-
this.currentAssets = assetList.sort();
|
|
115
|
-
const removePatterns = [];
|
|
116
|
-
/**
|
|
117
|
-
* Remove unused webpack assets
|
|
118
|
-
*/
|
|
119
|
-
if (this.cleanStaleWebpackAssets === true && staleFiles.length !== 0) {
|
|
120
|
-
removePatterns.push(...staleFiles);
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Remove cleanAfterEveryBuildPatterns
|
|
124
|
-
*/
|
|
125
|
-
if (this.cleanAfterEveryBuildPatterns.length !== 0) {
|
|
126
|
-
removePatterns.push(...this.cleanAfterEveryBuildPatterns);
|
|
127
|
-
}
|
|
128
|
-
if (removePatterns.length !== 0) {
|
|
129
|
-
this.removeFiles(removePatterns);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
removeFiles(patterns) {
|
|
133
|
-
try {
|
|
134
|
-
const deleted = fileWalkSync(patterns, {
|
|
135
|
-
absolute: true,
|
|
136
|
-
unique: true,
|
|
137
|
-
// Change context to build directory
|
|
138
|
-
cwd: this.outputPath,
|
|
139
|
-
dot: true,
|
|
140
|
-
ignore: this.protectWebpackAssets ? this.currentAssets : [],
|
|
141
|
-
});
|
|
142
|
-
for (const filepath of deleted) {
|
|
143
|
-
rmSync(filepath, {
|
|
144
|
-
force: true,
|
|
145
|
-
recursive: true,
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Log if verbose is enabled
|
|
150
|
-
*/
|
|
151
|
-
if (this.verbose) {
|
|
152
|
-
deleted.forEach((file) => {
|
|
153
|
-
const filename = relative(this.projectCwd, file);
|
|
154
|
-
const message = 'removed';
|
|
155
|
-
/**
|
|
156
|
-
* Use console.warn over .log
|
|
157
|
-
* https://github.com/webpack/webpack/issues/1904
|
|
158
|
-
* https://github.com/johnagan/clean-webpack-plugin/issues/11
|
|
159
|
-
*/
|
|
160
|
-
logger.debug(`clean-webpack-plugin: ${message} ${filename}`, moduleName);
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
catch (error) {
|
|
165
|
-
const needsForce = /Cannot delete files\/folders outside the current working directory\./.test(error.message);
|
|
166
|
-
if (needsForce) {
|
|
167
|
-
const message = 'clean-webpack-plugin: Cannot delete files/folders outside the current working directory. Can be overridden with the `dangerouslyAllowCleanPatternsOutsideProject` option.';
|
|
168
|
-
throw new Error(message);
|
|
169
|
-
}
|
|
170
|
-
throw error;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
1
|
+
import{rmSync}from"node:fs";import{relative}from"node:path";import{fileWalkSync}from"@armit/file-utility";import{logger}from"@flatjs/common";import{moduleName}from"../../constants.js";export class CleanWebpackPlugin{constructor(e={}){this.verbose=!0===e.verbose||!1,this.projectCwd=e.projectCwd||process.cwd(),this.cleanStaleWebpackAssets=!0!==e.cleanStaleWebpackAssets&&!1!==e.cleanStaleWebpackAssets||e.cleanStaleWebpackAssets,this.protectWebpackAssets=!0!==e.protectWebpackAssets&&!1!==e.protectWebpackAssets||e.protectWebpackAssets,this.cleanAfterEveryBuildPatterns=Array.isArray(e.cleanAfterEveryBuildPatterns)?e.cleanAfterEveryBuildPatterns:[],this.cleanOnceBeforeBuildPatterns=Array.isArray(e.cleanOnceBeforeBuildPatterns)?e.cleanOnceBeforeBuildPatterns:["**/*"],this.currentAssets=[],this.initialClean=!1,this.outputPath="",this.apply=this.apply.bind(this),this.handleInitial=this.handleInitial.bind(this),this.handleDone=this.handleDone.bind(this),this.removeFiles=this.removeFiles.bind(this)}apply(e){if(!e.options.output||!e.options.output.path)return void logger.warn("clean-webpack-plugin: options.output.path not defined. Plugin disabled...",moduleName);this.outputPath=e.options.output.path;const t=e.hooks;0!==this.cleanOnceBeforeBuildPatterns.length&&t.emit.tap("clean-webpack-plugin",(e=>{this.handleInitial(e)})),t.done.tap("clean-webpack-plugin",(e=>{this.handleDone(e)}))}handleInitial(e){if(this.initialClean)return;e.getStats().hasErrors()||(this.initialClean=!0,this.removeFiles(this.cleanOnceBeforeBuildPatterns))}handleDone(e){if(e.hasErrors())return void(this.verbose&&logger.warn("clean-webpack-plugin: pausing due to webpack errors",moduleName));const t=(e.toJson({assets:!0}).assets||[]).map((e=>e.name)),s=this.currentAssets.filter((e=>!1===t.includes(e)));this.currentAssets=t.sort();const i=[];!0===this.cleanStaleWebpackAssets&&0!==s.length&&i.push(...s),0!==this.cleanAfterEveryBuildPatterns.length&&i.push(...this.cleanAfterEveryBuildPatterns),0!==i.length&&this.removeFiles(i)}removeFiles(e){try{const t=fileWalkSync(e,{absolute:!0,unique:!0,cwd:this.outputPath,dot:!0,ignore:this.protectWebpackAssets?this.currentAssets:[]});for(const e of t)rmSync(e,{force:!0,recursive:!0});this.verbose&&t.forEach((e=>{const t=relative(this.projectCwd,e);logger.debug(`clean-webpack-plugin: removed ${t}`,moduleName)}))}catch(e){if(/Cannot delete files\/folders outside the current working directory\./.test(e.message)){throw new Error("clean-webpack-plugin: Cannot delete files/folders outside the current working directory. Can be overridden with the `dangerouslyAllowCleanPatternsOutsideProject` option.")}throw e}}}
|
|
@@ -1,22 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { ensureSlash } from '@flatjs/common';
|
|
3
|
-
import { CleanWebpackPlugin } from './clean-webpack-plugin.js';
|
|
4
|
-
/**
|
|
5
|
-
* Cleaning up the /dist folder for `production` build
|
|
6
|
-
* @param singleEntryItem
|
|
7
|
-
* @returns
|
|
8
|
-
*/
|
|
9
|
-
export const createCleanWebpackPlugin = (serveMode, entryMapItemList, evolveOptions) => {
|
|
10
|
-
if (serveMode) {
|
|
11
|
-
return [];
|
|
12
|
-
}
|
|
13
|
-
return [
|
|
14
|
-
new CleanWebpackPlugin({
|
|
15
|
-
verbose: true,
|
|
16
|
-
projectCwd: evolveOptions.projectCwd,
|
|
17
|
-
cleanOnceBeforeBuildPatterns: entryMapItemList.map((entryMapItem) => {
|
|
18
|
-
return `${join(ensureSlash(entryMapItem[0], true), '**/*')}`;
|
|
19
|
-
}),
|
|
20
|
-
}),
|
|
21
|
-
];
|
|
22
|
-
};
|
|
1
|
+
import{join}from"node:path";import{ensureSlash}from"@flatjs/common";import{CleanWebpackPlugin}from"./clean-webpack-plugin.js";export const createCleanWebpackPlugin=(e,n,o)=>e?[]:[new CleanWebpackPlugin({verbose:!0,projectCwd:o.projectCwd,cleanOnceBeforeBuildPatterns:n.map((e=>`${join(ensureSlash(e[0],!0),"**/*")}`))})];
|
|
@@ -1,28 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { getLastCommitHash, gitBranchName } from '@armit/git';
|
|
3
|
-
import webpack from 'webpack';
|
|
4
|
-
/**
|
|
5
|
-
* The DefinePlugin replaces variables in your code with other values or expressions at compile time.
|
|
6
|
-
* ```ts
|
|
7
|
-
* `__SENTRY_DEBUG__`
|
|
8
|
-
* `process.env.FLAT_BUILD_DATE`
|
|
9
|
-
* `process.env.FLAT_COMMIT_HASH`
|
|
10
|
-
* `process.env.FLAT_BRANCH_NAME`
|
|
11
|
-
* `process.env.FLAT_RELEASE_VERSION`
|
|
12
|
-
* ```
|
|
13
|
-
* @returns
|
|
14
|
-
*/
|
|
15
|
-
export const createBuiltinDefineVariables = async (serveMode, evolveOptions) => {
|
|
16
|
-
const commitHash = await getLastCommitHash();
|
|
17
|
-
const branchName = await gitBranchName();
|
|
18
|
-
return [
|
|
19
|
-
new webpack.DefinePlugin({
|
|
20
|
-
__SENTRY_DEBUG__: serveMode,
|
|
21
|
-
'process.env.FLAT_BUILD_DATE': JSON.stringify(new Date().toISOString()),
|
|
22
|
-
'process.env.FLAT_COMMIT_HASH': JSON.stringify(commitHash),
|
|
23
|
-
'process.env.FLAT_BRANCH_NAME': JSON.stringify(branchName),
|
|
24
|
-
'process.env.FLAT_RELEASE_VERSION': JSON.stringify(evolveOptions.ci?.releaseVersion || commitHash),
|
|
25
|
-
...evolveOptions.pluginOptions.definePlugin,
|
|
26
|
-
}),
|
|
27
|
-
];
|
|
28
|
-
};
|
|
1
|
+
import webpack from"webpack";import{getLastCommitHash,gitBranchName}from"@armit/git";export const createBuiltinDefineVariables=async(e,i)=>{const t=await getLastCommitHash(),n=await gitBranchName();return[new webpack.DefinePlugin({__SENTRY_DEBUG__:e,"process.env.FLAT_BUILD_DATE":JSON.stringify((new Date).toISOString()),"process.env.FLAT_COMMIT_HASH":JSON.stringify(t),"process.env.FLAT_BRANCH_NAME":JSON.stringify(n),"process.env.FLAT_RELEASE_VERSION":JSON.stringify(i.ci?.releaseVersion||t),...i.pluginOptions.definePlugin})]};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export*from"./define-variable-plugin.js";
|
|
@@ -1,27 +1 @@
|
|
|
1
|
-
import htmlWebpackPlugin from
|
|
2
|
-
const PLUGIN_PREFIX = `HtmlInjectScriptPlugin`;
|
|
3
|
-
export class HtmlInjectScriptPlugin {
|
|
4
|
-
constructor(scripts) {
|
|
5
|
-
this.scripts = scripts || [];
|
|
6
|
-
}
|
|
7
|
-
processScripts() {
|
|
8
|
-
return this.scripts.filter(Boolean).map((asset) => {
|
|
9
|
-
return {
|
|
10
|
-
tagName: 'script',
|
|
11
|
-
innerHTML: asset,
|
|
12
|
-
voidTag: false,
|
|
13
|
-
attributes: {},
|
|
14
|
-
meta: { plugin: 'html-inject-script-webpack-plugin' },
|
|
15
|
-
};
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
apply(compiler) {
|
|
19
|
-
compiler.hooks.compilation.tap(`${PLUGIN_PREFIX}_compilation`, (compilation) => {
|
|
20
|
-
const hooks = htmlWebpackPlugin.getHooks(compilation);
|
|
21
|
-
hooks.alterAssetTags.tap(`${PLUGIN_PREFIX}_alterAssetTags`, (data) => {
|
|
22
|
-
data.assetTags.scripts.unshift(...this.processScripts());
|
|
23
|
-
return data;
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
}
|
|
1
|
+
import htmlWebpackPlugin from"html-webpack-plugin";const PLUGIN_PREFIX="HtmlInjectScriptPlugin";export class HtmlInjectScriptPlugin{constructor(t){this.scripts=t||[]}processScripts(){return this.scripts.filter(Boolean).map((t=>({tagName:"script",innerHTML:t,voidTag:!1,attributes:{},meta:{plugin:"html-inject-script-webpack-plugin"}})))}apply(t){t.hooks.compilation.tap(`${PLUGIN_PREFIX}_compilation`,(t=>{htmlWebpackPlugin.getHooks(t).alterAssetTags.tap(`${PLUGIN_PREFIX}_alterAssetTags`,(t=>(t.assetTags.scripts.unshift(...this.processScripts()),t)))}))}}
|
|
@@ -1,92 +1 @@
|
|
|
1
|
-
import webpackSources from
|
|
2
|
-
const PLUGIN_NAME = 'ExternalTemplateRemotesPlugin';
|
|
3
|
-
const isExternalModule = (module) => {
|
|
4
|
-
return module.constructor.name === 'ExternalModule';
|
|
5
|
-
};
|
|
6
|
-
/**
|
|
7
|
-
* @param {string} urlAndGlobal the script request
|
|
8
|
-
* @returns {string[]} script url and its global variable
|
|
9
|
-
*/
|
|
10
|
-
function extractUrlAndGlobal(urlAndGlobal) {
|
|
11
|
-
const index = urlAndGlobal.indexOf('@');
|
|
12
|
-
if (index <= 0 || index === urlAndGlobal.length - 1) {
|
|
13
|
-
throw new Error(`Invalid request "${urlAndGlobal}"`);
|
|
14
|
-
}
|
|
15
|
-
return [urlAndGlobal.substring(index + 1), urlAndGlobal.substring(0, index)];
|
|
16
|
-
}
|
|
17
|
-
export class ExternalTemplateRemotesPlugin {
|
|
18
|
-
apply(compiler) {
|
|
19
|
-
compiler.hooks.make.tap(PLUGIN_NAME, (compilation) => {
|
|
20
|
-
const scriptExternalModules = [];
|
|
21
|
-
compilation.hooks.buildModule.tap(PLUGIN_NAME, (module) => {
|
|
22
|
-
if (isExternalModule(module) && module.externalType === 'script') {
|
|
23
|
-
scriptExternalModules.push(module);
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
compilation.hooks.afterCodeGeneration.tap(PLUGIN_NAME, () => {
|
|
27
|
-
scriptExternalModules.forEach((module) => {
|
|
28
|
-
const urlTemplate = extractUrlAndGlobal(module.request)[0];
|
|
29
|
-
const urlExpression = toExpression(urlTemplate);
|
|
30
|
-
const sourceMap = compilation.codeGenerationResults.get(module, undefined).sources;
|
|
31
|
-
const rawSource = sourceMap.get('javascript');
|
|
32
|
-
if (rawSource) {
|
|
33
|
-
const source = new webpackSources.RawSource(rawSource
|
|
34
|
-
.source()
|
|
35
|
-
.toString()
|
|
36
|
-
.replace(`"${urlTemplate}"`, urlExpression));
|
|
37
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
38
|
-
sourceMap.set('javascript', source);
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* app2@localhost/remoteEntry.js --> "\"app2@localhost/remoteEntry.js\""
|
|
47
|
-
* app2@[window.app2Url]/remoteEntry.js --> "\"app2@\" + window.app2Url + \"/remoteEntry.js\""
|
|
48
|
-
* @param templateUrl
|
|
49
|
-
* @returns
|
|
50
|
-
*/
|
|
51
|
-
// eslint-disable-next-line sonarjs/cognitive-complexity
|
|
52
|
-
function toExpression(templateUrl) {
|
|
53
|
-
const result = [];
|
|
54
|
-
const current = [];
|
|
55
|
-
let isExpression = false;
|
|
56
|
-
let invalid = false;
|
|
57
|
-
for (const c of templateUrl) {
|
|
58
|
-
if (c === '[') {
|
|
59
|
-
if (isExpression) {
|
|
60
|
-
invalid = true;
|
|
61
|
-
break;
|
|
62
|
-
}
|
|
63
|
-
isExpression = true;
|
|
64
|
-
if (current.length) {
|
|
65
|
-
result.push(`"${current.join('')}"`);
|
|
66
|
-
current.length = 0;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
else if (c === ']') {
|
|
70
|
-
if (!isExpression) {
|
|
71
|
-
invalid = true;
|
|
72
|
-
break;
|
|
73
|
-
}
|
|
74
|
-
isExpression = false;
|
|
75
|
-
if (current.length) {
|
|
76
|
-
result.push(`${current.join('')}`);
|
|
77
|
-
current.length = 0;
|
|
78
|
-
}
|
|
79
|
-
current.length = 0;
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
current.push(c);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
if (isExpression || invalid) {
|
|
86
|
-
throw new Error(`Invalid template URL "${templateUrl}"`);
|
|
87
|
-
}
|
|
88
|
-
if (current.length) {
|
|
89
|
-
result.push(`"${current.join('')}"`);
|
|
90
|
-
}
|
|
91
|
-
return result.join(' + ');
|
|
92
|
-
}
|
|
1
|
+
import webpackSources from"webpack-sources";const PLUGIN_NAME="ExternalTemplateRemotesPlugin",isExternalModule=e=>"ExternalModule"===e.constructor.name;function extractUrlAndGlobal(e){const t=e.indexOf("@");if(t<=0||t===e.length-1)throw new Error(`Invalid request "${e}"`);return[e.substring(t+1),e.substring(0,t)]}export class ExternalTemplateRemotesPlugin{apply(e){e.hooks.make.tap(PLUGIN_NAME,(e=>{const t=[];e.hooks.buildModule.tap(PLUGIN_NAME,(e=>{isExternalModule(e)&&"script"===e.externalType&&t.push(e)})),e.hooks.afterCodeGeneration.tap(PLUGIN_NAME,(()=>{t.forEach((t=>{const o=extractUrlAndGlobal(t.request)[0],n=toExpression(o),r=e.codeGenerationResults.get(t,void 0).sources,s=r.get("javascript");if(s){const e=new webpackSources.RawSource(s.source().toString().replace(`"${o}"`,n));r.set("javascript",e)}}))}))}))}}function toExpression(e){const t=[],o=[];let n=!1,r=!1;for(const s of e)if("["===s){if(n){r=!0;break}n=!0,o.length&&(t.push(`"${o.join("")}"`),o.length=0)}else if("]"===s){if(!n){r=!0;break}n=!1,o.length&&(t.push(`${o.join("")}`),o.length=0),o.length=0}else o.push(s);if(n||r)throw new Error(`Invalid template URL "${e}"`);return o.length&&t.push(`"${o.join("")}"`),t.join(" + ")}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export*from"./module-federation.js";
|
|
@@ -1,100 +1 @@
|
|
|
1
|
-
import { join }
|
|
2
|
-
import { ensureSlash } from '@flatjs/common';
|
|
3
|
-
import webpack from 'webpack';
|
|
4
|
-
import { normalizeEvolveEntryName } from '../../helpers/normalize-entry-map.js';
|
|
5
|
-
import { injectFederationScripts } from '../../helpers/script-injects.js';
|
|
6
|
-
import { HtmlInjectScriptPlugin } from '../html-inject-scripts/plugin-html-inject-script.js';
|
|
7
|
-
import { ExternalTemplateRemotesPlugin } from './external-template-remotes.js';
|
|
8
|
-
/**
|
|
9
|
-
* `${projectVirtualPath}/mine` --> evolve_demo_mine
|
|
10
|
-
* @param entryPath `${projectVirtualPath}/mine`
|
|
11
|
-
*/
|
|
12
|
-
const normalizeWidgetName = (entryPath = '') => {
|
|
13
|
-
return entryPath.replace(/[/-]/g, '_').toLowerCase();
|
|
14
|
-
};
|
|
15
|
-
const remoteFileName = (entryName) => {
|
|
16
|
-
return join(entryName, `micro-remote-module.js`);
|
|
17
|
-
};
|
|
18
|
-
export const createModuleFederationPlugin = (serveMode, entryMapItemList, evolveOptions) => {
|
|
19
|
-
const projectVirtualPath = evolveOptions.projectVirtualPath;
|
|
20
|
-
const multiCdnConfig = evolveOptions.multiHtmlCdn;
|
|
21
|
-
const multiHtmlCdnResolver = evolveOptions.multiHtmlCdnEnvResolver;
|
|
22
|
-
const plugins = [];
|
|
23
|
-
for (const entryMapItem of entryMapItemList) {
|
|
24
|
-
const [entryName, entryConfig] = entryMapItem;
|
|
25
|
-
const moduleFederation = entryConfig.options?.moduleFederation;
|
|
26
|
-
if (moduleFederation) {
|
|
27
|
-
const { remotes, exposes, ...restFederationOptions } = moduleFederation;
|
|
28
|
-
// e.g. `flatjs/evolve/mine` => `flatjs/evolve/home/micro-remote-module.js`
|
|
29
|
-
const entryRemoteFileName = remoteFileName(entryName);
|
|
30
|
-
// e.g. `flatjs/evolve/mine` => `flatjs_evolve_mine`
|
|
31
|
-
const containerName = normalizeWidgetName(entryName);
|
|
32
|
-
const patchExposes = exposes
|
|
33
|
-
? Array.isArray(exposes)
|
|
34
|
-
? exposes
|
|
35
|
-
: [exposes]
|
|
36
|
-
: [];
|
|
37
|
-
const myExposes = patchExposes.map((s) => {
|
|
38
|
-
const exposeItem = {};
|
|
39
|
-
for (const [key, config] of Object.entries(s)) {
|
|
40
|
-
exposeItem[key] = {
|
|
41
|
-
...config,
|
|
42
|
-
name: join(entryName, config.name.replace(/^\//, '')),
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
return exposeItem;
|
|
46
|
-
});
|
|
47
|
-
const myRemotes = (remotes || []).map(({ name, endpoint }) => {
|
|
48
|
-
// e.g. `flatjs/evolve/home`
|
|
49
|
-
const normalizedEntryName = normalizeEvolveEntryName(name, projectVirtualPath);
|
|
50
|
-
// e.g. `flatjs_evolve_home`
|
|
51
|
-
const remoteWidgetName = normalizeWidgetName(normalizedEntryName);
|
|
52
|
-
// e.g. `flatjs/evolve/home/micro-remote-module.js`
|
|
53
|
-
const refRemoteEntryFileName = remoteFileName(normalizedEntryName);
|
|
54
|
-
// construct endpoint for remote widget name.
|
|
55
|
-
const endpointPath = endpoint
|
|
56
|
-
? ensureSlash(endpoint(name, normalizedEntryName), false)
|
|
57
|
-
: `[window.evolveFetchMicroWidgets()]`;
|
|
58
|
-
return {
|
|
59
|
-
[remoteWidgetName]: `${remoteWidgetName}@${endpointPath}/${refRemoteEntryFileName}`,
|
|
60
|
-
};
|
|
61
|
-
});
|
|
62
|
-
plugins.push(
|
|
63
|
-
// https://webpack.js.org/plugins/module-federation-plugin/
|
|
64
|
-
new webpack.container.ModuleFederationPlugin({
|
|
65
|
-
/**
|
|
66
|
-
* Options for library.
|
|
67
|
-
* library: { type: 'var', name: containerName },
|
|
68
|
-
* other module federation configurations
|
|
69
|
-
*/
|
|
70
|
-
...restFederationOptions,
|
|
71
|
-
/**
|
|
72
|
-
* The name of the container
|
|
73
|
-
* `${projectName}-${moduleName}` e.g. `flatjs_evolve_home`
|
|
74
|
-
*/
|
|
75
|
-
name: containerName,
|
|
76
|
-
/**
|
|
77
|
-
* The filename of the container as relative path inside the `output.path` directory.
|
|
78
|
-
* `${entryName}/micro-remote-module.js`, e.g. `flatjs/evolve/home/micro-remote-module.js`
|
|
79
|
-
*/
|
|
80
|
-
filename: entryRemoteFileName,
|
|
81
|
-
/**
|
|
82
|
-
* Container locations and request scopes from which modules should be resolved and loaded at runtime.
|
|
83
|
-
* When provided, property name is used as request scope, otherwise request scope is automatically inferred from container location.
|
|
84
|
-
*/
|
|
85
|
-
remotes: myRemotes,
|
|
86
|
-
/**
|
|
87
|
-
* Modules that should be exposed by this container.
|
|
88
|
-
* When provided, property name is used as public name, otherwise public name is automatically inferred from request.
|
|
89
|
-
*/
|
|
90
|
-
exposes: myExposes,
|
|
91
|
-
}), new ExternalTemplateRemotesPlugin());
|
|
92
|
-
if (!serveMode) {
|
|
93
|
-
plugins.unshift(new HtmlInjectScriptPlugin([
|
|
94
|
-
injectFederationScripts(multiCdnConfig, multiHtmlCdnResolver),
|
|
95
|
-
]));
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return plugins;
|
|
100
|
-
};
|
|
1
|
+
import{join}from"node:path";import webpack from"webpack";import{ensureSlash}from"@flatjs/common";import{normalizeEvolveEntryName}from"../../helpers/normalize-entry-map.js";import{injectFederationScripts}from"../../helpers/script-injects.js";import{HtmlInjectScriptPlugin}from"../html-inject-scripts/plugin-html-inject-script.js";import{ExternalTemplateRemotesPlugin}from"./external-template-remotes.js";const normalizeWidgetName=(e="")=>e.replace(/[/-]/g,"_").toLowerCase(),remoteFileName=e=>join(e,"micro-remote-module.js");export const createModuleFederationPlugin=(e,t,o)=>{const r=o.projectVirtualPath,n=o.multiHtmlCdn,i=o.multiHtmlCdnEnvResolver,m=[];for(const o of t){const[t,a]=o,l=a.options?.moduleFederation;if(l){const{remotes:o,exposes:a,...s}=l,c=remoteFileName(t),p=normalizeWidgetName(t),u=(a?Array.isArray(a)?a:[a]:[]).map((e=>{const o={};for(const[r,n]of Object.entries(e))o[r]={...n,name:join(t,n.name.replace(/^\//,""))};return o})),d=(o||[]).map((({name:e,endpoint:t})=>{const o=normalizeEvolveEntryName(e,r),n=normalizeWidgetName(o),i=remoteFileName(o),m=t?ensureSlash(t(e,o),!1):"[window.evolveFetchMicroWidgets()]";return{[n]:`${n}@${m}/${i}`}}));m.push(new webpack.container.ModuleFederationPlugin({...s,name:p,filename:c,remotes:d,exposes:u}),new ExternalTemplateRemotesPlugin),e||m.unshift(new HtmlInjectScriptPlugin([injectFederationScripts(n,i)]))}}return m};
|
|
@@ -1,16 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { createMultiHtmlWebpackPlugin } from './multi-html-plugin.js';
|
|
3
|
-
export const createHtmlPlugins = (serveMode, entryMapItemList, evolveOptions) => {
|
|
4
|
-
const plugins = [];
|
|
5
|
-
// Only for `production`, or `library` compiler mode do not need to attach `html-webpack-plugin`
|
|
6
|
-
const firstEntryMapItem = entryMapItemList[0];
|
|
7
|
-
if (serveMode || firstEntryMapItem[1]?.options?.output?.library) {
|
|
8
|
-
return plugins;
|
|
9
|
-
}
|
|
10
|
-
// Attach `html-webpack-plugin` first
|
|
11
|
-
const allEnv = Object.keys(evolveOptions.multiHtmlCdn);
|
|
12
|
-
plugins.push(...createMultiHtmlWebpackPlugin(serveMode, evolveOptions, entryMapItemList, allEnv));
|
|
13
|
-
// Attach `@flatjs/evolve-plugin-multi-html-cdn`
|
|
14
|
-
plugins.push(new FlatEvolveMultiCdnPlugin(evolveOptions));
|
|
15
|
-
return plugins;
|
|
16
|
-
};
|
|
1
|
+
import{FlatEvolveMultiCdnPlugin}from"./multi-html-cdn-plugin.js";import{createMultiHtmlWebpackPlugin}from"./multi-html-plugin.js";export const createHtmlPlugins=(t,l,u)=>{const i=[],n=l[0];if(t||n[1]?.options?.output?.library)return i;const e=Object.keys(u.multiHtmlCdn);return i.push(...createMultiHtmlWebpackPlugin(t,u,l,e)),i.push(new FlatEvolveMultiCdnPlugin(u)),i};
|