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

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