@module-federation/bridge-react 0.0.0-next-20241108091829 → 0.0.0-next-20241112032845

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 CHANGED
@@ -1,16 +1,26 @@
1
1
  # @module-federation/bridge-react
2
2
 
3
- ## 0.0.0-next-20241108091829
3
+ ## 0.0.0-next-20241112032845
4
+
5
+ ### Patch Changes
6
+
7
+ - @module-federation/sdk@0.0.0-next-20241112032845
8
+ - @module-federation/bridge-shared@0.0.0-next-20241112032845
9
+
10
+ ## 0.7.2
11
+
12
+ ### Patch Changes
13
+
14
+ - @module-federation/sdk@0.7.2
15
+ - @module-federation/bridge-shared@0.7.2
16
+
17
+ ## 0.7.1
4
18
 
5
19
  ### Patch Changes
6
20
 
7
- - 3082116: feat: feat: support lifecycyle hooks in module-deferation bridge
8
- - Updated dependencies [8712967]
9
21
  - Updated dependencies [6db4c5f]
10
- - Updated dependencies [3082116]
11
- - @module-federation/runtime@0.0.0-next-20241108091829
12
- - @module-federation/sdk@0.0.0-next-20241108091829
13
- - @module-federation/bridge-shared@0.0.0-next-20241108091829
22
+ - @module-federation/sdk@0.7.1
23
+ - @module-federation/bridge-shared@0.7.1
14
24
 
15
25
  ## 0.7.0
16
26
 
@@ -329,27 +329,8 @@ function pathJoin(...args) {
329
329
  }, "");
330
330
  return res || "/";
331
331
  }
332
- const getModuleName = (id) => {
333
- if (!id) {
334
- return id;
335
- }
336
- const idArray = id.split("/");
337
- if (idArray.length < 2) {
338
- return id;
339
- }
340
- return idArray[0] + "/" + idArray[1];
341
- };
342
- const getRootDomDefaultClassName = (moduleName) => {
343
- if (!moduleName) {
344
- return "";
345
- }
346
- const name = getModuleName(moduleName).replace(/\@/, "").replace(/\//, "-");
347
- return `bridge-root-component-${name}`;
348
- };
349
332
  const RouterContext = React.createContext(null);
350
333
  exports.LoggerInstance = LoggerInstance;
351
334
  exports.RouterContext = RouterContext;
352
335
  exports.atLeastReact18 = atLeastReact18;
353
- exports.getModuleName = getModuleName;
354
- exports.getRootDomDefaultClassName = getRootDomDefaultClassName;
355
336
  exports.pathJoin = pathJoin;
@@ -328,29 +328,10 @@ function pathJoin(...args) {
328
328
  }, "");
329
329
  return res || "/";
330
330
  }
331
- const getModuleName = (id) => {
332
- if (!id) {
333
- return id;
334
- }
335
- const idArray = id.split("/");
336
- if (idArray.length < 2) {
337
- return id;
338
- }
339
- return idArray[0] + "/" + idArray[1];
340
- };
341
- const getRootDomDefaultClassName = (moduleName) => {
342
- if (!moduleName) {
343
- return "";
344
- }
345
- const name = getModuleName(moduleName).replace(/\@/, "").replace(/\//, "-");
346
- return `bridge-root-component-${name}`;
347
- };
348
331
  const RouterContext = React__default.createContext(null);
349
332
  export {
350
333
  LoggerInstance as L,
351
334
  RouterContext as R,
352
- getModuleName as a,
353
- atLeastReact18 as b,
354
- getRootDomDefaultClassName as g,
335
+ atLeastReact18 as a,
355
336
  pathJoin as p
356
337
  };
package/dist/index.cjs.js CHANGED
@@ -1,9 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const React = require("react");
4
- const context = require("./context-DmzxwI_7.cjs");
4
+ const context = require("./context-BBLu8BlQ.cjs");
5
5
  const ReactRouterDOM = require("react-router-dom");
6
- const runtime = require("@module-federation/runtime");
7
6
  const ReactDOM = require("react-dom");
8
7
  function _interopNamespaceDefault(e2) {
9
8
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
@@ -123,8 +122,6 @@ function e() {
123
122
  window.dispatchEvent(t);
124
123
  }
125
124
  const RemoteAppWrapper = React.forwardRef(function(props, ref) {
126
- const host = runtime.getInstance();
127
- context.LoggerInstance.log(`RemoteAppWrapper host >>>`, host);
128
125
  const RemoteApp2 = () => {
129
126
  context.LoggerInstance.log(`RemoteAppWrapper RemoteApp props >>>`, { props });
130
127
  const {
@@ -142,10 +139,9 @@ const RemoteAppWrapper = React.forwardRef(function(props, ref) {
142
139
  const providerInfoRef = React.useRef(null);
143
140
  React.useEffect(() => {
144
141
  const renderTimeout = setTimeout(() => {
145
- var _a, _b, _c, _d, _e, _f;
146
142
  const providerReturn = providerInfo();
147
143
  providerInfoRef.current = providerReturn;
148
- let renderProps = {
144
+ const renderProps = {
149
145
  moduleName,
150
146
  dom: rootRef.current,
151
147
  basename,
@@ -158,55 +154,34 @@ const RemoteAppWrapper = React.forwardRef(function(props, ref) {
158
154
  `createRemoteComponent LazyComponent render >>>`,
159
155
  renderProps
160
156
  );
161
- const beforeBridgeRenderRes = ((_c = (_b = (_a = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _a.lifecycle) == null ? void 0 : _b.beforeBridgeRender) == null ? void 0 : _c.emit(renderProps)) || {};
162
- renderProps = { ...renderProps, ...beforeBridgeRenderRes.extraProps };
163
157
  providerReturn.render(renderProps);
164
- (_f = (_e = (_d = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _d.lifecycle) == null ? void 0 : _e.afterBridgeRender) == null ? void 0 : _f.emit(renderProps);
165
158
  });
166
159
  return () => {
167
160
  clearTimeout(renderTimeout);
168
161
  setTimeout(() => {
169
- var _a, _b, _c, _d, _e, _f, _g, _h;
162
+ var _a, _b;
170
163
  if ((_a = providerInfoRef.current) == null ? void 0 : _a.destroy) {
171
164
  context.LoggerInstance.log(
172
165
  `createRemoteComponent LazyComponent destroy >>>`,
173
166
  { moduleName, basename, dom: renderDom.current }
174
167
  );
175
- (_d = (_c = (_b = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _b.lifecycle) == null ? void 0 : _c.beforeBridgeDestroy) == null ? void 0 : _d.emit({
176
- moduleName,
177
- dom: renderDom.current,
178
- basename,
179
- memoryRoute,
180
- fallback,
181
- ...resProps
182
- });
183
- (_e = providerInfoRef.current) == null ? void 0 : _e.destroy({
184
- moduleName,
168
+ (_b = providerInfoRef.current) == null ? void 0 : _b.destroy({
185
169
  dom: renderDom.current
186
170
  });
187
- (_h = (_g = (_f = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _f.lifecycle) == null ? void 0 : _g.afterBridgeDestroy) == null ? void 0 : _h.emit({
188
- moduleName,
189
- dom: renderDom.current,
190
- basename,
191
- memoryRoute,
192
- fallback,
193
- ...resProps
194
- });
195
171
  }
196
172
  });
197
173
  };
198
174
  }, []);
199
- const rootComponentClassName = `${context.getRootDomDefaultClassName(moduleName)} ${props == null ? void 0 : props.className}`;
200
175
  return /* @__PURE__ */ React.createElement(
201
176
  "div",
202
177
  {
203
- className: rootComponentClassName,
178
+ className: props == null ? void 0 : props.className,
204
179
  style: props == null ? void 0 : props.style,
205
180
  ref: rootRef
206
181
  }
207
182
  );
208
183
  };
209
- RemoteApp2["__APP_VERSION__"] = "0.7.0";
184
+ RemoteApp2["__APP_VERSION__"] = "0.7.2";
210
185
  return /* @__PURE__ */ React.createElement(RemoteApp2, null);
211
186
  });
212
187
  function withRouterData(WrappedComponent) {
@@ -356,7 +331,7 @@ if (process.env.NODE_ENV === "production") {
356
331
  };
357
332
  }
358
333
  function createBridgeComponent(bridgeInfo) {
359
- return (params) => {
334
+ return () => {
360
335
  const rootMap = /* @__PURE__ */ new Map();
361
336
  const RawComponent = (info) => {
362
337
  const { appInfo, propsInfo, ...restProps } = info;
@@ -372,7 +347,6 @@ function createBridgeComponent(bridgeInfo) {
372
347
  };
373
348
  return {
374
349
  async render(info) {
375
- var _a, _b, _c, _d;
376
350
  context.LoggerInstance.log(`createBridgeComponent render Info`, info);
377
351
  const {
378
352
  moduleName,
@@ -382,12 +356,6 @@ function createBridgeComponent(bridgeInfo) {
382
356
  fallback,
383
357
  ...propsInfo
384
358
  } = info;
385
- const moduleNameWithoutExpose = context.getModuleName(moduleName);
386
- const instance = __FEDERATION__.__INSTANCES__.find(
387
- (v) => v.name === moduleNameWithoutExpose
388
- );
389
- context.LoggerInstance.log(`createBridgeComponent remote instance`, instance);
390
- const beforeBridgeRenderRes = ((_c = (_b = (_a = instance == null ? void 0 : instance.bridgeHook) == null ? void 0 : _a.lifecycle) == null ? void 0 : _b.beforeBridgeRender) == null ? void 0 : _c.emit(info)) || {};
391
359
  const rootComponentWithErrorBoundary = (
392
360
  // set ErrorBoundary for RawComponent rendering error, usually caused by user app rendering error
393
361
  /* @__PURE__ */ React__namespace.createElement(ErrorBoundary, { FallbackComponent: fallback }, /* @__PURE__ */ React__namespace.createElement(
@@ -398,7 +366,7 @@ function createBridgeComponent(bridgeInfo) {
398
366
  basename,
399
367
  memoryRoute
400
368
  },
401
- propsInfo: { ...propsInfo, ...beforeBridgeRenderRes == null ? void 0 : beforeBridgeRenderRes.extraProps }
369
+ propsInfo
402
370
  }
403
371
  ))
404
372
  );
@@ -416,24 +384,11 @@ function createBridgeComponent(bridgeInfo) {
416
384
  const renderFn = (bridgeInfo == null ? void 0 : bridgeInfo.render) || ReactDOM.render;
417
385
  renderFn == null ? void 0 : renderFn(rootComponentWithErrorBoundary, info.dom);
418
386
  }
419
- const afterBridgeRender = (bridgeInfo == null ? void 0 : bridgeInfo.hooks) && (bridgeInfo == null ? void 0 : bridgeInfo.hooks.afterBridgeDestroy) || ((_d = params == null ? void 0 : params.hooks) == null ? void 0 : _d.afterBridgeRender);
420
- afterBridgeRender && afterBridgeRender(info);
421
387
  },
422
388
  async destroy(info) {
423
- var _a, _b, _c, _d, _e, _f;
424
389
  context.LoggerInstance.log(`createBridgeComponent destroy Info`, {
425
390
  dom: info.dom
426
391
  });
427
- const moduleNameWithoutExpose = context.getModuleName(info.moduleName);
428
- context.LoggerInstance.log(
429
- `createBridgeComponent remote module without expose name >>>`,
430
- moduleNameWithoutExpose
431
- );
432
- const instance = __FEDERATION__.__INSTANCES__.find(
433
- (v) => v.name === moduleNameWithoutExpose
434
- );
435
- context.LoggerInstance.log(`createBridgeComponent remote instance`, instance);
436
- (_c = (_b = (_a = instance == null ? void 0 : instance.bridgeHook) == null ? void 0 : _a.lifecycle) == null ? void 0 : _b.beforeBridgeDestroy) == null ? void 0 : _c.emit(info);
437
392
  if (context.atLeastReact18(React__namespace)) {
438
393
  const root = rootMap.get(info.dom);
439
394
  root == null ? void 0 : root.unmount();
@@ -441,7 +396,6 @@ function createBridgeComponent(bridgeInfo) {
441
396
  } else {
442
397
  ReactDOM.unmountComponentAtNode(info.dom);
443
398
  }
444
- (_f = (_e = (_d = instance == null ? void 0 : instance.bridgeHook) == null ? void 0 : _d.lifecycle) == null ? void 0 : _e.afterBridgeDestroy) == null ? void 0 : _f.emit(info);
445
399
  },
446
400
  rawComponent: bridgeInfo.rootComponent,
447
401
  __BRIDGE_FN__: (_args) => {
package/dist/index.d.ts CHANGED
@@ -5,18 +5,11 @@ import { ErrorInfo } from 'react';
5
5
  import { PropsWithChildren } from 'react';
6
6
  import * as React_2 from 'react';
7
7
 
8
- declare type BridgeHooks = {
9
- beforeBridgeRender?: (params: RenderFnParams) => void | Record<string, any>;
10
- afterBridgeRender?: (params: RenderFnParams) => void | Record<string, any>;
11
- beforeBridgeDestroy?: (params: DestroyParams) => void | Record<string, any>;
12
- afterBridgeDestroy?: (params: DestroyParams) => void | Record<string, any>;
13
- };
14
-
15
- export declare function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>): (params?: {
16
- hooks?: BridgeHooks;
17
- }) => {
18
- render(info: RenderParams): Promise<void>;
19
- destroy(info: DestroyParams): Promise<void>;
8
+ export declare function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>): () => {
9
+ render(info: RenderFnParams & any): Promise<void>;
10
+ destroy(info: {
11
+ dom: HTMLElement;
12
+ }): Promise<void>;
20
13
  rawComponent: React_2.ComponentType<T>;
21
14
  __BRIDGE_FN__: (_args: T) => void;
22
15
  };
@@ -28,11 +21,6 @@ export declare function createRemoteComponent<T, E extends keyof T>(info: {
28
21
  export?: E;
29
22
  }): default_2.ForwardRefExoticComponent<default_2.PropsWithoutRef<ProviderParams & ("__BRIDGE_FN__" extends keyof (T[E] extends (...args: any) => any ? ReturnType<T[E]> : never) ? (T[E] extends (...args: any) => any ? ReturnType<T[E]> : never)["__BRIDGE_FN__"] extends (...args: any) => any ? Parameters<(T[E] extends (...args: any) => any ? ReturnType<T[E]> : never)["__BRIDGE_FN__"]>[0] : {} : {})> & default_2.RefAttributes<HTMLDivElement>>;
30
23
 
31
- declare type DestroyParams = {
32
- moduleName: string;
33
- dom: HTMLElement;
34
- };
35
-
36
24
  declare type ErrorBoundaryPropsWithComponent = ErrorBoundarySharedProps & {
37
25
  fallback?: never;
38
26
  FallbackComponent: ComponentType<FallbackProps>;
@@ -60,7 +48,6 @@ declare type FallbackProps = {
60
48
  declare type ProviderFnParams<T> = {
61
49
  rootComponent: React_2.ComponentType<T>;
62
50
  render?: (App: React_2.ReactElement, id?: HTMLElement | string) => RootType | Promise<RootType>;
63
- hooks?: BridgeHooks;
64
51
  };
65
52
 
66
53
  export declare interface ProviderParams {
@@ -77,8 +64,6 @@ export declare interface RenderFnParams extends ProviderParams {
77
64
  dom: HTMLElement;
78
65
  }
79
66
 
80
- declare type RenderParams = RenderFnParams & any;
81
-
82
67
  declare type RootType = HTMLElement | default_3.Root;
83
68
 
84
69
  export { }
package/dist/index.es.js CHANGED
@@ -1,8 +1,7 @@
1
1
  import * as React from "react";
2
2
  import React__default, { createContext, Component, createElement, isValidElement, forwardRef, useRef, useEffect, useContext, useState } from "react";
3
- import { L as LoggerInstance, g as getRootDomDefaultClassName, p as pathJoin, a as getModuleName, b as atLeastReact18, R as RouterContext } from "./context-Dh6IUBWT.js";
3
+ import { L as LoggerInstance, p as pathJoin, a as atLeastReact18, R as RouterContext } from "./context-BcyT-d0V.js";
4
4
  import * as ReactRouterDOM from "react-router-dom";
5
- import { getInstance } from "@module-federation/runtime";
6
5
  import ReactDOM from "react-dom";
7
6
  const ErrorBoundaryContext = createContext(null);
8
7
  const initialState = {
@@ -104,8 +103,6 @@ function e() {
104
103
  window.dispatchEvent(t);
105
104
  }
106
105
  const RemoteAppWrapper = forwardRef(function(props, ref) {
107
- const host = getInstance();
108
- LoggerInstance.log(`RemoteAppWrapper host >>>`, host);
109
106
  const RemoteApp2 = () => {
110
107
  LoggerInstance.log(`RemoteAppWrapper RemoteApp props >>>`, { props });
111
108
  const {
@@ -123,10 +120,9 @@ const RemoteAppWrapper = forwardRef(function(props, ref) {
123
120
  const providerInfoRef = useRef(null);
124
121
  useEffect(() => {
125
122
  const renderTimeout = setTimeout(() => {
126
- var _a, _b, _c, _d, _e, _f;
127
123
  const providerReturn = providerInfo();
128
124
  providerInfoRef.current = providerReturn;
129
- let renderProps = {
125
+ const renderProps = {
130
126
  moduleName,
131
127
  dom: rootRef.current,
132
128
  basename,
@@ -139,55 +135,34 @@ const RemoteAppWrapper = forwardRef(function(props, ref) {
139
135
  `createRemoteComponent LazyComponent render >>>`,
140
136
  renderProps
141
137
  );
142
- const beforeBridgeRenderRes = ((_c = (_b = (_a = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _a.lifecycle) == null ? void 0 : _b.beforeBridgeRender) == null ? void 0 : _c.emit(renderProps)) || {};
143
- renderProps = { ...renderProps, ...beforeBridgeRenderRes.extraProps };
144
138
  providerReturn.render(renderProps);
145
- (_f = (_e = (_d = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _d.lifecycle) == null ? void 0 : _e.afterBridgeRender) == null ? void 0 : _f.emit(renderProps);
146
139
  });
147
140
  return () => {
148
141
  clearTimeout(renderTimeout);
149
142
  setTimeout(() => {
150
- var _a, _b, _c, _d, _e, _f, _g, _h;
143
+ var _a, _b;
151
144
  if ((_a = providerInfoRef.current) == null ? void 0 : _a.destroy) {
152
145
  LoggerInstance.log(
153
146
  `createRemoteComponent LazyComponent destroy >>>`,
154
147
  { moduleName, basename, dom: renderDom.current }
155
148
  );
156
- (_d = (_c = (_b = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _b.lifecycle) == null ? void 0 : _c.beforeBridgeDestroy) == null ? void 0 : _d.emit({
157
- moduleName,
158
- dom: renderDom.current,
159
- basename,
160
- memoryRoute,
161
- fallback,
162
- ...resProps
163
- });
164
- (_e = providerInfoRef.current) == null ? void 0 : _e.destroy({
165
- moduleName,
149
+ (_b = providerInfoRef.current) == null ? void 0 : _b.destroy({
166
150
  dom: renderDom.current
167
151
  });
168
- (_h = (_g = (_f = host == null ? void 0 : host.bridgeHook) == null ? void 0 : _f.lifecycle) == null ? void 0 : _g.afterBridgeDestroy) == null ? void 0 : _h.emit({
169
- moduleName,
170
- dom: renderDom.current,
171
- basename,
172
- memoryRoute,
173
- fallback,
174
- ...resProps
175
- });
176
152
  }
177
153
  });
178
154
  };
179
155
  }, []);
180
- const rootComponentClassName = `${getRootDomDefaultClassName(moduleName)} ${props == null ? void 0 : props.className}`;
181
156
  return /* @__PURE__ */ React__default.createElement(
182
157
  "div",
183
158
  {
184
- className: rootComponentClassName,
159
+ className: props == null ? void 0 : props.className,
185
160
  style: props == null ? void 0 : props.style,
186
161
  ref: rootRef
187
162
  }
188
163
  );
189
164
  };
190
- RemoteApp2["__APP_VERSION__"] = "0.7.0";
165
+ RemoteApp2["__APP_VERSION__"] = "0.7.2";
191
166
  return /* @__PURE__ */ React__default.createElement(RemoteApp2, null);
192
167
  });
193
168
  function withRouterData(WrappedComponent) {
@@ -337,7 +312,7 @@ if (process.env.NODE_ENV === "production") {
337
312
  };
338
313
  }
339
314
  function createBridgeComponent(bridgeInfo) {
340
- return (params) => {
315
+ return () => {
341
316
  const rootMap = /* @__PURE__ */ new Map();
342
317
  const RawComponent = (info) => {
343
318
  const { appInfo, propsInfo, ...restProps } = info;
@@ -353,7 +328,6 @@ function createBridgeComponent(bridgeInfo) {
353
328
  };
354
329
  return {
355
330
  async render(info) {
356
- var _a, _b, _c, _d;
357
331
  LoggerInstance.log(`createBridgeComponent render Info`, info);
358
332
  const {
359
333
  moduleName,
@@ -363,12 +337,6 @@ function createBridgeComponent(bridgeInfo) {
363
337
  fallback,
364
338
  ...propsInfo
365
339
  } = info;
366
- const moduleNameWithoutExpose = getModuleName(moduleName);
367
- const instance = __FEDERATION__.__INSTANCES__.find(
368
- (v) => v.name === moduleNameWithoutExpose
369
- );
370
- LoggerInstance.log(`createBridgeComponent remote instance`, instance);
371
- const beforeBridgeRenderRes = ((_c = (_b = (_a = instance == null ? void 0 : instance.bridgeHook) == null ? void 0 : _a.lifecycle) == null ? void 0 : _b.beforeBridgeRender) == null ? void 0 : _c.emit(info)) || {};
372
340
  const rootComponentWithErrorBoundary = (
373
341
  // set ErrorBoundary for RawComponent rendering error, usually caused by user app rendering error
374
342
  /* @__PURE__ */ React.createElement(ErrorBoundary, { FallbackComponent: fallback }, /* @__PURE__ */ React.createElement(
@@ -379,7 +347,7 @@ function createBridgeComponent(bridgeInfo) {
379
347
  basename,
380
348
  memoryRoute
381
349
  },
382
- propsInfo: { ...propsInfo, ...beforeBridgeRenderRes == null ? void 0 : beforeBridgeRenderRes.extraProps }
350
+ propsInfo
383
351
  }
384
352
  ))
385
353
  );
@@ -397,24 +365,11 @@ function createBridgeComponent(bridgeInfo) {
397
365
  const renderFn = (bridgeInfo == null ? void 0 : bridgeInfo.render) || ReactDOM.render;
398
366
  renderFn == null ? void 0 : renderFn(rootComponentWithErrorBoundary, info.dom);
399
367
  }
400
- const afterBridgeRender = (bridgeInfo == null ? void 0 : bridgeInfo.hooks) && (bridgeInfo == null ? void 0 : bridgeInfo.hooks.afterBridgeDestroy) || ((_d = params == null ? void 0 : params.hooks) == null ? void 0 : _d.afterBridgeRender);
401
- afterBridgeRender && afterBridgeRender(info);
402
368
  },
403
369
  async destroy(info) {
404
- var _a, _b, _c, _d, _e, _f;
405
370
  LoggerInstance.log(`createBridgeComponent destroy Info`, {
406
371
  dom: info.dom
407
372
  });
408
- const moduleNameWithoutExpose = getModuleName(info.moduleName);
409
- LoggerInstance.log(
410
- `createBridgeComponent remote module without expose name >>>`,
411
- moduleNameWithoutExpose
412
- );
413
- const instance = __FEDERATION__.__INSTANCES__.find(
414
- (v) => v.name === moduleNameWithoutExpose
415
- );
416
- LoggerInstance.log(`createBridgeComponent remote instance`, instance);
417
- (_c = (_b = (_a = instance == null ? void 0 : instance.bridgeHook) == null ? void 0 : _a.lifecycle) == null ? void 0 : _b.beforeBridgeDestroy) == null ? void 0 : _c.emit(info);
418
373
  if (atLeastReact18(React)) {
419
374
  const root = rootMap.get(info.dom);
420
375
  root == null ? void 0 : root.unmount();
@@ -422,7 +377,6 @@ function createBridgeComponent(bridgeInfo) {
422
377
  } else {
423
378
  ReactDOM.unmountComponentAtNode(info.dom);
424
379
  }
425
- (_f = (_e = (_d = instance == null ? void 0 : instance.bridgeHook) == null ? void 0 : _d.lifecycle) == null ? void 0 : _e.afterBridgeDestroy) == null ? void 0 : _f.emit(info);
426
380
  },
427
381
  rawComponent: bridgeInfo.rootComponent,
428
382
  __BRIDGE_FN__: (_args) => {
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const React = require("react");
4
4
  const ReactRouterDom$1 = require("react-router-dom/index.js");
5
- const context = require("./context-DmzxwI_7.cjs");
5
+ const context = require("./context-BBLu8BlQ.cjs");
6
6
  const ReactRouterDom = require("react-router-dom/index.js");
7
7
  function _interopNamespaceDefault(e) {
8
8
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
@@ -1,6 +1,6 @@
1
1
  import React__default, { useContext } from "react";
2
2
  import * as ReactRouterDom$1 from "react-router-dom/index.js";
3
- import { R as RouterContext, L as LoggerInstance } from "./context-Dh6IUBWT.js";
3
+ import { R as RouterContext, L as LoggerInstance } from "./context-BcyT-d0V.js";
4
4
  export * from "react-router-dom/index.js";
5
5
  function WraperRouter(props) {
6
6
  const { basename, ...propsRes } = props;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const React = require("react");
4
4
  const ReactRouterDom = require("react-router-dom/dist/index.js");
5
- const context = require("./context-DmzxwI_7.cjs");
5
+ const context = require("./context-BBLu8BlQ.cjs");
6
6
  function _interopNamespaceDefault(e) {
7
7
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
8
8
  if (e) {
@@ -1,7 +1,7 @@
1
1
  import React__default, { useContext } from "react";
2
2
  import * as ReactRouterDom from "react-router-dom/dist/index.js";
3
3
  export * from "react-router-dom/dist/index.js";
4
- import { R as RouterContext, L as LoggerInstance } from "./context-Dh6IUBWT.js";
4
+ import { R as RouterContext, L as LoggerInstance } from "./context-BcyT-d0V.js";
5
5
  function WraperRouter(props) {
6
6
  const { basename, ...propsRes } = props;
7
7
  const routerContextProps = useContext(RouterContext) || {};
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const React = require("react");
4
4
  const ReactRouterDom = require("react-router-dom/");
5
- const context = require("./context-DmzxwI_7.cjs");
5
+ const context = require("./context-BBLu8BlQ.cjs");
6
6
  function _interopNamespaceDefault(e) {
7
7
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
8
8
  if (e) {
@@ -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 || (router == null ? void 0 : router.basename),
68
+ basename: routerContextProps.basename,
69
69
  future: router.future,
70
70
  window: router.window
71
71
  });
package/dist/router.es.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import React__default, { useContext } from "react";
2
2
  import * as ReactRouterDom from "react-router-dom/";
3
3
  export * from "react-router-dom/";
4
- import { R as RouterContext, L as LoggerInstance } from "./context-Dh6IUBWT.js";
4
+ import { R as RouterContext, L as LoggerInstance } from "./context-BcyT-d0V.js";
5
5
  function WrapperRouter(props) {
6
6
  const { basename, ...propsRes } = props;
7
7
  const routerContextProps = useContext(RouterContext) || {};
@@ -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 || (router == null ? void 0 : router.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-20241108091829",
3
+ "version": "0.0.0-next-20241112032845",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -41,14 +41,13 @@
41
41
  "dependencies": {
42
42
  "@loadable/component": "^5.16.4",
43
43
  "react-error-boundary": "^4.0.13",
44
- "@module-federation/bridge-shared": "0.0.0-next-20241108091829",
45
- "@module-federation/sdk": "0.0.0-next-20241108091829"
44
+ "@module-federation/bridge-shared": "0.0.0-next-20241112032845",
45
+ "@module-federation/sdk": "0.0.0-next-20241112032845"
46
46
  },
47
47
  "peerDependencies": {
48
48
  "react": ">=16.9.0",
49
49
  "react-dom": ">=16.9.0",
50
- "react-router-dom": ">=4",
51
- "@module-federation/runtime": "0.0.0-next-20241108091829"
50
+ "react-router-dom": ">=4"
52
51
  },
53
52
  "devDependencies": {
54
53
  "@testing-library/react": "15.0.7",
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,38 +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';
10
+ import { LoggerInstance, atLeastReact18 } from './utils';
9
11
  import { ErrorBoundary } from 'react-error-boundary';
10
- import { RouterContext } from './context';
11
- import { LoggerInstance, atLeastReact18, getModuleName } from './utils';
12
12
 
13
- type RenderParams = RenderFnParams & any;
14
- type DestroyParams = {
15
- moduleName: string;
16
- dom: HTMLElement;
17
- };
18
13
  type RootType = HTMLElement | ReactDOMClient.Root;
19
-
20
- type BridgeHooks = {
21
- beforeBridgeRender?: (params: RenderFnParams) => void | Record<string, any>;
22
- afterBridgeRender?: (params: RenderFnParams) => void | Record<string, any>;
23
- beforeBridgeDestroy?: (params: DestroyParams) => void | Record<string, any>;
24
- afterBridgeDestroy?: (params: DestroyParams) => void | Record<string, any>;
25
- };
26
-
27
14
  type ProviderFnParams<T> = {
28
15
  rootComponent: React.ComponentType<T>;
29
16
  render?: (
30
17
  App: React.ReactElement,
31
18
  id?: HTMLElement | string,
32
19
  ) => RootType | Promise<RootType>;
33
- hooks?: BridgeHooks;
34
20
  };
21
+
35
22
  export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
36
- return (params?: { hooks?: BridgeHooks }) => {
23
+ return () => {
37
24
  const rootMap = new Map<any, RootType>();
38
25
  const RawComponent = (info: { propsInfo: T; appInfo: ProviderParams }) => {
39
26
  const { appInfo, propsInfo, ...restProps } = info;
@@ -50,7 +37,7 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
50
37
  };
51
38
 
52
39
  return {
53
- async render(info: RenderParams) {
40
+ async render(info: RenderFnParams & any) {
54
41
  LoggerInstance.log(`createBridgeComponent render Info`, info);
55
42
  const {
56
43
  moduleName,
@@ -60,16 +47,6 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
60
47
  fallback,
61
48
  ...propsInfo
62
49
  } = info;
63
-
64
- const moduleNameWithoutExpose = getModuleName(moduleName);
65
- const instance = __FEDERATION__.__INSTANCES__.find(
66
- (v) => v.name === moduleNameWithoutExpose,
67
- );
68
- LoggerInstance.log(`createBridgeComponent remote instance`, instance);
69
-
70
- const beforeBridgeRenderRes =
71
- instance?.bridgeHook?.lifecycle?.beforeBridgeRender?.emit(info) || {};
72
-
73
50
  const rootComponentWithErrorBoundary = (
74
51
  // set ErrorBoundary for RawComponent rendering error, usually caused by user app rendering error
75
52
  <ErrorBoundary FallbackComponent={fallback}>
@@ -79,13 +56,11 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
79
56
  basename,
80
57
  memoryRoute,
81
58
  }}
82
- propsInfo={
83
- { ...propsInfo, ...beforeBridgeRenderRes?.extraProps } as T
84
- }
59
+ propsInfo={propsInfo}
85
60
  />
86
61
  </ErrorBoundary>
87
62
  );
88
- // call render function
63
+
89
64
  if (atLeastReact18(React)) {
90
65
  if (bridgeInfo?.render) {
91
66
  // in case bridgeInfo?.render is an async function, resolve this to promise
@@ -102,29 +77,11 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
102
77
  const renderFn = bridgeInfo?.render || ReactDOM.render;
103
78
  renderFn?.(rootComponentWithErrorBoundary, info.dom);
104
79
  }
105
-
106
- const afterBridgeRender =
107
- (bridgeInfo?.hooks && bridgeInfo?.hooks.afterBridgeDestroy) ||
108
- params?.hooks?.afterBridgeRender;
109
- afterBridgeRender && afterBridgeRender(info);
110
80
  },
111
-
112
- async destroy(info: DestroyParams) {
81
+ async destroy(info: { dom: HTMLElement }) {
113
82
  LoggerInstance.log(`createBridgeComponent destroy Info`, {
114
83
  dom: info.dom,
115
84
  });
116
- const moduleNameWithoutExpose = getModuleName(info.moduleName);
117
- LoggerInstance.log(
118
- `createBridgeComponent remote module without expose name >>>`,
119
- moduleNameWithoutExpose,
120
- );
121
- const instance = __FEDERATION__.__INSTANCES__.find(
122
- (v) => v.name === moduleNameWithoutExpose,
123
- );
124
- LoggerInstance.log(`createBridgeComponent remote instance`, instance);
125
-
126
- instance?.bridgeHook?.lifecycle?.beforeBridgeDestroy?.emit(info);
127
- // call destroy function
128
85
  if (atLeastReact18(React)) {
129
86
  const root = rootMap.get(info.dom);
130
87
  (root as ReactDOMClient.Root)?.unmount();
@@ -132,8 +89,6 @@ export function createBridgeComponent<T>(bridgeInfo: ProviderFnParams<T>) {
132
89
  } else {
133
90
  ReactDOM.unmountComponentAtNode(info.dom);
134
91
  }
135
-
136
- instance?.bridgeHook?.lifecycle?.afterBridgeDestroy?.emit(info);
137
92
  },
138
93
  rawComponent: bridgeInfo.rootComponent,
139
94
  __BRIDGE_FN__: (_args: T) => {},
@@ -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 { LoggerInstance, pathJoin, getRootDomDefaultClassName } from '../utils';
13
- import { getInstance } from '@module-federation/runtime';
14
13
 
15
14
  declare const __APP_VERSION__: string;
16
15
  export interface RenderFnParams extends ProviderParams {
@@ -40,8 +39,6 @@ const RemoteAppWrapper = forwardRef(function (
40
39
  props: RemoteAppParams & RenderFnParams,
41
40
  ref,
42
41
  ) {
43
- const host = getInstance();
44
- LoggerInstance.log(`RemoteAppWrapper host >>>`, host);
45
42
  const RemoteApp = () => {
46
43
  LoggerInstance.log(`RemoteAppWrapper RemoteApp props >>>`, { props });
47
44
  const {
@@ -68,7 +65,7 @@ const RemoteAppWrapper = forwardRef(function (
68
65
  const providerReturn = providerInfo();
69
66
  providerInfoRef.current = providerReturn;
70
67
 
71
- let renderProps = {
68
+ const renderProps = {
72
69
  moduleName,
73
70
  dom: rootRef.current,
74
71
  basename,
@@ -81,14 +78,7 @@ const RemoteAppWrapper = forwardRef(function (
81
78
  `createRemoteComponent LazyComponent render >>>`,
82
79
  renderProps,
83
80
  );
84
-
85
- // TODO: 寻找当前 remote 实例上的 hostName, 找到 host instance
86
- const beforeBridgeRenderRes =
87
- host?.bridgeHook?.lifecycle?.beforeBridgeRender?.emit(renderProps) ||
88
- {};
89
- renderProps = { ...renderProps, ...beforeBridgeRenderRes.extraProps };
90
81
  providerReturn.render(renderProps);
91
- host?.bridgeHook?.lifecycle?.afterBridgeRender?.emit(renderProps);
92
82
  });
93
83
 
94
84
  return () => {
@@ -99,37 +89,17 @@ const RemoteAppWrapper = forwardRef(function (
99
89
  `createRemoteComponent LazyComponent destroy >>>`,
100
90
  { moduleName, basename, dom: renderDom.current },
101
91
  );
102
- host?.bridgeHook?.lifecycle?.beforeBridgeDestroy?.emit({
103
- moduleName,
104
- dom: renderDom.current,
105
- basename,
106
- memoryRoute,
107
- fallback,
108
- ...resProps,
109
- });
110
92
  providerInfoRef.current?.destroy({
111
- moduleName,
112
- dom: renderDom.current,
113
- });
114
-
115
- host?.bridgeHook?.lifecycle?.afterBridgeDestroy?.emit({
116
- moduleName,
117
93
  dom: renderDom.current,
118
- basename,
119
- memoryRoute,
120
- fallback,
121
- ...resProps,
122
94
  });
123
95
  }
124
96
  });
125
97
  };
126
98
  }, []);
127
99
 
128
- // bridge-remote-root
129
- const rootComponentClassName = `${getRootDomDefaultClassName(moduleName)} ${props?.className}`;
130
100
  return (
131
101
  <div
132
- className={rootComponentClassName}
102
+ className={props?.className}
133
103
  style={props?.style}
134
104
  ref={rootRef}
135
105
  ></div>
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.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 || router?.basename,
62
+ basename: routerContextProps.basename,
63
63
  future: router.future,
64
64
  window: router.window,
65
65
  });
package/src/utils.ts CHANGED
@@ -41,24 +41,3 @@ export function pathJoin(...args: string[]) {
41
41
  }, '');
42
42
  return res || '/';
43
43
  }
44
-
45
- export const getModuleName = (id: string) => {
46
- if (!id) {
47
- return id;
48
- }
49
- // separate module name without detailed module path
50
- // @vmok-e2e/edenx-demo-app2/button -> @vmok-e2e/edenx-demo-app2
51
- const idArray = id.split('/');
52
- if (idArray.length < 2) {
53
- return id;
54
- }
55
- return idArray[0] + '/' + idArray[1];
56
- };
57
-
58
- export const getRootDomDefaultClassName = (moduleName: string) => {
59
- if (!moduleName) {
60
- return '';
61
- }
62
- const name = getModuleName(moduleName).replace(/\@/, '').replace(/\//, '-');
63
- return `bridge-root-component-${name}`;
64
- };