@finesoft/front 0.2.0 → 0.4.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.
@@ -1,2 +1,2 @@
1
- import { $ as RenderMode, $n as BaseLogger, $t as RouteAddOptions, A as IntersectionImpressionObserver, An as DEP_KEYS, At as Translator, B as buildUrl, Bn as TranslationMessages, Bt as ParamsFor, C as PluralRuleProvider, Cn as BasePage, Ct as Framework, D as WithFieldsRecorder, Dn as markPublic, Dt as LocaleAttributes, E as resolvePluralKey, En as isPublicMarked, Et as PrefetchedIntents, F as BrowserContextOptions, Fn as Net, Ft as CompositeLogger, G as PWADisplayMode, Gn as EventRecorder, Gt as NumOptions, H as removeHost, Hn as resolveMessages, Ht as StripOptional, I as ServerContextOptions, In as Storage, It as CompositeLoggerFactory, J as Optional, Jn as MetricsFieldsProvider, Jt as int, K as getPWADisplayMode, Kn as ImpressionEntry, Kt as StrOptions, L as createBrowserContext, Ln as makeDependencies, Lt as ExtractParamNames, M as CompositeEventRecorder, Mn as FeatureFlagsProvider, Mt as shouldLog, N as runAfterLoadGuards, Nn as MakeDependenciesOptions, Nt as ConsoleLogger, O as VoidEventRecorder, On as RequestScopedKey, Ot as LocaleInfo, P as runBeforeLoadGuards, Pn as MetricsRecorder, Pt as ConsoleLoggerFactory, Q as DefineRoutesOptions, Qn as ReportingLoggerOptions, Qt as uuid, R as createServerContext, Rn as MessagesLoader, Rt as InferParams, S as PluralCategory, Sn as BASE_PAGE_FIELDS, St as safeErrorPage, T as interpolate, Tn as getPublicFields, Tt as PrefetchedIntent, U as removeQueryParams, Un as PlatformInfo, Ut as optional, V as getBaseUrl, Vn as resolveConfiguredMessages, Vt as QuerySchemaMap, W as removeScheme, Wn as detectPlatform, Wt as withDefault, X as isSome, Xn as ReportingLogger, Xt as oneOf, Y as isNone, Yn as ReportCallback, Yt as num, Z as LruMap, Zn as ReportingLoggerFactory, Zt as str, _ as getTextDirection, _n as RewriteResult, _r as isFlowAction, _t as ResponseInterceptor, a as BrowserAppConfig, an as StandardResult, ar as Intent, at as mapEach, b as resolveLocaleFromUrl, bn as redirect, bt as BaseShelf, c as registerActionHandlers, cn as runStandard, cr as ActionDispatcher, ct as BaseController, d as registerFlowActionHandler, dn as DenyResult, dr as Action, dt as classifyUrl, en as RouteMatch, er as Logger, et as RouteDefinition, f as ExternalUrlDependencies, fn as MiddlewareResult, fr as CompoundAction, ft as HostGuardError, g as getLocaleAttributes, gn as RedirectResult, gr as isExternalUrlAction, gt as RequestInterceptor, h as SimpleTranslatorOptions, hn as PostLoadContext, hr as isCompoundAction, ht as HttpError, i as History, in as StandardIssue, ir as IntentDispatcher, it as Mapper, j as ConsoleEventRecorder, jn as FeatureFlags, jt as resetFilterCache, k as ImpressionObserverOptions, kn as defineRequestScopedKey, kt as TextDirection, l as FlowActionCallbacks, ln as AfterLoadGuard, lr as ActionHandler, lt as HostCheckResult, m as SimpleTranslator, mn as NextResult, mr as FlowAction, mt as HttpClientConfig, n as deserializeServerData, nn as InferOutput, nr as SecureFetchOptions, nt as route, o as startBrowserApp, on as StandardSchemaV1, or as IntentController, ot as pipe, p as registerExternalUrlHandler, pn as NavigationContext, pr as ExternalUrlAction, pt as HttpClient, q as None, qn as ImpressionObserver, qt as bool, r as tryScroll, rn as ParamSchema, rr as secureFetch, rt as AsyncMapper, s as ActionHandlerDependencies, sn as makeSchema, sr as Container, st as pipeAsync, t as createPrefetchedIntentsFromDom, tn as Router, tr as LoggerFactory, tt as defineRoutes, u as FlowActionDependencies, un as BeforeLoadGuard, ur as ACTION_KINDS, ut as classifyHost, v as isRtl, vn as deny, vr as makeExternalUrlAction, vt as stableStringify, w as englishPlural, wn as FINESOFT_PUBLIC, wt as FrameworkConfig, x as setHtmlLocaleAttributes, xn as rewrite, xt as SafeErrorPageOptions, y as makeLocaleInfo, yn as next, yr as makeFlowAction, yt as BaseItem, z as generateUuid, zn as MessagesLoaderContext, zt as InferQuery } from "./server-data-DQzknR97.mjs";
2
- export { ACTION_KINDS, Action, ActionDispatcher, ActionHandler, type ActionHandlerDependencies, AfterLoadGuard, AsyncMapper, BASE_PAGE_FIELDS, BaseController, BaseItem, BaseLogger, BasePage, BaseShelf, BeforeLoadGuard, type BrowserAppConfig, BrowserContextOptions, CompositeEventRecorder, CompositeLogger, CompositeLoggerFactory, CompoundAction, ConsoleEventRecorder, ConsoleLogger, ConsoleLoggerFactory, Container, DEP_KEYS, DefineRoutesOptions, DenyResult, EventRecorder, ExternalUrlAction, type ExternalUrlDependencies, ExtractParamNames, FINESOFT_PUBLIC, FeatureFlags, FeatureFlagsProvider, FlowAction, type FlowActionCallbacks, type FlowActionDependencies, Framework, FrameworkConfig, History, HostCheckResult, HostGuardError, HttpClient, HttpClientConfig, HttpError, ImpressionEntry, ImpressionObserver, ImpressionObserverOptions, InferOutput, InferParams, InferQuery, Intent, IntentController, IntentDispatcher, IntersectionImpressionObserver, LocaleAttributes, LocaleInfo, Logger, Logger as LoggerInterface, LoggerFactory, LruMap, MakeDependenciesOptions, Mapper, MessagesLoader, MessagesLoaderContext, MetricsFieldsProvider, MetricsRecorder, MiddlewareResult, NavigationContext, Net, NextResult, None, NumOptions, Optional, PWADisplayMode, ParamSchema, ParamsFor, PlatformInfo, PluralCategory, PluralRuleProvider, PostLoadContext, PrefetchedIntent, PrefetchedIntents, QuerySchemaMap, RedirectResult, RenderMode, ReportCallback, ReportingLogger, ReportingLoggerFactory, ReportingLoggerOptions, RequestInterceptor, RequestScopedKey, ResponseInterceptor, RewriteResult, RouteAddOptions, RouteDefinition, RouteMatch, Router, SafeErrorPageOptions, SecureFetchOptions, ServerContextOptions, SimpleTranslator, SimpleTranslatorOptions, StandardIssue, StandardResult, StandardSchemaV1, Storage, StrOptions, StripOptional, TextDirection, TranslationMessages, Translator, VoidEventRecorder, WithFieldsRecorder, bool, buildUrl, classifyHost, classifyUrl, createBrowserContext, createPrefetchedIntentsFromDom, createServerContext, defineRequestScopedKey, defineRoutes, deny, deserializeServerData, detectPlatform, englishPlural, generateUuid, getBaseUrl, getLocaleAttributes, getPWADisplayMode, getPublicFields, getTextDirection, int, interpolate, isCompoundAction, isExternalUrlAction, isFlowAction, isNone, isPublicMarked, isRtl, isSome, makeDependencies, makeExternalUrlAction, makeFlowAction, makeLocaleInfo, makeSchema, mapEach, markPublic, next, num, oneOf, optional, pipe, pipeAsync, redirect, registerActionHandlers, registerExternalUrlHandler, registerFlowActionHandler, removeHost, removeQueryParams, removeScheme, resetFilterCache, resolveConfiguredMessages, resolveLocaleFromUrl, resolveMessages, resolvePluralKey, rewrite, route, runAfterLoadGuards, runBeforeLoadGuards, runStandard, safeErrorPage, secureFetch, setHtmlLocaleAttributes, shouldLog, stableStringify, startBrowserApp, str, tryScroll, uuid, withDefault };
1
+ import { $ as IntersectionImpressionObserver, $i as FeatureFlagsProvider, $n as isLeafNode, $r as ConsoleLogger, $t as HydrateOperation, A as ActionHandlerDependencies, Aa as ActionHandler, Ai as AfterLoadGuard, An as SerializedStack, Ar as classifyHost, At as NavigationScopedState, B as getTextDirection, Ba as makeFlowAction, Bi as next, Bn as popTo, Br as BaseShelf, Bt as SessionUrlLocation, C as SessionBridgeOptions, Ca as SecureFetchOptions, Ci as InferOutput, Cn as createFullStateCodec, Cr as AsyncMapper, Ct as createUrlSessionAdapter, D as NavigationBridgeDependencies, Da as IntentController, Di as StandardSchemaV1, Dn as SerializedNavigation, Dr as pipeAsync, Dt as sessionEntryKey, E as defaultShouldRestore, Ea as Intent, Ei as StandardResult, En as SerializedLeaf, Er as pipe, Et as createNavigationScopedState, F as ExternalUrlDependencies, Fa as FlowAction, Fi as NextResult, Fn as collectAllLeaves, Fr as HttpError, Ft as SessionNavigationAdapter, G as PluralCategory, Gi as FINESOFT_PUBLIC, Gn as selectColumn, Gr as PrefetchedIntent, Gt as defineRoutes, H as makeLocaleInfo, Hi as rewrite, Hn as push, Hr as safeErrorPage, Ht as DefineRoutesOptions, I as registerExternalUrlHandler, Ia as isCompoundAction, Ii as PostLoadContext, In as collectVisibleDestinations, Ir as RequestInterceptor, It as SessionSnapshot, J as interpolate, Ji as markPublic, Jn as visibleSplitColumns, Jr as LocaleInfo, Jt as NavigationBrowserConfig, K as PluralRuleProvider, Ki as getPublicFields, Kn as selectTab, Kr as PrefetchedIntents, Kt as route, L as SimpleTranslator, La as isExternalUrlAction, Li as RedirectResult, Ln as findNearestStack, Lr as ResponseInterceptor, Lt as SessionStateProvider, M as FlowActionCallbacks, Ma as Action, Mi as DenyResult, Mn as deserializeNavigation, Mr as HostGuardError, Mt as SESSION_DEFAULT_VERSION, N as FlowActionDependencies, Na as CompoundAction, Ni as MiddlewareResult, Nn as serializeNavigation, Nr as HttpClient, Nt as SessionError, O as NavigationHandle, Oa as Container, Oi as makeSchema, On as SerializedSplit, Or as BaseController, Ot as decodeSnapshot, P as registerFlowActionHandler, Pa as ExternalUrlAction, Pi as NavigationContext, Pn as serializeNavigationStable, Pr as HttpClientConfig, Pt as SessionErrorContext, Q as ImpressionObserverOptions, Qi as FeatureFlags, Qn as TabsInit, Qr as shouldLog, Qt as defineNavigation, R as SimpleTranslatorOptions, Ra as isFlowAction, Ri as RewriteResult, Rn as findNode, Rr as stableStringify, Rt as SessionStore, S as SESSION_DEFAULT_DEBOUNCE_MS, Sa as LoggerFactory, Si as Router, Sn as createFlatStackCodec, Sr as TabsNode, St as createNavigationSessionAdapter, T as createSessionBridge, Ta as IntentDispatcher, Ti as StandardIssue, Tn as encodeNavigationTreeParam, Tr as mapEach, Tt as collectLeafKeys, U as resolveLocaleFromUrl, Ui as BASE_PAGE_FIELDS, Un as replaceTop, Ur as Framework, Ut as RenderMode, V as isRtl, Vi as redirect, Vn as popToRoot, Vr as SafeErrorPageOptions, Vt as isUrlLocation, W as setHtmlLocaleAttributes, Wi as BasePage, Wn as resolveActivePath, Wr as FrameworkConfig, Wt as RouteDefinition, X as WithFieldsRecorder, Xi as defineRequestScopedKey, Xn as islandContainerAttributes, Xr as Translator, Xt as NavigationInitial, Y as resolvePluralKey, Yi as RequestScopedKey, Yn as ResolvedEntry, Yr as TextDirection, Yt as NavigationDefinition, Z as VoidEventRecorder, Zi as DEP_KEYS, Zn as SplitColumnInit, Zr as resetFilterCache, Zt as NavigationSSRDefinition, _ as IslandOrchestratorOptions, _a as ReportingLogger, _i as str, _n as DEFAULT_NAV_PARAM, _r as SPLIT_VISIBILITIES, _t as Optional, a as DomRestore, aa as MessagesLoader, ai as InferQuery, an as NavigationOpKind, ar as stack, at as ServerContextOptions, b as AppHandle, ba as BaseLogger, bi as RouteAddOptions, bn as NavigationRouterLike, br as SplitVisibility, bt as LruMap, c as createWebStorage, ca as resolveConfiguredMessages, ci as StripOptional, cn as PopToOperation, cr as NAVIGATION_NODE_KINDS, ct as generateUuid, d as BrowserAppConfig, da as detectPlatform, di as NumOptions, dn as PushOptions, dr as NavigationNodeKind, dt as removeHost, ea as MakeDependenciesOptions, ei as ConsoleLoggerFactory, en as NAVIGATION_OP_KINDS, er as isSplitNode, et as ConsoleEventRecorder, f as BrowserNavigationConfig, fa as EventRecorder, fi as StrOptions, fn as ReplaceTopOperation, fr as NavigationPath, ft as removeQueryParams, g as IslandOrchestrator, ga as ReportCallback, gi as oneOf, gn as createNavigationController, gr as ResolvedDestination, gt as None, h as IslandHandle, ha as MetricsFieldsProvider, hi as num, hn as SetVisibilityOperation, hr as Page, ht as getPWADisplayMode, i as History, ia as makeDependencies, ii as InferParams, in as NavigationDispatchContext, ir as split, it as BrowserContextOptions, j as registerActionHandlers, ja as ACTION_KINDS, ji as BeforeLoadGuard, jn as SerializedTabs, jr as classifyUrl, jt as SESSION_DEFAULT_KEY, k as createNavigationBridge, ka as ActionDispatcher, ki as runStandard, kn as SerializedSplitColumn, kr as HostCheckResult, kt as encodeSnapshot, l as IslandsShell, la as resolveMessages, li as optional, ln as PopToRootOperation, lr as NavigationError, lt as buildUrl, m as startBrowserApp, ma as ImpressionObserver, mi as int, mn as SelectTabOperation, mr as NavigationSnapshot, mt as PWADisplayMode, n as deserializeServerData, na as Net, ni as CompositeLoggerFactory, nn as NavigationController, nr as isTabsNode, nt as runAfterLoadGuards, o as DomRestoreOptions, oa as MessagesLoaderContext, oi as ParamsFor, on as NavigationOperation, or as tabs, ot as createBrowserContext, p as BrowserSessionConfig, pa as ImpressionEntry, pi as bool, pn as SelectColumnOperation, pr as NavigationPathStep, pt as removeScheme, q as englishPlural, qi as isPublicMarked, qn as setVisibility, qr as LocaleAttributes, qt as DefineNavigationOptions, r as tryScroll, ra as Storage, ri as ExtractParamNames, rn as NavigationControllerOptions, rr as leaf, rt as runBeforeLoadGuards, s as createDomRestore, sa as TranslationMessages, si as QuerySchemaMap, sn as PopOperation, sr as LeafNode, st as createServerContext, t as createPrefetchedIntentsFromDom, ta as MetricsRecorder, ti as CompositeLogger, tn as NavigationContextInput, tr as isStackNode, tt as CompositeEventRecorder, u as resolveIslandsShell, ua as PlatformInfo, ui as withDefault, un as PushOperation, ur as NavigationNode, ut as getBaseUrl, v as MountEntry, va as ReportingLoggerFactory, vi as uuid, vn as FullStateCodecOptions, vr as SplitColumn, vt as isNone, w as SessionHandle, wa as secureFetch, wi as ParamSchema, wn as decodeNavigationTreeParam, wr as Mapper, wt as createSessionStore, x as createAppHandle, xa as Logger, xi as RouteMatch, xn as createActiveLeafCodec, xr as StackNode, xt as UrlAdapterOptions, y as createIslandOrchestrator, ya as ReportingLoggerOptions, yi as RouteParams, yn as NavigationCodec, yr as SplitNode, yt as isSome, z as getLocaleAttributes, za as makeExternalUrlAction, zi as deny, zn as pop, zr as BaseItem, zt as SessionStoreOptions } from "./browser-DMw76sEo.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, 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 };
package/dist/browser.mjs CHANGED
@@ -1 +1 @@
1
- import{$ as e,A as t,At as n,B as r,Bt as i,C as a,Ct as o,D as s,Dt as c,E as l,Et as u,F as d,Ft as f,G as p,H as m,Ht as h,I as g,It as _,J as v,K as y,L as b,Lt as x,M as S,Mt as C,N as w,Nt as T,O as E,Ot as D,P as O,Pt as k,Q as A,R as j,Rt as M,S as N,St as P,T as F,Tt as I,U as L,Ut as R,V as z,Vt as B,W as V,X as H,Y as U,Z as W,_ as G,_t as K,a as q,at as J,b as Y,bt as X,c as Z,ct as Q,d as $,dt as ee,et as te,f as ne,ft as re,g as ie,gt as ae,h as oe,ht as se,i as ce,it as le,j as ue,jt as de,k as fe,kt as pe,l as me,lt as he,m as ge,mt as _e,n as ve,nt as ye,o as be,ot as xe,p as Se,pt as Ce,q as we,r as Te,rt as Ee,s as De,st as Oe,t as ke,tt as Ae,u as je,ut as Me,v as Ne,vt as Pe,w as Fe,wt as Ie,x as Le,xt as Re,y as ze,yt as Be,z as Ve,zt as He}from"./start-app-S4DH-40i.mjs";export{M as ACTION_KINDS,x as ActionDispatcher,g as BASE_PAGE_FIELDS,O as BaseController,_e as BaseLogger,ne as CompositeEventRecorder,se as CompositeLogger,ae as CompositeLoggerFactory,Oe as ConsoleEventRecorder,Me as ConsoleLogger,ee as ConsoleLoggerFactory,f as Container,le as DEP_KEYS,b as FINESOFT_PUBLIC,z as Framework,be as History,n as HostGuardError,de as HttpClient,C as HttpError,_ as IntentDispatcher,$ as IntersectionImpressionObserver,E as LruMap,m as PrefetchedIntents,Q as ReportingLogger,he as ReportingLoggerFactory,te as Router,K as SimpleTranslator,je as VoidEventRecorder,me as WithFieldsRecorder,v as bool,Y as buildUrl,T as classifyHost,k as classifyUrl,G as createBrowserContext,ve as createPrefetchedIntentsFromDom,Ne as createServerContext,Ee as defineRequestScopedKey,fe as defineRoutes,Se as deny,Te as deserializeServerData,xe as detectPlatform,Pe as englishPlural,ze as generateUuid,Le as getBaseUrl,o as getLocaleAttributes,F as getPWADisplayMode,j as getPublicFields,Ie as getTextDirection,U as int,Be as interpolate,He as isCompoundAction,i as isExternalUrlAction,B as isFlowAction,l as isNone,Ve as isPublicMarked,I as isRtl,s as isSome,J as makeDependencies,h as makeExternalUrlAction,R as makeFlowAction,u as makeLocaleInfo,Ae as makeSchema,ue as mapEach,r as markPublic,ge as next,H as num,W as oneOf,y as optional,S as pipe,w as pipeAsync,oe as redirect,ce as registerActionHandlers,Z as registerExternalUrlHandler,q as registerFlowActionHandler,N as removeHost,a as removeQueryParams,Fe as removeScheme,re as resetFilterCache,Re as resolveConfiguredMessages,c as resolveLocaleFromUrl,P as resolveMessages,X as resolvePluralKey,ie as rewrite,t as route,V as runAfterLoadGuards,p as runBeforeLoadGuards,ye as runStandard,d as safeErrorPage,pe as secureFetch,D as setHtmlLocaleAttributes,Ce as shouldLog,L as stableStringify,ke as startBrowserApp,A as str,De as tryScroll,e as uuid,we as withDefault};
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,Xt as _e,Y as ve,Yt as ye,Z as be,Zt as xe,_ as Se,_n as Ce,_t as we,a as Te,an as Ee,at as De,b as Oe,bn as ke,bt as Ae,c as je,cn as Me,ct as Ne,d as Pe,dn as Fe,dt as Ie,en as Le,et as Re,f as ze,fn as Be,ft as Ve,g as He,gn as Ue,gt as We,h as Ge,hn as Ke,ht as qe,i as Je,in as Ye,it as Xe,j as Ze,jn as Qe,jt as $e,k as et,kn as tt,kt as nt,l as rt,ln as it,lt as at,m as ot,mn as st,mt as ct,n as lt,nn as ut,nt as dt,o as ft,on as pt,ot as mt,p as ht,pn as gt,pt as _t,q as vt,qn as yt,qt as bt,r as xt,rn as St,rt as Ct,s as wt,sn as Tt,st as Et,t as Dt,tn as Ot,tt as kt,u as At,un as jt,ut as Mt,v as Nt,vn as Pt,vt as Ft,w as It,wn as Lt,wt as Rt,x as zt,xn as Bt,xt as Vt,y as Ht,yn as Ut,yt as Wt,z as Gt,zn as Kt,zt as qt}from"./browser-BIetJHp_.mjs";export{ce as ACTION_KINDS,w as ActionDispatcher,fe as BASE_PAGE_FIELDS,qt as BaseController,Ut as BaseLogger,zt as CompositeEventRecorder,ke as CompositeLogger,Bt as CompositeLoggerFactory,Be as ConsoleEventRecorder,Ke as ConsoleLogger,Ue as ConsoleLoggerFactory,o as Container,kt as DEFAULT_NAV_PARAM,it as DEP_KEYS,T as FINESOFT_PUBLIC,P as Framework,Ge as History,v as HostGuardError,D as HttpClient,I as HttpError,de as IntentDispatcher,Oe as IntersectionImpressionObserver,F as LruMap,U as NAVIGATION_NODE_KINDS,e as NAVIGATION_OP_KINDS,Y as NavigationError,bt as PrefetchedIntents,gt as ReportingLogger,st as ReportingLoggerFactory,Ee as Router,Je as SESSION_DEFAULT_DEBOUNCE_MS,M as SESSION_DEFAULT_KEY,vt as SESSION_DEFAULT_VERSION,y as SPLIT_VISIBILITIES,k as SessionError,ne as SimpleTranslator,Ht as VoidEventRecorder,Nt as WithFieldsRecorder,t as bool,et as buildUrl,$ as classifyHost,Kt as classifyUrl,Mt as collectAllLeaves,ue as collectLeafKeys,Ie as collectVisibleDestinations,dt as createActiveLeafCodec,ze as createAppHandle,m as createBrowserContext,Pe as createDomRestore,Ct as createFlatStackCodec,Xe as createFullStateCodec,At as createIslandOrchestrator,rt as createNavigationBridge,Re as createNavigationController,C as createNavigationScopedState,Q as createNavigationSessionAdapter,wt as createPrefetchedIntentsFromDom,d as createServerContext,Te as createSessionBridge,a as createSessionStore,Gt as createUrlSessionAdapter,xt as createWebStorage,De as decodeNavigationTreeParam,pe as decodeSnapshot,ft as defaultShouldRestore,X as defineNavigation,Me as defineRequestScopedKey,ge as defineRoutes,te as deny,Et as deserializeNavigation,je as deserializeServerData,Fe as detectPlatform,mt as encodeNavigationTreeParam,b as encodeSnapshot,l as englishPlural,Ve as findNearestStack,_t as findNode,W as generateUuid,n as getBaseUrl,G as getLocaleAttributes,q as getPWADisplayMode,le as getPublicFields,tt as getTextDirection,Le as int,Lt as interpolate,me as isCompoundAction,x as isExternalUrlAction,N as isFlowAction,oe as isLeafNode,_ as isNone,he as isPublicMarked,r as isRtl,E as isSome,g as isSplitNode,p as isStackNode,K as isTabsNode,ve as isUrlLocation,Rt as islandContainerAttributes,nt as leaf,jt as makeDependencies,yt as makeExternalUrlAction,A as makeFlowAction,Qe as makeLocaleInfo,pt as makeSchema,O as mapEach,S as markPublic,c as next,Ot as num,ut as oneOf,xe as optional,L as pipe,ee as pipeAsync,ct as pop,qe as popTo,We as popToRoot,we as push,It as redirect,ht as registerActionHandlers,Se as registerExternalUrlHandler,ot as registerFlowActionHandler,Ze as removeHost,R as removeQueryParams,V as removeScheme,Ft as replaceTop,Ce as resetFilterCache,Wt as resolveActivePath,h as resolveConfiguredMessages,Dt as resolveIslandsShell,z as resolveLocaleFromUrl,f as resolveMessages,ae as resolvePluralKey,ie as rewrite,be as route,ye as runAfterLoadGuards,_e as runBeforeLoadGuards,Tt as runStandard,s as safeErrorPage,J as secureFetch,Ae as selectColumn,Vt as selectTab,Ne as serializeNavigation,at as serializeNavigationStable,se as sessionEntryKey,H as setHtmlLocaleAttributes,re as setVisibility,Pt as shouldLog,i as split,j as stableStringify,$e as stack,lt as startBrowserApp,St as str,B as tabs,He as tryScroll,Ye as uuid,u as visibleSplitColumns,Z as withDefault};
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as RenderMode, $n as BaseLogger, $t as RouteAddOptions, A as IntersectionImpressionObserver, An as DEP_KEYS, At as Translator, B as buildUrl, Bn as TranslationMessages, Bt as ParamsFor, C as PluralRuleProvider, Cn as BasePage, Ct as Framework, D as WithFieldsRecorder, Dn as markPublic, Dt as LocaleAttributes, E as resolvePluralKey, En as isPublicMarked, Et as PrefetchedIntents, F as BrowserContextOptions, Fn as Net, Ft as CompositeLogger, G as PWADisplayMode, Gn as EventRecorder, Gt as NumOptions, H as removeHost, Hn as resolveMessages, Ht as StripOptional, I as ServerContextOptions, In as Storage, It as CompositeLoggerFactory, J as Optional, Jn as MetricsFieldsProvider, Jt as int, K as getPWADisplayMode, Kn as ImpressionEntry, Kt as StrOptions, L as createBrowserContext, Ln as makeDependencies, Lt as ExtractParamNames, M as CompositeEventRecorder, Mn as FeatureFlagsProvider, Mt as shouldLog, N as runAfterLoadGuards, Nn as MakeDependenciesOptions, Nt as ConsoleLogger, O as VoidEventRecorder, On as RequestScopedKey, Ot as LocaleInfo, P as runBeforeLoadGuards, Pn as MetricsRecorder, Pt as ConsoleLoggerFactory, Q as DefineRoutesOptions, Qn as ReportingLoggerOptions, Qt as uuid, R as createServerContext, Rn as MessagesLoader, Rt as InferParams, S as PluralCategory, Sn as BASE_PAGE_FIELDS, St as safeErrorPage, T as interpolate, Tn as getPublicFields, Tt as PrefetchedIntent, U as removeQueryParams, Un as PlatformInfo, Ut as optional, V as getBaseUrl, Vn as resolveConfiguredMessages, Vt as QuerySchemaMap, W as removeScheme, Wn as detectPlatform, Wt as withDefault, X as isSome, Xn as ReportingLogger, Xt as oneOf, Y as isNone, Yn as ReportCallback, Yt as num, Z as LruMap, Zn as ReportingLoggerFactory, Zt as str, _ as getTextDirection, _n as RewriteResult, _r as isFlowAction, _t as ResponseInterceptor, a as BrowserAppConfig, an as StandardResult, ar as Intent, at as mapEach, b as resolveLocaleFromUrl, bn as redirect, bt as BaseShelf, c as registerActionHandlers, cn as runStandard, cr as ActionDispatcher, ct as BaseController, d as registerFlowActionHandler, dn as DenyResult, dr as Action, dt as classifyUrl, en as RouteMatch, er as Logger, et as RouteDefinition, f as ExternalUrlDependencies, fn as MiddlewareResult, fr as CompoundAction, ft as HostGuardError, g as getLocaleAttributes, gn as RedirectResult, gr as isExternalUrlAction, gt as RequestInterceptor, h as SimpleTranslatorOptions, hn as PostLoadContext, hr as isCompoundAction, ht as HttpError, i as History, in as StandardIssue, ir as IntentDispatcher, it as Mapper, j as ConsoleEventRecorder, jn as FeatureFlags, jt as resetFilterCache, k as ImpressionObserverOptions, kn as defineRequestScopedKey, kt as TextDirection, l as FlowActionCallbacks, ln as AfterLoadGuard, lr as ActionHandler, lt as HostCheckResult, m as SimpleTranslator, mn as NextResult, mr as FlowAction, mt as HttpClientConfig, n as deserializeServerData, nn as InferOutput, nr as SecureFetchOptions, nt as route, o as startBrowserApp, on as StandardSchemaV1, or as IntentController, ot as pipe, p as registerExternalUrlHandler, pn as NavigationContext, pr as ExternalUrlAction, pt as HttpClient, q as None, qn as ImpressionObserver, qt as bool, r as tryScroll, rn as ParamSchema, rr as secureFetch, rt as AsyncMapper, s as ActionHandlerDependencies, sn as makeSchema, sr as Container, st as pipeAsync, t as createPrefetchedIntentsFromDom, tn as Router, tr as LoggerFactory, tt as defineRoutes, u as FlowActionDependencies, un as BeforeLoadGuard, ur as ACTION_KINDS, ut as classifyHost, v as isRtl, vn as deny, vr as makeExternalUrlAction, vt as stableStringify, w as englishPlural, wn as FINESOFT_PUBLIC, wt as FrameworkConfig, x as setHtmlLocaleAttributes, xn as rewrite, xt as SafeErrorPageOptions, y as makeLocaleInfo, yn as next, yr as makeFlowAction, yt as BaseItem, z as generateUuid, zn as MessagesLoaderContext, zt as InferQuery } from "./server-data-DQzknR97.mjs";
1
+ import { $ as IntersectionImpressionObserver, $i as FeatureFlagsProvider, $n as isLeafNode, $r as ConsoleLogger, $t as HydrateOperation, A as ActionHandlerDependencies, Aa as ActionHandler, Ai as AfterLoadGuard, An as SerializedStack, Ar as classifyHost, At as NavigationScopedState, B as getTextDirection, Ba as makeFlowAction, Bi as next, Bn as popTo, Br as BaseShelf, Bt as SessionUrlLocation, C as SessionBridgeOptions, Ca as SecureFetchOptions, Ci as InferOutput, Cn as createFullStateCodec, Cr as AsyncMapper, Ct as createUrlSessionAdapter, D as NavigationBridgeDependencies, Da as IntentController, Di as StandardSchemaV1, Dn as SerializedNavigation, Dr as pipeAsync, Dt as sessionEntryKey, E as defaultShouldRestore, Ea as Intent, Ei as StandardResult, En as SerializedLeaf, Er as pipe, Et as createNavigationScopedState, F as ExternalUrlDependencies, Fa as FlowAction, Fi as NextResult, Fn as collectAllLeaves, Fr as HttpError, Ft as SessionNavigationAdapter, G as PluralCategory, Gi as FINESOFT_PUBLIC, Gn as selectColumn, Gr as PrefetchedIntent, Gt as defineRoutes, H as makeLocaleInfo, Hi as rewrite, Hn as push, Hr as safeErrorPage, Ht as DefineRoutesOptions, I as registerExternalUrlHandler, Ia as isCompoundAction, Ii as PostLoadContext, In as collectVisibleDestinations, Ir as RequestInterceptor, It as SessionSnapshot, J as interpolate, Ji as markPublic, Jn as visibleSplitColumns, Jr as LocaleInfo, Jt as NavigationBrowserConfig, K as PluralRuleProvider, Ki as getPublicFields, Kn as selectTab, Kr as PrefetchedIntents, Kt as route, L as SimpleTranslator, La as isExternalUrlAction, Li as RedirectResult, Ln as findNearestStack, Lr as ResponseInterceptor, Lt as SessionStateProvider, M as FlowActionCallbacks, Ma as Action, Mi as DenyResult, Mn as deserializeNavigation, Mr as HostGuardError, Mt as SESSION_DEFAULT_VERSION, N as FlowActionDependencies, Na as CompoundAction, Ni as MiddlewareResult, Nn as serializeNavigation, Nr as HttpClient, Nt as SessionError, O as NavigationHandle, Oa as Container, Oi as makeSchema, On as SerializedSplit, Or as BaseController, Ot as decodeSnapshot, P as registerFlowActionHandler, Pa as ExternalUrlAction, Pi as NavigationContext, Pn as serializeNavigationStable, Pr as HttpClientConfig, Pt as SessionErrorContext, Q as ImpressionObserverOptions, Qi as FeatureFlags, Qn as TabsInit, Qr as shouldLog, Qt as defineNavigation, R as SimpleTranslatorOptions, Ra as isFlowAction, Ri as RewriteResult, Rn as findNode, Rr as stableStringify, Rt as SessionStore, S as SESSION_DEFAULT_DEBOUNCE_MS, Sa as LoggerFactory, Si as Router, Sn as createFlatStackCodec, Sr as TabsNode, St as createNavigationSessionAdapter, T as createSessionBridge, Ta as IntentDispatcher, Ti as StandardIssue, Tn as encodeNavigationTreeParam, Tr as mapEach, Tt as collectLeafKeys, U as resolveLocaleFromUrl, Ui as BASE_PAGE_FIELDS, Un as replaceTop, Ur as Framework, Ut as RenderMode, V as isRtl, Vi as redirect, Vn as popToRoot, Vr as SafeErrorPageOptions, Vt as isUrlLocation, W as setHtmlLocaleAttributes, Wi as BasePage, Wn as resolveActivePath, Wr as FrameworkConfig, Wt as RouteDefinition, X as WithFieldsRecorder, Xi as defineRequestScopedKey, Xn as islandContainerAttributes, Xr as Translator, Xt as NavigationInitial, Y as resolvePluralKey, Yi as RequestScopedKey, Yn as ResolvedEntry, Yr as TextDirection, Yt as NavigationDefinition, Z as VoidEventRecorder, Zi as DEP_KEYS, Zn as SplitColumnInit, Zr as resetFilterCache, Zt as NavigationSSRDefinition, _ as IslandOrchestratorOptions, _a as ReportingLogger, _i as str, _n as DEFAULT_NAV_PARAM, _r as SPLIT_VISIBILITIES, _t as Optional, a as DomRestore, aa as MessagesLoader, ai as InferQuery, an as NavigationOpKind, ar as stack, at as ServerContextOptions, b as AppHandle, ba as BaseLogger, bi as RouteAddOptions, bn as NavigationRouterLike, br as SplitVisibility, bt as LruMap, c as createWebStorage, ca as resolveConfiguredMessages, ci as StripOptional, cn as PopToOperation, cr as NAVIGATION_NODE_KINDS, ct as generateUuid, d as BrowserAppConfig, da as detectPlatform, di as NumOptions, dn as PushOptions, dr as NavigationNodeKind, dt as removeHost, ea as MakeDependenciesOptions, ei as ConsoleLoggerFactory, en as NAVIGATION_OP_KINDS, er as isSplitNode, et as ConsoleEventRecorder, f as BrowserNavigationConfig, fa as EventRecorder, fi as StrOptions, fn as ReplaceTopOperation, fr as NavigationPath, ft as removeQueryParams, g as IslandOrchestrator, ga as ReportCallback, gi as oneOf, gn as createNavigationController, gr as ResolvedDestination, gt as None, h as IslandHandle, ha as MetricsFieldsProvider, hi as num, hn as SetVisibilityOperation, hr as Page, ht as getPWADisplayMode, i as History, ia as makeDependencies, ii as InferParams, in as NavigationDispatchContext, ir as split, it as BrowserContextOptions, j as registerActionHandlers, ja as ACTION_KINDS, ji as BeforeLoadGuard, jn as SerializedTabs, jr as classifyUrl, jt as SESSION_DEFAULT_KEY, k as createNavigationBridge, ka as ActionDispatcher, ki as runStandard, kn as SerializedSplitColumn, kr as HostCheckResult, kt as encodeSnapshot, l as IslandsShell, la as resolveMessages, li as optional, ln as PopToRootOperation, lr as NavigationError, lt as buildUrl, m as startBrowserApp, ma as ImpressionObserver, mi as int, mn as SelectTabOperation, mr as NavigationSnapshot, mt as PWADisplayMode, n as deserializeServerData, na as Net, ni as CompositeLoggerFactory, nn as NavigationController, nr as isTabsNode, nt as runAfterLoadGuards, o as DomRestoreOptions, oa as MessagesLoaderContext, oi as ParamsFor, on as NavigationOperation, or as tabs, ot as createBrowserContext, p as BrowserSessionConfig, pa as ImpressionEntry, pi as bool, pn as SelectColumnOperation, pr as NavigationPathStep, pt as removeScheme, q as englishPlural, qi as isPublicMarked, qn as setVisibility, qr as LocaleAttributes, qt as DefineNavigationOptions, r as tryScroll, ra as Storage, ri as ExtractParamNames, rn as NavigationControllerOptions, rr as leaf, rt as runBeforeLoadGuards, s as createDomRestore, sa as TranslationMessages, si as QuerySchemaMap, sn as PopOperation, sr as LeafNode, st as createServerContext, t as createPrefetchedIntentsFromDom, ta as MetricsRecorder, ti as CompositeLogger, tn as NavigationContextInput, tr as isStackNode, tt as CompositeEventRecorder, u as resolveIslandsShell, ua as PlatformInfo, ui as withDefault, un as PushOperation, ur as NavigationNode, ut as getBaseUrl, v as MountEntry, va as ReportingLoggerFactory, vi as uuid, vn as FullStateCodecOptions, vr as SplitColumn, vt as isNone, w as SessionHandle, wa as secureFetch, wi as ParamSchema, wn as decodeNavigationTreeParam, wr as Mapper, wt as createSessionStore, x as createAppHandle, xa as Logger, xi as RouteMatch, xn as createActiveLeafCodec, xr as StackNode, xt as UrlAdapterOptions, y as createIslandOrchestrator, ya as ReportingLoggerOptions, yi as RouteParams, yn as NavigationCodec, yr as SplitNode, yt as isSome, z as getLocaleAttributes, za as makeExternalUrlAction, zi as deny, zn as pop, zr as BaseItem, zt as SessionStoreOptions } from "./browser-DMw76sEo.mjs";
2
2
  import { Hono } from "hono";
3
3
  import * as _$node_fs0 from "node:fs";
4
4
  import { ViteDevServer } from "vite";
@@ -136,6 +136,144 @@ declare function injectCSRShell(template: string, locale?: {
136
136
  dir: string;
137
137
  }): string;
138
138
  //#endregion
139
+ //#region ../ssr/src/navigation.d.ts
140
+ /**
141
+ * 哨兵 intent id —— 用来在 `serverData` 里夹带序列化的导航树。
142
+ *
143
+ * 取一个真实路由绝不会产出的保留 id(带 `@finesoft/` 前缀),因此不会与任何应用
144
+ * intent 撞键;浏览器侧据此从预取数据中定位并剥除该条目。
145
+ */
146
+ declare const NAVIGATION_TREE_INTENT_ID = "@finesoft/navigation-tree";
147
+ /** 哨兵条目的 data 形态:序列化后的导航树 + 一个判别标记。 */
148
+ interface SerializedNavigationTreePayload {
149
+ /** 判别标记,配合 `NAVIGATION_TREE_INTENT_ID` 双重确认这是导航哨兵。 */
150
+ readonly __finesoftNavigationTree: true;
151
+ /** 序列化后的导航树(`deserializeNavigation` 可无损还原)。 */
152
+ readonly tree: SerializedNavigation;
153
+ }
154
+ /**
155
+ * 应用声明的导航结构(SSR 侧)。
156
+ *
157
+ * - `codec`:把 URL 解析为初始树(带 `__nav` 结构化覆盖时深链还原整棵树)。
158
+ * - `initial`:可选的初始树工厂——codec 无覆盖、且应用想在无深链参数时也展示多区域骨架
159
+ * (如默认两列 split / 默认 tabs)时提供。不提供则回退「URL → 单 LeafNode」(今天的单页)。
160
+ * - `beforeLoad` / `afterLoad`:目标级守卫,由控制器对主目标执行(叠加在全局/路由守卫外)。
161
+ */
162
+ interface SSRNavigationDefinition {
163
+ /** URL ⇄ 树 的编解码器(调用方在 bootstrap 决定,缺省常用 `createActiveLeafCodec`)。 */
164
+ readonly codec: NavigationCodec;
165
+ /** 可选初始树工厂:codec 无法从 URL 还原结构时,用它产出默认结构骨架。 */
166
+ readonly initial?: (url: string) => NavigationNode | undefined;
167
+ /** 目标级 beforeLoad 守卫。 */
168
+ readonly beforeLoad?: readonly BeforeLoadGuard[];
169
+ /** 目标级 afterLoad 守卫。 */
170
+ readonly afterLoad?: readonly AfterLoadGuard[];
171
+ }
172
+ /**
173
+ * 导航 SSR 渲染选项。
174
+ *
175
+ * 在 `ssrRender` 的基础上多了一个必填 `navigation` 字段,承载应用声明的导航结构。
176
+ * 其余字段语义与单页 SSR 完全一致。
177
+ */
178
+ interface SSRRenderNavigationOptions {
179
+ /** 请求 URL */
180
+ readonly url: string;
181
+ /** Framework 配置(含路由注册等) */
182
+ readonly frameworkConfig: FrameworkConfig;
183
+ /** 注册 controllers 和路由的引导函数 */
184
+ readonly bootstrap: (framework: Framework) => void;
185
+ /** 获取错误页面 */
186
+ readonly getErrorPage: (status: number, message: string) => BasePage;
187
+ /**
188
+ * 应用层渲染函数。
189
+ *
190
+ * 第一个参数是「主目标」页面(激活叶子的解析结果),与单页 SSR 的 `renderApp` 形态兼容;
191
+ * 完整的多区域快照通过第三个参数 `snapshot` 传入,应用可据此渲染 tabs / split 等多区域布局。
192
+ */
193
+ readonly renderApp: (page: BasePage, framework: Framework, snapshot: NavigationSnapshot) => SSRAppResult | Promise<SSRAppResult>;
194
+ /** 导航定义(codec + 目标级守卫 + 可选初始骨架)。 */
195
+ readonly navigation: SSRNavigationDefinition;
196
+ /** 可选的 SSR 请求上下文(如自定义 fetch) */
197
+ readonly ssrContext?: SSRContext;
198
+ /** 解析请求 locale 的回调(返回 lang + dir 用于 <html> 属性) */
199
+ readonly resolveLocale?: (url: string, request?: Request) => {
200
+ lang: string;
201
+ dir: string;
202
+ } | undefined;
203
+ /** 异步加载当前 locale 的翻译字典 */
204
+ readonly loadMessages?: MessagesLoader;
205
+ }
206
+ /** 导航 SSR 渲染结果(在 `SSRRenderResult` 基础上附带最终导航快照)。 */
207
+ interface SSRRenderNavigationResult {
208
+ html: string;
209
+ head: string;
210
+ css: string;
211
+ /** 每个可见目标一条 `{ intent, data: page }` + 一条导航树哨兵条目。 */
212
+ serverData: PrefetchedIntent[];
213
+ /** 主目标路由的渲染模式(由 Router 返回;多区域树默认 undefined → 服务端按 SSR 处理)。 */
214
+ renderMode?: string;
215
+ /** 中间件要求的重定向(服务端应返回 HTTP 301/302)。 */
216
+ redirect?: {
217
+ url: string;
218
+ status: number;
219
+ };
220
+ /** 自定义 slot 替换。 */
221
+ slots?: Record<string, string>;
222
+ /** 解析出的 locale 属性(用于 <html lang="" dir="">)。 */
223
+ locale?: {
224
+ lang: string;
225
+ dir: string;
226
+ };
227
+ /** 主目标 deny / dispatch 失败时的 HTTP 状态码(服务端据此设置 response status)。 */
228
+ status?: number;
229
+ /** 最终导航快照(树 + 所有可见目标解析结果)。 */
230
+ snapshot: NavigationSnapshot;
231
+ }
232
+ /**
233
+ * 渲染一棵结构化导航树的 SSR。
234
+ *
235
+ * 单 LeafNode 树 = 今天的扁平单页:一个可见目标,`serverData` 形如
236
+ * `[{ intent, data: page }, <tree-sentinel>]`——比单页 SSR 仅多一条哨兵。
237
+ */
238
+ declare function ssrRenderNavigation(options: SSRRenderNavigationOptions): Promise<SSRRenderNavigationResult>;
239
+ /**
240
+ * 从 `serverData`(或 hydration 数组)中取出导航树并反序列化。
241
+ * 找不到哨兵 → undefined(应用未启用导航 / 单页路径)。畸形哨兵数据抛 NavigationError。
242
+ */
243
+ declare function extractNavigationTree(data: readonly PrefetchedIntent[]): NavigationNode | undefined;
244
+ /**
245
+ * 返回剔除导航树哨兵后的纯目标条目(供 `PrefetchedIntents.fromArray` 还原每个目标)。
246
+ * 无哨兵时内容等价于原数组。
247
+ */
248
+ declare function stripNavigationTree(data: readonly PrefetchedIntent[]): PrefetchedIntent[];
249
+ /** `createSSRNavigationRender` 的一次性配置(绑定后返回 `(url, ctx?) => result`)。 */
250
+ interface SSRNavigationRenderConfig {
251
+ /** 注册 controllers 和路由的引导函数 */
252
+ readonly bootstrap: (framework: Framework) => void;
253
+ /** 获取错误页面 */
254
+ readonly getErrorPage: (status: number, message: string) => BasePage;
255
+ /** 应用层渲染函数(含多区域快照) */
256
+ readonly renderApp: (page: BasePage, framework: Framework, snapshot: NavigationSnapshot) => SSRAppResult | Promise<SSRAppResult>;
257
+ /** 导航定义(codec + 目标级守卫 + 可选初始骨架) */
258
+ readonly navigation: SSRNavigationDefinition;
259
+ /** Framework 构造配置(可选) */
260
+ readonly frameworkConfig?: FrameworkConfig;
261
+ /** 解析请求 locale 的回调 */
262
+ readonly resolveLocale?: (url: string, request?: Request) => {
263
+ lang: string;
264
+ dir: string;
265
+ } | undefined;
266
+ /** 异步加载当前 locale 的翻译字典 */
267
+ readonly loadMessages?: MessagesLoader;
268
+ }
269
+ /**
270
+ * 创建导航 SSR render 函数。
271
+ *
272
+ * 把一次性配置(bootstrap / getErrorPage / renderApp / navigation)绑定后,返回
273
+ * `(url, ssrContext?) => Promise<SSRRenderNavigationResult>`,与 `createSSRRender` 同形。
274
+ */
275
+ declare function createSSRNavigationRender(config: SSRNavigationRenderConfig): (url: string, ssrContext?: SSRContext) => Promise<SSRRenderNavigationResult>;
276
+ //#endregion
139
277
  //#region ../ssr/src/server-data.d.ts
140
278
  interface SerializeServerDataOptions {
141
279
  /**
@@ -150,6 +288,15 @@ interface SerializeServerDataOptions {
150
288
  }
151
289
  declare function serializeServerData(data: PrefetchedIntent[], options?: SerializeServerDataOptions): string;
152
290
  //#endregion
291
+ //#region ../ssr/src/islands.d.ts
292
+ /** 应用提供:把一个目标渲成 HTML(mountEntry 的 SSR 平行物)。可异步(容纳 Vue renderToString)。 */
293
+ type RenderEntry = (entry: ResolvedEntry) => string | Promise<string>;
294
+ /**
295
+ * 渲染快照里所有可见目标为 outlet 内的 island HTML 串。
296
+ * 无可见目标 → 空串;`renderEntry` 按 destinations 顺序依次 await(顺序对 split 多列有意义)。
297
+ */
298
+ declare function renderIslandsHtml(snapshot: NavigationSnapshot, renderEntry: RenderEntry): Promise<string>;
299
+ //#endregion
153
300
  //#region ../server/src/proxy.d.ts
154
301
  /** 代理路由认证配置 */
155
302
  interface ProxyAuthConfig {
@@ -548,5 +695,5 @@ declare function finesoftFrontViteConfig(options?: FinesoftFrontViteOptions): {
548
695
  closeBundle(): Promise<void>;
549
696
  };
550
697
  //#endregion
551
- export { ACTION_KINDS, Action, ActionDispatcher, ActionHandler, type ActionHandlerDependencies, type Adapter, type AdapterContext, AfterLoadGuard, AsyncMapper, BASE_PAGE_FIELDS, BaseController, BaseItem, BaseLogger, BasePage, BaseShelf, BeforeLoadGuard, type BrowserAppConfig, BrowserContextOptions, CompositeEventRecorder, CompositeLogger, CompositeLoggerFactory, CompoundAction, ConsoleEventRecorder, ConsoleLogger, ConsoleLoggerFactory, Container, DEP_KEYS, DefineRoutesOptions, DenyResult, EventRecorder, ExternalUrlAction, type ExternalUrlDependencies, ExtractParamNames, FINESOFT_PUBLIC, FeatureFlags, FeatureFlagsProvider, type FinesoftFrontViteOptions, FlowAction, type FlowActionCallbacks, type FlowActionDependencies, Framework, FrameworkConfig, History, HostCheckResult, HostGuardError, HttpClient, HttpClientConfig, HttpError, ImpressionEntry, ImpressionObserver, ImpressionObserverOptions, InferOutput, InferParams, InferQuery, type InjectSSROptions, Intent, IntentController, IntentDispatcher, IntersectionImpressionObserver, LocaleAttributes, LocaleInfo, Logger, Logger as LoggerInterface, LoggerFactory, LruMap, MakeDependenciesOptions, Mapper, MessagesLoader, MessagesLoaderContext, MetricsFieldsProvider, MetricsRecorder, MiddlewareResult, NavigationContext, Net, NextResult, None, NumOptions, Optional, PWADisplayMode, ParamSchema, ParamsFor, PlatformInfo, PluralCategory, PluralRuleProvider, PostLoadContext, PrefetchedIntent, PrefetchedIntents, type ProxyAuthConfig, type ProxyRouteConfig, QuerySchemaMap, RedirectResult, RenderMode, ReportCallback, ReportingLogger, ReportingLoggerFactory, ReportingLoggerOptions, RequestInterceptor, RequestScopedKey, ResponseInterceptor, RewriteResult, RouteAddOptions, RouteDefinition, RouteMatch, Router, type RuntimeInfo, type SSRAppOptions, type SSRContext, type SSRModule, type SSRRenderConfig, type SSRRenderOptions, type SSRRenderResult, SSR_PLACEHOLDERS, SafeErrorPageOptions, SecureFetchOptions, type SerializeServerDataOptions, type ServerConfig, ServerContextOptions, type ServerInstance, SimpleTranslator, SimpleTranslatorOptions, StandardIssue, StandardResult, StandardSchemaV1, type StartServerOptions, Storage, StrOptions, StripOptional, TextDirection, TranslationMessages, Translator, VoidEventRecorder, WithFieldsRecorder, autoAdapter, bool, buildUrl, classifyHost, classifyUrl, cloudflareAdapter, createBrowserContext, createPrefetchedIntentsFromDom, createSSRApp, createSSRRender, createServer, createServerContext, defineRequestScopedKey, defineRoutes, deny, deserializeServerData, detectPlatform, detectRuntime, englishPlural, finesoftFrontViteConfig, generateProxyCode, generateUuid, getBaseUrl, getLocaleAttributes, getPWADisplayMode, getPublicFields, getTextDirection, injectCSRShell, injectSSRContent, int, interpolate, isCompoundAction, isExternalUrlAction, isFlowAction, isNone, isPublicMarked, isRtl, isSome, makeDependencies, makeExternalUrlAction, makeFlowAction, makeLocaleInfo, makeSchema, mapEach, markPublic, netlifyAdapter, next, nodeAdapter, num, oneOf, optional, parseAcceptLanguage, pipe, pipeAsync, redirect, registerActionHandlers, registerExternalUrlHandler, registerFlowActionHandler, registerProxyRoutes, removeHost, removeQueryParams, removeScheme, resetFilterCache, resolveAdapter, resolveConfiguredMessages, resolveLocaleFromUrl, resolveMessages, resolvePluralKey, resolveRoot, rewrite, route, runAfterLoadGuards, runBeforeLoadGuards, runStandard, safeErrorPage, secureFetch, serializeServerData, setHtmlLocaleAttributes, shouldLog, ssrRender, stableStringify, startBrowserApp, startServer, staticAdapter, str, tryScroll, uuid, vercelAdapter, 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, 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 };
552
699
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import{$ as e,A as t,At as n,B as r,Bt as i,C as a,Ct as o,D as s,Dt as c,E as l,Et as u,F as d,Ft as f,G as p,H as m,Ht as h,I as g,It as _,J as v,K as y,L as b,Lt as x,M as S,Mt as C,N as ee,Nt as w,O as T,Ot as E,P as D,Pt as te,Q as ne,R as re,Rt as ie,S as ae,St as oe,T as se,Tt as ce,U as le,Ut as ue,V as de,Vt as fe,W as pe,X as me,Y as he,Z as ge,_ as _e,_t as ve,a as ye,at as be,b as xe,bt as Se,c as Ce,ct as we,d as Te,dt as Ee,et as De,f as Oe,ft as ke,g as Ae,gt as je,h as Me,ht as Ne,i as Pe,it as O,j as Fe,jt as Ie,k as Le,kt as Re,l as ze,lt as Be,m as Ve,mt as He,n as Ue,nt as We,o as Ge,ot as Ke,p as qe,pt as Je,q as Ye,r as Xe,rt as Ze,s as Qe,st as $e,t as et,tt,u as nt,ut as rt,v as k,vt as it,w as at,wt as ot,x as st,xt as A,y as ct,yt as lt,z as ut,zt as dt}from"./start-app-S4DH-40i.mjs";import{Hono as j}from"hono";async function M(e){return N(e,0)}async function N(e,t){if(t>=5)throw Error(`[SSR] Rewrite recursion depth exceeded (max 5) at "${e.url}"`);let{url:n,frameworkConfig:r,bootstrap:i,getErrorPage:a,renderApp:o,ssrContext:s,resolveLocale:c,loadMessages:l}=e,u=new URL(n,`http://localhost`),d=u.pathname+u.search,f=c?.(n,s?.request),p=f?{...r,locale:f.lang}:r,m=await A({locale:p.locale,loadMessages:l,context:p.locale?{runtime:`server`,fetch:ft(s?.fetch??p.fetch),url:d,request:s?.request}:void 0}),h={...p,fetch:s?.fetch??p.fetch},g=de.create({...h,_resolvedMessages:m});i(g);try{let n=await g.routeUrl(d);if(n?.renderMode===`csr`)return{html:``,head:``,css:``,serverData:[],renderMode:`csr`};let r,i=[],c;if(n){let l=k({url:d,intent:n.intent,container:g.container,request:s?.request}),u=await g.runBeforeLoad(l,n.beforeGuards);if(u.kind===`rewrite`)return N({...e,url:u.url},t+1);if(u.kind!==`next`){let e=await P(u,a,o,g);if(e)return e}try{r=await g.dispatch(n.intent),i=[{intent:n.intent,data:r}]}catch(e){g.container.resolve(O.LOGGER).error(`[SSR] dispatch failed for intent "${n.intent.id}":`,e),r=a(500,`Internal error`)}let f={...l,page:r},p=await g.runAfterLoad(f,n.afterGuards);if(p.kind===`rewrite`)c=p.url;else if(p.kind!==`next`){let e=await P(p,a,o,g);if(e)return e}}else r=a(404,`Page not found`);let l=await o(r,g),u=f??g.getLocale();return{html:l.html,head:l.head,css:l.css,serverData:i,renderMode:n?.renderMode,slots:l.slots,locale:u,rewriteUrl:c}}finally{g.dispose()}}function ft(e){return(e??globalThis.fetch?.bind(globalThis))||(()=>{throw Error(`[ssrRender] loadMessages requires a fetch implementation.`)})}async function P(e,t,n,r){switch(e.kind){case`next`:case`rewrite`:return null;case`redirect`:return{html:``,head:``,css:``,serverData:[],redirect:{url:e.url,status:e.status}};case`deny`:{let i=await n(t(e.status,e.message),r);return{html:i.html,head:i.head,css:i.css,serverData:[],slots:i.slots,status:e.status}}}}function pt(e){let{bootstrap:t,getErrorPage:n,renderApp:r,frameworkConfig:i,resolveLocale:a,loadMessages:o}=e;return(e,s)=>M({url:e,frameworkConfig:i??{},bootstrap:t,getErrorPage:n,renderApp:(e,t)=>r(e,t),ssrContext:s,resolveLocale:a,loadMessages:o})}const mt={HEAD:`<!--ssr-head-->`,BODY:`<!--ssr-body-->`,DATA:`<!--ssr-data-->`},F=/<!--ssr-([a-z][a-z0-9-]*)-->/g;function I(e){let{template:t,head:n,css:r,html:i,serializedData:a,slots:o,locale:s}=e,c={head:`${n}\n${r?`<style>${r}</style>`:``}`,body:i,data:`<script id="serialized-server-data" type="application/json">${a}<\/script>`,...o},l=t.replace(F,(e,t)=>c[t]??``);return s&&(l=R(l,s)),l}function L(e,t){let n=e.replace(F,()=>``);return t&&(n=R(n,t)),n}const ht=/\s+lang=("[^"]*"|'[^']*'|[^\s>]+)/gi,gt=/\s+dir=("[^"]*"|'[^']*'|[^\s>]+)/gi;function R(e,t){return e.replace(/(<html)([^>]*)(>)/i,(e,n,r,i)=>`${n}${r.replace(ht,``).replace(gt,``)} lang="${t.lang}" dir="${t.dir}"${i}`)}const _t={"<":`\\u003C`,">":`\\u003E`,"/":`\\u002F`,"\u2028":`\\u2028`,"\u2029":`\\u2029`},vt=RegExp(`[<>/\\u2028\\u2029]`,`g`);let z=!1;function yt(e,t={}){let n=t.onUnmarkedPage??`all`,r=e.map(e=>bt(e,n));return JSON.stringify(r).replace(vt,e=>_t[e]??e)}function bt(e,t){let n=e.data,r=re(n);if(r===!0)return e;if(Array.isArray(r))return{...e,data:B(n,r)};if(t===`strict`)throw Error(`[serializeServerData] page for intent "${e.intent.id}" has no markPublic marker; wrap it with markPublic(page, ["field", ...]) to declare client-visible fields.`);return t===`base-fields`?{...e,data:B(n,g)}:(xt(e.intent.id),e)}function B(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function xt(e){z||(z=!0,St()&&console.warn(`[finesoft/ssr] Page for intent "${e}" was serialized without markPublic(); all fields (including any sensitive data) are exposed in the SSR HTML. Wrap your page with markPublic(page, ["field", ...]) to declare client-visible fields explicitly. The next major version will default to BasePage-only fields when no marker is present.`))}function St(){try{return globalThis.process?.env?.NODE_ENV!==`production`}catch{return!1}}const V=new Map,Ct=e=>import(e),wt=typeof process<`u`&&process.env?.FINESOFT_DEBUG===`1`;function Tt(e){wt&&console.debug(`[finesoft:dynamic-import] ${e}`)}async function H(e){let t=!e.startsWith(`file:`)&&!e.startsWith(`/`);if(t){let t=V.get(e);if(t)return Tt(`cache hit → ${e}`),t}Tt(`importing → ${e}`);let n=await Ct(e);return t&&V.set(e,n),n}const U=10*1024*1024;function Et(e){if(e.length>2048)return null;try{if(decodeURIComponent(e)!==e)return null}catch{return null}return e.startsWith(`//`)||!/^[/\w.\-~%:@!$&'()*+,;=]*$/.test(e)?null:e.startsWith(`/`)?e:`/${e}`}function Dt(e){if(!e.prefix.startsWith(`/`))throw Error(`[proxy] prefix must start with "/": "${e.prefix}"`);let t=e.target.startsWith(`https://`),n=e.target.startsWith(`http://`);if(!t&&!n)throw Error(`[proxy] target must start with "https://" or "http://": "${e.target}"`);n&&console.warn(`[proxy] ⚠ target "${e.target}" uses plain HTTP — traffic will not be encrypted. Use HTTPS in production to prevent data interception.`)}function W(e,t){for(let n of t){Dt(n);let t=n.methods??[`all`],r=`${n.prefix}/*`,i=async e=>{let t=Et(e.req.path.replace(n.prefix,``));if(!t)return e.text(`Invalid path`,400);let r=new URL(t,n.target),i=new URL(n.target).origin;if(r.origin!==i)return e.text(`Invalid proxy target`,400);new URL(e.req.url).searchParams.forEach((e,t)=>r.searchParams.set(t,e));let a={...n.headers};if(n.auth){let e=process.env[n.auth.envKey];e?a.Authorization=n.auth.type===`bearer`?`Bearer ${e}`:`Basic ${e}`:console.warn(`[Proxy ${n.prefix}] Auth env var "${n.auth.envKey}" is not set`)}try{let t=await fetch(r.toString(),{headers:a,redirect:n.followRedirects?`follow`:`manual`}),i=t.headers.get(`Content-Length`);if(i&&parseInt(i,10)>U)return e.text(`Proxy response too large`,502);let o=await t.arrayBuffer();if(o.byteLength>U)return e.text(`Proxy response too large`,502);let s={"Content-Type":t.headers.get(`Content-Type`)??`application/json`};return n.cache&&(s[`Cache-Control`]=n.cache),e.newResponse(o,t.status,s)}catch(t){return console.error(`[Proxy ${n.prefix}]`,t),e.json({error:`Proxy request failed`},502)}};for(let n of t)e[n](r,i)}}function Ot(e){if(!e||e.length===0)return``;for(let t of e)Dt(t);let t=[];t.push(`
1
+ import{$ as e,$t as t,A as n,An as r,At as i,B as a,Bn as o,Bt as s,C as c,Cn as l,Ct as u,D as d,Dn as f,Dt as p,E as m,En as h,Et as g,F as _,Fn as v,Ft as y,G as b,Gn as x,Gt as S,H as C,Hn as w,Ht as T,I as E,In as D,It as ee,J as te,Jn as ne,Jt as re,K as ie,Kn as ae,Kt as O,L as k,Ln as oe,Lt as se,M as ce,Mn as le,Mt as ue,N as de,Nn as fe,Nt as pe,O as me,On as A,Ot as he,P as ge,Pn as _e,Pt as ve,Q as ye,Qt as be,R as xe,Rn as Se,Rt as Ce,S as we,Sn as Te,St as Ee,T as De,Tn as Oe,Tt as ke,U as Ae,Un as je,Ut as Me,V as Ne,Vn as Pe,Vt as j,W as Fe,Wn as Ie,Wt as Le,X as Re,Xt as ze,Y as Be,Yt as Ve,Z as He,Zt as Ue,_ as We,_n as Ge,_t as Ke,a as qe,an as Je,at as Ye,b as Xe,bn as Ze,bt as Qe,c as $e,cn as et,ct as M,d as tt,dn as nt,dt as rt,en as it,et as at,f as ot,fn as st,ft as ct,g as lt,gn as ut,gt as dt,h as ft,hn as pt,ht as mt,i as ht,in as gt,it as _t,j as vt,jn as yt,jt as bt,k as xt,kn as St,kt as N,l as Ct,ln as wt,lt as Tt,m as Et,mn as Dt,mt as Ot,n as kt,nn as At,nt as jt,o as Mt,on as Nt,ot as Pt,p as Ft,pn as It,pt as Lt,q as Rt,qn as zt,qt as Bt,r as Vt,rn as Ht,rt as Ut,s as Wt,sn as Gt,st as Kt,t as qt,tn as Jt,tt as Yt,u as Xt,un as Zt,ut as Qt,v as $t,vn as en,vt as tn,w as nn,wn as rn,wt as an,x as on,xn as sn,xt as cn,y as ln,yn as un,yt as dn,z as fn,zn as pn,zt as mn}from"./browser-BIetJHp_.mjs";import{Hono as P}from"hono";async function hn(e){return F(e,0)}async function F(e,t){if(t>=5)throw Error(`[SSR] Rewrite recursion depth exceeded (max 5) at "${e.url}"`);let{url:n,frameworkConfig:r,bootstrap:i,getErrorPage:a,renderApp:o,ssrContext:s,resolveLocale:c,loadMessages:l}=e,u=new URL(n,`http://localhost`),f=u.pathname+u.search,p=c?.(n,s?.request),m=p?{...r,locale:p.lang}:r,g=await h({locale:m.locale,loadMessages:l,context:m.locale?{runtime:`server`,fetch:gn(s?.fetch??m.fetch),url:f,request:s?.request}:void 0}),_={...m,fetch:s?.fetch??m.fetch},v=O.create({..._,_resolvedMessages:g});i(v);try{let n=await v.routeUrl(f);if(n?.renderMode===`csr`)return{html:``,head:``,css:``,serverData:[],renderMode:`csr`};let r,i=[],c;if(n){let l=d({url:f,intent:n.intent,container:v.container,request:s?.request}),u=await v.runBeforeLoad(l,n.beforeGuards);if(u.kind===`rewrite`)return F({...e,url:u.url},t+1);if(u.kind!==`next`){let e=await I(u,a,o,v);if(e)return e}try{r=await v.dispatch(n.intent),i=[{intent:n.intent,data:r}]}catch(e){v.container.resolve(wt.LOGGER).error(`[SSR] dispatch failed for intent "${n.intent.id}":`,e),r=a(500,`Internal error`)}let p={...l,page:r},m=await v.runAfterLoad(p,n.afterGuards);if(m.kind===`rewrite`)c=m.url;else if(m.kind!==`next`){let e=await I(m,a,o,v);if(e)return e}}else r=a(404,`Page not found`);let l=await o(r,v),u=p??v.getLocale();return{html:l.html,head:l.head,css:l.css,serverData:i,renderMode:n?.renderMode,slots:l.slots,locale:u,rewriteUrl:c}}finally{v.dispose()}}function gn(e){return(e??globalThis.fetch?.bind(globalThis))||(()=>{throw Error(`[ssrRender] loadMessages requires a fetch implementation.`)})}async function I(e,t,n,r){switch(e.kind){case`next`:case`rewrite`:return null;case`redirect`:return{html:``,head:``,css:``,serverData:[],redirect:{url:e.url,status:e.status}};case`deny`:{let i=await n(t(e.status,e.message),r);return{html:i.html,head:i.head,css:i.css,serverData:[],slots:i.slots,status:e.status}}}}function _n(e){let{bootstrap:t,getErrorPage:n,renderApp:r,frameworkConfig:i,resolveLocale:a,loadMessages:o}=e;return(e,s)=>hn({url:e,frameworkConfig:i??{},bootstrap:t,getErrorPage:n,renderApp:(e,t)=>r(e,t),ssrContext:s,resolveLocale:a,loadMessages:o})}const vn={HEAD:`<!--ssr-head-->`,BODY:`<!--ssr-body-->`,DATA:`<!--ssr-data-->`},L=/<!--ssr-([a-z][a-z0-9-]*)-->/g;function R(e){let{template:t,head:n,css:r,html:i,serializedData:a,slots:o,locale:s}=e,c={head:`${n}\n${r?`<style>${r}</style>`:``}`,body:i,data:`<script id="serialized-server-data" type="application/json">${a}<\/script>`,...o},l=t.replace(L,(e,t)=>c[t]??``);return s&&(l=B(l,s)),l}function z(e,t){let n=e.replace(L,()=>``);return t&&(n=B(n,t)),n}const yn=/\s+lang=("[^"]*"|'[^']*'|[^\s>]+)/gi,bn=/\s+dir=("[^"]*"|'[^']*'|[^\s>]+)/gi;function B(e,t){return e.replace(/(<html)([^>]*)(>)/i,(e,n,r,i)=>`${n}${r.replace(yn,``).replace(bn,``)} lang="${t.lang}" dir="${t.dir}"${i}`)}const V=`@finesoft/navigation-tree`;async function H(e){let{url:t,frameworkConfig:n,bootstrap:r,getErrorPage:i,renderApp:a,navigation:o,ssrContext:s,resolveLocale:c,loadMessages:l}=e,u=new URL(t,`http://localhost`),d=u.pathname+u.search,f=c?.(t,s?.request),p=f?{...n,locale:f.lang}:n,m=await h({locale:p.locale,loadMessages:l,context:p.locale?{runtime:`server`,fetch:Mn(s?.fetch??p.fetch),url:d,request:s?.request}:void 0}),g={...p,fetch:s?.fetch??p.fetch},_=O.create({...g,_resolvedMessages:m});r(_);try{let e=await xn(_,o,d);if(e===void 0)return jn({framework:_,resolvedLocale:f,renderApp:a,page:i(404,`Page not found`),snapshot:{tree:N(`@finesoft/not-found`),destinations:[]},serverData:[],renderMode:void 0,status:void 0});let{tree:t,renderMode:n}=e;if(n===`csr`)return{html:``,head:``,css:``,serverData:[],renderMode:`csr`,snapshot:{tree:t,destinations:[]}};let r,c=await Sn({framework:_,navigation:o,initialTree:t,fullPath:d,request:s?.request,getErrorPage:i,onRedirect:e=>{r??=e}}).resolve();if(r!==void 0)return{html:``,head:``,css:``,serverData:[],redirect:r,snapshot:c};let l=Cn(c,i);return jn({framework:_,resolvedLocale:f,renderApp:a,page:l.page,snapshot:c,serverData:En(c),renderMode:n,status:l.status})}finally{_.dispose()}}async function xn(e,t,n){let r=t.codec.decode(n,e.router);if(r!==void 0)return{tree:r,renderMode:void 0};let i=t.initial?.(n);if(i!==void 0)return{tree:i,renderMode:void 0};let a=await e.routeUrl(n);if(a!==null)return{tree:N(a.intent.id,a.intent.params??{}),renderMode:a.renderMode}}function Sn(e){let{framework:t,navigation:n,initialTree:r,fullPath:i,request:a,getErrorPage:o,onRedirect:s}=e;return at({intentDispatcher:t.intentDispatcher,router:t.router,initial:r,beforeLoad:n.beforeLoad,afterLoad:n.afterLoad,getErrorPage:o,onRedirect:s,createContext:({intent:e,params:n})=>({container:t.container,url:i,navigation:d({url:i,intent:{id:e,params:n},container:t.container,request:a})})})}function Cn(e,t){let n=wn(e.tree);if(n!==void 0){let t=e.destinations.find(e=>e.intent===n.intent&&Tn(e.params,n.params));if(t!==void 0)return t}return e.destinations.length>0?e.destinations[0]:{intent:`@finesoft/empty`,params:{},page:t(404,`Page not found`),status:404}}function wn(e){let t=e;for(;;)switch(t.kind){case`leaf`:return{intent:t.intent,params:t.params};case`stack`:if(t.entries.length===0)return;t=t.entries[t.entries.length-1];break;case`tabs`:{let e=t.branches[t.active];if(e===void 0)return;t=e;break}case`split`:{let e;for(let n of t.columns)n.content!==void 0&&(e=n.content);if(e===void 0)return;t=e;break}}}function Tn(e,t){let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r of n)if(e[r]!==t[r])return!1;return!0}function En(e){let t=[];for(let n of e.destinations)t.push({intent:{id:n.intent,params:n.params},data:n.page});return t.push(Dn(e.tree)),t}function Dn(e){let t={__finesoftNavigationTree:!0,tree:M(e)};return{intent:{id:V},data:S(t,!0)}}function On(e){for(let t of e)if(An(t))return Kt(t.data.tree)}function kn(e){return e.filter(e=>!An(e))}function An(e){if(e.intent.id!==`@finesoft/navigation-tree`)return!1;let t=e.data;return typeof t==`object`&&!!t&&t.__finesoftNavigationTree===!0}async function jn(e){let{framework:t,resolvedLocale:n,renderApp:r,page:i,snapshot:a,serverData:o,renderMode:s,status:c}=e,l=await r(i,t,a),u=n??t.getLocale();return{html:l.html,head:l.head,css:l.css,serverData:o,renderMode:s,slots:l.slots,locale:u,status:c,snapshot:a}}function Mn(e){return(e??globalThis.fetch?.bind(globalThis))||(()=>{throw Error(`[ssrRenderNavigation] loadMessages requires a fetch implementation.`)})}function Nn(e){let{bootstrap:t,getErrorPage:n,renderApp:r,navigation:i,frameworkConfig:a,resolveLocale:o,loadMessages:s}=e;return(e,c)=>H({url:e,frameworkConfig:a??{},bootstrap:t,getErrorPage:n,renderApp:r,navigation:i,ssrContext:c,resolveLocale:o,loadMessages:s})}const Pn={"<":`\\u003C`,">":`\\u003E`,"/":`\\u002F`,"\u2028":`\\u2028`,"\u2029":`\\u2029`},Fn=RegExp(`[<>/\\u2028\\u2029]`,`g`);let In=!1;function Ln(e,t={}){let n=t.onUnmarkedPage??`all`,r=e.map(e=>Rn(e,n));return JSON.stringify(r).replace(Fn,e=>Pn[e]??e)}function Rn(e,t){let n=e.data,r=Me(n);if(r===!0)return e;if(Array.isArray(r))return{...e,data:zn(n,r)};if(t===`strict`)throw Error(`[serializeServerData] page for intent "${e.intent.id}" has no markPublic marker; wrap it with markPublic(page, ["field", ...]) to declare client-visible fields.`);return t===`base-fields`?{...e,data:zn(n,j)}:(Bn(e.intent.id),e)}function zn(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function Bn(e){In||(In=!0,Vn()&&console.warn(`[finesoft/ssr] Page for intent "${e}" was serialized without markPublic(); all fields (including any sensitive data) are exposed in the SSR HTML. Wrap your page with markPublic(page, ["field", ...]) to declare client-visible fields explicitly. The next major version will default to BasePage-only fields when no marker is present.`))}function Vn(){try{return globalThis.process?.env?.NODE_ENV!==`production`}catch{return!1}}function Hn(e){return Object.entries(e).map(([e,t])=>t===``?e:`${e}="${Un(t)}"`).join(` `)}function Un(e){return e.replace(/&/g,`&amp;`).replace(/"/g,`&quot;`).replace(/</g,`&lt;`)}async function Wn(e,t){let n=[];for(let r of e.destinations){let e=Ae(r.intent,r.params),i=await t({intent:r.intent,params:r.params,entryKey:e,page:r.page}),a=Hn(an(r.intent,e));n.push(`<div ${a}>${i}</div>`)}return n.join(``)}const Gn=new Map,Kn=e=>import(e),qn=typeof process<`u`&&process.env?.FINESOFT_DEBUG===`1`;function Jn(e){qn&&console.debug(`[finesoft:dynamic-import] ${e}`)}async function U(e){let t=!e.startsWith(`file:`)&&!e.startsWith(`/`);if(t){let t=Gn.get(e);if(t)return Jn(`cache hit → ${e}`),t}Jn(`importing → ${e}`);let n=await Kn(e);return t&&Gn.set(e,n),n}const W=10*1024*1024;function Yn(e){if(e.length>2048)return null;try{if(decodeURIComponent(e)!==e)return null}catch{return null}return e.startsWith(`//`)||!/^[/\w.\-~%:@!$&'()*+,;=]*$/.test(e)?null:e.startsWith(`/`)?e:`/${e}`}function Xn(e){if(!e.prefix.startsWith(`/`))throw Error(`[proxy] prefix must start with "/": "${e.prefix}"`);let t=e.target.startsWith(`https://`),n=e.target.startsWith(`http://`);if(!t&&!n)throw Error(`[proxy] target must start with "https://" or "http://": "${e.target}"`);n&&console.warn(`[proxy] ⚠ target "${e.target}" uses plain HTTP — traffic will not be encrypted. Use HTTPS in production to prevent data interception.`)}function G(e,t){for(let n of t){Xn(n);let t=n.methods??[`all`],r=`${n.prefix}/*`,i=async e=>{let t=Yn(e.req.path.replace(n.prefix,``));if(!t)return e.text(`Invalid path`,400);let r=new URL(t,n.target),i=new URL(n.target).origin;if(r.origin!==i)return e.text(`Invalid proxy target`,400);new URL(e.req.url).searchParams.forEach((e,t)=>r.searchParams.set(t,e));let a={...n.headers};if(n.auth){let e=process.env[n.auth.envKey];e?a.Authorization=n.auth.type===`bearer`?`Bearer ${e}`:`Basic ${e}`:console.warn(`[Proxy ${n.prefix}] Auth env var "${n.auth.envKey}" is not set`)}try{let t=await fetch(r.toString(),{headers:a,redirect:n.followRedirects?`follow`:`manual`}),i=t.headers.get(`Content-Length`);if(i&&parseInt(i,10)>W)return e.text(`Proxy response too large`,502);let o=await t.arrayBuffer();if(o.byteLength>W)return e.text(`Proxy response too large`,502);let s={"Content-Type":t.headers.get(`Content-Type`)??`application/json`};return n.cache&&(s[`Cache-Control`]=n.cache),e.newResponse(o,t.status,s)}catch(t){return console.error(`[Proxy ${n.prefix}]`,t),e.json({error:`Proxy request failed`},502)}};for(let n of t)e[n](r,i)}}function Zn(e){if(!e||e.length===0)return``;for(let t of e)Xn(t);let t=[];t.push(`
2
2
  // ─── 框架声明式代理路由 ───
3
3
  function _sanitizeProxyPath(raw) {
4
4
  if (raw.length > 2048) return null;
@@ -21,12 +21,12 @@ function _sanitizeProxyPath(raw) {
21
21
  const _resp = await fetch(_target.toString(), { headers: _headers, redirect: ${o} });
22
22
  // Content-Length 快速拒绝,防止 serverless/edge 加载超大响应到内存
23
23
  const _cl = _resp.headers.get("Content-Length");
24
- if (_cl && parseInt(_cl, 10) > ${U}) {
24
+ if (_cl && parseInt(_cl, 10) > ${W}) {
25
25
  return c.text("Proxy response too large", 502);
26
26
  }
27
27
  // arrayBuffer 保留二进制完整性
28
28
  const _body = await _resp.arrayBuffer();
29
- if (_body.byteLength > ${U}) {
29
+ if (_body.byteLength > ${W}) {
30
30
  return c.text("Proxy response too large", 502);
31
31
  }
32
32
  const _rh = { "Content-Type": _resp.headers.get("Content-Type") || "application/json" };
@@ -37,7 +37,7 @@ function _sanitizeProxyPath(raw) {
37
37
  return c.json({ error: "Proxy request failed" }, 502);
38
38
  }
39
39
  }`;for(let n of e)t.push(`app.${n}(${r}, ${c});`)}return t.join(`
40
- `)}const kt=[`vite`,`esbuild`,`rollup`,`fsevents`,`lightningcss`],At=[`node:async_hooks`,`node:buffer`,`node:crypto`,`node:fs`,`node:http`,`node:http2`,`node:module`,`node:net`,`node:os`,`node:path`,`node:stream`,`node:url`,`node:util`,`node:zlib`,`crypto`,`http`,`http2`,`stream`];function G(e,t){let n=e.setupPath?`import _setupDefault from "./${e.setupPath}";`:``,r=e.setupPath?`if (typeof _setupDefault === "function") await _setupDefault(app);`:``,i=JSON.stringify(e.renderModes??{}),a=t.platformCache?t.platformCache:`
40
+ `)}const Qn=[`vite`,`esbuild`,`rollup`,`fsevents`,`lightningcss`],$n=[`node:async_hooks`,`node:buffer`,`node:crypto`,`node:fs`,`node:http`,`node:http2`,`node:module`,`node:net`,`node:os`,`node:path`,`node:stream`,`node:url`,`node:util`,`node:zlib`,`crypto`,`http`,`http2`,`stream`];function K(e,t){let n=e.setupPath?`import _setupDefault from "./${e.setupPath}";`:``,r=e.setupPath?`if (typeof _setupDefault === "function") await _setupDefault(app);`:``,i=JSON.stringify(e.renderModes??{}),a=t.platformCache?t.platformCache:`
41
41
  const ISR_CACHE_MAX = 1000;
42
42
  const _isrMap = new Map();
43
43
  async function platformCacheGet(url) {
@@ -109,7 +109,7 @@ function matchRenderMode(url) {
109
109
  }
110
110
 
111
111
  const app = new Hono();
112
- ${Ot(e.proxies??[])}
112
+ ${Zn(e.proxies??[])}
113
113
  ${r}
114
114
  ${t.platformMiddleware??``}
115
115
 
@@ -173,8 +173,8 @@ app.get("*", async (c) => {
173
173
  });
174
174
 
175
175
  ${t.platformExport}
176
- `}async function K(e,t){await e.vite.build({root:e.root,build:{ssr:t.entry,outDir:t.outDir,emptyOutDir:t.emptyOutDir??!0,target:t.target??`node18`,rollupOptions:{output:{entryFileNames:t.fileName??`index.mjs`}}},ssr:{noExternal:t.noExternal!==!1,external:[...t.external??kt,...At]},resolve:e.resolvedResolve,css:e.resolvedCss})}function q(e,t,n){let{fs:r,path:i}=e;r.cpSync(i.resolve(e.root,`dist/client`),t,{recursive:!0}),n?.excludeHtml!==!1&&r.rmSync(i.join(t,`index.html`),{force:!0})}async function J(e){let{fs:t,path:n,root:r,vite:i}=e,{pathToFileURL:a}=await H(`node:url`),o=e.bootstrapEntry??`src/lib/bootstrap.ts`,s=[];if(t.existsSync(n.resolve(r,o))){await i.build({root:r,build:{ssr:o,outDir:n.resolve(r,`dist/server`),emptyOutDir:!1,rollupOptions:{output:{entryFileNames:`_routes_prerender.mjs`}}},resolve:e.resolvedResolve});let c=a(n.resolve(r,`dist/server/_routes_prerender.mjs`)).href,l=await H(c);s=l.routes??l.default??[],t.rmSync(n.resolve(r,`dist/server/_routes_prerender.mjs`),{force:!0})}let c=new Set;for(let e of s)e.renderMode===`prerender`&&e.path&&!e.path.includes(`:`)&&c.add(e.path);if(e.renderModes)for(let[t,n]of Object.entries(e.renderModes))n===`prerender`&&!t.includes(`*`)&&!t.includes(`:`)&&c.add(t);if(e.locales?.length){let t=[...c];for(let n of e.locales)for(let e of t){let t=e===`/`?`/${n}`:`/${n}${e}`;c.add(t)}}if(c.size===0)return[];let l=a(n.resolve(r,`dist/server/ssr.js`)).href,u=await H(l),d=[];for(let t of c)try{let{html:n,head:r,css:i,serverData:a,locale:o}=await u.render(t),s=u.serializeServerData(a),c=e.templateHtml.replace(/<!--ssr-([a-z][a-z0-9-]*)-->/g,(e,t)=>({head:r+`
177
- <style>`+i+`</style>`,body:n,data:`<script id="serialized-server-data" type="application/json">`+s+`<\/script>`})[t]??``);if(o){let{getLocaleAttributes:e}=await H(`@finesoft/core`),t=e(o);c=c.replace(/<html([^>]*)>/i,(e,n)=>`<html${n.replace(/\s+lang=("[^"]*"|'[^']*'|[^\s>]+)/gi,``).replace(/\s+dir=("[^"]*"|'[^']*'|[^\s>]+)/gi,``)} lang="${t.lang}" dir="${t.dir}">`)}d.push({url:t,html:c})}catch(e){console.warn(` [prerender] Failed to render ${t}:`,e)}return d.length>0&&console.log(` Pre-rendered ${d.length} pages (${c.size} routes)\n`),d}function jt(){return{name:`cloudflare`,async build(e){let{fs:t,path:n,root:r}=e,i=n.resolve(r,`dist/cloudflare`);t.rmSync(i,{recursive:!0,force:!0});let a=G(e,{platformImport:``,platformExport:`export default app;`,platformCache:`
176
+ `}async function q(e,t){await e.vite.build({root:e.root,build:{ssr:t.entry,outDir:t.outDir,emptyOutDir:t.emptyOutDir??!0,target:t.target??`node18`,rollupOptions:{output:{entryFileNames:t.fileName??`index.mjs`}}},ssr:{noExternal:t.noExternal!==!1,external:[...t.external??Qn,...$n]},resolve:e.resolvedResolve,css:e.resolvedCss})}function J(e,t,n){let{fs:r,path:i}=e;r.cpSync(i.resolve(e.root,`dist/client`),t,{recursive:!0}),n?.excludeHtml!==!1&&r.rmSync(i.join(t,`index.html`),{force:!0})}async function Y(e){let{fs:t,path:n,root:r,vite:i}=e,{pathToFileURL:a}=await U(`node:url`),o=e.bootstrapEntry??`src/lib/bootstrap.ts`,s=[];if(t.existsSync(n.resolve(r,o))){await i.build({root:r,build:{ssr:o,outDir:n.resolve(r,`dist/server`),emptyOutDir:!1,rollupOptions:{output:{entryFileNames:`_routes_prerender.mjs`}}},resolve:e.resolvedResolve});let c=a(n.resolve(r,`dist/server/_routes_prerender.mjs`)).href,l=await U(c);s=l.routes??l.default??[],t.rmSync(n.resolve(r,`dist/server/_routes_prerender.mjs`),{force:!0})}let c=new Set;for(let e of s)e.renderMode===`prerender`&&e.path&&!e.path.includes(`:`)&&c.add(e.path);if(e.renderModes)for(let[t,n]of Object.entries(e.renderModes))n===`prerender`&&!t.includes(`*`)&&!t.includes(`:`)&&c.add(t);if(e.locales?.length){let t=[...c];for(let n of e.locales)for(let e of t){let t=e===`/`?`/${n}`:`/${n}${e}`;c.add(t)}}if(c.size===0)return[];let l=a(n.resolve(r,`dist/server/ssr.js`)).href,u=await U(l),d=[];for(let t of c)try{let{html:n,head:r,css:i,serverData:a,locale:o}=await u.render(t),s=u.serializeServerData(a),c=e.templateHtml.replace(/<!--ssr-([a-z][a-z0-9-]*)-->/g,(e,t)=>({head:r+`
177
+ <style>`+i+`</style>`,body:n,data:`<script id="serialized-server-data" type="application/json">`+s+`<\/script>`})[t]??``);if(o){let{getLocaleAttributes:e}=await U(`@finesoft/core`),t=e(o);c=c.replace(/<html([^>]*)>/i,(e,n)=>`<html${n.replace(/\s+lang=("[^"]*"|'[^']*'|[^\s>]+)/gi,``).replace(/\s+dir=("[^"]*"|'[^']*'|[^\s>]+)/gi,``)} lang="${t.lang}" dir="${t.dir}">`)}d.push({url:t,html:c})}catch(e){console.warn(` [prerender] Failed to render ${t}:`,e)}return d.length>0&&console.log(` Pre-rendered ${d.length} pages (${c.size} routes)\n`),d}function er(){return{name:`cloudflare`,async build(e){let{fs:t,path:n,root:r}=e,i=n.resolve(r,`dist/cloudflare`);t.rmSync(i,{recursive:!0,force:!0});let a=K(e,{platformImport:``,platformExport:`export default app;`,platformCache:`
178
178
  const ISR_CACHE_TTL = 3600; // 1 hour
179
179
  async function platformCacheGet(url) {
180
180
  try {
@@ -194,8 +194,8 @@ async function platformCacheSet(url, html) {
194
194
  });
195
195
  await cache.put(cacheKey, resp);
196
196
  } catch {}
197
- }`}),o=n.resolve(r,`.cf-entry.tmp.mjs`);t.writeFileSync(o,a);try{await K(e,{entry:`.cf-entry.tmp.mjs`,outDir:i,target:`es2022`,fileName:`_worker.js`}),q(e,n.resolve(i,`assets`));let r=await J(e);for(let{url:e,html:a}of r){let r=e===`/`?n.join(i,`assets`,`index.html`):n.join(i,`assets`,e,`index.html`);t.mkdirSync(n.resolve(r,`..`),{recursive:!0}),t.writeFileSync(r,a)}}finally{t.rmSync(o,{force:!0})}console.log(` Cloudflare output → dist/cloudflare/
198
- `)}}}function Mt(){return{name:`netlify`,async build(e){let{fs:t,path:n,root:r}=e,i=n.resolve(r,`.netlify/functions-internal/ssr`);t.rmSync(n.resolve(r,`.netlify`),{recursive:!0,force:!0});let a=G(e,{platformImport:`import { handle } from "hono/netlify";`,platformExport:`export default handle(app);
197
+ }`}),o=n.resolve(r,`.cf-entry.tmp.mjs`);t.writeFileSync(o,a);try{await q(e,{entry:`.cf-entry.tmp.mjs`,outDir:i,target:`es2022`,fileName:`_worker.js`}),J(e,n.resolve(i,`assets`));let r=await Y(e);for(let{url:e,html:a}of r){let r=e===`/`?n.join(i,`assets`,`index.html`):n.join(i,`assets`,e,`index.html`);t.mkdirSync(n.resolve(r,`..`),{recursive:!0}),t.writeFileSync(r,a)}}finally{t.rmSync(o,{force:!0})}console.log(` Cloudflare output → dist/cloudflare/
198
+ `)}}}function tr(){return{name:`netlify`,async build(e){let{fs:t,path:n,root:r}=e,i=n.resolve(r,`.netlify/functions-internal/ssr`);t.rmSync(n.resolve(r,`.netlify`),{recursive:!0,force:!0});let a=K(e,{platformImport:`import { handle } from "hono/netlify";`,platformExport:`export default handle(app);
199
199
  export const config = { path: "/*", preferStatic: true };`,platformCache:`
200
200
  const ISR_SWR_TTL = 3600;
201
201
  const ISR_CACHE_MAX = 1000;
@@ -210,10 +210,10 @@ async function platformCacheSet(url, html) {
210
210
  }
211
211
  _isrMap.set(url, html);
212
212
  }`,platformPrerenderResponseHook:`c.header("Cache-Control", "public, max-age=0, must-revalidate");
213
- c.header("Netlify-CDN-Cache-Control", "public, max-age=" + ISR_SWR_TTL + ", stale-while-revalidate=" + ISR_SWR_TTL + ", durable");`}),o=n.resolve(r,`.netlify-entry.tmp.mjs`);t.writeFileSync(o,a);try{await K(e,{entry:`.netlify-entry.tmp.mjs`,outDir:i,target:`node18`})}finally{t.rmSync(o,{force:!0})}t.writeFileSync(n.resolve(r,`dist/client/_redirects`),`/* /.netlify/functions/ssr 200
214
- `);let s=await J(e),c=n.resolve(r,`dist/client`);for(let{url:e,html:r}of s){let i=e===`/`?n.join(c,`index.html`):n.join(c,e,`index.html`);t.mkdirSync(n.resolve(i,`..`),{recursive:!0}),t.writeFileSync(i,r)}console.log(` Netlify output → .netlify/functions-internal/ssr/
213
+ c.header("Netlify-CDN-Cache-Control", "public, max-age=" + ISR_SWR_TTL + ", stale-while-revalidate=" + ISR_SWR_TTL + ", durable");`}),o=n.resolve(r,`.netlify-entry.tmp.mjs`);t.writeFileSync(o,a);try{await q(e,{entry:`.netlify-entry.tmp.mjs`,outDir:i,target:`node18`})}finally{t.rmSync(o,{force:!0})}t.writeFileSync(n.resolve(r,`dist/client/_redirects`),`/* /.netlify/functions/ssr 200
214
+ `);let s=await Y(e),c=n.resolve(r,`dist/client`);for(let{url:e,html:r}of s){let i=e===`/`?n.join(c,`index.html`):n.join(c,e,`index.html`);t.mkdirSync(n.resolve(i,`..`),{recursive:!0}),t.writeFileSync(i,r)}console.log(` Netlify output → .netlify/functions-internal/ssr/
215
215
  Publish dir: dist/client/
216
- `)}}}function Nt(){return{name:`node`,async build(e){let{fs:t,path:n,root:r}=e,i=G(e,{platformImport:`import { serve } from "@hono/node-server";
216
+ `)}}}function nr(){return{name:`node`,async build(e){let{fs:t,path:n,root:r}=e,i=K(e,{platformImport:`import { serve } from "@hono/node-server";
217
217
  import { readFileSync, existsSync } from "node:fs";
218
218
  import { resolve, dirname } from "node:path";
219
219
  import { fileURLToPath } from "node:url";`,platformMiddleware:`
@@ -241,14 +241,14 @@ const port = +(process.env.PORT || 3000);
241
241
  serve({ fetch: app.fetch, port }, (info) => {
242
242
  console.log(\`Server running at http://localhost:\${info.port}\`);
243
243
  });
244
- `}),a=n.resolve(r,`.node-entry.tmp.mjs`);t.writeFileSync(a,i);try{await K(e,{entry:`.node-entry.tmp.mjs`,outDir:n.resolve(r,`dist/server`),target:`node18`,emptyOutDir:!1})}finally{t.rmSync(a,{force:!0})}let o=await J(e);if(o.length>0){let e=n.resolve(r,`dist/prerender`);t.mkdirSync(e,{recursive:!0});for(let{url:r,html:i}of o){let a=r===`/`?n.join(e,`index.html`):n.join(e,r,`index.html`);t.mkdirSync(n.resolve(a,`..`),{recursive:!0}),t.writeFileSync(a,i)}}console.log(` Node output → dist/server/index.mjs
244
+ `}),a=n.resolve(r,`.node-entry.tmp.mjs`);t.writeFileSync(a,i);try{await q(e,{entry:`.node-entry.tmp.mjs`,outDir:n.resolve(r,`dist/server`),target:`node18`,emptyOutDir:!1})}finally{t.rmSync(a,{force:!0})}let o=await Y(e);if(o.length>0){let e=n.resolve(r,`dist/prerender`);t.mkdirSync(e,{recursive:!0});for(let{url:r,html:i}of o){let a=r===`/`?n.join(e,`index.html`):n.join(e,r,`index.html`);t.mkdirSync(n.resolve(a,`..`),{recursive:!0}),t.writeFileSync(a,i)}}console.log(` Node output → dist/server/index.mjs
245
245
  Run: node dist/server/index.mjs
246
- `)}}}function Pt(e={}){return{name:`static`,async build(t){let{fs:n,path:r,root:i}=t,a=r.resolve(i,`dist/static`);n.rmSync(a,{recursive:!0,force:!0}),n.mkdirSync(a,{recursive:!0});let{pathToFileURL:o}=await H(`node:url`),s=o(r.resolve(i,`dist/server/ssr.js`)).href,c=await H(s);t.copyStaticAssets(a,{excludeHtml:!0});let{paths:l,defs:u}=await Ft(t,e);console.log(` Pre-rendering ${l.length} pages...\n`);for(let e of l)try{let i=Rt(e,u.find(t=>t.path===e)?.renderMode,t.renderModes),o;if(i===`csr`)o=Lt(t.templateHtml);else{let{html:n,head:r,css:i,serverData:a}=await c.render(e),s=c.serializeServerData(a);o=It(t.templateHtml,r,i,n,s)}let s=e===`/`?r.join(a,`index.html`):r.join(a,e,`index.html`);n.mkdirSync(r.resolve(s,`..`),{recursive:!0}),n.writeFileSync(s,o)}catch(t){console.warn(` [static] Failed to render ${e}:`,t)}console.log(` Static output → dist/static/
247
- `)}}}async function Ft(e,t){let n=t.routesExport??`src/lib/bootstrap.ts`,r=[],i=[];try{let{pathToFileURL:t}=await H(`node:url`);await e.vite.build({root:e.root,build:{ssr:n,outDir:e.path.resolve(e.root,`dist/server`),emptyOutDir:!1,rollupOptions:{output:{entryFileNames:`_routes.mjs`}}},resolve:e.resolvedResolve});let a=t(e.path.resolve(e.root,`dist/server/_routes.mjs`)).href,o=await H(a),s=o.routes??o.default;if(Array.isArray(s))for(let e of s)e.path&&!e.path.includes(`:`)&&(r.push(e.path),i.push({path:e.path,renderMode:e.renderMode}));e.fs.rmSync(e.path.resolve(e.root,`dist/server/_routes.mjs`),{force:!0})}catch(e){console.warn(` [static] Could not load routes from "${n}". Using "/" only.`,e),r.length===0&&r.push(`/`)}if(t.dynamicRoutes)for(let e of t.dynamicRoutes)r.includes(e)||r.push(e);return r.length===0&&r.push(`/`),{paths:r,defs:i}}function It(e,t,n,r,i){let a=/<!--ssr-([a-z][a-z0-9-]*)-->/g,o={head:t+`
248
- <style>`+n+`</style>`,body:r,data:`<script id="serialized-server-data" type="application/json">`+i+`<\/script>`};return e.replace(a,(e,t)=>o[t]??``)}function Lt(e){return e.replace(/<!--ssr-([a-z][a-z0-9-]*)-->/g,()=>``)}function Rt(e,t,n){if(n){if(n[e])return n[e];for(let[t,r]of Object.entries(n))if(t.includes(`*`)){let n=t.replace(/[.+?^${}()|[\]\\]/g,`\\$&`);if(RegExp(`^`+n.replace(/\*/g,`.*`)+`$`).test(e))return r}}return t??`ssr`}function zt(){return{name:`vercel`,async build(e){let{fs:t,path:n,root:r}=e,i=n.resolve(r,`.vercel/output`);t.rmSync(i,{recursive:!0,force:!0});let a=G(e,{platformImport:`import { getRequestListener } from "@hono/node-server";`,platformExport:[`const _listener = getRequestListener(app.fetch);`,`export default (req, res) => {`,` const m = req.headers["x-now-route-matches"];`,` if (typeof m === "string") {`,` try {`,` const p = new URLSearchParams(m);`,` const c = p.get("1");`,` if (c != null) {`,` const qi = (req.url || "").indexOf("?");`,` const qs = qi !== -1 ? req.url.slice(qi) : "";`,` req.url = "/" + decodeURIComponent(c) + qs;`,` }`,` } catch {}`,` }`,` return _listener(req, res);`,`};`].join(`
249
- `)}),o=n.resolve(r,`.vercel-entry.tmp.mjs`);t.writeFileSync(o,a);try{let i=n.resolve(r,`.vercel/output/functions/ssr.func`);await K(e,{entry:`.vercel-entry.tmp.mjs`,outDir:i,target:`node18`}),t.writeFileSync(n.resolve(i,`.vc-config.json`),JSON.stringify({runtime:`nodejs20.x`,handler:`index.mjs`,launcherType:`Nodejs`},null,2)),q(e,n.resolve(r,`.vercel/output/static`)),t.writeFileSync(n.resolve(r,`.vercel/output/config.json`),JSON.stringify({version:3,routes:[{handle:`filesystem`},{src:`/(.*)`,dest:`/ssr`}]},null,2))}finally{t.rmSync(o,{force:!0})}let s=await J(e),c=n.resolve(r,`.vercel/output/static`);for(let{url:e,html:r}of s){let i=e===`/`?n.join(c,`index.html`):n.join(c,e,`index.html`);t.mkdirSync(n.resolve(i,`..`),{recursive:!0}),t.writeFileSync(i,r)}if(s.length>0){let e=n.resolve(r,`.vercel/output/config.json`),i=JSON.parse(t.readFileSync(e,`utf-8`));i.overrides=i.overrides??{};for(let{url:e}of s){let t=e===`/`?`index.html`:`${e.replace(/^\//,``)}/index.html`;i.overrides[t]={path:e===`/`?`/`:e,contentType:`text/html; charset=utf-8`}}t.writeFileSync(e,JSON.stringify(i,null,2))}console.log(` Vercel output → .vercel/output/
250
- `)}}}function Y(e){if(typeof e!=`string`)return e;switch(e){case`vercel`:return zt();case`cloudflare`:return jt();case`netlify`:return Mt();case`node`:return Nt();case`static`:return Pt();case`auto`:return Bt();default:throw Error(`[finesoft] Unknown adapter: "${e}". Available: vercel, cloudflare, netlify, node, static, auto`)}}function Bt(){return{name:`auto`,async build(e){let t=Vt();return console.log(` [auto] Detected platform: ${t}\n`),Y(t).build(e)}}}function Vt(){return process.env.VERCEL?`vercel`:process.env.CF_PAGES?`cloudflare`:process.env.NETLIFY?`netlify`:`node`}function Ht(e,t=1){return((n,r)=>{if(typeof n==`string`&&n.startsWith(`/`)){let i=new Request(`http://localhost${n}`,r);return i.headers.set(`x-ssr-depth`,String(t)),Promise.resolve(e(i))}return globalThis.fetch(n,r)})}function Ut(e,t){if(!t)return null;let n=e.split(`?`)[0];if(t[n])return t[n];for(let[e,r]of Object.entries(t))if(e.includes(`*`)){let t=e.replace(/[.+?^${}()|[\]\\]/g,`\\$&`);if(RegExp(`^`+t.replace(/\*/g,`.*`)+`$`).test(n))return r}return null}function X(e){let{root:t,vite:n,isProduction:r,ssrEntryPath:i=`/src/ssr.ts`,ssrProductionModule:a,parentFetch:s,renderModes:c,defaultLocale:l}=e,u=new j,d=new T(1e3),f;async function p(e){if(!r&&n){let{readFileSync:r}=await H(`node:fs`),i=r((await H(`node:path`)).resolve(t,`index.html`),`utf-8`);return n.transformIndexHtml(e,i)}if(f)return f;if(globalThis.Deno!==void 0){let e=import.meta.url;return f=globalThis.Deno.readTextFileSync(new URL(`../dist/client/index.html`,e)),f}let{readFileSync:i}=await H(`node:fs`);return f=i((await H(`node:path`)).resolve(t,`dist/client/index.html`),`utf-8`),f}async function m(){if(!r&&n)return await n.ssrLoadModule(i);if(a)return H(a);let e=await H(`node:path`),{pathToFileURL:o}=await H(`node:url`),s=o(e.resolve(t,`dist/server/ssr.js`)).href;return H(s)}return u.get(`*`,async e=>{let t=parseInt(e.req.header(`x-ssr-depth`)??`0`,10);if(t>=5)return e.text(`SSR recursion loop detected`,508);let i=e.req.path+(e.req.url.includes(`?`)?`?`+e.req.url.split(`?`)[1]:``);try{let n=await p(i),r=await m();if(typeof r.render!=`function`||typeof r.serializeServerData!=`function`)throw Error(`[SSR] Module missing required exports: render, serializeServerData`);let{render:a,serializeServerData:u}=r,f=Ut(i,c);if(f===`csr`)return e.html(L(n,l?o(l):void 0));let h=d.get(i);if(h)return e.html(h);let g=s?Ht(s,t+1):void 0,_={request:e.req.raw};g&&(_.fetch=g);let{html:v,head:y,css:b,serverData:x,renderMode:S,redirect:C,slots:ee,locale:w,status:T,rewriteUrl:E}=await a(i,_);if(C)return e.redirect(C.url,C.status);if(S===`csr`)return e.html(L(n,w));let D=I({template:n,head:y,css:b,html:v,serializedData:u(x),slots:ee,locale:w});return(S===`prerender`||f===`prerender`)&&!T&&!E&&d.set(i,D),E&&e.header(`Content-Location`,E),T&&T>=400?e.html(D,T):e.html(D)}catch(t){return!r&&n&&n.ssrFixStacktrace(t),console.error(`[SSR Error]`,t),e.text(`Internal Server Error`,500)}}),u}function Z(){return{isDeno:globalThis.Deno!==void 0,isBun:globalThis.Bun!==void 0,isVercel:!!process.env.VERCEL,isProduction:process.env.NODE_ENV===`production`}}async function Wt(e,t=0){if(globalThis.Deno!==void 0){let n=new URL(e);for(let e=0;e<t;e++)n=new URL(`..`,n);return n.pathname}let n=await H(`node:path`),{fileURLToPath:r}=await H(`node:url`),i=n.normalize(n.dirname(r(e)));for(let e=0;e<t;e++)i=n.resolve(i,`..`);return i}async function Gt(e){let{app:t,root:n,port:r=3e3,isProduction:i,vite:a,routes:o,ssrEntryPath:s}=e,{isDeno:c,isBun:l,isVercel:u}=e.runtime??Z();function d(){let e=[`\n Server running at http://localhost:${r}\n`];if(o&&o.length>0){e.push(` Routes:`);for(let t of o)e.push(` ${t}`);e.push(``)}s&&e.push(` SSR Entry: ${s}`),s&&e.push(``),console.log(e.join(`
251
- `))}if(u)return{vite:a};if(!i){let e=a;if(!e){let{createServer:t}=await H(`vite`);e=await t({root:n,server:{middlewareMode:!0},appType:`custom`})}let{getRequestListener:i}=await H(`@hono/node-server`),{createServer:o}=await H(`node:http`),s=i(t.fetch);return o((t,n)=>{e.middlewares(t,n,()=>s(t,n))}).listen(r,()=>{d()}),{vite:e}}if(c)globalThis.Deno.serve({port:r},t.fetch);else if(!l){let{serveStatic:e}=await H(`@hono/node-server/serve-static`),i=await H(`node:path`),a=new j,o=i.resolve(n,`dist/client`);a.use(`/*`,e({root:o,rewriteRequestPath:e=>e.endsWith(`/`)?`/__nosuchfile__`:e})),a.route(`/`,t);let{serve:s}=await H(`@hono/node-server`);s({fetch:a.fetch,port:r},()=>{d()})}return{vite:a}}async function Kt(e={}){let{root:t,port:n=Number(process.env.PORT)||3e3,setup:r,proxies:i,ssr:a}=e,o=t??process.cwd(),{existsSync:s}=await H(`node:fs`),c=(await H(`node:path`)).resolve(o,`.env`);if(s(c))try{let{config:e}=await H(`dotenv`);e({path:c})}catch(e){console.warn(`[Server] Failed to load .env: ${e.message}`)}let l=Z(),u;if(!l.isProduction&&!l.isVercel){let{createServer:e}=await H(`vite`);u=await e({root:o,server:{middlewareMode:!0},appType:`custom`})}let d=new j;i?.length&&W(d,i),r&&await r(d);let f=X({root:o,vite:u,isProduction:l.isProduction,parentFetch:d.fetch.bind(d),...a});return d.route(`/`,f),await Gt({app:d,root:o,port:n,isProduction:l.isProduction,vite:u,runtime:l,ssrEntryPath:a?.ssrEntryPath}),{app:d,vite:u,runtime:l}}function qt(e,t,n){let r=t??[`zh`,`en`],i=n??r[0]??`en`;if(!e||e.length>1024)return i;let a=e.split(`,`);if(a.length>50)return i;let o=a.map(e=>{let[t,n]=e.trim().split(`;q=`),r=n?parseFloat(n):1;return{lang:t.trim().toLowerCase(),q:Number.isFinite(r)&&r>=0&&r<=1?r:0}}).filter(e=>e.q>0).sort((e,t)=>t.q-e.q);for(let{lang:e}of o){let t=e.split(`-`)[0];if(r.includes(t))return t}return i}const Q=`virtual:finesoft-front/i18n-loader`,Jt=`\0${Q}`;function Yt(e){return typeof e.default==`function`?e.default:typeof e.setup==`function`?e.setup:Object.values(e).find(e=>typeof e==`function`)??null}function Xt(e,t){if(!t)return null;let n=e.split(`?`)[0];if(t[n])return t[n];for(let[e,r]of Object.entries(t))if(e.includes(`*`)){let t=e.replace(/[.+?^${}()|[\]\\]/g,`\\$&`);if(RegExp(`^`+t.replace(/\*/g,`.*`)+`$`).test(n))return r}return null}function Zt(e){return e.replace(/\\/g,`/`)}let $=!1;function Qt(){$||($=!0,console.log(`\n${(e=>`\x1b[33m${e}\x1b[0m`)(`[finesoft]`)} dev server is exposing source via /src/* and /@fs/* (HMR).\n`+(e=>`\x1b[2m${e}\x1b[0m`)(" Do NOT expose this server to untrusted networks; run `vp build && vp preview` for production.\n")))}async function $t(e,t){let{existsSync:n}=await H(`node:fs`),r=await H(`node:path`),i=r.isAbsolute(t)?t:r.resolve(e,t);if(!n(i))throw Error(`[finesoftFrontViteConfig] i18n.messagesDir not found: ${t}`);let a=Zt(r.relative(e,i));if(!a||a.startsWith(`..`))throw Error(`[finesoftFrontViteConfig] i18n.messagesDir must stay inside the project root: ${t}`);return a.replace(/^\.\/+/,``)}function en(e={}){let t=e.ssr?.entry??`src/ssr.ts`,n=process.cwd(),r,i,a,s=/\.(css|scss|less|sass|styl|stylus|pcss|postcss)($|\?)/;return{name:`finesoft-front`,config(t){let n={appType:`custom`,define:{__FINESOFT_I18N_LOADER_SPECIFIER__:e.i18n?.messagesDir?JSON.stringify(Q):`undefined`}};return process.env.__FINESOFT_SUB_BUILD__||(n.build={outDir:t.build?.outDir??`dist/client`}),n},configResolved(e){r=e.command,i=e.resolve,a=e.css,n=e.root},resolveId(t){return t===Q&&e.i18n?.messagesDir?Jt:null},async load(t){if(t!==Jt||!e.i18n?.messagesDir)return null;let r=`/${await $t(n,e.i18n.messagesDir)}`,i=`${r}/*.json`,a=`${r}/`;return`
246
+ `)}}}function rr(e={}){return{name:`static`,async build(t){let{fs:n,path:r,root:i}=t,a=r.resolve(i,`dist/static`);n.rmSync(a,{recursive:!0,force:!0}),n.mkdirSync(a,{recursive:!0});let{pathToFileURL:o}=await U(`node:url`),s=o(r.resolve(i,`dist/server/ssr.js`)).href,c=await U(s);t.copyStaticAssets(a,{excludeHtml:!0});let{paths:l,defs:u}=await ir(t,e);console.log(` Pre-rendering ${l.length} pages...\n`);for(let e of l)try{let i=sr(e,u.find(t=>t.path===e)?.renderMode,t.renderModes),o;if(i===`csr`)o=or(t.templateHtml);else{let{html:n,head:r,css:i,serverData:a}=await c.render(e),s=c.serializeServerData(a);o=ar(t.templateHtml,r,i,n,s)}let s=e===`/`?r.join(a,`index.html`):r.join(a,e,`index.html`);n.mkdirSync(r.resolve(s,`..`),{recursive:!0}),n.writeFileSync(s,o)}catch(t){console.warn(` [static] Failed to render ${e}:`,t)}console.log(` Static output → dist/static/
247
+ `)}}}async function ir(e,t){let n=t.routesExport??`src/lib/bootstrap.ts`,r=[],i=[];try{let{pathToFileURL:t}=await U(`node:url`);await e.vite.build({root:e.root,build:{ssr:n,outDir:e.path.resolve(e.root,`dist/server`),emptyOutDir:!1,rollupOptions:{output:{entryFileNames:`_routes.mjs`}}},resolve:e.resolvedResolve});let a=t(e.path.resolve(e.root,`dist/server/_routes.mjs`)).href,o=await U(a),s=o.routes??o.default;if(Array.isArray(s))for(let e of s)e.path&&!e.path.includes(`:`)&&(r.push(e.path),i.push({path:e.path,renderMode:e.renderMode}));e.fs.rmSync(e.path.resolve(e.root,`dist/server/_routes.mjs`),{force:!0})}catch(e){console.warn(` [static] Could not load routes from "${n}". Using "/" only.`,e),r.length===0&&r.push(`/`)}if(t.dynamicRoutes)for(let e of t.dynamicRoutes)r.includes(e)||r.push(e);return r.length===0&&r.push(`/`),{paths:r,defs:i}}function ar(e,t,n,r,i){let a=/<!--ssr-([a-z][a-z0-9-]*)-->/g,o={head:t+`
248
+ <style>`+n+`</style>`,body:r,data:`<script id="serialized-server-data" type="application/json">`+i+`<\/script>`};return e.replace(a,(e,t)=>o[t]??``)}function or(e){return e.replace(/<!--ssr-([a-z][a-z0-9-]*)-->/g,()=>``)}function sr(e,t,n){if(n){if(n[e])return n[e];for(let[t,r]of Object.entries(n))if(t.includes(`*`)){let n=t.replace(/[.+?^${}()|[\]\\]/g,`\\$&`);if(RegExp(`^`+n.replace(/\*/g,`.*`)+`$`).test(e))return r}}return t??`ssr`}function cr(){return{name:`vercel`,async build(e){let{fs:t,path:n,root:r}=e,i=n.resolve(r,`.vercel/output`);t.rmSync(i,{recursive:!0,force:!0});let a=K(e,{platformImport:`import { getRequestListener } from "@hono/node-server";`,platformExport:[`const _listener = getRequestListener(app.fetch);`,`export default (req, res) => {`,` const m = req.headers["x-now-route-matches"];`,` if (typeof m === "string") {`,` try {`,` const p = new URLSearchParams(m);`,` const c = p.get("1");`,` if (c != null) {`,` const qi = (req.url || "").indexOf("?");`,` const qs = qi !== -1 ? req.url.slice(qi) : "";`,` req.url = "/" + decodeURIComponent(c) + qs;`,` }`,` } catch {}`,` }`,` return _listener(req, res);`,`};`].join(`
249
+ `)}),o=n.resolve(r,`.vercel-entry.tmp.mjs`);t.writeFileSync(o,a);try{let i=n.resolve(r,`.vercel/output/functions/ssr.func`);await q(e,{entry:`.vercel-entry.tmp.mjs`,outDir:i,target:`node18`}),t.writeFileSync(n.resolve(i,`.vc-config.json`),JSON.stringify({runtime:`nodejs20.x`,handler:`index.mjs`,launcherType:`Nodejs`},null,2)),J(e,n.resolve(r,`.vercel/output/static`)),t.writeFileSync(n.resolve(r,`.vercel/output/config.json`),JSON.stringify({version:3,routes:[{handle:`filesystem`},{src:`/(.*)`,dest:`/ssr`}]},null,2))}finally{t.rmSync(o,{force:!0})}let s=await Y(e),c=n.resolve(r,`.vercel/output/static`);for(let{url:e,html:r}of s){let i=e===`/`?n.join(c,`index.html`):n.join(c,e,`index.html`);t.mkdirSync(n.resolve(i,`..`),{recursive:!0}),t.writeFileSync(i,r)}if(s.length>0){let e=n.resolve(r,`.vercel/output/config.json`),i=JSON.parse(t.readFileSync(e,`utf-8`));i.overrides=i.overrides??{};for(let{url:e}of s){let t=e===`/`?`index.html`:`${e.replace(/^\//,``)}/index.html`;i.overrides[t]={path:e===`/`?`/`:e,contentType:`text/html; charset=utf-8`}}t.writeFileSync(e,JSON.stringify(i,null,2))}console.log(` Vercel output → .vercel/output/
250
+ `)}}}function X(e){if(typeof e!=`string`)return e;switch(e){case`vercel`:return cr();case`cloudflare`:return er();case`netlify`:return tr();case`node`:return nr();case`static`:return rr();case`auto`:return lr();default:throw Error(`[finesoft] Unknown adapter: "${e}". Available: vercel, cloudflare, netlify, node, static, auto`)}}function lr(){return{name:`auto`,async build(e){let t=ur();return console.log(` [auto] Detected platform: ${t}\n`),X(t).build(e)}}}function ur(){return process.env.VERCEL?`vercel`:process.env.CF_PAGES?`cloudflare`:process.env.NETLIFY?`netlify`:`node`}function dr(e,t=1){return((n,r)=>{if(typeof n==`string`&&n.startsWith(`/`)){let i=new Request(`http://localhost${n}`,r);return i.headers.set(`x-ssr-depth`,String(t)),Promise.resolve(e(i))}return globalThis.fetch(n,r)})}function fr(e,t){if(!t)return null;let n=e.split(`?`)[0];if(t[n])return t[n];for(let[e,r]of Object.entries(t))if(e.includes(`*`)){let t=e.replace(/[.+?^${}()|[\]\\]/g,`\\$&`);if(RegExp(`^`+t.replace(/\*/g,`.*`)+`$`).test(n))return r}return null}function Z(e){let{root:t,vite:n,isProduction:r,ssrEntryPath:i=`/src/ssr.ts`,ssrProductionModule:a,parentFetch:o,renderModes:s,defaultLocale:c}=e,l=new P,u=new k(1e3),d;async function f(e){if(!r&&n){let{readFileSync:r}=await U(`node:fs`),i=r((await U(`node:path`)).resolve(t,`index.html`),`utf-8`);return n.transformIndexHtml(e,i)}if(d)return d;if(globalThis.Deno!==void 0){let e=import.meta.url;return d=globalThis.Deno.readTextFileSync(new URL(`../dist/client/index.html`,e)),d}let{readFileSync:i}=await U(`node:fs`);return d=i((await U(`node:path`)).resolve(t,`dist/client/index.html`),`utf-8`),d}async function p(){if(!r&&n)return await n.ssrLoadModule(i);if(a)return U(a);let e=await U(`node:path`),{pathToFileURL:o}=await U(`node:url`),s=o(e.resolve(t,`dist/server/ssr.js`)).href;return U(s)}return l.get(`*`,async e=>{let t=parseInt(e.req.header(`x-ssr-depth`)??`0`,10);if(t>=5)return e.text(`SSR recursion loop detected`,508);let i=e.req.path+(e.req.url.includes(`?`)?`?`+e.req.url.split(`?`)[1]:``);try{let n=await f(i),r=await p();if(typeof r.render!=`function`||typeof r.serializeServerData!=`function`)throw Error(`[SSR] Module missing required exports: render, serializeServerData`);let{render:a,serializeServerData:l}=r,d=fr(i,s);if(d===`csr`)return e.html(z(n,c?A(c):void 0));let m=u.get(i);if(m)return e.html(m);let h=o?dr(o,t+1):void 0,g={request:e.req.raw};h&&(g.fetch=h);let{html:_,head:v,css:y,serverData:b,renderMode:x,redirect:S,slots:C,locale:w,status:T,rewriteUrl:E}=await a(i,g);if(S)return e.redirect(S.url,S.status);if(x===`csr`)return e.html(z(n,w));let D=R({template:n,head:v,css:y,html:_,serializedData:l(b),slots:C,locale:w});return(x===`prerender`||d===`prerender`)&&!T&&!E&&u.set(i,D),E&&e.header(`Content-Location`,E),T&&T>=400?e.html(D,T):e.html(D)}catch(t){return!r&&n&&n.ssrFixStacktrace(t),console.error(`[SSR Error]`,t),e.text(`Internal Server Error`,500)}}),l}function Q(){return{isDeno:globalThis.Deno!==void 0,isBun:globalThis.Bun!==void 0,isVercel:!!process.env.VERCEL,isProduction:process.env.NODE_ENV===`production`}}async function pr(e,t=0){if(globalThis.Deno!==void 0){let n=new URL(e);for(let e=0;e<t;e++)n=new URL(`..`,n);return n.pathname}let n=await U(`node:path`),{fileURLToPath:r}=await U(`node:url`),i=n.normalize(n.dirname(r(e)));for(let e=0;e<t;e++)i=n.resolve(i,`..`);return i}async function mr(e){let{app:t,root:n,port:r=3e3,isProduction:i,vite:a,routes:o,ssrEntryPath:s}=e,{isDeno:c,isBun:l,isVercel:u}=e.runtime??Q();function d(){let e=[`\n Server running at http://localhost:${r}\n`];if(o&&o.length>0){e.push(` Routes:`);for(let t of o)e.push(` ${t}`);e.push(``)}s&&e.push(` SSR Entry: ${s}`),s&&e.push(``),console.log(e.join(`
251
+ `))}if(u)return{vite:a};if(!i){let e=a;if(!e){let{createServer:t}=await U(`vite`);e=await t({root:n,server:{middlewareMode:!0},appType:`custom`})}let{getRequestListener:i}=await U(`@hono/node-server`),{createServer:o}=await U(`node:http`),s=i(t.fetch);return o((t,n)=>{e.middlewares(t,n,()=>s(t,n))}).listen(r,()=>{d()}),{vite:e}}if(c)globalThis.Deno.serve({port:r},t.fetch);else if(!l){let{serveStatic:e}=await U(`@hono/node-server/serve-static`),i=await U(`node:path`),a=new P,o=i.resolve(n,`dist/client`);a.use(`/*`,e({root:o,rewriteRequestPath:e=>e.endsWith(`/`)?`/__nosuchfile__`:e})),a.route(`/`,t);let{serve:s}=await U(`@hono/node-server`);s({fetch:a.fetch,port:r},()=>{d()})}return{vite:a}}async function hr(e={}){let{root:t,port:n=Number(process.env.PORT)||3e3,setup:r,proxies:i,ssr:a}=e,o=t??process.cwd(),{existsSync:s}=await U(`node:fs`),c=(await U(`node:path`)).resolve(o,`.env`);if(s(c))try{let{config:e}=await U(`dotenv`);e({path:c})}catch(e){console.warn(`[Server] Failed to load .env: ${e.message}`)}let l=Q(),u;if(!l.isProduction&&!l.isVercel){let{createServer:e}=await U(`vite`);u=await e({root:o,server:{middlewareMode:!0},appType:`custom`})}let d=new P;i?.length&&G(d,i),r&&await r(d);let f=Z({root:o,vite:u,isProduction:l.isProduction,parentFetch:d.fetch.bind(d),...a});return d.route(`/`,f),await mr({app:d,root:o,port:n,isProduction:l.isProduction,vite:u,runtime:l,ssrEntryPath:a?.ssrEntryPath}),{app:d,vite:u,runtime:l}}function gr(e,t,n){let r=t??[`zh`,`en`],i=n??r[0]??`en`;if(!e||e.length>1024)return i;let a=e.split(`,`);if(a.length>50)return i;let o=a.map(e=>{let[t,n]=e.trim().split(`;q=`),r=n?parseFloat(n):1;return{lang:t.trim().toLowerCase(),q:Number.isFinite(r)&&r>=0&&r<=1?r:0}}).filter(e=>e.q>0).sort((e,t)=>t.q-e.q);for(let{lang:e}of o){let t=e.split(`-`)[0];if(r.includes(t))return t}return i}const $=`virtual:finesoft-front/i18n-loader`,_r=`\0${$}`;function vr(e){return typeof e.default==`function`?e.default:typeof e.setup==`function`?e.setup:Object.values(e).find(e=>typeof e==`function`)??null}function yr(e,t){if(!t)return null;let n=e.split(`?`)[0];if(t[n])return t[n];for(let[e,r]of Object.entries(t))if(e.includes(`*`)){let t=e.replace(/[.+?^${}()|[\]\\]/g,`\\$&`);if(RegExp(`^`+t.replace(/\*/g,`.*`)+`$`).test(n))return r}return null}function br(e){return e.replace(/\\/g,`/`)}let xr=!1;function Sr(){xr||(xr=!0,console.log(`\n${(e=>`\x1b[33m${e}\x1b[0m`)(`[finesoft]`)} dev server is exposing source via /src/* and /@fs/* (HMR).\n`+(e=>`\x1b[2m${e}\x1b[0m`)(" Do NOT expose this server to untrusted networks; run `vp build && vp preview` for production.\n")))}async function Cr(e,t){let{existsSync:n}=await U(`node:fs`),r=await U(`node:path`),i=r.isAbsolute(t)?t:r.resolve(e,t);if(!n(i))throw Error(`[finesoftFrontViteConfig] i18n.messagesDir not found: ${t}`);let a=br(r.relative(e,i));if(!a||a.startsWith(`..`))throw Error(`[finesoftFrontViteConfig] i18n.messagesDir must stay inside the project root: ${t}`);return a.replace(/^\.\/+/,``)}function wr(e={}){let t=e.ssr?.entry??`src/ssr.ts`,n=process.cwd(),r,i,a,o=/\.(css|scss|less|sass|styl|stylus|pcss|postcss)($|\?)/;return{name:`finesoft-front`,config(t){let n={appType:`custom`,define:{__FINESOFT_I18N_LOADER_SPECIFIER__:e.i18n?.messagesDir?JSON.stringify($):`undefined`}};return process.env.__FINESOFT_SUB_BUILD__||(n.build={outDir:t.build?.outDir??`dist/client`}),n},configResolved(e){r=e.command,i=e.resolve,a=e.css,n=e.root},resolveId(t){return t===$&&e.i18n?.messagesDir?_r:null},async load(t){if(t!==_r||!e.i18n?.messagesDir)return null;let r=`/${await Cr(n,e.i18n.messagesDir)}`,i=`${r}/*.json`,a=`${r}/`;return`
252
252
  const localeModules = import.meta.glob(${JSON.stringify(i)}, { import: "default" });
253
253
 
254
254
  export async function loadMessages(locale) {
@@ -257,8 +257,8 @@ export async function loadMessages(locale) {
257
257
  const messages = await loader();
258
258
  return messages ?? undefined;
259
259
  }
260
- `},transformIndexHtml:{order:`pre`,async handler(e,t){let n=t.server;if(!n)return;let r=(t.originalUrl||t.path||``).split(`?`)[0];if(/\.\w+$/.test(r)&&!r.endsWith(`.html`))return;let i=[...e.matchAll(/<script\b[^>]*\bsrc=["']([^"']+)["'][^>]*>/g)].find(e=>!e[1].startsWith(`/@`));if(!i)return;let a=i[1];try{await n.transformRequest(a)}catch{return}let o=[],c=new Set;function l(e,t=0){if(!(t>100)&&!(!e?.url||c.has(e.url))&&(c.add(e.url),s.test(e.url)&&!e.url.includes(`.svelte`)&&o.push(e.url),e.importedModules))for(let n of e.importedModules)l(n,t+1)}let u=await n.moduleGraph.getModuleByUrl(a);if(u&&l(u),o.length===0)return;let d=[];for(let e of o)try{let t=(await n.ssrLoadModule(e))?.default;typeof t==`string`&&t.length>0&&d.push({tag:`style`,attrs:{"data-vite-dev-id":e},children:t,injectTo:`head`})}catch{}return d}},configureServer(r){return async()=>{let{Hono:i}=await H(`hono`),{getRequestListener:a}=await H(`@hono/node-server`);Qt();let o=new i;if(e.proxies?.length&&W(o,e.proxies),typeof e.setup==`function`)await e.setup(o);else if(typeof e.setup==`string`){let t=Yt(await r.ssrLoadModule(`/`+e.setup));t&&await t(o)}let s=X({root:n,vite:r,isProduction:!1,ssrEntryPath:`/`+t,parentFetch:o.fetch.bind(o),renderModes:e.renderModes,defaultLocale:e.defaultLocale});o.route(`/`,s);let c=a(o.fetch);r.middlewares.use((e,t)=>{c(e,t)})}},configurePreviewServer(t){return async()=>{let{readFileSync:r}=await H(`node:fs`),i=await H(`node:path`),{pathToFileURL:a}=await H(`node:url`),{Hono:s}=await H(`hono`),{getRequestListener:c}=await H(`@hono/node-server`),l=new s,u=new T(1e3);if(e.proxies?.length&&W(l,e.proxies),typeof e.setup==`function`)await e.setup(l);else if(typeof e.setup==`string`)try{let e=a(i.resolve(n,`dist/server/setup.mjs`)).href,t=Yt(await H(e));t&&await t(l)}catch{console.warn(`[finesoft] Could not load setup module for preview. API routes disabled.`)}let d=r(i.resolve(n,`dist/client/index.html`),`utf-8`),f=a(i.resolve(n,`dist/server/ssr.js`)).href,p=await H(f);l.get(`*`,async t=>{let n=parseInt(t.req.header(`x-ssr-depth`)??`0`,10);if(n>=5)return t.text(`SSR recursion loop detected`,508);let r=t.req.path+(t.req.url.includes(`?`)?`?`+t.req.url.split(`?`)[1]:``);try{let i=Xt(r,e.renderModes);if(i===`csr`)return t.html(L(d,e.defaultLocale?o(e.defaultLocale):void 0));let a=u.get(r);if(a)return t.html(a);let{html:s,head:c,css:f,serverData:m,renderMode:h,redirect:g,slots:_,locale:v,status:y,rewriteUrl:b}=await p.render(r,{fetch:Ht(l.fetch.bind(l),n+1)});if(g)return t.redirect(g.url,g.status);if(h===`csr`)return t.html(L(d,v));let x=I({template:d,head:c,css:f,html:s,serializedData:p.serializeServerData(m),slots:_,locale:v});return(h===`prerender`||i===`prerender`)&&!y&&!b&&u.set(r,x),b&&t.header(`Content-Location`,b),y&&y>=400?t.html(x,y):t.html(x)}catch(e){return console.error(`[SSR Preview Error]`,e),t.text(`Internal Server Error`,500)}});let m=c(l.fetch);t.middlewares.use((e,t)=>{m(e,t)})}},async closeBundle(){if(!process.env.__FINESOFT_SUB_BUILD__&&r===`build`){process.env.__FINESOFT_SUB_BUILD__=`1`;try{let r=await H(`vite`),o=await H(`node:fs`),s=await H(`node:path`);if(console.log(`
260
+ `},transformIndexHtml:{order:`pre`,async handler(e,t){let n=t.server;if(!n)return;let r=(t.originalUrl||t.path||``).split(`?`)[0];if(/\.\w+$/.test(r)&&!r.endsWith(`.html`))return;let i=[...e.matchAll(/<script\b[^>]*\bsrc=["']([^"']+)["'][^>]*>/g)].find(e=>!e[1].startsWith(`/@`));if(!i)return;let a=i[1];try{await n.transformRequest(a)}catch{return}let s=[],c=new Set;function l(e,t=0){if(!(t>100)&&!(!e?.url||c.has(e.url))&&(c.add(e.url),o.test(e.url)&&!e.url.includes(`.svelte`)&&s.push(e.url),e.importedModules))for(let n of e.importedModules)l(n,t+1)}let u=await n.moduleGraph.getModuleByUrl(a);if(u&&l(u),s.length===0)return;let d=[];for(let e of s)try{let t=(await n.ssrLoadModule(e))?.default;typeof t==`string`&&t.length>0&&d.push({tag:`style`,attrs:{"data-vite-dev-id":e},children:t,injectTo:`head`})}catch{}return d}},configureServer(r){return async()=>{let{Hono:i}=await U(`hono`),{getRequestListener:a}=await U(`@hono/node-server`);Sr();let o=new i;if(e.proxies?.length&&G(o,e.proxies),typeof e.setup==`function`)await e.setup(o);else if(typeof e.setup==`string`){let t=vr(await r.ssrLoadModule(`/`+e.setup));t&&await t(o)}let s=Z({root:n,vite:r,isProduction:!1,ssrEntryPath:`/`+t,parentFetch:o.fetch.bind(o),renderModes:e.renderModes,defaultLocale:e.defaultLocale});o.route(`/`,s);let c=a(o.fetch);r.middlewares.use((e,t)=>{c(e,t)})}},configurePreviewServer(t){return async()=>{let{readFileSync:r}=await U(`node:fs`),i=await U(`node:path`),{pathToFileURL:a}=await U(`node:url`),{Hono:o}=await U(`hono`),{getRequestListener:s}=await U(`@hono/node-server`),c=new o,l=new k(1e3);if(e.proxies?.length&&G(c,e.proxies),typeof e.setup==`function`)await e.setup(c);else if(typeof e.setup==`string`)try{let e=a(i.resolve(n,`dist/server/setup.mjs`)).href,t=vr(await U(e));t&&await t(c)}catch{console.warn(`[finesoft] Could not load setup module for preview. API routes disabled.`)}let u=r(i.resolve(n,`dist/client/index.html`),`utf-8`),d=a(i.resolve(n,`dist/server/ssr.js`)).href,f=await U(d);c.get(`*`,async t=>{let n=parseInt(t.req.header(`x-ssr-depth`)??`0`,10);if(n>=5)return t.text(`SSR recursion loop detected`,508);let r=t.req.path+(t.req.url.includes(`?`)?`?`+t.req.url.split(`?`)[1]:``);try{let i=yr(r,e.renderModes);if(i===`csr`)return t.html(z(u,e.defaultLocale?A(e.defaultLocale):void 0));let a=l.get(r);if(a)return t.html(a);let{html:o,head:s,css:d,serverData:p,renderMode:m,redirect:h,slots:g,locale:_,status:v,rewriteUrl:y}=await f.render(r,{fetch:dr(c.fetch.bind(c),n+1)});if(h)return t.redirect(h.url,h.status);if(m===`csr`)return t.html(z(u,_));let b=R({template:u,head:s,css:d,html:o,serializedData:f.serializeServerData(p),slots:g,locale:_});return(m===`prerender`||i===`prerender`)&&!v&&!y&&l.set(r,b),y&&t.header(`Content-Location`,y),v&&v>=400?t.html(b,v):t.html(b)}catch(e){return console.error(`[SSR Preview Error]`,e),t.text(`Internal Server Error`,500)}});let p=s(c.fetch);t.middlewares.use((e,t)=>{p(e,t)})}},async closeBundle(){if(!process.env.__FINESOFT_SUB_BUILD__&&r===`build`){process.env.__FINESOFT_SUB_BUILD__=`1`;try{let r=await U(`vite`),o=await U(`node:fs`),s=await U(`node:path`);if(console.log(`
261
261
  Building SSR bundle...
262
- `),await r.build({root:n,build:{ssr:t,outDir:`dist/server`},ssr:{external:At},resolve:i,css:a}),typeof e.setup==`string`&&(console.log(` Building setup module...
263
- `),await r.build({root:n,build:{ssr:e.setup,outDir:`dist/server`,emptyOutDir:!1,rollupOptions:{output:{entryFileNames:`setup.mjs`}}},resolve:i})),e.adapter){let c=Y(e.adapter),l=o.readFileSync(s.resolve(n,`dist/client/index.html`),`utf-8`),u={root:n,ssrEntry:t,setupPath:typeof e.setup==`string`?e.setup:void 0,bootstrapEntry:e.bootstrapEntry,templateHtml:l,renderModes:e.renderModes,proxies:e.proxies,locales:e.locales,defaultLocale:e.defaultLocale,resolvedResolve:i,resolvedCss:a,vite:r,fs:o,path:s,generateSSREntry(e){return G(u,e)},buildBundle(e){return K(u,e)},copyStaticAssets(e,t){return q(u,e,t)}};console.log(` Running adapter: ${c.name}...\n`),await c.build(u)}}finally{delete process.env.__FINESOFT_SUB_BUILD__}}}}}export{ie as ACTION_KINDS,x as ActionDispatcher,g as BASE_PAGE_FIELDS,D as BaseController,He as BaseLogger,Oe as CompositeEventRecorder,Ne as CompositeLogger,je as CompositeLoggerFactory,$e as ConsoleEventRecorder,rt as ConsoleLogger,Ee as ConsoleLoggerFactory,f as Container,O as DEP_KEYS,b as FINESOFT_PUBLIC,de as Framework,Ge as History,n as HostGuardError,Ie as HttpClient,C as HttpError,_ as IntentDispatcher,Te as IntersectionImpressionObserver,T as LruMap,m as PrefetchedIntents,we as ReportingLogger,Be as ReportingLoggerFactory,De as Router,mt as SSR_PLACEHOLDERS,ve as SimpleTranslator,nt as VoidEventRecorder,ze as WithFieldsRecorder,Bt as autoAdapter,v as bool,xe as buildUrl,w as classifyHost,te as classifyUrl,jt as cloudflareAdapter,_e as createBrowserContext,Ue as createPrefetchedIntentsFromDom,X as createSSRApp,pt as createSSRRender,Kt as createServer,k as createServerContext,Ze as defineRequestScopedKey,Le as defineRoutes,qe as deny,Xe as deserializeServerData,Ke as detectPlatform,Z as detectRuntime,it as englishPlural,en as finesoftFrontViteConfig,Ot as generateProxyCode,ct as generateUuid,st as getBaseUrl,o as getLocaleAttributes,se as getPWADisplayMode,re as getPublicFields,ot as getTextDirection,L as injectCSRShell,I as injectSSRContent,he as int,lt as interpolate,dt as isCompoundAction,i as isExternalUrlAction,fe as isFlowAction,l as isNone,ut as isPublicMarked,ce as isRtl,s as isSome,be as makeDependencies,h as makeExternalUrlAction,ue as makeFlowAction,u as makeLocaleInfo,tt as makeSchema,Fe as mapEach,r as markPublic,Mt as netlifyAdapter,Ve as next,Nt as nodeAdapter,me as num,ge as oneOf,y as optional,qt as parseAcceptLanguage,S as pipe,ee as pipeAsync,Me as redirect,Pe as registerActionHandlers,Ce as registerExternalUrlHandler,ye as registerFlowActionHandler,W as registerProxyRoutes,ae as removeHost,a as removeQueryParams,at as removeScheme,ke as resetFilterCache,Y as resolveAdapter,A as resolveConfiguredMessages,c as resolveLocaleFromUrl,oe as resolveMessages,Se as resolvePluralKey,Wt as resolveRoot,Ae as rewrite,t as route,pe as runAfterLoadGuards,p as runBeforeLoadGuards,We as runStandard,d as safeErrorPage,Re as secureFetch,yt as serializeServerData,E as setHtmlLocaleAttributes,Je as shouldLog,M as ssrRender,le as stableStringify,et as startBrowserApp,Gt as startServer,Pt as staticAdapter,ne as str,Qe as tryScroll,e as uuid,zt as vercelAdapter,Ye as withDefault};
262
+ `),await r.build({root:n,build:{ssr:t,outDir:`dist/server`},ssr:{external:$n},resolve:i,css:a}),typeof e.setup==`string`&&(console.log(` Building setup module...
263
+ `),await r.build({root:n,build:{ssr:e.setup,outDir:`dist/server`,emptyOutDir:!1,rollupOptions:{output:{entryFileNames:`setup.mjs`}}},resolve:i})),e.adapter){let c=X(e.adapter),l=o.readFileSync(s.resolve(n,`dist/client/index.html`),`utf-8`),u={root:n,ssrEntry:t,setupPath:typeof e.setup==`string`?e.setup:void 0,bootstrapEntry:e.bootstrapEntry,templateHtml:l,renderModes:e.renderModes,proxies:e.proxies,locales:e.locales,defaultLocale:e.defaultLocale,resolvedResolve:i,resolvedCss:a,vite:r,fs:o,path:s,generateSSREntry(e){return K(u,e)},buildBundle(e){return q(u,e)},copyStaticAssets(e,t){return J(u,e,t)}};console.log(` Running adapter: ${c.name}...\n`),await c.build(u)}}finally{delete process.env.__FINESOFT_SUB_BUILD__}}}}}export{je as ACTION_KINDS,w as ActionDispatcher,j as BASE_PAGE_FIELDS,mn as BaseController,un as BaseLogger,on as CompositeEventRecorder,Ze as CompositeLogger,sn as CompositeLoggerFactory,st as ConsoleEventRecorder,pt as ConsoleLogger,ut as ConsoleLoggerFactory,o as Container,Yt as DEFAULT_NAV_PARAM,wt as DEP_KEYS,T as FINESOFT_PUBLIC,O as Framework,ft as History,v as HostGuardError,D as HttpClient,oe as HttpError,Pe as IntentDispatcher,Xe as IntersectionImpressionObserver,k as LruMap,pe as NAVIGATION_NODE_KINDS,e as NAVIGATION_OP_KINDS,V as NAVIGATION_TREE_INTENT_ID,ve as NavigationError,Bt as PrefetchedIntents,It as ReportingLogger,Dt as ReportingLoggerFactory,Je as Router,ht as SESSION_DEFAULT_DEBOUNCE_MS,ie as SESSION_DEFAULT_KEY,Rt as SESSION_DEFAULT_VERSION,y as SPLIT_VISIBILITIES,vn as SSR_PLACEHOLDERS,te as SessionError,Te as SimpleTranslator,ln as VoidEventRecorder,$t as WithFieldsRecorder,lr as autoAdapter,t as bool,xt as buildUrl,Se as classifyHost,pn as classifyUrl,er as cloudflareAdapter,Qt as collectAllLeaves,Ne as collectLeafKeys,rt as collectVisibleDestinations,jt as createActiveLeafCodec,ot as createAppHandle,m as createBrowserContext,tt as createDomRestore,Ut as createFlatStackCodec,_t as createFullStateCodec,Xt as createIslandOrchestrator,Ct as createNavigationBridge,at as createNavigationController,C as createNavigationScopedState,xe as createNavigationSessionAdapter,Wt as createPrefetchedIntentsFromDom,Z as createSSRApp,Nn as createSSRNavigationRender,_n as createSSRRender,hr as createServer,d as createServerContext,qe as createSessionBridge,a as createSessionStore,fn as createUrlSessionAdapter,Vt as createWebStorage,Ye as decodeNavigationTreeParam,Fe as decodeSnapshot,Mt as defaultShouldRestore,ye as defineNavigation,et as defineRequestScopedKey,Re as defineRoutes,we as deny,Kt as deserializeNavigation,$e as deserializeServerData,nt as detectPlatform,Q as detectRuntime,Pt as encodeNavigationTreeParam,b as encodeSnapshot,l as englishPlural,On as extractNavigationTree,ct as findNearestStack,Lt as findNode,wr as finesoftFrontViteConfig,Zn as generateProxyCode,me as generateUuid,n as getBaseUrl,A as getLocaleAttributes,ge as getPWADisplayMode,Me as getPublicFields,St as getTextDirection,z as injectCSRShell,R as injectSSRContent,it as int,rn as interpolate,Ie as isCompoundAction,x as isExternalUrlAction,ae as isFlowAction,ke as isLeafNode,_ as isNone,Le as isPublicMarked,r as isRtl,E as isSome,g as isSplitNode,p as isStackNode,he as isTabsNode,Be as isUrlLocation,an as islandContainerAttributes,N as leaf,Zt as makeDependencies,zt as makeExternalUrlAction,ne as makeFlowAction,yt as makeLocaleInfo,Nt as makeSchema,ee as mapEach,S as markPublic,tr as netlifyAdapter,c as next,nr as nodeAdapter,Jt as num,At as oneOf,Ue as optional,gr as parseAcceptLanguage,se as pipe,Ce as pipeAsync,Ot as pop,mt as popTo,dt as popToRoot,Ke as push,nn as redirect,Ft as registerActionHandlers,We as registerExternalUrlHandler,Et as registerFlowActionHandler,G as registerProxyRoutes,vt as removeHost,ce as removeQueryParams,de as removeScheme,Wn as renderIslandsHtml,tn as replaceTop,Ge as resetFilterCache,dn as resolveActivePath,X as resolveAdapter,h as resolveConfiguredMessages,qt as resolveIslandsShell,le as resolveLocaleFromUrl,f as resolveMessages,Oe as resolvePluralKey,pr as resolveRoot,De as rewrite,He as route,Ve as runAfterLoadGuards,ze as runBeforeLoadGuards,Gt as runStandard,s as safeErrorPage,_e as secureFetch,Qe as selectColumn,cn as selectTab,M as serializeNavigation,Tt as serializeNavigationStable,Ln as serializeServerData,Ae as sessionEntryKey,fe as setHtmlLocaleAttributes,Ee as setVisibility,en as shouldLog,i as split,hn as ssrRender,H as ssrRenderNavigation,re as stableStringify,bt as stack,kt as startBrowserApp,mr as startServer,rr as staticAdapter,Ht as str,kn as stripNavigationTree,ue as tabs,lt as tryScroll,gt as uuid,cr as vercelAdapter,u as visibleSplitColumns,be as withDefault};
264
264
  //# sourceMappingURL=index.mjs.map