@axewo/fin-micro 1.0.0 → 2.0.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 (68) hide show
  1. package/README.md +101 -3
  2. package/dist/browser.cjs +1 -1
  3. package/dist/browser.mjs +68 -66
  4. package/dist/core.cjs +1 -1
  5. package/dist/core.mjs +447 -433
  6. package/dist/index.cjs +1 -1
  7. package/dist/index.mjs +31 -24
  8. package/dist/{router-view-impl-C1KG6mxu.mjs → router-view-impl-B1NzCGKV.mjs} +18 -18
  9. package/dist/router-view-impl-BvOToV_Z.cjs +1 -0
  10. package/dist/runtime.cjs +1 -1
  11. package/dist/runtime.mjs +40 -39
  12. package/dist/sdk.cjs +1 -1
  13. package/dist/sdk.mjs +92 -56
  14. package/dist/types/browser/index.d.ts +4 -0
  15. package/dist/types/core/index.d.ts +1 -1
  16. package/dist/types/index.d.ts +2 -0
  17. package/dist/types/runtime/lifecycle.d.ts +1 -1
  18. package/dist/types/sdk/index.d.ts +63 -4
  19. package/dist/types/vue/index.d.ts +13 -2
  20. package/dist/types/vue/router-view-impl.d.ts +1 -1
  21. package/dist/vue.cjs +1 -1
  22. package/dist/vue.mjs +49 -35
  23. package/package.json +2 -2
  24. package/scaffold/base/package.json.template +5 -1
  25. package/scaffold/base/scripts/check-runtime.mjs +43 -0
  26. package/scaffold/base/src/locales/en.ts +12 -0
  27. package/scaffold/base/src/locales/index.ts +7 -1
  28. package/scaffold/base/src/locales/zh-CN.ts +12 -0
  29. package/scaffold/base/src/main.ts +13 -5
  30. package/scaffold/base/src/router/demo.ts +6 -0
  31. package/scaffold/base/src/router/index.ts +13 -0
  32. package/scaffold/base/src/stores/demo.ts +12 -0
  33. package/scaffold/base/src/stores/index.ts +11 -0
  34. package/scaffold/base/src/utils/appConfig.ts +49 -0
  35. package/scaffold/base/src/utils/errorUtils.ts +92 -0
  36. package/scaffold/base/src/utils/requestUtils.ts +32 -11
  37. package/scaffold/base/src/views/DemoView.vue +26 -0
  38. package/scaffold/host/.env.example +11 -3
  39. package/scaffold/host/src/App.vue +1 -13
  40. package/scaffold/host/src/bootstrap.ts +40 -8
  41. package/scaffold/host/src/hooks/usePlatformSession.ts +40 -8
  42. package/scaffold/host/src/layout/HostHeader.vue +65 -5
  43. package/scaffold/host/src/layout/HostLayout.vue +65 -21
  44. package/scaffold/host/src/layout/HostMenu.vue +1 -0
  45. package/scaffold/host/src/layout/HostTabs.vue +41 -8
  46. package/scaffold/host/src/layout/HostWorkspace.vue +19 -7
  47. package/scaffold/host/src/localPages.ts +45 -0
  48. package/scaffold/host/src/platform.ts +41 -10
  49. package/scaffold/host/src/router/guards.ts +128 -0
  50. package/scaffold/host/src/router/index.ts +25 -0
  51. package/scaffold/host/src/router/targets.ts +30 -0
  52. package/scaffold/host/src/router/workspace.ts +63 -0
  53. package/scaffold/host/src/styles/shell.css +761 -0
  54. package/scaffold/host/src/utils/request.ts +30 -3
  55. package/scaffold/host/src/views/HomeView.vue +19 -0
  56. package/scaffold/host/src/views/LoginRoute.vue +16 -0
  57. package/scaffold/host/src/views/LoginView.vue +59 -9
  58. package/scaffold/host/src/views/NotFoundView.vue +1 -0
  59. package/scaffold/host/src/views/ProfileView.vue +24 -0
  60. package/scaffold/host/src/views/WorkspaceRoute.vue +11 -0
  61. package/scaffold/vue/src/bootstrap.ts +18 -22
  62. package/scaffold/vue/src/bridge/auth.ts +23 -0
  63. package/scaffold/vue/src/bridge/session.ts +2 -2
  64. package/scaffold/vue/src/main.ts +5 -2
  65. package/scaffold/vue/src/router/index.ts +2 -0
  66. package/scaffold/vue/src/views/DetailView.vue +14 -5
  67. package/scaffold/vue/src/views/ListView.vue +9 -5
  68. package/dist/router-view-impl-CgLEalx4.cjs +0 -1
package/dist/core.mjs CHANGED
@@ -1,26 +1,26 @@
1
- import { createNotificationBus as Ve, NavigationError as w, HostCallError as N } from "./sdk.mjs";
2
- function Ue(xe, R = {}) {
3
- var Oe;
4
- const Y = /* @__PURE__ */ new Map(), Ie = /* @__PURE__ */ new Map(), _ = (t) => typeof t == "string" && !!t.trim() && !/[\u0000-\u001f\u007f]/.test(t), fe = (t) => _(t) && t.startsWith("/") && !t.startsWith("//") && !t.includes("\\"), ye = (t) => t.split(/[?#]/, 1)[0];
5
- for (const t of xe) {
6
- let r = function(c) {
7
- if (!Array.isArray(c)) throw new Error("menus 必须为数组");
1
+ import { createNotificationBus as We, NavigationError as p, HostCallError as N } from "./sdk.mjs";
2
+ function qe(Re, x = {}) {
3
+ var Ae;
4
+ const Z = /* @__PURE__ */ new Map(), pe = /* @__PURE__ */ new Map(), z = (e) => typeof e == "string" && !!e.trim() && !/[\u0000-\u001f\u007f]/.test(e), de = (e) => z(e) && e.startsWith("/") && !e.startsWith("//") && !e.includes("\\"), we = (e) => e.split(/[?#]/, 1)[0];
5
+ for (const e of Re) {
6
+ let s = function(r) {
7
+ if (!Array.isArray(r)) throw new Error("menus 必须为数组");
8
8
  return Object.freeze(
9
- c.map((i) => {
10
- if (!i || !_(i.menuId) || !_(i.name) || p.has(i.menuId))
9
+ r.map((i) => {
10
+ if (!i || !z(i.menuId) || !z(i.name) || c.has(i.menuId))
11
11
  throw new Error("菜单标识/名称无效或菜单标识重复");
12
- if (p.add(i.menuId), i.children !== void 0) {
12
+ if (c.add(i.menuId), i.children !== void 0) {
13
13
  if (i.target !== void 0 || !Array.isArray(i.children) || !i.children.length)
14
14
  throw new Error("菜单分组需要非空 children 且不能配置 target");
15
15
  return Object.freeze({
16
16
  menuId: i.menuId,
17
17
  name: i.name,
18
- children: r(i.children)
18
+ children: s(i.children)
19
19
  });
20
20
  }
21
- if (!i.target || !_(i.target.tabId) || !fe(i.target.route))
21
+ if (!i.target || !z(i.target.tabId) || !de(i.target.route))
22
22
  throw new Error("菜单叶节点需要有效 target");
23
- return h.add(i.menuId), u.push({ pathPrefix: ye(i.target.route), menuId: i.menuId }), Object.freeze({
23
+ return h.add(i.menuId), b.push({ pathPrefix: we(i.target.route), menuId: i.menuId }), Object.freeze({
24
24
  menuId: i.menuId,
25
25
  name: i.name,
26
26
  target: Object.freeze({ tabId: i.target.tabId, route: i.target.route })
@@ -28,613 +28,627 @@ function Ue(xe, R = {}) {
28
28
  })
29
29
  );
30
30
  };
31
- if (Y.has(t.appId)) throw new Error(`重复的 appId: ${t.appId}`);
32
- const a = new URL(t.entry);
33
- if (!["http:", "https:"].includes(a.protocol)) throw new Error("子应用地址必须使用 HTTP(S)");
34
- const p = /* @__PURE__ */ new Set(), h = /* @__PURE__ */ new Set(), u = [], e = t.menus === void 0 ? void 0 : r(t.menus);
35
- if (t.menuRoutes !== void 0 && !Array.isArray(t.menuRoutes))
31
+ if (Z.has(e.appId)) throw new Error(`重复的 appId: ${e.appId}`);
32
+ if (e.kind === "local") {
33
+ if (e.entry !== void 0) throw new Error("本地应用不能配置 entry");
34
+ } else {
35
+ if (e.kind !== void 0 && e.kind !== "remote") throw new Error("未知应用类型");
36
+ const r = new URL(e.entry);
37
+ if (!["http:", "https:"].includes(r.protocol)) throw new Error("子应用地址必须使用 HTTP(S)");
38
+ }
39
+ const c = /* @__PURE__ */ new Set(), h = /* @__PURE__ */ new Set(), b = [], u = e.menus === void 0 ? void 0 : s(e.menus);
40
+ if (e.menuRoutes !== void 0 && !Array.isArray(e.menuRoutes))
36
41
  throw new Error("menuRoutes 必须为数组");
37
- const l = (Oe = t.menuRoutes) == null ? void 0 : Oe.map((c) => {
38
- if (!c || !fe(c.pathPrefix) || /[?#]/.test(c.pathPrefix) || !h.has(c.menuId))
42
+ const o = (Ae = e.menuRoutes) == null ? void 0 : Ae.map((r) => {
43
+ if (!r || !de(r.pathPrefix) || /[?#]/.test(r.pathPrefix) || !h.has(r.menuId))
39
44
  throw new Error("菜单归属规则需要有效路径与本应用可导航叶节点");
40
- return Object.freeze({ pathPrefix: c.pathPrefix, menuId: c.menuId });
45
+ return Object.freeze({ pathPrefix: r.pathPrefix, menuId: r.menuId });
41
46
  });
42
- u.push(...(l ?? []).map((c) => ({ ...c })));
43
- const s = /* @__PURE__ */ new Map();
44
- for (const c of u) {
45
- if (c.pathPrefix = c.pathPrefix.replace(/\/+$/, "") || "/", s.has(c.pathPrefix) && s.get(c.pathPrefix) !== c.menuId)
47
+ b.push(...(o ?? []).map((r) => ({ ...r })));
48
+ const t = /* @__PURE__ */ new Map();
49
+ for (const r of b) {
50
+ if (r.pathPrefix = r.pathPrefix.replace(/\/+$/, "") || "/", t.has(r.pathPrefix) && t.get(r.pathPrefix) !== r.menuId)
46
51
  throw new Error("菜单归属前缀冲突");
47
- s.set(c.pathPrefix, c.menuId);
52
+ t.set(r.pathPrefix, r.menuId);
48
53
  }
49
- Ie.set(t.appId, {
54
+ pe.set(e.appId, {
50
55
  leaves: h,
51
- routes: u.sort((c, i) => i.pathPrefix.length - c.pathPrefix.length)
52
- }), Y.set(
53
- t.appId,
56
+ routes: b.sort((r, i) => i.pathPrefix.length - r.pathPrefix.length)
57
+ }), Z.set(
58
+ e.appId,
54
59
  Object.freeze({
55
- appId: t.appId,
56
- name: t.name,
57
- entry: t.entry,
58
- ...e ? { menus: e } : {},
59
- ...l ? { menuRoutes: Object.freeze(l) } : {}
60
+ appId: e.appId,
61
+ name: e.name,
62
+ ...e.kind === "local" ? { kind: "local" } : { ...e.kind ? { kind: e.kind } : {}, entry: e.entry },
63
+ ...u ? { menus: u } : {},
64
+ ...o ? { menuRoutes: Object.freeze(o) } : {}
60
65
  })
61
66
  );
62
67
  }
63
- const ne = Ve(), Ne = Object.freeze({ source: "host" }), de = {
64
- on(t, r) {
65
- return ne.on(t, ({ payload: a, metadata: p }) => G(() => r(a, p)));
68
+ const ae = We(), xe = Object.freeze({ source: "host" }), le = {
69
+ on(e, s) {
70
+ return ae.on(e, ({ payload: c, metadata: h }) => q(() => s(c, h)));
66
71
  },
67
- emit(t, r) {
68
- ne.emit(t, { payload: r, metadata: Ne });
72
+ emit(e, s) {
73
+ ae.emit(e, { payload: s, metadata: xe });
69
74
  },
70
- clear: () => ne.clear()
71
- }, se = R.callTimeoutMs ?? 3e4;
72
- if (!Number.isFinite(se) || se <= 0 || se > 2147483647)
75
+ clear: () => ae.clear()
76
+ }, ie = x.callTimeoutMs ?? 3e4;
77
+ if (!Number.isFinite(ie) || ie <= 0 || ie > 2147483647)
73
78
  throw new Error("callTimeoutMs 必须为不超过2147483647的正有限数");
74
- const J = /* @__PURE__ */ new Set();
75
- function we(t, r) {
76
- if (!t || typeof t.authenticated != "boolean" || !Array.isArray(t.permissions) || !t.permissions.every((a) => typeof a == "string") || t.user !== void 0 && (!t.user || typeof t.user.id != "string" || t.user.name !== void 0 && typeof t.user.name != "string"))
79
+ const K = /* @__PURE__ */ new Set();
80
+ function ke(e, s) {
81
+ if (!e || typeof e.authenticated != "boolean" || !Array.isArray(e.permissions) || !e.permissions.every((c) => typeof c == "string") || e.user !== void 0 && (!e.user || typeof e.user.id != "string" || e.user.name !== void 0 && typeof e.user.name != "string"))
77
82
  throw new Error("会话快照无效");
78
83
  return Object.freeze({
79
- authenticated: t.authenticated,
80
- permissions: Object.freeze([...t.permissions]),
81
- ...t.user ? { user: Object.freeze({ id: t.user.id, ...t.user.name !== void 0 ? { name: t.user.name } : {} }) } : {},
82
- revision: r
84
+ authenticated: e.authenticated,
85
+ permissions: Object.freeze([...e.permissions]),
86
+ ...e.user ? { user: Object.freeze({ id: e.user.id, ...e.user.name !== void 0 ? { name: e.user.name } : {} }) } : {},
87
+ revision: s
83
88
  });
84
89
  }
85
- let Q = we(R.session ?? { authenticated: !1, permissions: [] }, 0);
86
- function ze(t) {
87
- x(), Q = we(t, Q.revision + 1);
88
- const r = Q;
89
- for (const a of [...J]) {
90
- if (r !== Q) break;
91
- J.has(a) && G(() => a(r));
90
+ let ee = ke(x.session ?? { authenticated: !1, permissions: [] }, 0);
91
+ function ze(e) {
92
+ j(), ee = ke(e, ee.revision + 1);
93
+ const s = ee;
94
+ for (const c of [...K]) {
95
+ if (s !== ee) break;
96
+ K.has(c) && q(() => c(s));
92
97
  }
93
- return r;
98
+ return s;
94
99
  }
95
- const X = /* @__PURE__ */ new Set(), Z = /* @__PURE__ */ new Map(), ve = new Map(
96
- Object.entries(R.capabilities ?? {}).filter(([, t]) => t !== void 0).map(([t, r]) => {
97
- const a = r;
100
+ const te = /* @__PURE__ */ new Set(), re = /* @__PURE__ */ new Map(), ve = new Map(
101
+ Object.entries(x.capabilities ?? {}).filter(([, e]) => e !== void 0).map(([e, s]) => {
102
+ const c = s;
98
103
  return [
99
- t,
100
- { handler: a.handler, apps: a.apps ? new Set(a.apps) : void 0 }
104
+ e,
105
+ { handler: c.handler, apps: c.apps ? new Set(c.apps) : void 0 }
101
106
  ];
102
107
  })
103
- ), $ = /* @__PURE__ */ new Map(), C = /* @__PURE__ */ new Map();
104
- let f = { tabs: [], activeTabId: null }, le = 0, T = !1, F = 0, ke = Promise.resolve();
105
- const K = /* @__PURE__ */ new Map(), B = /* @__PURE__ */ new Map(), Re = (t) => {
106
- var r;
108
+ ), B = /* @__PURE__ */ new Map(), G = /* @__PURE__ */ new Map();
109
+ let d = { tabs: [], activeTabId: null }, be = 0, D = !1, W = 0, Ee = Promise.resolve();
110
+ const oe = /* @__PURE__ */ new Map(), U = /* @__PURE__ */ new Map(), _e = (e) => {
111
+ var s;
107
112
  try {
108
- (r = R.onError) == null || r.call(R, t);
113
+ (s = x.onError) == null || s.call(x, e);
109
114
  } catch {
110
115
  }
111
- }, G = (t) => {
116
+ }, q = (e) => {
112
117
  try {
113
- t();
114
- } catch (r) {
115
- Re(r);
118
+ e();
119
+ } catch (s) {
120
+ _e(s);
116
121
  }
117
- }, x = () => {
118
- if (T) throw new Error("MicroHost 已销毁");
119
- }, ae = () => ({ tabs: [...f.tabs], activeTabId: f.activeTabId }), ee = () => {
120
- F++;
121
- for (const t of [...X])
122
- X.has(t) && G(() => t(ae()));
122
+ }, j = () => {
123
+ if (D) throw new Error("MicroHost 已销毁");
124
+ }, ce = () => ({ tabs: [...d.tabs], activeTabId: d.activeTabId }), ne = () => {
125
+ W++;
126
+ for (const e of [...te])
127
+ te.has(e) && q(() => e(ce()));
123
128
  };
124
- function Ee(t) {
125
- return x(), X.add(t), () => {
126
- X.delete(t);
129
+ function me(e) {
130
+ return j(), te.add(e), () => {
131
+ te.delete(e);
127
132
  };
128
133
  }
129
- const be = R.canNavigate, me = R.canOpen;
130
- function q(t) {
131
- if (!me) return;
132
- const r = Object.freeze({
133
- appId: t.appId,
134
- tabId: t.tabId,
135
- title: t.title,
136
- route: t.route,
137
- ...t.activeMenuId !== void 0 ? { activeMenuId: t.activeMenuId } : {}
134
+ const ue = x.canNavigate, ge = x.canOpen;
135
+ function Y(e) {
136
+ if (!ge) return;
137
+ const s = Object.freeze({
138
+ appId: e.appId,
139
+ tabId: e.tabId,
140
+ title: e.title,
141
+ route: e.route,
142
+ ...e.activeMenuId !== void 0 ? { activeMenuId: e.activeMenuId } : {}
138
143
  });
139
144
  try {
140
- const a = me(r);
141
- if (a === !0) return;
142
- a && (typeof a == "object" || typeof a == "function") && Promise.resolve(a).catch(() => {
145
+ const c = ge(s);
146
+ if (c === !0) return;
147
+ c && (typeof c == "object" || typeof c == "function") && Promise.resolve(c).catch(() => {
143
148
  });
144
149
  } catch {
145
150
  }
146
- throw new w("FORBIDDEN", "无权访问该页面(权限策略必须同步返回 true)");
151
+ throw new p("FORBIDDEN", "无权访问该页面(权限策略必须同步返回 true)");
147
152
  }
148
- function ue(t, r = !1) {
149
- var e;
150
- if (x(), !t || !_(t.title) || t.title.length > 500)
153
+ function he(e, s = !1) {
154
+ var o;
155
+ if (j(), !e || !z(e.title) || e.title.length > 500)
151
156
  throw new Error("页签标题无效");
152
- if (!Y.has(t.appId)) throw new Error(`未知子应用: ${t.appId}`);
153
- if (!_(t.tabId) || !fe(t.route))
157
+ if (!Z.has(e.appId)) throw new Error(`未知子应用: ${e.appId}`);
158
+ if (!z(e.tabId) || !de(e.route))
154
159
  throw new Error("需要 tabId 与应用内绝对路由");
155
- const a = Ie.get(t.appId);
156
- if (t.activeMenuId !== void 0 && !a.leaves.has(t.activeMenuId))
160
+ const c = pe.get(e.appId);
161
+ if (e.activeMenuId !== void 0 && !c.leaves.has(e.activeMenuId))
157
162
  throw new Error("activeMenuId 必须指向本应用可导航叶节点");
158
- const p = ye(t.route), h = t.activeMenuId ?? ((e = a.routes.find(
159
- (l) => l.pathPrefix === "/" || p === l.pathPrefix || p.startsWith(`${l.pathPrefix}/`)
160
- )) == null ? void 0 : e.menuId);
161
- let u = f.tabs.find((l) => l.tabId === t.tabId);
162
- if (u && (u.appId !== t.appId || u.route !== t.route && !r))
163
+ const h = we(e.route), b = e.activeMenuId ?? ((o = c.routes.find(
164
+ (t) => t.pathPrefix === "/" || h === t.pathPrefix || h.startsWith(`${t.pathPrefix}/`)
165
+ )) == null ? void 0 : o.menuId);
166
+ let u = d.tabs.find((t) => t.tabId === e.tabId);
167
+ if (u && (u.appId !== e.appId || u.route !== e.route && !s))
163
168
  throw new Error("tabId 已绑定到其他页面");
164
- return u && u.route !== t.route && (u = void 0), q(u ?? { ...t, activeMenuId: h }), u || (u = Object.freeze({
165
- appId: t.appId,
166
- tabId: t.tabId,
167
- title: t.title,
168
- route: t.route,
169
- ...h !== void 0 ? { activeMenuId: h } : {},
170
- key: `${t.tabId}:${++le}`
169
+ return u && u.route !== e.route && (u = void 0), Y(u ?? { ...e, activeMenuId: b }), u || (u = Object.freeze({
170
+ appId: e.appId,
171
+ tabId: e.tabId,
172
+ title: e.title,
173
+ route: e.route,
174
+ ...b !== void 0 ? { activeMenuId: b } : {},
175
+ key: `${e.tabId}:${++be}`
171
176
  })), u;
172
177
  }
173
- function _e(t) {
174
- const r = ue(t);
175
- return f = {
176
- tabs: f.tabs.includes(r) ? f.tabs : [...f.tabs, r],
177
- activeTabId: r.tabId
178
- }, ee(), r;
178
+ function He(e) {
179
+ const s = he(e);
180
+ return d = {
181
+ tabs: d.tabs.includes(s) ? d.tabs : [...d.tabs, s],
182
+ activeTabId: s.tabId
183
+ }, ne(), s;
179
184
  }
180
- function He(t, r, a) {
181
- if (x(), typeof r.title != "string" || !r.title.trim() || r.title.length > 500 || /[\u0000-\u001f\u007f]/.test(r.title))
185
+ function Fe(e, s, c) {
186
+ if (j(), typeof s.title != "string" || !s.title.trim() || s.title.length > 500 || /[\u0000-\u001f\u007f]/.test(s.title))
182
187
  throw new Error("页签标题无效");
183
- const p = f.tabs.find(
184
- (u) => u.tabId === t && (!a || u.key === a)
188
+ const h = d.tabs.find(
189
+ (u) => u.tabId === e && (!c || u.key === c)
185
190
  );
186
- if (!p) return;
187
- const h = Object.freeze({ ...p, title: r.title });
188
- return f = { ...f, tabs: f.tabs.map((u) => u === p ? h : u) }, ee(), h;
191
+ if (!h) return;
192
+ const b = Object.freeze({ ...h, title: s.title });
193
+ return d = { ...d, tabs: d.tabs.map((u) => u === h ? b : u) }, ne(), b;
189
194
  }
190
- function $e(t) {
191
- x();
192
- const r = f.tabs.find((a) => a.tabId === t);
193
- return r ? (q(r), f = { ...f, activeTabId: t }, ee(), !0) : !1;
195
+ function $e(e) {
196
+ j();
197
+ const s = d.tabs.find((c) => c.tabId === e);
198
+ return s ? (Y(s), d = { ...d, activeTabId: e }, ne(), !0) : !1;
194
199
  }
195
- function Ce(t, r) {
200
+ function Ce(e, s) {
196
201
  var u;
197
- x();
198
- const a = f.tabs.findIndex(
199
- (e) => e.tabId === t && (!r || e.key === r)
202
+ j();
203
+ const c = d.tabs.findIndex(
204
+ (o) => o.tabId === e && (!s || o.key === s)
200
205
  );
201
- if (a < 0) return !1;
202
- const p = f.tabs[a], h = f.tabs.filter((e) => e !== p);
203
- if (f = {
204
- tabs: h,
205
- activeTabId: f.activeTabId === t ? ((u = h[Math.min(a, h.length - 1)]) == null ? void 0 : u.tabId) ?? null : f.activeTabId
206
- }, ge(p.key), !h.some((e) => e.appId === p.appId)) {
207
- for (const e of [...C.get(p.appId) ?? []]) G(e);
208
- C.delete(p.appId), Z.delete(p.appId);
206
+ if (c < 0) return !1;
207
+ const h = d.tabs[c], b = d.tabs.filter((o) => o !== h);
208
+ if (d = {
209
+ tabs: b,
210
+ activeTabId: d.activeTabId === e ? ((u = b[Math.min(c, b.length - 1)]) == null ? void 0 : u.tabId) ?? null : d.activeTabId
211
+ }, Oe(h.key), !b.some((o) => o.appId === h.appId)) {
212
+ for (const o of [...G.get(h.appId) ?? []]) q(o);
213
+ G.delete(h.appId), re.delete(h.appId);
209
214
  }
210
- return ee(), !0;
215
+ return ne(), !0;
211
216
  }
212
- function ge(t) {
213
- K.delete(t), B.delete(t);
214
- for (const r of [...$.get(t) ?? []]) G(r);
215
- $.delete(t);
217
+ function Oe(e) {
218
+ oe.delete(e), U.delete(e);
219
+ for (const s of [...B.get(e) ?? []]) q(s);
220
+ B.delete(e);
216
221
  }
217
- function Fe(t) {
218
- return V(t);
222
+ function Ve(e) {
223
+ return J(e);
219
224
  }
220
- function V(t, r, a, p = !1, h, u = !1) {
225
+ function J(e, s, c, h = !1, b, u = !1) {
226
+ var o;
221
227
  try {
222
- if (T) throw new w("HOST_DISPOSED", "MicroHost 已销毁");
223
- if (!t || !["open", "activate", "refresh", "close", "closeMany", "back"].includes(t.type))
224
- throw new w("INVALID_OPERATION", "导航命令无效");
225
- const e = {
226
- ...t,
227
- ..."target" in t && t.target ? { target: { ...t.target } } : {},
228
- ..."anchor" in t && t.anchor ? { anchor: { ...t.anchor } } : {}
229
- }, l = (o) => !!o && _(o.tabId) && (o.key === void 0 || _(o.key));
230
- if (["activate", "refresh", "close"].includes(e.type) && (!("target" in e) || !l(e.target)))
231
- throw new w("INVALID_OPERATION", "导航需要合法目标引用");
232
- if ("target" in e && e.target !== void 0 && !l(e.target) || "anchor" in e && e.anchor !== void 0 && !l(e.anchor))
233
- throw new w("INVALID_OPERATION", "导航引用无效");
234
- if (e.type === "closeMany" && e.exclude !== void 0) {
235
- if (!Array.isArray(e.exclude) || !e.exclude.every(l))
236
- throw new w("INVALID_OPERATION", "批量排除引用无效");
237
- e.exclude = Object.freeze(
238
- e.exclude.map(
239
- (o) => {
240
- var m;
228
+ if (D) throw new p("HOST_DISPOSED", "MicroHost 已销毁");
229
+ if (!e || !["open", "activate", "refresh", "close", "closeMany", "back"].includes(e.type))
230
+ throw new p("INVALID_OPERATION", "导航命令无效");
231
+ const t = {
232
+ ...e,
233
+ ..."target" in e && e.target ? { target: { ...e.target } } : {},
234
+ ..."anchor" in e && e.anchor ? { anchor: { ...e.anchor } } : {}
235
+ }, r = (n) => !!n && z(n.tabId) && (n.key === void 0 || z(n.key));
236
+ if (["activate", "refresh", "close"].includes(t.type) && (!("target" in t) || !r(t.target)))
237
+ throw new p("INVALID_OPERATION", "导航需要合法目标引用");
238
+ if ("target" in t && t.target !== void 0 && !r(t.target) || "anchor" in t && t.anchor !== void 0 && !r(t.anchor))
239
+ throw new p("INVALID_OPERATION", "导航引用无效");
240
+ if (t.type === "closeMany" && t.exclude !== void 0) {
241
+ if (!Array.isArray(t.exclude) || !t.exclude.every(r))
242
+ throw new p("INVALID_OPERATION", "批量排除引用无效");
243
+ t.exclude = Object.freeze(
244
+ t.exclude.map(
245
+ (n) => {
246
+ var g;
241
247
  return Object.freeze({
242
- tabId: o.tabId,
243
- ...o.key !== void 0 ? { key: o.key } : { key: (m = f.tabs.find((E) => E.tabId === o.tabId)) == null ? void 0 : m.key }
248
+ tabId: n.tabId,
249
+ ...n.key !== void 0 ? { key: n.key } : { key: (g = d.tabs.find((k) => k.tabId === n.tabId)) == null ? void 0 : g.key }
244
250
  });
245
251
  }
246
252
  )
247
253
  );
248
254
  }
249
- if (e.type === "open") {
250
- const o = e.input;
251
- if (!o) throw new w("INVALID_OPERATION", "导航目标无效");
252
- e.input = Object.freeze({
253
- appId: o.appId,
254
- tabId: o.tabId,
255
- title: o.title,
256
- route: o.route,
257
- ...o.activeMenuId !== void 0 ? { activeMenuId: o.activeMenuId } : {}
255
+ if (t.type === "open") {
256
+ const n = t.input;
257
+ if (!n) throw new p("INVALID_OPERATION", "导航目标无效");
258
+ t.input = Object.freeze({
259
+ appId: n.appId,
260
+ tabId: n.tabId,
261
+ title: n.title,
262
+ route: n.route,
263
+ ...n.activeMenuId !== void 0 ? { activeMenuId: n.activeMenuId } : {}
258
264
  });
259
265
  }
260
- "fallback" in e && e.fallback && (e.fallback = Object.freeze({ ...e.fallback })), "target" in e && e.target && Object.freeze(e.target), "anchor" in e && e.anchor && Object.freeze(e.anchor), Object.freeze(e);
261
- const s = (o) => f.tabs.find(
262
- (m) => o ? m.tabId === o.tabId && (!o.key || m.key === o.key) : m.tabId === f.activeTabId
263
- ), c = "target" in e ? s(e.target) : void 0, i = e.type === "closeMany" && e.scope !== "all" ? e.anchor ? s(e.anchor) : a ? f.tabs.find((o) => o.key === a) : s() : void 0, P = s(), O = e.type === "open" ? f.tabs.find((o) => o.tabId === e.input.tabId) : void 0, d = u && a ? f.tabs.find((o) => o.key === a) : void 0, I = d && r ? Object.freeze({ appId: r, tab: Object.freeze({ ...d }) }) : void 0, v = u && e.type === "open" && !!r && e.input.appId !== r, W = () => {
264
- if (!(!v || e.type !== "open")) {
266
+ if ("closeFallback" in t && t.closeFallback !== void 0) {
267
+ if (!r(t.closeFallback)) throw new p("INVALID_OPERATION", "关闭回落引用无效");
268
+ const n = t.closeFallback;
269
+ t.closeFallback = Object.freeze({ tabId: n.tabId, key: n.key ?? ((o = d.tabs.find((g) => g.tabId === n.tabId)) == null ? void 0 : o.key) });
270
+ }
271
+ "fallback" in t && t.fallback && (t.fallback = Object.freeze({ ...t.fallback })), "target" in t && t.target && Object.freeze(t.target), "anchor" in t && t.anchor && Object.freeze(t.anchor), Object.freeze(t);
272
+ const i = (n) => d.tabs.find(
273
+ (g) => n ? g.tabId === n.tabId && (!n.key || g.key === n.key) : g.tabId === d.activeTabId
274
+ ), w = "target" in t ? i(t.target) : void 0, v = t.type === "closeMany" && t.scope !== "all" ? t.anchor ? i(t.anchor) : c ? d.tabs.find((n) => n.key === c) : i() : void 0, S = i(), f = t.type === "open" ? d.tabs.find((n) => n.tabId === t.input.tabId) : void 0, I = u && c ? d.tabs.find((n) => n.key === c) : void 0, E = I && s ? Object.freeze({ appId: s, tab: Object.freeze({ ...I }) }) : void 0, _ = u && t.type === "open" && !!s && t.input.appId !== s, L = () => {
275
+ if (!(!_ || t.type !== "open")) {
265
276
  try {
266
- const o = I && (be == null ? void 0 : be(I, e.input));
267
- if (o === !0) return;
268
- o && (typeof o == "object" || typeof o == "function") && Promise.resolve(o).catch(() => {
277
+ const n = E && (ue == null ? void 0 : ue(E, t.input));
278
+ if (n === !0) return;
279
+ n && (typeof n == "object" || typeof n == "function") && Promise.resolve(n).catch(() => {
269
280
  });
270
281
  } catch {
271
282
  }
272
- throw new w("FORBIDDEN", "无权跨应用导航(权限策略必须同步返回 true)");
283
+ throw new p("FORBIDDEN", "无权跨应用导航(权限策略必须同步返回 true)");
273
284
  }
274
- }, M = (o) => !r || o.appId === r;
275
- if (c && !M(c) || i && !M(i) || e.type === "open" && r && e.input.appId !== r && !v || e.type === "back" && e.fallback && r && e.fallback.appId !== r)
276
- throw new w("FORBIDDEN", "页面只能操作本应用");
277
- if (e.type === "closeMany" && !["all", "others", "left", "right"].includes(e.scope))
278
- throw new w("INVALID_OPERATION", "批量范围无效");
279
- const te = i ? f.tabs.indexOf(i) : -1, U = e.type === "closeMany" ? f.tabs.filter(
280
- (o, m) => {
281
- var E;
282
- return M(o) && !((E = e.exclude) != null && E.some((D) => D.tabId === o.tabId && D.key === o.key)) && (e.scope === "all" || te >= 0 && (e.scope === "others" ? o.key !== i.key : e.scope === "left" ? m < te : m > te));
285
+ }, H = (n) => !s || n.appId === s;
286
+ if (w && !H(w) || v && !H(v) || t.type === "open" && s && t.input.appId !== s && !_ || t.type === "back" && t.fallback && s && t.fallback.appId !== s)
287
+ throw new p("FORBIDDEN", "页面只能操作本应用");
288
+ if (t.type === "closeMany" && !["all", "others", "left", "right"].includes(t.scope))
289
+ throw new p("INVALID_OPERATION", "批量范围无效");
290
+ const F = v ? d.tabs.indexOf(v) : -1, Q = t.type === "closeMany" ? d.tabs.filter(
291
+ (n, g) => {
292
+ var k;
293
+ return H(n) && !((k = t.exclude) != null && k.some((C) => C.tabId === n.tabId && C.key === n.key)) && (t.scope === "all" || F >= 0 && (t.scope === "others" ? n.key !== v.key : t.scope === "left" ? g < F : g > F));
283
294
  }
284
- ) : [], k = e.type === "back" ? c ?? (!("target" in e) || !e.target ? P : void 0) : c, ie = async () => {
285
- var Ae, Te, Pe, Me, De, Se;
286
- const o = (n) => ({
287
- status: n,
295
+ ) : [], m = t.type === "back" ? w ?? (!("target" in t) || !t.target ? S : void 0) : w, $ = async () => {
296
+ var Te, Pe, De, Me, je, Se;
297
+ const n = (a) => ({
298
+ status: a,
288
299
  affected: []
289
300
  });
290
- if (T) throw new w("HOST_DISPOSED", "MicroHost 已销毁");
291
- if ((Ae = e.signal) != null && Ae.aborted) return o("stale");
292
- if (a && !p && (h != null && h() || !f.tabs.some((n) => n.key === a)))
293
- throw new w("PAGE_RELEASED", "页面上下文已释放");
294
- if (e.type === "open" && (O ? !f.tabs.some((n) => n.key === O.key) : f.tabs.some((n) => n.tabId === e.input.tabId)) || k && !f.tabs.some((n) => n.key === k.key) || i && !f.tabs.some((n) => n.key === i.key) || U.some((n) => !f.tabs.some((g) => g.key === n.key)))
295
- return o("stale");
296
- if (e.type !== "open" && e.type !== "closeMany" && !k) return o("noop");
297
- const m = F;
298
- if (W(), a && !p && (h != null && h() || !f.tabs.some((n) => n.key === a)))
299
- throw new w("PAGE_RELEASED", "页面上下文已释放");
300
- if (F !== m || T || (Te = e.signal) != null && Te.aborted) return o("stale");
301
- const E = f, D = F;
302
- let y = [...f.tabs], b, j = [], H = f.activeTabId;
301
+ if (D) throw new p("HOST_DISPOSED", "MicroHost 已销毁");
302
+ if ((Te = t.signal) != null && Te.aborted) return n("stale");
303
+ if (c && !h && (b != null && b() || !d.tabs.some((a) => a.key === c)))
304
+ throw new p("PAGE_RELEASED", "页面上下文已释放");
305
+ if (t.type === "open" && (f ? !d.tabs.some((a) => a.key === f.key) : d.tabs.some((a) => a.tabId === t.input.tabId)) || m && !d.tabs.some((a) => a.key === m.key) || v && !d.tabs.some((a) => a.key === v.key) || Q.some((a) => !d.tabs.some((O) => O.key === a.key)))
306
+ return n("stale");
307
+ if (t.type !== "open" && t.type !== "closeMany" && !m) return n("noop");
308
+ const g = W;
309
+ if (L(), c && !h && (b != null && b() || !d.tabs.some((a) => a.key === c)))
310
+ throw new p("PAGE_RELEASED", "页面上下文已释放");
311
+ if (W !== g || D || (Pe = t.signal) != null && Pe.aborted) return n("stale");
312
+ const k = d, C = W;
313
+ let y = [...d.tabs], l, M = [], V = d.activeTabId;
303
314
  try {
304
- if (e.type === "open" && (b = ue(e.input, !0), O && O.key !== b.key ? (j = [O], y = y.map((n) => n.key === O.key ? b : n)) : y.some((n) => n.key === b.key) || y.push(b), H = b.tabId), e.type === "activate" && (b = k, q(b), H = b.tabId), e.type === "refresh" && (q(k), j = [k], b = Object.freeze({
305
- ...k,
306
- key: `${k.tabId}:${++le}`
307
- }), y = y.map((n) => n.key === k.key ? b : n)), (e.type === "close" || e.type === "back") && (j = [k]), e.type === "closeMany" && (j = U), j.length && e.type !== "refresh" && e.type !== "open") {
308
- const n = new Set(j.map((S) => S.key)), g = E.tabs.findIndex((S) => S.tabId === E.activeTabId);
309
- if (y = y.filter((S) => !n.has(S.key)), e.type === "back") {
310
- const S = B.get(k.key);
311
- b = y.find((A) => A.key === S && M(A)), !b && e.fallback && (b = ue(e.fallback), n.has(b.key) && (b = Object.freeze({ ...b, key: `${b.tabId}:${++le}` })), y.some((A) => A.key === b.key) || y.push(b));
312
- const L = E.tabs.filter((A) => M(A)), re = L.findIndex((A) => A.key === k.key);
313
- b ?? (b = L.slice(0, re).reverse().find((A) => y.some((oe) => oe.key === A.key)) ?? L.slice(re + 1).find((A) => y.some((oe) => oe.key === A.key))), b ?? (b = y[Math.min(g, y.length - 1)]), b && q(b), H = (b == null ? void 0 : b.tabId) ?? null;
314
- } else j.some((S) => S.tabId === H) && (H = ((Pe = y[Math.min(g, y.length - 1)]) == null ? void 0 : Pe.tabId) ?? null);
315
+ if (t.type === "open" && (l = he(t.input, !0), f && f.key !== l.key ? (M = [f], y = y.map((a) => a.key === f.key ? l : a)) : y.some((a) => a.key === l.key) || y.push(l), V = l.tabId), t.type === "activate" && (l = m, Y(l), V = l.tabId), t.type === "refresh" && (Y(m), M = [m], l = Object.freeze({
316
+ ...m,
317
+ key: `${m.tabId}:${++be}`
318
+ }), y = y.map((a) => a.key === m.key ? l : a)), (t.type === "close" || t.type === "back") && (M = [m]), t.type === "closeMany" && (M = Q), M.length && t.type !== "refresh" && t.type !== "open") {
319
+ const a = new Set(M.map((A) => A.key)), O = k.tabs.findIndex((A) => A.tabId === k.activeTabId);
320
+ if (y = y.filter((A) => !a.has(A.key)), t.type === "back") {
321
+ const A = U.get(m.key);
322
+ l = y.find((P) => P.key === A && H(P)), !l && t.fallback && (l = he(t.fallback), a.has(l.key) && (l = Object.freeze({ ...l, key: `${l.tabId}:${++be}` })), y.some((P) => P.key === l.key) || y.push(l));
323
+ const T = k.tabs.filter((P) => H(P)), R = T.findIndex((P) => P.key === m.key);
324
+ l ?? (l = T.slice(0, R).reverse().find((P) => y.some((se) => se.key === P.key)) ?? T.slice(R + 1).find((P) => y.some((se) => se.key === P.key))), l ?? (l = y[Math.min(O, y.length - 1)]), l && Y(l), V = (l == null ? void 0 : l.tabId) ?? null;
325
+ } else if (M.some((A) => A.tabId === V)) {
326
+ const A = "closeFallback" in t ? t.closeFallback : void 0, T = A ? y.find((R) => R.tabId === A.tabId && R.key === A.key && H(R)) : void 0;
327
+ T && (Y(T), l = T), V = ((De = T ?? y[Math.min(O, y.length - 1)]) == null ? void 0 : De.tabId) ?? null;
328
+ }
315
329
  }
316
- } catch (n) {
317
- throw n instanceof w ? n : new w("INVALID_OPERATION", "导航参数无效");
330
+ } catch (a) {
331
+ throw a instanceof p ? a : new p("INVALID_OPERATION", "导航参数无效");
318
332
  }
319
- if (y.length === E.tabs.length && y.every((n, g) => n.key === E.tabs[g].key) && H === E.activeTabId)
320
- return o("noop");
321
- const he = [...j], ce = E.tabs.find((n) => n.tabId === E.activeTabId);
322
- ce && ce.tabId !== H && !he.some((n) => n.key === ce.key) && he.push(ce);
323
- for (const n of he)
324
- for (const g of [...K.get(n.key) ?? []]) {
325
- let S;
326
- const L = e.signal;
327
- let re = () => {
333
+ if (y.length === k.tabs.length && y.every((a, O) => a.key === k.tabs[O].key) && V === k.activeTabId)
334
+ return n("noop");
335
+ const Ie = [...M], fe = k.tabs.find((a) => a.tabId === k.activeTabId);
336
+ fe && fe.tabId !== V && !Ie.some((a) => a.key === fe.key) && Ie.push(fe);
337
+ for (const a of Ie)
338
+ for (const O of [...oe.get(a.key) ?? []]) {
339
+ let A;
340
+ const T = t.signal;
341
+ let R = () => {
328
342
  };
329
343
  try {
330
- const A = Promise.resolve(g({ operation: e, tab: n })), oe = new Promise((je) => {
331
- if (!L) return;
332
- const Le = () => je();
333
- L.addEventListener("abort", Le, { once: !0 }), re = () => L.removeEventListener("abort", Le), L.aborted && je();
344
+ const P = Promise.resolve(O({ operation: t, tab: a })), se = new Promise((Le) => {
345
+ if (!T) return;
346
+ const Ne = () => Le();
347
+ T.addEventListener("abort", Ne, { once: !0 }), R = () => T.removeEventListener("abort", Ne), T.aborted && Le();
334
348
  });
335
- S = await Promise.race([A, oe]);
349
+ A = await Promise.race([P, se]);
336
350
  } catch {
337
- if (L != null && L.aborted) return o("stale");
338
- throw new w("GUARD_FAILED", "离页守卫执行失败");
351
+ if (T != null && T.aborted) return n("stale");
352
+ throw new p("GUARD_FAILED", "离页守卫执行失败");
339
353
  } finally {
340
- re();
354
+ R();
341
355
  }
342
- if (F !== D || T || (Me = e.signal) != null && Me.aborted) return o("stale");
343
- if (S === !1) return o("cancelled");
356
+ if (W !== C || D || (Me = t.signal) != null && Me.aborted) return n("stale");
357
+ if (A === !1) return n("cancelled");
344
358
  }
345
- if (F !== D || T || (De = e.signal) != null && De.aborted) return o("stale");
346
- if (h != null && h()) throw new w("PAGE_RELEASED", "页面上下文已释放");
347
- if (W(), b && q(b), h != null && h()) throw new w("PAGE_RELEASED", "页面上下文已释放");
348
- if (F !== D || T || (Se = e.signal) != null && Se.aborted) return o("stale");
349
- if (f = { tabs: y, activeTabId: H }, e.type === "open" && b && a && !v && b.key !== a && !B.has(b.key) && B.set(b.key, a), e.type === "refresh" && b) {
350
- const n = B.get(k.key);
351
- n && B.set(b.key, n);
359
+ if (W !== C || D || (je = t.signal) != null && je.aborted) return n("stale");
360
+ if (b != null && b()) throw new p("PAGE_RELEASED", "页面上下文已释放");
361
+ if (L(), l && Y(l), b != null && b()) throw new p("PAGE_RELEASED", "页面上下文已释放");
362
+ if (W !== C || D || (Se = t.signal) != null && Se.aborted) return n("stale");
363
+ if (d = { tabs: y, activeTabId: V }, t.type === "open" && l && c && !_ && l.key !== c && !U.has(l.key) && U.set(l.key, c), t.type === "refresh" && l) {
364
+ const a = U.get(m.key);
365
+ a && U.set(l.key, a);
352
366
  }
353
- for (const n of j) ge(n.key);
354
- for (const n of new Set(j.map((g) => g.appId)))
355
- if (!y.some((g) => g.appId === n)) {
356
- for (const g of [...C.get(n) ?? []]) G(g);
357
- C.delete(n), Z.delete(n);
367
+ for (const a of M) Oe(a.key);
368
+ for (const a of new Set(M.map((O) => O.appId)))
369
+ if (!y.some((O) => O.appId === a)) {
370
+ for (const O of [...G.get(a) ?? []]) q(O);
371
+ G.delete(a), re.delete(a);
358
372
  }
359
- const pe = [
360
- ...j,
361
- ...y.filter((n) => !E.tabs.some((g) => g.key === n.key))
373
+ const ye = [
374
+ ...M,
375
+ ...y.filter((a) => !k.tabs.some((O) => O.key === a.key))
362
376
  ];
363
- return !pe.length && b && pe.push(b), ee(), {
377
+ return !ye.length && l && ye.push(l), ne(), {
364
378
  status: "committed",
365
- affected: pe.map((n) => ({ tabId: n.tabId, key: n.key })),
366
- ...b ? { tab: b } : {}
379
+ affected: ye.map((a) => ({ tabId: a.tabId, key: a.key })),
380
+ ...l ? { tab: l } : {}
367
381
  };
368
- }, z = ke.then(ie);
369
- return ke = z.catch(() => {
370
- }), z;
371
- } catch (e) {
372
- return Promise.reject(e);
382
+ }, X = Ee.then($);
383
+ return Ee = X.catch(() => {
384
+ }), X;
385
+ } catch (t) {
386
+ return Promise.reject(t);
373
387
  }
374
388
  }
375
- function Be(t) {
376
- if (x(), !Y.has(t)) throw new Error(`未知子应用: ${t}`);
377
- const r = Z.get(t);
378
- if (r) return r;
379
- let a = !0;
380
- const p = /* @__PURE__ */ new Set([
389
+ function Be(e) {
390
+ if (j(), !Z.has(e)) throw new Error(`未知子应用: ${e}`);
391
+ const s = re.get(e);
392
+ if (s) return s;
393
+ let c = !0;
394
+ const h = /* @__PURE__ */ new Set([
381
395
  () => {
382
- a = !1;
396
+ c = !1;
383
397
  }
384
398
  ]);
385
- C.set(t, p);
386
- async function h(e, l, s, c = {}) {
387
- const i = () => {
388
- if (T) throw new N("HOST_DISPOSED", "MicroHost 已销毁");
389
- if (s && (s.released() || !f.tabs.some((M) => M.key === s.key)))
399
+ G.set(e, h);
400
+ async function b(o, t, r, i = {}) {
401
+ const w = () => {
402
+ if (D) throw new N("HOST_DISPOSED", "MicroHost 已销毁");
403
+ if (r && (r.released() || !d.tabs.some((L) => L.key === r.key)))
390
404
  throw new N("PAGE_RELEASED", "页面上下文已释放");
391
- if (!a) throw new N("BRIDGE_RELEASED", "应用 bridge 已释放");
405
+ if (!c) throw new N("BRIDGE_RELEASED", "应用 bridge 已释放");
392
406
  };
393
- i();
394
- const P = ve.get(e);
395
- if (!P) throw new N("UNKNOWN_CAPABILITY", `未注册宿主能力: ${e}`);
396
- if (P.apps && !P.apps.has(t))
397
- throw new N("FORBIDDEN", `应用无权调用宿主能力: ${e}`);
398
- const O = c.timeoutMs ?? se;
399
- if (!Number.isFinite(O) || O <= 0 || O > 2147483647)
407
+ w();
408
+ const v = ve.get(o);
409
+ if (!v) throw new N("UNKNOWN_CAPABILITY", `未注册宿主能力: ${o}`);
410
+ if (v.apps && !v.apps.has(e))
411
+ throw new N("FORBIDDEN", `应用无权调用宿主能力: ${o}`);
412
+ const S = i.timeoutMs ?? ie;
413
+ if (!Number.isFinite(S) || S <= 0 || S > 2147483647)
400
414
  throw new TypeError("timeoutMs 必须为不超过2147483647的正有限数");
401
- const d = c.signal;
402
- if (d != null && d.aborted) throw new N("CANCELLED", "宿主能力调用已取消");
403
- const I = new AbortController(), v = s ? f.tabs.find((M) => M.key === s.key) : void 0, W = Object.freeze({
404
- appId: t,
415
+ const f = i.signal;
416
+ if (f != null && f.aborted) throw new N("CANCELLED", "宿主能力调用已取消");
417
+ const I = new AbortController(), E = r ? d.tabs.find((L) => L.key === r.key) : void 0, _ = Object.freeze({
418
+ appId: e,
405
419
  signal: I.signal,
406
- ...v ? { tab: Object.freeze({ ...v }) } : {},
407
- isActive: () => !I.signal.aborted && !T && a && (!s || !s.released() && f.tabs.some((M) => M.key === s.key))
420
+ ...E ? { tab: Object.freeze({ ...E }) } : {},
421
+ isActive: () => !I.signal.aborted && !D && c && (!r || !r.released() && d.tabs.some((L) => L.key === r.key))
408
422
  });
409
- return new Promise((M, te) => {
410
- let U = !1, k;
411
- const ie = () => {
412
- k !== void 0 && clearTimeout(k), d == null || d.removeEventListener("abort", o), p.delete(m), s == null || s.cleanups.delete(m);
413
- }, z = (D) => {
414
- U || (U = !0, ie(), te(D), I.abort());
415
- }, o = () => z(new N("CANCELLED", "宿主能力调用已取消")), m = () => {
423
+ return new Promise((L, H) => {
424
+ let F = !1, Q;
425
+ const m = () => {
426
+ Q !== void 0 && clearTimeout(Q), f == null || f.removeEventListener("abort", X), h.delete(n), r == null || r.cleanups.delete(n);
427
+ }, $ = (k) => {
428
+ F || (F = !0, m(), H(k), I.abort());
429
+ }, X = () => $(new N("CANCELLED", "宿主能力调用已取消")), n = () => {
416
430
  try {
417
- i();
418
- } catch (D) {
419
- z(D);
431
+ w();
432
+ } catch (k) {
433
+ $(k);
420
434
  }
421
435
  };
422
- if (p.add(m), s == null || s.cleanups.add(m), d == null || d.addEventListener("abort", o, { once: !0 }), k = setTimeout(() => z(new N("TIMEOUT", "宿主能力调用超时")), O), d != null && d.aborted) {
423
- o();
436
+ if (h.add(n), r == null || r.cleanups.add(n), f == null || f.addEventListener("abort", X, { once: !0 }), Q = setTimeout(() => $(new N("TIMEOUT", "宿主能力调用超时")), S), f != null && f.aborted) {
437
+ X();
424
438
  return;
425
439
  }
426
- let E;
440
+ let g;
427
441
  try {
428
- E = P.handler(W, ...l);
442
+ g = v.handler(_, ...t);
429
443
  } catch {
430
- z(new N("HANDLER_FAILED", `宿主能力执行失败: ${e}`));
444
+ $(new N("HANDLER_FAILED", `宿主能力执行失败: ${o}`));
431
445
  return;
432
446
  }
433
- Promise.resolve(E).then((D) => {
434
- if (!U) {
447
+ Promise.resolve(g).then((k) => {
448
+ if (!F) {
435
449
  try {
436
- i();
437
- } catch (y) {
438
- z(y);
450
+ w();
451
+ } catch (C) {
452
+ $(C);
439
453
  return;
440
454
  }
441
- U = !0, ie(), M(D);
455
+ F = !0, m(), L(k);
442
456
  }
443
- }, () => z(new N("HANDLER_FAILED", `宿主能力执行失败: ${e}`)));
457
+ }, () => $(new N("HANDLER_FAILED", `宿主能力执行失败: ${o}`)));
444
458
  });
445
459
  }
446
460
  const u = {
447
- appId: t,
448
- getState: ae,
449
- callHost(e, ...l) {
450
- return h(e, l);
461
+ appId: e,
462
+ getState: ce,
463
+ callHost(o, ...t) {
464
+ return b(o, t);
451
465
  },
452
- callHostWithOptions(e, l, ...s) {
453
- return h(e, s, void 0, l);
466
+ callHostWithOptions(o, t, ...r) {
467
+ return b(o, r, void 0, t);
454
468
  },
455
469
  protocol() {
456
- if (x(), !a) throw new Error("应用 bridge 已释放");
470
+ if (j(), !c) throw new Error("应用 bridge 已释放");
457
471
  return Object.freeze({
458
472
  version: "1.0",
459
- capabilities: Object.freeze([...ve].filter(([, e]) => !e.apps || e.apps.has(t)).map(([e]) => e)),
473
+ capabilities: Object.freeze([...ve].filter(([, o]) => !o.apps || o.apps.has(e)).map(([o]) => o)),
460
474
  features: Object.freeze(["call-options", "session", "event-metadata", "navigate-to"])
461
475
  });
462
476
  },
463
- negotiate(e = {}) {
464
- const l = u.protocol(), s = Object.freeze((e.capabilities ?? []).filter((c) => !l.capabilities.includes(c)));
465
- return Object.freeze({ compatible: (!e.version || e.version === l.version) && !s.length, protocol: l, missingCapabilities: s });
477
+ negotiate(o = {}) {
478
+ const t = u.protocol(), r = Object.freeze((o.capabilities ?? []).filter((i) => !t.capabilities.includes(i)));
479
+ return Object.freeze({ compatible: (!o.version || o.version === t.version) && !r.length, protocol: t, missingCapabilities: r });
466
480
  },
467
481
  getSession() {
468
- if (x(), !a) throw new Error("应用 bridge 已释放");
469
- return Q;
482
+ if (j(), !c) throw new Error("应用 bridge 已释放");
483
+ return ee;
470
484
  },
471
- subscribeSession(e) {
472
- const l = u.getSession(), s = (i) => e(i), c = () => {
473
- J.delete(s), p.delete(c);
485
+ subscribeSession(o) {
486
+ const t = u.getSession(), r = (w) => o(w), i = () => {
487
+ K.delete(r), h.delete(i);
474
488
  };
475
- return J.add(s), p.add(c), G(() => e(l)), c;
489
+ return K.add(r), h.add(i), q(() => o(t)), i;
476
490
  },
477
- subscribe(e) {
478
- if (!a) throw new Error("应用 bridge 已释放");
479
- const l = Ee(e), s = () => {
480
- l(), p.delete(s);
491
+ subscribe(o) {
492
+ if (!c) throw new Error("应用 bridge 已释放");
493
+ const t = me(o), r = () => {
494
+ t(), h.delete(r);
481
495
  };
482
- return p.add(s), s;
496
+ return h.add(r), r;
483
497
  },
484
- ready(e) {
485
- const l = (c) => {
486
- const i = c.tabs.find(
487
- (P) => P.tabId === c.activeTabId && P.appId === t
498
+ ready(o) {
499
+ const t = (i) => {
500
+ const w = i.tabs.find(
501
+ (v) => v.tabId === i.activeTabId && v.appId === e
488
502
  );
489
- i && e(i);
490
- }, s = u.subscribe(l);
503
+ w && o(w);
504
+ }, r = u.subscribe(t);
491
505
  try {
492
- l(ae());
493
- } catch (c) {
494
- throw s(), c;
506
+ t(ce());
507
+ } catch (i) {
508
+ throw r(), i;
495
509
  }
496
- return s;
510
+ return r;
497
511
  },
498
- bindPage(e) {
499
- const l = f.tabs.find((s) => s.tabId === e && s.appId === t);
500
- if (!l) throw new Error("页面不属于该应用");
501
- return u.page(l.key);
512
+ bindPage(o) {
513
+ const t = d.tabs.find((r) => r.tabId === o && r.appId === e);
514
+ if (!t) throw new Error("页面不属于该应用");
515
+ return u.page(t.key);
502
516
  },
503
- page(e) {
504
- if (x(), !a) throw new Error("应用 bridge 已释放");
505
- const l = f.tabs.find((d) => d.key === e && d.appId === t);
506
- if (!l) throw new Error("页面上下文不存在或不属于该应用");
507
- let s = !1;
508
- const c = /* @__PURE__ */ new Set(), i = () => {
509
- if (T) throw new w("HOST_DISPOSED", "MicroHost 已销毁");
510
- if (s || !f.tabs.some((d) => d.key === e))
511
- throw new w("PAGE_RELEASED", "页面上下文已释放");
512
- }, P = () => {
513
- var d;
514
- s = !0, c.forEach((I) => I()), c.clear(), (d = $.get(e)) == null || d.delete(P);
517
+ page(o) {
518
+ if (j(), !c) throw new Error("应用 bridge 已释放");
519
+ const t = d.tabs.find((f) => f.key === o && f.appId === e);
520
+ if (!t) throw new Error("页面上下文不存在或不属于该应用");
521
+ let r = !1;
522
+ const i = /* @__PURE__ */ new Set(), w = () => {
523
+ if (D) throw new p("HOST_DISPOSED", "MicroHost 已销毁");
524
+ if (r || !d.tabs.some((f) => f.key === o))
525
+ throw new p("PAGE_RELEASED", "页面上下文已释放");
526
+ }, v = () => {
527
+ var f;
528
+ r = !0, i.forEach((I) => I()), i.clear(), (f = B.get(o)) == null || f.delete(v);
515
529
  };
516
- let O = $.get(e);
517
- return O || $.set(e, O = /* @__PURE__ */ new Set()), O.add(P), {
530
+ let S = B.get(o);
531
+ return S || B.set(o, S = /* @__PURE__ */ new Set()), S.add(v), {
518
532
  get tab() {
519
- return f.tabs.find((d) => d.key === e) ?? l;
533
+ return d.tabs.find((f) => f.key === o) ?? t;
520
534
  },
521
- callHost(d, ...I) {
522
- return h(d, I, { key: e, released: () => s, cleanups: c });
535
+ callHost(f, ...I) {
536
+ return b(f, I, { key: o, released: () => r, cleanups: i });
523
537
  },
524
- callHostWithOptions(d, I, ...v) {
525
- return h(d, v, { key: e, released: () => s, cleanups: c }, I);
538
+ callHostWithOptions(f, I, ...E) {
539
+ return b(f, E, { key: o, released: () => r, cleanups: i }, I);
526
540
  },
527
- async openTab(d) {
528
- i();
529
- const I = await V(
530
- { type: "open", input: d },
531
- t,
541
+ async openTab(f) {
542
+ w();
543
+ const I = await J(
544
+ { type: "open", input: f },
532
545
  e,
546
+ o,
533
547
  !1,
534
- () => s
548
+ () => r
535
549
  );
536
550
  if (I.tab) return I.tab;
537
- const v = f.tabs.find(
538
- (W) => W.tabId === d.tabId && W.appId === t
551
+ const E = d.tabs.find(
552
+ (_) => _.tabId === f.tabId && _.appId === e
539
553
  );
540
- if (I.status === "noop" && v) return v;
541
- throw new w(
554
+ if (I.status === "noop" && E) return E;
555
+ throw new p(
542
556
  I.status === "cancelled" ? "CANCELLED" : "STALE",
543
557
  "导航未提交"
544
558
  );
545
559
  },
546
- async navigateTo(d, I = {}) {
547
- return i(), V(
548
- { type: "open", input: d, signal: I.signal },
549
- t,
560
+ async navigateTo(f, I = {}) {
561
+ return w(), J(
562
+ { type: "open", input: f, signal: I.signal },
550
563
  e,
564
+ o,
551
565
  !1,
552
- () => s,
566
+ () => r,
553
567
  !0
554
568
  );
555
569
  },
556
570
  // 释放后仅允许关闭捕获的原 key;所有守卫仍然执行,不能误关同 id 新生命周期。
557
571
  async closeCurrent() {
558
- return T ? !1 : (await V(
559
- { type: "close", target: { tabId: l.tabId, key: e } },
560
- t,
572
+ return D ? !1 : (await J(
573
+ { type: "close", target: { tabId: t.tabId, key: o } },
574
+ e,
561
575
  void 0,
562
576
  !0
563
577
  )).status === "committed";
564
578
  },
565
- beforeLeave(d) {
566
- if (i(), typeof d != "function")
567
- throw new w("INVALID_OPERATION", "离页守卫必须为函数");
568
- let I = K.get(e);
569
- I || K.set(e, I = /* @__PURE__ */ new Set()), I.add(d);
570
- const v = () => {
571
- I.delete(d), c.delete(v);
579
+ beforeLeave(f) {
580
+ if (w(), typeof f != "function")
581
+ throw new p("INVALID_OPERATION", "离页守卫必须为函数");
582
+ let I = oe.get(o);
583
+ I || oe.set(o, I = /* @__PURE__ */ new Set()), I.add(f);
584
+ const E = () => {
585
+ I.delete(f), i.delete(E);
572
586
  };
573
- return c.add(v), v;
587
+ return i.add(E), E;
574
588
  },
575
589
  async refreshCurrent() {
576
- return i(), V(
577
- { type: "refresh", target: { tabId: l.tabId, key: e } },
578
- t,
590
+ return w(), J(
591
+ { type: "refresh", target: { tabId: t.tabId, key: o } },
579
592
  e,
593
+ o,
580
594
  !1,
581
- () => s
595
+ () => r
582
596
  );
583
597
  },
584
- async back(d) {
585
- return i(), V(
586
- { type: "back", target: { tabId: l.tabId, key: e }, fallback: d },
587
- t,
598
+ async back(f) {
599
+ return w(), J(
600
+ { type: "back", target: { tabId: t.tabId, key: o }, fallback: f },
588
601
  e,
602
+ o,
589
603
  !1,
590
- () => s
604
+ () => r
591
605
  );
592
606
  },
593
- async operate(d) {
594
- return i(), V(d, t, e, !1, () => s);
607
+ async operate(f) {
608
+ return w(), J(f, e, o, !1, () => r);
595
609
  },
596
- emit(d, I) {
597
- i(), ne.emit(d, { payload: I, metadata: Object.freeze({ source: "app", appId: t, tabKey: e }) });
610
+ emit(f, I) {
611
+ w(), ae.emit(f, { payload: I, metadata: Object.freeze({ source: "app", appId: e, tabKey: o }) });
598
612
  },
599
- on(d, I) {
600
- i();
601
- const v = de.on(d, I);
602
- return c.add(v), () => {
603
- v(), c.delete(v);
613
+ on(f, I) {
614
+ w();
615
+ const E = le.on(f, I);
616
+ return i.add(E), () => {
617
+ E(), i.delete(E);
604
618
  };
605
619
  },
606
- dispose: P
620
+ dispose: v
607
621
  };
608
622
  }
609
623
  };
610
- return Z.set(t, u), u;
624
+ return re.set(e, u), u;
611
625
  }
612
626
  function Ge() {
613
- if (!T) {
614
- T = !0;
615
- for (const t of $.values()) [...t].forEach((r) => r());
616
- $.clear(), K.clear(), B.clear();
617
- for (const t of C.values()) [...t].forEach((r) => r());
618
- C.clear(), X.clear(), J.clear(), Z.clear(), de.clear(), f = { tabs: [], activeTabId: null };
627
+ if (!D) {
628
+ D = !0;
629
+ for (const e of B.values()) [...e].forEach((s) => s());
630
+ B.clear(), oe.clear(), U.clear();
631
+ for (const e of G.values()) [...e].forEach((s) => s());
632
+ G.clear(), te.clear(), K.clear(), re.clear(), le.clear(), d = { tabs: [], activeTabId: null };
619
633
  }
620
634
  }
621
635
  return {
622
636
  /** 注册应用的冻结元信息;不暴露 capabilities 注册表。 */
623
- apps: [...Y.values()],
624
- getState: ae,
625
- subscribe: Ee,
626
- openTab: _e,
637
+ apps: [...Z.values()],
638
+ getState: ce,
639
+ subscribe: me,
640
+ openTab: He,
627
641
  activateTab: $e,
628
642
  closeTab: Ce,
629
- updateTab: He,
643
+ updateTab: Fe,
630
644
  updateSession: ze,
631
- operate: Fe,
645
+ operate: Ve,
632
646
  bridge: Be,
633
647
  /** 宿主侧业务事件总线;无响应广播,来源元信息由宿主生成,异常通过 onError 隔离。 */
634
- bus: de,
648
+ bus: le,
635
649
  dispose: Ge
636
650
  };
637
651
  }
638
652
  export {
639
- Ue as createMicroHost
653
+ qe as createMicroHost
640
654
  };