@finesoft/front 0.2.0 → 0.3.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.
@@ -621,6 +621,16 @@ declare class Router {
621
621
  private parseUrl;
622
622
  }
623
623
  //#endregion
624
+ //#region ../core/src/router/types.d.ts
625
+ /**
626
+ * Router 共享类型
627
+ *
628
+ * `RouteParams` 是路由参数(path + query 经 codec 转换后)的统一形状,
629
+ * 同时也是 Intent.params、NavigationContext.params 与 LeafNode.params 的共同类型。
630
+ */
631
+ /** 路由参数:键为参数名,值为 codec 转换后的任意类型(string / number / boolean …)。 */
632
+ type RouteParams = Record<string, unknown>;
633
+ //#endregion
624
634
  //#region ../core/src/router/params/primitives.d.ts
625
635
  interface StrOptions {
626
636
  minLength?: number;
@@ -1117,6 +1127,585 @@ declare function pipeAsync<A, B, C, D>(m1: AsyncMapper<A, B>, m2: AsyncMapper<B,
1117
1127
  */
1118
1128
  declare function mapEach<TInput, TOutput>(mapper: Mapper<TInput, TOutput>): Mapper<TInput[], TOutput[]>;
1119
1129
  //#endregion
1130
+ //#region ../core/src/navigation/types.d.ts
1131
+ /**
1132
+ * 导航树里 `Page` 的别名 —— 运行期 dispatch 始终产出 `BasePage`,
1133
+ * 但导航层对内容无关,字段语义由应用决定。
1134
+ */
1135
+ type Page = BasePage;
1136
+ /** 导航节点 Kind 常量 */
1137
+ declare const NAVIGATION_NODE_KINDS: {
1138
+ readonly LEAF: "leaf";
1139
+ readonly STACK: "stack";
1140
+ readonly TABS: "tabs";
1141
+ readonly SPLIT: "split";
1142
+ };
1143
+ /** 所有导航节点 Kind 的联合类型 */
1144
+ type NavigationNodeKind = (typeof NAVIGATION_NODE_KINDS)[keyof typeof NAVIGATION_NODE_KINDS];
1145
+ /** 叶子:一个具体导航目标 */
1146
+ interface LeafNode {
1147
+ readonly kind: typeof NAVIGATION_NODE_KINDS.LEAF;
1148
+ readonly intent: string;
1149
+ readonly params: RouteParams;
1150
+ }
1151
+ /** 栈:有序路径,entries[0]=根,末尾=栈顶(可见) */
1152
+ interface StackNode {
1153
+ readonly kind: typeof NAVIGATION_NODE_KINDS.STACK;
1154
+ readonly entries: readonly NavigationNode[];
1155
+ }
1156
+ /** Tabs:并列分支 + 当前激活键 + 稳定顺序;仅激活分支可见 */
1157
+ interface TabsNode {
1158
+ readonly kind: typeof NAVIGATION_NODE_KINDS.TABS;
1159
+ readonly active: string;
1160
+ readonly order: readonly string[];
1161
+ readonly branches: Readonly<Record<string, NavigationNode>>;
1162
+ }
1163
+ /** Split 列:列 id + 该列内容(undefined = 尚未选择) */
1164
+ interface SplitColumn {
1165
+ readonly id: string;
1166
+ readonly content: NavigationNode | undefined;
1167
+ }
1168
+ /**
1169
+ * Split 列可见性,对标 SwiftUI `NavigationSplitViewVisibility`。
1170
+ *
1171
+ * 这是**可绑定 / 可序列化 / 可恢复的导航状态**(不是渲染样式):它决定哪些列算「可见」,
1172
+ * 进而影响 `collectVisibleDestinations` 与 SSR 预取——例如深链到 `detailOnly` 时服务端只预取 detail 列。
1173
+ *
1174
+ * - `automatic`(缺省):框架不裁剪,所有有内容的列都可见(SSR 端无视口信息时的安全默认;客户端再按视口自适应)。
1175
+ * - `all`:显式所有列可见(语义同 automatic 的全列)。
1176
+ * - `doubleColumn`:仅首列 + 末列可见(三列时隐藏中间 content 列)。
1177
+ * - `detailOnly`:仅末列(detail)可见。
1178
+ *
1179
+ * 注意:compact 视口塌缩成单栈(SwiftUI 的 `preferredCompactColumn`)是视口反应式的纯渲染决策,
1180
+ * 框架不建模,交给应用按 `getPlatform()` / 视口自行处理。
1181
+ */
1182
+ declare const SPLIT_VISIBILITIES: {
1183
+ readonly AUTOMATIC: "automatic";
1184
+ readonly ALL: "all";
1185
+ readonly DOUBLE_COLUMN: "doubleColumn";
1186
+ readonly DETAIL_ONLY: "detailOnly";
1187
+ };
1188
+ /** Split 列可见性的联合类型 */
1189
+ type SplitVisibility = (typeof SPLIT_VISIBILITIES)[keyof typeof SPLIT_VISIBILITIES];
1190
+ /**
1191
+ * Split:多列并存,列间通过 selectColumn 设置后续列内容。
1192
+ * `visibility` 决定哪些列算可见(缺省 `automatic` = 全列),是可序列化的导航状态。
1193
+ */
1194
+ interface SplitNode {
1195
+ readonly kind: typeof NAVIGATION_NODE_KINDS.SPLIT;
1196
+ readonly columns: readonly SplitColumn[];
1197
+ readonly visibility?: SplitVisibility;
1198
+ }
1199
+ /** 所有导航节点的联合类型 */
1200
+ type NavigationNode = LeafNode | StackNode | TabsNode | SplitNode;
1201
+ /** 指向树中某节点的路径(从根到目标)的一步 */
1202
+ type NavigationPathStep = {
1203
+ readonly kind: "stack-entry";
1204
+ readonly index: number;
1205
+ } | {
1206
+ readonly kind: "tab";
1207
+ readonly key: string;
1208
+ } | {
1209
+ readonly kind: "column";
1210
+ readonly id: string;
1211
+ };
1212
+ /** 指向树中某节点的完整路径(从根到目标) */
1213
+ type NavigationPath = readonly NavigationPathStep[];
1214
+ /** 单个可见目标的解析结果 */
1215
+ interface ResolvedDestination {
1216
+ readonly intent: string;
1217
+ readonly params: RouteParams;
1218
+ readonly page: Page;
1219
+ readonly status?: number;
1220
+ }
1221
+ /** 导航快照:当前树 + 所有可见目标解析结果(顺序与 collectVisibleDestinations 一致) */
1222
+ interface NavigationSnapshot {
1223
+ readonly tree: NavigationNode;
1224
+ readonly destinations: readonly ResolvedDestination[];
1225
+ }
1226
+ /** 错误类型:序列化 / 路径 / 操作非法时抛出 */
1227
+ declare class NavigationError extends Error {
1228
+ constructor(message: string);
1229
+ }
1230
+ //#endregion
1231
+ //#region ../core/src/navigation/nodes.d.ts
1232
+ /** 构造叶子节点(一个具体导航目标)。 */
1233
+ declare function leaf(intent: string, params?: RouteParams): LeafNode;
1234
+ /**
1235
+ * 构造栈节点。
1236
+ * 接受单个根节点(栈仅含根)或一个 entries 数组(entries[0]=根,末尾=栈顶)。
1237
+ *
1238
+ * @example
1239
+ * stack(leaf("home")) // 单根栈
1240
+ * stack([leaf("home"), leaf("detail")]) // 根 + 栈顶
1241
+ */
1242
+ declare function stack(rootOrEntries: NavigationNode | readonly NavigationNode[]): StackNode;
1243
+ /** tabs 构造选项 */
1244
+ interface TabsInit {
1245
+ /** 当前激活分支键 */
1246
+ readonly active: string;
1247
+ /** 分支映射(键 → 子节点) */
1248
+ readonly branches: Readonly<Record<string, NavigationNode>>;
1249
+ /** 稳定顺序;缺省时按 branches 的插入顺序推导 */
1250
+ readonly order?: readonly string[];
1251
+ }
1252
+ /**
1253
+ * 构造 Tabs 节点。
1254
+ * 缺省 `order` 时按 `branches` 的插入顺序(`Object.keys`)推导稳定顺序。
1255
+ */
1256
+ declare function tabs(init: TabsInit): TabsNode;
1257
+ /** split 列初始化(content 可缺省 = 尚未选择) */
1258
+ interface SplitColumnInit {
1259
+ readonly id: string;
1260
+ readonly content?: NavigationNode;
1261
+ }
1262
+ /**
1263
+ * 构造 Split 节点(多列并存)。
1264
+ * `visibility` 缺省(不写字段)等价 `automatic` = 全列可见;
1265
+ * 显式传入时纳入节点状态,影响 `collectVisibleDestinations` 与 SSR 预取。
1266
+ *
1267
+ * @example
1268
+ * split([{ id: "sidebar", content: leaf("folders") }, { id: "detail" }])
1269
+ * split([...], "detailOnly") // 深链:仅 detail 列可见
1270
+ */
1271
+ declare function split(columns: readonly SplitColumnInit[], visibility?: SplitVisibility): SplitNode;
1272
+ declare function isLeafNode(node: NavigationNode): node is LeafNode;
1273
+ declare function isStackNode(node: NavigationNode): node is StackNode;
1274
+ declare function isTabsNode(node: NavigationNode): node is TabsNode;
1275
+ declare function isSplitNode(node: NavigationNode): node is SplitNode;
1276
+ //#endregion
1277
+ //#region ../core/src/navigation/operations.d.ts
1278
+ /**
1279
+ * 解析「激活路径」:从根沿可见分支一路向下,直到叶子或无法继续。
1280
+ * - leaf:路径在此结束
1281
+ * - stack:进入栈顶 entry
1282
+ * - tabs:进入 active 分支
1283
+ * - split:进入最后一个有内容的列(无任何内容则结束)
1284
+ */
1285
+ declare function resolveActivePath(tree: NavigationNode): NavigationPath;
1286
+ /**
1287
+ * 按路径定位节点;任一步无效(索引越界 / 键不存在 / 列为空 / kind 不匹配)返回 undefined。
1288
+ */
1289
+ declare function findNode(tree: NavigationNode, path: NavigationPath): NavigationNode | undefined;
1290
+ /**
1291
+ * 找到 target 处(默认激活路径)「at/under」最近的 StackNode 路径。
1292
+ * 从 target 节点沿激活分支向下,返回第一个遇到的 StackNode 的完整路径;
1293
+ * 找不到则返回 undefined。
1294
+ */
1295
+ declare function findNearestStack(tree: NavigationNode, path: NavigationPath): NavigationPath | undefined;
1296
+ /**
1297
+ * 收集所有可见的叶子目标(顺序即渲染/解析顺序)。
1298
+ * - leaf → [leaf]
1299
+ * - stack → 栈顶 entry 的可见目标
1300
+ * - tabs → active 分支的可见目标
1301
+ * - split → 每个有内容的列的可见目标,按列序拼接
1302
+ */
1303
+ declare function collectVisibleDestinations(tree: NavigationNode): readonly LeafNode[];
1304
+ /**
1305
+ * 按 `visibility` 求出一个 split 节点当前**可见**的列(不裁剪空内容列——空 content 由调用方处理)。
1306
+ *
1307
+ * - `automatic`(缺省)/ `all`:全部列。
1308
+ * - `doubleColumn`:首列 + 末列(三列时隐藏中间 content 列;列数 ≤ 2 时等价全部)。
1309
+ * - `detailOnly`:仅末列(detail)。
1310
+ *
1311
+ * 应用渲染时也可用它决定该画哪几列,无需自行重实现可见性映射。
1312
+ */
1313
+ declare function visibleSplitColumns(node: SplitNode): readonly SplitColumn[];
1314
+ /** 在目标栈(默认激活栈,或 target「at/under」最近的 stack)顶部 push 一个节点。 */
1315
+ declare function push(tree: NavigationNode, node: NavigationNode, target?: NavigationPath): NavigationNode;
1316
+ /** 从 target 处最近的 stack 弹出 count 个 entry(默认 1);绝不弹到根 entry 之下。 */
1317
+ declare function pop(tree: NavigationNode, count?: number, target?: NavigationPath): NavigationNode;
1318
+ /** 把 target 处最近的 stack 弹回到根 entry。 */
1319
+ declare function popToRoot(tree: NavigationNode, target?: NavigationPath): NavigationNode;
1320
+ /** 把 target 处最近的 stack 弹回到指定 index(保留 [0..index])。 */
1321
+ declare function popTo(tree: NavigationNode, index: number, target?: NavigationPath): NavigationNode;
1322
+ /** 替换 target 处最近 stack 的栈顶 entry(栈为空时抛错)。 */
1323
+ declare function replaceTop(tree: NavigationNode, node: NavigationNode, target?: NavigationPath): NavigationNode;
1324
+ /**
1325
+ * 切换 tabs 节点的激活分支。
1326
+ * target 默认为「最近的激活 tabs 节点」;target 必须指向 TabsNode,且 key 必须是已知分支。
1327
+ */
1328
+ declare function selectTab(tree: NavigationNode, key: string, target?: NavigationPath): NavigationNode;
1329
+ /**
1330
+ * 设置 split 某列内容,并清空它之后的所有列(content 置 undefined)。
1331
+ * target 默认为「最近的激活 split 节点」;columnId 必须是已知列。
1332
+ */
1333
+ declare function selectColumn(tree: NavigationNode, columnId: string, content: NavigationNode | undefined, target?: NavigationPath): NavigationNode;
1334
+ /**
1335
+ * 设置 split 节点的列可见性(对标 SwiftUI `NavigationSplitViewVisibility`)。
1336
+ * target 默认为「最近的激活 split 节点」。改变 visibility 会影响 `collectVisibleDestinations`,
1337
+ * 进而触发 controller 对「新变可见」的列做 dispatch / SSR 预取(如 detailOnly → all 时补预取 sidebar/content)。
1338
+ */
1339
+ declare function setVisibility(tree: NavigationNode, visibility: SplitVisibility, target?: NavigationPath): NavigationNode;
1340
+ //#endregion
1341
+ //#region ../core/src/navigation/serialization.d.ts
1342
+ /** 序列化叶子 */
1343
+ interface SerializedLeaf {
1344
+ readonly kind: typeof NAVIGATION_NODE_KINDS.LEAF;
1345
+ readonly intent: string;
1346
+ readonly params: RouteParams;
1347
+ }
1348
+ /** 序列化栈 */
1349
+ interface SerializedStack {
1350
+ readonly kind: typeof NAVIGATION_NODE_KINDS.STACK;
1351
+ readonly entries: readonly SerializedNavigation[];
1352
+ }
1353
+ /** 序列化 Tabs */
1354
+ interface SerializedTabs {
1355
+ readonly kind: typeof NAVIGATION_NODE_KINDS.TABS;
1356
+ readonly active: string;
1357
+ readonly order: readonly string[];
1358
+ readonly branches: Readonly<Record<string, SerializedNavigation>>;
1359
+ }
1360
+ /** 序列化 Split 列(空内容用 null 表示,JSON 安全) */
1361
+ interface SerializedSplitColumn {
1362
+ readonly id: string;
1363
+ readonly content: SerializedNavigation | null;
1364
+ }
1365
+ /** 序列化 Split(visibility 缺省时不写该字段,保持紧凑) */
1366
+ interface SerializedSplit {
1367
+ readonly kind: typeof NAVIGATION_NODE_KINDS.SPLIT;
1368
+ readonly columns: readonly SerializedSplitColumn[];
1369
+ readonly visibility?: SplitVisibility;
1370
+ }
1371
+ /** 序列化后的导航树(JSON 安全的可辨识联合) */
1372
+ type SerializedNavigation = SerializedLeaf | SerializedStack | SerializedTabs | SerializedSplit;
1373
+ /** 把导航树序列化为 JSON 安全的纯对象。 */
1374
+ declare function serializeNavigation(tree: NavigationNode): SerializedNavigation;
1375
+ /** 导航树的确定性字符串形式(keys 排序);用于稳定缓存键 / 紧凑编码。 */
1376
+ declare function serializeNavigationStable(tree: NavigationNode): string;
1377
+ /** 从 JSON 安全数据还原导航树;结构畸形抛 NavigationError。 */
1378
+ declare function deserializeNavigation(data: unknown): NavigationNode;
1379
+ //#endregion
1380
+ //#region ../core/src/navigation/codec.d.ts
1381
+ /**
1382
+ * Router 的最小读取面 —— codec 只依赖这两个公共方法,避免与 Router 实现耦合。
1383
+ * (`reverse` 为可选:若 Router 将来提供则优先使用。)
1384
+ */
1385
+ interface NavigationRouterLike {
1386
+ /** 所有已注册路由的 `"pattern → intentId"` 摘要 */
1387
+ getRoutes(): string[];
1388
+ /** 可选:把 intentId + 参数反查为 URL(若实现则 encode 优先使用) */
1389
+ reverse?(intentId: string, params: RouteParams): string | undefined;
1390
+ }
1391
+ /**
1392
+ * 导航 URL 编解码器。
1393
+ * - `encode`:把导航树映射为 URL。
1394
+ * - `decode`:把 URL 还原为导航树;无法(或无需)从 URL 同步还原时返回 `undefined`。
1395
+ */
1396
+ interface NavigationCodec {
1397
+ encode(tree: NavigationNode, router: NavigationRouterLike): string;
1398
+ decode(url: string, router: NavigationRouterLike): NavigationNode | undefined;
1399
+ }
1400
+ /** 默认结构化覆盖参数名(full-state 编码所用的保留 query key)。 */
1401
+ declare const DEFAULT_NAV_PARAM = "__nav";
1402
+ /**
1403
+ * 把整棵树编码为紧凑、URL 安全、确定性的字符串。
1404
+ * 用 `serializeNavigationStable`(keys 排序)保证相同树产出相同串,再做 base64url。
1405
+ */
1406
+ declare function encodeNavigationTreeParam(tree: NavigationNode): string;
1407
+ /**
1408
+ * 还原 `encodeNavigationTreeParam` 的输出为导航树;畸形输入抛 NavigationError。
1409
+ */
1410
+ declare function decodeNavigationTreeParam(encoded: string): NavigationNode;
1411
+ /**
1412
+ * 默认 codec:
1413
+ * - `encode`:把激活叶子反查为 URL(`Router.reverse` 或路由摘要反查);激活叶子无对应路由时回退 `"/"`。
1414
+ * - `decode`:仅在 URL 带 `__nav` 结构化覆盖时同步还原整棵树;否则返回 `undefined`,
1415
+ * 交由调用方走 `await router.resolve(url)` 异步重建单个 LeafNode(今天的行为)。
1416
+ */
1417
+ declare function createActiveLeafCodec(): NavigationCodec;
1418
+ /** full-state codec 选项 */
1419
+ interface FullStateCodecOptions {
1420
+ /** 保留 query 参数名(整树编码所用);默认 `__nav`。 */
1421
+ readonly param?: string;
1422
+ }
1423
+ /**
1424
+ * 整树 codec:把整棵树编码进保留 query 参数(默认 `__nav`),支持完整深链。
1425
+ * - `encode`:以激活叶子的 URL 作为基底路径(保留 app 可能依赖的 path/query),
1426
+ * 再写入保留参数承载整棵树。激活叶子无对应路由时基底退化为 `"/"`。
1427
+ * - `decode`:读取保留参数无损还原整棵树;缺失该参数时返回 `undefined`(交由调用方走默认路径)。
1428
+ */
1429
+ declare function createFullStateCodec(options?: FullStateCodecOptions): NavigationCodec;
1430
+ //#endregion
1431
+ //#region ../core/src/navigation/controller.d.ts
1432
+ /** 导航操作 Kind 常量 */
1433
+ declare const NAVIGATION_OP_KINDS: {
1434
+ readonly PUSH: "push";
1435
+ readonly POP: "pop";
1436
+ readonly POP_TO_ROOT: "popToRoot";
1437
+ readonly POP_TO: "popTo";
1438
+ readonly REPLACE_TOP: "replaceTop";
1439
+ readonly SELECT_TAB: "selectTab";
1440
+ readonly SELECT_COLUMN: "selectColumn";
1441
+ readonly SET_VISIBILITY: "setVisibility";
1442
+ readonly HYDRATE: "hydrate";
1443
+ };
1444
+ /** 所有导航操作 Kind 的联合类型 */
1445
+ type NavigationOpKind = (typeof NAVIGATION_OP_KINDS)[keyof typeof NAVIGATION_OP_KINDS];
1446
+ /** push:在目标栈顶压入一个新 leaf(intent + params)。 */
1447
+ interface PushOperation {
1448
+ readonly kind: typeof NAVIGATION_OP_KINDS.PUSH;
1449
+ readonly intent: string;
1450
+ readonly params?: RouteParams;
1451
+ readonly target?: NavigationPath;
1452
+ }
1453
+ /** pop:从目标栈弹出 count 个 entry(默认 1)。 */
1454
+ interface PopOperation {
1455
+ readonly kind: typeof NAVIGATION_OP_KINDS.POP;
1456
+ readonly count?: number;
1457
+ readonly target?: NavigationPath;
1458
+ }
1459
+ /** popToRoot:把目标栈弹回根 entry。 */
1460
+ interface PopToRootOperation {
1461
+ readonly kind: typeof NAVIGATION_OP_KINDS.POP_TO_ROOT;
1462
+ readonly target?: NavigationPath;
1463
+ }
1464
+ /** popTo:把目标栈弹回指定 index。 */
1465
+ interface PopToOperation {
1466
+ readonly kind: typeof NAVIGATION_OP_KINDS.POP_TO;
1467
+ readonly index: number;
1468
+ readonly target?: NavigationPath;
1469
+ }
1470
+ /** replaceTop:替换目标栈的栈顶为新 leaf。 */
1471
+ interface ReplaceTopOperation {
1472
+ readonly kind: typeof NAVIGATION_OP_KINDS.REPLACE_TOP;
1473
+ readonly intent: string;
1474
+ readonly params?: RouteParams;
1475
+ readonly target?: NavigationPath;
1476
+ }
1477
+ /** selectTab:切换 tabs 节点的激活分支。 */
1478
+ interface SelectTabOperation {
1479
+ readonly kind: typeof NAVIGATION_OP_KINDS.SELECT_TAB;
1480
+ readonly key: string;
1481
+ readonly target?: NavigationPath;
1482
+ }
1483
+ /** selectColumn:设置 split 某列内容(intent 为 undefined 表示清空该列)。 */
1484
+ interface SelectColumnOperation {
1485
+ readonly kind: typeof NAVIGATION_OP_KINDS.SELECT_COLUMN;
1486
+ readonly columnId: string;
1487
+ readonly intent: string | undefined;
1488
+ readonly params?: RouteParams;
1489
+ readonly target?: NavigationPath;
1490
+ }
1491
+ /** setVisibility:设置 split 节点的列可见性(对标 NavigationSplitViewVisibility)。 */
1492
+ interface SetVisibilityOperation {
1493
+ readonly kind: typeof NAVIGATION_OP_KINDS.SET_VISIBILITY;
1494
+ readonly visibility: SplitVisibility;
1495
+ readonly target?: NavigationPath;
1496
+ }
1497
+ /** hydrate:用外部给定的整棵树替换当前树(来自 history/URL 还原)。 */
1498
+ interface HydrateOperation {
1499
+ readonly kind: typeof NAVIGATION_OP_KINDS.HYDRATE;
1500
+ readonly tree: NavigationNode;
1501
+ }
1502
+ /** 所有导航操作的可辨识联合。 */
1503
+ type NavigationOperation = PushOperation | PopOperation | PopToRootOperation | PopToOperation | ReplaceTopOperation | SelectTabOperation | SelectColumnOperation | SetVisibilityOperation | HydrateOperation;
1504
+ /**
1505
+ * 控制器解析单个目标时需要的「环境」——由应用提供。
1506
+ *
1507
+ * 仓库里没有契约所说的 `IntentContext`:dispatch 需要 `Container`,守卫需要
1508
+ * `NavigationContext`(含 url/cookie/header)。所以 `createContext` 在此被建模为
1509
+ * 「给定目标 intent/params,返回构建守卫上下文 + 派发所需的零件」:
1510
+ * - `container`:派发 intent 用(`intentDispatcher.dispatch(intent, container)`)。
1511
+ * - `navigation`:完整的 `NavigationContext`(应用按 SSR/CSR 用
1512
+ * `createServerContext`/`createBrowserContext` 造好传入);缺省时控制器用一个不含
1513
+ * cookie/header 的最小上下文兜底(含 url/path/params/intent/container/isServer,
1514
+ * 其中 isServer 取 `NavigationControllerOptions.isServer`,缺省按运行环境推断)。
1515
+ *
1516
+ * `signal` 暂无消费方(现有 runner 也没有 AbortSignal 管线),仅透传保留。
1517
+ */
1518
+ interface NavigationContextInput {
1519
+ readonly intent: string;
1520
+ readonly params: RouteParams;
1521
+ readonly signal?: AbortSignal;
1522
+ }
1523
+ /** `createContext` 的返回:派发用的 Container + 守卫用的 NavigationContext(可选)。 */
1524
+ interface NavigationDispatchContext {
1525
+ /** DI 容器 —— intent 派发的必备参数。 */
1526
+ readonly container: Container;
1527
+ /** 守卫上下文;缺省时控制器用最小上下文兜底。 */
1528
+ readonly navigation?: NavigationContext;
1529
+ /** 该目标对应的完整 URL(用于最小兜底上下文的 url/path)。 */
1530
+ readonly url?: string;
1531
+ }
1532
+ /** NavigationController 构造选项。 */
1533
+ interface NavigationControllerOptions {
1534
+ /** Intent 派发器(派发可见目标的 intent → page)。 */
1535
+ readonly intentDispatcher: IntentDispatcher;
1536
+ /** 路由器(beforeLoad rewrite/redirect 时把 URL 重解析为 leaf)。 */
1537
+ readonly router: Router;
1538
+ /** 初始导航树(单 LeafNode = 今天的扁平单页)。 */
1539
+ readonly initial: NavigationNode;
1540
+ /** 应用提供的「目标 → 派发上下文」构建回调。 */
1541
+ readonly createContext: (input: NavigationContextInput) => NavigationDispatchContext;
1542
+ /**
1543
+ * 是否运行在服务端——仅用于 `createContext` 未返回 `navigation` 时的最小兜底上下文,
1544
+ * 决定该上下文的 `isServer` 字段。缺省时按运行环境推断(`typeof window === "undefined"`)。
1545
+ * 应用若已通过 `createContext` 提供完整 `navigation`,此项不生效。
1546
+ */
1547
+ readonly isServer?: boolean;
1548
+ /** 目标级 beforeLoad 守卫(在全局/路由守卫之外,由控制器对主目标执行)。 */
1549
+ readonly beforeLoad?: readonly BeforeLoadGuard[];
1550
+ /** 目标级 afterLoad 守卫。 */
1551
+ readonly afterLoad?: readonly AfterLoadGuard[];
1552
+ /** SSR 预取缓存(浏览器 hydration 时复用服务端解析结果)。 */
1553
+ readonly prefetched?: PrefetchedIntents;
1554
+ /**
1555
+ * 兜底错误页工厂——dispatch 失败 / deny 时,用它产出该目标的 page。
1556
+ * 缺省用一个最小的 BasePage(pageType="error")。复刻 runner 的 fallback 语义。
1557
+ */
1558
+ readonly getErrorPage?: (status: number, message: string) => Page;
1559
+ /**
1560
+ * redirect 处理器——beforeLoad/afterLoad 返回 redirect 时调用(SPA 内跳 / 外链)。
1561
+ * 控制器不持有 history,把「怎么跳」交给应用(浏览器侧 → `framework.perform`)。
1562
+ * 缺省为 no-op(该目标不 dispatch、不再跳,仅保留当前页/兜底页)。
1563
+ */
1564
+ readonly onRedirect?: (redirect: {
1565
+ url: string;
1566
+ status: number;
1567
+ }) => void;
1568
+ }
1569
+ /** 导航控制器对外接口。 */
1570
+ interface NavigationController {
1571
+ /** 当前导航树。 */
1572
+ getTree(): NavigationNode;
1573
+ /** 当前快照(树 + 已解析的可见目标)。 */
1574
+ getSnapshot(): NavigationSnapshot;
1575
+ /** 应用一个声明式操作,重解析并提交,返回新快照。 */
1576
+ apply(op: NavigationOperation): Promise<NavigationSnapshot>;
1577
+ /** 便捷:在激活栈压入新目标。 */
1578
+ push(intent: string, params?: RouteParams, options?: PushOptions): Promise<NavigationSnapshot>;
1579
+ /** 便捷:从激活栈弹出。 */
1580
+ pop(count?: number): Promise<NavigationSnapshot>;
1581
+ /** 便捷:激活栈弹回根。 */
1582
+ popToRoot(): Promise<NavigationSnapshot>;
1583
+ /** 便捷:替换激活栈栈顶。 */
1584
+ replaceTop(intent: string, params?: RouteParams): Promise<NavigationSnapshot>;
1585
+ /** 便捷:切换 tabs 激活分支。 */
1586
+ selectTab(key: string, target?: NavigationPath): Promise<NavigationSnapshot>;
1587
+ /** 便捷:设置 split 列内容(intent=undefined 清空)。 */
1588
+ selectColumn(columnId: string, intent: string | undefined, params?: RouteParams, target?: NavigationPath): Promise<NavigationSnapshot>;
1589
+ /** 便捷:设置 split 列可见性(对标 NavigationSplitViewVisibility);改变可见集会触发新可见列的派发。 */
1590
+ setVisibility(visibility: SplitVisibility, target?: NavigationPath): Promise<NavigationSnapshot>;
1591
+ /** 用外部树替换当前树并重解析(history/URL 还原)。 */
1592
+ hydrate(tree: NavigationNode): Promise<NavigationSnapshot>;
1593
+ /** 订阅快照变更;返回取消订阅函数。 */
1594
+ subscribe(listener: (snapshot: NavigationSnapshot) => void): () => void;
1595
+ /** 解析当前树(首屏 SSR/CSR),提交并返回快照。 */
1596
+ resolve(): Promise<NavigationSnapshot>;
1597
+ }
1598
+ /** `push` 便捷方法的可选项。 */
1599
+ interface PushOptions {
1600
+ readonly target?: NavigationPath;
1601
+ }
1602
+ declare function createNavigationController(options: NavigationControllerOptions): NavigationController;
1603
+ //#endregion
1604
+ //#region ../core/src/bootstrap/define-navigation.d.ts
1605
+ /**
1606
+ * `initial` 既可是一棵静态初始树,也可是按 URL 产出树骨架的工厂。
1607
+ *
1608
+ * - 静态树:所有请求(CSR 首屏 / SSR 无深链回退)都以这棵树为初始结构。
1609
+ * - 工厂 `(url) => NavigationNode | undefined`:按请求 URL 动态决定骨架;返回 `undefined`
1610
+ * 表示「此 URL 无结构化骨架」,SSR 侧据此回退到「`Router.resolve` → 单 LeafNode」
1611
+ * (今天的单页行为)。CSR 侧首屏对工厂传入当前 `window.location` 的 path+query。
1612
+ */
1613
+ type NavigationInitial = NavigationNode | ((url: string) => NavigationNode | undefined);
1614
+ /**
1615
+ * 浏览器 runner(`startBrowserApp`)期望的导航配置形态。
1616
+ *
1617
+ * 与 `@finesoft/browser` 的 `BrowserNavigationConfig` 结构等价(`initial` 为具体树);
1618
+ * 在 core 中以结构化形状声明,避免 core → browser 的反向依赖。
1619
+ */
1620
+ interface NavigationBrowserConfig {
1621
+ readonly initial: NavigationNode;
1622
+ readonly codec?: NavigationCodec;
1623
+ readonly beforeLoad?: readonly BeforeLoadGuard[];
1624
+ readonly afterLoad?: readonly AfterLoadGuard[];
1625
+ readonly getErrorPage?: (status: number, message: string) => BasePage;
1626
+ }
1627
+ /**
1628
+ * SSR runner(`createSSRNavigationRender` / `ssrRenderNavigation`)期望的导航定义形态。
1629
+ *
1630
+ * 与 `@finesoft/ssr` 的 `SSRNavigationDefinition` 结构等价(`codec` 必填、`initial`
1631
+ * 为骨架工厂);在 core 中以结构化形状声明,避免 core → ssr 的反向依赖。
1632
+ */
1633
+ interface NavigationSSRDefinition {
1634
+ readonly codec: NavigationCodec;
1635
+ readonly initial?: (url: string) => NavigationNode | undefined;
1636
+ readonly beforeLoad?: readonly BeforeLoadGuard[];
1637
+ readonly afterLoad?: readonly AfterLoadGuard[];
1638
+ }
1639
+ /** `defineNavigation` 的输入声明。 */
1640
+ interface DefineNavigationOptions {
1641
+ /**
1642
+ * 初始导航结构:静态树或按 URL 产出树骨架的工厂。
1643
+ * 单个 `leaf(...)` 树即为今天的扁平单页(向后兼容)。
1644
+ */
1645
+ readonly initial: NavigationInitial;
1646
+ /**
1647
+ * URL ⇄ 树 编解码器;缺省 `createActiveLeafCodec()`
1648
+ * (URL 只反映激活叶子,整树通过 history/hydration 旁路)。
1649
+ */
1650
+ readonly codec?: NavigationCodec;
1651
+ /** 导航级 beforeLoad 守卫(控制器对主目标执行,叠加在全局/路由守卫之外)。 */
1652
+ readonly beforeLoad?: readonly BeforeLoadGuard[];
1653
+ /** 导航级 afterLoad 守卫。 */
1654
+ readonly afterLoad?: readonly AfterLoadGuard[];
1655
+ /** dispatch 失败 / deny 时的兜底错误页工厂(仅 CSR runner 直接消费;SSR runner 用其自带的 getErrorPage)。 */
1656
+ readonly getErrorPage?: (status: number, message: string) => BasePage;
1657
+ }
1658
+ /**
1659
+ * `defineNavigation` 的产物:规范化后的导航定义。
1660
+ *
1661
+ * 既暴露规范化字段(应用可自取),也提供两个适配器把定义转成各 runner 需要的精确形态。
1662
+ * 字段全部 `readonly`、不可变。
1663
+ */
1664
+ interface NavigationDefinition {
1665
+ /** 规范化的初始结构(静态树或工厂)。 */
1666
+ readonly initial: NavigationInitial;
1667
+ /** 最终生效的 codec(已套用默认值)。 */
1668
+ readonly codec: NavigationCodec;
1669
+ /** 导航级 beforeLoad 守卫。 */
1670
+ readonly beforeLoad?: readonly BeforeLoadGuard[];
1671
+ /** 导航级 afterLoad 守卫。 */
1672
+ readonly afterLoad?: readonly AfterLoadGuard[];
1673
+ /** 兜底错误页工厂。 */
1674
+ readonly getErrorPage?: (status: number, message: string) => BasePage;
1675
+ /**
1676
+ * 适配为浏览器 runner 配置(`initial` 收敛为具体树)。
1677
+ * `initial` 是工厂时,对 `url`(缺省当前 `window.location`)求值;返回 `undefined`
1678
+ * 时回退到一个最小的占位 leaf(`@finesoft/navigation-root`),保证 bridge 能挂载——
1679
+ * 浏览器首屏随后会用 SSR 注入的真实树 hydrate(见 navigation-bridge)。
1680
+ */
1681
+ toBrowserConfig(url?: string): NavigationBrowserConfig;
1682
+ /** 适配为 SSR runner 定义(`initial` 收敛为骨架工厂、`codec` 必填)。 */
1683
+ toSSRDefinition(): NavigationSSRDefinition;
1684
+ }
1685
+ /**
1686
+ * 声明结构化导航。
1687
+ *
1688
+ * 在 `bootstrap(framework)` 里与 `defineRoutes` 并列调用,返回一个 `NavigationDefinition`,
1689
+ * 由应用分别交给 CSR / SSR runner:
1690
+ *
1691
+ * @example
1692
+ * ```ts
1693
+ * const nav = defineNavigation({
1694
+ * initial: tabs({
1695
+ * active: "home",
1696
+ * branches: { home: stack(leaf("home")), me: stack(leaf("me")) },
1697
+ * }),
1698
+ * beforeLoad: [authGuard],
1699
+ * });
1700
+ *
1701
+ * // CSR
1702
+ * startBrowserApp({ bootstrap, mount, callbacks, navigation: nav.toBrowserConfig() });
1703
+ * // SSR
1704
+ * createSSRNavigationRender({ bootstrap, getErrorPage, renderApp, navigation: nav.toSSRDefinition() });
1705
+ * ```
1706
+ */
1707
+ declare function defineNavigation(options: DefineNavigationOptions): NavigationDefinition;
1708
+ //#endregion
1120
1709
  //#region ../core/src/bootstrap/define-routes.d.ts
1121
1710
  /** 渲染模式 */
1122
1711
  type RenderMode = "ssr" | "csr" | "prerender";
@@ -1456,6 +2045,14 @@ interface FlowActionDependencies {
1456
2045
  }) => void;
1457
2046
  /** 获取可滚动页面元素,用于滚动位置保存/恢复 */
1458
2047
  getScrollablePageElement?: () => HTMLElement | null;
2048
+ /**
2049
+ * 是否由本 handler 管理浏览器 history(pushState / popstate)。缺省 `true`。
2050
+ * 结构化导航(`startBrowserApp({ navigation })`)下应传 `false`:history 由
2051
+ * NavigationBridge 独占,否则两套 `History` 实例会争抢同一个 `window.history.state`、
2052
+ * 各自注册 popstate 互相 clobber,导致 back/forward 行为错乱。传 `false` 时本 handler
2053
+ * 仍负责 dispatch + updateApp(初始渲染 / redirect / modal),只是不碰 history。
2054
+ */
2055
+ manageHistory?: boolean;
1459
2056
  }
1460
2057
  declare function registerFlowActionHandler(deps: FlowActionDependencies): void;
1461
2058
  //#endregion
@@ -1470,10 +2067,85 @@ interface ActionHandlerDependencies {
1470
2067
  }) => void;
1471
2068
  /** 获取可滚动页面元素,用于滚动位置保存/恢复 */
1472
2069
  getScrollablePageElement?: () => HTMLElement | null;
2070
+ /** 是否由 FlowAction handler 管理 history;结构化导航下传 `false`(见 registerFlowActionHandler)。 */
2071
+ manageHistory?: boolean;
1473
2072
  }
1474
2073
  declare function registerActionHandlers(deps: ActionHandlerDependencies): void;
1475
2074
  //#endregion
2075
+ //#region ../browser/src/navigation-bridge.d.ts
2076
+ /** NavigationBridge 构造依赖。 */
2077
+ interface NavigationBridgeDependencies {
2078
+ /** 已构建好的导航控制器(持有 initial 树、intentDispatcher、router 等)。 */
2079
+ readonly controller: NavigationController;
2080
+ /** URL 编解码器(默认 `createActiveLeafCodec`)。 */
2081
+ readonly codec: NavigationCodec;
2082
+ /** Router 的最小读取面(encode 反查 / decode 用)。 */
2083
+ readonly router: NavigationRouterLike;
2084
+ /** 日志器。 */
2085
+ readonly log: Logger;
2086
+ /** 获取可滚动页面元素,用于滚动位置保存/恢复(透传给 History)。 */
2087
+ readonly getScrollablePageElement?: () => HTMLElement | null;
2088
+ }
2089
+ /**
2090
+ * 导航操作句柄 —— 向应用暴露的对外面。
2091
+ *
2092
+ * 所有写操作返回提交后的 `NavigationSnapshot`;写操作会同步把新树落到 history/URL。
2093
+ * `subscribe` 与 controller 的订阅一致(每次提交都回调,含来自 popstate 的 hydrate)。
2094
+ */
2095
+ interface NavigationHandle {
2096
+ /** 当前快照(树 + 已解析的可见目标)。 */
2097
+ getSnapshot(): NavigationSnapshot;
2098
+ /** 在激活栈压入新目标。 */
2099
+ push(intent: string, params?: RouteParams, options?: {
2100
+ target?: NavigationPath;
2101
+ }): Promise<NavigationSnapshot>;
2102
+ /** 从激活栈弹出 count 个(默认 1)。 */
2103
+ pop(count?: number): Promise<NavigationSnapshot>;
2104
+ /** 激活栈弹回根。 */
2105
+ popToRoot(): Promise<NavigationSnapshot>;
2106
+ /** 替换激活栈栈顶。 */
2107
+ replaceTop(intent: string, params?: RouteParams): Promise<NavigationSnapshot>;
2108
+ /** 切换 tabs 激活分支。 */
2109
+ selectTab(key: string, target?: NavigationPath): Promise<NavigationSnapshot>;
2110
+ /** 设置 split 列内容(intent=undefined 清空该列)。 */
2111
+ selectColumn(columnId: string, intent: string | undefined, params?: RouteParams, target?: NavigationPath): Promise<NavigationSnapshot>;
2112
+ /** 用外部树替换当前树并重解析(一般由桥内部 popstate 调用,亦对外暴露)。 */
2113
+ hydrate(tree: NavigationNode): Promise<NavigationSnapshot>;
2114
+ /** 订阅快照变更;返回取消订阅函数。 */
2115
+ subscribe(listener: (snapshot: NavigationSnapshot) => void): () => void;
2116
+ }
2117
+ /**
2118
+ * 创建 NavigationBridge:订阅 controller、装配 popstate、返回 navigation handle。
2119
+ *
2120
+ * 调用后 bridge 已激活(已订阅 controller + 已注册 popstate listener)。应用应在调用前/后
2121
+ * 调一次 `controller.resolve()` 完成首屏解析;首屏的快照提交会被 bridge 用 `replaceState`
2122
+ * 写入 history(first-page 语义),不会污染历史栈。
2123
+ */
2124
+ declare function createNavigationBridge(deps: NavigationBridgeDependencies): NavigationHandle;
2125
+ //#endregion
1476
2126
  //#region ../browser/src/start-app.d.ts
2127
+ /**
2128
+ * 结构化导航定义 —— 由应用通过 `defineNavigation(...)` 或手写提供。
2129
+ *
2130
+ * 仅当该字段出现时 bridge 才激活;缺省时 `startBrowserApp` 走原有扁平单页路径,行为不变。
2131
+ * 提供后:
2132
+ * - 用 `initial` 树构建 `NavigationController`(守卫上下文走 `createBrowserContext`,
2133
+ * 预取缓存复用 `framework.prefetchedIntents`);
2134
+ * - 装配 `NavigationBridge`(snapshot → history/URL,popstate → hydrate);
2135
+ * - 解析首屏树(一次 `resolve()`),通过 `onNavigationReady` 把 handle 交给应用。
2136
+ */
2137
+ interface BrowserNavigationConfig {
2138
+ /** 初始导航树(单 LeafNode = 今天的扁平单页)。 */
2139
+ readonly initial: NavigationNode;
2140
+ /** URL 编解码器;缺省 `createActiveLeafCodec()`。 */
2141
+ readonly codec?: NavigationCodec;
2142
+ /** 导航级 beforeLoad 守卫(对主目标执行)。 */
2143
+ readonly beforeLoad?: readonly BeforeLoadGuard[];
2144
+ /** 导航级 afterLoad 守卫。 */
2145
+ readonly afterLoad?: readonly AfterLoadGuard[];
2146
+ /** dispatch 失败 / deny 时的兜底错误页工厂。 */
2147
+ readonly getErrorPage?: (status: number, message: string) => BasePage;
2148
+ }
1477
2149
  interface BrowserAppConfig {
1478
2150
  /** 注册 controllers 和路由的引导函数 */
1479
2151
  bootstrap: (framework: Framework) => void;
@@ -1523,6 +2195,21 @@ interface BrowserAppConfig {
1523
2195
  * 显式传入时会覆盖 bootstrap / Vite 自动生成的 loader。
1524
2196
  */
1525
2197
  loadMessages?: MessagesLoader;
2198
+ /**
2199
+ * 结构化导航定义(可选)。
2200
+ *
2201
+ * 提供后,`startBrowserApp` 在挂载后构建 NavigationController + NavigationBridge,
2202
+ * 解析首屏树,并通过 `onNavigationReady` 把导航 handle 交给应用。缺省时走原有
2203
+ * 扁平单页路径(FlowAction handler),行为完全不变。
2204
+ */
2205
+ navigation?: BrowserNavigationConfig;
2206
+ /**
2207
+ * 导航就绪回调 —— bridge 装配并完成首屏 `resolve()` 后调用。
2208
+ *
2209
+ * 仅当提供了 `navigation` 时触发。应用拿到 handle 后用它驱动导航
2210
+ * (push/pop/selectTab…)并订阅快照渲染 UI。
2211
+ */
2212
+ onNavigationReady?: (handle: NavigationHandle) => void | Promise<void>;
1526
2213
  }
1527
2214
  /**
1528
2215
  * 启动客户端应用
@@ -1534,13 +2221,25 @@ declare function startBrowserApp(config: BrowserAppConfig): Promise<void>;
1534
2221
  //#region ../browser/src/utils/history.d.ts
1535
2222
  interface HistoryOptions {
1536
2223
  getScrollablePageElement: () => HTMLElement | null;
2224
+ /**
2225
+ * 是否把 `state` 一并写入 `window.history.state`(而非仅 `{ id }` + 内存 LruMap)。缺省 `false`。
2226
+ *
2227
+ * 内存 LruMap 在整页刷新后丢失;若 state 小且可结构化克隆(如导航树 `{ tree }`),开启此项
2228
+ * 可让 state 随 `window.history.state` **跨刷新按 entry 保留**,刷新后 back/forward 仍能从
2229
+ * history.state 还原(onPopState 在 LruMap 未命中时回退到 `event.state.state`)。
2230
+ * 大状态(如整页 `{ page }`)不应开启,避免撑爆 history.state。
2231
+ */
2232
+ persistInHistoryState?: boolean;
1537
2233
  }
1538
2234
  declare class History<State> {
1539
2235
  private readonly entries;
1540
2236
  private readonly log;
1541
2237
  private readonly getScrollablePageElement;
2238
+ private readonly persistInHistoryState;
1542
2239
  private currentStateId;
1543
2240
  constructor(log: Logger, options: HistoryOptions, sizeLimit?: number);
2241
+ /** 写入 window.history.state 的载荷:persist 时连 state 一起带(跨刷新保留)。 */
2242
+ private historyState;
1544
2243
  replaceState(state: State, url: string): void;
1545
2244
  pushState(state: State, url: string): void;
1546
2245
  beforeTransition(): void;
@@ -1569,5 +2268,5 @@ declare function deserializeServerData(): PrefetchedIntent[] | undefined;
1569
2268
  */
1570
2269
  declare function createPrefetchedIntentsFromDom(): PrefetchedIntents;
1571
2270
  //#endregion
1572
- export { RenderMode as $, BaseLogger as $n, RouteAddOptions as $t, IntersectionImpressionObserver as A, DEP_KEYS as An, Translator as At, buildUrl as B, TranslationMessages as Bn, ParamsFor as Bt, PluralRuleProvider as C, BasePage as Cn, Framework as Ct, WithFieldsRecorder as D, markPublic as Dn, LocaleAttributes as Dt, resolvePluralKey as E, isPublicMarked as En, PrefetchedIntents as Et, BrowserContextOptions as F, Net as Fn, CompositeLogger as Ft, PWADisplayMode as G, EventRecorder as Gn, NumOptions as Gt, removeHost as H, resolveMessages as Hn, StripOptional as Ht, ServerContextOptions as I, Storage as In, CompositeLoggerFactory as It, Optional as J, MetricsFieldsProvider as Jn, int as Jt, getPWADisplayMode as K, ImpressionEntry as Kn, StrOptions as Kt, createBrowserContext as L, makeDependencies as Ln, ExtractParamNames as Lt, CompositeEventRecorder as M, FeatureFlagsProvider as Mn, shouldLog as Mt, runAfterLoadGuards as N, MakeDependenciesOptions as Nn, ConsoleLogger as Nt, VoidEventRecorder as O, RequestScopedKey as On, LocaleInfo as Ot, runBeforeLoadGuards as P, MetricsRecorder as Pn, ConsoleLoggerFactory as Pt, DefineRoutesOptions as Q, ReportingLoggerOptions as Qn, uuid as Qt, createServerContext as R, MessagesLoader as Rn, InferParams as Rt, PluralCategory as S, BASE_PAGE_FIELDS as Sn, safeErrorPage as St, interpolate as T, getPublicFields as Tn, PrefetchedIntent as Tt, removeQueryParams as U, PlatformInfo as Un, optional as Ut, getBaseUrl as V, resolveConfiguredMessages as Vn, QuerySchemaMap as Vt, removeScheme as W, detectPlatform as Wn, withDefault as Wt, isSome as X, ReportingLogger as Xn, oneOf as Xt, isNone as Y, ReportCallback as Yn, num as Yt, LruMap as Z, ReportingLoggerFactory as Zn, str as Zt, getTextDirection as _, RewriteResult as _n, isFlowAction as _r, ResponseInterceptor as _t, BrowserAppConfig as a, StandardResult as an, Intent as ar, mapEach as at, resolveLocaleFromUrl as b, redirect as bn, BaseShelf as bt, registerActionHandlers as c, runStandard as cn, ActionDispatcher as cr, BaseController as ct, registerFlowActionHandler as d, DenyResult as dn, Action as dr, classifyUrl as dt, RouteMatch as en, Logger as er, RouteDefinition as et, ExternalUrlDependencies as f, MiddlewareResult as fn, CompoundAction as fr, HostGuardError as ft, getLocaleAttributes as g, RedirectResult as gn, isExternalUrlAction as gr, RequestInterceptor as gt, SimpleTranslatorOptions as h, PostLoadContext as hn, isCompoundAction as hr, HttpError as ht, History as i, StandardIssue as in, IntentDispatcher as ir, Mapper as it, ConsoleEventRecorder as j, FeatureFlags as jn, resetFilterCache as jt, ImpressionObserverOptions as k, defineRequestScopedKey as kn, TextDirection as kt, FlowActionCallbacks as l, AfterLoadGuard as ln, ActionHandler as lr, HostCheckResult as lt, SimpleTranslator as m, NextResult as mn, FlowAction as mr, HttpClientConfig as mt, deserializeServerData as n, InferOutput as nn, SecureFetchOptions as nr, route as nt, startBrowserApp as o, StandardSchemaV1 as on, IntentController as or, pipe as ot, registerExternalUrlHandler as p, NavigationContext as pn, ExternalUrlAction as pr, HttpClient as pt, None as q, ImpressionObserver as qn, bool as qt, tryScroll as r, ParamSchema as rn, secureFetch as rr, AsyncMapper as rt, ActionHandlerDependencies as s, makeSchema as sn, Container as sr, pipeAsync as st, createPrefetchedIntentsFromDom as t, Router as tn, LoggerFactory as tr, defineRoutes as tt, FlowActionDependencies as u, BeforeLoadGuard as un, ACTION_KINDS as ur, classifyHost as ut, isRtl as v, deny as vn, makeExternalUrlAction as vr, stableStringify as vt, englishPlural as w, FINESOFT_PUBLIC as wn, FrameworkConfig as wt, setHtmlLocaleAttributes as x, rewrite as xn, SafeErrorPageOptions as xt, makeLocaleInfo as y, next as yn, makeFlowAction as yr, BaseItem as yt, generateUuid as z, MessagesLoaderContext as zn, InferQuery as zt };
1573
- //# sourceMappingURL=server-data-DQzknR97.d.mts.map
2271
+ export { isNone as $, Framework as $n, BASE_PAGE_FIELDS as $r, popToRoot as $t, resolvePluralKey as A, BaseLogger as Ai, SplitVisibility as An, RouteAddOptions as Ar, createNavigationController as At, ServerContextOptions as B, ActionHandler as Bi, classifyHost as Bn, AfterLoadGuard as Br, SerializedNavigation as Bt, makeLocaleInfo as C, ImpressionEntry as Ci, NavigationPathStep as Cn, bool as Cr, PopToRootOperation as Ct, PluralRuleProvider as D, ReportingLogger as Di, SPLIT_VISIBILITIES as Dn, str as Dr, SelectColumnOperation as Dt, PluralCategory as E, ReportCallback as Ei, ResolvedDestination as En, oneOf as Er, ReplaceTopOperation as Et, ConsoleEventRecorder as F, IntentDispatcher as Fi, mapEach as Fn, StandardIssue as Fr, createActiveLeafCodec as Ft, getBaseUrl as G, FlowAction as Gi, HttpError as Gn, NextResult as Gr, deserializeNavigation as Gt, createServerContext as H, Action as Hi, HostGuardError as Hn, DenyResult as Hr, SerializedSplitColumn as Ht, CompositeEventRecorder as I, Intent as Ii, pipe as In, StandardResult as Ir, createFullStateCodec as It, removeScheme as J, isFlowAction as Ji, stableStringify as Jn, RewriteResult as Jr, collectVisibleDestinations as Jt, removeHost as K, isCompoundAction as Ki, RequestInterceptor as Kn, PostLoadContext as Kr, serializeNavigation as Kt, runAfterLoadGuards as L, IntentController as Li, pipeAsync as Ln, StandardSchemaV1 as Lr, decodeNavigationTreeParam as Lt, VoidEventRecorder as M, LoggerFactory as Mi, TabsNode as Mn, Router as Mr, FullStateCodecOptions as Mt, ImpressionObserverOptions as N, SecureFetchOptions as Ni, AsyncMapper as Nn, InferOutput as Nr, NavigationCodec as Nt, englishPlural as O, ReportingLoggerFactory as Oi, SplitColumn as On, uuid as Or, SelectTabOperation as Ot, IntersectionImpressionObserver as P, secureFetch as Pi, Mapper as Pn, ParamSchema as Pr, NavigationRouterLike as Pt, Optional as Q, safeErrorPage as Qn, rewrite as Qr, popTo as Qt, runBeforeLoadGuards as R, Container as Ri, BaseController as Rn, makeSchema as Rr, encodeNavigationTreeParam as Rt, isRtl as S, EventRecorder as Si, NavigationPath as Sn, StrOptions as Sr, PopToOperation as St, setHtmlLocaleAttributes as T, MetricsFieldsProvider as Ti, Page as Tn, num as Tr, PushOptions as Tt, generateUuid as U, CompoundAction as Ui, HttpClient as Un, MiddlewareResult as Ur, SerializedStack as Ut, createBrowserContext as V, ACTION_KINDS as Vi, classifyUrl as Vn, BeforeLoadGuard as Vr, SerializedSplit as Vt, buildUrl as W, ExternalUrlAction as Wi, HttpClientConfig as Wn, NavigationContext as Wr, SerializedTabs as Wt, getPWADisplayMode as X, makeFlowAction as Xi, BaseShelf as Xn, next as Xr, findNode as Xt, PWADisplayMode as Y, makeExternalUrlAction as Yi, BaseItem as Yn, deny as Yr, findNearestStack as Yt, None as Z, SafeErrorPageOptions as Zn, redirect as Zr, pop as Zt, registerExternalUrlHandler as _, TranslationMessages as _i, LeafNode as _n, QuerySchemaMap as _r, NavigationControllerOptions as _t, BrowserAppConfig as a, RequestScopedKey as ai, setVisibility as an, TextDirection as ar, defineRoutes as at, getLocaleAttributes as b, PlatformInfo as bi, NavigationNode as bn, withDefault as br, NavigationOperation as bt, NavigationBridgeDependencies as c, FeatureFlags as ci, TabsInit as cn, shouldLog as cr, NavigationBrowserConfig as ct, ActionHandlerDependencies as d, MetricsRecorder as di, isStackNode as dn, CompositeLogger as dr, NavigationSSRDefinition as dt, BasePage as ei, push as en, FrameworkConfig as er, isSome as et, registerActionHandlers as f, Net as fi, isTabsNode as fn, CompositeLoggerFactory as fr, defineNavigation as ft, ExternalUrlDependencies as g, MessagesLoaderContext as gi, tabs as gn, ParamsFor as gr, NavigationController as gt, registerFlowActionHandler as h, MessagesLoader as hi, stack as hn, InferQuery as hr, NavigationContextInput as ht, History as i, markPublic as ii, selectTab as in, LocaleInfo as ir, RouteDefinition as it, WithFieldsRecorder as j, Logger as ji, StackNode as jn, RouteMatch as jr, DEFAULT_NAV_PARAM as jt, interpolate as k, ReportingLoggerOptions as ki, SplitNode as kn, RouteParams as kr, SetVisibilityOperation as kt, NavigationHandle as l, FeatureFlagsProvider as li, isLeafNode as ln, ConsoleLogger as lr, NavigationDefinition as lt, FlowActionDependencies as m, makeDependencies as mi, split as mn, InferParams as mr, NAVIGATION_OP_KINDS as mt, deserializeServerData as n, getPublicFields as ni, resolveActivePath as nn, PrefetchedIntents as nr, DefineRoutesOptions as nt, BrowserNavigationConfig as o, defineRequestScopedKey as oi, visibleSplitColumns as on, Translator as or, route as ot, FlowActionCallbacks as p, Storage as pi, leaf as pn, ExtractParamNames as pr, HydrateOperation as pt, removeQueryParams as q, isExternalUrlAction as qi, ResponseInterceptor as qn, RedirectResult as qr, serializeNavigationStable as qt, tryScroll as r, isPublicMarked as ri, selectColumn as rn, LocaleAttributes as rr, RenderMode as rt, startBrowserApp as s, DEP_KEYS as si, SplitColumnInit as sn, resetFilterCache as sr, DefineNavigationOptions as st, createPrefetchedIntentsFromDom as t, FINESOFT_PUBLIC as ti, replaceTop as tn, PrefetchedIntent as tr, LruMap as tt, createNavigationBridge as u, MakeDependenciesOptions as ui, isSplitNode as un, ConsoleLoggerFactory as ur, NavigationInitial as ut, SimpleTranslator as v, resolveConfiguredMessages as vi, NAVIGATION_NODE_KINDS as vn, StripOptional as vr, NavigationDispatchContext as vt, resolveLocaleFromUrl as w, ImpressionObserver as wi, NavigationSnapshot as wn, int as wr, PushOperation as wt, getTextDirection as x, detectPlatform as xi, NavigationNodeKind as xn, NumOptions as xr, PopOperation as xt, SimpleTranslatorOptions as y, resolveMessages as yi, NavigationError as yn, optional as yr, NavigationOpKind as yt, BrowserContextOptions as z, ActionDispatcher as zi, HostCheckResult as zn, runStandard as zr, SerializedLeaf as zt };
2272
+ //# sourceMappingURL=server-data-HVSgxEac.d.mts.map