@finesoft/front 0.5.0 → 0.5.1
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.
|
@@ -0,0 +1,2 @@
|
|
|
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
|
|
@@ -2808,4 +2808,4 @@ declare function deserializeServerData(): PrefetchedIntent[] | undefined;
|
|
|
2808
2808
|
declare function createPrefetchedIntentsFromDom(): PrefetchedIntents;
|
|
2809
2809
|
//#endregion
|
|
2810
2810
|
export { IntersectionImpressionObserver as $, markPublic as $i, TabsInit as $n, shouldLog as $r, defineNavigation as $t, ActionHandlerDependencies as A, IntentDispatcher as Aa, StandardIssue as Ai, SerializedSplitColumn as An, HostCheckResult as Ar, NavigationScopedState as At, getTextDirection as B, FlowAction as Ba, NextResult as Bi, pop as Bn, BaseItem as Br, SessionUrlLocation as Bt, SessionBridgeOptions as C, ReportingLoggerFactory as Ca, StripOptional as Ci, createFlatStackCodec as Cn, TabsNode as Cr, createUrlSessionAdapter as Ct, NavigationBridgeDependencies as D, LoggerFactory as Da, list as Di, SerializedLeaf as Dn, pipe as Dr, sessionEntryKey as Dt, defaultShouldRestore as E, Logger as Ea, isMultiValueSchema as Ei, encodeNavigationTreeParam as En, mapEach as Er, createNavigationScopedState as Et, ExternalUrlDependencies as F, ActionHandler as Fa, AfterLoadGuard as Fi, serializeNavigationStable as Fn, HttpClientConfig as Fr, SessionNavigationAdapter as Ft, PluralCategory as G, makeFlowAction as Ga, next as Gi, resolveActivePath as Gn, FrameworkConfig as Gr, defineRoute as Gt, makeLocaleInfo as H, isExternalUrlAction as Ha, RedirectResult as Hi, popToRoot as Hn, SafeErrorPageOptions as Hr, DefineRoutesOptions as Ht, registerExternalUrlHandler as I, ACTION_KINDS as Ia, BeforeLoadGuard as Ii, collectAllLeaves as In, HttpError as Ir, SessionSnapshot as It, interpolate as J, BASE_PAGE_FIELDS as Ji, setVisibility as Jn, LocaleAttributes as Jr, DefineNavigationOptions as Jt, PluralRuleProvider as K, redirect as Ki, selectColumn as Kn, PrefetchedIntent as Kr, defineRoutes as Kt, SimpleTranslator as L, Action as La, DenyResult as Li, collectVisibleDestinations as Ln, RequestInterceptor as Lr, SessionStateProvider as Lt, FlowActionCallbacks as M, IntentController as Ma, StandardSchemaV1 as Mi, SerializedTabs as Mn, classifyUrl as Mr, SESSION_DEFAULT_VERSION as Mt, FlowActionDependencies as N, Container as Na, makeSchema as Ni, deserializeNavigation as Nn, HostGuardError as Nr, SessionError as Nt, NavigationHandle as O, SecureFetchOptions as Oa, InferOutput as Oi, SerializedNavigation as On, pipeAsync as Or, decodeSnapshot as Ot, registerFlowActionHandler as P, ActionDispatcher as Pa, runStandard as Pi, serializeNavigation as Pn, HttpClient as Pr, SessionErrorContext as Pt, ImpressionObserverOptions as Q, isPublicMarked as Qi, SplitColumnInit as Qn, resetFilterCache as Qr, NavigationSSRDefinition as Qt, SimpleTranslatorOptions as R, CompoundAction as Ra, MiddlewareResult as Ri, findNearestStack as Rn, ResponseInterceptor as Rr, SessionStore as Rt, SESSION_DEFAULT_DEBOUNCE_MS as S, ReportingLogger as Sa, QuerySchemaMap as Si, createActiveLeafCodec as Sn, StackNode as Sr, createNavigationSessionAdapter as St, createSessionBridge as T, BaseLogger as Ta, MultiValueSchema as Ti, decodeNavigationTreeParam as Tn, Mapper as Tr, collectLeafKeys as Tt, resolveLocaleFromUrl as U, isFlowAction as Ua, RewriteResult as Ui, push as Un, safeErrorPage as Ur, RenderMode as Ut, isRtl as V, isCompoundAction as Va, PostLoadContext as Vi, popTo as Vn, BaseShelf as Vr, isUrlLocation as Vt, setHtmlLocaleAttributes as W, makeExternalUrlAction as Wa, deny as Wi, replaceTop as Wn, Framework as Wr, RouteDefinition as Wt, WithFieldsRecorder as X, FINESOFT_PUBLIC as Xi, ResolvedEntry as Xn, TextDirection as Xr, NavigationDefinition as Xt, resolvePluralKey as Y, BasePage as Yi, visibleSplitColumns as Yn, LocaleInfo as Yr, NavigationBrowserConfig as Yt, VoidEventRecorder as Z, getPublicFields as Zi, islandContainerAttributes as Zn, Translator as Zr, NavigationInitial as Zt, IslandOrchestratorOptions as _, EventRecorder as _a, Router as _i, createNavigationController as _n, ResolvedDestination as _r, Optional as _t, DomRestore as a, MakeDependenciesOptions as aa, withDefault as ai, NavigationDispatchContext as an, split as ar, ServerContextOptions as at, AppHandle as b, MetricsFieldsProvider as ba, InferQuery as bi, NavigationCodec as bn, SplitNode as br, LruMap as bt, createWebStorage as c, Storage as ca, bool as ci, PopOperation as cn, LeafNode as cr, generateUuid as ct, BrowserAppConfig as d, MessagesLoaderContext as da, oneOf as di, PushOperation as dn, NavigationNode as dr, removeHost as dt, RequestScopedKey as ea, ConsoleLogger as ei, HydrateOperation as en, isLeafNode as er, ConsoleEventRecorder as et, BrowserNavigationConfig as f, TranslationMessages as fa, str as fi, PushOptions as fn, NavigationNodeKind as fr, removeQueryParams as ft, IslandOrchestrator as g, detectPlatform as ga, RouteMatch as gi, SetVisibilityOperation as gn, Page as gr, None as gt, IslandHandle as h, PlatformInfo as ha, RouteAddOptions as hi, SelectTabOperation as hn, NavigationSnapshot as hr, getPWADisplayMode as ht, History as i, FeatureFlagsProvider as ia, optional as ii, NavigationControllerOptions as in, leaf as ir, BrowserContextOptions as it, registerActionHandlers as j, Intent as ja, StandardResult as ji, SerializedStack as jn, classifyHost as jr, SESSION_DEFAULT_KEY as jt, createNavigationBridge as k, secureFetch as ka, ParamSchema as ki, SerializedSplit as kn, BaseController as kr, encodeSnapshot as kt, IslandsShell as l, makeDependencies as la, int as li, PopToOperation as ln, NAVIGATION_NODE_KINDS as lr, buildUrl as lt, startBrowserApp as m, resolveMessages as ma, RouteParams as mi, SelectColumnOperation as mn, NavigationPathStep as mr, PWADisplayMode as mt, deserializeServerData as n, DEP_KEYS as na, CompositeLogger as ni, NavigationContextInput as nn, isStackNode as nr, runAfterLoadGuards as nt, DomRestoreOptions as o, MetricsRecorder as oa, NumOptions as oi, NavigationOpKind as on, stack as or, createBrowserContext as ot, BrowserSessionConfig as p, resolveConfiguredMessages as pa, uuid as pi, ReplaceTopOperation as pn, NavigationPath as pr, removeScheme as pt, englishPlural as q, rewrite as qi, selectTab as qn, PrefetchedIntents as qr, route as qt, tryScroll as r, FeatureFlags as ra, CompositeLoggerFactory as ri, NavigationController as rn, isTabsNode as rr, runBeforeLoadGuards as rt, createDomRestore as s, Net as sa, StrOptions as si, NavigationOperation as sn, tabs as sr, createServerContext as st, createPrefetchedIntentsFromDom as t, defineRequestScopedKey as ta, ConsoleLoggerFactory as ti, NAVIGATION_OP_KINDS as tn, isSplitNode as tr, CompositeEventRecorder as tt, resolveIslandsShell as u, MessagesLoader as ua, num as ui, PopToRootOperation as un, NavigationError as ur, getBaseUrl as ut, MountEntry as v, ImpressionEntry as va, ExtractParamNames as vi, DEFAULT_NAV_PARAM as vn, SPLIT_VISIBILITIES as vr, isNone as vt, SessionHandle as w, ReportingLoggerOptions as wa, ListOptions as wi, createFullStateCodec as wn, AsyncMapper as wr, createSessionStore as wt, createAppHandle as x, ReportCallback as xa, ParamsFor as xi, NavigationRouterLike as xn, SplitVisibility as xr, UrlAdapterOptions as xt, createIslandOrchestrator as y, ImpressionObserver as ya, InferParams as yi, FullStateCodecOptions as yn, SplitColumn as yr, isSome as yt, getLocaleAttributes as z, ExternalUrlAction as za, NavigationContext as zi, findNode as zn, stableStringify as zr, SessionStoreOptions as zt };
|
|
2811
|
-
//# sourceMappingURL=browser-
|
|
2811
|
+
//# sourceMappingURL=browser-BV2BBXm7.d.mts.map
|
package/dist/browser.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { $ as IntersectionImpressionObserver, $i as markPublic, $n as TabsInit, $r as shouldLog, $t as defineNavigation, A as ActionHandlerDependencies, Aa as IntentDispatcher, Ai as StandardIssue, An as SerializedSplitColumn, Ar as HostCheckResult, At as NavigationScopedState, B as getTextDirection, Ba as FlowAction, Bi as NextResult, Bn as pop, Br as BaseItem, Bt as SessionUrlLocation, C as SessionBridgeOptions, Ca as ReportingLoggerFactory, Ci as StripOptional, Cn as createFlatStackCodec, Cr as TabsNode, Ct as createUrlSessionAdapter, D as NavigationBridgeDependencies, Da as LoggerFactory, Di as list, Dn as SerializedLeaf, Dr as pipe, Dt as sessionEntryKey, E as defaultShouldRestore, Ea as Logger, Ei as isMultiValueSchema, En as encodeNavigationTreeParam, Er as mapEach, Et as createNavigationScopedState, F as ExternalUrlDependencies, Fa as ActionHandler, Fi as AfterLoadGuard, Fn as serializeNavigationStable, Fr as HttpClientConfig, Ft as SessionNavigationAdapter, G as PluralCategory, Ga as makeFlowAction, Gi as next, Gn as resolveActivePath, Gr as FrameworkConfig, Gt as defineRoute, H as makeLocaleInfo, Ha as isExternalUrlAction, Hi as RedirectResult, Hn as popToRoot, Hr as SafeErrorPageOptions, Ht as DefineRoutesOptions, I as registerExternalUrlHandler, Ia as ACTION_KINDS, Ii as BeforeLoadGuard, In as collectAllLeaves, Ir as HttpError, It as SessionSnapshot, J as interpolate, Ji as BASE_PAGE_FIELDS, Jn as setVisibility, Jr as LocaleAttributes, Jt as DefineNavigationOptions, K as PluralRuleProvider, Ki as redirect, Kn as selectColumn, Kr as PrefetchedIntent, Kt as defineRoutes, L as SimpleTranslator, La as Action, Li as DenyResult, Ln as collectVisibleDestinations, Lr as RequestInterceptor, Lt as SessionStateProvider, M as FlowActionCallbacks, Ma as IntentController, Mi as StandardSchemaV1, Mn as SerializedTabs, Mr as classifyUrl, Mt as SESSION_DEFAULT_VERSION, N as FlowActionDependencies, Na as Container, Ni as makeSchema, Nn as deserializeNavigation, Nr as HostGuardError, Nt as SessionError, O as NavigationHandle, Oa as SecureFetchOptions, Oi as InferOutput, On as SerializedNavigation, Or as pipeAsync, Ot as decodeSnapshot, P as registerFlowActionHandler, Pa as ActionDispatcher, Pi as runStandard, Pn as serializeNavigation, Pr as HttpClient, Pt as SessionErrorContext, Q as ImpressionObserverOptions, Qi as isPublicMarked, Qn as SplitColumnInit, Qr as resetFilterCache, Qt as NavigationSSRDefinition, R as SimpleTranslatorOptions, Ra as CompoundAction, Ri as MiddlewareResult, Rn as findNearestStack, Rr as ResponseInterceptor, Rt as SessionStore, S as SESSION_DEFAULT_DEBOUNCE_MS, Sa as ReportingLogger, Si as QuerySchemaMap, Sn as createActiveLeafCodec, Sr as StackNode, St as createNavigationSessionAdapter, T as createSessionBridge, Ta as BaseLogger, Ti as MultiValueSchema, Tn as decodeNavigationTreeParam, Tr as Mapper, Tt as collectLeafKeys, U as resolveLocaleFromUrl, Ua as isFlowAction, Ui as RewriteResult, Un as push, Ur as safeErrorPage, Ut as RenderMode, V as isRtl, Va as isCompoundAction, Vi as PostLoadContext, Vn as popTo, Vr as BaseShelf, Vt as isUrlLocation, W as setHtmlLocaleAttributes, Wa as makeExternalUrlAction, Wi as deny, Wn as replaceTop, Wr as Framework, Wt as RouteDefinition, X as WithFieldsRecorder, Xi as FINESOFT_PUBLIC, Xn as ResolvedEntry, Xr as TextDirection, Xt as NavigationDefinition, Y as resolvePluralKey, Yi as BasePage, Yn as visibleSplitColumns, Yr as LocaleInfo, Yt as NavigationBrowserConfig, Z as VoidEventRecorder, Zi as getPublicFields, Zn as islandContainerAttributes, Zr as Translator, Zt as NavigationInitial, _ as IslandOrchestratorOptions, _a as EventRecorder, _i as Router, _n as createNavigationController, _r as ResolvedDestination, _t as Optional, a as DomRestore, aa as MakeDependenciesOptions, ai as withDefault, an as NavigationDispatchContext, ar as split, at as ServerContextOptions, b as AppHandle, ba as MetricsFieldsProvider, bi as InferQuery, bn as NavigationCodec, br as SplitNode, bt as LruMap, c as createWebStorage, ca as Storage, ci as bool, cn as PopOperation, cr as LeafNode, ct as generateUuid, d as BrowserAppConfig, da as MessagesLoaderContext, di as oneOf, dn as PushOperation, dr as NavigationNode, dt as removeHost, ea as RequestScopedKey, ei as ConsoleLogger, en as HydrateOperation, er as isLeafNode, et as ConsoleEventRecorder, f as BrowserNavigationConfig, fa as TranslationMessages, fi as str, fn as PushOptions, fr as NavigationNodeKind, ft as removeQueryParams, g as IslandOrchestrator, ga as detectPlatform, gi as RouteMatch, gn as SetVisibilityOperation, gr as Page, gt as None, h as IslandHandle, ha as PlatformInfo, hi as RouteAddOptions, hn as SelectTabOperation, hr as NavigationSnapshot, ht as getPWADisplayMode, i as History, ia as FeatureFlagsProvider, ii as optional, in as NavigationControllerOptions, ir as leaf, it as BrowserContextOptions, j as registerActionHandlers, ja as Intent, ji as StandardResult, jn as SerializedStack, jr as classifyHost, jt as SESSION_DEFAULT_KEY, k as createNavigationBridge, ka as secureFetch, ki as ParamSchema, kn as SerializedSplit, kr as BaseController, kt as encodeSnapshot, l as IslandsShell, la as makeDependencies, li as int, ln as PopToOperation, lr as NAVIGATION_NODE_KINDS, lt as buildUrl, m as startBrowserApp, ma as resolveMessages, mi as RouteParams, mn as SelectColumnOperation, mr as NavigationPathStep, mt as PWADisplayMode, n as deserializeServerData, na as DEP_KEYS, ni as CompositeLogger, nn as NavigationContextInput, nr as isStackNode, nt as runAfterLoadGuards, o as DomRestoreOptions, oa as MetricsRecorder, oi as NumOptions, on as NavigationOpKind, or as stack, ot as createBrowserContext, p as BrowserSessionConfig, pa as resolveConfiguredMessages, pi as uuid, pn as ReplaceTopOperation, pr as NavigationPath, pt as removeScheme, q as englishPlural, qi as rewrite, qn as selectTab, qr as PrefetchedIntents, qt as route, r as tryScroll, ra as FeatureFlags, ri as CompositeLoggerFactory, rn as NavigationController, rr as isTabsNode, rt as runBeforeLoadGuards, s as createDomRestore, sa as Net, si as StrOptions, sn as NavigationOperation, sr as tabs, st as createServerContext, t as createPrefetchedIntentsFromDom, ta as defineRequestScopedKey, ti as ConsoleLoggerFactory, tn as NAVIGATION_OP_KINDS, tr as isSplitNode, tt as CompositeEventRecorder, u as resolveIslandsShell, ua as MessagesLoader, ui as num, un as PopToRootOperation, ur as NavigationError, ut as getBaseUrl, v as MountEntry, va as ImpressionEntry, vi as ExtractParamNames, vn as DEFAULT_NAV_PARAM, vr as SPLIT_VISIBILITIES, vt as isNone, w as SessionHandle, wa as ReportingLoggerOptions, wi as ListOptions, wn as createFullStateCodec, wr as AsyncMapper, wt as createSessionStore, x as createAppHandle, xa as ReportCallback, xi as ParamsFor, xn as NavigationRouterLike, xr as SplitVisibility, xt as UrlAdapterOptions, y as createIslandOrchestrator, ya as ImpressionObserver, yi as InferParams, yn as FullStateCodecOptions, yr as SplitColumn, yt as isSome, z as getLocaleAttributes, za as ExternalUrlAction, zi as NavigationContext, zn as findNode, zr as stableStringify, zt as SessionStoreOptions } from "./browser-
|
|
2
|
-
export { ACTION_KINDS, Action, ActionDispatcher, ActionHandler, ActionHandlerDependencies, AfterLoadGuard, AppHandle, AsyncMapper, BASE_PAGE_FIELDS, BaseController, BaseItem, BaseLogger, BasePage, BaseShelf, BeforeLoadGuard, BrowserAppConfig, BrowserContextOptions, BrowserNavigationConfig, BrowserSessionConfig, CompositeEventRecorder, CompositeLogger, CompositeLoggerFactory, CompoundAction, ConsoleEventRecorder, ConsoleLogger, ConsoleLoggerFactory, Container, DEFAULT_NAV_PARAM, DEP_KEYS, DefineNavigationOptions, DefineRoutesOptions, DenyResult, DomRestore, DomRestoreOptions, EventRecorder, ExternalUrlAction, ExternalUrlDependencies, ExtractParamNames, FINESOFT_PUBLIC, FeatureFlags, FeatureFlagsProvider, FlowAction, FlowActionCallbacks, FlowActionDependencies, Framework, FrameworkConfig, FullStateCodecOptions, History, HostCheckResult, HostGuardError, HttpClient, HttpClientConfig, HttpError, HydrateOperation, ImpressionEntry, ImpressionObserver, ImpressionObserverOptions, InferOutput, InferParams, InferQuery, Intent, IntentController, IntentDispatcher, IntersectionImpressionObserver, IslandHandle, IslandOrchestrator, IslandOrchestratorOptions, IslandsShell, LeafNode, ListOptions, LocaleAttributes, LocaleInfo, Logger, Logger as LoggerInterface, LoggerFactory, LruMap, MakeDependenciesOptions, Mapper, MessagesLoader, MessagesLoaderContext, MetricsFieldsProvider, MetricsRecorder, MiddlewareResult, MountEntry, MultiValueSchema, NAVIGATION_NODE_KINDS, NAVIGATION_OP_KINDS, NavigationBridgeDependencies, NavigationBrowserConfig, NavigationCodec, NavigationContext, NavigationContextInput, NavigationController, NavigationControllerOptions, NavigationDefinition, NavigationDispatchContext, NavigationError, NavigationHandle, NavigationInitial, NavigationNode, NavigationNodeKind, NavigationOpKind, NavigationOperation, NavigationPath, NavigationPathStep, NavigationRouterLike, NavigationSSRDefinition, NavigationScopedState, NavigationSnapshot, Net, NextResult, None, NumOptions, Optional, PWADisplayMode, Page, ParamSchema, ParamsFor, PlatformInfo, PluralCategory, PluralRuleProvider, PopOperation, PopToOperation, PopToRootOperation, PostLoadContext, PrefetchedIntent, PrefetchedIntents, PushOperation, PushOptions, QuerySchemaMap, RedirectResult, RenderMode, ReplaceTopOperation, ReportCallback, ReportingLogger, ReportingLoggerFactory, ReportingLoggerOptions, RequestInterceptor, RequestScopedKey, ResolvedDestination, ResolvedEntry, ResponseInterceptor, RewriteResult, RouteAddOptions, RouteDefinition, RouteMatch, RouteParams, Router, SESSION_DEFAULT_DEBOUNCE_MS, SESSION_DEFAULT_KEY, SESSION_DEFAULT_VERSION, SPLIT_VISIBILITIES, SafeErrorPageOptions, SecureFetchOptions, SelectColumnOperation, SelectTabOperation, SerializedLeaf, SerializedNavigation, SerializedSplit, SerializedSplitColumn, SerializedStack, SerializedTabs, ServerContextOptions, SessionBridgeOptions, SessionError, SessionErrorContext, SessionHandle, SessionNavigationAdapter, SessionSnapshot, SessionStateProvider, SessionStore, SessionStoreOptions, SessionUrlLocation, SetVisibilityOperation, SimpleTranslator, SimpleTranslatorOptions, SplitColumn, SplitColumnInit, SplitNode, SplitVisibility, StackNode, StandardIssue, StandardResult, StandardSchemaV1, Storage, StrOptions, StripOptional, TabsInit, TabsNode, TextDirection, TranslationMessages, Translator, UrlAdapterOptions, VoidEventRecorder, WithFieldsRecorder, bool, buildUrl, classifyHost, classifyUrl, collectAllLeaves, collectLeafKeys, collectVisibleDestinations, createActiveLeafCodec, createAppHandle, createBrowserContext, createDomRestore, createFlatStackCodec, createFullStateCodec, createIslandOrchestrator, createNavigationBridge, createNavigationController, createNavigationScopedState, createNavigationSessionAdapter, createPrefetchedIntentsFromDom, createServerContext, createSessionBridge, createSessionStore, createUrlSessionAdapter, createWebStorage, decodeNavigationTreeParam, decodeSnapshot, defaultShouldRestore, defineNavigation, defineRequestScopedKey, defineRoute, defineRoutes, deny, deserializeNavigation, deserializeServerData, detectPlatform, encodeNavigationTreeParam, encodeSnapshot, englishPlural, findNearestStack, findNode, generateUuid, getBaseUrl, getLocaleAttributes, getPWADisplayMode, getPublicFields, getTextDirection, int, interpolate, isCompoundAction, isExternalUrlAction, isFlowAction, isLeafNode, isMultiValueSchema, isNone, isPublicMarked, isRtl, isSome, isSplitNode, isStackNode, isTabsNode, isUrlLocation, islandContainerAttributes, leaf, list, makeDependencies, makeExternalUrlAction, makeFlowAction, makeLocaleInfo, makeSchema, mapEach, markPublic, next, num, oneOf, optional, pipe, pipeAsync, pop, popTo, popToRoot, push, redirect, registerActionHandlers, registerExternalUrlHandler, registerFlowActionHandler, removeHost, removeQueryParams, removeScheme, replaceTop, resetFilterCache, resolveActivePath, resolveConfiguredMessages, resolveIslandsShell, resolveLocaleFromUrl, resolveMessages, resolvePluralKey, rewrite, route, runAfterLoadGuards, runBeforeLoadGuards, runStandard, safeErrorPage, secureFetch, selectColumn, selectTab, serializeNavigation, serializeNavigationStable, sessionEntryKey, setHtmlLocaleAttributes, setVisibility, shouldLog, split, stableStringify, stack, startBrowserApp, str, tabs, tryScroll, uuid, visibleSplitColumns, withDefault };
|
|
1
|
+
import { $ as IntersectionImpressionObserver, $i as markPublic, $n as TabsInit, $r as shouldLog, $t as defineNavigation, A as ActionHandlerDependencies, Aa as IntentDispatcher, Ai as StandardIssue, An as SerializedSplitColumn, Ar as HostCheckResult, At as NavigationScopedState, B as getTextDirection, Ba as FlowAction, Bi as NextResult, Bn as pop, Br as BaseItem, Bt as SessionUrlLocation, C as SessionBridgeOptions, Ca as ReportingLoggerFactory, Ci as StripOptional, Cn as createFlatStackCodec, Cr as TabsNode, Ct as createUrlSessionAdapter, D as NavigationBridgeDependencies, Da as LoggerFactory, Di as list, Dn as SerializedLeaf, Dr as pipe, Dt as sessionEntryKey, E as defaultShouldRestore, Ea as Logger, Ei as isMultiValueSchema, En as encodeNavigationTreeParam, Er as mapEach, Et as createNavigationScopedState, F as ExternalUrlDependencies, Fa as ActionHandler, Fi as AfterLoadGuard, Fn as serializeNavigationStable, Fr as HttpClientConfig, Ft as SessionNavigationAdapter, G as PluralCategory, Ga as makeFlowAction, Gi as next, Gn as resolveActivePath, Gr as FrameworkConfig, Gt as defineRoute, H as makeLocaleInfo, Ha as isExternalUrlAction, Hi as RedirectResult, Hn as popToRoot, Hr as SafeErrorPageOptions, Ht as DefineRoutesOptions, I as registerExternalUrlHandler, Ia as ACTION_KINDS, Ii as BeforeLoadGuard, In as collectAllLeaves, Ir as HttpError, It as SessionSnapshot, J as interpolate, Ji as BASE_PAGE_FIELDS, Jn as setVisibility, Jr as LocaleAttributes, Jt as DefineNavigationOptions, K as PluralRuleProvider, Ki as redirect, Kn as selectColumn, Kr as PrefetchedIntent, Kt as defineRoutes, L as SimpleTranslator, La as Action, Li as DenyResult, Ln as collectVisibleDestinations, Lr as RequestInterceptor, Lt as SessionStateProvider, M as FlowActionCallbacks, Ma as IntentController, Mi as StandardSchemaV1, Mn as SerializedTabs, Mr as classifyUrl, Mt as SESSION_DEFAULT_VERSION, N as FlowActionDependencies, Na as Container, Ni as makeSchema, Nn as deserializeNavigation, Nr as HostGuardError, Nt as SessionError, O as NavigationHandle, Oa as SecureFetchOptions, Oi as InferOutput, On as SerializedNavigation, Or as pipeAsync, Ot as decodeSnapshot, P as registerFlowActionHandler, Pa as ActionDispatcher, Pi as runStandard, Pn as serializeNavigation, Pr as HttpClient, Pt as SessionErrorContext, Q as ImpressionObserverOptions, Qi as isPublicMarked, Qn as SplitColumnInit, Qr as resetFilterCache, Qt as NavigationSSRDefinition, R as SimpleTranslatorOptions, Ra as CompoundAction, Ri as MiddlewareResult, Rn as findNearestStack, Rr as ResponseInterceptor, Rt as SessionStore, S as SESSION_DEFAULT_DEBOUNCE_MS, Sa as ReportingLogger, Si as QuerySchemaMap, Sn as createActiveLeafCodec, Sr as StackNode, St as createNavigationSessionAdapter, T as createSessionBridge, Ta as BaseLogger, Ti as MultiValueSchema, Tn as decodeNavigationTreeParam, Tr as Mapper, Tt as collectLeafKeys, U as resolveLocaleFromUrl, Ua as isFlowAction, Ui as RewriteResult, Un as push, Ur as safeErrorPage, Ut as RenderMode, V as isRtl, Va as isCompoundAction, Vi as PostLoadContext, Vn as popTo, Vr as BaseShelf, Vt as isUrlLocation, W as setHtmlLocaleAttributes, Wa as makeExternalUrlAction, Wi as deny, Wn as replaceTop, Wr as Framework, Wt as RouteDefinition, X as WithFieldsRecorder, Xi as FINESOFT_PUBLIC, Xn as ResolvedEntry, Xr as TextDirection, Xt as NavigationDefinition, Y as resolvePluralKey, Yi as BasePage, Yn as visibleSplitColumns, Yr as LocaleInfo, Yt as NavigationBrowserConfig, Z as VoidEventRecorder, Zi as getPublicFields, Zn as islandContainerAttributes, Zr as Translator, Zt as NavigationInitial, _ as IslandOrchestratorOptions, _a as EventRecorder, _i as Router, _n as createNavigationController, _r as ResolvedDestination, _t as Optional, a as DomRestore, aa as MakeDependenciesOptions, ai as withDefault, an as NavigationDispatchContext, ar as split, at as ServerContextOptions, b as AppHandle, ba as MetricsFieldsProvider, bi as InferQuery, bn as NavigationCodec, br as SplitNode, bt as LruMap, c as createWebStorage, ca as Storage, ci as bool, cn as PopOperation, cr as LeafNode, ct as generateUuid, d as BrowserAppConfig, da as MessagesLoaderContext, di as oneOf, dn as PushOperation, dr as NavigationNode, dt as removeHost, ea as RequestScopedKey, ei as ConsoleLogger, en as HydrateOperation, er as isLeafNode, et as ConsoleEventRecorder, f as BrowserNavigationConfig, fa as TranslationMessages, fi as str, fn as PushOptions, fr as NavigationNodeKind, ft as removeQueryParams, g as IslandOrchestrator, ga as detectPlatform, gi as RouteMatch, gn as SetVisibilityOperation, gr as Page, gt as None, h as IslandHandle, ha as PlatformInfo, hi as RouteAddOptions, hn as SelectTabOperation, hr as NavigationSnapshot, ht as getPWADisplayMode, i as History, ia as FeatureFlagsProvider, ii as optional, in as NavigationControllerOptions, ir as leaf, it as BrowserContextOptions, j as registerActionHandlers, ja as Intent, ji as StandardResult, jn as SerializedStack, jr as classifyHost, jt as SESSION_DEFAULT_KEY, k as createNavigationBridge, ka as secureFetch, ki as ParamSchema, kn as SerializedSplit, kr as BaseController, kt as encodeSnapshot, l as IslandsShell, la as makeDependencies, li as int, ln as PopToOperation, lr as NAVIGATION_NODE_KINDS, lt as buildUrl, m as startBrowserApp, ma as resolveMessages, mi as RouteParams, mn as SelectColumnOperation, mr as NavigationPathStep, mt as PWADisplayMode, n as deserializeServerData, na as DEP_KEYS, ni as CompositeLogger, nn as NavigationContextInput, nr as isStackNode, nt as runAfterLoadGuards, o as DomRestoreOptions, oa as MetricsRecorder, oi as NumOptions, on as NavigationOpKind, or as stack, ot as createBrowserContext, p as BrowserSessionConfig, pa as resolveConfiguredMessages, pi as uuid, pn as ReplaceTopOperation, pr as NavigationPath, pt as removeScheme, q as englishPlural, qi as rewrite, qn as selectTab, qr as PrefetchedIntents, qt as route, r as tryScroll, ra as FeatureFlags, ri as CompositeLoggerFactory, rn as NavigationController, rr as isTabsNode, rt as runBeforeLoadGuards, s as createDomRestore, sa as Net, si as StrOptions, sn as NavigationOperation, sr as tabs, st as createServerContext, t as createPrefetchedIntentsFromDom, ta as defineRequestScopedKey, ti as ConsoleLoggerFactory, tn as NAVIGATION_OP_KINDS, tr as isSplitNode, tt as CompositeEventRecorder, u as resolveIslandsShell, ua as MessagesLoader, ui as num, un as PopToRootOperation, ur as NavigationError, ut as getBaseUrl, v as MountEntry, va as ImpressionEntry, vi as ExtractParamNames, vn as DEFAULT_NAV_PARAM, vr as SPLIT_VISIBILITIES, vt as isNone, w as SessionHandle, wa as ReportingLoggerOptions, wi as ListOptions, wn as createFullStateCodec, wr as AsyncMapper, wt as createSessionStore, x as createAppHandle, xa as ReportCallback, xi as ParamsFor, xn as NavigationRouterLike, xr as SplitVisibility, xt as UrlAdapterOptions, y as createIslandOrchestrator, ya as ImpressionObserver, yi as InferParams, yn as FullStateCodecOptions, yr as SplitColumn, yt as isSome, z as getLocaleAttributes, za as ExternalUrlAction, zi as NavigationContext, zn as findNode, zr as stableStringify, zt as SessionStoreOptions } from "./browser-BV2BBXm7.mjs";
|
|
2
|
+
export { ACTION_KINDS, type Action, ActionDispatcher, type ActionHandler, type ActionHandlerDependencies, type AfterLoadGuard, type AppHandle, type AsyncMapper, BASE_PAGE_FIELDS, BaseController, type BaseItem, BaseLogger, type BasePage, type BaseShelf, type BeforeLoadGuard, type BrowserAppConfig, type BrowserContextOptions, type BrowserNavigationConfig, type BrowserSessionConfig, CompositeEventRecorder, CompositeLogger, CompositeLoggerFactory, type CompoundAction, ConsoleEventRecorder, ConsoleLogger, ConsoleLoggerFactory, Container, DEFAULT_NAV_PARAM, DEP_KEYS, type DefineNavigationOptions, type DefineRoutesOptions, type DenyResult, type DomRestore, type DomRestoreOptions, type EventRecorder, type ExternalUrlAction, type ExternalUrlDependencies, type ExtractParamNames, FINESOFT_PUBLIC, type FeatureFlags, type FeatureFlagsProvider, type FlowAction, type FlowActionCallbacks, type FlowActionDependencies, Framework, type FrameworkConfig, type FullStateCodecOptions, History, type HostCheckResult, HostGuardError, HttpClient, type HttpClientConfig, HttpError, type HydrateOperation, type ImpressionEntry, type ImpressionObserver, type ImpressionObserverOptions, type InferOutput, type InferParams, type InferQuery, type Intent, type IntentController, IntentDispatcher, IntersectionImpressionObserver, type IslandHandle, type IslandOrchestrator, type IslandOrchestratorOptions, type IslandsShell, type LeafNode, type ListOptions, type LocaleAttributes, type LocaleInfo, type Logger, type Logger as LoggerInterface, type LoggerFactory, LruMap, type MakeDependenciesOptions, type Mapper, type MessagesLoader, type MessagesLoaderContext, type MetricsFieldsProvider, type MetricsRecorder, type MiddlewareResult, type MountEntry, type MultiValueSchema, NAVIGATION_NODE_KINDS, NAVIGATION_OP_KINDS, type NavigationBridgeDependencies, type NavigationBrowserConfig, type NavigationCodec, type NavigationContext, type NavigationContextInput, type NavigationController, type NavigationControllerOptions, type NavigationDefinition, type NavigationDispatchContext, NavigationError, type NavigationHandle, type NavigationInitial, type NavigationNode, type NavigationNodeKind, type NavigationOpKind, type NavigationOperation, type NavigationPath, type NavigationPathStep, type NavigationRouterLike, type NavigationSSRDefinition, type NavigationScopedState, type NavigationSnapshot, type Net, type NextResult, type None, type NumOptions, type Optional, type PWADisplayMode, type Page, type ParamSchema, type ParamsFor, type PlatformInfo, type PluralCategory, type PluralRuleProvider, type PopOperation, type PopToOperation, type PopToRootOperation, type PostLoadContext, type PrefetchedIntent, PrefetchedIntents, type PushOperation, type PushOptions, type QuerySchemaMap, type RedirectResult, type RenderMode, type ReplaceTopOperation, type ReportCallback, ReportingLogger, ReportingLoggerFactory, type ReportingLoggerOptions, type RequestInterceptor, type RequestScopedKey, type ResolvedDestination, type ResolvedEntry, type ResponseInterceptor, type RewriteResult, type RouteAddOptions, type RouteDefinition, type RouteMatch, type RouteParams, Router, SESSION_DEFAULT_DEBOUNCE_MS, SESSION_DEFAULT_KEY, SESSION_DEFAULT_VERSION, SPLIT_VISIBILITIES, type SafeErrorPageOptions, type SecureFetchOptions, type SelectColumnOperation, type SelectTabOperation, type SerializedLeaf, type SerializedNavigation, type SerializedSplit, type SerializedSplitColumn, type SerializedStack, type SerializedTabs, type ServerContextOptions, type SessionBridgeOptions, SessionError, type SessionErrorContext, type SessionHandle, type SessionNavigationAdapter, type SessionSnapshot, type SessionStateProvider, type SessionStore, type SessionStoreOptions, type SessionUrlLocation, type SetVisibilityOperation, SimpleTranslator, type SimpleTranslatorOptions, type SplitColumn, type SplitColumnInit, type SplitNode, type SplitVisibility, type StackNode, type StandardIssue, type StandardResult, type StandardSchemaV1, type Storage, type StrOptions, type StripOptional, type TabsInit, type TabsNode, type TextDirection, type TranslationMessages, type Translator, type UrlAdapterOptions, VoidEventRecorder, WithFieldsRecorder, bool, buildUrl, classifyHost, classifyUrl, collectAllLeaves, collectLeafKeys, collectVisibleDestinations, createActiveLeafCodec, createAppHandle, createBrowserContext, createDomRestore, createFlatStackCodec, createFullStateCodec, createIslandOrchestrator, createNavigationBridge, createNavigationController, createNavigationScopedState, createNavigationSessionAdapter, createPrefetchedIntentsFromDom, createServerContext, createSessionBridge, createSessionStore, createUrlSessionAdapter, createWebStorage, decodeNavigationTreeParam, decodeSnapshot, defaultShouldRestore, defineNavigation, defineRequestScopedKey, defineRoute, defineRoutes, deny, deserializeNavigation, deserializeServerData, detectPlatform, encodeNavigationTreeParam, encodeSnapshot, englishPlural, findNearestStack, findNode, generateUuid, getBaseUrl, getLocaleAttributes, getPWADisplayMode, getPublicFields, getTextDirection, int, interpolate, isCompoundAction, isExternalUrlAction, isFlowAction, isLeafNode, isMultiValueSchema, isNone, isPublicMarked, isRtl, isSome, isSplitNode, isStackNode, isTabsNode, isUrlLocation, islandContainerAttributes, leaf, list, makeDependencies, makeExternalUrlAction, makeFlowAction, makeLocaleInfo, makeSchema, mapEach, markPublic, next, num, oneOf, optional, pipe, pipeAsync, pop, popTo, popToRoot, push, redirect, registerActionHandlers, registerExternalUrlHandler, registerFlowActionHandler, removeHost, removeQueryParams, removeScheme, replaceTop, resetFilterCache, resolveActivePath, resolveConfiguredMessages, resolveIslandsShell, resolveLocaleFromUrl, resolveMessages, resolvePluralKey, rewrite, route, runAfterLoadGuards, runBeforeLoadGuards, runStandard, safeErrorPage, secureFetch, selectColumn, selectTab, serializeNavigation, serializeNavigationStable, sessionEntryKey, setHtmlLocaleAttributes, setVisibility, shouldLog, split, stableStringify, stack, startBrowserApp, str, tabs, tryScroll, uuid, visibleSplitColumns, withDefault };
|
package/dist/browser.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as e,$t as t,A as n,An as r,At as i,B as a,Bn as o,Bt as s,C as c,Cn as l,Ct as u,D as d,Dn as f,Dt as p,E as m,En as h,Et as g,F as _,Fn as v,Ft as y,G as b,Gn as x,Gt as S,H as C,Hn as w,Ht as T,I as E,In as D,It as O,J as k,Jn as A,Jt as j,K as M,Kn as N,Kt as P,L as F,Ln as I,Lt as L,M as R,Mn as z,Mt as B,N as V,Nn as H,Nt as U,O as W,On as G,Ot as K,P as q,Pn as J,Pt as Y,Q as X,Qt as Z,R as Q,Rn as $,Rt as ee,S as te,Sn as ne,St as re,T as ie,Tn as ae,Tt as oe,U as se,Un as ce,Ut as le,V as ue,Vn as de,Vt as fe,W as pe,Wn as me,Wt as he,X as ge,Xn as _e,Xt as ve,Y as ye,Yn as be,Yt as xe,Z as Se,Zn as Ce,Zt as we,_ as Te,_n as Ee,_t as De,a as Oe,an as ke,at as Ae,b as je,bn as Me,bt as Ne,c as Pe,cn as Fe,ct as Ie,d as Le,dn as Re,dt as ze,en as Be,et as Ve,f as He,fn as Ue,ft as We,g as Ge,gn as Ke,gt as qe,h as Je,hn as Ye,ht as Xe,i as Ze,in as Qe,it as $e,j as et,jn as tt,jt as nt,k as rt,kn as it,kt as at,l as ot,ln as st,lt as ct,m as lt,mn as ut,mt as dt,n as ft,nn as pt,nt as mt,o as ht,on as gt,ot as _t,p as vt,pn as yt,pt as bt,q as xt,qn as St,qt as Ct,r as wt,rn as Tt,rt as Et,s as Dt,sn as Ot,st as kt,t as At,tn as jt,tt as Mt,u as Nt,un as Pt,ut as Ft,v as It,vn as Lt,vt as Rt,w as zt,wn as Bt,wt as Vt,x as Ht,xn as Ut,xt as Wt,y as Gt,yn as Kt,yt as qt,z as Jt,zn as Yt,zt as Xt}from"./browser-
|
|
1
|
+
import{$ as e,$t as t,A as n,An as r,At as i,B as a,Bn as o,Bt as s,C as c,Cn as l,Ct as u,D as d,Dn as f,Dt as p,E as m,En as h,Et as g,F as _,Fn as v,Ft as y,G as b,Gn as x,Gt as S,H as C,Hn as w,Ht as T,I as E,In as D,It as O,J as k,Jn as A,Jt as j,K as M,Kn as N,Kt as P,L as F,Ln as I,Lt as L,M as R,Mn as z,Mt as B,N as V,Nn as H,Nt as U,O as W,On as G,Ot as K,P as q,Pn as J,Pt as Y,Q as X,Qt as Z,R as Q,Rn as $,Rt as ee,S as te,Sn as ne,St as re,T as ie,Tn as ae,Tt as oe,U as se,Un as ce,Ut as le,V as ue,Vn as de,Vt as fe,W as pe,Wn as me,Wt as he,X as ge,Xn as _e,Xt as ve,Y as ye,Yn as be,Yt as xe,Z as Se,Zn as Ce,Zt as we,_ as Te,_n as Ee,_t as De,a as Oe,an as ke,at as Ae,b as je,bn as Me,bt as Ne,c as Pe,cn as Fe,ct as Ie,d as Le,dn as Re,dt as ze,en as Be,et as Ve,f as He,fn as Ue,ft as We,g as Ge,gn as Ke,gt as qe,h as Je,hn as Ye,ht as Xe,i as Ze,in as Qe,it as $e,j as et,jn as tt,jt as nt,k as rt,kn as it,kt as at,l as ot,ln as st,lt as ct,m as lt,mn as ut,mt as dt,n as ft,nn as pt,nt as mt,o as ht,on as gt,ot as _t,p as vt,pn as yt,pt as bt,q as xt,qn as St,qt as Ct,r as wt,rn as Tt,rt as Et,s as Dt,sn as Ot,st as kt,t as At,tn as jt,tt as Mt,u as Nt,un as Pt,ut as Ft,v as It,vn as Lt,vt as Rt,w as zt,wn as Bt,wt as Vt,x as Ht,xn as Ut,xt as Wt,y as Gt,yn as Kt,yt as qt,z as Jt,zn as Yt,zt as Xt}from"./browser-BHhVWXik.mjs";export{N as ACTION_KINDS,x as ActionDispatcher,T as BASE_PAGE_FIELDS,s as BaseController,ne as BaseLogger,Ht as CompositeEventRecorder,l as CompositeLogger,Bt as CompositeLoggerFactory,Ye as ConsoleEventRecorder,Lt as ConsoleLogger,Kt as ConsoleLoggerFactory,ce as Container,mt as DEFAULT_NAV_PARAM,Ue as DEP_KEYS,le as FINESOFT_PUBLIC,Ct as Framework,Je as History,$ as HostGuardError,Yt as HttpClient,o as HttpError,me as IntentDispatcher,je as IntersectionImpressionObserver,F as LruMap,Y as NAVIGATION_NODE_KINDS,Ve as NAVIGATION_OP_KINDS,y as NavigationError,j as PrefetchedIntents,Ke as ReportingLogger,Ee as ReportingLoggerFactory,gt as Router,Ze as SESSION_DEFAULT_DEBOUNCE_MS,M as SESSION_DEFAULT_KEY,xt as SESSION_DEFAULT_VERSION,O as SPLIT_VISIBILITIES,k as SessionError,ae as SimpleTranslator,Gt as VoidEventRecorder,It as WithFieldsRecorder,Be as bool,rt as buildUrl,de as classifyHost,w as classifyUrl,ze as collectAllLeaves,ue as collectLeafKeys,We as collectVisibleDestinations,Et as createActiveLeafCodec,He as createAppHandle,m as createBrowserContext,Le as createDomRestore,$e as createFlatStackCodec,Ae as createFullStateCodec,Nt as createIslandOrchestrator,ot as createNavigationBridge,Mt as createNavigationController,C as createNavigationScopedState,Q as createNavigationSessionAdapter,Dt as createPrefetchedIntentsFromDom,d as createServerContext,Oe as createSessionBridge,a as createSessionStore,Jt as createUrlSessionAdapter,wt as createWebStorage,_t as decodeNavigationTreeParam,pe as decodeSnapshot,ht as defaultShouldRestore,e as defineNavigation,Re as defineRequestScopedKey,ge as defineRoute,Se as defineRoutes,te as deny,Ie as deserializeNavigation,Pe as deserializeServerData,ut as detectPlatform,kt as encodeNavigationTreeParam,b as encodeSnapshot,h as englishPlural,bt as findNearestStack,dt as findNode,W as generateUuid,n as getBaseUrl,tt as getLocaleAttributes,q as getPWADisplayMode,he as getPublicFields,z as getTextDirection,jt as int,f as interpolate,St as isCompoundAction,A as isExternalUrlAction,be as isFlowAction,g as isLeafNode,st as isMultiValueSchema,_ as isNone,S as isPublicMarked,H as isRtl,E as isSome,p as isSplitNode,K as isStackNode,at as isTabsNode,ye as isUrlLocation,oe as islandContainerAttributes,i as leaf,Pt as list,yt as makeDependencies,_e as makeExternalUrlAction,Ce as makeFlowAction,J as makeLocaleInfo,Ot as makeSchema,L as mapEach,P as markPublic,c as next,pt as num,Tt as oneOf,Z as optional,ee as pipe,Xt as pipeAsync,Xe as pop,qe as popTo,De as popToRoot,Rt as push,zt as redirect,vt as registerActionHandlers,Te as registerExternalUrlHandler,lt as registerFlowActionHandler,et as removeHost,R as removeQueryParams,V as removeScheme,qt as replaceTop,Me as resetFilterCache,Ne as resolveActivePath,it as resolveConfiguredMessages,At as resolveIslandsShell,v as resolveLocaleFromUrl,r as resolveMessages,G as resolvePluralKey,ie as rewrite,X as route,ve as runAfterLoadGuards,we as runBeforeLoadGuards,Fe as runStandard,fe as safeErrorPage,I as secureFetch,Wt as selectColumn,re as selectTab,ct as serializeNavigation,Ft as serializeNavigationStable,se as sessionEntryKey,D as setHtmlLocaleAttributes,u as setVisibility,Ut as shouldLog,nt as split,xe as stableStringify,B as stack,ft as startBrowserApp,Qe as str,U as tabs,Ge as tryScroll,ke as uuid,Vt as visibleSplitColumns,t as withDefault};
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { $ as IntersectionImpressionObserver, $i as markPublic, $n as TabsInit, $r as shouldLog, $t as defineNavigation, A as ActionHandlerDependencies, Aa as IntentDispatcher, Ai as StandardIssue, An as SerializedSplitColumn, Ar as HostCheckResult, At as NavigationScopedState, B as getTextDirection, Ba as FlowAction, Bi as NextResult, Bn as pop, Br as BaseItem, Bt as SessionUrlLocation, C as SessionBridgeOptions, Ca as ReportingLoggerFactory, Ci as StripOptional, Cn as createFlatStackCodec, Cr as TabsNode, Ct as createUrlSessionAdapter, D as NavigationBridgeDependencies, Da as LoggerFactory, Di as list, Dn as SerializedLeaf, Dr as pipe, Dt as sessionEntryKey, E as defaultShouldRestore, Ea as Logger, Ei as isMultiValueSchema, En as encodeNavigationTreeParam, Er as mapEach, Et as createNavigationScopedState, F as ExternalUrlDependencies, Fa as ActionHandler, Fi as AfterLoadGuard, Fn as serializeNavigationStable, Fr as HttpClientConfig, Ft as SessionNavigationAdapter, G as PluralCategory, Ga as makeFlowAction, Gi as next, Gn as resolveActivePath, Gr as FrameworkConfig, Gt as defineRoute, H as makeLocaleInfo, Ha as isExternalUrlAction, Hi as RedirectResult, Hn as popToRoot, Hr as SafeErrorPageOptions, Ht as DefineRoutesOptions, I as registerExternalUrlHandler, Ia as ACTION_KINDS, Ii as BeforeLoadGuard, In as collectAllLeaves, Ir as HttpError, It as SessionSnapshot, J as interpolate, Ji as BASE_PAGE_FIELDS, Jn as setVisibility, Jr as LocaleAttributes, Jt as DefineNavigationOptions, K as PluralRuleProvider, Ki as redirect, Kn as selectColumn, Kr as PrefetchedIntent, Kt as defineRoutes, L as SimpleTranslator, La as Action, Li as DenyResult, Ln as collectVisibleDestinations, Lr as RequestInterceptor, Lt as SessionStateProvider, M as FlowActionCallbacks, Ma as IntentController, Mi as StandardSchemaV1, Mn as SerializedTabs, Mr as classifyUrl, Mt as SESSION_DEFAULT_VERSION, N as FlowActionDependencies, Na as Container, Ni as makeSchema, Nn as deserializeNavigation, Nr as HostGuardError, Nt as SessionError, O as NavigationHandle, Oa as SecureFetchOptions, Oi as InferOutput, On as SerializedNavigation, Or as pipeAsync, Ot as decodeSnapshot, P as registerFlowActionHandler, Pa as ActionDispatcher, Pi as runStandard, Pn as serializeNavigation, Pr as HttpClient, Pt as SessionErrorContext, Q as ImpressionObserverOptions, Qi as isPublicMarked, Qn as SplitColumnInit, Qr as resetFilterCache, Qt as NavigationSSRDefinition, R as SimpleTranslatorOptions, Ra as CompoundAction, Ri as MiddlewareResult, Rn as findNearestStack, Rr as ResponseInterceptor, Rt as SessionStore, S as SESSION_DEFAULT_DEBOUNCE_MS, Sa as ReportingLogger, Si as QuerySchemaMap, Sn as createActiveLeafCodec, Sr as StackNode, St as createNavigationSessionAdapter, T as createSessionBridge, Ta as BaseLogger, Ti as MultiValueSchema, Tn as decodeNavigationTreeParam, Tr as Mapper, Tt as collectLeafKeys, U as resolveLocaleFromUrl, Ua as isFlowAction, Ui as RewriteResult, Un as push, Ur as safeErrorPage, Ut as RenderMode, V as isRtl, Va as isCompoundAction, Vi as PostLoadContext, Vn as popTo, Vr as BaseShelf, Vt as isUrlLocation, W as setHtmlLocaleAttributes, Wa as makeExternalUrlAction, Wi as deny, Wn as replaceTop, Wr as Framework, Wt as RouteDefinition, X as WithFieldsRecorder, Xi as FINESOFT_PUBLIC, Xn as ResolvedEntry, Xr as TextDirection, Xt as NavigationDefinition, Y as resolvePluralKey, Yi as BasePage, Yn as visibleSplitColumns, Yr as LocaleInfo, Yt as NavigationBrowserConfig, Z as VoidEventRecorder, Zi as getPublicFields, Zn as islandContainerAttributes, Zr as Translator, Zt as NavigationInitial, _ as IslandOrchestratorOptions, _a as EventRecorder, _i as Router, _n as createNavigationController, _r as ResolvedDestination, _t as Optional, a as DomRestore, aa as MakeDependenciesOptions, ai as withDefault, an as NavigationDispatchContext, ar as split, at as ServerContextOptions, b as AppHandle, ba as MetricsFieldsProvider, bi as InferQuery, bn as NavigationCodec, br as SplitNode, bt as LruMap, c as createWebStorage, ca as Storage, ci as bool, cn as PopOperation, cr as LeafNode, ct as generateUuid, d as BrowserAppConfig, da as MessagesLoaderContext, di as oneOf, dn as PushOperation, dr as NavigationNode, dt as removeHost, ea as RequestScopedKey, ei as ConsoleLogger, en as HydrateOperation, er as isLeafNode, et as ConsoleEventRecorder, f as BrowserNavigationConfig, fa as TranslationMessages, fi as str, fn as PushOptions, fr as NavigationNodeKind, ft as removeQueryParams, g as IslandOrchestrator, ga as detectPlatform, gi as RouteMatch, gn as SetVisibilityOperation, gr as Page, gt as None, h as IslandHandle, ha as PlatformInfo, hi as RouteAddOptions, hn as SelectTabOperation, hr as NavigationSnapshot, ht as getPWADisplayMode, i as History, ia as FeatureFlagsProvider, ii as optional, in as NavigationControllerOptions, ir as leaf, it as BrowserContextOptions, j as registerActionHandlers, ja as Intent, ji as StandardResult, jn as SerializedStack, jr as classifyHost, jt as SESSION_DEFAULT_KEY, k as createNavigationBridge, ka as secureFetch, ki as ParamSchema, kn as SerializedSplit, kr as BaseController, kt as encodeSnapshot, l as IslandsShell, la as makeDependencies, li as int, ln as PopToOperation, lr as NAVIGATION_NODE_KINDS, lt as buildUrl, m as startBrowserApp, ma as resolveMessages, mi as RouteParams, mn as SelectColumnOperation, mr as NavigationPathStep, mt as PWADisplayMode, n as deserializeServerData, na as DEP_KEYS, ni as CompositeLogger, nn as NavigationContextInput, nr as isStackNode, nt as runAfterLoadGuards, o as DomRestoreOptions, oa as MetricsRecorder, oi as NumOptions, on as NavigationOpKind, or as stack, ot as createBrowserContext, p as BrowserSessionConfig, pa as resolveConfiguredMessages, pi as uuid, pn as ReplaceTopOperation, pr as NavigationPath, pt as removeScheme, q as englishPlural, qi as rewrite, qn as selectTab, qr as PrefetchedIntents, qt as route, r as tryScroll, ra as FeatureFlags, ri as CompositeLoggerFactory, rn as NavigationController, rr as isTabsNode, rt as runBeforeLoadGuards, s as createDomRestore, sa as Net, si as StrOptions, sn as NavigationOperation, sr as tabs, st as createServerContext, t as createPrefetchedIntentsFromDom, ta as defineRequestScopedKey, ti as ConsoleLoggerFactory, tn as NAVIGATION_OP_KINDS, tr as isSplitNode, tt as CompositeEventRecorder, u as resolveIslandsShell, ua as MessagesLoader, ui as num, un as PopToRootOperation, ur as NavigationError, ut as getBaseUrl, v as MountEntry, va as ImpressionEntry, vi as ExtractParamNames, vn as DEFAULT_NAV_PARAM, vr as SPLIT_VISIBILITIES, vt as isNone, w as SessionHandle, wa as ReportingLoggerOptions, wi as ListOptions, wn as createFullStateCodec, wr as AsyncMapper, wt as createSessionStore, x as createAppHandle, xa as ReportCallback, xi as ParamsFor, xn as NavigationRouterLike, xr as SplitVisibility, xt as UrlAdapterOptions, y as createIslandOrchestrator, ya as ImpressionObserver, yi as InferParams, yn as FullStateCodecOptions, yr as SplitColumn, yt as isSome, z as getLocaleAttributes, za as ExternalUrlAction, zi as NavigationContext, zn as findNode, zr as stableStringify, zt as SessionStoreOptions } from "./browser-
|
|
1
|
+
import { $ as IntersectionImpressionObserver, $i as markPublic, $n as TabsInit, $r as shouldLog, $t as defineNavigation, A as ActionHandlerDependencies, Aa as IntentDispatcher, Ai as StandardIssue, An as SerializedSplitColumn, Ar as HostCheckResult, At as NavigationScopedState, B as getTextDirection, Ba as FlowAction, Bi as NextResult, Bn as pop, Br as BaseItem, Bt as SessionUrlLocation, C as SessionBridgeOptions, Ca as ReportingLoggerFactory, Ci as StripOptional, Cn as createFlatStackCodec, Cr as TabsNode, Ct as createUrlSessionAdapter, D as NavigationBridgeDependencies, Da as LoggerFactory, Di as list, Dn as SerializedLeaf, Dr as pipe, Dt as sessionEntryKey, E as defaultShouldRestore, Ea as Logger, Ei as isMultiValueSchema, En as encodeNavigationTreeParam, Er as mapEach, Et as createNavigationScopedState, F as ExternalUrlDependencies, Fa as ActionHandler, Fi as AfterLoadGuard, Fn as serializeNavigationStable, Fr as HttpClientConfig, Ft as SessionNavigationAdapter, G as PluralCategory, Ga as makeFlowAction, Gi as next, Gn as resolveActivePath, Gr as FrameworkConfig, Gt as defineRoute, H as makeLocaleInfo, Ha as isExternalUrlAction, Hi as RedirectResult, Hn as popToRoot, Hr as SafeErrorPageOptions, Ht as DefineRoutesOptions, I as registerExternalUrlHandler, Ia as ACTION_KINDS, Ii as BeforeLoadGuard, In as collectAllLeaves, Ir as HttpError, It as SessionSnapshot, J as interpolate, Ji as BASE_PAGE_FIELDS, Jn as setVisibility, Jr as LocaleAttributes, Jt as DefineNavigationOptions, K as PluralRuleProvider, Ki as redirect, Kn as selectColumn, Kr as PrefetchedIntent, Kt as defineRoutes, L as SimpleTranslator, La as Action, Li as DenyResult, Ln as collectVisibleDestinations, Lr as RequestInterceptor, Lt as SessionStateProvider, M as FlowActionCallbacks, Ma as IntentController, Mi as StandardSchemaV1, Mn as SerializedTabs, Mr as classifyUrl, Mt as SESSION_DEFAULT_VERSION, N as FlowActionDependencies, Na as Container, Ni as makeSchema, Nn as deserializeNavigation, Nr as HostGuardError, Nt as SessionError, O as NavigationHandle, Oa as SecureFetchOptions, Oi as InferOutput, On as SerializedNavigation, Or as pipeAsync, Ot as decodeSnapshot, P as registerFlowActionHandler, Pa as ActionDispatcher, Pi as runStandard, Pn as serializeNavigation, Pr as HttpClient, Pt as SessionErrorContext, Q as ImpressionObserverOptions, Qi as isPublicMarked, Qn as SplitColumnInit, Qr as resetFilterCache, Qt as NavigationSSRDefinition, R as SimpleTranslatorOptions, Ra as CompoundAction, Ri as MiddlewareResult, Rn as findNearestStack, Rr as ResponseInterceptor, Rt as SessionStore, S as SESSION_DEFAULT_DEBOUNCE_MS, Sa as ReportingLogger, Si as QuerySchemaMap, Sn as createActiveLeafCodec, Sr as StackNode, St as createNavigationSessionAdapter, T as createSessionBridge, Ta as BaseLogger, Ti as MultiValueSchema, Tn as decodeNavigationTreeParam, Tr as Mapper, Tt as collectLeafKeys, U as resolveLocaleFromUrl, Ua as isFlowAction, Ui as RewriteResult, Un as push, Ur as safeErrorPage, Ut as RenderMode, V as isRtl, Va as isCompoundAction, Vi as PostLoadContext, Vn as popTo, Vr as BaseShelf, Vt as isUrlLocation, W as setHtmlLocaleAttributes, Wa as makeExternalUrlAction, Wi as deny, Wn as replaceTop, Wr as Framework, Wt as RouteDefinition, X as WithFieldsRecorder, Xi as FINESOFT_PUBLIC, Xn as ResolvedEntry, Xr as TextDirection, Xt as NavigationDefinition, Y as resolvePluralKey, Yi as BasePage, Yn as visibleSplitColumns, Yr as LocaleInfo, Yt as NavigationBrowserConfig, Z as VoidEventRecorder, Zi as getPublicFields, Zn as islandContainerAttributes, Zr as Translator, Zt as NavigationInitial, _ as IslandOrchestratorOptions, _a as EventRecorder, _i as Router, _n as createNavigationController, _r as ResolvedDestination, _t as Optional, a as DomRestore, aa as MakeDependenciesOptions, ai as withDefault, an as NavigationDispatchContext, ar as split, at as ServerContextOptions, b as AppHandle, ba as MetricsFieldsProvider, bi as InferQuery, bn as NavigationCodec, br as SplitNode, bt as LruMap, c as createWebStorage, ca as Storage, ci as bool, cn as PopOperation, cr as LeafNode, ct as generateUuid, d as BrowserAppConfig, da as MessagesLoaderContext, di as oneOf, dn as PushOperation, dr as NavigationNode, dt as removeHost, ea as RequestScopedKey, ei as ConsoleLogger, en as HydrateOperation, er as isLeafNode, et as ConsoleEventRecorder, f as BrowserNavigationConfig, fa as TranslationMessages, fi as str, fn as PushOptions, fr as NavigationNodeKind, ft as removeQueryParams, g as IslandOrchestrator, ga as detectPlatform, gi as RouteMatch, gn as SetVisibilityOperation, gr as Page, gt as None, h as IslandHandle, ha as PlatformInfo, hi as RouteAddOptions, hn as SelectTabOperation, hr as NavigationSnapshot, ht as getPWADisplayMode, i as History, ia as FeatureFlagsProvider, ii as optional, in as NavigationControllerOptions, ir as leaf, it as BrowserContextOptions, j as registerActionHandlers, ja as Intent, ji as StandardResult, jn as SerializedStack, jr as classifyHost, jt as SESSION_DEFAULT_KEY, k as createNavigationBridge, ka as secureFetch, ki as ParamSchema, kn as SerializedSplit, kr as BaseController, kt as encodeSnapshot, l as IslandsShell, la as makeDependencies, li as int, ln as PopToOperation, lr as NAVIGATION_NODE_KINDS, lt as buildUrl, m as startBrowserApp, ma as resolveMessages, mi as RouteParams, mn as SelectColumnOperation, mr as NavigationPathStep, mt as PWADisplayMode, n as deserializeServerData, na as DEP_KEYS, ni as CompositeLogger, nn as NavigationContextInput, nr as isStackNode, nt as runAfterLoadGuards, o as DomRestoreOptions, oa as MetricsRecorder, oi as NumOptions, on as NavigationOpKind, or as stack, ot as createBrowserContext, p as BrowserSessionConfig, pa as resolveConfiguredMessages, pi as uuid, pn as ReplaceTopOperation, pr as NavigationPath, pt as removeScheme, q as englishPlural, qi as rewrite, qn as selectTab, qr as PrefetchedIntents, qt as route, r as tryScroll, ra as FeatureFlags, ri as CompositeLoggerFactory, rn as NavigationController, rr as isTabsNode, rt as runBeforeLoadGuards, s as createDomRestore, sa as Net, si as StrOptions, sn as NavigationOperation, sr as tabs, st as createServerContext, t as createPrefetchedIntentsFromDom, ta as defineRequestScopedKey, ti as ConsoleLoggerFactory, tn as NAVIGATION_OP_KINDS, tr as isSplitNode, tt as CompositeEventRecorder, u as resolveIslandsShell, ua as MessagesLoader, ui as num, un as PopToRootOperation, ur as NavigationError, ut as getBaseUrl, v as MountEntry, va as ImpressionEntry, vi as ExtractParamNames, vn as DEFAULT_NAV_PARAM, vr as SPLIT_VISIBILITIES, vt as isNone, w as SessionHandle, wa as ReportingLoggerOptions, wi as ListOptions, wn as createFullStateCodec, wr as AsyncMapper, wt as createSessionStore, x as createAppHandle, xa as ReportCallback, xi as ParamsFor, xn as NavigationRouterLike, xr as SplitVisibility, xt as UrlAdapterOptions, y as createIslandOrchestrator, ya as ImpressionObserver, yi as InferParams, yn as FullStateCodecOptions, yr as SplitColumn, yt as isSome, z as getLocaleAttributes, za as ExternalUrlAction, zi as NavigationContext, zn as findNode, zr as stableStringify, zt as SessionStoreOptions } from "./browser-BV2BBXm7.mjs";
|
|
2
2
|
import { Hono } from "hono";
|
|
3
|
-
import * as _$node_fs0 from "node:fs";
|
|
4
3
|
import { ViteDevServer } from "vite";
|
|
5
4
|
|
|
6
5
|
//#region ../ssr/src/render.d.ts
|
|
@@ -360,7 +359,7 @@ interface AdapterContext {
|
|
|
360
359
|
/** 默认 locale(CSR shell 使用) */
|
|
361
360
|
defaultLocale?: string;
|
|
362
361
|
vite: any;
|
|
363
|
-
fs: typeof
|
|
362
|
+
fs: typeof import("node:fs");
|
|
364
363
|
path: {
|
|
365
364
|
resolve: (...args: string[]) => string;
|
|
366
365
|
join: (...args: string[]) => string;
|
|
@@ -695,5 +694,5 @@ declare function finesoftFrontViteConfig(options?: FinesoftFrontViteOptions): {
|
|
|
695
694
|
closeBundle(): Promise<void>;
|
|
696
695
|
};
|
|
697
696
|
//#endregion
|
|
698
|
-
export { ACTION_KINDS, Action, ActionDispatcher, ActionHandler, ActionHandlerDependencies, type Adapter, type AdapterContext, AfterLoadGuard, AppHandle, AsyncMapper, BASE_PAGE_FIELDS, BaseController, BaseItem, BaseLogger, BasePage, BaseShelf, BeforeLoadGuard, BrowserAppConfig, BrowserContextOptions, BrowserNavigationConfig, BrowserSessionConfig, CompositeEventRecorder, CompositeLogger, CompositeLoggerFactory, CompoundAction, ConsoleEventRecorder, ConsoleLogger, ConsoleLoggerFactory, Container, DEFAULT_NAV_PARAM, DEP_KEYS, DefineNavigationOptions, DefineRoutesOptions, DenyResult, DomRestore, DomRestoreOptions, EventRecorder, ExternalUrlAction, ExternalUrlDependencies, ExtractParamNames, FINESOFT_PUBLIC, FeatureFlags, FeatureFlagsProvider, type FinesoftFrontViteOptions, FlowAction, FlowActionCallbacks, FlowActionDependencies, Framework, FrameworkConfig, FullStateCodecOptions, History, HostCheckResult, HostGuardError, HttpClient, HttpClientConfig, HttpError, HydrateOperation, ImpressionEntry, ImpressionObserver, ImpressionObserverOptions, InferOutput, InferParams, InferQuery, type InjectSSROptions, Intent, IntentController, IntentDispatcher, IntersectionImpressionObserver, IslandHandle, IslandOrchestrator, IslandOrchestratorOptions, IslandsShell, LeafNode, ListOptions, LocaleAttributes, LocaleInfo, Logger, Logger as LoggerInterface, LoggerFactory, LruMap, MakeDependenciesOptions, Mapper, MessagesLoader, MessagesLoaderContext, MetricsFieldsProvider, MetricsRecorder, MiddlewareResult, MountEntry, MultiValueSchema, NAVIGATION_NODE_KINDS, NAVIGATION_OP_KINDS, NAVIGATION_TREE_INTENT_ID, NavigationBridgeDependencies, NavigationBrowserConfig, NavigationCodec, NavigationContext, NavigationContextInput, NavigationController, NavigationControllerOptions, NavigationDefinition, NavigationDispatchContext, NavigationError, NavigationHandle, NavigationInitial, NavigationNode, NavigationNodeKind, NavigationOpKind, NavigationOperation, NavigationPath, NavigationPathStep, NavigationRouterLike, NavigationSSRDefinition, NavigationScopedState, NavigationSnapshot, Net, NextResult, None, NumOptions, Optional, PWADisplayMode, Page, ParamSchema, ParamsFor, PlatformInfo, PluralCategory, PluralRuleProvider, PopOperation, PopToOperation, PopToRootOperation, PostLoadContext, PrefetchedIntent, PrefetchedIntents, type ProxyAuthConfig, type ProxyRouteConfig, PushOperation, PushOptions, QuerySchemaMap, RedirectResult, type RenderEntry, RenderMode, ReplaceTopOperation, ReportCallback, ReportingLogger, ReportingLoggerFactory, ReportingLoggerOptions, RequestInterceptor, RequestScopedKey, ResolvedDestination, ResolvedEntry, ResponseInterceptor, RewriteResult, RouteAddOptions, RouteDefinition, RouteMatch, RouteParams, Router, type RuntimeInfo, SESSION_DEFAULT_DEBOUNCE_MS, SESSION_DEFAULT_KEY, SESSION_DEFAULT_VERSION, SPLIT_VISIBILITIES, type SSRAppOptions, type SSRContext, type SSRModule, type SSRNavigationDefinition, type SSRNavigationRenderConfig, type SSRRenderConfig, type SSRRenderNavigationOptions, type SSRRenderNavigationResult, type SSRRenderOptions, type SSRRenderResult, SSR_PLACEHOLDERS, SafeErrorPageOptions, SecureFetchOptions, SelectColumnOperation, SelectTabOperation, type SerializeServerDataOptions, SerializedLeaf, SerializedNavigation, type SerializedNavigationTreePayload, SerializedSplit, SerializedSplitColumn, SerializedStack, SerializedTabs, type ServerConfig, ServerContextOptions, type ServerInstance, SessionBridgeOptions, SessionError, SessionErrorContext, SessionHandle, SessionNavigationAdapter, SessionSnapshot, SessionStateProvider, SessionStore, SessionStoreOptions, SessionUrlLocation, SetVisibilityOperation, SimpleTranslator, SimpleTranslatorOptions, SplitColumn, SplitColumnInit, SplitNode, SplitVisibility, StackNode, StandardIssue, StandardResult, StandardSchemaV1, type StartServerOptions, Storage, StrOptions, StripOptional, TabsInit, TabsNode, TextDirection, TranslationMessages, Translator, UrlAdapterOptions, VoidEventRecorder, WithFieldsRecorder, autoAdapter, bool, buildUrl, classifyHost, classifyUrl, cloudflareAdapter, collectAllLeaves, collectLeafKeys, collectVisibleDestinations, createActiveLeafCodec, createAppHandle, createBrowserContext, createDomRestore, createFlatStackCodec, createFullStateCodec, createIslandOrchestrator, createNavigationBridge, createNavigationController, createNavigationScopedState, createNavigationSessionAdapter, createPrefetchedIntentsFromDom, createSSRApp, createSSRNavigationRender, createSSRRender, createServer, createServerContext, createSessionBridge, createSessionStore, createUrlSessionAdapter, createWebStorage, decodeNavigationTreeParam, decodeSnapshot, defaultShouldRestore, defineNavigation, defineRequestScopedKey, defineRoute, defineRoutes, deny, deserializeNavigation, deserializeServerData, detectPlatform, detectRuntime, encodeNavigationTreeParam, encodeSnapshot, englishPlural, extractNavigationTree, findNearestStack, findNode, finesoftFrontViteConfig, generateProxyCode, generateUuid, getBaseUrl, getLocaleAttributes, getPWADisplayMode, getPublicFields, getTextDirection, injectCSRShell, injectSSRContent, int, interpolate, isCompoundAction, isExternalUrlAction, isFlowAction, isLeafNode, isMultiValueSchema, isNone, isPublicMarked, isRtl, isSome, isSplitNode, isStackNode, isTabsNode, isUrlLocation, islandContainerAttributes, leaf, list, makeDependencies, makeExternalUrlAction, makeFlowAction, makeLocaleInfo, makeSchema, mapEach, markPublic, netlifyAdapter, next, nodeAdapter, num, oneOf, optional, parseAcceptLanguage, pipe, pipeAsync, pop, popTo, popToRoot, push, redirect, registerActionHandlers, registerExternalUrlHandler, registerFlowActionHandler, registerProxyRoutes, removeHost, removeQueryParams, removeScheme, renderIslandsHtml, replaceTop, resetFilterCache, resolveActivePath, resolveAdapter, resolveConfiguredMessages, resolveIslandsShell, resolveLocaleFromUrl, resolveMessages, resolvePluralKey, resolveRoot, rewrite, route, runAfterLoadGuards, runBeforeLoadGuards, runStandard, safeErrorPage, secureFetch, selectColumn, selectTab, serializeNavigation, serializeNavigationStable, serializeServerData, sessionEntryKey, setHtmlLocaleAttributes, setVisibility, shouldLog, split, ssrRender, ssrRenderNavigation, stableStringify, stack, startBrowserApp, startServer, staticAdapter, str, stripNavigationTree, tabs, tryScroll, uuid, vercelAdapter, visibleSplitColumns, withDefault };
|
|
697
|
+
export { ACTION_KINDS, type Action, ActionDispatcher, type ActionHandler, type ActionHandlerDependencies, type Adapter, type AdapterContext, type AfterLoadGuard, type AppHandle, type AsyncMapper, BASE_PAGE_FIELDS, BaseController, type BaseItem, BaseLogger, type BasePage, type BaseShelf, type BeforeLoadGuard, type BrowserAppConfig, type BrowserContextOptions, type BrowserNavigationConfig, type BrowserSessionConfig, CompositeEventRecorder, CompositeLogger, CompositeLoggerFactory, type CompoundAction, ConsoleEventRecorder, ConsoleLogger, ConsoleLoggerFactory, Container, DEFAULT_NAV_PARAM, DEP_KEYS, type DefineNavigationOptions, type DefineRoutesOptions, type DenyResult, type DomRestore, type DomRestoreOptions, type EventRecorder, type ExternalUrlAction, type ExternalUrlDependencies, type ExtractParamNames, FINESOFT_PUBLIC, type FeatureFlags, type FeatureFlagsProvider, type FinesoftFrontViteOptions, type FlowAction, type FlowActionCallbacks, type FlowActionDependencies, Framework, type FrameworkConfig, type FullStateCodecOptions, History, type HostCheckResult, HostGuardError, HttpClient, type HttpClientConfig, HttpError, type HydrateOperation, type ImpressionEntry, type ImpressionObserver, type ImpressionObserverOptions, type InferOutput, type InferParams, type InferQuery, type InjectSSROptions, type Intent, type IntentController, IntentDispatcher, IntersectionImpressionObserver, type IslandHandle, type IslandOrchestrator, type IslandOrchestratorOptions, type IslandsShell, type LeafNode, type ListOptions, type LocaleAttributes, type LocaleInfo, type Logger, type Logger as LoggerInterface, type LoggerFactory, LruMap, type MakeDependenciesOptions, type Mapper, type MessagesLoader, type MessagesLoaderContext, type MetricsFieldsProvider, type MetricsRecorder, type MiddlewareResult, type MountEntry, type MultiValueSchema, NAVIGATION_NODE_KINDS, NAVIGATION_OP_KINDS, NAVIGATION_TREE_INTENT_ID, type NavigationBridgeDependencies, type NavigationBrowserConfig, type NavigationCodec, type NavigationContext, type NavigationContextInput, type NavigationController, type NavigationControllerOptions, type NavigationDefinition, type NavigationDispatchContext, NavigationError, type NavigationHandle, type NavigationInitial, type NavigationNode, type NavigationNodeKind, type NavigationOpKind, type NavigationOperation, type NavigationPath, type NavigationPathStep, type NavigationRouterLike, type NavigationSSRDefinition, type NavigationScopedState, type NavigationSnapshot, type Net, type NextResult, type None, type NumOptions, type Optional, type PWADisplayMode, type Page, type ParamSchema, type ParamsFor, type PlatformInfo, type PluralCategory, type PluralRuleProvider, type PopOperation, type PopToOperation, type PopToRootOperation, type PostLoadContext, type PrefetchedIntent, PrefetchedIntents, type ProxyAuthConfig, type ProxyRouteConfig, type PushOperation, type PushOptions, type QuerySchemaMap, type RedirectResult, type RenderEntry, type RenderMode, type ReplaceTopOperation, type ReportCallback, ReportingLogger, ReportingLoggerFactory, type ReportingLoggerOptions, type RequestInterceptor, type RequestScopedKey, type ResolvedDestination, type ResolvedEntry, type ResponseInterceptor, type RewriteResult, type RouteAddOptions, type RouteDefinition, type RouteMatch, type RouteParams, Router, type RuntimeInfo, SESSION_DEFAULT_DEBOUNCE_MS, SESSION_DEFAULT_KEY, SESSION_DEFAULT_VERSION, SPLIT_VISIBILITIES, type SSRAppOptions, type SSRContext, type SSRModule, type SSRNavigationDefinition, type SSRNavigationRenderConfig, type SSRRenderConfig, type SSRRenderNavigationOptions, type SSRRenderNavigationResult, type SSRRenderOptions, type SSRRenderResult, SSR_PLACEHOLDERS, type SafeErrorPageOptions, type SecureFetchOptions, type SelectColumnOperation, type SelectTabOperation, type SerializeServerDataOptions, type SerializedLeaf, type SerializedNavigation, type SerializedNavigationTreePayload, type SerializedSplit, type SerializedSplitColumn, type SerializedStack, type SerializedTabs, type ServerConfig, type ServerContextOptions, type ServerInstance, type SessionBridgeOptions, SessionError, type SessionErrorContext, type SessionHandle, type SessionNavigationAdapter, type SessionSnapshot, type SessionStateProvider, type SessionStore, type SessionStoreOptions, type SessionUrlLocation, type SetVisibilityOperation, SimpleTranslator, type SimpleTranslatorOptions, type SplitColumn, type SplitColumnInit, type SplitNode, type SplitVisibility, type StackNode, type StandardIssue, type StandardResult, type StandardSchemaV1, type StartServerOptions, type Storage, type StrOptions, type StripOptional, type TabsInit, type TabsNode, type TextDirection, type TranslationMessages, type Translator, type UrlAdapterOptions, VoidEventRecorder, WithFieldsRecorder, autoAdapter, bool, buildUrl, classifyHost, classifyUrl, cloudflareAdapter, collectAllLeaves, collectLeafKeys, collectVisibleDestinations, createActiveLeafCodec, createAppHandle, createBrowserContext, createDomRestore, createFlatStackCodec, createFullStateCodec, createIslandOrchestrator, createNavigationBridge, createNavigationController, createNavigationScopedState, createNavigationSessionAdapter, createPrefetchedIntentsFromDom, createSSRApp, createSSRNavigationRender, createSSRRender, createServer, createServerContext, createSessionBridge, createSessionStore, createUrlSessionAdapter, createWebStorage, decodeNavigationTreeParam, decodeSnapshot, defaultShouldRestore, defineNavigation, defineRequestScopedKey, defineRoute, defineRoutes, deny, deserializeNavigation, deserializeServerData, detectPlatform, detectRuntime, encodeNavigationTreeParam, encodeSnapshot, englishPlural, extractNavigationTree, findNearestStack, findNode, finesoftFrontViteConfig, generateProxyCode, generateUuid, getBaseUrl, getLocaleAttributes, getPWADisplayMode, getPublicFields, getTextDirection, injectCSRShell, injectSSRContent, int, interpolate, isCompoundAction, isExternalUrlAction, isFlowAction, isLeafNode, isMultiValueSchema, isNone, isPublicMarked, isRtl, isSome, isSplitNode, isStackNode, isTabsNode, isUrlLocation, islandContainerAttributes, leaf, list, makeDependencies, makeExternalUrlAction, makeFlowAction, makeLocaleInfo, makeSchema, mapEach, markPublic, netlifyAdapter, next, nodeAdapter, num, oneOf, optional, parseAcceptLanguage, pipe, pipeAsync, pop, popTo, popToRoot, push, redirect, registerActionHandlers, registerExternalUrlHandler, registerFlowActionHandler, registerProxyRoutes, removeHost, removeQueryParams, removeScheme, renderIslandsHtml, replaceTop, resetFilterCache, resolveActivePath, resolveAdapter, resolveConfiguredMessages, resolveIslandsShell, resolveLocaleFromUrl, resolveMessages, resolvePluralKey, resolveRoot, rewrite, route, runAfterLoadGuards, runBeforeLoadGuards, runStandard, safeErrorPage, secureFetch, selectColumn, selectTab, serializeNavigation, serializeNavigationStable, serializeServerData, sessionEntryKey, setHtmlLocaleAttributes, setVisibility, shouldLog, split, ssrRender, ssrRenderNavigation, stableStringify, stack, startBrowserApp, startServer, staticAdapter, str, stripNavigationTree, tabs, tryScroll, uuid, vercelAdapter, visibleSplitColumns, withDefault };
|
|
699
698
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{$ as e,$t as t,A as n,An as r,At as i,B as a,Bn as o,Bt as s,C as c,Cn as l,Ct as u,D as d,Dn as f,Dt as p,E as m,En as h,Et as g,F as _,Fn as v,Ft as y,G as b,Gn as x,Gt as S,H as ee,Hn as C,Ht as w,I as T,In as E,It as te,J as ne,Jn as re,Jt as ie,K as ae,Kn as oe,Kt as se,L as D,Ln as ce,Lt as le,M as ue,Mn as de,Mt as fe,N as pe,Nn as me,Nt as he,O as ge,On as _e,Ot as ve,P as ye,Pn as be,Pt as xe,Q as Se,Qt as Ce,R as we,Rn as Te,Rt as Ee,S as De,Sn as Oe,St as ke,T as Ae,Tn as je,Tt as O,U as k,Un as Me,Ut as Ne,V as Pe,Vn as Fe,Vt as Ie,W as Le,Wn as Re,Wt as A,X as ze,Xn as Be,Xt as Ve,Y as He,Yn as Ue,Yt as We,Z as Ge,Zn as Ke,Zt as qe,_ as Je,_n as Ye,_t as Xe,a as Ze,an as Qe,at as $e,b as et,bn as tt,bt as nt,c as rt,cn as it,ct as j,d as at,dn as ot,dt as st,en as ct,et as lt,f as ut,fn as M,ft as dt,g as ft,gn as pt,gt as mt,h as ht,hn as gt,ht as _t,i as vt,in as yt,it as bt,j as xt,jn as N,jt as St,k as Ct,kn as P,kt as wt,l as Tt,ln as Et,lt as F,m as Dt,mn as Ot,mt as kt,n as At,nn as jt,nt as Mt,o as Nt,on as Pt,ot as Ft,p as It,pn as Lt,pt as Rt,q as zt,qn as Bt,qt as I,r as Vt,rn as Ht,rt as Ut,s as Wt,sn as Gt,st as Kt,t as qt,tn as Jt,tt as L,u as Yt,un as Xt,ut as Zt,v as Qt,vn as $t,vt as en,w as tn,wn as nn,wt as rn,x as an,xn as on,xt as sn,y as cn,yn as ln,yt as un,z as dn,zn as fn,zt as pn}from"./browser-BYZq9Jp7.mjs";import{Hono as R}from"hono";async function z(e){return mn(e,0)}async function mn(e,t){if(t>=5)throw Error(`[SSR] Rewrite recursion depth exceeded (max 5) at "${e.url}"`);let{url:n,frameworkConfig:r,bootstrap:i,getErrorPage:a,renderApp:o,ssrContext:s,resolveLocale:c,loadMessages:l}=e,u=new URL(n,`http://localhost`),f=u.pathname+u.search,p=c?.(n,s?.request),m=p?{...r,locale:p.lang}:r,h=await P({locale:m.locale,loadMessages:l,context:m.locale?{runtime:`server`,fetch:hn(s?.fetch??m.fetch),url:f,request:s?.request}:void 0}),g={...m,fetch:s?.fetch??m.fetch},_=I.create({...g,_resolvedMessages:h});i(_);try{let n=await _.routeUrl(f);if(n?.renderMode===`csr`)return{html:``,head:``,css:``,serverData:[],renderMode:`csr`};let r,i=[],c;if(n){let l=d({url:f,intent:n.intent,container:_.container,request:s?.request}),u=await _.runBeforeLoad(l,n.beforeGuards);if(u.kind===`rewrite`)return mn({...e,url:u.url},t+1);if(u.kind!==`next`){let e=await gn(u,a,o,_);if(e)return e}try{r=await _.dispatch(n.intent),i=[{intent:n.intent,data:r}]}catch(e){_.container.resolve(M.LOGGER).error(`[SSR] dispatch failed for intent "${n.intent.id}":`,e),r=a(500,`Internal error`)}let p={...l,page:r},m=await _.runAfterLoad(p,n.afterGuards);if(m.kind===`rewrite`)c=m.url;else if(m.kind!==`next`){let e=await gn(m,a,o,_);if(e)return e}}else r=a(404,`Page not found`);let l=await o(r,_),u=p??_.getLocale();return{html:l.html,head:l.head,css:l.css,serverData:i,renderMode:n?.renderMode,slots:l.slots,locale:u,rewriteUrl:c}}finally{_.dispose()}}function hn(e){return(e??globalThis.fetch?.bind(globalThis))||(()=>{throw Error(`[ssrRender] loadMessages requires a fetch implementation.`)})}async function gn(e,t,n,r){switch(e.kind){case`next`:case`rewrite`:return null;case`redirect`:return{html:``,head:``,css:``,serverData:[],redirect:{url:e.url,status:e.status}};case`deny`:{let i=await n(t(e.status,e.message),r);return{html:i.html,head:i.head,css:i.css,serverData:[],slots:i.slots,status:e.status}}}}function _n(e){let{bootstrap:t,getErrorPage:n,renderApp:r,frameworkConfig:i,resolveLocale:a,loadMessages:o}=e;return(e,s)=>z({url:e,frameworkConfig:i??{},bootstrap:t,getErrorPage:n,renderApp:(e,t)=>r(e,t),ssrContext:s,resolveLocale:a,loadMessages:o})}const vn={HEAD:`<!--ssr-head-->`,BODY:`<!--ssr-body-->`,DATA:`<!--ssr-data-->`},yn=/<!--ssr-([a-z][a-z0-9-]*)-->/g;function B(e){let{template:t,head:n,css:r,html:i,serializedData:a,slots:o,locale:s}=e,c={head:`${n}\n${r?`<style>${r}</style>`:``}`,body:i,data:`<script id="serialized-server-data" type="application/json">${a}<\/script>`,...o},l=t.replace(yn,(e,t)=>c[t]??``);return s&&(l=Sn(l,s)),l}function V(e,t){let n=e.replace(yn,()=>``);return t&&(n=Sn(n,t)),n}const bn=/\s+lang=("[^"]*"|'[^']*'|[^\s>]+)/gi,xn=/\s+dir=("[^"]*"|'[^']*'|[^\s>]+)/gi;function Sn(e,t){return e.replace(/(<html)([^>]*)(>)/i,(e,n,r,i)=>`${n}${r.replace(bn,``).replace(xn,``)} lang="${t.lang}" dir="${t.dir}"${i}`)}const Cn=`@finesoft/navigation-tree`;async function wn(e){let{url:t,frameworkConfig:n,bootstrap:r,getErrorPage:a,renderApp:o,navigation:s,ssrContext:c,resolveLocale:l,loadMessages:u}=e,d=new URL(t,`http://localhost`),f=d.pathname+d.search,p=l?.(t,c?.request),m=p?{...n,locale:p.lang}:n,h=await P({locale:m.locale,loadMessages:u,context:m.locale?{runtime:`server`,fetch:In(c?.fetch??m.fetch),url:f,request:c?.request}:void 0}),g={...m,fetch:c?.fetch??m.fetch},_=I.create({...g,_resolvedMessages:h});r(_);try{let e=await Tn(_,s,f);if(e===void 0)return Fn({framework:_,resolvedLocale:p,renderApp:o,page:a(404,`Page not found`),snapshot:{tree:i(`@finesoft/not-found`),destinations:[]},serverData:[],renderMode:void 0,status:void 0});let{tree:t,renderMode:n}=e;if(n===`csr`)return{html:``,head:``,css:``,serverData:[],renderMode:`csr`,snapshot:{tree:t,destinations:[]}};let r,l=await En({framework:_,navigation:s,initialTree:t,fullPath:f,request:c?.request,getErrorPage:a,onRedirect:e=>{r??=e}}).resolve();if(r!==void 0)return{html:``,head:``,css:``,serverData:[],redirect:r,snapshot:l};let u=Dn(l,a);return Fn({framework:_,resolvedLocale:p,renderApp:o,page:u.page,snapshot:l,serverData:An(l),renderMode:n,status:u.status})}finally{_.dispose()}}async function Tn(e,t,n){let r=t.codec.decode(n,e.router);if(r!==void 0)return{tree:r,renderMode:void 0};let a=t.initial?.(n);if(a!==void 0)return{tree:a,renderMode:void 0};let o=await e.routeUrl(n);if(o!==null)return{tree:i(o.intent.id,o.intent.params??{}),renderMode:o.renderMode}}function En(e){let{framework:t,navigation:n,initialTree:r,fullPath:i,request:a,getErrorPage:o,onRedirect:s}=e;return L({intentDispatcher:t.intentDispatcher,router:t.router,initial:r,beforeLoad:n.beforeLoad,afterLoad:n.afterLoad,getErrorPage:o,onRedirect:s,createContext:({intent:e,params:n})=>({container:t.container,url:i,navigation:d({url:i,intent:{id:e,params:n},container:t.container,request:a})})})}function Dn(e,t){let n=On(e.tree);if(n!==void 0){let t=e.destinations.find(e=>e.intent===n.intent&&kn(e.params,n.params));if(t!==void 0)return t}return e.destinations.length>0?e.destinations[0]:{intent:`@finesoft/empty`,params:{},page:t(404,`Page not found`),status:404}}function On(e){let t=e;for(;;)switch(t.kind){case`leaf`:return{intent:t.intent,params:t.params};case`stack`:if(t.entries.length===0)return;t=t.entries[t.entries.length-1];break;case`tabs`:{let e=t.branches[t.active];if(e===void 0)return;t=e;break}case`split`:{let e;for(let n of t.columns)n.content!==void 0&&(e=n.content);if(e===void 0)return;t=e;break}}}function kn(e,t){let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r of n)if(e[r]!==t[r])return!1;return!0}function An(e){let t=[];for(let n of e.destinations)t.push({intent:{id:n.intent,params:n.params},data:n.page});return t.push(jn(e.tree)),t}function jn(e){let t={__finesoftNavigationTree:!0,tree:F(e)};return{intent:{id:Cn},data:se(t,!0)}}function Mn(e){for(let t of e)if(Pn(t))return j(t.data.tree)}function Nn(e){return e.filter(e=>!Pn(e))}function Pn(e){if(e.intent.id!==`@finesoft/navigation-tree`)return!1;let t=e.data;return typeof t==`object`&&!!t&&t.__finesoftNavigationTree===!0}async function Fn(e){let{framework:t,resolvedLocale:n,renderApp:r,page:i,snapshot:a,serverData:o,renderMode:s,status:c}=e,l=await r(i,t,a),u=n??t.getLocale();return{html:l.html,head:l.head,css:l.css,serverData:o,renderMode:s,slots:l.slots,locale:u,status:c,snapshot:a}}function In(e){return(e??globalThis.fetch?.bind(globalThis))||(()=>{throw Error(`[ssrRenderNavigation] loadMessages requires a fetch implementation.`)})}function Ln(e){let{bootstrap:t,getErrorPage:n,renderApp:r,navigation:i,frameworkConfig:a,resolveLocale:o,loadMessages:s}=e;return(e,c)=>wn({url:e,frameworkConfig:a??{},bootstrap:t,getErrorPage:n,renderApp:r,navigation:i,ssrContext:c,resolveLocale:o,loadMessages:s})}const Rn={"<":`\\u003C`,">":`\\u003E`,"/":`\\u002F`,"\u2028":`\\u2028`,"\u2029":`\\u2029`},zn=RegExp(`[<>/\\u2028\\u2029]`,`g`);let Bn=!1;function Vn(e,t={}){let n=t.onUnmarkedPage??`all`,r=e.map(e=>Hn(e,n));return JSON.stringify(r).replace(zn,e=>Rn[e]??e)}function Hn(e,t){let n=e.data,r=A(n);if(r===!0)return e;if(Array.isArray(r))return{...e,data:Un(n,r)};if(t===`strict`)throw Error(`[serializeServerData] page for intent "${e.intent.id}" has no markPublic marker; wrap it with markPublic(page, ["field", ...]) to declare client-visible fields.`);return t===`base-fields`?{...e,data:Un(n,w)}:(Wn(e.intent.id),e)}function Un(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function Wn(e){Bn||(Bn=!0,Gn()&&console.warn(`[finesoft/ssr] Page for intent "${e}" was serialized without markPublic(); all fields (including any sensitive data) are exposed in the SSR HTML. Wrap your page with markPublic(page, ["field", ...]) to declare client-visible fields explicitly. The next major version will default to BasePage-only fields when no marker is present.`))}function Gn(){try{return globalThis.process?.env?.NODE_ENV!==`production`}catch{return!1}}function Kn(e){return Object.entries(e).map(([e,t])=>t===``?e:`${e}="${qn(t)}"`).join(` `)}function qn(e){return e.replace(/&/g,`&`).replace(/"/g,`"`).replace(/</g,`<`)}async function Jn(e,t){let n=[];for(let r of e.destinations){let e=k(r.intent,r.params),i=await t({intent:r.intent,params:r.params,entryKey:e,page:r.page}),a=Kn(O(r.intent,e));n.push(`<div ${a}>${i}</div>`)}return n.join(``)}const Yn=new Map,Xn=e=>import(e),Zn=typeof process<`u`&&process.env?.FINESOFT_DEBUG===`1`;function Qn(e){Zn&&console.debug(`[finesoft:dynamic-import] ${e}`)}async function H(e){let t=!e.startsWith(`file:`)&&!e.startsWith(`/`);if(t){let t=Yn.get(e);if(t)return Qn(`cache hit → ${e}`),t}Qn(`importing → ${e}`);let n=await Xn(e);return t&&Yn.set(e,n),n}const U=10*1024*1024;function $n(e){if(e.length>2048)return null;try{if(decodeURIComponent(e)!==e)return null}catch{return null}return e.startsWith(`//`)||!/^[/\w.\-~%:@!$&'()*+,;=]*$/.test(e)?null:e.startsWith(`/`)?e:`/${e}`}function er(e){if(!e.prefix.startsWith(`/`))throw Error(`[proxy] prefix must start with "/": "${e.prefix}"`);let t=e.target.startsWith(`https://`),n=e.target.startsWith(`http://`);if(!t&&!n)throw Error(`[proxy] target must start with "https://" or "http://": "${e.target}"`);n&&console.warn(`[proxy] ⚠ target "${e.target}" uses plain HTTP — traffic will not be encrypted. Use HTTPS in production to prevent data interception.`)}function W(e,t){for(let n of t){er(n);let t=n.methods??[`all`],r=`${n.prefix}/*`,i=async e=>{let t=$n(e.req.path.replace(n.prefix,``));if(!t)return e.text(`Invalid path`,400);let r=new URL(t,n.target),i=new URL(n.target).origin;if(r.origin!==i)return e.text(`Invalid proxy target`,400);new URL(e.req.url).searchParams.forEach((e,t)=>r.searchParams.set(t,e));let a={...n.headers};if(n.auth){let e=process.env[n.auth.envKey];e?a.Authorization=n.auth.type===`bearer`?`Bearer ${e}`:`Basic ${e}`:console.warn(`[Proxy ${n.prefix}] Auth env var "${n.auth.envKey}" is not set`)}try{let t=await fetch(r.toString(),{headers:a,redirect:n.followRedirects?`follow`:`manual`}),i=t.headers.get(`Content-Length`);if(i&&parseInt(i,10)>U)return e.text(`Proxy response too large`,502);let o=await t.arrayBuffer();if(o.byteLength>U)return e.text(`Proxy response too large`,502);let s={"Content-Type":t.headers.get(`Content-Type`)??`application/json`};return n.cache&&(s[`Cache-Control`]=n.cache),e.newResponse(o,t.status,s)}catch(t){return console.error(`[Proxy ${n.prefix}]`,t),e.json({error:`Proxy request failed`},502)}};for(let n of t)e[n](r,i)}}function tr(e){if(!e||e.length===0)return``;for(let t of e)er(t);let t=[];t.push(`
|
|
1
|
+
import{$ as e,$t as t,A as n,An as r,At as i,B as a,Bn as o,Bt as s,C as c,Cn as l,Ct as u,D as d,Dn as f,Dt as p,E as m,En as h,Et as g,F as _,Fn as v,Ft as y,G as b,Gn as x,Gt as S,H as ee,Hn as C,Ht as w,I as T,In as E,It as te,J as ne,Jn as re,Jt as ie,K as ae,Kn as oe,Kt as se,L as D,Ln as ce,Lt as le,M as ue,Mn as de,Mt as fe,N as pe,Nn as me,Nt as he,O as ge,On as _e,Ot as ve,P as ye,Pn as be,Pt as xe,Q as Se,Qt as Ce,R as we,Rn as Te,Rt as Ee,S as De,Sn as Oe,St as ke,T as Ae,Tn as je,Tt as O,U as k,Un as Me,Ut as Ne,V as Pe,Vn as Fe,Vt as Ie,W as Le,Wn as Re,Wt as A,X as ze,Xn as Be,Xt as Ve,Y as He,Yn as Ue,Yt as We,Z as Ge,Zn as Ke,Zt as qe,_ as Je,_n as Ye,_t as Xe,a as Ze,an as Qe,at as $e,b as et,bn as tt,bt as nt,c as rt,cn as it,ct as j,d as at,dn as ot,dt as st,en as ct,et as lt,f as ut,fn as M,ft as dt,g as ft,gn as pt,gt as mt,h as ht,hn as gt,ht as _t,i as vt,in as yt,it as bt,j as xt,jn as N,jt as St,k as Ct,kn as P,kt as wt,l as Tt,ln as Et,lt as F,m as Dt,mn as Ot,mt as kt,n as At,nn as jt,nt as Mt,o as Nt,on as Pt,ot as Ft,p as It,pn as Lt,pt as Rt,q as zt,qn as Bt,qt as I,r as Vt,rn as Ht,rt as Ut,s as Wt,sn as Gt,st as Kt,t as qt,tn as Jt,tt as L,u as Yt,un as Xt,ut as Zt,v as Qt,vn as $t,vt as en,w as tn,wn as nn,wt as rn,x as an,xn as on,xt as sn,y as cn,yn as ln,yt as un,z as dn,zn as fn,zt as pn}from"./browser-BHhVWXik.mjs";import{Hono as R}from"hono";async function z(e){return mn(e,0)}async function mn(e,t){if(t>=5)throw Error(`[SSR] Rewrite recursion depth exceeded (max 5) at "${e.url}"`);let{url:n,frameworkConfig:r,bootstrap:i,getErrorPage:a,renderApp:o,ssrContext:s,resolveLocale:c,loadMessages:l}=e,u=new URL(n,`http://localhost`),f=u.pathname+u.search,p=c?.(n,s?.request),m=p?{...r,locale:p.lang}:r,h=await P({locale:m.locale,loadMessages:l,context:m.locale?{runtime:`server`,fetch:hn(s?.fetch??m.fetch),url:f,request:s?.request}:void 0}),g={...m,fetch:s?.fetch??m.fetch},_=I.create({...g,_resolvedMessages:h});i(_);try{let n=await _.routeUrl(f);if(n?.renderMode===`csr`)return{html:``,head:``,css:``,serverData:[],renderMode:`csr`};let r,i=[],c;if(n){let l=d({url:f,intent:n.intent,container:_.container,request:s?.request}),u=await _.runBeforeLoad(l,n.beforeGuards);if(u.kind===`rewrite`)return mn({...e,url:u.url},t+1);if(u.kind!==`next`){let e=await gn(u,a,o,_);if(e)return e}try{r=await _.dispatch(n.intent),i=[{intent:n.intent,data:r}]}catch(e){_.container.resolve(M.LOGGER).error(`[SSR] dispatch failed for intent "${n.intent.id}":`,e),r=a(500,`Internal error`)}let p={...l,page:r},m=await _.runAfterLoad(p,n.afterGuards);if(m.kind===`rewrite`)c=m.url;else if(m.kind!==`next`){let e=await gn(m,a,o,_);if(e)return e}}else r=a(404,`Page not found`);let l=await o(r,_),u=p??_.getLocale();return{html:l.html,head:l.head,css:l.css,serverData:i,renderMode:n?.renderMode,slots:l.slots,locale:u,rewriteUrl:c}}finally{_.dispose()}}function hn(e){return(e??globalThis.fetch?.bind(globalThis))||(()=>{throw Error(`[ssrRender] loadMessages requires a fetch implementation.`)})}async function gn(e,t,n,r){switch(e.kind){case`next`:case`rewrite`:return null;case`redirect`:return{html:``,head:``,css:``,serverData:[],redirect:{url:e.url,status:e.status}};case`deny`:{let i=await n(t(e.status,e.message),r);return{html:i.html,head:i.head,css:i.css,serverData:[],slots:i.slots,status:e.status}}}}function _n(e){let{bootstrap:t,getErrorPage:n,renderApp:r,frameworkConfig:i,resolveLocale:a,loadMessages:o}=e;return(e,s)=>z({url:e,frameworkConfig:i??{},bootstrap:t,getErrorPage:n,renderApp:(e,t)=>r(e,t),ssrContext:s,resolveLocale:a,loadMessages:o})}const vn={HEAD:`<!--ssr-head-->`,BODY:`<!--ssr-body-->`,DATA:`<!--ssr-data-->`},yn=/<!--ssr-([a-z][a-z0-9-]*)-->/g;function B(e){let{template:t,head:n,css:r,html:i,serializedData:a,slots:o,locale:s}=e,c={head:`${n}\n${r?`<style>${r}</style>`:``}`,body:i,data:`<script id="serialized-server-data" type="application/json">${a}<\/script>`,...o},l=t.replace(yn,(e,t)=>c[t]??``);return s&&(l=Sn(l,s)),l}function V(e,t){let n=e.replace(yn,()=>``);return t&&(n=Sn(n,t)),n}const bn=/\s+lang=("[^"]*"|'[^']*'|[^\s>]+)/gi,xn=/\s+dir=("[^"]*"|'[^']*'|[^\s>]+)/gi;function Sn(e,t){return e.replace(/(<html)([^>]*)(>)/i,(e,n,r,i)=>`${n}${r.replace(bn,``).replace(xn,``)} lang="${t.lang}" dir="${t.dir}"${i}`)}const Cn=`@finesoft/navigation-tree`;async function wn(e){let{url:t,frameworkConfig:n,bootstrap:r,getErrorPage:a,renderApp:o,navigation:s,ssrContext:c,resolveLocale:l,loadMessages:u}=e,d=new URL(t,`http://localhost`),f=d.pathname+d.search,p=l?.(t,c?.request),m=p?{...n,locale:p.lang}:n,h=await P({locale:m.locale,loadMessages:u,context:m.locale?{runtime:`server`,fetch:In(c?.fetch??m.fetch),url:f,request:c?.request}:void 0}),g={...m,fetch:c?.fetch??m.fetch},_=I.create({...g,_resolvedMessages:h});r(_);try{let e=await Tn(_,s,f);if(e===void 0)return Fn({framework:_,resolvedLocale:p,renderApp:o,page:a(404,`Page not found`),snapshot:{tree:i(`@finesoft/not-found`),destinations:[]},serverData:[],renderMode:void 0,status:void 0});let{tree:t,renderMode:n}=e;if(n===`csr`)return{html:``,head:``,css:``,serverData:[],renderMode:`csr`,snapshot:{tree:t,destinations:[]}};let r,l=await En({framework:_,navigation:s,initialTree:t,fullPath:f,request:c?.request,getErrorPage:a,onRedirect:e=>{r??=e}}).resolve();if(r!==void 0)return{html:``,head:``,css:``,serverData:[],redirect:r,snapshot:l};let u=Dn(l,a);return Fn({framework:_,resolvedLocale:p,renderApp:o,page:u.page,snapshot:l,serverData:An(l),renderMode:n,status:u.status})}finally{_.dispose()}}async function Tn(e,t,n){let r=t.codec.decode(n,e.router);if(r!==void 0)return{tree:r,renderMode:void 0};let a=t.initial?.(n);if(a!==void 0)return{tree:a,renderMode:void 0};let o=await e.routeUrl(n);if(o!==null)return{tree:i(o.intent.id,o.intent.params??{}),renderMode:o.renderMode}}function En(e){let{framework:t,navigation:n,initialTree:r,fullPath:i,request:a,getErrorPage:o,onRedirect:s}=e;return L({intentDispatcher:t.intentDispatcher,router:t.router,initial:r,beforeLoad:n.beforeLoad,afterLoad:n.afterLoad,getErrorPage:o,onRedirect:s,createContext:({intent:e,params:n})=>({container:t.container,url:i,navigation:d({url:i,intent:{id:e,params:n},container:t.container,request:a})})})}function Dn(e,t){let n=On(e.tree);if(n!==void 0){let t=e.destinations.find(e=>e.intent===n.intent&&kn(e.params,n.params));if(t!==void 0)return t}return e.destinations.length>0?e.destinations[0]:{intent:`@finesoft/empty`,params:{},page:t(404,`Page not found`),status:404}}function On(e){let t=e;for(;;)switch(t.kind){case`leaf`:return{intent:t.intent,params:t.params};case`stack`:if(t.entries.length===0)return;t=t.entries[t.entries.length-1];break;case`tabs`:{let e=t.branches[t.active];if(e===void 0)return;t=e;break}case`split`:{let e;for(let n of t.columns)n.content!==void 0&&(e=n.content);if(e===void 0)return;t=e;break}}}function kn(e,t){let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r of n)if(e[r]!==t[r])return!1;return!0}function An(e){let t=[];for(let n of e.destinations)t.push({intent:{id:n.intent,params:n.params},data:n.page});return t.push(jn(e.tree)),t}function jn(e){let t={__finesoftNavigationTree:!0,tree:F(e)};return{intent:{id:Cn},data:se(t,!0)}}function Mn(e){for(let t of e)if(Pn(t))return j(t.data.tree)}function Nn(e){return e.filter(e=>!Pn(e))}function Pn(e){if(e.intent.id!==`@finesoft/navigation-tree`)return!1;let t=e.data;return typeof t==`object`&&!!t&&t.__finesoftNavigationTree===!0}async function Fn(e){let{framework:t,resolvedLocale:n,renderApp:r,page:i,snapshot:a,serverData:o,renderMode:s,status:c}=e,l=await r(i,t,a),u=n??t.getLocale();return{html:l.html,head:l.head,css:l.css,serverData:o,renderMode:s,slots:l.slots,locale:u,status:c,snapshot:a}}function In(e){return(e??globalThis.fetch?.bind(globalThis))||(()=>{throw Error(`[ssrRenderNavigation] loadMessages requires a fetch implementation.`)})}function Ln(e){let{bootstrap:t,getErrorPage:n,renderApp:r,navigation:i,frameworkConfig:a,resolveLocale:o,loadMessages:s}=e;return(e,c)=>wn({url:e,frameworkConfig:a??{},bootstrap:t,getErrorPage:n,renderApp:r,navigation:i,ssrContext:c,resolveLocale:o,loadMessages:s})}const Rn={"<":`\\u003C`,">":`\\u003E`,"/":`\\u002F`,"\u2028":`\\u2028`,"\u2029":`\\u2029`},zn=RegExp(`[<>/\\u2028\\u2029]`,`g`);let Bn=!1;function Vn(e,t={}){let n=t.onUnmarkedPage??`all`,r=e.map(e=>Hn(e,n));return JSON.stringify(r).replace(zn,e=>Rn[e]??e)}function Hn(e,t){let n=e.data,r=A(n);if(r===!0)return e;if(Array.isArray(r))return{...e,data:Un(n,r)};if(t===`strict`)throw Error(`[serializeServerData] page for intent "${e.intent.id}" has no markPublic marker; wrap it with markPublic(page, ["field", ...]) to declare client-visible fields.`);return t===`base-fields`?{...e,data:Un(n,w)}:(Wn(e.intent.id),e)}function Un(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function Wn(e){Bn||(Bn=!0,Gn()&&console.warn(`[finesoft/ssr] Page for intent "${e}" was serialized without markPublic(); all fields (including any sensitive data) are exposed in the SSR HTML. Wrap your page with markPublic(page, ["field", ...]) to declare client-visible fields explicitly. The next major version will default to BasePage-only fields when no marker is present.`))}function Gn(){try{return globalThis.process?.env?.NODE_ENV!==`production`}catch{return!1}}function Kn(e){return Object.entries(e).map(([e,t])=>t===``?e:`${e}="${qn(t)}"`).join(` `)}function qn(e){return e.replace(/&/g,`&`).replace(/"/g,`"`).replace(/</g,`<`)}async function Jn(e,t){let n=[];for(let r of e.destinations){let e=k(r.intent,r.params),i=await t({intent:r.intent,params:r.params,entryKey:e,page:r.page}),a=Kn(O(r.intent,e));n.push(`<div ${a}>${i}</div>`)}return n.join(``)}const Yn=new Map,Xn=e=>import(e),Zn=typeof process<`u`&&process.env?.FINESOFT_DEBUG===`1`;function Qn(e){Zn&&console.debug(`[finesoft:dynamic-import] ${e}`)}async function H(e){let t=!e.startsWith(`file:`)&&!e.startsWith(`/`);if(t){let t=Yn.get(e);if(t)return Qn(`cache hit → ${e}`),t}Qn(`importing → ${e}`);let n=await Xn(e);return t&&Yn.set(e,n),n}const U=10*1024*1024;function $n(e){if(e.length>2048)return null;try{if(decodeURIComponent(e)!==e)return null}catch{return null}return e.startsWith(`//`)||!/^[/\w.\-~%:@!$&'()*+,;=]*$/.test(e)?null:e.startsWith(`/`)?e:`/${e}`}function er(e){if(!e.prefix.startsWith(`/`))throw Error(`[proxy] prefix must start with "/": "${e.prefix}"`);let t=e.target.startsWith(`https://`),n=e.target.startsWith(`http://`);if(!t&&!n)throw Error(`[proxy] target must start with "https://" or "http://": "${e.target}"`);n&&console.warn(`[proxy] ⚠ target "${e.target}" uses plain HTTP — traffic will not be encrypted. Use HTTPS in production to prevent data interception.`)}function W(e,t){for(let n of t){er(n);let t=n.methods??[`all`],r=`${n.prefix}/*`,i=async e=>{let t=$n(e.req.path.replace(n.prefix,``));if(!t)return e.text(`Invalid path`,400);let r=new URL(t,n.target),i=new URL(n.target).origin;if(r.origin!==i)return e.text(`Invalid proxy target`,400);new URL(e.req.url).searchParams.forEach((e,t)=>r.searchParams.set(t,e));let a={...n.headers};if(n.auth){let e=process.env[n.auth.envKey];e?a.Authorization=n.auth.type===`bearer`?`Bearer ${e}`:`Basic ${e}`:console.warn(`[Proxy ${n.prefix}] Auth env var "${n.auth.envKey}" is not set`)}try{let t=await fetch(r.toString(),{headers:a,redirect:n.followRedirects?`follow`:`manual`}),i=t.headers.get(`Content-Length`);if(i&&parseInt(i,10)>U)return e.text(`Proxy response too large`,502);let o=await t.arrayBuffer();if(o.byteLength>U)return e.text(`Proxy response too large`,502);let s={"Content-Type":t.headers.get(`Content-Type`)??`application/json`};return n.cache&&(s[`Cache-Control`]=n.cache),e.newResponse(o,t.status,s)}catch(t){return console.error(`[Proxy ${n.prefix}]`,t),e.json({error:`Proxy request failed`},502)}};for(let n of t)e[n](r,i)}}function tr(e){if(!e||e.length===0)return``;for(let t of e)er(t);let t=[];t.push(`
|
|
2
2
|
// ─── 框架声明式代理路由 ───
|
|
3
3
|
function _sanitizeProxyPath(raw) {
|
|
4
4
|
if (raw.length > 2048) return null;
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@finesoft/front",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "Full-stack framework: router, DI, actions, SSR, and server — all in one package",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
7
|
-
"dist/browser-
|
|
8
|
-
"dist/browser-
|
|
7
|
+
"dist/browser-BHhVWXik.mjs",
|
|
8
|
+
"dist/browser-BV2BBXm7.d.mts",
|
|
9
9
|
"dist/browser.d.mts",
|
|
10
10
|
"dist/browser.mjs",
|
|
11
11
|
"dist/index.d.mts",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"dotenv": "^17.3.1",
|
|
35
35
|
"hono": "^4.12.21",
|
|
36
36
|
"vite": "npm:@voidzero-dev/vite-plus-core@0.1.16",
|
|
37
|
-
"vite-plus": "0.1.
|
|
37
|
+
"vite-plus": "0.1.24"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"@hono/node-server": "^1.0.0",
|
|
@@ -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{constructor(e,t,n){super(`HTTP ${e}: ${t}`),this.status=e,this.statusText=t,this.body=n,this.name=`HttpError`}},_=class extends Error{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{constructor(e){this.factories=e}loggerFor(e){return new ge(this.factories.map(t=>t.loggerFor(e)))}},ge=class{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{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{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-BYZq9Jp7.mjs.map
|