@fulgurjs/federation 5.4.3 → 5.5.0

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.
Files changed (62) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/bridge-app-react.cjs +6 -58
  3. package/dist/bridge-app-react.d.cts +1 -1
  4. package/dist/bridge-app-react.d.ts +1 -1
  5. package/dist/bridge-app-react.js +6 -15
  6. package/dist/bridge-app-vue.cjs +5 -55
  7. package/dist/bridge-app-vue.d.cts +4 -3
  8. package/dist/bridge-app-vue.d.ts +4 -3
  9. package/dist/bridge-app-vue.js +5 -12
  10. package/dist/{bridge-core-ejlY9ddN.d.ts → bridge-core-D37VanBl.d.ts} +6 -0
  11. package/dist/bridge-core.d.cts +1 -1
  12. package/dist/bridge-core.d.ts +1 -1
  13. package/dist/bridge-core.js +2 -2
  14. package/dist/bridge-errors.cjs +6 -0
  15. package/dist/bridge-errors.d.cts +9 -1
  16. package/dist/bridge-errors.d.ts +9 -1
  17. package/dist/bridge-errors.js +3 -1
  18. package/dist/{bridge-host-react-Bua1TCVh.d.ts → bridge-host-react-CGymCzD2.d.ts} +1 -1
  19. package/dist/bridge-host-react.cjs +11 -2
  20. package/dist/bridge-host-react.d.cts +1 -1
  21. package/dist/bridge-host-react.d.ts +1 -1
  22. package/dist/bridge-host-react.js +10 -6
  23. package/dist/{bridge-host-vue-Dd1kkwDb.d.ts → bridge-host-vue-B3GHaQAC.d.ts} +1 -1
  24. package/dist/bridge-host-vue.cjs +11 -2
  25. package/dist/bridge-host-vue.js +10 -6
  26. package/dist/bridge-react.d.ts +4 -4
  27. package/dist/{bridge-router-core-BRZQYDPm.d.ts → bridge-router-core-DWFCVg9B.d.cts} +6 -0
  28. package/dist/{bridge-router-core-BRZQYDPm.d.cts → bridge-router-core-DWFCVg9B.d.ts} +6 -0
  29. package/dist/bridge-router-react.d.ts +6 -0
  30. package/dist/bridge-router-react.js +13 -3
  31. package/dist/bridge-router-vue.d.ts +7 -1
  32. package/dist/bridge-router-vue.js +22 -5
  33. package/dist/bridge-vue.d.ts +2 -2
  34. package/dist/bridge.d.ts +5 -5
  35. package/dist/{chunk-UFWZPE36.js → chunk-CI54BRPO.js} +12 -2
  36. package/dist/{chunk-43UX3UZE.js → chunk-E3VEP6LN.js} +8 -4
  37. package/dist/{chunk-RXXBTPAY.js → chunk-Q6V5O5Y6.js} +1 -1
  38. package/dist/{chunk-KT3YARK5.js → chunk-TU6DMGDA.js} +8 -4
  39. package/dist/{chunk-HZGQOW35.js → chunk-WRJG2YG6.js} +5 -0
  40. package/dist/{chunk-7CQOVLSI.js → chunk-YKIFZIBH.js} +2 -1
  41. package/dist/index.cjs +125 -2
  42. package/dist/index.js +125 -2
  43. package/dist/react.d.ts +6 -0
  44. package/dist/runtime-entry.d.ts +9 -2
  45. package/dist/runtime.js +8 -8
  46. package/examples/bridge/react-host/package-lock.json +4 -4
  47. package/examples/bridge/react-host/package.json +1 -1
  48. package/examples/bridge/react-remote/package-lock.json +4 -4
  49. package/examples/bridge/react-remote/package.json +1 -1
  50. package/examples/bridge/vue-host/package-lock.json +4 -4
  51. package/examples/bridge/vue-host/package.json +1 -1
  52. package/examples/bridge/vue-remote/package-lock.json +4 -4
  53. package/examples/bridge/vue-remote/package.json +1 -1
  54. package/examples/react/host/package-lock.json +4 -4
  55. package/examples/react/host/package.json +1 -1
  56. package/examples/react/remote/package-lock.json +4 -4
  57. package/examples/react/remote/package.json +1 -1
  58. package/examples/vue/host/package-lock.json +4 -4
  59. package/examples/vue/host/package.json +1 -1
  60. package/examples/vue/remote/package-lock.json +4 -4
  61. package/examples/vue/remote/package.json +1 -1
  62. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.5.0
4
+
5
+ - **修复:Vite 8(rolldown)大型应用生产构建失败(V8-ASYNC-FIX)**——插件 TLA 协商门面使消费方模块的 chunk 内惰性初始化包装异步化后,与用户代码既有循环依赖相遇(JeecgBoot 实测:electron 工具模块 ⇄ 路由模块),rolldown 1.1.5 为循环另一侧生成的包装漏标 `async`(`e((()=>{await …}))` / `__esmMin((() => { await …` 两种形态),产物出现「await 位于非 async 函数」——esbuild 转译期报 `"await" can only be used inside an "async" function`,浏览器侧为 `SyntaxError: Unexpected reserved word`(5.4.x 时代曾被迫切 Vite 6 构建规避)。修复:插件在 `renderChunk`(order: pre,抢在 vite:esbuild-transpile 校验前)做检测与补标——esbuild 语法校验确证破损才修复,按 rolldown 包装签名补 `async`(即 rolldown 本应生成的代码,运行时助手对 Promise 包装本有支持),必要时 AST 定位兜底;修复后复验必须通过。正常产物零改动零解析成本;rollup(Vite 5/6/7)零触发。回归 `tests/async-mark-repair.test.ts`;Jeecg A/B(1920/1924 chunks)Vite 8.1.4 生产构建产物全部语法合法。**语义说明**:补标后的包装与 rolldown 在循环场景的既有输出一致(调用方同步调用返回 Promise 不等待,与 rolldown 自身对异步循环的处理相同),不改变任何调用点。
6
+ - **修复:桥接诊断三项(MFU-033 降噪 / spec 失真 / cause 双重包装)**
7
+ - MFU-033 双诊断:宿主守卫(React `useBlocker`)回滚期的连续广播竞态曾产生重复的「子应用守卫拒绝应用宿主确认的位置」误导诊断。现在 `cancelled` 类失败(子应用自己的新导航取代广播应用,子应用自洽)按正常取消处理不再报 MFU-033;真实失步(`aborted` 等)仍报且诊断文本携带目标位置;连续完全相同的错误折叠为首条(不同失败事件永不合并)。
8
+ - 桥接错误 spec 真实化:`defineBridgeApp`(Vue/React 子应用适配器)不再以占位 spec `'bridge'` 预包装 MFU-016——mount/unmount 的原始错误原样抛出,由宿主适配器在生命周期边界**单点包装**(`bridgeHostError`:真实 spec + phase + 原始 cause,只包装一次;已是插件诊断的错误原样保留)。子应用路由接线(`connectVueBridgeRouter` 等)的同步失败诊断 spec 也从硬编码 `'vue-router'`/`'child-router'` 改为通道携带的真实远程名(`RoutingChannel.spec` 公开,`BridgeChildRoute.spec?`)。
9
+ - **支持:Vue Router 5(peer `>=4.1.0 <6`)**——审查插件消费面(`Router`/`currentRoute.fullPath`/`push/replace/go`/`beforeResolve/beforeEach/afterEach`/`isNavigationFailure`/`NavigationFailureType`,枚举值 4/8/16 两版一致)后正式支持;vue-router 5.1.0 下路由/桥接全套单测 87/87 通过,JeecgBoot(vue-router ^5.1.0)dev+生产全链浏览器验收通过。
10
+ - 修复:Promise 远程名称不一致告警在重试/恢复链路重复刷屏——同一(配置名↔自报名)对只告警一次。
11
+ - 质量门禁:单测 615 → 623(async 补标 6 + MFU-033 降噪 2);e2e dev 43/43、prod 28/28 全绿;两套类型(tsconfig + 最新 TS 口径)0 错误;gzip / 错误码 48 三方一致门禁通过。
12
+
13
+ ## 5.4.3
14
+
15
+ - 修复:移除 5.4.2 误带入 `transformIndexHtml` 的一条无条件调试输出(`console.error` 探针在发布前漏删,污染使用方终端)。运行时与 5.4.2 一致,5.4.2 使用方请直接升级。
16
+
17
+ ## 5.4.2
18
+
19
+ - 修复:多远程宿主 react-refresh preamble 错源(MFU-001 "can't detect preamble")——Vue 宿主同时挂 Vue 子应用与 React 子应用时,发布脚本静态 import「首个 http dev 远程」的 `/@react-refresh`(错源 MIME 失败 → 标志未设)。修复:标志同步先设 + 动态 import 容错 + shim 自举兜底(`src/index.ts`、`src/virtual.ts` genReactRefreshShim)。
20
+ - 修复:`BridgeHostRouting` 类型未从 `/bridge/router/vue`、`/bridge/router/react` 导出(README §8.3 与发布包 d.ts 不符)。
21
+ - 新增导出面守卫用例(`tests/exports.test.ts`)。
22
+
3
23
  ## 5.4.1
4
24
 
5
25
  - 修复 URL 同步两端适配器将 replace 误报为 push、子应用 go/back/forward 未委托宿主历史,以及连续导航被丢弃的问题。
@@ -34,54 +34,6 @@ __export(bridge_app_react_exports, {
34
34
  });
35
35
  module.exports = __toCommonJS(bridge_app_react_exports);
36
36
  var import_react = require("react");
37
-
38
- // src/runtime/errors.ts
39
- var FgError = class extends Error {
40
- code;
41
- details;
42
- constructor(code, message, details, options) {
43
- super(`[fulgurjs:${code}] ${message}`, options);
44
- this.name = "FgError";
45
- this.code = code;
46
- this.details = details;
47
- }
48
- };
49
-
50
- // src/bridge-errors.ts
51
- var BridgeErrorCodes = {
52
- /** 桥接契约非法(./bridge 默认导出缺 mount/unmount 或不是函数) */
53
- BRIDGE_INVALID_CONTRACT: "MFU-015",
54
- /** 桥接准备或生命周期失败(details.phase = getContext | mount | unmount) */
55
- BRIDGE_LIFECYCLE_FAILED: "MFU-016",
56
- /** 桥接会话参数与 AppContext 不一致(受控 sessionKey 与全局会话矛盾) */
57
- BRIDGE_SESSION_MISMATCH: "MFU-017",
58
- /** 路由同步配置/前缀冲突(basePath 非法、同页前缀冲突或重叠) */
59
- ROUTING_CONFIG_INVALID: "MFU-030",
60
- /** 路由协议缺失/通道失效(子应用未声明 routing 协议,或已销毁通道被再次使用) */
61
- ROUTING_PROTOCOL_MISSING: "MFU-031",
62
- /** 非法导航(目标越界前缀、非法 go 参数、失效实例的请求) */
63
- ROUTING_NAVIGATION_INVALID: "MFU-032",
64
- /** 路由准备/同步失败(重定向循环、子应用路由准备失败且已阻止错误页面显示) */
65
- ROUTING_SYNC_FAILED: "MFU-033"
66
- };
67
- function bridgeLifecycleError(phase, spec, cause, extra) {
68
- const raw = cause instanceof Error ? cause.message : String(cause ?? "unknown");
69
- const fixes = {
70
- getContext: "\u4FEE\u6CD5: \u2460 getContext \u5FC5\u987B\u662F\u540C\u6B65\u3001\u65E0\u526F\u4F5C\u7528\u7684 getter\uFF08\u4E0D\u5F97\u8FD4\u56DE Promise/thenable\uFF09\uFF1B\n \u2461 \u8FD4\u56DE\u503C\u987B\u662F\u5305\u542B\u672C\u6B21\u4F1A\u8BDD\u5FEB\u7167\u7684\u5BF9\u8C61\uFF08\u53D7\u63A7 sessionKey \u65F6\u987B\u542B\u76F8\u540C sessionKey\uFF09\uFF1B\n \u2462 \u5F02\u6B65\u83B7\u53D6\u7528\u6237\u8D44\u6599\u8BF7\u5728\u5BBF\u4E3B\u5B8C\u6210\u540E\u518D\u8BA9\u6865\u63A5\u7EC4\u4EF6\u8FDB\u5165\u53EF\u6302\u8F7D\u72B6\u6001\u3002",
71
- mount: "\u4FEE\u6CD5: \u2460 \u67E5\u770B\u6839\u56E0\u4E2D\u5B50\u5E94\u7528 mount \u7684\u539F\u59CB\u9519\u8BEF\uFF08\u5DE5\u5382\u629B\u9519\u6216\u9996\u6B21\u6E32\u67D3\u5931\u8D25\uFF09\uFF1B\n \u2461 \u540C\u4E00\u5BB9\u5668\u672A\u5378\u8F7D\u524D\u91CD\u590D mount \u662F\u5951\u7EA6\u8FDD\u4F8B\u2014\u2014\u5148 unmount \u518D mount\uFF1B\n \u2462 \u4FEE\u590D\u540E\u70B9\u51FB\u300C\u91CD\u8BD5\u52A0\u8F7D\u300D\u5728\u540C\u9875\u91CD\u5EFA\u6302\u8F7D\u3002",
72
- unmount: "\u4FEE\u6CD5: \u2460 \u6839\u56E0\u6765\u81EA\u5B50\u5E94\u7528 unmount \u5B9E\u73B0\uFF08app.unmount/root.unmount \u629B\u9519\uFF09\uFF1B\n \u2461 \u8BE5\u5BB9\u5668\u6E05\u7406\u72B6\u6001\u4E0D\u786E\u5B9A\uFF0C\u63D2\u4EF6\u5DF2\u6301\u4E45\u5C01\u9501\u8BE5\u5BB9\u5668\u2014\u2014\u540C\u9875\u300C\u91CD\u8BD5\u52A0\u8F7D\u300D\u4E0E\n \u6362\u4F1A\u8BDD\u90FD\u4E0D\u4F1A\u5728\u6B64\u5BB9\u5668\u91CD\u65B0\u6302\u8F7D\uFF1B\n \u2462 \u53EA\u80FD\u6574\u9875\u5237\u65B0\u6062\u590D\uFF08\u300C\u5237\u65B0\u9875\u9762\u91CD\u8BD5\u300D\uFF09\uFF1B\u6B8B\u7559\u8D44\u6E90\uFF08\u4E8B\u4EF6\u8BA2\u9605/\u5B9A\u65F6\u5668/\u5168\u5C40\u526F\u4F5C\u7528\uFF09\u8BF7\u5982\u5B9E\u6392\u67E5\u3002"
73
- };
74
- return new FgError(
75
- BridgeErrorCodes.BRIDGE_LIFECYCLE_FAILED,
76
- `\u73B0\u8C61\uFF1A\u6865\u63A5\u5E94\u7528 "${spec}" \u7684 ${phase} \u9636\u6BB5\u5931\u8D25\u3002
77
- \u6839\u56E0: ${raw}
78
- ` + fixes[phase],
79
- { phase, spec, cause: String(raw), ...extra },
80
- { cause }
81
- );
82
- }
83
-
84
- // src/bridge-app-react.ts
85
37
  var entriesByEl = /* @__PURE__ */ new WeakMap();
86
38
  var FirstCommitGate = class extends import_react.Component {
87
39
  state = { error: null };
@@ -108,9 +60,7 @@ function defineBridgeApp(factory, options = {}) {
108
60
  ...options.routing ? { routing: { protocol: 1 } } : {},
109
61
  mount(el, props, mountOptions) {
110
62
  if (entriesByEl.has(el)) {
111
- throw bridgeLifecycleError("mount", "bridge", "\u540C\u4E00\u5BB9\u5668 el \u5DF2\u6302\u8F7D\u672C\u6865\u63A5\u5E94\u7528\uFF08\u5BB9\u5668\u5DF2\u88AB\u5360\u7528\uFF09\u3002", {
112
- reason: "container-occupied"
113
- });
63
+ throw new Error("\u540C\u4E00\u5BB9\u5668 el \u5DF2\u6302\u8F7D\u672C\u6865\u63A5\u5E94\u7528\uFF08\u5BB9\u5668\u5DF2\u88AB\u5360\u7528\uFF09\u3002\u540C\u4E00\u5BB9\u5668\u672A\u5378\u8F7D\u524D\u91CD\u590D mount \u662F\u5951\u7EA6\u8FDD\u4F8B\u2014\u2014\u5148 unmount \u518D mount\u3002");
114
64
  }
115
65
  const snapshot = { ...props ?? {} };
116
66
  const ctx = { signal: mountOptions?.signal, routing: mountOptions?.routing };
@@ -118,13 +68,11 @@ function defineBridgeApp(factory, options = {}) {
118
68
  try {
119
69
  element = factory(snapshot, ctx);
120
70
  } catch (e) {
121
- throw bridgeLifecycleError("mount", "bridge", e instanceof Error ? e : String(e));
71
+ throw e instanceof Error ? e : new Error(String(e));
122
72
  }
123
73
  if (element === null || typeof element !== "object") {
124
- throw bridgeLifecycleError(
125
- "mount",
126
- "bridge",
127
- `defineBridgeApp \u5DE5\u5382\u8FD4\u56DE\u503C\u4E0D\u662F ReactElement\uFF08\u5F53\u524D ${element === null ? "null" : typeof element}\uFF09\u3002`
74
+ throw new Error(
75
+ `defineBridgeApp \u5DE5\u5382\u8FD4\u56DE\u503C\u4E0D\u662F ReactElement\uFF08\u5F53\u524D ${element === null ? "null" : typeof element}\uFF09\u3002\u5DE5\u5382\u5FC5\u987B\u8FD4\u56DE ReactElement\uFF08JSX/ createElement \u7684\u8FD4\u56DE\u503C\uFF09\u3002`
128
76
  );
129
77
  }
130
78
  const entry = { status: "pending" };
@@ -141,7 +89,7 @@ function defineBridgeApp(factory, options = {}) {
141
89
  const onError = (e) => {
142
90
  if (settled) return;
143
91
  settled = true;
144
- reject(bridgeLifecycleError("mount", "bridge", e instanceof Error ? e : String(e)));
92
+ reject(e instanceof Error ? e : new Error(String(e)));
145
93
  };
146
94
  const onCommit = () => {
147
95
  if (settled) return;
@@ -184,7 +132,7 @@ function defineBridgeApp(factory, options = {}) {
184
132
  try {
185
133
  entry.root.unmount();
186
134
  } catch (e) {
187
- throw bridgeLifecycleError("unmount", "bridge", e instanceof Error ? e : String(e));
135
+ throw e instanceof Error ? e : new Error(String(e));
188
136
  }
189
137
  }
190
138
  };
@@ -1,6 +1,6 @@
1
1
  import { ReactElement } from 'react';
2
2
  import { BridgeApp } from './bridge-core.cjs';
3
- import { B as BridgeChildRoute } from './bridge-router-core-BRZQYDPm.cjs';
3
+ import { B as BridgeChildRoute } from './bridge-router-core-DWFCVg9B.cjs';
4
4
  import './context.cjs';
5
5
 
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  import { ReactElement } from 'react';
2
2
  import { BridgeApp } from './bridge-core.js';
3
- import { B as BridgeChildRoute } from './bridge-router-core-BRZQYDPm.js';
3
+ import { B as BridgeChildRoute } from './bridge-router-core-DWFCVg9B.js';
4
4
  import './context.js';
5
5
 
6
6
  /**
@@ -1,8 +1,3 @@
1
- import {
2
- bridgeLifecycleError
3
- } from "./chunk-HZGQOW35.js";
4
- import "./chunk-OF2JCXTZ.js";
5
-
6
1
  // src/bridge-app-react.ts
7
2
  import { Component, createElement, useEffect } from "react";
8
3
  var entriesByEl = /* @__PURE__ */ new WeakMap();
@@ -31,9 +26,7 @@ function defineBridgeApp(factory, options = {}) {
31
26
  ...options.routing ? { routing: { protocol: 1 } } : {},
32
27
  mount(el, props, mountOptions) {
33
28
  if (entriesByEl.has(el)) {
34
- throw bridgeLifecycleError("mount", "bridge", "\u540C\u4E00\u5BB9\u5668 el \u5DF2\u6302\u8F7D\u672C\u6865\u63A5\u5E94\u7528\uFF08\u5BB9\u5668\u5DF2\u88AB\u5360\u7528\uFF09\u3002", {
35
- reason: "container-occupied"
36
- });
29
+ throw new Error("\u540C\u4E00\u5BB9\u5668 el \u5DF2\u6302\u8F7D\u672C\u6865\u63A5\u5E94\u7528\uFF08\u5BB9\u5668\u5DF2\u88AB\u5360\u7528\uFF09\u3002\u540C\u4E00\u5BB9\u5668\u672A\u5378\u8F7D\u524D\u91CD\u590D mount \u662F\u5951\u7EA6\u8FDD\u4F8B\u2014\u2014\u5148 unmount \u518D mount\u3002");
37
30
  }
38
31
  const snapshot = { ...props ?? {} };
39
32
  const ctx = { signal: mountOptions?.signal, routing: mountOptions?.routing };
@@ -41,13 +34,11 @@ function defineBridgeApp(factory, options = {}) {
41
34
  try {
42
35
  element = factory(snapshot, ctx);
43
36
  } catch (e) {
44
- throw bridgeLifecycleError("mount", "bridge", e instanceof Error ? e : String(e));
37
+ throw e instanceof Error ? e : new Error(String(e));
45
38
  }
46
39
  if (element === null || typeof element !== "object") {
47
- throw bridgeLifecycleError(
48
- "mount",
49
- "bridge",
50
- `defineBridgeApp \u5DE5\u5382\u8FD4\u56DE\u503C\u4E0D\u662F ReactElement\uFF08\u5F53\u524D ${element === null ? "null" : typeof element}\uFF09\u3002`
40
+ throw new Error(
41
+ `defineBridgeApp \u5DE5\u5382\u8FD4\u56DE\u503C\u4E0D\u662F ReactElement\uFF08\u5F53\u524D ${element === null ? "null" : typeof element}\uFF09\u3002\u5DE5\u5382\u5FC5\u987B\u8FD4\u56DE ReactElement\uFF08JSX/ createElement \u7684\u8FD4\u56DE\u503C\uFF09\u3002`
51
42
  );
52
43
  }
53
44
  const entry = { status: "pending" };
@@ -64,7 +55,7 @@ function defineBridgeApp(factory, options = {}) {
64
55
  const onError = (e) => {
65
56
  if (settled) return;
66
57
  settled = true;
67
- reject(bridgeLifecycleError("mount", "bridge", e instanceof Error ? e : String(e)));
58
+ reject(e instanceof Error ? e : new Error(String(e)));
68
59
  };
69
60
  const onCommit = () => {
70
61
  if (settled) return;
@@ -107,7 +98,7 @@ function defineBridgeApp(factory, options = {}) {
107
98
  try {
108
99
  entry.root.unmount();
109
100
  } catch (e) {
110
- throw bridgeLifecycleError("unmount", "bridge", e instanceof Error ? e : String(e));
101
+ throw e instanceof Error ? e : new Error(String(e));
111
102
  }
112
103
  }
113
104
  };
@@ -23,54 +23,6 @@ __export(bridge_app_vue_exports, {
23
23
  defineBridgeApp: () => defineBridgeApp
24
24
  });
25
25
  module.exports = __toCommonJS(bridge_app_vue_exports);
26
-
27
- // src/runtime/errors.ts
28
- var FgError = class extends Error {
29
- code;
30
- details;
31
- constructor(code, message, details, options) {
32
- super(`[fulgurjs:${code}] ${message}`, options);
33
- this.name = "FgError";
34
- this.code = code;
35
- this.details = details;
36
- }
37
- };
38
-
39
- // src/bridge-errors.ts
40
- var BridgeErrorCodes = {
41
- /** 桥接契约非法(./bridge 默认导出缺 mount/unmount 或不是函数) */
42
- BRIDGE_INVALID_CONTRACT: "MFU-015",
43
- /** 桥接准备或生命周期失败(details.phase = getContext | mount | unmount) */
44
- BRIDGE_LIFECYCLE_FAILED: "MFU-016",
45
- /** 桥接会话参数与 AppContext 不一致(受控 sessionKey 与全局会话矛盾) */
46
- BRIDGE_SESSION_MISMATCH: "MFU-017",
47
- /** 路由同步配置/前缀冲突(basePath 非法、同页前缀冲突或重叠) */
48
- ROUTING_CONFIG_INVALID: "MFU-030",
49
- /** 路由协议缺失/通道失效(子应用未声明 routing 协议,或已销毁通道被再次使用) */
50
- ROUTING_PROTOCOL_MISSING: "MFU-031",
51
- /** 非法导航(目标越界前缀、非法 go 参数、失效实例的请求) */
52
- ROUTING_NAVIGATION_INVALID: "MFU-032",
53
- /** 路由准备/同步失败(重定向循环、子应用路由准备失败且已阻止错误页面显示) */
54
- ROUTING_SYNC_FAILED: "MFU-033"
55
- };
56
- function bridgeLifecycleError(phase, spec, cause, extra) {
57
- const raw = cause instanceof Error ? cause.message : String(cause ?? "unknown");
58
- const fixes = {
59
- getContext: "\u4FEE\u6CD5: \u2460 getContext \u5FC5\u987B\u662F\u540C\u6B65\u3001\u65E0\u526F\u4F5C\u7528\u7684 getter\uFF08\u4E0D\u5F97\u8FD4\u56DE Promise/thenable\uFF09\uFF1B\n \u2461 \u8FD4\u56DE\u503C\u987B\u662F\u5305\u542B\u672C\u6B21\u4F1A\u8BDD\u5FEB\u7167\u7684\u5BF9\u8C61\uFF08\u53D7\u63A7 sessionKey \u65F6\u987B\u542B\u76F8\u540C sessionKey\uFF09\uFF1B\n \u2462 \u5F02\u6B65\u83B7\u53D6\u7528\u6237\u8D44\u6599\u8BF7\u5728\u5BBF\u4E3B\u5B8C\u6210\u540E\u518D\u8BA9\u6865\u63A5\u7EC4\u4EF6\u8FDB\u5165\u53EF\u6302\u8F7D\u72B6\u6001\u3002",
60
- mount: "\u4FEE\u6CD5: \u2460 \u67E5\u770B\u6839\u56E0\u4E2D\u5B50\u5E94\u7528 mount \u7684\u539F\u59CB\u9519\u8BEF\uFF08\u5DE5\u5382\u629B\u9519\u6216\u9996\u6B21\u6E32\u67D3\u5931\u8D25\uFF09\uFF1B\n \u2461 \u540C\u4E00\u5BB9\u5668\u672A\u5378\u8F7D\u524D\u91CD\u590D mount \u662F\u5951\u7EA6\u8FDD\u4F8B\u2014\u2014\u5148 unmount \u518D mount\uFF1B\n \u2462 \u4FEE\u590D\u540E\u70B9\u51FB\u300C\u91CD\u8BD5\u52A0\u8F7D\u300D\u5728\u540C\u9875\u91CD\u5EFA\u6302\u8F7D\u3002",
61
- unmount: "\u4FEE\u6CD5: \u2460 \u6839\u56E0\u6765\u81EA\u5B50\u5E94\u7528 unmount \u5B9E\u73B0\uFF08app.unmount/root.unmount \u629B\u9519\uFF09\uFF1B\n \u2461 \u8BE5\u5BB9\u5668\u6E05\u7406\u72B6\u6001\u4E0D\u786E\u5B9A\uFF0C\u63D2\u4EF6\u5DF2\u6301\u4E45\u5C01\u9501\u8BE5\u5BB9\u5668\u2014\u2014\u540C\u9875\u300C\u91CD\u8BD5\u52A0\u8F7D\u300D\u4E0E\n \u6362\u4F1A\u8BDD\u90FD\u4E0D\u4F1A\u5728\u6B64\u5BB9\u5668\u91CD\u65B0\u6302\u8F7D\uFF1B\n \u2462 \u53EA\u80FD\u6574\u9875\u5237\u65B0\u6062\u590D\uFF08\u300C\u5237\u65B0\u9875\u9762\u91CD\u8BD5\u300D\uFF09\uFF1B\u6B8B\u7559\u8D44\u6E90\uFF08\u4E8B\u4EF6\u8BA2\u9605/\u5B9A\u65F6\u5668/\u5168\u5C40\u526F\u4F5C\u7528\uFF09\u8BF7\u5982\u5B9E\u6392\u67E5\u3002"
62
- };
63
- return new FgError(
64
- BridgeErrorCodes.BRIDGE_LIFECYCLE_FAILED,
65
- `\u73B0\u8C61\uFF1A\u6865\u63A5\u5E94\u7528 "${spec}" \u7684 ${phase} \u9636\u6BB5\u5931\u8D25\u3002
66
- \u6839\u56E0: ${raw}
67
- ` + fixes[phase],
68
- { phase, spec, cause: String(raw), ...extra },
69
- { cause }
70
- );
71
- }
72
-
73
- // src/bridge-app-vue.ts
74
26
  var appsByEl = /* @__PURE__ */ new WeakMap();
75
27
  var PENDING_MARKER = { __fulgurjsPending: true };
76
28
  function entriesAborted(el) {
@@ -90,7 +42,7 @@ function defineBridgeApp(factory, options = {}) {
90
42
  app.unmount();
91
43
  } catch {
92
44
  }
93
- throw bridgeLifecycleError("mount", "bridge", e instanceof Error ? e : String(e));
45
+ throw e;
94
46
  }
95
47
  appsByEl.set(el, app);
96
48
  void mountOptions;
@@ -102,9 +54,7 @@ function defineBridgeApp(factory, options = {}) {
102
54
  // 则结果丢弃不落挂(迟到初始化不得复活,BN06 同源语义)。
103
55
  mount(el, props, mountOptions) {
104
56
  if (appsByEl.has(el)) {
105
- throw bridgeLifecycleError("mount", "bridge", "\u540C\u4E00\u5BB9\u5668 el \u5DF2\u6302\u8F7D\u672C\u6865\u63A5\u5E94\u7528\uFF08\u5BB9\u5668\u5DF2\u88AB\u5360\u7528\uFF09\u3002", {
106
- reason: "container-occupied"
107
- });
57
+ throw new Error("\u540C\u4E00\u5BB9\u5668 el \u5DF2\u6302\u8F7D\u672C\u6865\u63A5\u5E94\u7528\uFF08\u5BB9\u5668\u5DF2\u88AB\u5360\u7528\uFF09\u3002\u540C\u4E00\u5BB9\u5668\u672A\u5378\u8F7D\u524D\u91CD\u590D mount \u662F\u5951\u7EA6\u8FDD\u4F8B\u2014\u2014\u5148 unmount \u518D mount\u3002");
108
58
  }
109
59
  const snapshot = { ...props ?? {} };
110
60
  const ctx = { signal: mountOptions?.signal, routing: mountOptions?.routing };
@@ -122,7 +72,7 @@ function defineBridgeApp(factory, options = {}) {
122
72
  (e) => {
123
73
  if (entriesAborted(el)) return;
124
74
  appsByEl.delete(el);
125
- throw bridgeLifecycleError("mount", "bridge", e instanceof Error ? e : String(e));
75
+ throw e;
126
76
  }
127
77
  );
128
78
  }
@@ -134,7 +84,7 @@ function defineBridgeApp(factory, options = {}) {
134
84
  } catch {
135
85
  }
136
86
  }
137
- throw bridgeLifecycleError("mount", "bridge", e instanceof Error ? e : String(e));
87
+ throw e;
138
88
  }
139
89
  attach(el, app, mountOptions);
140
90
  },
@@ -146,7 +96,7 @@ function defineBridgeApp(factory, options = {}) {
146
96
  try {
147
97
  app.unmount();
148
98
  } catch (e) {
149
- throw bridgeLifecycleError("unmount", "bridge", e instanceof Error ? e : String(e));
99
+ throw e instanceof Error ? e : new Error(String(e));
150
100
  }
151
101
  }
152
102
  };
@@ -1,6 +1,6 @@
1
1
  import { App } from 'vue';
2
2
  import { BridgeApp } from './bridge-core.cjs';
3
- import { B as BridgeChildRoute } from './bridge-router-core-BRZQYDPm.cjs';
3
+ import { B as BridgeChildRoute } from './bridge-router-core-DWFCVg9B.cjs';
4
4
  import './context.cjs';
5
5
 
6
6
  /**
@@ -11,10 +11,11 @@ import './context.cjs';
11
11
  *
12
12
  * 契约语义(§3.2):
13
13
  * - 契约实例按容器 el 分键(WeakMap):同一契约多处挂载互不干扰;
14
- * - 同一容器未卸载再次 mount → MFU-016(phase: mount,容器已被占用)且不覆盖原实例;
14
+ * - 同一容器未卸载再次 mount → 拒绝(容器占用,原始错误原样抛出)且不覆盖原实例;
15
15
  * - Vue 的 app.mount 同步完成首次渲染,mount 成功即返回 void(首次根提交语义由 Vue 保证);
16
16
  * - mount 抛错时清理已创建的 app(best-effort unmount),不留半挂状态;
17
- * - unmount 未知容器为 no-op;unmount 抛错包装为 MFU-016(phase: unmount)由宿主捕获。
17
+ * - unmount 未知容器为 no-op;mount/unmount 的原始错误**原样抛出**——MFU-016 包装
18
+ * (真实 spec + phase + cause)由宿主适配器在生命周期边界统一完成(见 bridgeHostError)。
18
19
  *
19
20
  * 本文件零 React:/runtime 导入图隔离由 tests/runtime-entry-graph.test.ts 守护。
20
21
  */
@@ -1,6 +1,6 @@
1
1
  import { App } from 'vue';
2
2
  import { BridgeApp } from './bridge-core.js';
3
- import { B as BridgeChildRoute } from './bridge-router-core-BRZQYDPm.js';
3
+ import { B as BridgeChildRoute } from './bridge-router-core-DWFCVg9B.js';
4
4
  import './context.js';
5
5
 
6
6
  /**
@@ -11,10 +11,11 @@ import './context.js';
11
11
  *
12
12
  * 契约语义(§3.2):
13
13
  * - 契约实例按容器 el 分键(WeakMap):同一契约多处挂载互不干扰;
14
- * - 同一容器未卸载再次 mount → MFU-016(phase: mount,容器已被占用)且不覆盖原实例;
14
+ * - 同一容器未卸载再次 mount → 拒绝(容器占用,原始错误原样抛出)且不覆盖原实例;
15
15
  * - Vue 的 app.mount 同步完成首次渲染,mount 成功即返回 void(首次根提交语义由 Vue 保证);
16
16
  * - mount 抛错时清理已创建的 app(best-effort unmount),不留半挂状态;
17
- * - unmount 未知容器为 no-op;unmount 抛错包装为 MFU-016(phase: unmount)由宿主捕获。
17
+ * - unmount 未知容器为 no-op;mount/unmount 的原始错误**原样抛出**——MFU-016 包装
18
+ * (真实 spec + phase + cause)由宿主适配器在生命周期边界统一完成(见 bridgeHostError)。
18
19
  *
19
20
  * 本文件零 React:/runtime 导入图隔离由 tests/runtime-entry-graph.test.ts 守护。
20
21
  */
@@ -1,8 +1,3 @@
1
- import {
2
- bridgeLifecycleError
3
- } from "./chunk-HZGQOW35.js";
4
- import "./chunk-OF2JCXTZ.js";
5
-
6
1
  // src/bridge-app-vue.ts
7
2
  var appsByEl = /* @__PURE__ */ new WeakMap();
8
3
  var PENDING_MARKER = { __fulgurjsPending: true };
@@ -23,7 +18,7 @@ function defineBridgeApp(factory, options = {}) {
23
18
  app.unmount();
24
19
  } catch {
25
20
  }
26
- throw bridgeLifecycleError("mount", "bridge", e instanceof Error ? e : String(e));
21
+ throw e;
27
22
  }
28
23
  appsByEl.set(el, app);
29
24
  void mountOptions;
@@ -35,9 +30,7 @@ function defineBridgeApp(factory, options = {}) {
35
30
  // 则结果丢弃不落挂(迟到初始化不得复活,BN06 同源语义)。
36
31
  mount(el, props, mountOptions) {
37
32
  if (appsByEl.has(el)) {
38
- throw bridgeLifecycleError("mount", "bridge", "\u540C\u4E00\u5BB9\u5668 el \u5DF2\u6302\u8F7D\u672C\u6865\u63A5\u5E94\u7528\uFF08\u5BB9\u5668\u5DF2\u88AB\u5360\u7528\uFF09\u3002", {
39
- reason: "container-occupied"
40
- });
33
+ throw new Error("\u540C\u4E00\u5BB9\u5668 el \u5DF2\u6302\u8F7D\u672C\u6865\u63A5\u5E94\u7528\uFF08\u5BB9\u5668\u5DF2\u88AB\u5360\u7528\uFF09\u3002\u540C\u4E00\u5BB9\u5668\u672A\u5378\u8F7D\u524D\u91CD\u590D mount \u662F\u5951\u7EA6\u8FDD\u4F8B\u2014\u2014\u5148 unmount \u518D mount\u3002");
41
34
  }
42
35
  const snapshot = { ...props ?? {} };
43
36
  const ctx = { signal: mountOptions?.signal, routing: mountOptions?.routing };
@@ -55,7 +48,7 @@ function defineBridgeApp(factory, options = {}) {
55
48
  (e) => {
56
49
  if (entriesAborted(el)) return;
57
50
  appsByEl.delete(el);
58
- throw bridgeLifecycleError("mount", "bridge", e instanceof Error ? e : String(e));
51
+ throw e;
59
52
  }
60
53
  );
61
54
  }
@@ -67,7 +60,7 @@ function defineBridgeApp(factory, options = {}) {
67
60
  } catch {
68
61
  }
69
62
  }
70
- throw bridgeLifecycleError("mount", "bridge", e instanceof Error ? e : String(e));
63
+ throw e;
71
64
  }
72
65
  attach(el, app, mountOptions);
73
66
  },
@@ -79,7 +72,7 @@ function defineBridgeApp(factory, options = {}) {
79
72
  try {
80
73
  app.unmount();
81
74
  } catch (e) {
82
- throw bridgeLifecycleError("unmount", "bridge", e instanceof Error ? e : String(e));
75
+ throw e instanceof Error ? e : new Error(String(e));
83
76
  }
84
77
  }
85
78
  };
@@ -22,6 +22,12 @@ interface BridgeHostNavigation {
22
22
  }
23
23
  /** 子应用路由通道(桥接宿主按挂载代次创建,随 mount 第三参数交给子应用) */
24
24
  interface BridgeChildRoute {
25
+ /**
26
+ * 远程 spec(宿主创建通道时标注,如 "remote-b/bridge");子应用路由接线
27
+ * (connectVueBridgeRouter/createReactBridgeRouter)的诊断错误用它定位真实远程,
28
+ * 缺省(纯 memory 小部件自建通道)回退 'child-router'。
29
+ */
30
+ readonly spec?: string;
25
31
  getLocation(): BridgeLocation;
26
32
  subscribe(listener: (location: BridgeLocation) => void): () => void;
27
33
  navigate(target: BridgeLocation, action: 'push' | 'replace'): Promise<BridgeNavigationResult>;
@@ -1,5 +1,5 @@
1
1
  import { AppContext } from './context.cjs';
2
- import { a as BridgeMountOptions, b as BridgeRoutingProtocol } from './bridge-router-core-BRZQYDPm.cjs';
2
+ import { a as BridgeMountOptions, b as BridgeRoutingProtocol } from './bridge-router-core-DWFCVg9B.cjs';
3
3
 
4
4
  /** 子应用桥接契约(远程 ./bridge 模块的默认导出;任务书 §3.2) */
5
5
  interface BridgeApp {
@@ -1,5 +1,5 @@
1
1
  import { AppContext } from './context.js';
2
- import { a as BridgeMountOptions, b as BridgeRoutingProtocol } from './bridge-router-core-BRZQYDPm.js';
2
+ import { a as BridgeMountOptions, b as BridgeRoutingProtocol } from './bridge-router-core-DWFCVg9B.js';
3
3
 
4
4
  /** 子应用桥接契约(远程 ./bridge 模块的默认导出;任务书 §3.2) */
5
5
  interface BridgeApp {
@@ -6,8 +6,8 @@ import {
6
6
  releaseBridgeSession,
7
7
  resolveBridgeContext,
8
8
  withBridgeTimeout
9
- } from "./chunk-RXXBTPAY.js";
10
- import "./chunk-HZGQOW35.js";
9
+ } from "./chunk-Q6V5O5Y6.js";
10
+ import "./chunk-WRJG2YG6.js";
11
11
  import "./chunk-TSYLDY6H.js";
12
12
  import "./chunk-OF2JCXTZ.js";
13
13
  export {
@@ -21,6 +21,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var bridge_errors_exports = {};
22
22
  __export(bridge_errors_exports, {
23
23
  BridgeErrorCodes: () => BridgeErrorCodes,
24
+ bridgeHostError: () => bridgeHostError,
24
25
  bridgeLifecycleError: () => bridgeLifecycleError,
25
26
  bridgeSessionMismatchError: () => bridgeSessionMismatchError,
26
27
  invalidBridgeContractError: () => invalidBridgeContractError,
@@ -93,6 +94,10 @@ function bridgeLifecycleError(phase, spec, cause, extra) {
93
94
  { cause }
94
95
  );
95
96
  }
97
+ function bridgeHostError(phase, spec, cause) {
98
+ if (cause instanceof FgError) return cause;
99
+ return bridgeLifecycleError(phase, spec, cause instanceof Error ? cause : String(cause));
100
+ }
96
101
  function bridgeSessionMismatchError(spec, controlled, actual, extra) {
97
102
  const actualText = actual === void 0 ? "undefined\uFF08\u9875\u9762\u5C1A\u65E0 AppContext\uFF09" : typeof actual === "string" ? `"${actual}"` : String(actual);
98
103
  return new FgError(
@@ -156,6 +161,7 @@ function routingSyncError(spec, reason, chain, cause) {
156
161
  // Annotate the CommonJS export names for ESM import in node:
157
162
  0 && (module.exports = {
158
163
  BridgeErrorCodes,
164
+ bridgeHostError,
159
165
  bridgeLifecycleError,
160
166
  bridgeSessionMismatchError,
161
167
  invalidBridgeContractError,
@@ -36,6 +36,14 @@ type BridgePhase = 'getContext' | 'mount' | 'unmount';
36
36
  declare function invalidBridgeContractError(spec: string, mod: unknown): FgError;
37
37
  /** MFU-016:桥接准备(getContext)或生命周期(mount/unmount)失败;cause 保留原始错误 */
38
38
  declare function bridgeLifecycleError(phase: BridgePhase, spec: string, cause: unknown, extra?: Record<string, unknown>): FgError;
39
+ /**
40
+ * 宿主适配器的 MFU-016 单点包装(5.5.0 起):
41
+ * 子应用适配器(defineBridgeApp)原样抛出 mount/unmount 的原始错误——此前子侧预包装
42
+ * spec 只能是占位 'bridge',宿主再包一次造成「spec 失真 + cause 双重包装」的误导诊断。
43
+ * 宿主在生命周期边界统一包装:真实 spec + phase + 原始 cause 只包装一次;
44
+ * 已是本插件诊断(FgError)的错误原样保留,不重复包装。
45
+ */
46
+ declare function bridgeHostError(phase: BridgePhase, spec: string, cause: unknown): FgError;
39
47
  /** MFU-017:受控 sessionKey 与当前 AppContext / 活跃桥接会话不一致 */
40
48
  declare function bridgeSessionMismatchError(spec: string, controlled: string, actual: unknown, extra?: Record<string, unknown>): FgError;
41
49
  /** MFU-017:受控 sessionKey 值本身非法(空字符串/数字等,非 undefined/null/非空字符串) */
@@ -49,4 +57,4 @@ declare function routingNavigationError(spec: string, reason: string): FgError;
49
57
  /** MFU-033:路由准备/同步失败(重定向循环等;不伪装成功也不静默回退 memory) */
50
58
  declare function routingSyncError(spec: string, reason: string, chain: string[], cause?: unknown): FgError;
51
59
 
52
- export { BridgeErrorCodes, type BridgePhase, bridgeLifecycleError, bridgeSessionMismatchError, invalidBridgeContractError, invalidSessionKeyError, routingConfigError, routingNavigationError, routingProtocolError, routingSyncError };
60
+ export { BridgeErrorCodes, type BridgePhase, bridgeHostError, bridgeLifecycleError, bridgeSessionMismatchError, invalidBridgeContractError, invalidSessionKeyError, routingConfigError, routingNavigationError, routingProtocolError, routingSyncError };
@@ -36,6 +36,14 @@ type BridgePhase = 'getContext' | 'mount' | 'unmount';
36
36
  declare function invalidBridgeContractError(spec: string, mod: unknown): FgError;
37
37
  /** MFU-016:桥接准备(getContext)或生命周期(mount/unmount)失败;cause 保留原始错误 */
38
38
  declare function bridgeLifecycleError(phase: BridgePhase, spec: string, cause: unknown, extra?: Record<string, unknown>): FgError;
39
+ /**
40
+ * 宿主适配器的 MFU-016 单点包装(5.5.0 起):
41
+ * 子应用适配器(defineBridgeApp)原样抛出 mount/unmount 的原始错误——此前子侧预包装
42
+ * spec 只能是占位 'bridge',宿主再包一次造成「spec 失真 + cause 双重包装」的误导诊断。
43
+ * 宿主在生命周期边界统一包装:真实 spec + phase + 原始 cause 只包装一次;
44
+ * 已是本插件诊断(FgError)的错误原样保留,不重复包装。
45
+ */
46
+ declare function bridgeHostError(phase: BridgePhase, spec: string, cause: unknown): FgError;
39
47
  /** MFU-017:受控 sessionKey 与当前 AppContext / 活跃桥接会话不一致 */
40
48
  declare function bridgeSessionMismatchError(spec: string, controlled: string, actual: unknown, extra?: Record<string, unknown>): FgError;
41
49
  /** MFU-017:受控 sessionKey 值本身非法(空字符串/数字等,非 undefined/null/非空字符串) */
@@ -49,4 +57,4 @@ declare function routingNavigationError(spec: string, reason: string): FgError;
49
57
  /** MFU-033:路由准备/同步失败(重定向循环等;不伪装成功也不静默回退 memory) */
50
58
  declare function routingSyncError(spec: string, reason: string, chain: string[], cause?: unknown): FgError;
51
59
 
52
- export { BridgeErrorCodes, type BridgePhase, bridgeLifecycleError, bridgeSessionMismatchError, invalidBridgeContractError, invalidSessionKeyError, routingConfigError, routingNavigationError, routingProtocolError, routingSyncError };
60
+ export { BridgeErrorCodes, type BridgePhase, bridgeHostError, bridgeLifecycleError, bridgeSessionMismatchError, invalidBridgeContractError, invalidSessionKeyError, routingConfigError, routingNavigationError, routingProtocolError, routingSyncError };
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  BridgeErrorCodes,
3
+ bridgeHostError,
3
4
  bridgeLifecycleError,
4
5
  bridgeSessionMismatchError,
5
6
  invalidBridgeContractError,
@@ -8,10 +9,11 @@ import {
8
9
  routingNavigationError,
9
10
  routingProtocolError,
10
11
  routingSyncError
11
- } from "./chunk-HZGQOW35.js";
12
+ } from "./chunk-WRJG2YG6.js";
12
13
  import "./chunk-OF2JCXTZ.js";
13
14
  export {
14
15
  BridgeErrorCodes,
16
+ bridgeHostError,
15
17
  bridgeLifecycleError,
16
18
  bridgeSessionMismatchError,
17
19
  invalidBridgeContractError,
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- import { A as AppContext } from './bridge-core-ejlY9ddN.js';
2
+ import { A as AppContext } from './bridge-core-D37VanBl.js';
3
3
 
4
4
  /**
5
5
  * React 宿主桥接工厂(/bridge、/bridge/react 导出 createReactBridgeApp;任务书 §3.4)。
@@ -119,6 +119,10 @@ function bridgeLifecycleError(phase, spec, cause, extra) {
119
119
  { cause }
120
120
  );
121
121
  }
122
+ function bridgeHostError(phase, spec, cause) {
123
+ if (cause instanceof FgError) return cause;
124
+ return bridgeLifecycleError(phase, spec, cause instanceof Error ? cause : String(cause));
125
+ }
122
126
  function bridgeSessionMismatchError(spec, controlled, actual, extra) {
123
127
  const actualText = actual === void 0 ? "undefined\uFF08\u9875\u9762\u5C1A\u65E0 AppContext\uFF09" : typeof actual === "string" ? `"${actual}"` : String(actual);
124
128
  return new FgError(
@@ -353,6 +357,7 @@ function assertBridgeRoutingProtocol(spec, contract) {
353
357
  var RoutingChannel = class {
354
358
  id;
355
359
  basePath;
360
+ /** 远程 spec(诊断错误定位真实远程用;随通道暴露给子应用路由接线) */
356
361
  spec;
357
362
  host;
358
363
  listeners = /* @__PURE__ */ new Set();
@@ -674,7 +679,11 @@ function createReactBridgeAppWithLoader(loadRemote) {
674
679
  channelRef.current = new RoutingChannel(`bridge-react:${spec}:${myGen}`, routing.basePath, routing.navigation, spec);
675
680
  mountOptions = { signal: abortRef.current.signal, routing: channelRef.current };
676
681
  }
677
- await contract.mount(el, { ...latest.current.appProps ?? {} }, mountOptions);
682
+ try {
683
+ await contract.mount(el, { ...latest.current.appProps ?? {} }, mountOptions);
684
+ } catch (mountError) {
685
+ throw bridgeHostError("mount", spec, mountError);
686
+ }
678
687
  if (generationRef.current !== myGen) return;
679
688
  setStatus("ready");
680
689
  } catch (e) {
@@ -694,7 +703,7 @@ function createReactBridgeAppWithLoader(loadRemote) {
694
703
  try {
695
704
  c.unmount(el);
696
705
  } catch (e) {
697
- const err = bridgeLifecycleError("unmount", spec, e instanceof Error ? e : String(e));
706
+ const err = bridgeHostError("unmount", spec, e);
698
707
  console.error("[fulgurjs] \u6865\u63A5\u5E94\u7528\u5378\u8F7D\u5931\u8D25\uFF1A", err);
699
708
  blockedRef.current = true;
700
709
  setError(err);
@@ -1,6 +1,6 @@
1
1
  import { ReactNode, ComponentType } from 'react';
2
2
  import { AppContext } from './context.cjs';
3
- import { c as BridgeHostRouting } from './bridge-router-core-BRZQYDPm.cjs';
3
+ import { c as BridgeHostRouting } from './bridge-router-core-DWFCVg9B.cjs';
4
4
 
5
5
  /**
6
6
  * React 宿主桥接工厂(/bridge、/bridge/react 导出 createReactBridgeApp;任务书 §3.4)。
@@ -1,6 +1,6 @@
1
1
  import { ReactNode, ComponentType } from 'react';
2
2
  import { AppContext } from './context.js';
3
- import { c as BridgeHostRouting } from './bridge-router-core-BRZQYDPm.js';
3
+ import { c as BridgeHostRouting } from './bridge-router-core-DWFCVg9B.js';
4
4
 
5
5
  /**
6
6
  * React 宿主桥接工厂(/bridge、/bridge/react 导出 createReactBridgeApp;任务书 §3.4)。