@module-federation/bridge-react 0.0.0-next-20240822035014 → 0.0.0-next-20240822090000

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/index.es.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
- import React__default, { createContext, Component, createElement, isValidElement, forwardRef, useRef, useEffect, useContext, useState } from "react";
3
- import { L as LoggerInstance, p as pathJoin, f, a as atLeastReact18, R as RouterContext } from "./context-Bw2PEwa6.js";
2
+ import React__default, { createContext, Component, createElement, isValidElement, useContext, useState, useEffect, useRef, forwardRef } from "react";
3
+ import { p as pathJoin, L as LoggerInstance, f, a as atLeastReact18, R as RouterContext } from "./context-Bw2PEwa6.js";
4
4
  import * as ReactRouterDOM from "react-router-dom";
5
5
  import ReactDOM from "react-dom";
6
6
  const ErrorBoundaryContext = createContext(null);
@@ -98,71 +98,55 @@ function hasArrayChanged() {
98
98
  let b = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
99
99
  return a.length !== b.length || a.some((item, index) => !Object.is(item, b[index]));
100
100
  }
101
- const RemoteAppWrapper = forwardRef(function(props, ref) {
102
- const RemoteApp2 = () => {
103
- LoggerInstance.log(`RemoteAppWrapper RemoteApp props >>>`, { props });
104
- const {
105
- moduleName,
106
- memoryRoute,
107
- basename,
108
- providerInfo,
109
- className,
110
- style,
111
- fallback,
112
- ...resProps
113
- } = props;
114
- const rootRef = ref && "current" in ref ? ref : useRef(null);
115
- const renderDom = useRef(null);
116
- const providerInfoRef = useRef(null);
117
- useEffect(() => {
118
- const renderTimeout = setTimeout(() => {
119
- const providerReturn = providerInfo();
120
- providerInfoRef.current = providerReturn;
121
- const renderProps = {
122
- moduleName,
123
- dom: rootRef.current,
124
- basename,
125
- memoryRoute,
126
- fallback,
127
- ...resProps
128
- };
129
- renderDom.current = rootRef.current;
130
- LoggerInstance.log(
131
- `createRemoteComponent LazyComponent render >>>`,
132
- renderProps
133
- );
134
- providerReturn.render(renderProps);
135
- });
136
- return () => {
137
- clearTimeout(renderTimeout);
138
- setTimeout(() => {
139
- var _a, _b;
140
- if ((_a = providerInfoRef.current) == null ? void 0 : _a.destroy) {
141
- LoggerInstance.log(
142
- `createRemoteComponent LazyComponent destroy >>>`,
143
- { moduleName, basename, dom: renderDom.current }
144
- );
145
- (_b = providerInfoRef.current) == null ? void 0 : _b.destroy({
146
- dom: renderDom.current
147
- });
148
- }
149
- });
101
+ const RemoteApp = ({
102
+ name,
103
+ memoryRoute,
104
+ basename,
105
+ providerInfo,
106
+ ...resProps
107
+ }) => {
108
+ const rootRef = useRef(null);
109
+ const renderDom = useRef(null);
110
+ const providerInfoRef = useRef(null);
111
+ useEffect(() => {
112
+ const renderTimeout = setTimeout(() => {
113
+ const providerReturn = providerInfo();
114
+ providerInfoRef.current = providerReturn;
115
+ const renderProps = {
116
+ name,
117
+ dom: rootRef.current,
118
+ basename,
119
+ memoryRoute,
120
+ ...resProps
150
121
  };
151
- }, []);
152
- return /* @__PURE__ */ React__default.createElement(
153
- "div",
154
- {
155
- className: props == null ? void 0 : props.className,
156
- style: props == null ? void 0 : props.style,
157
- ref: rootRef
158
- }
159
- );
160
- };
161
- RemoteApp2["__APP_VERSION__"] = "0.5.0";
162
- return /* @__PURE__ */ React__default.createElement(RemoteApp2, null);
163
- });
122
+ renderDom.current = rootRef.current;
123
+ LoggerInstance.log(
124
+ `createRemoteComponent LazyComponent render >>>`,
125
+ renderProps
126
+ );
127
+ providerReturn.render(renderProps);
128
+ });
129
+ return () => {
130
+ clearTimeout(renderTimeout);
131
+ setTimeout(() => {
132
+ var _a, _b;
133
+ if ((_a = providerInfoRef.current) == null ? void 0 : _a.destroy) {
134
+ LoggerInstance.log(
135
+ `createRemoteComponent LazyComponent destroy >>>`,
136
+ { name, basename, dom: renderDom.current }
137
+ );
138
+ (_b = providerInfoRef.current) == null ? void 0 : _b.destroy({
139
+ dom: renderDom.current
140
+ });
141
+ }
142
+ });
143
+ };
144
+ }, []);
145
+ return /* @__PURE__ */ React__default.createElement("div", { ref: rootRef });
146
+ };
147
+ RemoteApp["__APP_VERSION__"] = "0.4.0";
164
148
  function withRouterData(WrappedComponent) {
165
- const Component2 = forwardRef(function(props, ref) {
149
+ return (props) => {
166
150
  var _a;
167
151
  let enableDispathPopstate = false;
168
152
  let routerContextVal;
@@ -220,13 +204,10 @@ function withRouterData(WrappedComponent) {
220
204
  setPathname(location.pathname);
221
205
  }, [location]);
222
206
  }
223
- return /* @__PURE__ */ React__default.createElement(WrappedComponent, { ...props, basename, ref });
224
- });
225
- return forwardRef(function(props, ref) {
226
- return /* @__PURE__ */ React__default.createElement(Component2, { ...props, ref });
227
- });
207
+ return /* @__PURE__ */ React__default.createElement(WrappedComponent, { ...props, basename });
208
+ };
228
209
  }
229
- const RemoteApp = withRouterData(RemoteAppWrapper);
210
+ const RemoteApp$1 = withRouterData(RemoteApp);
230
211
  function createLazyRemoteComponent(info) {
231
212
  const exportName = (info == null ? void 0 : info.export) || "default";
232
213
  return React__default.lazy(async () => {
@@ -243,15 +224,13 @@ function createLazyRemoteComponent(info) {
243
224
  );
244
225
  const exportFn = m2[exportName];
245
226
  if (exportName in m2 && typeof exportFn === "function") {
246
- const RemoteAppComponent = forwardRef((props, ref) => {
227
+ const RemoteAppComponent = forwardRef((props, _ref) => {
247
228
  return /* @__PURE__ */ React__default.createElement(
248
- RemoteApp,
229
+ RemoteApp$1,
249
230
  {
250
- moduleName,
231
+ name: moduleName,
251
232
  providerInfo: exportFn,
252
233
  exportName: info.export || "default",
253
- fallback: info.fallback,
254
- ref,
255
234
  ...props
256
235
  }
257
236
  );
@@ -276,12 +255,10 @@ function createLazyRemoteComponent(info) {
276
255
  });
277
256
  }
278
257
  function createRemoteComponent(info) {
279
- return forwardRef(
280
- (props, ref) => {
281
- const LazyComponent = createLazyRemoteComponent(info);
282
- return /* @__PURE__ */ React__default.createElement(ErrorBoundary, { FallbackComponent: info.fallback }, /* @__PURE__ */ React__default.createElement(React__default.Suspense, { fallback: info.loading }, /* @__PURE__ */ React__default.createElement(LazyComponent, { ...props, ref })));
283
- }
284
- );
258
+ const LazyComponent = createLazyRemoteComponent(info);
259
+ return (props) => {
260
+ return /* @__PURE__ */ React__default.createElement(ErrorBoundary, { FallbackComponent: info.fallback }, /* @__PURE__ */ React__default.createElement(React__default.Suspense, { fallback: info.loading }, /* @__PURE__ */ React__default.createElement(LazyComponent, { ...props })));
261
+ };
285
262
  }
286
263
  var client = {};
287
264
  var m = ReactDOM;
@@ -308,76 +285,69 @@ if (process.env.NODE_ENV === "production") {
308
285
  };
309
286
  }
310
287
  function createBridgeComponent(bridgeInfo) {
288
+ let provider;
311
289
  return () => {
312
290
  const rootMap = /* @__PURE__ */ new Map();
313
291
  const RawComponent = (info) => {
314
- const { appInfo, propsInfo, ...restProps } = info;
315
- const { moduleName, memoryRoute, basename = "/" } = appInfo;
316
- return /* @__PURE__ */ React.createElement(RouterContext.Provider, { value: { moduleName, basename, memoryRoute } }, /* @__PURE__ */ React.createElement(
317
- bridgeInfo.rootComponent,
318
- {
319
- ...propsInfo,
320
- basename,
321
- ...restProps
322
- }
323
- ));
292
+ const { appInfo, propsInfo } = info;
293
+ const { name, memoryRoute, basename = "/" } = appInfo;
294
+ return /* @__PURE__ */ React.createElement(RouterContext.Provider, { value: { name, basename, memoryRoute } }, /* @__PURE__ */ React.createElement(bridgeInfo.rootComponent, { ...propsInfo, basename }));
324
295
  };
325
- return {
326
- async render(info) {
327
- LoggerInstance.log(`createBridgeComponent render Info`, info);
328
- const {
329
- moduleName,
330
- dom,
331
- basename,
332
- memoryRoute,
333
- fallback,
334
- ...propsInfo
335
- } = info;
336
- const rootComponentWithErrorBoundary = (
337
- // set ErrorBoundary for RawComponent rendering error, usually caused by user app rendering error
338
- /* @__PURE__ */ React.createElement(ErrorBoundary, { FallbackComponent: fallback }, /* @__PURE__ */ React.createElement(
339
- RawComponent,
340
- {
341
- appInfo: {
342
- moduleName,
343
- basename,
344
- memoryRoute
345
- },
346
- propsInfo
347
- }
348
- ))
349
- );
350
- if (atLeastReact18(React)) {
351
- if (bridgeInfo == null ? void 0 : bridgeInfo.render) {
352
- Promise.resolve(
353
- bridgeInfo == null ? void 0 : bridgeInfo.render(rootComponentWithErrorBoundary, dom)
354
- ).then((root) => rootMap.set(info.dom, root));
355
- } else {
296
+ if (!provider) {
297
+ provider = {
298
+ render(info) {
299
+ LoggerInstance.log(`createBridgeComponent render Info`, info);
300
+ const { name, basename, memoryRoute, ...propsInfo } = info;
301
+ if (atLeastReact18(React)) {
356
302
  const root = client.createRoot(info.dom);
357
- root.render(rootComponentWithErrorBoundary);
358
303
  rootMap.set(info.dom, root);
304
+ root.render(
305
+ /* @__PURE__ */ React.createElement(
306
+ RawComponent,
307
+ {
308
+ propsInfo,
309
+ appInfo: {
310
+ name,
311
+ basename,
312
+ memoryRoute
313
+ }
314
+ }
315
+ )
316
+ );
317
+ } else {
318
+ ReactDOM.render(
319
+ /* @__PURE__ */ React.createElement(
320
+ RawComponent,
321
+ {
322
+ propsInfo,
323
+ appInfo: {
324
+ name,
325
+ basename,
326
+ memoryRoute
327
+ }
328
+ }
329
+ ),
330
+ info.dom
331
+ );
359
332
  }
360
- } else {
361
- const renderFn = (bridgeInfo == null ? void 0 : bridgeInfo.render) || ReactDOM.render;
362
- renderFn == null ? void 0 : renderFn(rootComponentWithErrorBoundary, info.dom);
363
- }
364
- },
365
- async destroy(info) {
366
- LoggerInstance.log(`createBridgeComponent destroy Info`, {
367
- dom: info.dom
368
- });
369
- if (atLeastReact18(React)) {
370
- const root = rootMap.get(info.dom);
371
- root == null ? void 0 : root.unmount();
372
- rootMap.delete(info.dom);
373
- } else {
374
- ReactDOM.unmountComponentAtNode(info.dom);
333
+ },
334
+ destroy(info) {
335
+ LoggerInstance.log(`createBridgeComponent destroy Info`, {
336
+ dom: info.dom
337
+ });
338
+ if (atLeastReact18(React)) {
339
+ const root = rootMap.get(info.dom);
340
+ root == null ? void 0 : root.unmount();
341
+ } else {
342
+ ReactDOM.unmountComponentAtNode(info.dom);
343
+ }
344
+ },
345
+ rawComponent: bridgeInfo.rootComponent,
346
+ __BRIDGE_FN__: (_args) => {
375
347
  }
376
- },
377
- rawComponent: bridgeInfo.rootComponent,
378
- __BRIDGE_FN__: (_args) => {
379
- }
380
- };
348
+ };
349
+ }
350
+ return provider;
381
351
  };
382
352
  }
383
353
  export {
@@ -20,14 +20,16 @@ function _interopNamespaceDefault(e) {
20
20
  return Object.freeze(n);
21
21
  }
22
22
  const ReactRouterDom__namespace = /* @__PURE__ */ _interopNamespaceDefault(ReactRouterDom);
23
- function WrapperRouter(props) {
23
+ function WraperRouter(props) {
24
24
  const { basename, ...propsRes } = props;
25
25
  const routerContextProps = React.useContext(context.RouterContext) || {};
26
- context.LoggerInstance.log(`WrapperRouter info >>>`, {
26
+ context.LoggerInstance.log(`WraperRouter info >>>`, {
27
27
  ...routerContextProps,
28
28
  routerContextProps,
29
- WrapperRouterProps: props
29
+ WraperRouterProps: props
30
30
  });
31
+ if (!routerContextProps)
32
+ return /* @__PURE__ */ React.createElement(ReactRouterDom__namespace.BrowserRouter, { ...props });
31
33
  if (routerContextProps == null ? void 0 : routerContextProps.memoryRoute) {
32
34
  return /* @__PURE__ */ React.createElement(
33
35
  ReactRouterDom__namespace.MemoryRouter,
@@ -45,19 +47,21 @@ function WrapperRouter(props) {
45
47
  }
46
48
  );
47
49
  }
48
- function WrapperRouterProvider(props) {
50
+ function WraperRouterProvider(props) {
49
51
  const { router, ...propsRes } = props;
50
52
  const routerContextProps = React.useContext(context.RouterContext) || {};
51
53
  const routers = router.routes;
52
- context.LoggerInstance.log(`WrapperRouterProvider info >>>`, {
54
+ context.LoggerInstance.log(`WraperRouterProvider info >>>`, {
53
55
  ...routerContextProps,
54
56
  routerContextProps,
55
- WrapperRouterProviderProps: props,
57
+ WraperRouterProviderProps: props,
56
58
  router
57
59
  });
58
60
  const RouterProvider = ReactRouterDom__namespace["RouterProvider"];
59
61
  const createMemoryRouter = ReactRouterDom__namespace["createMemoryRouter"];
60
62
  const createBrowserRouter = ReactRouterDom__namespace["createBrowserRouter"];
63
+ if (!routerContextProps)
64
+ return /* @__PURE__ */ React.createElement(RouterProvider, { ...props });
61
65
  if (routerContextProps.memoryRoute) {
62
66
  const MemeoryRouterInstance = createMemoryRouter(routers, {
63
67
  initialEntries: [routerContextProps == null ? void 0 : routerContextProps.memoryRoute.entryPath]
@@ -72,8 +76,8 @@ function WrapperRouterProvider(props) {
72
76
  return /* @__PURE__ */ React.createElement(RouterProvider, { ...propsRes, router: BrowserRouterInstance });
73
77
  }
74
78
  }
75
- exports.BrowserRouter = WrapperRouter;
76
- exports.RouterProvider = WrapperRouterProvider;
79
+ exports.BrowserRouter = WraperRouter;
80
+ exports.RouterProvider = WraperRouterProvider;
77
81
  Object.keys(ReactRouterDom).forEach((k) => {
78
82
  if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k))
79
83
  Object.defineProperty(exports, k, {
package/dist/router.es.js CHANGED
@@ -2,14 +2,16 @@ import React__default, { useContext } from "react";
2
2
  import * as ReactRouterDom from "react-router-dom/";
3
3
  export * from "react-router-dom/";
4
4
  import { R as RouterContext, L as LoggerInstance } from "./context-Bw2PEwa6.js";
5
- function WrapperRouter(props) {
5
+ function WraperRouter(props) {
6
6
  const { basename, ...propsRes } = props;
7
7
  const routerContextProps = useContext(RouterContext) || {};
8
- LoggerInstance.log(`WrapperRouter info >>>`, {
8
+ LoggerInstance.log(`WraperRouter info >>>`, {
9
9
  ...routerContextProps,
10
10
  routerContextProps,
11
- WrapperRouterProps: props
11
+ WraperRouterProps: props
12
12
  });
13
+ if (!routerContextProps)
14
+ return /* @__PURE__ */ React__default.createElement(ReactRouterDom.BrowserRouter, { ...props });
13
15
  if (routerContextProps == null ? void 0 : routerContextProps.memoryRoute) {
14
16
  return /* @__PURE__ */ React__default.createElement(
15
17
  ReactRouterDom.MemoryRouter,
@@ -27,19 +29,21 @@ function WrapperRouter(props) {
27
29
  }
28
30
  );
29
31
  }
30
- function WrapperRouterProvider(props) {
32
+ function WraperRouterProvider(props) {
31
33
  const { router, ...propsRes } = props;
32
34
  const routerContextProps = useContext(RouterContext) || {};
33
35
  const routers = router.routes;
34
- LoggerInstance.log(`WrapperRouterProvider info >>>`, {
36
+ LoggerInstance.log(`WraperRouterProvider info >>>`, {
35
37
  ...routerContextProps,
36
38
  routerContextProps,
37
- WrapperRouterProviderProps: props,
39
+ WraperRouterProviderProps: props,
38
40
  router
39
41
  });
40
42
  const RouterProvider = ReactRouterDom["RouterProvider"];
41
43
  const createMemoryRouter = ReactRouterDom["createMemoryRouter"];
42
44
  const createBrowserRouter = ReactRouterDom["createBrowserRouter"];
45
+ if (!routerContextProps)
46
+ return /* @__PURE__ */ React__default.createElement(RouterProvider, { ...props });
43
47
  if (routerContextProps.memoryRoute) {
44
48
  const MemeoryRouterInstance = createMemoryRouter(routers, {
45
49
  initialEntries: [routerContextProps == null ? void 0 : routerContextProps.memoryRoute.entryPath]
@@ -55,6 +59,6 @@ function WrapperRouterProvider(props) {
55
59
  }
56
60
  }
57
61
  export {
58
- WrapperRouter as BrowserRouter,
59
- WrapperRouterProvider as RouterProvider
62
+ WraperRouter as BrowserRouter,
63
+ WraperRouterProvider as RouterProvider
60
64
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@module-federation/bridge-react",
3
- "version": "0.0.0-next-20240822035014",
3
+ "version": "0.0.0-next-20240822090000",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -20,22 +20,12 @@
20
20
  "import": "./dist/router.es.js",
21
21
  "require": "./dist/router.cjs.js"
22
22
  },
23
- "./router-v5": {
24
- "types": "./dist/router-v5.d.ts",
25
- "import": "./dist/router-v5.es.js",
26
- "require": "./dist/router-v5.cjs.js"
27
- },
28
- "./router-v6": {
29
- "types": "./dist/router-v6.d.ts",
30
- "import": "./dist/router-v6.es.js",
31
- "require": "./dist/router-v6.cjs.js"
32
- },
33
23
  "./*": "./*"
34
24
  },
35
25
  "dependencies": {
36
26
  "@loadable/component": "^5.16.4",
37
27
  "react-error-boundary": "^4.0.13",
38
- "@module-federation/bridge-shared": "0.0.0-next-20240822035014"
28
+ "@module-federation/bridge-shared": "0.0.0-next-20240822090000"
39
29
  },
40
30
  "peerDependencies": {
41
31
  "react": ">=16.9.0",
package/src/create.tsx CHANGED
@@ -13,7 +13,11 @@ export interface RenderFnParams extends ProviderParams {
13
13
 
14
14
  interface RemoteModule {
15
15
  provider: () => {
16
- render: (info: RenderFnParams) => void;
16
+ render: (
17
+ info: ProviderParams & {
18
+ dom: any;
19
+ },
20
+ ) => void;
17
21
  destroy: (info: { dom: any }) => void;
18
22
  };
19
23
  }
@@ -30,7 +34,6 @@ function createLazyRemoteComponent<T, E extends keyof T>(info: {
30
34
  lazyComponent: info.loader,
31
35
  exportName,
32
36
  });
33
-
34
37
  try {
35
38
  const m = (await info.loader()) as RemoteModule;
36
39
  // @ts-ignore
@@ -41,7 +44,8 @@ function createLazyRemoteComponent<T, E extends keyof T>(info: {
41
44
  );
42
45
 
43
46
  // @ts-ignore
44
- const exportFn = m[exportName];
47
+ const exportFn = m[exportName] as any;
48
+
45
49
  if (exportName in m && typeof exportFn === 'function') {
46
50
  const RemoteAppComponent = forwardRef<
47
51
  HTMLDivElement,
@@ -49,15 +53,12 @@ function createLazyRemoteComponent<T, E extends keyof T>(info: {
49
53
  basename?: ProviderParams['basename'];
50
54
  memoryRoute?: ProviderParams['memoryRoute'];
51
55
  }
52
- >((props, ref) => {
56
+ >((props, _ref) => {
53
57
  return (
54
58
  <RemoteApp
55
- // change `name` key to `moduleName` to avoid same property `name` passed by user's props which may cause unexpected issues.
56
- moduleName={moduleName}
59
+ name={moduleName}
57
60
  providerInfo={exportFn}
58
61
  exportName={info.export || 'default'}
59
- fallback={info.fallback}
60
- ref={ref}
61
62
  {...props}
62
63
  />
63
64
  );
@@ -92,23 +93,26 @@ export function createRemoteComponent<T, E extends keyof T>(info: {
92
93
  type ExportType = T[E] extends (...args: any) => any
93
94
  ? ReturnType<T[E]>
94
95
  : never;
95
-
96
96
  type RawComponentType = '__BRIDGE_FN__' extends keyof ExportType
97
97
  ? ExportType['__BRIDGE_FN__'] extends (...args: any) => any
98
98
  ? Parameters<ExportType['__BRIDGE_FN__']>[0]
99
99
  : {}
100
100
  : {};
101
101
 
102
- return forwardRef<HTMLDivElement, ProviderParams & RawComponentType>(
103
- (props, ref) => {
104
- const LazyComponent = createLazyRemoteComponent(info);
105
- return (
106
- <ErrorBoundary FallbackComponent={info.fallback}>
107
- <React.Suspense fallback={info.loading}>
108
- <LazyComponent {...props} ref={ref} />
109
- </React.Suspense>
110
- </ErrorBoundary>
111
- );
112
- },
113
- );
102
+ const LazyComponent = createLazyRemoteComponent(info);
103
+
104
+ return (
105
+ props: {
106
+ basename?: ProviderParams['basename'];
107
+ memoryRoute?: ProviderParams['memoryRoute'];
108
+ } & RawComponentType,
109
+ ) => {
110
+ return (
111
+ <ErrorBoundary FallbackComponent={info.fallback}>
112
+ <React.Suspense fallback={info.loading}>
113
+ <LazyComponent {...props} />
114
+ </React.Suspense>
115
+ </ErrorBoundary>
116
+ );
117
+ };
114
118
  }