@finesoft/front 0.4.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-BYZq9Jp7.mjs +2 -0
- package/dist/{browser-DMw76sEo.d.mts → browser-JTs2jqVY.d.mts} +99 -19
- package/dist/browser.d.mts +2 -2
- package/dist/browser.mjs +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +22 -22
- package/docs/02-routing-and-controllers.md +127 -16
- package/docs/zh/02-routing-and-controllers.md +119 -8
- package/package.json +3 -3
- package/dist/browser-BIetJHp_.mjs +0 -2
|
@@ -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{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
|
|
@@ -580,8 +580,8 @@ type InferOutput<S extends StandardSchemaV1> = NonNullable<S["~standard"]["types
|
|
|
580
580
|
type ParamSchema<T = unknown> = StandardSchemaV1<string, T>;
|
|
581
581
|
/** 工厂:从一个 validate 函数构造实现了 ~standard 的 codec */
|
|
582
582
|
declare function makeSchema<T>(validate: (value: unknown) => StandardResult<T> | Promise<StandardResult<T>>): ParamSchema<T>;
|
|
583
|
-
/** 统一执行任意 Standard Schema
|
|
584
|
-
declare function runStandard(schema: StandardSchemaV1, raw: string | undefined): Promise<{
|
|
583
|
+
/** 统一执行任意 Standard Schema 的校验,吸收同步/异步差异(raw 可为单值或多值 query) */
|
|
584
|
+
declare function runStandard(schema: StandardSchemaV1, raw: string | string[] | undefined): Promise<{
|
|
585
585
|
ok: true;
|
|
586
586
|
value: unknown;
|
|
587
587
|
} | {
|
|
@@ -589,6 +589,47 @@ declare function runStandard(schema: StandardSchemaV1, raw: string | undefined):
|
|
|
589
589
|
issues: readonly StandardIssue[];
|
|
590
590
|
}>;
|
|
591
591
|
//#endregion
|
|
592
|
+
//#region ../core/src/router/params/multi.d.ts
|
|
593
|
+
/** 多值(数组)query codec:输入为 string[],并带 `multi` 运行时标记。 */
|
|
594
|
+
interface MultiValueSchema<Output> extends StandardSchemaV1<string[], Output> {
|
|
595
|
+
readonly multi: true;
|
|
596
|
+
}
|
|
597
|
+
interface ListOptions {
|
|
598
|
+
/** 最少元素数 */
|
|
599
|
+
min?: number;
|
|
600
|
+
/** 最多元素数 */
|
|
601
|
+
max?: number;
|
|
602
|
+
}
|
|
603
|
+
/** 运行时判断一个 schema 是否为多值 codec(resolve 据此决定取全部值还是单值)。 */
|
|
604
|
+
declare function isMultiValueSchema(schema: StandardSchemaV1): schema is MultiValueSchema<unknown>;
|
|
605
|
+
/**
|
|
606
|
+
* 多值 query 原语:用内部单值 codec 逐项校验/转换,产出数组。
|
|
607
|
+
* 缺失(undefined)→ 空数组;任一项校验失败 → 整体失败(resolve 据此 fall-through)。
|
|
608
|
+
*/
|
|
609
|
+
declare function list<T>(item: ParamSchema<T>, opts?: ListOptions): MultiValueSchema<T[]>;
|
|
610
|
+
//#endregion
|
|
611
|
+
//#region ../core/src/router/params/infer.d.ts
|
|
612
|
+
/** 剥离可选参数尾随的 "?" */
|
|
613
|
+
type StripOptional<S extends string> = S extends `${infer N}?` ? N : S;
|
|
614
|
+
/** 从 path pattern 字面量提取参数名联合(处理 :param 与 :param?) */
|
|
615
|
+
type ExtractParamNames<Path extends string> = Path extends `${infer _Head}:${infer Rest}` ? Rest extends `${infer Name}/${infer Tail}` ? StripOptional<Name> | ExtractParamNames<`/${Tail}`> : StripOptional<Rest> : never;
|
|
616
|
+
/** path 参数 codec map 的形状:key 只能是 path 中出现的参数名(均可选声明) */
|
|
617
|
+
type ParamsFor<Path extends string> = { [K in ExtractParamNames<Path>]?: ParamSchema };
|
|
618
|
+
/** query 参数 codec map:key 自由开放;值可为单值 codec 或多值(list)codec */
|
|
619
|
+
type QuerySchemaMap = Record<string, StandardSchemaV1<string, unknown> | MultiValueSchema<unknown>>;
|
|
620
|
+
/** 把对象类型「拍平」为单层,便于阅读与类型相等比较 */
|
|
621
|
+
type Prettify<T> = { [K in keyof T]: T[K] } & {};
|
|
622
|
+
/** 输出类型含 undefined 的 key(由 optional() 产生)→ 渲染为可选属性 */
|
|
623
|
+
type OptionalOutKeys<M extends Record<string, StandardSchemaV1>> = { [K in keyof M]: undefined extends InferOutput<M[K]> ? K : never }[keyof M];
|
|
624
|
+
type RequiredOutKeys<M extends Record<string, StandardSchemaV1>> = { [K in keyof M]: undefined extends InferOutput<M[K]> ? never : K }[keyof M];
|
|
625
|
+
/**
|
|
626
|
+
* 从 codec map 推导运行期参数类型。
|
|
627
|
+
* optional() 让输出含 undefined 的 key 渲染为可选属性(`tab?: T`,并剥掉冗余的 `| undefined`);
|
|
628
|
+
* withDefault() 始终有值,key 保持必选。
|
|
629
|
+
*/
|
|
630
|
+
type InferParams<P extends Record<string, ParamSchema>> = Prettify<{ [K in RequiredOutKeys<P>]: InferOutput<P[K]> } & { [K in OptionalOutKeys<P>]?: Exclude<InferOutput<P[K]>, undefined> }>;
|
|
631
|
+
type InferQuery<Q extends QuerySchemaMap> = Prettify<{ [K in RequiredOutKeys<Q>]: InferOutput<Q[K]> } & { [K in OptionalOutKeys<Q>]?: Exclude<InferOutput<Q[K]>, undefined> }>;
|
|
632
|
+
//#endregion
|
|
592
633
|
//#region ../core/src/router/router.d.ts
|
|
593
634
|
/** 路由匹配结果 */
|
|
594
635
|
interface RouteMatch {
|
|
@@ -606,7 +647,7 @@ interface RouteAddOptions {
|
|
|
606
647
|
beforeGuards?: BeforeLoadGuard[];
|
|
607
648
|
afterGuards?: AfterLoadGuard[];
|
|
608
649
|
paramCodecs?: Record<string, ParamSchema>;
|
|
609
|
-
queryCodecs?:
|
|
650
|
+
queryCodecs?: QuerySchemaMap;
|
|
610
651
|
}
|
|
611
652
|
declare class Router {
|
|
612
653
|
private readonly debug?;
|
|
@@ -654,19 +695,6 @@ declare function optional<T>(codec: ParamSchema<T>): ParamSchema<T | undefined>;
|
|
|
654
695
|
/** 输入缺失时用 fallback;否则委托内部 codec。 */
|
|
655
696
|
declare function withDefault<T>(codec: ParamSchema<T>, fallback: T): ParamSchema<T>;
|
|
656
697
|
//#endregion
|
|
657
|
-
//#region ../core/src/router/params/infer.d.ts
|
|
658
|
-
/** 剥离可选参数尾随的 "?" */
|
|
659
|
-
type StripOptional<S extends string> = S extends `${infer N}?` ? N : S;
|
|
660
|
-
/** 从 path pattern 字面量提取参数名联合(处理 :param 与 :param?) */
|
|
661
|
-
type ExtractParamNames<Path extends string> = Path extends `${infer _Head}:${infer Rest}` ? Rest extends `${infer Name}/${infer Tail}` ? StripOptional<Name> | ExtractParamNames<`/${Tail}`> : StripOptional<Rest> : never;
|
|
662
|
-
/** path 参数 codec map 的形状:key 只能是 path 中出现的参数名(均可选声明) */
|
|
663
|
-
type ParamsFor<Path extends string> = { [K in ExtractParamNames<Path>]?: ParamSchema };
|
|
664
|
-
/** query 参数 codec map:key 自由开放 */
|
|
665
|
-
type QuerySchemaMap = Record<string, StandardSchemaV1<string, unknown>>;
|
|
666
|
-
/** 从 codec map 推导运行期参数类型 */
|
|
667
|
-
type InferParams<P extends Record<string, ParamSchema>> = { [K in keyof P]: InferOutput<P[K]> };
|
|
668
|
-
type InferQuery<Q extends QuerySchemaMap> = { [K in keyof Q]: InferOutput<Q[K]> };
|
|
669
|
-
//#endregion
|
|
670
698
|
//#region ../core/src/logger/composite.d.ts
|
|
671
699
|
declare class CompositeLoggerFactory implements LoggerFactory {
|
|
672
700
|
private readonly factories;
|
|
@@ -1787,6 +1815,37 @@ declare function route<const Path extends string, P extends ParamsFor<Path> = Pa
|
|
|
1787
1815
|
beforeLoad?: BeforeLoadGuard[];
|
|
1788
1816
|
afterLoad?: AfterLoadGuard[];
|
|
1789
1817
|
}): RouteDefinition;
|
|
1818
|
+
/** defineRoute 的 handler 入参类型:path 参数 + query 经 codec 推导后合并(免手写)。 */
|
|
1819
|
+
type HandlerParams<P, Q> = InferParams<{ [K in keyof P]: P[K] extends ParamSchema ? P[K] : never }> & InferQuery<{ [K in keyof Q]: Q[K] extends QuerySchemaMap[string] ? Q[K] : never }>;
|
|
1820
|
+
/**
|
|
1821
|
+
* 构造一条强类型路由定义,**handler 的入参类型从 `path` + codec 自动推导**——免手写
|
|
1822
|
+
* `BaseController<InferParams<typeof ...> & InferQuery<typeof ...>>`。
|
|
1823
|
+
*
|
|
1824
|
+
* 与 `route()`(类 controller)互补:用 handler 函数代替 `BaseController` 子类,框架据
|
|
1825
|
+
* `params`/`query` codec 自动算出 handler 入参类型;内部把 handler 合成为 `IntentController`,
|
|
1826
|
+
* 复刻 `BaseController` 的 try/catch → fallback 行为。`params` 的 key 同样受 `path` 字面量约束。
|
|
1827
|
+
*
|
|
1828
|
+
* @example
|
|
1829
|
+
* route 同款的强类型,但无需声明 controller 类:
|
|
1830
|
+
* ```ts
|
|
1831
|
+
* defineRoute("/product/:id", {
|
|
1832
|
+
* intentId: "product",
|
|
1833
|
+
* params: { id: int() },
|
|
1834
|
+
* query: { page: withDefault(int(), 1) },
|
|
1835
|
+
* handler: (params) => ({ ... }), // params: { id: number; page: number },自动推导
|
|
1836
|
+
* })
|
|
1837
|
+
* ```
|
|
1838
|
+
*/
|
|
1839
|
+
declare function defineRoute<const Path extends string, P extends ParamsFor<Path> = ParamsFor<Path>, Q extends QuerySchemaMap = QuerySchemaMap, TResult = unknown>(path: Path, def: {
|
|
1840
|
+
intentId: string;
|
|
1841
|
+
params?: P;
|
|
1842
|
+
query?: Q;
|
|
1843
|
+
handler: (params: HandlerParams<P, Q>, container: Container) => TResult | Promise<TResult>;
|
|
1844
|
+
fallback?: (params: HandlerParams<P, Q>, error: Error) => TResult | Promise<TResult>;
|
|
1845
|
+
renderMode?: RenderMode;
|
|
1846
|
+
beforeLoad?: BeforeLoadGuard[];
|
|
1847
|
+
afterLoad?: AfterLoadGuard[];
|
|
1848
|
+
}): RouteDefinition;
|
|
1790
1849
|
/** defineRoutes 选项 */
|
|
1791
1850
|
interface DefineRoutesOptions {
|
|
1792
1851
|
/**
|
|
@@ -1803,11 +1862,32 @@ interface DefineRoutesOptions {
|
|
|
1803
1862
|
*/
|
|
1804
1863
|
locales?: string[];
|
|
1805
1864
|
}
|
|
1865
|
+
/**
|
|
1866
|
+
* 数组形态 6c 一致性的载体:把一条路由的 `params` 按其自身 `path` 字面量重新约束 key。
|
|
1867
|
+
*
|
|
1868
|
+
* 不在 path 参数名集合内的 key 显式映射为 `never`——结构化赋值不会对非 fresh 对象做
|
|
1869
|
+
* excess-property 检查(`route()` 单数 helper 靠 fresh 字面量 + `ParamsFor` 拿到 excess
|
|
1870
|
+
* 检查,但数组元素流经泛型推断后不再是 fresh,故改用 never 映射),使其值(`ParamSchema`)
|
|
1871
|
+
* 不可赋给 `never` 而编译期报错。
|
|
1872
|
+
*/
|
|
1873
|
+
type ValidateRouteParams<Path extends string, Params> = { [K in keyof Params]: K extends ExtractParamNames<Path> ? Params[K] : never };
|
|
1874
|
+
/**
|
|
1875
|
+
* 仅当元素是「带 params 的对象字面量」时重写其 params 约束;无 params 的路由与 `route()`
|
|
1876
|
+
* 输出(`params` 可选、Path 已擦除为 string)走 false 分支,原样透传、不被过度约束。
|
|
1877
|
+
*/
|
|
1878
|
+
type ValidateRouteDef<R> = R extends {
|
|
1879
|
+
path: infer P extends string;
|
|
1880
|
+
params: infer Params;
|
|
1881
|
+
} ? Omit<R, "params"> & {
|
|
1882
|
+
params: ValidateRouteParams<P, Params>;
|
|
1883
|
+
} : R;
|
|
1806
1884
|
/**
|
|
1807
1885
|
* 声明式注册路由和 Controller
|
|
1808
1886
|
*
|
|
1809
1887
|
* - 自动去重: 同一 intentId 的 controller 只注册一次
|
|
1810
1888
|
* - 路由和 controller 在同一个配置数组中,方便检查一致性
|
|
1889
|
+
* - **数组形态 6c**: 每条对象字面量路由的 `params` key 受其自身 `path` 字面量约束,
|
|
1890
|
+
* 写入 path 中不存在的参数名会编译期报错(与 `route()` 单数 helper 同等保证)。
|
|
1811
1891
|
*
|
|
1812
1892
|
* @example
|
|
1813
1893
|
* ```ts
|
|
@@ -1820,7 +1900,7 @@ interface DefineRoutesOptions {
|
|
|
1820
1900
|
* ]);
|
|
1821
1901
|
* ```
|
|
1822
1902
|
*/
|
|
1823
|
-
declare function defineRoutes(framework: Framework, definitions:
|
|
1903
|
+
declare function defineRoutes<const T extends readonly RouteDefinition[]>(framework: Framework, definitions: { [I in keyof T]: ValidateRouteDef<T[I]> }, options?: DefineRoutesOptions): void;
|
|
1824
1904
|
//#endregion
|
|
1825
1905
|
//#region ../core/src/session/types.d.ts
|
|
1826
1906
|
/** 会话快照在 Storage 中的默认键。 */
|
|
@@ -2727,5 +2807,5 @@ declare function deserializeServerData(): PrefetchedIntent[] | undefined;
|
|
|
2727
2807
|
*/
|
|
2728
2808
|
declare function createPrefetchedIntentsFromDom(): PrefetchedIntents;
|
|
2729
2809
|
//#endregion
|
|
2730
|
-
export { IntersectionImpressionObserver as $,
|
|
2731
|
-
//# sourceMappingURL=browser-
|
|
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-JTs2jqVY.d.mts.map
|
package/dist/browser.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { $ as IntersectionImpressionObserver, $i as
|
|
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, LocaleAttributes, LocaleInfo, Logger, Logger as LoggerInterface, LoggerFactory, LruMap, MakeDependenciesOptions, Mapper, MessagesLoader, MessagesLoaderContext, MetricsFieldsProvider, MetricsRecorder, MiddlewareResult, MountEntry, 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, defineRoutes, deny, deserializeNavigation, deserializeServerData, detectPlatform, encodeNavigationTreeParam, encodeSnapshot, englishPlural, findNearestStack, findNode, generateUuid, getBaseUrl, getLocaleAttributes, getPWADisplayMode, getPublicFields, getTextDirection, int, interpolate, isCompoundAction, isExternalUrlAction, isFlowAction, isLeafNode, isNone, isPublicMarked, isRtl, isSome, isSplitNode, isStackNode, isTabsNode, isUrlLocation, islandContainerAttributes, leaf, 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-JTs2jqVY.mjs";
|
|
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 };
|
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,
|
|
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-BYZq9Jp7.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,4 +1,4 @@
|
|
|
1
|
-
import { $ as IntersectionImpressionObserver, $i as
|
|
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-JTs2jqVY.mjs";
|
|
2
2
|
import { Hono } from "hono";
|
|
3
3
|
import * as _$node_fs0 from "node:fs";
|
|
4
4
|
import { ViteDevServer } from "vite";
|
|
@@ -695,5 +695,5 @@ declare function finesoftFrontViteConfig(options?: FinesoftFrontViteOptions): {
|
|
|
695
695
|
closeBundle(): Promise<void>;
|
|
696
696
|
};
|
|
697
697
|
//#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, LocaleAttributes, LocaleInfo, Logger, Logger as LoggerInterface, LoggerFactory, LruMap, MakeDependenciesOptions, Mapper, MessagesLoader, MessagesLoaderContext, MetricsFieldsProvider, MetricsRecorder, MiddlewareResult, MountEntry, 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, 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, isNone, isPublicMarked, isRtl, isSome, isSplitNode, isStackNode, isTabsNode, isUrlLocation, islandContainerAttributes, leaf, 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 };
|
|
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 };
|
|
699
699
|
//# sourceMappingURL=index.d.mts.map
|