@module-federation/bridge-react 0.0.0-next-20240930091801 → 0.0.0-next-20241002194835
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/CHANGELOG.md +14 -7
- package/dist/index.cjs.js +16 -1050
- package/dist/index.d.ts +5 -17
- package/dist/index.es.js +16 -1050
- package/dist/router-v6.cjs.js +1 -1
- package/dist/router-v6.es.js +1 -1
- package/dist/router.cjs.js +1 -1
- package/dist/router.es.js +1 -1
- package/package.json +6 -7
- package/project.json +2 -2
- package/src/create.tsx +2 -2
- package/src/provider.tsx +6 -46
- package/src/remote/index.tsx +1 -20
- package/src/router-v5.tsx +1 -0
- package/src/router-v6.tsx +1 -1
- package/src/router.tsx +1 -1
- package/src/lifecycle.ts +0 -29
package/dist/router-v6.cjs.js
CHANGED
|
@@ -65,7 +65,7 @@ function WraperRouterProvider(props) {
|
|
|
65
65
|
return /* @__PURE__ */ React.createElement(RouterProvider, { router: MemeoryRouterInstance });
|
|
66
66
|
} else {
|
|
67
67
|
const BrowserRouterInstance = createBrowserRouter(routers, {
|
|
68
|
-
basename: routerContextProps.basename
|
|
68
|
+
basename: routerContextProps.basename,
|
|
69
69
|
future: router.future,
|
|
70
70
|
window: router.window
|
|
71
71
|
});
|
package/dist/router-v6.es.js
CHANGED
|
@@ -47,7 +47,7 @@ function WraperRouterProvider(props) {
|
|
|
47
47
|
return /* @__PURE__ */ React__default.createElement(RouterProvider, { router: MemeoryRouterInstance });
|
|
48
48
|
} else {
|
|
49
49
|
const BrowserRouterInstance = createBrowserRouter(routers, {
|
|
50
|
-
basename: routerContextProps.basename
|
|
50
|
+
basename: routerContextProps.basename,
|
|
51
51
|
future: router.future,
|
|
52
52
|
window: router.window
|
|
53
53
|
});
|
package/dist/router.cjs.js
CHANGED
|
@@ -65,7 +65,7 @@ function WrapperRouterProvider(props) {
|
|
|
65
65
|
return /* @__PURE__ */ React.createElement(RouterProvider, { router: MemeoryRouterInstance });
|
|
66
66
|
} else {
|
|
67
67
|
const BrowserRouterInstance = createBrowserRouter(routers, {
|
|
68
|
-
basename: routerContextProps.basename
|
|
68
|
+
basename: routerContextProps.basename,
|
|
69
69
|
future: router.future,
|
|
70
70
|
window: router.window
|
|
71
71
|
});
|
package/dist/router.es.js
CHANGED
|
@@ -47,7 +47,7 @@ function WrapperRouterProvider(props) {
|
|
|
47
47
|
return /* @__PURE__ */ React__default.createElement(RouterProvider, { router: MemeoryRouterInstance });
|
|
48
48
|
} else {
|
|
49
49
|
const BrowserRouterInstance = createBrowserRouter(routers, {
|
|
50
|
-
basename: routerContextProps.basename
|
|
50
|
+
basename: routerContextProps.basename,
|
|
51
51
|
future: router.future,
|
|
52
52
|
window: router.window
|
|
53
53
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@module-federation/bridge-react",
|
|
3
|
-
"version": "0.0.0-next-
|
|
3
|
+
"version": "0.0.0-next-20241002194835",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -35,24 +35,23 @@
|
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@loadable/component": "^5.16.4",
|
|
37
37
|
"react-error-boundary": "^4.0.13",
|
|
38
|
-
"@module-federation/bridge-shared": "0.0.0-next-
|
|
38
|
+
"@module-federation/bridge-shared": "0.0.0-next-20241002194835"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
41
|
"react": ">=16.9.0",
|
|
42
42
|
"react-dom": ">=16.9.0",
|
|
43
|
-
"react-router-dom": ">=4"
|
|
44
|
-
"@module-federation/runtime": "0.0.0-next-20240930091801"
|
|
43
|
+
"react-router-dom": ">=4"
|
|
45
44
|
},
|
|
46
45
|
"devDependencies": {
|
|
47
46
|
"@testing-library/react": "15.0.7",
|
|
48
47
|
"@types/react": "18.2.79",
|
|
49
|
-
"@types/react-dom": "18.
|
|
48
|
+
"@types/react-dom": "18.3.0",
|
|
50
49
|
"@vitejs/plugin-react": "^4.3.0",
|
|
51
50
|
"@vitejs/plugin-vue": "^5.0.4",
|
|
52
51
|
"@vitejs/plugin-vue-jsx": "^4.0.0",
|
|
53
52
|
"jsdom": "^24.1.0",
|
|
54
|
-
"react": "18.1
|
|
55
|
-
"react-dom": "18.1
|
|
53
|
+
"react": "18.3.1",
|
|
54
|
+
"react-dom": "18.3.1",
|
|
56
55
|
"react-router-dom": "6.22.3",
|
|
57
56
|
"typescript": "^5.2.2",
|
|
58
57
|
"vite": "^5.2.14",
|
package/project.json
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
4
4
|
"sourceRoot": "packages/bridge/bridge-react/src",
|
|
5
5
|
"projectType": "library",
|
|
6
|
+
"tags": ["type:pkg"],
|
|
6
7
|
"targets": {
|
|
7
8
|
"build": {
|
|
8
9
|
"executor": "nx:run-commands",
|
|
@@ -22,6 +23,5 @@
|
|
|
22
23
|
]
|
|
23
24
|
}
|
|
24
25
|
}
|
|
25
|
-
}
|
|
26
|
-
"tags": ["type:pkg"]
|
|
26
|
+
}
|
|
27
27
|
}
|
package/src/create.tsx
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import React, { forwardRef } from 'react';
|
|
2
|
+
import type { ProviderParams } from '@module-federation/bridge-shared';
|
|
3
|
+
import { LoggerInstance } from './utils';
|
|
2
4
|
import {
|
|
3
5
|
ErrorBoundary,
|
|
4
6
|
ErrorBoundaryPropsWithComponent,
|
|
5
7
|
} from 'react-error-boundary';
|
|
6
|
-
import { LoggerInstance } from './utils';
|
|
7
8
|
import RemoteApp from './remote';
|
|
8
|
-
import type { ProviderParams } from '@module-federation/bridge-shared';
|
|
9
9
|
|
|
10
10
|
export interface RenderFnParams extends ProviderParams {
|
|
11
11
|
dom?: any;
|
package/src/provider.tsx
CHANGED
|
@@ -2,35 +2,25 @@ import { useLayoutEffect, useRef, useState } from 'react';
|
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import ReactDOM from 'react-dom';
|
|
4
4
|
import ReactDOMClient from 'react-dom/client';
|
|
5
|
+
import { RouterContext } from './context';
|
|
5
6
|
import type {
|
|
6
7
|
ProviderParams,
|
|
7
8
|
RenderFnParams,
|
|
8
9
|
} from '@module-federation/bridge-shared';
|
|
9
|
-
import { ErrorBoundary } from 'react-error-boundary';
|
|
10
|
-
import { RouterContext } from './context';
|
|
11
10
|
import { LoggerInstance, atLeastReact18 } from './utils';
|
|
11
|
+
import { ErrorBoundary } from 'react-error-boundary';
|
|
12
12
|
|
|
13
|
-
type RenderParams = RenderFnParams & any;
|
|
14
|
-
type DestroyParams = {
|
|
15
|
-
dom: HTMLElement;
|
|
16
|
-
};
|
|
17
13
|
type RootType = HTMLElement | ReactDOMClient.Root;
|
|
18
|
-
|
|
19
|
-
type BridgeHooks = {
|
|
20
|
-
beforeBridgeRender?: (params: RenderFnParams) => void;
|
|
21
|
-
beforeBridgeDestroy?: (params: DestroyParams) => void;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
14
|
type ProviderFnParams<T> = {
|
|
25
15
|
rootComponent: React.ComponentType<T>;
|
|
26
16
|
render?: (
|
|
27
17
|
App: React.ReactElement,
|
|
28
18
|
id?: HTMLElement | string,
|
|
29
19
|
) => RootType | Promise<RootType>;
|
|
30
|
-
hooks?: BridgeHooks;
|
|
31
20
|
};
|
|
21
|
+
|
|
32
22
|
export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
|
|
33
|
-
return (
|
|
23
|
+
return () => {
|
|
34
24
|
const rootMap = new Map<any, RootType>();
|
|
35
25
|
const RawComponent = (info: { propsInfo: T; appInfo: ProviderParams }) => {
|
|
36
26
|
const { appInfo, propsInfo, ...restProps } = info;
|
|
@@ -47,7 +37,7 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
|
|
|
47
37
|
};
|
|
48
38
|
|
|
49
39
|
return {
|
|
50
|
-
async render(info:
|
|
40
|
+
async render(info: RenderFnParams & any) {
|
|
51
41
|
LoggerInstance.log(`createBridgeComponent render Info`, info);
|
|
52
42
|
const {
|
|
53
43
|
moduleName,
|
|
@@ -71,20 +61,6 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
|
|
|
71
61
|
</ErrorBoundary>
|
|
72
62
|
);
|
|
73
63
|
|
|
74
|
-
const beforeBridgeRender =
|
|
75
|
-
(bridgeInfo?.hooks && bridgeInfo?.hooks.beforeBridgeRender) ||
|
|
76
|
-
params?.hooks?.beforeBridgeRender;
|
|
77
|
-
beforeBridgeRender && beforeBridgeRender(info);
|
|
78
|
-
// call beforeBridgeRender hook
|
|
79
|
-
// if (
|
|
80
|
-
// bridgeInfo?.hooks &&
|
|
81
|
-
// bridgeInfo?.hooks.beforeBridgeRender &&
|
|
82
|
-
// typeof bridgeInfo?.hooks.beforeBridgeRender === 'function'
|
|
83
|
-
// ) {
|
|
84
|
-
// bridgeInfo.hooks.beforeBridgeRender(info);
|
|
85
|
-
// }
|
|
86
|
-
|
|
87
|
-
// call render function
|
|
88
64
|
if (atLeastReact18(React)) {
|
|
89
65
|
if (bridgeInfo?.render) {
|
|
90
66
|
// in case bridgeInfo?.render is an async function, resolve this to promise
|
|
@@ -102,26 +78,10 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
|
|
|
102
78
|
renderFn?.(rootComponentWithErrorBoundary, info.dom);
|
|
103
79
|
}
|
|
104
80
|
},
|
|
105
|
-
async destroy(info:
|
|
81
|
+
async destroy(info: { dom: HTMLElement }) {
|
|
106
82
|
LoggerInstance.log(`createBridgeComponent destroy Info`, {
|
|
107
83
|
dom: info.dom,
|
|
108
84
|
});
|
|
109
|
-
|
|
110
|
-
// call beforeBridgeDestroy hook
|
|
111
|
-
if (
|
|
112
|
-
bridgeInfo?.hooks &&
|
|
113
|
-
bridgeInfo?.hooks.beforeBridgeDestroy &&
|
|
114
|
-
typeof bridgeInfo?.hooks.beforeBridgeDestroy === 'function'
|
|
115
|
-
) {
|
|
116
|
-
bridgeInfo.hooks.beforeBridgeDestroy(info);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const beforeBridgeDestroy =
|
|
120
|
-
(bridgeInfo?.hooks && bridgeInfo?.hooks.beforeBridgeDestroy) ||
|
|
121
|
-
params?.hooks?.beforeBridgeDestroy;
|
|
122
|
-
beforeBridgeDestroy && beforeBridgeDestroy(info);
|
|
123
|
-
|
|
124
|
-
// call destroy function
|
|
125
85
|
if (atLeastReact18(React)) {
|
|
126
86
|
const root = rootMap.get(info.dom);
|
|
127
87
|
(root as ReactDOMClient.Root)?.unmount();
|
package/src/remote/index.tsx
CHANGED
|
@@ -7,10 +7,9 @@ import React, {
|
|
|
7
7
|
} from 'react';
|
|
8
8
|
import * as ReactRouterDOM from 'react-router-dom';
|
|
9
9
|
import type { ProviderParams } from '@module-federation/bridge-shared';
|
|
10
|
+
import { LoggerInstance, pathJoin } from '../utils';
|
|
10
11
|
import { dispatchPopstateEnv } from '@module-federation/bridge-shared';
|
|
11
12
|
import { ErrorBoundaryPropsWithComponent } from 'react-error-boundary';
|
|
12
|
-
import { registerBridgeLifeCycle } from '../lifecycle';
|
|
13
|
-
import { LoggerInstance, pathJoin } from '../utils';
|
|
14
13
|
|
|
15
14
|
declare const __APP_VERSION__: string;
|
|
16
15
|
export interface RenderFnParams extends ProviderParams {
|
|
@@ -40,7 +39,6 @@ const RemoteAppWrapper = forwardRef(function (
|
|
|
40
39
|
props: RemoteAppParams & RenderFnParams,
|
|
41
40
|
ref,
|
|
42
41
|
) {
|
|
43
|
-
const bridgeHook = registerBridgeLifeCycle();
|
|
44
42
|
const RemoteApp = () => {
|
|
45
43
|
LoggerInstance.log(`RemoteAppWrapper RemoteApp props >>>`, { props });
|
|
46
44
|
const {
|
|
@@ -80,13 +78,6 @@ const RemoteAppWrapper = forwardRef(function (
|
|
|
80
78
|
`createRemoteComponent LazyComponent render >>>`,
|
|
81
79
|
renderProps,
|
|
82
80
|
);
|
|
83
|
-
|
|
84
|
-
if (bridgeHook && bridgeHook?.lifecycle?.beforeBridgeRender) {
|
|
85
|
-
bridgeHook?.lifecycle?.beforeBridgeRender.emit({
|
|
86
|
-
...renderProps,
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
|
|
90
81
|
providerReturn.render(renderProps);
|
|
91
82
|
});
|
|
92
83
|
|
|
@@ -98,16 +89,6 @@ const RemoteAppWrapper = forwardRef(function (
|
|
|
98
89
|
`createRemoteComponent LazyComponent destroy >>>`,
|
|
99
90
|
{ moduleName, basename, dom: renderDom.current },
|
|
100
91
|
);
|
|
101
|
-
if (bridgeHook && bridgeHook?.lifecycle?.beforeBridgeDestroy) {
|
|
102
|
-
bridgeHook?.lifecycle?.beforeBridgeDestroy.emit({
|
|
103
|
-
moduleName,
|
|
104
|
-
dom: renderDom.current,
|
|
105
|
-
basename,
|
|
106
|
-
memoryRoute,
|
|
107
|
-
fallback,
|
|
108
|
-
...resProps,
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
92
|
providerInfoRef.current?.destroy({
|
|
112
93
|
dom: renderDom.current,
|
|
113
94
|
});
|
package/src/router-v5.tsx
CHANGED
|
@@ -2,6 +2,7 @@ import React, { useContext } from 'react';
|
|
|
2
2
|
// The upper alias react-router-dom$ into this file avoids the loop
|
|
3
3
|
// @ts-ignore
|
|
4
4
|
import * as ReactRouterDom from 'react-router-dom/index.js';
|
|
5
|
+
|
|
5
6
|
import { RouterContext } from './context';
|
|
6
7
|
import { LoggerInstance } from './utils';
|
|
7
8
|
|
package/src/router-v6.tsx
CHANGED
|
@@ -60,7 +60,7 @@ function WraperRouterProvider(
|
|
|
60
60
|
return <RouterProvider router={MemeoryRouterInstance} />;
|
|
61
61
|
} else {
|
|
62
62
|
const BrowserRouterInstance = createBrowserRouter(routers, {
|
|
63
|
-
basename: routerContextProps.basename
|
|
63
|
+
basename: routerContextProps.basename,
|
|
64
64
|
future: router.future,
|
|
65
65
|
window: router.window,
|
|
66
66
|
});
|
package/src/router.tsx
CHANGED
|
@@ -59,7 +59,7 @@ function WrapperRouterProvider(
|
|
|
59
59
|
return <RouterProvider router={MemeoryRouterInstance} />;
|
|
60
60
|
} else {
|
|
61
61
|
const BrowserRouterInstance = createBrowserRouter(routers, {
|
|
62
|
-
basename: routerContextProps.basename
|
|
62
|
+
basename: routerContextProps.basename,
|
|
63
63
|
future: router.future,
|
|
64
64
|
window: router.window,
|
|
65
65
|
});
|
package/src/lifecycle.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { getInstance } from '@module-federation/runtime';
|
|
2
|
-
import helper from '@module-federation/runtime/helpers';
|
|
3
|
-
|
|
4
|
-
function registerBridgeLifeCycle() {
|
|
5
|
-
const { registerPlugins, pluginHelper } = helper.global;
|
|
6
|
-
const host = getInstance();
|
|
7
|
-
const pluginSystem = new pluginHelper.PluginSystem({
|
|
8
|
-
beforeBridgeRender: new pluginHelper.SyncHook<
|
|
9
|
-
[Record<string, any>],
|
|
10
|
-
void
|
|
11
|
-
>(),
|
|
12
|
-
beforeBridgeDestroy: new pluginHelper.SyncHook<
|
|
13
|
-
[Record<string, any>],
|
|
14
|
-
void
|
|
15
|
-
>(),
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
if (host) {
|
|
19
|
-
registerPlugins<typeof pluginSystem.lifecycle, typeof pluginSystem>(
|
|
20
|
-
host?.options?.plugins,
|
|
21
|
-
[pluginSystem],
|
|
22
|
-
);
|
|
23
|
-
return pluginSystem;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export { registerBridgeLifeCycle };
|