@module-federation/bridge-react-webpack-plugin 0.4.0 → 0.5.1

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/package.json CHANGED
@@ -1,23 +1,25 @@
1
1
  {
2
2
  "name": "@module-federation/bridge-react-webpack-plugin",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
7
  "author": "zhouxiao <codingzx@gmail.com>",
8
8
  "main": "./dist/index.cjs.js",
9
- "module": "./dist/index.esm.js",
9
+ "module": "./dist/index.es.js",
10
10
  "types": "./dist/index.cjs.d.ts",
11
11
  "exports": {
12
12
  ".": {
13
13
  "types": "./dist/index.cjs.d.ts",
14
- "import": "./dist/index.esm.js",
14
+ "import": "./dist/index.es.js",
15
15
  "require": "./dist/index.cjs.js"
16
16
  },
17
17
  "./*": "./*"
18
18
  },
19
19
  "dependencies": {
20
- "@module-federation/sdk": "0.4.0"
20
+ "semver": "7.6.3",
21
+ "@types/semver": "7.5.8",
22
+ "@module-federation/sdk": "0.5.1"
21
23
  },
22
24
  "devDependencies": {
23
25
  "typescript": "^5.2.2",
package/src/index.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import type { moduleFederationPlugin } from '@module-federation/sdk';
4
+ import { getBridgeRouterAlias } from './utis';
4
5
 
5
6
  class ReactBridgeAliasChangerPlugin {
6
7
  alias: string;
@@ -12,6 +13,7 @@ class ReactBridgeAliasChangerPlugin {
12
13
  this.moduleFederationOptions = info.moduleFederationOptions;
13
14
  this.alias = 'react-router-dom$';
14
15
  this.targetFile = '@module-federation/bridge-react/dist/router.es.js';
16
+
15
17
  if (this.moduleFederationOptions.shared) {
16
18
  if (Array.isArray(this.moduleFederationOptions.shared)) {
17
19
  if (this.moduleFederationOptions.shared.includes('react-router-dom')) {
@@ -40,7 +42,12 @@ class ReactBridgeAliasChangerPlugin {
40
42
  const originalAlias = originalResolve.alias || {};
41
43
 
42
44
  // Update alias
43
- const updatedAlias = { ...originalAlias, [this.alias]: targetFilePath };
45
+ const updatedAlias = {
46
+ // allow `alias` can be override
47
+ // [this.alias]: targetFilePath,
48
+ ...getBridgeRouterAlias(originalAlias['react-router-dom']),
49
+ ...originalAlias,
50
+ };
44
51
 
45
52
  // Update the webpack configuration
46
53
  compiler.options.resolve = {
package/src/utis.ts ADDED
@@ -0,0 +1,89 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import semver from 'semver';
4
+
5
+ export const getBridgeRouterAlias = (
6
+ originalAlias: string,
7
+ ): Record<string, string> => {
8
+ const userPackageJsonPath = path.resolve(process.cwd(), 'package.json');
9
+ let userDependencies: Record<string, string> = {};
10
+
11
+ if (fs.existsSync(userPackageJsonPath)) {
12
+ const userPackageJson = JSON.parse(
13
+ fs.readFileSync(userPackageJsonPath, 'utf-8'),
14
+ );
15
+ userDependencies = {
16
+ ...userPackageJson.dependencies,
17
+ ...userPackageJson.devDependencies,
18
+ };
19
+ }
20
+
21
+ const hasBridgeReact = '@module-federation/bridge-react' in userDependencies;
22
+
23
+ let bridgeRouterAlias = {};
24
+ // user install @module-federation/bridge-react package or set bridgeReactRouterDomAlias
25
+ if (hasBridgeReact) {
26
+ // user install react-router-dom package
27
+ const reactRouterDomVersion = userDependencies['react-router-dom'];
28
+ let majorVersion = 0;
29
+ let reactRouterDomPath = '';
30
+
31
+ // if react-router-dom version is set, use the version in package.json
32
+ if (reactRouterDomVersion) {
33
+ majorVersion = semver.major(
34
+ semver.coerce(reactRouterDomVersion || '0.0.0') ?? '0.0.0',
35
+ );
36
+ reactRouterDomPath = require.resolve('react-router-dom');
37
+ } else {
38
+ // if react-router-dom version is not set, reslove react-router-dom to get the version
39
+ reactRouterDomPath = require.resolve('react-router-dom');
40
+ const packageJsonPath = path.resolve(
41
+ reactRouterDomPath,
42
+ '../../package.json',
43
+ );
44
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
45
+ majorVersion = parseInt(packageJson.version.split('.')[0]);
46
+ }
47
+
48
+ // if react-router-dom path has set alias by user, use the originalAlias
49
+ reactRouterDomPath = originalAlias || reactRouterDomPath;
50
+
51
+ if (majorVersion === 5) {
52
+ bridgeRouterAlias = {
53
+ 'react-router-dom$':
54
+ '@module-federation/bridge-react/dist/router-v5.es.js',
55
+ };
56
+ try {
57
+ require.resolve('react-router-dom/index.js');
58
+ } catch (error) {
59
+ // if react-router-dom/index.js cannot be resolved, set the alias to origin reactRouterDomPath
60
+ bridgeRouterAlias = {
61
+ ...bridgeRouterAlias,
62
+ 'react-router-dom/index.js': reactRouterDomPath,
63
+ };
64
+ }
65
+ } else if (majorVersion === 6) {
66
+ bridgeRouterAlias = {
67
+ 'react-router-dom$':
68
+ '@module-federation/bridge-react/dist/router-v6.es.js',
69
+ };
70
+
71
+ try {
72
+ require.resolve('react-router-dom/dist/index.js');
73
+ } catch (error) {
74
+ // if react-router-dom/dist/index.js cannot be resolved, set the alias to origin reactRouterDomPath
75
+ bridgeRouterAlias = {
76
+ ...bridgeRouterAlias,
77
+ 'react-router-dom/dist/index.js': reactRouterDomPath,
78
+ };
79
+ }
80
+ } else {
81
+ console.warn('react-router-dom version is not supported');
82
+ }
83
+ }
84
+ console.log(
85
+ '<<<<<<<<<<<<< bridgeRouterAlias >>>>>>>>>>>>>',
86
+ bridgeRouterAlias,
87
+ );
88
+ return bridgeRouterAlias;
89
+ };