@finesoft/front 0.5.1 → 0.5.3

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 (128) hide show
  1. package/README.md +4 -4
  2. package/dist/Outlet.svelte +39 -0
  3. package/dist/Outlet.svelte.d.ts +7 -0
  4. package/dist/browser-CR5vhgXg.mjs +1317 -0
  5. package/dist/browser-kFMjlLGT.d.mts +262 -0
  6. package/dist/browser.d.mts +7 -2
  7. package/dist/browser.mjs +9 -1
  8. package/dist/controller-types-CgmJ6-le.d.mts +16 -0
  9. package/dist/cookies-BiRlUanX.d.mts +786 -0
  10. package/dist/fetch-policy-BHT8RtrL.mjs +82 -0
  11. package/dist/host-guard-DDWxLpFL.mjs +222 -0
  12. package/dist/http-B6CJqDyf.d.mts +46 -0
  13. package/dist/http-CaxrMD1A.d.mts +1 -0
  14. package/dist/http-D70PL72H.mjs +257 -0
  15. package/dist/http.d.mts +3 -0
  16. package/dist/http.mjs +2 -0
  17. package/dist/index-node.d.mts +15 -0
  18. package/dist/index-node.mjs +15 -0
  19. package/dist/index.d.mts +48 -697
  20. package/dist/index.mjs +44 -261
  21. package/dist/load-node.d.mts +5 -0
  22. package/dist/load-node.mjs +10 -0
  23. package/dist/load-portable.d.mts +5 -0
  24. package/dist/load-portable.mjs +8 -0
  25. package/dist/lru-map-BKoUAySU.mjs +50 -0
  26. package/dist/messages-CAt2QdGr.mjs +140 -0
  27. package/dist/native-contract-DuR25hYB.d.mts +14 -0
  28. package/dist/native-contract.d.mts +2 -0
  29. package/dist/native-contract.mjs +1 -0
  30. package/dist/node-D9hB4dsz.d.mts +35 -0
  31. package/dist/node.d.mts +2 -0
  32. package/dist/node.mjs +59 -0
  33. package/dist/path-CGFl2w7D.mjs +113 -0
  34. package/dist/path-CXT6xGPO.d.mts +261 -0
  35. package/dist/portable-CaxrMD1A.d.mts +1 -0
  36. package/dist/portable.d.mts +11 -0
  37. package/dist/portable.mjs +12 -0
  38. package/dist/proxy-2dSWO-Xw.d.mts +53 -0
  39. package/dist/proxy-z02VvGIj.mjs +7520 -0
  40. package/dist/public-types-BcJM-AYc.mjs +835 -0
  41. package/dist/react-DhwBRw01.d.mts +16 -0
  42. package/dist/react.d.mts +3 -0
  43. package/dist/react.mjs +29 -0
  44. package/dist/rolldown-runtime-B4iAMlE-.mjs +35 -0
  45. package/dist/secure-fetch-Xlht2jd7.d.mts +30 -0
  46. package/dist/server-controller-proxy-BkVuVWVD.d.mts +38 -0
  47. package/dist/session-DnB4ZC3x.d.mts +1279 -0
  48. package/dist/src-BQBfaaPO.mjs +3825 -0
  49. package/dist/src-Ftl_0rhu.mjs +28 -0
  50. package/dist/ssr-BLzYP4wU.d.mts +207 -0
  51. package/dist/ssr-Tn4YkuxM.mjs +357 -0
  52. package/dist/ssr.d.mts +3 -0
  53. package/dist/ssr.mjs +3 -0
  54. package/dist/svelte-Dr5to3SE.d.mts +16 -0
  55. package/dist/svelte.d.mts +3 -0
  56. package/dist/svelte.mjs +13 -0
  57. package/dist/typegen-C-WeJCtf.d.mts +12 -0
  58. package/dist/typegen-cli.d.mts +1 -0
  59. package/dist/typegen-cli.mjs +11 -0
  60. package/dist/typegen.d.mts +3 -0
  61. package/dist/typegen.mjs +2 -0
  62. package/dist/types-B1BT0N3t.mjs +402 -0
  63. package/dist/undici-CPfL25Hr.mjs +22262 -0
  64. package/dist/vite-Cj4SPA8D.d.mts +277 -0
  65. package/dist/vite.d.mts +4 -0
  66. package/dist/vite.mjs +2354 -0
  67. package/dist/vue-DGmzuKho.d.mts +32 -0
  68. package/dist/vue.d.mts +3 -0
  69. package/dist/vue.mjs +56 -0
  70. package/dist/web.d.mts +6 -0
  71. package/dist/web.mjs +8 -0
  72. package/dist/worker.d.mts +2 -0
  73. package/dist/worker.mjs +2 -0
  74. package/docs/01-getting-started.md +67 -199
  75. package/docs/02-routing-and-controllers.md +163 -241
  76. package/docs/03-middleware.md +10 -212
  77. package/docs/04-rendering-and-hydration.md +7 -332
  78. package/docs/05-i18n.md +7 -237
  79. package/docs/06-http-client.md +20 -263
  80. package/docs/07-di-container.md +23 -257
  81. package/docs/08-observability.md +6 -286
  82. package/docs/09-server-and-deployment.md +59 -219
  83. package/docs/10-features-platform-pwa.md +7 -231
  84. package/docs/11-navigation.md +143 -288
  85. package/docs/12-session-restoration.md +6 -214
  86. package/docs/README.md +7 -7
  87. package/docs/advanced/custom-action-handler.md +29 -229
  88. package/docs/advanced/custom-adapter.md +7 -259
  89. package/docs/advanced/custom-event-recorder.md +7 -312
  90. package/docs/advanced/inline-proxy-codegen.md +6 -185
  91. package/docs/advanced/multi-tenant-scopes.md +10 -323
  92. package/docs/engineering/ci-release-flow.md +35 -222
  93. package/docs/engineering/project-structure.md +34 -277
  94. package/docs/engineering/testing.md +8 -310
  95. package/docs/pitfalls/container-scope-leak.md +2 -214
  96. package/docs/pitfalls/i18n-bundle-size.md +6 -176
  97. package/docs/pitfalls/proxy-binary-payloads.md +8 -12
  98. package/docs/pitfalls/ssr-hydration-mismatch.md +9 -155
  99. package/docs/pitfalls/ssr-vs-csr-globals.md +9 -170
  100. package/docs/zh/01-getting-started.md +67 -199
  101. package/docs/zh/02-routing-and-controllers.md +166 -244
  102. package/docs/zh/03-middleware.md +10 -212
  103. package/docs/zh/04-rendering-and-hydration.md +7 -332
  104. package/docs/zh/05-i18n.md +7 -237
  105. package/docs/zh/06-http-client.md +20 -263
  106. package/docs/zh/07-di-container.md +23 -257
  107. package/docs/zh/08-observability.md +6 -283
  108. package/docs/zh/09-server-and-deployment.md +59 -219
  109. package/docs/zh/10-features-platform-pwa.md +7 -231
  110. package/docs/zh/11-navigation.md +130 -290
  111. package/docs/zh/12-session-restoration.md +6 -214
  112. package/docs/zh/README.md +4 -4
  113. package/docs/zh/advanced/custom-action-handler.md +29 -229
  114. package/docs/zh/advanced/custom-adapter.md +7 -259
  115. package/docs/zh/advanced/custom-event-recorder.md +7 -312
  116. package/docs/zh/advanced/inline-proxy-codegen.md +6 -185
  117. package/docs/zh/advanced/multi-tenant-scopes.md +10 -323
  118. package/docs/zh/engineering/ci-release-flow.md +35 -222
  119. package/docs/zh/engineering/project-structure.md +34 -277
  120. package/docs/zh/engineering/testing.md +8 -310
  121. package/docs/zh/pitfalls/container-scope-leak.md +2 -214
  122. package/docs/zh/pitfalls/i18n-bundle-size.md +6 -176
  123. package/docs/zh/pitfalls/proxy-binary-payloads.md +8 -12
  124. package/docs/zh/pitfalls/ssr-hydration-mismatch.md +9 -155
  125. package/docs/zh/pitfalls/ssr-vs-csr-globals.md +9 -170
  126. package/package.json +118 -20
  127. package/dist/browser-BHhVWXik.mjs +0 -2
  128. package/dist/browser-BV2BBXm7.d.mts +0 -2811
package/package.json CHANGED
@@ -1,56 +1,154 @@
1
1
  {
2
2
  "name": "@finesoft/front",
3
- "version": "0.5.1",
4
- "description": "Full-stack framework: router, DI, actions, SSR, and server all in one package",
3
+ "version": "0.5.3",
4
+ "description": "Application runtime, routing, native UI and platform hosts through one public API",
5
5
  "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/GaKireiTsuki/finesoft-front.git",
9
+ "directory": "packages/front"
10
+ },
11
+ "bin": {
12
+ "finesoft-types": "./dist/typegen-cli.mjs"
13
+ },
6
14
  "files": [
7
- "dist/browser-BHhVWXik.mjs",
8
- "dist/browser-BV2BBXm7.d.mts",
15
+ "dist/browser-CR5vhgXg.mjs",
16
+ "dist/browser-kFMjlLGT.d.mts",
9
17
  "dist/browser.d.mts",
10
18
  "dist/browser.mjs",
19
+ "dist/controller-types-CgmJ6-le.d.mts",
20
+ "dist/cookies-BiRlUanX.d.mts",
21
+ "dist/fetch-policy-BHT8RtrL.mjs",
22
+ "dist/host-guard-DDWxLpFL.mjs",
23
+ "dist/http-B6CJqDyf.d.mts",
24
+ "dist/http-CaxrMD1A.d.mts",
25
+ "dist/http-D70PL72H.mjs",
26
+ "dist/http.d.mts",
27
+ "dist/http.mjs",
28
+ "dist/index-node.d.mts",
29
+ "dist/index-node.mjs",
11
30
  "dist/index.d.mts",
12
31
  "dist/index.mjs",
32
+ "dist/load-node.d.mts",
33
+ "dist/load-node.mjs",
34
+ "dist/load-portable.d.mts",
35
+ "dist/load-portable.mjs",
36
+ "dist/lru-map-BKoUAySU.mjs",
37
+ "dist/messages-CAt2QdGr.mjs",
38
+ "dist/native-contract-DuR25hYB.d.mts",
39
+ "dist/native-contract.d.mts",
40
+ "dist/native-contract.mjs",
41
+ "dist/node-D9hB4dsz.d.mts",
42
+ "dist/node.d.mts",
43
+ "dist/node.mjs",
44
+ "dist/Outlet.svelte",
45
+ "dist/Outlet.svelte.d.ts",
46
+ "dist/path-CGFl2w7D.mjs",
47
+ "dist/path-CXT6xGPO.d.mts",
48
+ "dist/portable-CaxrMD1A.d.mts",
49
+ "dist/portable.d.mts",
50
+ "dist/portable.mjs",
51
+ "dist/proxy-2dSWO-Xw.d.mts",
52
+ "dist/proxy-z02VvGIj.mjs",
53
+ "dist/public-types-BcJM-AYc.mjs",
54
+ "dist/react-DhwBRw01.d.mts",
55
+ "dist/react.d.mts",
56
+ "dist/react.mjs",
57
+ "dist/rolldown-runtime-B4iAMlE-.mjs",
58
+ "dist/secure-fetch-Xlht2jd7.d.mts",
59
+ "dist/server-controller-proxy-BkVuVWVD.d.mts",
60
+ "dist/session-DnB4ZC3x.d.mts",
61
+ "dist/src-BQBfaaPO.mjs",
62
+ "dist/src-Ftl_0rhu.mjs",
63
+ "dist/ssr-BLzYP4wU.d.mts",
64
+ "dist/ssr-Tn4YkuxM.mjs",
65
+ "dist/ssr.d.mts",
66
+ "dist/ssr.mjs",
67
+ "dist/svelte-Dr5to3SE.d.mts",
68
+ "dist/svelte.d.mts",
69
+ "dist/svelte.mjs",
70
+ "dist/typegen-C-WeJCtf.d.mts",
71
+ "dist/typegen-cli.d.mts",
72
+ "dist/typegen-cli.mjs",
73
+ "dist/typegen.d.mts",
74
+ "dist/typegen.mjs",
75
+ "dist/types-B1BT0N3t.mjs",
76
+ "dist/undici-CPfL25Hr.mjs",
77
+ "dist/vite-Cj4SPA8D.d.mts",
78
+ "dist/vite.d.mts",
79
+ "dist/vite.mjs",
80
+ "dist/vue-DGmzuKho.d.mts",
81
+ "dist/vue.d.mts",
82
+ "dist/vue.mjs",
83
+ "dist/web.d.mts",
84
+ "dist/web.mjs",
85
+ "dist/worker.d.mts",
86
+ "dist/worker.mjs",
13
87
  "docs",
14
88
  "README.md"
15
89
  ],
16
90
  "type": "module",
91
+ "sideEffects": false,
17
92
  "main": "dist/index.mjs",
18
93
  "module": "dist/index.mjs",
19
94
  "types": "dist/index.d.mts",
95
+ "imports": {
96
+ "#finesoft/implementation": {
97
+ "types": "./dist/load-node.d.mts",
98
+ "node": "./dist/load-node.mjs",
99
+ "default": "./dist/load-portable.mjs"
100
+ }
101
+ },
20
102
  "exports": {
21
103
  ".": {
22
104
  "types": "./dist/index.d.mts",
105
+ "node": "./dist/index-node.mjs",
23
106
  "default": "./dist/index.mjs"
24
- },
25
- "./browser": {
26
- "types": "./dist/browser.d.mts",
27
- "default": "./dist/browser.mjs"
28
107
  }
29
108
  },
30
- "dependencies": {},
31
- "devDependencies": {
32
- "@hono/node-server": "^1.19.13",
33
- "@types/node": "^22",
34
- "dotenv": "^17.3.1",
35
- "hono": "^4.12.21",
36
- "vite": "npm:@voidzero-dev/vite-plus-core@0.1.16",
37
- "vite-plus": "0.1.24"
109
+ "publishConfig": {
110
+ "access": "public",
111
+ "registry": "https://registry.npmjs.org/"
38
112
  },
113
+ "dependencies": {},
39
114
  "peerDependencies": {
40
- "@hono/node-server": "^1.0.0",
115
+ "@hono/node-server": "^1.0.0 || ^2.0.0",
41
116
  "hono": "^4.0.0",
42
- "vite": ">=5.0.0"
117
+ "react": "^19.0.0",
118
+ "react-dom": "^19.0.0",
119
+ "svelte": "^5.0.0",
120
+ "typescript": ">=5.4.0",
121
+ "vite": ">=5.0.0",
122
+ "vue": "^3.5.0"
43
123
  },
44
124
  "peerDependenciesMeta": {
125
+ "typescript": {
126
+ "optional": true
127
+ },
45
128
  "@hono/node-server": {
46
129
  "optional": true
47
130
  },
48
131
  "vite": {
49
132
  "optional": true
133
+ },
134
+ "hono": {
135
+ "optional": true
136
+ },
137
+ "react": {
138
+ "optional": true
139
+ },
140
+ "react-dom": {
141
+ "optional": true
142
+ },
143
+ "vue": {
144
+ "optional": true
145
+ },
146
+ "svelte": {
147
+ "optional": true
50
148
  }
51
149
  },
52
150
  "scripts": {
53
- "build": "vp pack src/index.ts src/browser.ts --minify",
54
- "dev": "vp pack src/index.ts src/browser.ts --minify --watch"
151
+ "build": "vp pack && node ../../scripts/prepare-svelte-entry.mjs",
152
+ "dev": "vp pack --watch"
55
153
  }
56
154
  }
@@ -1,2 +0,0 @@
1
- const e={FLOW:`flow`,EXTERNAL_URL:`externalUrl`,COMPOUND:`compound`};function t(t){return t.kind===e.FLOW}function n(t){return t.kind===e.EXTERNAL_URL}function r(t){return t.kind===e.COMPOUND}function i(t,n){return{kind:e.FLOW,url:t,presentationContext:n}}function a(t){return{kind:e.EXTERNAL_URL,url:t}}var o=class{handlers=new Map;onAction(e,t){if(this.handlers.has(e)){console.warn(`[ActionDispatcher] kind="${e}" already registered, skipping`);return}this.handlers.set(e,t)}removeAction(e){return this.handlers.delete(e)}async perform(e,t=0){if(r(e)){if(t>=32)throw Error(`[ActionDispatcher] CompoundAction recursion depth exceeded (max 32)`);for(let n of e.actions)await this.perform(n,t+1);return}let n=this.handlers.get(e.kind);if(!n){console.warn(`[ActionDispatcher] No handler for kind="${e.kind}"`);return}await n(e)}},s=class{controllers=new Map;register(e){this.controllers.set(e.intentId,e)}async dispatch(e,t){let n=this.controllers.get(e.id);if(!n)throw Error(`[IntentDispatcher] No controller for "${e.id}". Registered: [${Array.from(this.controllers.keys()).join(`, `)}]`);return n.perform(e,t)}has(e){return this.controllers.has(e)}},c=class e{registrations=new Map;resolutionStack=new Set;parent;children=new Set;register(e,t,n=!0){return this.registrations.set(e,{factory:t,singleton:n}),this}resolve(e){let t=this.registrations.get(e);if(!t){if(this.parent)return this.parent.resolve(e);throw Error(`[Container] No registration for key: "${e}"`)}if(t.singleton){if(t.instance===void 0){if(this.resolutionStack.has(e))throw Error(`[Container] Circular dependency detected: ${[...this.resolutionStack,e].join(` → `)}`);this.resolutionStack.add(e);try{t.instance=t.factory()}finally{this.resolutionStack.delete(e)}}return t.instance}return t.factory()}has(e){return this.registrations.has(e)||(this.parent?.has(e)??!1)}unregister(e){return this.registrations.delete(e)}createScope(){let t=new e;return t.parent=this,this.children.add(t),t}dispose(){let e=Array.from(this.children);for(let t of e)t.dispose();this.children.clear();for(let e of this.registrations.values())e.instance=void 0;this.registrations.clear(),this.parent&&=(this.parent.children.delete(this),void 0)}};function l(e){if(!e)return{ok:!1,reason:`empty host`};let t=e.toLowerCase(),n=t.startsWith(`[`)&&t.endsWith(`]`)?t.slice(1,-1):t;if(n===`localhost`||n.endsWith(`.localhost`))return{ok:!1,reason:`loopback host forbidden`};if(n.includes(`:`))return m(n);let r=d(n);return r?p(r):{ok:!0}}function u(e){let t;try{t=new URL(e)}catch{return{ok:!1,reason:`invalid URL`}}return t.protocol!==`http:`&&t.protocol!==`https:`?{ok:!1,reason:`scheme "${t.protocol}" not allowed (only http/https)`}:l(t.hostname)}function d(e){if(e.length===0)return null;if(!e.includes(`.`)){let t=f(e);return t===null||t<0||t>4294967295?null:[t>>>24&255,t>>>16&255,t>>>8&255,t&255]}let t=e.split(`.`);if(t.length!==4)return null;let n=[];for(let e of t){let t=f(e);if(t===null||t<0||t>255)return null;n.push(t)}return n}function f(e){if(e.length===0)return null;if(e.startsWith(`0x`)||e.startsWith(`0X`)){let t=e.slice(2);return/^[0-9a-f]+$/i.test(t)?parseInt(t,16):null}return e.length>1&&e.startsWith(`0`)?/^[0-7]+$/.test(e)?parseInt(e,8):null:/^[0-9]+$/.test(e)?parseInt(e,10):null}function p(e){let[t,n]=e;return t===0?{ok:!1,reason:`unspecified IPv4 forbidden`}:t===127?{ok:!1,reason:`loopback IPv4 forbidden`}:t===10?{ok:!1,reason:`private IPv4 (10/8) forbidden`}:t===172&&n>=16&&n<=31?{ok:!1,reason:`private IPv4 (172.16/12) forbidden`}:t===192&&n===168?{ok:!1,reason:`private IPv4 (192.168/16) forbidden`}:t===169&&n===254?{ok:!1,reason:`link-local IPv4 forbidden`}:t===100&&n>=64&&n<=127?{ok:!1,reason:`CGNAT IPv4 forbidden`}:t>=224&&t<=239?{ok:!1,reason:`multicast IPv4 forbidden`}:t>=240?{ok:!1,reason:`reserved IPv4 forbidden`}:{ok:!0}}function m(e){let t=e.toLowerCase();if(t===`::`||t===`::0`)return{ok:!1,reason:`unspecified IPv6 forbidden`};if(t===`::1`)return{ok:!1,reason:`loopback IPv6 forbidden`};if(t.startsWith(`fe8`)||t.startsWith(`fe9`)||t.startsWith(`fea`)||t.startsWith(`feb`))return{ok:!1,reason:`link-local IPv6 forbidden`};if(t.startsWith(`fc`)||t.startsWith(`fd`))return{ok:!1,reason:`ULA IPv6 forbidden`};if(t.startsWith(`ff`))return{ok:!1,reason:`multicast IPv6 forbidden`};let n=h(t);if(n){let e=p(n);if(!e.ok)return{ok:!1,reason:`IPv4-in-IPv6 ${e.reason}`}}return{ok:!0}}function h(e){let t=e.match(/(?:^|:)((?:\d{1,3}\.){3}\d{1,3})$/);if(t){let e=d(t[1]);if(e)return e}let n=e.match(/(?:^|:)([0-9a-f]{1,4}):([0-9a-f]{1,4})$/);if(n&&(e.startsWith(`::ffff:`)||e.includes(`:ffff:`))){let e=parseInt(n[1],16),t=parseInt(n[2],16);return[e>>>8&255,e&255,t>>>8&255,t&255]}return null}var g=class extends Error{status;statusText;body;constructor(e,t,n){super(`HTTP ${e}: ${t}`),this.status=e,this.statusText=t,this.body=n,this.name=`HttpError`}},_=class extends Error{url;reason;constructor(e,t){super(`Refused to fetch ${e}: ${t}`),this.url=e,this.reason=t,this.name=`HostGuardError`}},v=class{baseUrl;defaultHeaders;fetchFn;requestInterceptors;responseInterceptors;allowInternalHosts;validateDns;constructor(e){this.baseUrl=e.baseUrl,this.defaultHeaders=e.defaultHeaders??{},this.fetchFn=e.fetch??globalThis.fetch.bind(globalThis),this.requestInterceptors=[...e.requestInterceptors??[]],this.responseInterceptors=[...e.responseInterceptors??[]],this.allowInternalHosts=e.allowInternalHosts??!1,this.validateDns=e.validateDns??!0}useRequestInterceptor(e){return this.requestInterceptors.push(e),this}useResponseInterceptor(e){return this.responseInterceptors.push(e),this}async get(e,t){return this.request(`GET`,e,{params:t})}async post(e,t,n){return this.request(`POST`,e,{body:t,params:n})}async put(e,t,n){return this.request(`PUT`,e,{body:t,params:n})}async del(e,t){return this.request(`DELETE`,e,{params:t})}async request(e,t,n){let r=this.buildUrl(t,n?.params);this.allowInternalHosts||await this.enforceHostGuard(r);let i={...this.defaultHeaders,...n?.headers},a={method:e,headers:i};n?.body!==void 0&&(Object.keys(i).some(e=>e.toLowerCase()===`content-type`)||(i[`Content-Type`]=`application/json`),a.body=JSON.stringify(n.body));for(let e of this.requestInterceptors)a=await e(r,a);let o=await this.fetchFn(r,a);for(let e of this.responseInterceptors)o=await e(o,r);if(!o.ok){let e=await o.text().catch(()=>void 0);throw new g(o.status,o.statusText,e)}try{return await o.json()}catch(e){throw e instanceof SyntaxError?new g(o.status,`Invalid JSON response`,await o.text().catch(()=>void 0)):e}}buildUrl(e,t){let n=this.baseUrl.endsWith(`/`)?this.baseUrl.slice(0,-1):this.baseUrl,r=e.startsWith(`/`)?e:`/${e}`,i=new URL(`${n}${r}`,`http://placeholder`);if(t)for(let[e,n]of Object.entries(t))i.searchParams.set(e,n);return this.baseUrl.startsWith(`http`)?i.toString():`${i.pathname}${i.search}`}async enforceHostGuard(e){let t;try{t=new URL(e)}catch{return}let n=u(e);if(!n.ok)throw new _(e,n.reason);if(this.validateDns&&t.hostname&&!y(t.hostname)){let n=await b(t.hostname);if(!n.ok)throw new _(e,n.reason)}}};function y(e){return e.includes(`:`)?!0:/^[0-9.]+$/.test(e)||/^0x[0-9a-f]+$/i.test(e)}async function b(e){let t;try{let e=await import(`node:dns/promises`);t=e.default??e}catch{return{ok:!0}}let n=await Promise.allSettled([t.resolve4(e),t.resolve6(e)]),r=[];for(let e of n)e.status===`fulfilled`&&r.push(...e.value);if(r.length===0)return{ok:!0};for(let e of r){let t=u(`http://${e.includes(`:`)?`[${e}]`:e}/`);if(!t.ok)return{ok:!1,reason:`host resolves to ${e} (${t.reason})`}}return{ok:!0}}function x(e,t={}){let n=t.allowInternalHosts??!1,r=t.validateDns??!0;return async function(t,i){if(!n){let e=C(t);if(e&&S(e)){let t=u(e);if(!t.ok)throw new _(e,t.reason);if(r){let t=new URL(e);if(t.hostname&&!w(t.hostname)){let n=await T(t.hostname);if(!n.ok)throw new _(e,n.reason)}}}}return e(t,i)}}function S(e){try{return new URL(e),!0}catch{return!1}}function C(e){return typeof e==`string`?e:e instanceof URL?e.toString():typeof Request<`u`&&e instanceof Request?e.url:null}function w(e){return e.includes(`:`)?!0:/^[0-9.]+$/.test(e)||/^0x[0-9a-f]+$/i.test(e)}async function T(e){let t;try{let e=await import(`node:dns/promises`);t=e.default??e}catch{return{ok:!0}}let n;try{n=await t.lookup(e,{all:!0})}catch{return{ok:!0}}if(n.length===0)return{ok:!0};for(let{address:e}of n){let t=u(`http://${e.includes(`:`)?`[${e}]`:e}/`);if(!t.ok)return{ok:!1,reason:`host resolves to ${e} (${t.reason})`}}return{ok:!0}}const ee=new Set([`ar`,`arc`,`dv`,`fa`,`ha`,`he`,`khw`,`ks`,`ku`,`ps`,`ur`,`yi`]);function te(e){let t=e.split(`-`)[0].toLowerCase();return ee.has(t)}function ne(e){return te(e)?`rtl`:`ltr`}function re(e){return{lang:e,dir:ne(e)}}function ie(e,t){return{language:e,region:t,bcp47:t?`${e}-${t}`:e,dir:ne(e)}}function ae(e){document.documentElement.lang=e.lang,document.documentElement.dir=e.dir}function oe(e,t){let n=e.split(`?`)[0].match(/^\/([^/]+)(\/.*)?$/);if(!n)return null;let r=n[1],i=t.find(e=>e.toLowerCase()===r.toLowerCase());return i?{locale:i,strippedUrl:n[2]||`/`}:null}async function se(e,t){if(!e||!t)return;let n=await ce();if(n)return n(e,t)}async function ce(){if(typeof globalThis.__FINESOFT_I18N_LOADER__==`function`)return globalThis.__FINESOFT_I18N_LOADER__;if(typeof __FINESOFT_I18N_LOADER_SPECIFIER__==`string`)try{let e=await import(__FINESOFT_I18N_LOADER_SPECIFIER__),t=typeof e==`function`?e:typeof e?.loadMessages==`function`?e.loadMessages:void 0;return t?(globalThis.__FINESOFT_I18N_LOADER__=t,t):void 0}catch{return}}async function le(e){let{locale:t,loadMessages:n,context:r}=e;if(!(!t||!r))return n?n(t,r):se(t,r)}function ue(e,t){let n=Object.entries(e);if(n.length===0)return;if(typeof n[0][1]==`string`)return e;let r=e[t];if(!r)return;let i={};for(let[e,t]of Object.entries(r)){if(typeof t==`string`){i[e]=t;continue}for(let[n,r]of Object.entries(t))i[`${e}.${n}`]=r}return i}function de(e,t){return t?e.replace(/\{(\w+)\}/g,(e,n)=>{let r=t[n];return r===void 0?`{${n}}`:String(r)}):e}function fe(e){return e===1?`one`:`other`}function pe(e,t){return`${e}.${t}`}var me=class{locale;messages;pluralRule;fallback;constructor(e){this.locale=e.locale,this.messages=e.messages,this.pluralRule=e.pluralRule??fe,this.fallback=e.fallback??(e=>e)}t(e,t){let n=this.messages[e];return n===void 0?this.fallback(e):de(n,t)}plural(e,t,n){let r=pe(e,this.pluralRule(t)),i={count:t,...n};return this.t(r,i)}},he=class{factories;constructor(e){this.factories=e}loggerFor(e){return new ge(this.factories.map(t=>t.loggerFor(e)))}},ge=class{loggers;constructor(e){this.loggers=e}debug(...e){return this.callAll(`debug`,e)}info(...e){return this.callAll(`info`,e)}warn(...e){return this.callAll(`warn`,e)}error(...e){return this.callAll(`error`,e)}callAll(e,t){for(let n of this.loggers)n[e](...t);return``}},_e=class{category;constructor(e){this.category=e}};const ve={"*":4,debug:4,info:3,warn:2,error:1,off:0,"":0};let ye,be;function xe(){if(globalThis.localStorage===void 0)return{};let e;try{e=globalThis.localStorage.getItem(`onyxLog`)}catch{return{}}if(!e)return{};if(e===be&&ye)return ye;be=e;let t={},n=e.split(`,`);for(let e of n){let[n,r]=e.trim().split(`=`);if(!n||r===void 0)continue;let i=ve[r.toLowerCase()]??void 0;i!==void 0&&(n===`*`?t.defaultLevel=i:(t.named??={},t.named[n]=i))}return ye=t,t}function E(e,t){let n=xe();if(n.defaultLevel===void 0&&!n.named)return!0;let r=ve[t]??4;return n.named?.[e]===void 0?n.defaultLevel===void 0?!0:r<=n.defaultLevel:r<=n.named[e]}function Se(){ye=void 0,be=void 0}var Ce=class extends _e{debug(...e){return E(this.category,`debug`)&&console.debug(`[${this.category}]`,...e),``}info(...e){return E(this.category,`info`)&&console.info(`[${this.category}]`,...e),``}warn(...e){return E(this.category,`warn`)&&console.warn(`[${this.category}]`,...e),``}error(...e){return console.error(`[${this.category}]`,...e),``}},we=class{loggerFor(e){return new Ce(e)}};const Te={debug:0,info:1,warn:2,error:3};var Ee=class extends _e{minPriority;report;constructor(e,t){super(e),this.minPriority=Te[t.minLevel??`warn`],this.report=t.report}debug(...e){return this.maybeReport(`debug`,e),``}info(...e){return this.maybeReport(`info`,e),``}warn(...e){return this.maybeReport(`warn`,e),``}error(...e){return this.maybeReport(`error`,e),``}maybeReport(e,t){if(!(Te[e]<this.minPriority))try{this.report(e,this.category,t)}catch(e){console.error(`[ReportingLogger] report callback threw:`,e)}}},De=class{options;constructor(e){this.options=e}loggerFor(e){return new Ee(e,this.options)}},Oe=class{prefix;constructor(e=`Metrics`){this.prefix=e}record(e,t){console.info(`[${this.prefix}:${e}]`,t??``)}async flush(){}destroy(){}};function ke(e){let t=e??(typeof navigator<`u`?navigator.userAgent:``),n=t.toLowerCase();return{os:Ae(n),browser:je(n),engine:Me(n),isMobile:/mobile|android|iphone|ipad|ipod/i.test(t),isTouch:typeof navigator<`u`&&`maxTouchPoints`in navigator?navigator.maxTouchPoints>0:!1}}function Ae(e){return/iphone|ipad|ipod/.test(e)?`ios`:/android/.test(e)?`android`:/macintosh|mac os x/.test(e)?`macos`:/windows/.test(e)?`windows`:/linux/.test(e)?`linux`:`unknown`}function je(e){return/edg\//.test(e)?`edge`:/opr\/|opera/.test(e)?`opera`:/samsungbrowser/.test(e)?`samsung`:/chrome|crios/.test(e)&&!/edg\//.test(e)?`chrome`:/firefox|fxios/.test(e)?`firefox`:/safari/.test(e)&&!/chrome/.test(e)?`safari`:`unknown`}function Me(e){return/applewebkit/.test(e)&&!/chrome/.test(e)?`webkit`:/applewebkit/.test(e)&&/chrome/.test(e)?`blink`:/gecko\//.test(e)?`gecko`:`unknown`}const D={LOGGER:`logger`,LOGGER_FACTORY:`loggerFactory`,NET:`net`,STORAGE:`storage`,FEATURE_FLAGS:`featureFlags`,METRICS:`metrics`,FETCH:`fetch`,SAFE_FETCH:`safeFetch`,EVENT_RECORDER:`eventRecorder`,LOCALE:`locale`,PLATFORM:`platform`,TRANSLATOR:`translator`};var Ne=class{store=new Map;get(e){return this.store.get(e)}set(e,t){this.store.set(e,t)}delete(e){this.store.delete(e)}},Pe=class{flags;providers=[];constructor(e={}){this.flags=e}addProvider(e){this.providers.push(e)}isEnabled(e){for(let t=this.providers.length-1;t>=0;t--)if(this.providers[t].isEnabled(e))return!0;return this.flags[e]===!0}getString(e){for(let t=this.providers.length-1;t>=0;t--){let n=this.providers[t].getString?.(e);if(n!==void 0)return n}let t=this.flags[e];return typeof t==`string`?t:void 0}getNumber(e){for(let t=this.providers.length-1;t>=0;t--){let n=this.providers[t].getNumber?.(e);if(n!==void 0)return n}let t=this.flags[e];return typeof t==`number`?t:void 0}},Fe=class{record(e,t){console.info(`[Metrics:${e}]`,t??``)}recordPageView(e,t){this.record(`PageView`,{page:e,...t})}recordEvent(e,t){this.record(`Event`,{name:e,...t})}};function Ie(e,t={}){let{_resolvedMessages:n}=t,{fetch:r=globalThis.fetch?.bind(globalThis),featureFlags:i={},featureFlagsProviders:a=[],reportCallback:o,eventRecorder:s,locale:c,platform:l}=t,u=new we,d=o?new he([u,new De({report:o})]):u;e.register(D.LOGGER_FACTORY,()=>d),e.register(D.LOGGER,()=>d.loggerFor(`framework`)),e.register(D.NET,()=>({fetch:(e,t)=>r(e,t)})),e.register(D.STORAGE,()=>new Ne);let f=new Pe(i);for(let e of a)f.addProvider(e);if(e.register(D.FEATURE_FLAGS,()=>f),e.register(D.METRICS,()=>new Fe),e.register(D.EVENT_RECORDER,()=>s??new Oe),c&&e.register(D.LOCALE,()=>re(c)),c&&n){let t=ue(n,c);t&&e.register(D.TRANSLATOR,()=>new me({locale:c,messages:t}))}e.register(D.PLATFORM,()=>l??ke(typeof navigator<`u`?navigator.userAgent:void 0)),e.register(D.FETCH,()=>r);let p=t.safeFetch??{};e.register(D.SAFE_FETCH,()=>x(r,p))}function Le(e){return`container`in e?e.container:e}function Re(e){return{key:e,set(t,n){Le(t).register(e,()=>n)},get(t){let n=Le(t);return n.has(e)?n.resolve(e):void 0},clear(t){return Le(t).unregister(e)}}}function ze(e){return e.multi===!0}function Be(e,t={}){return{multi:!0,"~standard":{version:1,vendor:`finesoft`,validate:async n=>{let r=n===void 0?[]:Array.isArray(n)?n:[n],i=[];for(let t of r){let n=await e[`~standard`].validate(t);if(n.issues)return{issues:n.issues};i.push(n.value)}return t.min!==void 0&&i.length<t.min?{issues:[{message:`must have at least ${t.min} item(s)`}]}:t.max!==void 0&&i.length>t.max?{issues:[{message:`must have at most ${t.max} item(s)`}]}:{value:i}}}}}function O(e){return{"~standard":{version:1,vendor:`finesoft`,validate:e}}}async function Ve(e,t){let n=await e[`~standard`].validate(t);return n.issues?{ok:!1,issues:n.issues}:{ok:!0,value:n.value}}function He(e){return Object.assign(Object.create(null),e)}var Ue=class{debug;routes=[];constructor(e){this.debug=e}add(e,t,n){let r=typeof n==`string`?{renderMode:n}:n??{},i=[],a=e.split(/(\/:[\w]+\??)/).map(t=>{let n=t.match(/^\/:(\w+)(\?)?$/);if(n){if(i.includes(n[1]))throw Error(`[Router] Duplicate parameter name ":${n[1]}" in pattern "${e}"`);return i.push(n[1]),n[2]?`(?:/([^/]+))?`:`/([^/]+)`}return t.replace(/[.+?^${}()|[\]\\]/g,`\\$&`)}).join(``);return this.routes.push({pattern:e,intentId:t,regex:RegExp(`^${a}/?$`),paramNames:i,renderMode:r.renderMode,beforeGuards:r.beforeGuards,afterGuards:r.afterGuards,paramCodecs:r.paramCodecs,queryCodecs:r.queryCodecs}),this}async resolve(e){let{path:t,queryParams:n,searchParams:r}=this.parseUrl(e);for(let a of this.routes){let o=t.match(a.regex);if(!o)continue;let s=He(),c=!0;for(let e=0;e<a.paramNames.length;e++){let t=a.paramNames[e],n=o[e+1],r=a.paramCodecs?.[t];if(r){let e=await Ve(r,n);if(!e.ok){this.debug?.(`[Router] route "${a.pattern}" skipped: path param "${t}" failed validation: ${e.issues[0]?.message??`invalid`}`),c=!1;break}e.value!==void 0&&(s[t]=e.value)}else n&&(s[t]=n)}if(c){if(a.queryCodecs)for(let e of Object.keys(a.queryCodecs)){let t=a.queryCodecs[e],i=await Ve(t,ze(t)?r.getAll(e):n[e]);if(!i.ok){this.debug?.(`[Router] route "${a.pattern}" skipped: query param "${e}" failed validation: ${i.issues[0]?.message??`invalid`}`),c=!1;break}i.value!==void 0&&(s[e]=i.value)}if(c)return Object.assign(s,Object.fromEntries(Object.entries(n).filter(([e])=>!(e in s)&&!a.queryCodecs?.[e]))),{intent:{id:a.intentId,params:s},action:i(e),renderMode:a.renderMode,beforeGuards:a.beforeGuards,afterGuards:a.afterGuards}}}return null}getRoutes(){return this.routes.map(e=>`${e.pattern} → ${e.intentId}`)}parseUrl(e){try{let t=new URL(e,`http://localhost`),n=He(Object.fromEntries(t.searchParams));return{path:t.pathname,queryParams:n,searchParams:t.searchParams}}catch{return{path:e.split(`?`)[0].split(`#`)[0],queryParams:He(),searchParams:new URLSearchParams}}}};const k=e=>({issues:[{message:e}]});function We(e={}){return O(t=>typeof t==`string`?e.minLength!==void 0&&t.length<e.minLength?k(`must be at least ${e.minLength} characters`):e.maxLength!==void 0&&t.length>e.maxLength?k(`must be at most ${e.maxLength} characters`):e.pattern&&!e.pattern.test(t)?k(`must match ${e.pattern}`):{value:t}:k(`expected a string`))}function Ge(e,t){return t.min!==void 0&&e<t.min?k(`must be >= ${t.min}`):t.max!==void 0&&e>t.max?k(`must be <= ${t.max}`):null}function Ke(e={}){return O(t=>{if(typeof t!=`string`||!/^-?\d+$/.test(t))return k(`"${String(t)}" is not an integer`);let n=Number(t);return Ge(n,e)??{value:n}})}function qe(e={}){return O(t=>{if(typeof t!=`string`||!/^-?\d+(\.\d+)?$/.test(t))return k(`"${String(t)}" is not a number`);let n=Number(t);return Ge(n,e)??{value:n}})}const Je=new Set([`true`,`1`]),Ye=new Set([`false`,`0`]);function Xe(){return O(e=>typeof e==`string`&&Je.has(e)?{value:!0}:typeof e==`string`&&Ye.has(e)?{value:!1}:k(`"${String(e)}" is not a boolean (true/false/1/0)`))}function Ze(e){return O(t=>typeof t==`string`&&e.includes(t)?{value:t}:k(`"${String(t)}" is not one of: ${e.join(`, `)}`))}const Qe=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;function $e(){return O(e=>typeof e==`string`&&Qe.test(e)?{value:e}:k(`"${String(e)}" is not a valid UUID`))}function et(e){return O(t=>t===void 0?{value:void 0}:e[`~standard`].validate(t))}function tt(e,t){return O(n=>n===void 0?{value:t}:e[`~standard`].validate(n))}async function nt(e,t){for(let n of e){let e=await n(t);if(e.kind!==`next`)return e}return{kind:`next`}}async function rt(e,t){for(let n of e){let e=await n(t);if(e.kind!==`next`)return e}return{kind:`next`}}const it=new WeakMap;function A(e){return at(e,new Set,0)}function at(e,t,n){if(e==null)return String(e);if(typeof e!=`object`)return JSON.stringify(e);let r=it.get(e);if(r!==void 0)return r;if(n>50)return`"[Max Depth]"`;if(t.has(e))return`"[Circular]"`;t.add(e);try{let r;if(Array.isArray(e))r=`[`+e.map(e=>at(e,t,n+1)).join(`,`)+`]`;else{let i=Object.keys(e).sort(),a=[];for(let r of i){let i=e[r];i!==void 0&&a.push(JSON.stringify(r)+`:`+at(i,t,n+1))}r=`{`+a.join(`,`)+`}`}return it.set(e,r),r}finally{t.delete(e)}}var ot=class e{intents;constructor(e){this.intents=e}static fromArray(t){let n=new Map;for(let e of t)if(e.intent&&e.data!==void 0){let t=A(e.intent);n.set(t,e.data)}return new e(n)}static empty(){return new e(new Map)}get(e){let t=A(e),n=this.intents.get(t);if(n!==void 0)return this.intents.delete(t),n}has(e){return this.intents.has(A(e))}get size(){return this.intents.size}},st=class e{container;intentDispatcher;actionDispatcher;router;prefetchedIntents;beforeGuards=[];afterGuards=[];_logger;constructor(e,t){this.container=e,this.intentDispatcher=new s,this.actionDispatcher=new o,this.router=new Ue(e=>this.getLogger().debug(e)),this.prefetchedIntents=t}static create(t={}){let n=new c;Ie(n,t);let r=new e(n,t.prefetchedIntents??ot.empty());return t.setupRoutes?.(r.router),r}getLogger(){return this._logger??=this.container.resolve(D.LOGGER)}async dispatch(e){let t=this.getLogger(),n=this.prefetchedIntents.get(e);return n===void 0?(t.debug(`[Framework] dispatch intent: ${e.id}`,e.params),this.intentDispatcher.dispatch(e,this.container)):(t.debug(`[Framework] re-using prefetched intent response for: ${e.id}`,e.params),n)}async perform(e){return this.getLogger().debug(`[Framework] perform action: ${e.kind}`),this.actionDispatcher.perform(e)}async routeUrl(e){return this.router.resolve(e)}didEnterPage(e){this.container.resolve(D.METRICS).recordPageView(e.pageType,{pageId:e.id,title:e.title})}getLocale(){return this.container.has(D.LOCALE)?this.container.resolve(D.LOCALE):void 0}getTranslator(){return this.container.has(D.TRANSLATOR)?this.container.resolve(D.TRANSLATOR):void 0}getPlatform(){return this.container.resolve(D.PLATFORM)}onAction(e,t){this.actionDispatcher.onAction(e,t)}registerIntent(e){this.intentDispatcher.register(e)}beforeLoad(e){this.beforeGuards.push(e)}afterLoad(e){this.afterGuards.push(e)}runBeforeLoad(e,t){return nt(t?.length?[...this.beforeGuards,...t]:this.beforeGuards,e)}runAfterLoad(e,t){return rt(t?.length?[...this.afterGuards,...t]:this.afterGuards,e)}dispose(){this.container.dispose()}};const j=Symbol.for(`finesoft.publicFields`),ct=[`id`,`pageType`,`title`,`description`,`url`];function lt(e,t){return t===!0?(Object.defineProperty(e,j,{value:!0,enumerable:!1,configurable:!0,writable:!1}),e):(Object.defineProperty(e,j,{value:Object.freeze([...t]),enumerable:!1,configurable:!0,writable:!1}),e)}function ut(e){return typeof e==`object`&&!!e&&e[j]!==void 0}function dt(e){if(typeof e!=`object`||!e)return null;let t=e[j];return t===void 0?null:t===!0?!0:Array.isArray(t)?t:null}function ft(){try{let e=globalThis.process?.env?.NODE_ENV;return e===void 0?!0:e===`production`}catch{return!0}}function pt(e){if(e instanceof Error)return e.stack??`${e.name}: ${e.message}`;if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return String(e)}}function mt(e){let{status:t,publicMessage:n,devError:r,isProduction:i=ft()}=e,a=!i&&r!==void 0;return{id:`error`,pageType:`error`,title:`Error ${t}`,description:a?`${n}\n\n[dev only]\n${pt(r)}`:n}}var ht=class{fallback(e,t){throw t}async perform(e,t){let n=e.params??{};try{return await this.execute(n,t)}catch(e){return this.fallback(n,e instanceof Error?e:Error(String(e)))}}};function gt(...e){return t=>e.reduce((e,t)=>t(e),t)}function _t(...e){return async t=>{let n=t;for(let t of e)n=await t(n);return n}}function vt(e){return t=>t.map(e)}const M={LEAF:`leaf`,STACK:`stack`,TABS:`tabs`,SPLIT:`split`},N={AUTOMATIC:`automatic`,ALL:`all`,DOUBLE_COLUMN:`doubleColumn`,DETAIL_ONLY:`detailOnly`};var P=class extends Error{constructor(e){super(e),this.name=`NavigationError`}};function F(e,t={}){return{kind:M.LEAF,intent:e,params:t}}function yt(e){let t=Array.isArray(e)?[...e]:[e];return{kind:M.STACK,entries:t}}function bt(e){let t=e.order?[...e.order]:Object.keys(e.branches);return{kind:M.TABS,active:e.active,order:t,branches:{...e.branches}}}function xt(e,t){let n=e.map(e=>({id:e.id,content:e.content}));return t===void 0?{kind:M.SPLIT,columns:n}:{kind:M.SPLIT,columns:n,visibility:t}}function I(e){return e.kind===M.LEAF}function St(e){return e.kind===M.STACK}function Ct(e){return e.kind===M.TABS}function wt(e){return e.kind===M.SPLIT}function Tt(e,t){return{"data-fs-entry":``,"data-fs-intent":e,"data-fs-key":t}}function Et(e,t){return`${e} ${A(t)}`}function Dt(e){let t=[],n=e;for(;;)switch(n.kind){case M.LEAF:return t;case M.STACK:{if(n.entries.length===0)return t;let e=n.entries.length-1;t.push({kind:`stack-entry`,index:e}),n=n.entries[e];break}case M.TABS:{let e=n.branches[n.active];if(e===void 0)return t;t.push({kind:`tab`,key:n.active}),n=e;break}case M.SPLIT:{let e=L(n);if(e===void 0)return t;t.push({kind:`column`,id:e.id}),n=e.content;break}}}function L(e){for(let t=e.columns.length-1;t>=0;t--)if(e.columns[t].content!==void 0)return e.columns[t]}function R(e,t){let n=e;for(let e of t){if(n===void 0)return;n=Ot(n,e)}return n}function Ot(e,t){switch(t.kind){case`stack-entry`:return e.kind===M.STACK?e.entries[t.index]:void 0;case`tab`:return e.kind===M.TABS?e.branches[t.key]:void 0;case`column`:return e.kind===M.SPLIT?e.columns.find(e=>e.id===t.id)?.content:void 0}}function kt(e,t){let n=R(e,t);if(n===void 0)return;let r=[...t],i=n;for(;;)switch(i.kind){case M.STACK:return r;case M.LEAF:return;case M.TABS:{let e=i.branches[i.active];if(e===void 0)return;r.push({kind:`tab`,key:i.active}),i=e;break}case M.SPLIT:{let e=L(i);if(e===void 0)return;r.push({kind:`column`,id:e.id}),i=e.content;break}}}function At(e){let t=[];return z(e,t),t}function z(e,t){switch(e.kind){case M.LEAF:t.push(e);return;case M.STACK:if(e.entries.length===0)return;z(e.entries[e.entries.length-1],t);return;case M.TABS:{let n=e.branches[e.active];n!==void 0&&z(n,t);return}case M.SPLIT:for(let n of jt(e))n.content!==void 0&&z(n.content,t);return}}function B(e){let t=[];return V(e,t),t}function V(e,t){switch(e.kind){case M.LEAF:t.push(e);return;case M.STACK:for(let n of e.entries)V(n,t);return;case M.TABS:for(let n of Object.values(e.branches))V(n,t);return;case M.SPLIT:for(let n of e.columns)n.content!==void 0&&V(n.content,t);return}}function jt(e){let{columns:t,visibility:n}=e;if(t.length===0)return t;switch(n){case N.DETAIL_ONLY:return[t[t.length-1]];case N.DOUBLE_COLUMN:{let e=t.length-1;return e===0?[t[0]]:[t[0],t[e]]}default:return t}}function H(e,t,n){return t.length===0?n(e):U(e,t,0,n)}function U(e,t,n,r){if(n===t.length)return r(e);let i=t[n];switch(i.kind){case`stack-entry`:{if(e.kind!==M.STACK)throw new P(`路径无效:在 ${e.kind} 节点上期望 stack(stack-entry 步)`);if(i.index<0||i.index>=e.entries.length)throw new P(`路径无效:stack entry 索引越界 ${i.index}`);let a=e.entries.slice();return a[i.index]=U(a[i.index],t,n+1,r),{...e,entries:a}}case`tab`:{if(e.kind!==M.TABS)throw new P(`路径无效:在 ${e.kind} 节点上期望 tabs(tab 步)`);let a=e.branches[i.key];if(a===void 0)throw new P(`路径无效:tabs 分支 "${i.key}" 不存在`);return{...e,branches:{...e.branches,[i.key]:U(a,t,n+1,r)}}}case`column`:{if(e.kind!==M.SPLIT)throw new P(`路径无效:在 ${e.kind} 节点上期望 split(column 步)`);let a=e.columns.findIndex(e=>e.id===i.id);if(a===-1)throw new P(`路径无效:split 列 "${i.id}" 不存在`);let o=e.columns[a].content;if(o===void 0)throw new P(`路径无效:split 列 "${i.id}" 内容为空`);let s=e.columns.slice();return s[a]={...s[a],content:U(o,t,n+1,r)},{...e,columns:s}}}}function Mt(e){let t=[],n,r=e;for(;;)switch(r.kind===M.STACK&&(n=[...t]),r.kind){case M.LEAF:return n;case M.STACK:{if(r.entries.length===0)return n;let e=r.entries.length-1;t.push({kind:`stack-entry`,index:e}),r=r.entries[e];break}case M.TABS:{let e=r.branches[r.active];if(e===void 0)return n;t.push({kind:`tab`,key:r.active}),r=e;break}case M.SPLIT:{let e=L(r);if(e===void 0)return n;t.push({kind:`column`,id:e.id}),r=e.content;break}}}function W(e,t){return t?kt(e,t):Mt(e)}function Nt(e,t,n){let r=W(e,n);if(r===void 0)throw new P(`push 失败:激活路径上没有可用的 stack`);return H(e,r,e=>{let n=e;return{...n,entries:[...n.entries,t]}})}function Pt(e,t=1,n){if(t<=0)return e;let r=W(e,n);if(r===void 0)throw new P(`pop 失败:激活路径上没有可用的 stack`);return H(e,r,e=>{let n=e,r=Math.max(1,n.entries.length-t);return r===n.entries.length?n:{...n,entries:n.entries.slice(0,r)}})}function Ft(e,t){let n=W(e,t);if(n===void 0)throw new P(`popToRoot 失败:激活路径上没有可用的 stack`);return H(e,n,e=>{let t=e;return t.entries.length<=1?t:{...t,entries:t.entries.slice(0,1)}})}function It(e,t,n){let r=W(e,n);if(r===void 0)throw new P(`popTo 失败:激活路径上没有可用的 stack`);return H(e,r,e=>{let n=e;if(t<0||t>=n.entries.length)throw new P(`popTo 失败:index ${t} 越界(栈深 ${n.entries.length})`);return t===n.entries.length-1?n:{...n,entries:n.entries.slice(0,t+1)}})}function Lt(e,t,n){let r=W(e,n);if(r===void 0)throw new P(`replaceTop 失败:激活路径上没有可用的 stack`);return H(e,r,e=>{let n=e;if(n.entries.length===0)throw new P(`replaceTop 失败:stack 为空`);let r=n.entries.slice();return r[r.length-1]=t,{...n,entries:r}})}function Rt(e,t,n){let r=n??Vt(e,M.TABS);if(r===void 0)throw new P(`selectTab 失败:激活路径上没有 tabs 节点`);return H(e,r,e=>{if(e.kind!==M.TABS)throw new P(`selectTab 失败:目标是 ${e.kind} 节点,不是 tabs`);let n=e;if(!(t in n.branches))throw new P(`selectTab 失败:未知分支 "${t}"`);return n.active===t?n:{...n,active:t}})}function zt(e,t,n,r){let i=r??Vt(e,M.SPLIT);if(i===void 0)throw new P(`selectColumn 失败:激活路径上没有 split 节点`);return H(e,i,e=>{if(e.kind!==M.SPLIT)throw new P(`selectColumn 失败:目标是 ${e.kind} 节点,不是 split`);let r=e,i=r.columns.findIndex(e=>e.id===t);if(i===-1)throw new P(`selectColumn 失败:未知列 "${t}"`);let a=r.columns.map((e,t)=>t===i?{...e,content:n}:t>i?{...e,content:void 0}:e);return{...r,columns:a}})}function Bt(e,t,n){let r=n??Vt(e,M.SPLIT);if(r===void 0)throw new P(`setVisibility 失败:激活路径上没有 split 节点`);return H(e,r,e=>{if(e.kind!==M.SPLIT)throw new P(`setVisibility 失败:目标是 ${e.kind} 节点,不是 split`);return{...e,visibility:t}})}function Vt(e,t){let n=[],r=e;for(;;){if(r.kind===t)return n;switch(r.kind){case M.LEAF:return;case M.STACK:{if(r.entries.length===0)return;let e=r.entries.length-1;n.push({kind:`stack-entry`,index:e}),r=r.entries[e];break}case M.TABS:{let e=r.branches[r.active];if(e===void 0)return;n.push({kind:`tab`,key:r.active}),r=e;break}case M.SPLIT:{let e=L(r);if(e===void 0)return;n.push({kind:`column`,id:e.id}),r=e.content;break}}}}const Ht=new Set(Object.values(N));function G(e){switch(e.kind){case M.LEAF:return{kind:M.LEAF,intent:e.intent,params:e.params};case M.STACK:return{kind:M.STACK,entries:e.entries.map(G)};case M.TABS:{let t={};for(let n of Object.keys(e.branches))t[n]=G(e.branches[n]);return{kind:M.TABS,active:e.active,order:[...e.order],branches:t}}case M.SPLIT:{let t=e.columns.map(e=>({id:e.id,content:e.content===void 0?null:G(e.content)}));return e.visibility===void 0?{kind:M.SPLIT,columns:t}:{kind:M.SPLIT,columns:t,visibility:e.visibility}}}}function Ut(e){return A(G(e))}const Wt=new Set([M.LEAF,M.STACK,M.TABS,M.SPLIT]);function K(e){return Gt(e,`$`)}function q(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Gt(e,t){if(!q(e))throw new P(`反序列化失败:${t} 不是对象`);let n=e.kind;if(typeof n!=`string`||!Wt.has(n))throw new P(`反序列化失败:${t}.kind 非法(${String(n)})`);switch(n){case M.LEAF:return Kt(e,t);case M.STACK:return qt(e,t);case M.TABS:return Jt(e,t);case M.SPLIT:return Yt(e,t)}}function Kt(e,t){if(typeof e.intent!=`string`)throw new P(`反序列化失败:${t}.intent 必须是字符串`);if(!q(e.params))throw new P(`反序列化失败:${t}.params 必须是对象`);return{kind:M.LEAF,intent:e.intent,params:{...e.params}}}function qt(e,t){if(!Array.isArray(e.entries))throw new P(`反序列化失败:${t}.entries 必须是数组`);return{kind:M.STACK,entries:e.entries.map((e,n)=>Gt(e,`${t}.entries[${n}]`))}}function Jt(e,t){if(typeof e.active!=`string`)throw new P(`反序列化失败:${t}.active 必须是字符串`);if(!Array.isArray(e.order)||!e.order.every(e=>typeof e==`string`))throw new P(`反序列化失败:${t}.order 必须是字符串数组`);if(!q(e.branches))throw new P(`反序列化失败:${t}.branches 必须是对象`);let n={};for(let r of Object.keys(e.branches))n[r]=Gt(e.branches[r],`${t}.branches.${r}`);for(let r of e.order)if(!(r in n))throw new P(`反序列化失败:${t}.order 包含不在 branches 中的键 "${r}"`);if(!(e.active in n))throw new P(`反序列化失败:${t}.active "${e.active}" 不在 branches 中`);return{kind:M.TABS,active:e.active,order:[...e.order],branches:n}}function Yt(e,t){if(!Array.isArray(e.columns))throw new P(`反序列化失败:${t}.columns 必须是数组`);let n=e.columns.map((e,n)=>{let r=`${t}.columns[${n}]`;if(!q(e))throw new P(`反序列化失败:${r} 不是对象`);if(typeof e.id!=`string`)throw new P(`反序列化失败:${r}.id 必须是字符串`);let i=e.content===null||e.content===void 0?void 0:Gt(e.content,`${r}.content`);return{id:e.id,content:i}});if(e.visibility===void 0)return{kind:M.SPLIT,columns:n};if(typeof e.visibility!=`string`||!Ht.has(e.visibility))throw new P(`反序列化失败:${t}.visibility 非法值 ${JSON.stringify(e.visibility)}`);return{kind:M.SPLIT,columns:n,visibility:e.visibility}}const Xt=`__nav`;function Zt(e){try{let t=new URL(e,`http://localhost`);return{path:t.pathname,query:t.searchParams}}catch{let t=e.split(`?`)[0].split(`#`)[0],n=e.includes(`?`)?e.slice(e.indexOf(`?`)+1).split(`#`)[0]:``;return{path:t||`/`,query:new URLSearchParams(n)}}}function Qt(e,t){let n=t.toString();return n?`${e}?${n}`:e}function $t(e){let t=[];for(let n of e.getRoutes()){let e=n.indexOf(` → `);if(e===-1)continue;let r=n.slice(0,e),i=n.slice(e+3);r&&i&&t.push({pattern:r,intentId:i})}return t}function en(e){if(e!=null){if(typeof e==`string`)return e;if(typeof e==`number`)return Number.isFinite(e)?String(e):void 0;if(typeof e==`boolean`)return String(e)}}function tn(e,t,n){for(let r of e){if(r.intentId!==t)continue;let e=nn(r.pattern,n);if(e)return e}}function nn(e,t){let n=new Set,r=!0,i=e.split(/(\/:[\w]+\??)/).map(e=>{let i=e.match(/^\/:(\w+)(\?)?$/);if(!i)return e;let a=i[1],o=i[2]===`?`,s=en(t[a]);return s===void 0?(o||(r=!1),``):(n.add(a),`/${encodeURIComponent(s)}`)}).join(``);if(!r)return;let a=i===``?`/`:i,o=new URLSearchParams;for(let e of Object.keys(t).sort()){if(n.has(e))continue;let r=en(t[e]);r!==void 0&&o.set(e,r)}return Qt(a,o)}function rn(e,t,n){if(typeof e.reverse==`function`){let r=e.reverse(t,n);if(r!==void 0)return r}return tn($t(e),t,n)}function an(e){return sn(A(G(e)))}function on(e){let t;try{t=cn(e)}catch{throw new P(`导航参数解码失败:非法的 base64url`)}let n;try{n=JSON.parse(t)}catch{throw new P(`导航参数解码失败:非法的 JSON`)}return K(n)}function sn(e){let t=fn(e),n=``;for(let e of t)n+=String.fromCharCode(e);return ln(n).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function cn(e){let t=un(e.replace(/-/g,`+`).replace(/_/g,`/`)),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return pn(n)}function ln(e){return typeof btoa==`function`?btoa(e):dn(e,`binary`).toString(`base64`)}function un(e){return typeof atob==`function`?atob(e):dn(e,`base64`).toString(`binary`)}function dn(e,t){let n=globalThis.Buffer;if(!n)throw new P(`导航参数编解码失败:当前运行时缺少 base64 能力`);return n.from(e,t)}function fn(e){if(typeof TextEncoder<`u`)return new TextEncoder().encode(e);let t=[];for(let n of e){let e=n.codePointAt(0);e<128?t.push(e):e<2048?t.push(192|e>>6,128|e&63):e<65536?t.push(224|e>>12,128|e>>6&63,128|e&63):t.push(240|e>>18,128|e>>12&63,128|e>>6&63,128|e&63)}return Uint8Array.from(t)}function pn(e){if(typeof TextDecoder<`u`)return new TextDecoder().decode(e);let t=``;for(let n=0;n<e.length;){let r=e[n++];r<128?t+=String.fromCodePoint(r):r<224?t+=String.fromCodePoint((r&31)<<6|e[n++]&63):r<240?t+=String.fromCodePoint((r&15)<<12|(e[n++]&63)<<6|e[n++]&63):t+=String.fromCodePoint((r&7)<<18|(e[n++]&63)<<12|(e[n++]&63)<<6|e[n++]&63)}return t}function mn(e){if(I(e))return{intent:e.intent,params:e.params};let t=R(e,Dt(e));if(t!==void 0&&I(t))return{intent:t.intent,params:t.params}}function hn(){return{encode(e,t){let n=mn(e);return n===void 0?`/`:rn(t,n.intent,n.params)??`/`},decode(e){let{query:t}=Zt(e),n=t.get(Xt);if(!(n===null||n===``))return on(n)}}}function gn(e={}){let t=e.param??`__nav`;return{encode(e,n){let r=mn(e),{path:i,query:a}=Zt(r?rn(n,r.intent,r.params)??`/`:`/`);return a.set(t,an(e)),Qt(i,a)},decode(e){let{query:n}=Zt(e),r=n.get(t);if(!(r===null||r===``))return on(r)}}}function _n(e){let t=[],n=e.split(/(\/:[\w]+\??)/).map(e=>{let n=e.match(/^\/:(\w+)(\?)?$/);return n?(t.push(n[1]),n[2]?`(?:/([^/]+))?`:`/([^/]+)`):e.replace(/[.+?^${}()|[\]\\]/g,`\\$&`)}).join(``);return{regex:RegExp(`^${n}/?$`),paramNames:t}}function vn(e){return $t(e).map(e=>{let{regex:t,paramNames:n}=_n(e.pattern);return{...e,regex:t,paramNames:n}})}function yn(e,t){let{path:n,query:r}=Zt(e),i=Object.fromEntries(r);for(let e of t){let t=n.match(e.regex);if(!t)continue;let r=Object.assign(Object.create(null),i);for(let n=0;n<e.paramNames.length;n++){let i=t[n+1];i!==void 0&&(r[e.paramNames[n]]=i)}return{intentId:e.intentId,params:r}}}function bn(){return{decode(e,t){let n=yn(e,vn(t));if(n)return yt([F(n.intentId,n.params)])},encode(e,t){let n=mn(e);return n===void 0?`/`:rn(t,n.intent,n.params)??`/`}}}const J={PUSH:`push`,POP:`pop`,POP_TO_ROOT:`popToRoot`,POP_TO:`popTo`,REPLACE_TOP:`replaceTop`,SELECT_TAB:`selectTab`,SELECT_COLUMN:`selectColumn`,SET_VISIBILITY:`setVisibility`,HYDRATE:`hydrate`};function Y(e,t){return Et(e,t)}function xn(e,t){return{id:`error-${e}`,pageType:`error`,title:t,description:t}}function Sn(e){let{intentDispatcher:t,router:n,createContext:r,beforeLoad:i=[],afterLoad:a=[],prefetched:o,getErrorPage:s=xn,onRedirect:c}=e,l=e.isServer??typeof window>`u`,u=e.initial,d={tree:u,destinations:[]},f=new Set,p=new Map,m=Promise.resolve(d);function h(e){let t=m.then(e,e);return m=t.then(e=>e,()=>d),t}async function g(e){let t=At(e),n=Cn(e),r=n?Y(n.intent,n.params):void 0,i=[];for(let e of t){let t=Y(e.intent,e.params),n=r!==void 0&&t===r,a=p.get(t);n?i.push(await _(e,a?.page)):a===void 0?i.push(await v(e)):i.push(a)}for(let e of i){let t=Y(e.intent,e.params);e.status===void 0?p.set(t,e):p.delete(t)}let a=new Set(B(e).map(e=>Y(e.intent,e.params)));for(let e of p.keys())a.has(e)||p.delete(e);return{tree:e,destinations:i}}async function _(e,t){let n=e.intent,o=e.params,l=r({intent:n,params:o}),u=l.navigation??b(n,o,l),d=await nt(i,u);if(d.kind===`redirect`)return c?.({url:d.url,status:d.status}),{intent:n,params:o,page:t??s(d.status,`Redirecting`),status:d.status};if(d.kind===`deny`)return{intent:n,params:o,page:s(d.status,d.message),status:d.status};if(d.kind===`rewrite`){let e=await x(d.url);e&&(n=e.intent,o=e.params,l=r({intent:n,params:o}),u=l.navigation??b(n,o,l),t=void 0)}let f=await y(n,o,l,t);if(f.status!==void 0)return{intent:n,params:o,page:f.page,status:f.status};let p=await rt(a,{...u,page:f.page});return p.kind===`redirect`?(c?.({url:p.url,status:p.status}),{intent:n,params:o,page:f.page,status:p.status}):p.kind===`deny`?{intent:n,params:o,page:f.page,status:p.status}:{intent:n,params:o,page:f.page}}async function v(e){let t=r({intent:e.intent,params:e.params}),n=await y(e.intent,e.params,t,void 0);return{intent:e.intent,params:e.params,page:n.page,...n.status===void 0?{}:{status:n.status}}}async function y(e,n,r,i){if(i!==void 0)return{page:i};let a={id:e,params:n},c=o?.get(a);if(c!==void 0)return{page:c};try{return{page:await t.dispatch(a,r.container)}}catch{return{page:s(500,`Internal error`),status:500}}}function b(e,t,n){let r=n.url??`/`,i;try{i=new URL(r,`http://localhost`).pathname}catch{i=r.split(`?`)[0].split(`#`)[0]}return{url:r,path:i,params:t,intent:{id:e,params:t},isServer:l,container:n.container,getCookie:()=>void 0,getHeader:()=>void 0}}async function x(e){let t=await n.resolve(e);if(t)return F(t.intent.id,t.intent.params??{})}function S(e){u=e.tree,d=e;for(let e of f)e(d);return d}function C(e){switch(e.kind){case J.PUSH:return Nt(u,F(e.intent,e.params),e.target);case J.POP:return Pt(u,e.count,e.target);case J.POP_TO_ROOT:return Ft(u,e.target);case J.POP_TO:return It(u,e.index,e.target);case J.REPLACE_TOP:return Lt(u,F(e.intent,e.params),e.target);case J.SELECT_TAB:return Rt(u,e.key,e.target);case J.SELECT_COLUMN:return zt(u,e.columnId,e.intent===void 0?void 0:F(e.intent,e.params),e.target);case J.SET_VISIBILITY:return Bt(u,e.visibility,e.target);case J.HYDRATE:return e.tree}}function w(e){return h(async()=>S(await g(C(e))))}return{getTree(){return u},getSnapshot(){return d},apply:w,push(e,t,n){return w({kind:J.PUSH,intent:e,params:t,target:n?.target})},pop(e){return w({kind:J.POP,count:e})},popToRoot(){return w({kind:J.POP_TO_ROOT})},replaceTop(e,t){return w({kind:J.REPLACE_TOP,intent:e,params:t})},selectTab(e,t){return w({kind:J.SELECT_TAB,key:e,target:t})},selectColumn(e,t,n,r){return w({kind:J.SELECT_COLUMN,columnId:e,intent:t,params:n,target:r})},setVisibility(e,t){return w({kind:J.SET_VISIBILITY,visibility:e,target:t})},hydrate(e){return w({kind:J.HYDRATE,tree:e})},invalidate(e){e===void 0?p.clear():p.delete(e)},refresh(){return h(async()=>{let e=Cn(u);return e&&p.delete(Y(e.intent,e.params)),S(await g(u))})},subscribe(e){return f.add(e),()=>{f.delete(e)}},resolve(){return h(async()=>S(await g(u)))}}}function Cn(e){let t=R(e,Dt(e));if(t!==void 0)return t.kind===`leaf`?t:void 0}function wn(e){return typeof e!=`object`||!e?!1:I(e)||St(e)||Ct(e)||wt(e)}function Tn(e,t){if(wn(e))return e;let n=e(t);return n===void 0?{kind:`leaf`,intent:`@finesoft/navigation-root`,params:{}}:n}function En(e){return wn(e)?()=>e:e}function Dn(){return typeof window<`u`&&window.location?window.location.pathname+window.location.search:`/`}function On(e){let t=e.codec??hn(),{initial:n,beforeLoad:r,afterLoad:i,getErrorPage:a}=e;return{initial:n,codec:t,beforeLoad:r,afterLoad:i,getErrorPage:a,toBrowserConfig(e){return{initial:Tn(n,e??Dn()),codec:t,beforeLoad:r,afterLoad:i,getErrorPage:a}},toSSRDefinition(){return{codec:t,initial:En(n),beforeLoad:r,afterLoad:i}}}}function kn(e,t){return{path:e,...t}}function An(e,t){let n={intentId:t.intentId,async perform(e,n){let r=e.params??{};try{return await t.handler(r,n)}catch(e){let n=e instanceof Error?e:Error(String(e));if(t.fallback)return t.fallback(r,n);throw n}}};return{path:e,intentId:t.intentId,controller:n,params:t.params,query:t.query,renderMode:t.renderMode,beforeLoad:t.beforeLoad,afterLoad:t.afterLoad}}function jn(e,t,n){let r=new Set;for(let i of t){i.controller&&!r.has(i.intentId)&&(e.registerIntent(i.controller),r.add(i.intentId));let t={renderMode:i.renderMode,beforeGuards:i.beforeLoad,afterGuards:i.afterLoad,paramCodecs:i.params,queryCodecs:i.query};if(e.router.add(i.path,i.intentId,t),n?.locales?.length){let n=i.path===`/`?`/:locale`:`/:locale${i.path}`;e.router.add(n,i.intentId,t)}}}const Mn=`__finesoft_session__`,Nn=1;function Pn(e){return typeof e==`object`&&!!e&&`url`in e&&typeof e.url==`string`}var Fn=class extends Error{constructor(e){super(e),this.name=`SessionError`}};function In(e){return A(e)}function Ln(e,t){if(e===void 0)return;let n;try{n=JSON.parse(e)}catch{return}if(Rn(n)&&n.version===t&&typeof n.capturedAt==`number`&&Rn(n.slices)&&Rn(n.scoped))return n}function Rn(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function X(e,t){return Et(e,t)}function zn(e){return B(e).map(e=>X(e.intent,e.params))}function Bn(e){let t=new Map(e?Object.entries(e):void 0);return{get(e){return t.get(e)},set(e,n){t.set(e,n)},delete(e){t.delete(e)},prune(e){let n=new Set(e);for(let e of t.keys())n.has(e)||t.delete(e)},keys(){return[...t.keys()]}}}function Vn(e){let{storage:t,key:n=Mn,version:r=1,maxAgeMs:i,navigation:a,now:o=()=>Date.now(),onError:s}=e,c=new Map,l=Bn();function u(e,t){s?.(e,t)}function d(){let e={};for(let t of c.values())try{e[t.key]=t.capture()}catch(e){u(e,{phase:`capture`,key:t.key})}return e}function f(){let e={};for(let t of l.keys())e[t]=l.get(t);return e}function p(){return{version:r,navigation:a?.capture(),url:a?.captureUrl?.(),slices:d(),scoped:f(),capturedAt:o()}}function m(e=p()){try{t.set(n,In(e))}catch(e){u(e,{phase:`persist`})}}function h(){let e;try{e=t.get(n)}catch(e){u(e,{phase:`load`});return}let a=Ln(e,r);if(a!==void 0&&!(i!==void 0&&o()-a.capturedAt>i))return a}function g(e){for(let t of c.values()){let n=e[t.key];if(n!==void 0)try{t.restore(n)}catch(e){u(e,{phase:`restore`,key:t.key})}}}function _(e=h()){if(e===void 0)return;l=Bn({...e.scoped});let t;try{t=a?.apply(e.navigation)}catch(e){u(e,{phase:`restore`});return}if(t instanceof Promise)return t.then(()=>{g(e.slices)},e=>{u(e,{phase:`restore`})});g(e.slices)}return{register(e){return c.set(e.key,e),()=>{c.get(e.key)===e&&c.delete(e.key)}},get scope(){return l},capture:p,persist:m,load:h,restore:_,clear(){t.delete(n)},save(){m()}}}function Hn(e,t){return{capture(){return G(e.getTree())},apply(t){if(!(t===void 0||Pn(t)))return e.hydrate(K(t)).then(()=>void 0)},captureUrl(){return t?.()},presentKeys(){return zn(e.getTree())}}}function Un(e){return{capture(){return{url:e.currentUrl()}},apply(t){if(Pn(t))return e.navigate(t.url)},captureUrl(){return e.currentUrl()},presentKeys(){if(e.currentIntent){let{intent:t,params:n}=e.currentIntent();return[X(t,n)]}return[e.currentUrl()]}}}var Wn=class{map=new Map;capacity;constructor(e){if(e<1)throw Error(`[LruMap] capacity must be >= 1, got ${e}`);this.capacity=e}get(e){if(!this.map.has(e))return;let t=this.map.get(e);return this.map.delete(e),this.map.set(e,t),t}set(e,t){if(this.map.has(e))this.map.delete(e);else if(this.map.size>=this.capacity){let e=this.map.keys().next().value;e!==void 0&&this.map.delete(e)}this.map.set(e,t)}has(e){return this.map.has(e)}delete(e){return this.map.delete(e)}get size(){return this.map.size}clear(){this.map.clear()}};function Gn(e){return e!=null}function Kn(e){return e==null}function qn(){return typeof window>`u`?`browser`:document.referrer.startsWith(`android-app://`)?`twa`:window.matchMedia(`(display-mode: standalone)`).matches||`standalone`in window.navigator&&window.navigator.standalone===!0?`standalone`:`browser`}function Jn(e){return e.replace(/^https?:\/\//,``)}function Yn(e){try{let t=new URL(e);return t.pathname+t.search+t.hash}catch{return e}}function Xn(e){return e.split(`?`)[0]}function Zn(e){return e.split(`?`)[0].split(`#`)[0]}function Qn(e,t){if(!t)return e;let n=new URLSearchParams;for(let[e,r]of Object.entries(t))r!==void 0&&n.set(e,r);let r=n.toString();return r?`${e}?${r}`:e}function Z(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function $n(e){let t=new Map;if(!e)return t;for(let n of e.split(`;`)){let e=n.indexOf(`=`);if(e===-1)continue;let r=n.slice(0,e).trim(),i=n.slice(e+1).trim();r&&t.set(r,i)}return t}function er(e){let{url:t,intent:n,container:r,request:i}=e,a=new URL(t,`http://localhost`),o=$n(i?.headers.get(`cookie`)??``);return{url:t,path:a.pathname,params:n.params??{},intent:n,isServer:!0,container:r,getCookie:e=>o.get(e),getHeader:e=>i?.headers.get(e)??void 0}}function Q(e){let{url:t,intent:n,container:r}=e;return{url:t,path:new URL(t,window.location.origin).pathname,params:n.params??{},intent:n,isServer:!1,container:r,getCookie:e=>$n(document.cookie).get(e),getHeader:()=>void 0}}function tr(){return{kind:`next`}}function nr(e,t=302){return{kind:`redirect`,url:e,status:t}}function rr(e){return{kind:`rewrite`,url:e}}function ir(e=403,t=`Forbidden`){return{kind:`deny`,status:e,message:t}}var ar=class{recorders;constructor(e){this.recorders=e}record(e,t){for(let n of this.recorders)n.record(e,t)}async flush(){let e=[];for(let t of this.recorders)t.flush&&e.push(t.flush());await Promise.all(e)}destroy(){for(let e of this.recorders)e.destroy?.()}},or=class{observer;tracked=new Map;captured=[];minDuration;constructor(e={}){this.minDuration=e.minVisibleDuration??1e3,this.observer=new IntersectionObserver(e=>{let t=Date.now();for(let n of e){let e=this.tracked.get(n.target);e&&(n.isIntersecting?e.visibleSince===null&&(e.visibleSince=t):e.visibleSince!==null&&(t-e.visibleSince>=this.minDuration&&this.captured.push({id:e.id,timestamp:e.visibleSince,metadata:e.metadata}),e.visibleSince=null))}},{threshold:e.threshold??.5})}observe(e,t,n){this.tracked.set(e,{id:t,metadata:n,visibleSince:null}),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.tracked.delete(e)}consume(){let e=Date.now();for(let[,t]of this.tracked)t.visibleSince!==null&&e-t.visibleSince>=this.minDuration&&(this.captured.push({id:t.id,timestamp:t.visibleSince,metadata:t.metadata}),t.visibleSince=e);return this.captured.splice(0)}destroy(){this.observer.disconnect(),this.tracked.clear(),this.captured.length=0}},sr=class{record(){}async flush(){}destroy(){}},cr=class{inner;providers;constructor(e,t){this.inner=e,this.providers=t}record(e,t){let n={};for(let e of this.providers)Object.assign(n,e.getFields());t&&Object.assign(n,t),this.inner.record(e,n)}async flush(){return this.inner.flush?.()}destroy(){this.inner.destroy?.()}};function lr(t){let{framework:n,log:r}=t;n.onAction(e.EXTERNAL_URL,e=>{r.debug(`ExternalUrlAction → ${e.url}`),window.open(e.url,`_blank`,`noopener,noreferrer`)})}const ur=5e3;let dr=null;function $(){dr?.()}function fr(e,t,n){$();let r=Math.max(0,n),i=Date.now(),a=!1,o=null,s=null,c=null,l=null;dr=p,f(),document.addEventListener(`load`,u,!0),s=setInterval(u,100),c=setTimeout(u,ur),u();function u(){a||o!==null||(o=requestAnimationFrame(()=>{o=null,d()}))}function d(){if(a)return;let n=Date.now()-i,o=t();if(!o){n>=ur&&(e.warn(`tryScroll: timed out waiting for the scrollable element`,{target:r,elapsedMs:n}),p());return}o.scrollTop=r;let s=o.scrollTop;if(s>=r-2){e.info(`scroll restored`,{target:r,actual:s,elapsedMs:n}),p();return}n>=ur&&(e.warn(`tryScroll: timed out before reaching the target`,{target:r,actual:s,elapsedMs:n,scrollHeight:o.scrollHeight,clientHeight:o.clientHeight}),p())}function f(){if(typeof MutationObserver>`u`)return;let e=document.body??document.documentElement;e&&(l=new MutationObserver(()=>{u()}),l.observe(e,{childList:!0,subtree:!0}))}function p(){a||(a=!0,dr===p&&(dr=null),o!==null&&(cancelAnimationFrame(o),o=null),s!==null&&(clearInterval(s),s=null),c!==null&&(clearTimeout(c),c=null),l?.disconnect(),l=null,document.removeEventListener(`load`,u,!0))}}var pr=class{entries;log;getScrollablePageElement;persistInHistoryState;currentStateId;constructor(e,t,n=10){this.entries=new Wn(n),this.log=e,this.getScrollablePageElement=t.getScrollablePageElement,this.persistInHistoryState=t.persistInHistoryState??!1}historyState(e,t){return this.persistInHistoryState?{id:e,state:t}:{id:e}}replaceState(e,t){$();let n=Z();window.history.replaceState(this.historyState(n,e),``,t),this.currentStateId=n,this.entries.set(n,{state:e,scrollY:0}),this.scrollTop=0,this.log.info(`replaceState`,e,t,n)}pushState(e,t){$();let n=Z();window.history.pushState(this.historyState(n,e),``,t),this.currentStateId=n,this.entries.set(n,{state:e,scrollY:0}),this.scrollTop=0,this.log.info(`pushState`,e,t,n)}beforeTransition(){$();let{state:e}=window.history;if(!e)return;let t=this.entries.get(e.id);if(!t){this.log.info(`current history state evicted from LRU, not saving scroll position`);return}let{scrollTop:n}=this;this.entries.set(e.id,{...t,scrollY:n}),this.log.info(`saving scroll position`,n)}onPopState(e){window.addEventListener(`popstate`,t=>{$(),this.currentStateId=t.state?.id,this.currentStateId||this.log.warn(`encountered a null event.state.id in onPopState event:`,window.location.href),this.log.info(`popstate`,this.entries,this.currentStateId);let n=this.currentStateId?this.entries.get(this.currentStateId):void 0,r=this.persistInHistoryState?t.state?.state:void 0,i=n?.state??r;if(Promise.resolve(e(window.location.href,i)).catch(e=>{this.log.error(`onPopState listener error:`,e)}),!n)return;let{scrollY:a}=n;this.log.info(`restoring scroll to`,a),fr(this.log,()=>this.getScrollablePageElement(),a)})}pushUrl(e){$();let t=Z();window.history.pushState({id:t},``,e),this.currentStateId=t,this.scrollTop=0,this.log.info(`pushUrl (no state)`,e,t)}replaceUrl(e){$();let t=Z();window.history.replaceState({id:t},``,e),this.currentStateId=t,this.scrollTop=0,this.log.info(`replaceUrl (no state)`,e,t)}updateState(e){if(!this.currentStateId){this.log.warn(`failed: encountered a null currentStateId inside updateState`);return}let t=this.entries.get(this.currentStateId),n=e(t?.state);this.log.info(`updateState`,n,this.currentStateId),this.entries.set(this.currentStateId,{scrollY:t?.scrollY??0,state:n})}get scrollTop(){return this.getScrollablePageElement()?.scrollTop||0}set scrollTop(e){let t=this.getScrollablePageElement();t&&(t.scrollTop=e)}};function mr(t){let{framework:n,log:r,callbacks:i,updateApp:a}=t,o=t.manageHistory??!0,{onForward:s}=t,c=!0,l=0,u=o?new pr(r,{getScrollablePageElement:t.getScrollablePageElement??(()=>document.getElementById(`scrollable-page-override`)||document.getElementById(`scrollable-page`)||document.documentElement)}):void 0;async function d(e,t,o){if(t>=5){r.error(`Navigation redirect loop detected (5 redirects), stopping at: ${e}`);return}let s=c||e===window.location.pathname+window.location.search,p=await n.routeUrl(e);if(!p){r.warn(`FlowAction: no route for ${e}`);return}let m=Q({url:e,intent:p.intent,container:n.container}),h=await n.runBeforeLoad(m,p.beforeGuards);if(h.kind===`redirect`){r.debug(`beforeLoad → redirect to ${h.url}`),await d(h.url,t+1,o);return}if(h.kind===`deny`){r.warn(`beforeLoad → denied (${h.status}): ${h.message}`);return}if(h.kind===`rewrite`){r.debug(`beforeLoad → rewrite to ${h.url}`),await d(h.url,t+1,o);return}let g=n.dispatch(p.intent);if(await Promise.race([g,new Promise(e=>setTimeout(e,500))]).catch(()=>{}),o!==l){r.info(`FlowAction superseded by newer navigation`,e);return}u?.beforeTransition(),a({page:g.then(async a=>{if(o!==l)return r.info(`FlowAction commit superseded`,e),a;let c={...m,page:a},h=await n.runAfterLoad(c,p.afterGuards);if(h.kind===`redirect`)return r.debug(`afterLoad → redirect to ${h.url}`),d(h.url,t+1,o),a;let g=e;return h.kind===`rewrite`&&(g=h.url,r.debug(`afterLoad → rewrite URL to ${g}`)),h.kind===`deny`?(r.warn(`afterLoad → denied (${h.status})`),a):(s?u?.replaceState({page:a},g):u?.pushState({page:a},g),i.onNavigate(new URL(g,window.location.origin).pathname),f(a),a)},t=>{if(o===l){let t=e;s?u?.replaceUrl(t):u?.pushUrl(t),i.onNavigate(new URL(t,window.location.origin).pathname)}throw t}),isFirstPage:c}),c=!1}n.onAction(e.FLOW,async e=>{let t=e,a=t.url;if(r.debug(`FlowAction → ${a}`),t.presentationContext===`modal`){let e=await n.routeUrl(a);if(e){let t=await n.dispatch(e.intent);i.onModal(t)}return}if(s){await s(a);return}await d(a,0,++l)}),u?.onPopState(async(e,t)=>{if(r.debug(`popstate → ${e}, cached=${!!t}`),i.onNavigate(new URL(e).pathname),t){let{page:e}=t;f(e),a({page:e,isFirstPage:c});return}let o=new URL(e),s=await n.routeUrl(o.pathname+o.search);if(!s){r.error(`received popstate without data, but URL was unroutable:`,e),f(null),a({page:Promise.reject(Error(`404`)),isFirstPage:c});return}let u=Q({url:o.pathname+o.search,intent:s.intent,container:n.container}),p=await n.runBeforeLoad(u,s.beforeGuards);if(p.kind===`redirect`){r.debug(`popstate beforeLoad → redirect to ${p.url}`);let e=++l;await d(p.url,0,e);return}if(p.kind===`deny`||p.kind===`rewrite`){if(p.kind===`deny`)r.warn(`popstate beforeLoad → denied`);else{let e=++l;await d(p.url,0,e)}return}let m=n.dispatch(s.intent);await Promise.race([m,new Promise(e=>setTimeout(e,500))]).catch(()=>{}),a({page:m.then(async e=>{let t={...u,page:e},a=await n.runAfterLoad(t,s.afterGuards);if(a.kind===`redirect`){r.debug(`popstate afterLoad → redirect to ${a.url}`);let t=++l;return d(a.url,0,t),e}if(a.kind===`rewrite`){r.debug(`popstate afterLoad → rewrite URL to ${a.url}`);let t=window.history.state?.id;return window.history.replaceState({id:t},``,a.url),i.onNavigate(new URL(a.url,window.location.origin).pathname),f(e),e}return a.kind===`deny`?(r.warn(`popstate afterLoad → denied (${a.status})`),e):(f(e),e)}),isFirstPage:c})});function f(e){(async()=>{try{e&&n.didEnterPage(e)}catch(e){r.error(`didEnterPage error:`,e)}})()}}function hr(e){let{framework:t,log:n,callbacks:r,updateApp:i}=e;mr({framework:t,log:n,callbacks:r,updateApp:i,getScrollablePageElement:e.getScrollablePageElement,manageHistory:e.manageHistory,onForward:e.onForward}),lr({framework:t,log:n})}function gr(e,t){let n={};return e!==void 0&&(n.getSnapshot=(...t)=>e.getSnapshot(...t),n.subscribe=(...t)=>e.subscribe(...t),n.push=(...t)=>e.push(...t),n.pop=(...t)=>e.pop(...t),n.popToRoot=(...t)=>e.popToRoot(...t),n.replaceTop=(...t)=>e.replaceTop(...t),n.selectTab=(...t)=>e.selectTab(...t),n.selectColumn=(...t)=>e.selectColumn(...t)),t!==void 0&&(n.save=(...e)=>t.save(...e),n.clear=(...e)=>t.clear(...e),Object.defineProperty(n,"scope",{get:()=>t.scope,enumerable:!0,configurable:!0})),n}function _r(e){let t=[];e.hasAttribute(`data-restore-root`)&&t.push(e);for(let n of e.querySelectorAll(`[data-restore-root]`))t.push(n);return t}function vr(e){return e.getAttribute(`data-restore-key`)||e.name||void 0}function yr(e){return e.getAttribute(`data-fs-key`)??void 0}function br(e){let{scope:t}=e,n=e.schedule??(e=>{typeof requestAnimationFrame==`function`?requestAnimationFrame(e):e()});function r(e){let t={},n={},r={};for(let i of _r(e)){for(let e of i.querySelectorAll(`input, textarea, select`)){if(e.type===`password`||e.hasAttribute(`data-restore-ignore`))continue;let n=vr(e);if(!n)continue;let r=e.type;t[n]=r===`checkbox`||r===`radio`?e.checked:e.value}for(let e of i.querySelectorAll(`details`)){let t=e.getAttribute(`data-restore-key`);t&&(n[t]=e.open)}for(let e of i.querySelectorAll(`[data-restore-scroll]`)){let t=e.getAttribute(`data-restore-key`)??e.getAttribute(`data-restore-scroll`);t&&(r[t]={top:e.scrollTop,left:e.scrollLeft})}}return{fields:t,details:n,scroll:r}}function i(e){let n=yr(e);if(!n)return;let i=t.get(n)??{};t.set(n,{...i,__dom:r(e)})}function a(e,t){for(let n of _r(e)){for(let[e,r]of Object.entries(t.fields??{})){let t=n.querySelector(`[data-restore-key="${e}"], [name="${e}"]`);t&&(typeof r==`boolean`?t.checked=r:t.value=r,t.dispatchEvent(new Event(`input`,{bubbles:!0})),t.dispatchEvent(new Event(`change`,{bubbles:!0})))}for(let[e,r]of Object.entries(t.details??{})){let t=n.querySelector(`details[data-restore-key="${e}"]`);t&&(t.open=r)}for(let[e,r]of Object.entries(t.scroll??{})){let t=n.querySelector(`[data-restore-scroll="${e}"], [data-restore-key="${e}"]`);t&&(t.scrollTop=r.top,t.scrollLeft=r.left)}}}function o(e){let r=yr(e);if(!r)return;let i=t.get(r)?.__dom;i&&n(()=>a(e,i))}let s;function c(e){return e?.closest(`[data-fs-entry]`)??void 0}let l=e=>{let t=c(e.target);t&&o(t)},u=e=>{let t=c(e.target);t&&i(t)},d=e=>{let t=c(e.target);t&&i(t)},f=()=>{if(s)for(let e of s.querySelectorAll(`[data-fs-entry]`))i(e)},p=()=>{document.visibilityState===`hidden`&&f()};function m(e){s=e,e.addEventListener(`fs:enter`,l),e.addEventListener(`fs:conceal`,u),e.addEventListener(`input`,d,!0),e.addEventListener(`change`,d,!0),window.addEventListener(`pagehide`,f),document.addEventListener(`visibilitychange`,p);for(let t of e.querySelectorAll(`[data-fs-entry]`))o(t)}function h(){s&&=(s.removeEventListener(`fs:enter`,l),s.removeEventListener(`fs:conceal`,u),s.removeEventListener(`input`,d,!0),s.removeEventListener(`change`,d,!0),window.removeEventListener(`pagehide`,f),document.removeEventListener(`visibilitychange`,p),void 0)}return{captureEntry:i,restoreEntry:o,attach:m,dispose:h}}function xr(e,t){e.dispatchEvent(new CustomEvent(t,{bubbles:!0}))}function Sr(e){let{outlet:t,mountEntry:n}=e,r=new Map,i=!1;function a(){let e=new Map;for(let n of t.querySelectorAll(`[data-fs-entry]`)){let t=n.getAttribute(`data-fs-key`);t!==null&&e.set(t,n)}return e}let o=e.schedule??(e=>{typeof requestAnimationFrame==`function`?requestAnimationFrame(e):e()});function s(e){let t=[e];for(let n of e.querySelectorAll(`[data-fs-scroll]`))t.push(n);return t}function c(e){e.scroll=s(e.container).map(e=>({top:e.scrollTop,left:e.scrollLeft}))}function l(e){let t=e.scroll;t!==void 0&&o(()=>{let n=s(e.container);t.forEach((e,t)=>{let r=n[t];r!==void 0&&(r.scrollTop=e.top,r.scrollLeft=e.left)})})}function u(e){e.attached&&=(c(e),xr(e.container,`fs:conceal`),e.container.remove(),!1)}function d(e,t){xr(t.container,`fs:exit`),t.attached&&=(t.container.remove(),!1),t.handle.unmount(),r.delete(e)}function f(e){let o=i?null:a(),s=new Set(B(e.tree).map(e=>X(e.intent,e.params)));for(let[e,t]of r)s.has(e)||d(e,t);let c=[];for(let t of e.destinations){let e=X(t.intent,t.params);c.push(e);let i=r.get(e);if(i!==void 0&&i.page!==t.page&&d(e,i),!r.has(e)){let i=o?.get(e),a=i??document.createElement(`div`);if(i===void 0)for(let[n,r]of Object.entries(Tt(t.intent,e)))a.setAttribute(n,r);else o?.delete(e);let s=n({intent:t.intent,params:t.params,entryKey:e,page:t.page,hydrate:i!==void 0},a);r.set(e,{container:a,handle:s,attached:i!==void 0,entered:!1,page:t.page})}}if(o)for(let e of o.values())e.remove();let f=new Set(c);for(let[e,t]of r)f.has(e)||u(t);for(let e of c){let n=r.get(e);if(n===void 0)continue;let i=n.attached;t.appendChild(n.container),n.attached=!0,n.entered||(n.entered=!0,xr(n.container,`fs:enter`)),i||(xr(n.container,`fs:reveal`),l(n))}i=!0}function p(){for(let[e,t]of r)d(e,t)}return{sync:f,dispose:p}}function Cr(){return document.getElementById(`scrollable-page-override`)||document.getElementById(`scrollable-page`)||document.documentElement}function wr(e){let{controller:t,codec:n,router:r,log:i}=e,a=new pr(i,{getScrollablePageElement:e.getScrollablePageElement??Cr,persistInHistoryState:!0}),o=!1,s=!0;t.subscribe(e=>{if(o)return;let t=n.encode(e.tree,r),c={tree:G(e.tree)},l=typeof window<`u`?window.location.pathname+window.location.search:t,u=s||t===l;a.beforeTransition(),u?a.replaceState(c,t):a.pushState(c,t),s=!1,i.debug(`[navigation] snapshot → ${u?`replace`:`push`} ${t}`)}),a.onPopState(async(e,n)=>{i.debug(`[navigation] popstate → ${e}, cached=${!!n}`);let r=c(e,n);if(r===void 0){i.warn(`[navigation] popstate: cannot restore tree for ${e}, keeping current`);return}o=!0;try{await t.hydrate(r)}finally{o=!1}});function c(e,t){if(t!==void 0)try{return K(t.tree)}catch(e){i.warn(`[navigation] cached tree deserialize failed, falling back to codec`,e)}try{return n.decode(e,r)}catch(e){i.error(`[navigation] codec.decode failed:`,e);return}}return{getSnapshot(){return t.getSnapshot()},push(e,n,r){return t.push(e,n,r)},pop(e){return t.pop(e)},popToRoot(){return t.popToRoot()},replaceTop(e,n){return t.replaceTop(e,n)},selectTab(e,n){return t.selectTab(e,n)},selectColumn(e,n,r,i){return t.selectColumn(e,n,r,i)},hydrate(e){return t.hydrate(e)},subscribe(e){return t.subscribe(e)}}}async function Tr(e){let{framework:t,initialUrl:n,mountEntry:r,target:a,log:o,getScrollablePageElement:s}=e,c=await t.routeUrl(n);c===null&&o.warn(`[flat-islands] initialUrl "${n}" matched no route; mounting a fallback. Check defineRoutes / base path.`);let l=yt(c===null?[F(`__not_found__`,{})]:[F(c.intent.id,c.intent.params??{})]),u=bn(),d=Sn({intentDispatcher:t.intentDispatcher,router:t.router,initial:l,createContext:({intent:e,params:n})=>{let r=u.encode({kind:`leaf`,intent:e,params:n},t.router);return{container:t.container,navigation:Q({url:r,intent:{id:e,params:n},container:t.container}),url:r}},prefetched:t.prefetchedIntents,onRedirect:({url:e})=>{t.perform(i(e))}}),f=wr({controller:d,codec:u,router:t.router,log:o,getScrollablePageElement:s}),p=a.querySelector(`[data-fs-outlet]`);if(!p)throw Error(`[startBrowserApp] mountEntry 已提供(flat-islands),但 mount 渲染的 DOM 里找不到 [data-fs-outlet]。请在 mount 回调里放一个稳定、空的 <main data-fs-outlet></main>。`);let m=p,h=Sr({outlet:m,mountEntry:r});h.sync(d.getSnapshot()),d.subscribe(e=>h.sync(e)),await d.resolve();async function g(e){let n=await t.routeUrl(e);if(!n){o.warn(`[flat-islands] pushUrl: no route for ${e}`);return}await d.push(n.intent.id,n.intent.params??{})}return{handle:f,controller:d,outlet:m,pushUrl:g}}function Er(){let e=document.getElementById(`serialized-server-data`);if(e?.textContent){e.parentNode?.removeChild(e);try{return JSON.parse(e.textContent)}catch{return}}}function Dr(){let e=Er();return!e||!Array.isArray(e)?ot.empty():ot.fromArray(e)}const Or=500;function kr(e){let t=[e.indexOf(`?`),e.indexOf(`#`)].filter(e=>e>=0);return t.length>0?e.slice(0,Math.min(...t)):e}function Ar(e,t){let n=e.navigation;if(n===void 0)return!0;let r=kr(t)===`/`;return e.url===void 0?Pn(n)&&t===n.url||r:t===e.url||r}function jr(e){let{store:t,adapter:n,subscribeNavigation:r}=e,i=e.debounceMs??500,a=e.shouldRestore??Ar,o;function s(){o!==void 0&&(clearTimeout(o),o=void 0)}function c(){s(),t.save()}function l(){t.scope.prune(n.presentKeys()),s(),o=setTimeout(()=>{o=void 0,t.save()},i)}function u(){document.visibilityState===`hidden`&&c()}let d=r?.(l);return window.addEventListener(`pagehide`,c),document.addEventListener(`visibilitychange`,u),{get scope(){return t.scope},restore(e){let n=t.load();if(n!==void 0&&a(n,e))return t.restore(n)},save(){t.save()},clear(){t.clear()},dispose(){s(),d?.(),window.removeEventListener(`pagehide`,c),document.removeEventListener(`visibilitychange`,u)}}}const Mr={get(){},set(){},delete(){}};function Nr(e){try{return(e===`session`?window.sessionStorage:window.localStorage)??void 0}catch{return}}function Pr(e){let t=Nr(e);return t===void 0?Mr:{get(e){return t.getItem(e)??void 0},set(e,n){try{t.setItem(e,n)}catch{}},delete(e){t.removeItem(e)}}}async function Fr(e){let{bootstrap:t,mountId:n=`app`,mount:r,callbacks:i,onBeforeStart:a,onAfterStart:o,frameworkConfig:s={},loadMessages:c}=e,l=Dr(),u=window.location.pathname+window.location.search,d=Br(s.locale),f=await le({locale:d,loadMessages:c,context:d?{runtime:`browser`,fetch:Vr(s.fetch),url:u}:void 0}),p=st.create({...s,locale:d,_resolvedMessages:f,prefetchedIntents:l});t(p);let m=p.container.resolve(D.LOGGER_FACTORY).loggerFor(`browser`),h=p.getLocale();h&&(ae(h),m.debug(`[startBrowserApp] Applied locale attributes:`,h)),await a?.(p);let g=await p.routeUrl(u),_=document.getElementById(n);if(!_)throw Error(`[startBrowserApp] Mount target not found: #${n}. Ensure your HTML has <div id="${n}"></div>.`);let v;e.navigation&&(v=await Ir({framework:p,navigation:e.navigation,log:m,getScrollablePageElement:e.getScrollablePageElement}));let y=e.session&&!e.navigation&&!e.mountEntry?Rr():void 0,b;e.session&&(b=zr({framework:p,session:e.session,navController:v?.controller,flatNavigation:y}));let x=v!==void 0||b!==void 0?gr(v?.handle,b):void 0,S=r(_,{framework:p,navigation:v?.handle,session:b,app:x}),C;hr({framework:p,log:m,callbacks:y?y.wrap(i):i,updateApp:S,getScrollablePageElement:e.getScrollablePageElement,manageHistory:!(e.navigation||e.mountEntry),onForward:e.mountEntry&&!e.navigation?e=>C?.(e):void 0});let w;e.mountEntry&&!e.navigation&&(w=await Tr({framework:p,initialUrl:u,mountEntry:e.mountEntry,target:_,log:m,getScrollablePageElement:e.getScrollablePageElement}),C=w.pushUrl);let T;if(v!==void 0){let{outlet:e}=await Lr({core:v,target:_});T=e}else w===void 0&&(g?await p.perform(g.action):S({page:Promise.reject(Error(`404`)),isFirstPage:!0}));T??=w?.outlet,b!==void 0&&await b.restore(u),e.domRestore&&T&&b!==void 0&&br({scope:b.scope}).attach(T),await o?.(p)}async function Ir(e){let{framework:t,navigation:n,log:r,getScrollablePageElement:a}=e,o=n.codec??hn(),s=Sn({intentDispatcher:t.intentDispatcher,router:t.router,initial:n.initial,createContext:({intent:e,params:n})=>{let r=o.encode({kind:`leaf`,intent:e,params:n},t.router);return{container:t.container,navigation:Q({url:r,intent:{id:e,params:n},container:t.container}),url:r}},beforeLoad:n.beforeLoad,afterLoad:n.afterLoad,prefetched:t.prefetchedIntents,getErrorPage:n.getErrorPage,onRedirect:({url:e})=>{t.perform(i(e))}});return{handle:wr({controller:s,codec:o,router:t.router,log:r,getScrollablePageElement:a}),controller:s,mountEntry:n.mountEntry}}async function Lr(e){let{core:t,target:n}=e;if(await t.controller.resolve(),t.mountEntry===void 0)return{};let r=n.querySelector(`[data-fs-outlet]`);if(!r)throw Error(`[startBrowserApp] navigation.mountEntry 已提供,但 mount 渲染的 DOM 里找不到 [data-fs-outlet]。请在 chrome 里放一个稳定、空的 <main data-fs-outlet></main>。`);let i=Sr({outlet:r,mountEntry:t.mountEntry});return i.sync(t.controller.getSnapshot()),t.controller.subscribe(e=>i.sync(e)),{outlet:r}}function Rr(){let e=new Set;return{wrap(t){return{...t,onNavigate(n){t.onNavigate(n);for(let t of e)t()}}},subscribe(t){return e.add(t),()=>{e.delete(t)}}}}function zr(e){let{framework:t,session:n,navController:r,flatNavigation:a}=e,o=()=>window.location.pathname+window.location.search,s=r?Hn(r,o):Un({currentUrl:o,navigate:e=>t.perform(i(e))}),c=r?e=>r.subscribe(()=>e()):a?e=>a.subscribe(e):void 0,l=Vn({storage:n.storage??Pr(`session`),navigation:s,version:n.version,maxAgeMs:n.maxAgeMs});for(let e of n.providers??[])l.register(e);return jr({store:l,adapter:s,subscribeNavigation:c,debounceMs:n.debounceMs,shouldRestore:n.shouldRestore})}function Br(e){return e||document.documentElement.lang.trim()||void 0}function Vr(e){return(e??globalThis.fetch?.bind(globalThis))||(()=>{throw Error(`[startBrowserApp] loadMessages requires a fetch implementation.`)})}function Hr(e){let t=e.querySelector(`[data-fs-chrome]`);if(t!==null){let n=e.querySelector(`[data-fs-outlet]`);if(n===null)throw Error(`[resolveIslandsShell] 找到 [data-fs-chrome] 但缺 [data-fs-outlet];SSR shell 应同时含两者。`);return{chromeRoot:t,outlet:n,hydrate:t.firstChild!==null}}let n=document.createElement(`div`);n.setAttribute(`data-fs-chrome`,``);let r=document.createElement(`main`);return r.setAttribute(`data-fs-outlet`,``),e.append(n,r),{chromeRoot:n,outlet:r,hydrate:!1}}export{On as $,tt as $t,Zn as A,ue as An,F as At,Vn as B,g as Bn,ht as Bt,tr as C,ge as Cn,Bt as Ct,er as D,de as Dn,wt as Dt,Q as E,fe as En,I as Et,Kn as F,oe as Fn,P as Ft,In as G,o as Gn,ut as Gt,Bn as H,u as Hn,ct as Ht,Gn as I,ae as In,N as It,Fn as J,n as Jn,ot as Jt,Mn as K,e as Kn,lt as Kt,Wn as L,x as Ln,vt as Lt,Xn as M,ne as Mn,yt as Mt,Jn as N,te as Nn,bt as Nt,Z as O,pe as On,St as Ot,qn as P,ie as Pn,M as Pt,kn as Q,et as Qt,Hn as R,_ as Rn,gt as Rt,ir as S,_e as Sn,Rt as St,rr as T,me as Tn,Tt,X as U,c as Un,j as Ut,zn as V,l as Vn,mt as Vt,Ln as W,s as Wn,dt as Wt,An as X,a as Xn,rt as Xt,Pn as Y,t as Yn,A as Yt,jn as Z,i as Zn,nt as Zt,lr as _,De as _n,Ft as _t,jr as a,$e as an,gn as at,or as b,Se as bn,Dt as bt,Er as c,Ve as cn,K as ct,br as d,Re as dn,B as dt,Xe as en,J as et,gr as f,D as fn,At as ft,fr as g,Ee as gn,It as gt,pr as h,Oe as hn,Pt as ht,Or as i,We as in,bn as it,Yn as j,re as jn,xt as jt,Qn as k,le as kn,Ct as kt,wr as l,ze as ln,G as lt,mr as m,ke as mn,R as mt,Fr as n,qe as nn,Xt as nt,Ar as o,Ue as on,on as ot,hr as p,Ie as pn,kt as pt,Nn as q,r as qn,st as qt,Pr as r,Ze as rn,hn as rt,Dr as s,O as sn,an as st,Hr as t,Ke as tn,Sn as tt,Sr as u,Be as un,Ut as ut,cr as v,Ce as vn,Nt as vt,nr as w,he as wn,jt as wt,ar as x,E as xn,zt as xt,sr as y,we as yn,Lt as yt,Un as z,v as zn,_t as zt};
2
- //# sourceMappingURL=browser-BHhVWXik.mjs.map