@fulgurjs/federation 5.4.2 → 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.
- package/CHANGELOG.md +20 -0
- package/dist/bridge-app-react.cjs +6 -58
- package/dist/bridge-app-react.d.cts +1 -1
- package/dist/bridge-app-react.d.ts +1 -1
- package/dist/bridge-app-react.js +6 -15
- package/dist/bridge-app-vue.cjs +5 -55
- package/dist/bridge-app-vue.d.cts +4 -3
- package/dist/bridge-app-vue.d.ts +4 -3
- package/dist/bridge-app-vue.js +5 -12
- package/dist/{bridge-core-ejlY9ddN.d.ts → bridge-core-D37VanBl.d.ts} +6 -0
- package/dist/bridge-core.d.cts +1 -1
- package/dist/bridge-core.d.ts +1 -1
- package/dist/bridge-core.js +2 -2
- package/dist/bridge-errors.cjs +6 -0
- package/dist/bridge-errors.d.cts +9 -1
- package/dist/bridge-errors.d.ts +9 -1
- package/dist/bridge-errors.js +3 -1
- package/dist/{bridge-host-react-Bua1TCVh.d.ts → bridge-host-react-CGymCzD2.d.ts} +1 -1
- package/dist/bridge-host-react.cjs +11 -2
- package/dist/bridge-host-react.d.cts +1 -1
- package/dist/bridge-host-react.d.ts +1 -1
- package/dist/bridge-host-react.js +10 -6
- package/dist/{bridge-host-vue-Dd1kkwDb.d.ts → bridge-host-vue-B3GHaQAC.d.ts} +1 -1
- package/dist/bridge-host-vue.cjs +11 -2
- package/dist/bridge-host-vue.js +10 -6
- package/dist/bridge-react.d.ts +4 -4
- package/dist/{bridge-router-core-BRZQYDPm.d.ts → bridge-router-core-DWFCVg9B.d.cts} +6 -0
- package/dist/{bridge-router-core-BRZQYDPm.d.cts → bridge-router-core-DWFCVg9B.d.ts} +6 -0
- package/dist/bridge-router-react.d.ts +6 -0
- package/dist/bridge-router-react.js +13 -3
- package/dist/bridge-router-vue.d.ts +7 -1
- package/dist/bridge-router-vue.js +22 -5
- package/dist/bridge-vue.d.ts +2 -2
- package/dist/bridge.d.ts +5 -5
- package/dist/{chunk-UFWZPE36.js → chunk-CI54BRPO.js} +12 -2
- package/dist/{chunk-43UX3UZE.js → chunk-E3VEP6LN.js} +8 -4
- package/dist/{chunk-RXXBTPAY.js → chunk-Q6V5O5Y6.js} +1 -1
- package/dist/{chunk-KT3YARK5.js → chunk-TU6DMGDA.js} +8 -4
- package/dist/{chunk-HZGQOW35.js → chunk-WRJG2YG6.js} +5 -0
- package/dist/{chunk-7CQOVLSI.js → chunk-YKIFZIBH.js} +2 -1
- package/dist/index.cjs +125 -4
- package/dist/index.js +125 -4
- package/dist/react.d.ts +6 -0
- package/dist/runtime-entry.d.ts +9 -2
- package/dist/runtime.js +8 -8
- package/examples/bridge/react-host/package-lock.json +4 -4
- package/examples/bridge/react-host/package.json +1 -1
- package/examples/bridge/react-remote/package-lock.json +4 -4
- package/examples/bridge/react-remote/package.json +1 -1
- package/examples/bridge/vue-host/package-lock.json +4 -4
- package/examples/bridge/vue-host/package.json +1 -1
- package/examples/bridge/vue-remote/package-lock.json +4 -4
- package/examples/bridge/vue-remote/package.json +1 -1
- package/examples/react/host/package-lock.json +4 -4
- package/examples/react/host/package.json +1 -1
- package/examples/react/remote/package-lock.json +4 -4
- package/examples/react/remote/package.json +1 -1
- package/examples/vue/host/package-lock.json +4 -4
- package/examples/vue/host/package.json +1 -1
- package/examples/vue/remote/package-lock.json +4 -4
- package/examples/vue/remote/package.json +1 -1
- 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
|
|
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
|
|
71
|
+
throw e instanceof Error ? e : new Error(String(e));
|
|
122
72
|
}
|
|
123
73
|
if (element === null || typeof element !== "object") {
|
|
124
|
-
throw
|
|
125
|
-
"
|
|
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(
|
|
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
|
|
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-
|
|
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-
|
|
3
|
+
import { B as BridgeChildRoute } from './bridge-router-core-DWFCVg9B.js';
|
|
4
4
|
import './context.js';
|
|
5
5
|
|
|
6
6
|
/**
|
package/dist/bridge-app-react.js
CHANGED
|
@@ -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
|
|
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
|
|
37
|
+
throw e instanceof Error ? e : new Error(String(e));
|
|
45
38
|
}
|
|
46
39
|
if (element === null || typeof element !== "object") {
|
|
47
|
-
throw
|
|
48
|
-
"
|
|
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(
|
|
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
|
|
101
|
+
throw e instanceof Error ? e : new Error(String(e));
|
|
111
102
|
}
|
|
112
103
|
}
|
|
113
104
|
};
|
package/dist/bridge-app-vue.cjs
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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 →
|
|
14
|
+
* - 同一容器未卸载再次 mount → 拒绝(容器占用,原始错误原样抛出)且不覆盖原实例;
|
|
15
15
|
* - Vue 的 app.mount 同步完成首次渲染,mount 成功即返回 void(首次根提交语义由 Vue 保证);
|
|
16
16
|
* - mount 抛错时清理已创建的 app(best-effort unmount),不留半挂状态;
|
|
17
|
-
* - unmount 未知容器为 no-op;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
|
*/
|
package/dist/bridge-app-vue.d.ts
CHANGED
|
@@ -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-
|
|
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 →
|
|
14
|
+
* - 同一容器未卸载再次 mount → 拒绝(容器占用,原始错误原样抛出)且不覆盖原实例;
|
|
15
15
|
* - Vue 的 app.mount 同步完成首次渲染,mount 成功即返回 void(首次根提交语义由 Vue 保证);
|
|
16
16
|
* - mount 抛错时清理已创建的 app(best-effort unmount),不留半挂状态;
|
|
17
|
-
* - unmount 未知容器为 no-op;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
|
*/
|
package/dist/bridge-app-vue.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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>;
|
package/dist/bridge-core.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AppContext } from './context.cjs';
|
|
2
|
-
import { a as BridgeMountOptions, b as BridgeRoutingProtocol } from './bridge-router-core-
|
|
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 {
|
package/dist/bridge-core.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AppContext } from './context.js';
|
|
2
|
-
import { a as BridgeMountOptions, b as BridgeRoutingProtocol } from './bridge-router-core-
|
|
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 {
|
package/dist/bridge-core.js
CHANGED
|
@@ -6,8 +6,8 @@ import {
|
|
|
6
6
|
releaseBridgeSession,
|
|
7
7
|
resolveBridgeContext,
|
|
8
8
|
withBridgeTimeout
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
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 {
|
package/dist/bridge-errors.cjs
CHANGED
|
@@ -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,
|
package/dist/bridge-errors.d.cts
CHANGED
|
@@ -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 };
|
package/dist/bridge-errors.d.ts
CHANGED
|
@@ -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 };
|
package/dist/bridge-errors.js
CHANGED
|
@@ -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-
|
|
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,
|
|
@@ -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
|
-
|
|
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 =
|
|
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-
|
|
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-
|
|
3
|
+
import { c as BridgeHostRouting } from './bridge-router-core-DWFCVg9B.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* React 宿主桥接工厂(/bridge、/bridge/react 导出 createReactBridgeApp;任务书 §3.4)。
|