Skip to content

Commit b727489

Browse files
committed
chore: optimize bridge-react-webpack-plugin router alias logic
1 parent d8c246c commit b727489

File tree

4 files changed

+172
-216
lines changed

4 files changed

+172
-216
lines changed

packages/bridge/bridge-react-webpack-plugin/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import fs from 'node:fs';
22
import path from 'node:path';
33
import type { moduleFederationPlugin } from '@module-federation/sdk';
4-
import { getBridgeRouterAlias } from './utis';
4+
import { getBridgeRouterAlias } from './router-alias';
55

66
class ReactBridgeAliasChangerPlugin {
77
alias: string;
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import fs from 'node:fs';
2+
import path from 'node:path';
3+
import { checkVersion, findPackageJson, getDependencies } from './utils';
4+
5+
const reactRouterDomV5AliasPath =
6+
'@module-federation/bridge-react/dist/router-v5.es.js';
7+
const reactRouterDomV6AliasPath =
8+
'@module-federation/bridge-react/dist/router-v6.es.js';
9+
const reactRouterDomV7AliasPath =
10+
'@module-federation/bridge-react/dist/router-v7.es.js';
11+
12+
const createReactRouterV7Alias = (
13+
reactRouterDomPath: string,
14+
): Record<string, string> => {
15+
const baseAlias = {
16+
'react-router$': reactRouterDomV7AliasPath,
17+
'react-router-dom$': reactRouterDomV7AliasPath, // Keep compatibility for old imports
18+
};
19+
20+
const resolvedDistPaths: Record<string, string> = {
21+
'react-router/dist/development/index.js': reactRouterDomPath,
22+
'react-router/dist/production/index.js': reactRouterDomPath,
23+
};
24+
25+
return {
26+
...baseAlias,
27+
...resolvedDistPaths,
28+
};
29+
};
30+
31+
const createReactRouterV5Alias = (
32+
reactRouterDomPath: string,
33+
): Record<string, string> => {
34+
return {
35+
'react-router-dom$': reactRouterDomV5AliasPath,
36+
'react-router-dom/index.js': reactRouterDomPath,
37+
};
38+
};
39+
40+
const createReactRouterV6Alias = (
41+
reactRouterDomPath: string,
42+
): Record<string, string> => {
43+
return {
44+
'react-router-dom$': reactRouterDomV6AliasPath,
45+
'react-router-dom/dist/index.js': reactRouterDomPath,
46+
};
47+
};
48+
49+
const setRouterAlias = (
50+
majorVersion: number,
51+
reactRouterDomPath: string,
52+
): Record<string, string> => {
53+
switch (majorVersion) {
54+
case 5:
55+
return createReactRouterV5Alias(reactRouterDomPath);
56+
case 6:
57+
return createReactRouterV6Alias(reactRouterDomPath);
58+
case 7:
59+
return createReactRouterV7Alias(reactRouterDomPath);
60+
default:
61+
console.warn(
62+
`Unsupported React Router version: ${majorVersion}. Defaulting to v7.`,
63+
);
64+
return createReactRouterV7Alias(reactRouterDomPath);
65+
}
66+
};
67+
68+
export const getBridgeRouterAlias = (
69+
originalAlias: string,
70+
): Record<string, string> => {
71+
const userDependencies = getDependencies();
72+
let reactRouterDomPath = '';
73+
74+
if (originalAlias) {
75+
reactRouterDomPath = originalAlias;
76+
} else if (userDependencies['react-router']) {
77+
// React Router v7 uses 'react-router' package name
78+
reactRouterDomPath = path.resolve(
79+
process.cwd(),
80+
'node_modules/react-router',
81+
);
82+
} else if (userDependencies['react-router-dom']) {
83+
// React Router v5/v6 uses 'react-router-dom' package name
84+
reactRouterDomPath = path.resolve(
85+
process.cwd(),
86+
'node_modules/react-router-dom',
87+
);
88+
}
89+
90+
// Generate alias based on detected router package
91+
if (reactRouterDomPath) {
92+
const packageJsonPath = findPackageJson(reactRouterDomPath);
93+
if (packageJsonPath) {
94+
const packageJsonContent = JSON.parse(
95+
fs.readFileSync(packageJsonPath, 'utf-8'),
96+
);
97+
const majorVersion = checkVersion(packageJsonContent.version);
98+
const bridgeRouterAlias = setRouterAlias(
99+
majorVersion,
100+
reactRouterDomPath,
101+
);
102+
console.log(
103+
'<<<<<<<<<<<<< bridgeRouterAlias >>>>>>>>>>>>>',
104+
bridgeRouterAlias,
105+
);
106+
return bridgeRouterAlias;
107+
}
108+
}
109+
110+
// Default to v6 which uses 'react-router-dom'
111+
const bridgeRouterAlias = {
112+
'react-router-dom$': reactRouterDomV6AliasPath,
113+
};
114+
console.log(
115+
'<<<<<<<<<<<<< default bridgeRouterAlias >>>>>>>>>>>>>',
116+
bridgeRouterAlias,
117+
);
118+
return bridgeRouterAlias;
119+
};
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import fs from 'node:fs';
2+
import path from 'node:path';
3+
import semver from 'semver';
4+
5+
export const checkVersion = (version: string) => {
6+
// Extract the version number starting from the first digit
7+
const versionMatch = version.match(/\d.*/);
8+
if (!versionMatch) return 0;
9+
10+
const cleanVersion = versionMatch[0];
11+
12+
if (semver.gte(cleanVersion, '5.0.0') && semver.lt(cleanVersion, '6.0.0')) {
13+
return 5;
14+
} else if (
15+
semver.gte(cleanVersion, '6.0.0') &&
16+
semver.lt(cleanVersion, '7.0.0')
17+
) {
18+
return 6;
19+
} else if (semver.gte(cleanVersion, '7.0.0')) {
20+
return 7;
21+
}
22+
23+
return 0;
24+
};
25+
26+
export const findPackageJson = (startPath: string): string | null => {
27+
let currentPath = startPath;
28+
while (currentPath !== path.parse(currentPath).root) {
29+
const packageJsonPath = path.join(currentPath, 'package.json');
30+
if (fs.existsSync(packageJsonPath)) {
31+
return packageJsonPath;
32+
}
33+
currentPath = path.dirname(currentPath);
34+
}
35+
return null;
36+
};
37+
38+
export const getDependencies = () => {
39+
const userPackageJsonPath = path.resolve(process.cwd(), 'package.json');
40+
let userDependencies: Record<string, string> = {};
41+
42+
if (fs.existsSync(userPackageJsonPath)) {
43+
const userPackageJson = JSON.parse(
44+
fs.readFileSync(userPackageJsonPath, 'utf-8'),
45+
);
46+
userDependencies = {
47+
...userPackageJson.dependencies,
48+
...userPackageJson.devDependencies,
49+
};
50+
}
51+
return userDependencies;
52+
};

packages/bridge/bridge-react-webpack-plugin/src/utis.ts

Lines changed: 0 additions & 215 deletions
This file was deleted.

0 commit comments

Comments
 (0)