@alepha/react 0.6.10 → 0.7.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useActive-BX41CqY8.js","sources":["../src/descriptors/$page.ts","../src/contexts/RouterContext.ts","../src/contexts/RouterLayerContext.ts","../src/hooks/useRouterEvents.ts","../src/components/ErrorBoundary.tsx","../src/components/NestedView.tsx","../src/errors/RedirectionError.ts","../src/providers/PageDescriptorProvider.ts","../src/providers/BrowserHeadProvider.ts","../src/providers/BrowserRouterProvider.ts","../src/providers/ReactBrowserProvider.ts","../src/hooks/RouterHookApi.ts","../src/hooks/useRouter.ts","../src/components/Link.tsx","../src/hooks/useInject.ts","../src/hooks/useClient.ts","../src/hooks/useQueryParams.ts","../src/hooks/useRouterState.ts","../src/hooks/useActive.ts"],"sourcesContent":["import { type Async, OPTIONS, type Static, type TSchema } from \"@alepha/core\";\nimport { KIND, NotImplementedError, __descriptor } from \"@alepha/core\";\nimport type { FC, ReactNode } from \"react\";\nimport type { RouterHookApi } from \"../hooks/RouterHookApi.ts\";\nimport type { PageReactContext } from \"../providers/PageDescriptorProvider.ts\";\n\nconst KEY = \"PAGE\";\n\nexport interface PageConfigSchema {\n\tquery?: TSchema;\n\tparams?: TSchema;\n}\n\nexport type TPropsDefault = any;\n\nexport type TPropsParentDefault = object;\n\nexport interface PageDescriptorOptions<\n\tTConfig extends PageConfigSchema = PageConfigSchema,\n\tTProps extends object = TPropsDefault,\n\tTPropsParent extends object = TPropsParentDefault,\n> {\n\tname?: string;\n\n\tpath?: string;\n\n\tschema?: TConfig;\n\n\tresolve?: (config: PageResolve<TConfig, TPropsParent>) => Async<TProps>;\n\n\tcomponent?: FC<TProps & TPropsParent>;\n\n\tlazy?: () => Promise<{ default: FC<TProps & TPropsParent> }>;\n\n\tchildren?: Array<{ [OPTIONS]: PageDescriptorOptions }>;\n\n\tparent?: { [OPTIONS]: PageDescriptorOptions<any, TPropsParent> };\n\n\tcan?: () => boolean;\n\n\thead?: Head | ((props: TProps, previous?: Head) => Head);\n\n\terrorHandler?: (error: Error) => ReactNode;\n}\n\nexport interface PageDescriptor<\n\tTConfig extends PageConfigSchema = PageConfigSchema,\n\tTProps extends object = TPropsDefault,\n\tTPropsParent extends object = TPropsParentDefault,\n> {\n\t[KIND]: typeof KEY;\n\t[OPTIONS]: PageDescriptorOptions<TConfig, TProps, TPropsParent>;\n\n\trender: (options?: {\n\t\tparams?: Record<string, string>;\n\t\tquery?: Record<string, string>;\n\t}) => Promise<string>;\n\tgo: () => void;\n\tcreateAnchorProps: (routerHook: RouterHookApi) => {\n\t\thref: string;\n\t\tonClick: () => void;\n\t};\n\tcan: () => boolean;\n}\n\nexport const $page = <\n\tTConfig extends PageConfigSchema = PageConfigSchema,\n\tTProps extends object = TPropsDefault,\n\tTPropsParent extends object = TPropsParentDefault,\n>(\n\toptions: PageDescriptorOptions<TConfig, TProps, TPropsParent>,\n): PageDescriptor<TConfig, TProps, TPropsParent> => {\n\t__descriptor(KEY);\n\n\tif (options.children) {\n\t\tfor (const child of options.children) {\n\t\t\tchild[OPTIONS].parent = {\n\t\t\t\t[OPTIONS]: options as PageDescriptorOptions<any, any, any>,\n\t\t\t};\n\t\t}\n\t}\n\n\tif (options.parent) {\n\t\toptions.parent[OPTIONS].children ??= [];\n\t\toptions.parent[OPTIONS].children.push({\n\t\t\t[OPTIONS]: options as PageDescriptorOptions<any, any, any>,\n\t\t});\n\t}\n\n\treturn {\n\t\t[KIND]: KEY,\n\t\t[OPTIONS]: options,\n\t\trender: () => {\n\t\t\tthrow new NotImplementedError(KEY);\n\t\t},\n\t\tgo: () => {\n\t\t\tthrow new NotImplementedError(KEY);\n\t\t},\n\t\tcreateAnchorProps: () => {\n\t\t\tthrow new NotImplementedError(KEY);\n\t\t},\n\t\tcan: () => {\n\t\t\tif (options.can) {\n\t\t\t\treturn options.can();\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t};\n};\n\n$page[KIND] = KEY;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface Head {\n\ttitle?: string;\n\ttitleSeparator?: string;\n\thtmlAttributes?: Record<string, string>;\n\tbodyAttributes?: Record<string, string>;\n\tmeta?: Array<{ name: string; content: string }>;\n}\n\nexport interface PageRequestConfig<\n\tTConfig extends PageConfigSchema = PageConfigSchema,\n> {\n\tparams: TConfig[\"params\"] extends TSchema\n\t\t? Static<TConfig[\"params\"]>\n\t\t: Record<string, string>;\n\n\tquery: TConfig[\"query\"] extends TSchema\n\t\t? Static<TConfig[\"query\"]>\n\t\t: Record<string, string>;\n}\n\nexport type PageResolve<\n\tTConfig extends PageConfigSchema = PageConfigSchema,\n\tTPropsParent extends object = TPropsParentDefault,\n> = PageRequestConfig<TConfig> & TPropsParent & PageReactContext;\n","import type { Alepha } from \"@alepha/core\";\nimport { createContext } from \"react\";\nimport type {\n\tPageReactContext,\n\tRouterState,\n} from \"../providers/PageDescriptorProvider.ts\";\n\nexport interface RouterContextValue {\n\talepha: Alepha;\n\tstate: RouterState;\n\tcontext: PageReactContext;\n}\n\nexport const RouterContext = createContext<RouterContextValue | undefined>(\n\tundefined,\n);\n","import { createContext } from \"react\";\n\nexport interface RouterLayerContextValue {\n\tindex: number;\n\tpath: string;\n}\n\nexport const RouterLayerContext = createContext<\n\tRouterLayerContextValue | undefined\n>(undefined);\n","import { useContext, useEffect } from \"react\";\nimport { RouterContext } from \"../contexts/RouterContext.ts\";\nimport type { RouterState } from \"../providers/PageDescriptorProvider.ts\";\n\nexport const useRouterEvents = (\n\topts: {\n\t\tonBegin?: (ev: { state: RouterState }) => void;\n\t\tonEnd?: (ev: { state: RouterState }) => void;\n\t\tonError?: (ev: { state: RouterState; error: Error }) => void;\n\t} = {},\n\tdeps: any[] = [],\n) => {\n\tconst ctx = useContext(RouterContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"useRouter must be used within a RouterProvider\");\n\t}\n\n\tuseEffect(() => {\n\t\tif (!ctx.alepha.isBrowser()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst subs: Function[] = [];\n\t\tconst onBegin = opts.onBegin;\n\t\tconst onEnd = opts.onEnd;\n\t\tconst onError = opts.onError;\n\n\t\tif (onBegin) {\n\t\t\tsubs.push(\n\t\t\t\tctx.alepha.on(\"react:transition:begin\", {\n\t\t\t\t\tcallback: onBegin,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (onEnd) {\n\t\t\tsubs.push(\n\t\t\t\tctx.alepha.on(\"react:transition:end\", {\n\t\t\t\t\tcallback: onEnd,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (onError) {\n\t\t\tsubs.push(\n\t\t\t\tctx.alepha.on(\"react:transition:error\", {\n\t\t\t\t\tcallback: onError,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\treturn () => {\n\t\t\tfor (const sub of subs) {\n\t\t\t\tsub();\n\t\t\t}\n\t\t};\n\t}, deps);\n};\n","import React, {\n\ttype ReactNode,\n\ttype ErrorInfo,\n\ttype PropsWithChildren,\n} from \"react\";\n\n/**\n * Props for the ErrorBoundary component.\n */\nexport interface ErrorBoundaryProps {\n\t/**\n\t * Fallback React node to render when an error is caught.\n\t * If not provided, a default error message will be shown.\n\t */\n\tfallback: (error: Error) => ReactNode;\n\n\t/**\n\t * Optional callback that receives the error and error info.\n\t * Use this to log errors to a monitoring service.\n\t */\n\tonError?: (error: Error, info: ErrorInfo) => void;\n}\n\n/**\n * State of the ErrorBoundary component.\n */\ninterface ErrorBoundaryState {\n\terror?: Error;\n}\n\n/**\n * A reusable error boundary for catching rendering errors\n * in any part of the React component tree.\n */\nexport class ErrorBoundary extends React.Component<\n\tPropsWithChildren<ErrorBoundaryProps>,\n\tErrorBoundaryState\n> {\n\tconstructor(props: ErrorBoundaryProps) {\n\t\tsuper(props);\n\t\tthis.state = {};\n\t}\n\n\t/**\n\t * Update state so the next render shows the fallback UI.\n\t */\n\tstatic getDerivedStateFromError(error: Error): ErrorBoundaryState {\n\t\treturn {\n\t\t\terror,\n\t\t};\n\t}\n\n\t/**\n\t * Lifecycle method called when an error is caught.\n\t * You can log the error or perform side effects here.\n\t */\n\tcomponentDidCatch(error: Error, info: ErrorInfo): void {\n\t\tif (this.props.onError) {\n\t\t\tthis.props.onError(error, info);\n\t\t}\n\t}\n\n\trender(): ReactNode {\n\t\tif (this.state.error) {\n\t\t\treturn this.props.fallback(this.state.error);\n\t\t}\n\n\t\treturn this.props.children;\n\t}\n}\n\nexport default ErrorBoundary;\n","import type { ReactNode } from \"react\";\nimport { useContext, useState } from \"react\";\nimport { RouterContext } from \"../contexts/RouterContext.ts\";\nimport { RouterLayerContext } from \"../contexts/RouterLayerContext.ts\";\nimport { useRouterEvents } from \"../hooks/useRouterEvents.ts\";\nimport ErrorBoundary from \"./ErrorBoundary.tsx\";\n\nexport interface NestedViewProps {\n\tchildren?: ReactNode;\n}\n\n/**\n * Nested view component\n *\n * @param props\n * @constructor\n */\nconst NestedView = (props: NestedViewProps) => {\n\tconst app = useContext(RouterContext);\n\tconst layer = useContext(RouterLayerContext);\n\tconst index = layer?.index ?? 0;\n\n\tconst [view, setView] = useState<ReactNode | undefined>(\n\t\tapp?.state.layers[index]?.element,\n\t);\n\n\tuseRouterEvents(\n\t\t{\n\t\t\tonEnd: ({ state }) => {\n\t\t\t\tsetView(state.layers[index]?.element);\n\t\t\t},\n\t\t},\n\t\t[app],\n\t);\n\n\tif (!app) {\n\t\tthrow new Error(\"NestedView must be used within a RouterContext.\");\n\t}\n\n\tconst element = view ?? props.children ?? null;\n\n\treturn (\n\t\t<ErrorBoundary fallback={app.context.onError!}>{element}</ErrorBoundary>\n\t);\n};\n\nexport default NestedView;\n","import type { HrefLike } from \"../hooks/RouterHookApi.ts\";\n\nexport class RedirectionError extends Error {\n\tconstructor(public readonly page: HrefLike) {\n\t\tsuper(\"Redirection\");\n\t}\n}\n","import { $hook, $inject, $logger, Alepha, OPTIONS } from \"@alepha/core\";\nimport type { ApiLinksResponse } from \"@alepha/server\";\nimport { type ReactNode, createElement } from \"react\";\nimport NestedView from \"../components/NestedView.tsx\";\nimport { RouterContext } from \"../contexts/RouterContext.ts\";\nimport { RouterLayerContext } from \"../contexts/RouterLayerContext.ts\";\nimport {\n\t$page,\n\ttype Head,\n\ttype PageDescriptorOptions,\n} from \"../descriptors/$page.ts\";\nimport { RedirectionError } from \"../errors/RedirectionError.ts\";\n\nexport class PageDescriptorProvider {\n\tprotected readonly log = $logger();\n\tprotected readonly alepha = $inject(Alepha);\n\tprotected readonly pages: PageRoute[] = [];\n\n\tpublic getPages(): PageRoute[] {\n\t\treturn this.pages;\n\t}\n\n\tpublic page(name: string): PageRoute {\n\t\tfor (const page of this.pages) {\n\t\t\tif (page.name === name) {\n\t\t\t\treturn page;\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error(`Page ${name} not found`);\n\t}\n\n\tpublic root(state: RouterState, context: PageReactContext): ReactNode {\n\t\treturn createElement(\n\t\t\tRouterContext.Provider,\n\t\t\t{\n\t\t\t\tvalue: {\n\t\t\t\t\talepha: this.alepha,\n\t\t\t\t\tstate,\n\t\t\t\t\tcontext,\n\t\t\t\t},\n\t\t\t},\n\t\t\tcreateElement(NestedView, {}, state.layers[0]?.element),\n\t\t);\n\t}\n\n\tpublic async createLayers(\n\t\troute: PageRoute,\n\t\trequest: PageRequest,\n\t): Promise<CreateLayersResult> {\n\t\tconst { pathname, search } = request.url;\n\t\tconst layers: Layer[] = []; // result layers\n\t\tlet context: Record<string, any> = {}; // all props\n\t\tconst stack: Array<RouterStackItem> = [{ route }]; // stack of routes\n\t\tlet onError = this.renderError; // error handler\n\n\t\tlet parent = route.parent;\n\t\twhile (parent) {\n\t\t\tstack.unshift({ route: parent });\n\t\t\tparent = parent.parent;\n\t\t}\n\n\t\tlet forceRefresh = false;\n\n\t\tfor (let i = 0; i < stack.length; i++) {\n\t\t\tconst it = stack[i];\n\t\t\tconst route = it.route;\n\t\t\tconst config: Record<string, any> = {};\n\n\t\t\ttry {\n\t\t\t\tconfig.query = route.schema?.query\n\t\t\t\t\t? this.alepha.parse(route.schema.query, request.query)\n\t\t\t\t\t: request.query;\n\t\t\t} catch (e) {\n\t\t\t\tit.error = e as Error;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconfig.params = route.schema?.params\n\t\t\t\t\t? this.alepha.parse(route.schema.params, request.params)\n\t\t\t\t\t: request.params;\n\t\t\t} catch (e) {\n\t\t\t\tit.error = e as Error;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// save config\n\t\t\tit.config = {\n\t\t\t\t...config,\n\t\t\t};\n\n\t\t\t// no resolve, render a basic view by default\n\t\t\tif (!route.resolve) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// check if previous layer is the same, reuse if possible\n\t\t\tconst previous = request.previous;\n\t\t\tif (previous?.[i] && !forceRefresh && previous[i].name === route.name) {\n\t\t\t\tconst url = (str?: string) => (str ? str.replace(/\\/\\/+/g, \"/\") : \"/\");\n\n\t\t\t\tconst prev = JSON.stringify({\n\t\t\t\t\tpart: url(previous[i].part),\n\t\t\t\t\tparams: previous[i].config?.params ?? {},\n\t\t\t\t});\n\n\t\t\t\tconst curr = JSON.stringify({\n\t\t\t\t\tpart: url(route.path),\n\t\t\t\t\tparams: config.params ?? {},\n\t\t\t\t});\n\n\t\t\t\tif (prev === curr) {\n\t\t\t\t\t// part is the same, reuse previous layer\n\t\t\t\t\tit.props = previous[i].props;\n\t\t\t\t\tit.error = previous[i].error;\n\t\t\t\t\tcontext = {\n\t\t\t\t\t\t...context,\n\t\t\t\t\t\t...it.props,\n\t\t\t\t\t};\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// part is different, force refresh of next layers\n\t\t\t\tforceRefresh = true;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst props =\n\t\t\t\t\t(await route.resolve?.({\n\t\t\t\t\t\t...request, // request\n\t\t\t\t\t\t...config, // params, query\n\t\t\t\t\t\t...context, // previous props\n\t\t\t\t\t} as any)) ?? {};\n\n\t\t\t\t// save props\n\t\t\t\tit.props = {\n\t\t\t\t\t...props,\n\t\t\t\t};\n\n\t\t\t\t// add props to context\n\t\t\t\tcontext = {\n\t\t\t\t\t...context,\n\t\t\t\t\t...props,\n\t\t\t\t};\n\t\t\t} catch (e) {\n\t\t\t\t// check if we need to redirect\n\t\t\t\tif (e instanceof RedirectionError) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tlayers: [],\n\t\t\t\t\t\tredirect: typeof e.page === \"string\" ? e.page : this.href(e.page),\n\t\t\t\t\t\tpathname,\n\t\t\t\t\t\tsearch,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tthis.log.error(e);\n\n\t\t\t\tit.error = e as Error;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tlet acc = \"\";\n\t\tfor (let i = 0; i < stack.length; i++) {\n\t\t\tconst it = stack[i];\n\t\t\tconst props = it.props ?? {};\n\n\t\t\tconst params = { ...it.config?.params };\n\t\t\tfor (const key of Object.keys(params)) {\n\t\t\t\tparams[key] = String(params[key]);\n\t\t\t}\n\n\t\t\tif (it.route.head && !it.error) {\n\t\t\t\tthis.fillHead(it.route, request, {\n\t\t\t\t\t...props,\n\t\t\t\t\t...context,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tacc += \"/\";\n\t\t\tacc += it.route.path ? this.compile(it.route.path, params) : \"\";\n\t\t\tconst path = acc.replace(/\\/+/, \"/\");\n\t\t\tconst localErrorHandler = this.getErrorHandler(it.route);\n\t\t\tif (localErrorHandler) {\n\t\t\t\tonError = localErrorHandler;\n\t\t\t}\n\n\t\t\t// handler has thrown an error, render an error view\n\t\t\tif (it.error) {\n\t\t\t\tconst element = await onError(it.error);\n\n\t\t\t\tlayers.push({\n\t\t\t\t\tprops,\n\t\t\t\t\terror: it.error,\n\t\t\t\t\tname: it.route.name,\n\t\t\t\t\tpart: it.route.path,\n\t\t\t\t\tconfig: it.config,\n\t\t\t\t\telement: this.renderView(i + 1, path, element),\n\t\t\t\t\tindex: i + 1,\n\t\t\t\t\tpath,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// normal use case\n\n\t\t\tconst layer = await this.createElement(it.route, {\n\t\t\t\t...props,\n\t\t\t\t...context,\n\t\t\t});\n\n\t\t\tlayers.push({\n\t\t\t\tname: it.route.name,\n\t\t\t\tprops,\n\t\t\t\tpart: it.route.path,\n\t\t\t\tconfig: it.config,\n\t\t\t\telement: this.renderView(i + 1, path, layer),\n\t\t\t\tindex: i + 1,\n\t\t\t\tpath,\n\t\t\t});\n\t\t}\n\n\t\treturn { layers, pathname, search };\n\t}\n\n\tprotected getErrorHandler(route: PageRoute) {\n\t\tif (route.errorHandler) return route.errorHandler;\n\t\tlet parent = route.parent;\n\t\twhile (parent) {\n\t\t\tif (parent.errorHandler) return parent.errorHandler;\n\t\t\tparent = parent.parent;\n\t\t}\n\t}\n\n\tprotected async createElement(\n\t\tpage: PageRoute,\n\t\tprops: Record<string, any>,\n\t): Promise<ReactNode> {\n\t\tif (page.lazy) {\n\t\t\tconst component = await page.lazy(); // load component\n\t\t\treturn createElement(component.default, props);\n\t\t}\n\n\t\tif (page.component) {\n\t\t\treturn createElement(page.component, props);\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprotected fillHead(\n\t\tpage: PageRoute,\n\t\tctx: PageRequest,\n\t\tprops: Record<string, any>,\n\t): void {\n\t\tif (!page.head) {\n\t\t\treturn;\n\t\t}\n\n\t\tctx.head ??= {};\n\n\t\tconst head =\n\t\t\ttypeof page.head === \"function\" ? page.head(props, ctx.head) : page.head;\n\n\t\tif (head.title) {\n\t\t\tctx.head ??= {};\n\n\t\t\tif (ctx.head.titleSeparator) {\n\t\t\t\tctx.head.title = `${head.title}${ctx.head.titleSeparator}${ctx.head.title}`;\n\t\t\t} else {\n\t\t\t\tctx.head.title = head.title;\n\t\t\t}\n\n\t\t\tctx.head.titleSeparator = head.titleSeparator;\n\t\t}\n\n\t\tif (head.htmlAttributes) {\n\t\t\tctx.head.htmlAttributes = {\n\t\t\t\t...ctx.head.htmlAttributes,\n\t\t\t\t...head.htmlAttributes,\n\t\t\t};\n\t\t}\n\n\t\tif (head.bodyAttributes) {\n\t\t\tctx.head.bodyAttributes = {\n\t\t\t\t...ctx.head.bodyAttributes,\n\t\t\t\t...head.bodyAttributes,\n\t\t\t};\n\t\t}\n\n\t\tif (head.meta) {\n\t\t\tctx.head.meta = [...(ctx.head.meta ?? []), ...(head.meta ?? [])];\n\t\t}\n\t}\n\n\tpublic renderError(e: Error): ReactNode {\n\t\treturn createElement(\"pre\", { style: { overflow: \"auto\" } }, `${e.stack}`);\n\t}\n\n\tpublic renderEmptyView(): ReactNode {\n\t\treturn createElement(NestedView, {});\n\t}\n\n\tpublic href(\n\t\tpage: { options: { name?: string } },\n\t\tparams: Record<string, any> = {},\n\t): string {\n\t\tconst found = this.pages.find((it) => it.name === page.options.name);\n\t\tif (!found) {\n\t\t\tthrow new Error(`Page ${page.options.name} not found`);\n\t\t}\n\n\t\tlet url = found.path ?? \"\";\n\t\tlet parent = found.parent;\n\t\twhile (parent) {\n\t\t\turl = `${parent.path ?? \"\"}/${url}`;\n\t\t\tparent = parent.parent;\n\t\t}\n\n\t\turl = this.compile(url, params);\n\n\t\treturn url.replace(/\\/\\/+/g, \"/\") || \"/\";\n\t}\n\n\tpublic compile(path: string, params: Record<string, string> = {}) {\n\t\tfor (const [key, value] of Object.entries(params)) {\n\t\t\tpath = path.replace(`:${key}`, value);\n\t\t}\n\t\treturn path;\n\t}\n\n\tprotected renderView(\n\t\tindex: number,\n\t\tpath: string,\n\t\tview: ReactNode = this.renderEmptyView(),\n\t): ReactNode {\n\t\treturn createElement(\n\t\t\tRouterLayerContext.Provider,\n\t\t\t{\n\t\t\t\tvalue: {\n\t\t\t\t\tindex,\n\t\t\t\t\tpath,\n\t\t\t\t},\n\t\t\t},\n\t\t\tview,\n\t\t);\n\t}\n\n\tprotected readonly configure = $hook({\n\t\tname: \"configure\",\n\t\thandler: () => {\n\t\t\tconst pages = this.alepha.getDescriptorValues($page);\n\t\t\tfor (const { value, key } of pages) {\n\t\t\t\tvalue[OPTIONS].name ??= key;\n\n\t\t\t\t// skip children, we only want root pages\n\t\t\t\tif (value[OPTIONS].parent) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tthis.add(this.map(pages, value));\n\t\t\t}\n\t\t},\n\t});\n\n\tprotected map(\n\t\tpages: Array<{ value: { [OPTIONS]: PageDescriptorOptions } }>,\n\t\ttarget: { [OPTIONS]: PageDescriptorOptions },\n\t): PageRouteEntry {\n\t\tconst children = target[OPTIONS].children ?? [];\n\n\t\tfor (const it of pages) {\n\t\t\tif (it.value[OPTIONS].parent === target) {\n\t\t\t\tchildren.push(it.value);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t...target[OPTIONS],\n\t\t\tparent: undefined,\n\t\t\tchildren: children.map((it) => this.map(pages, it)),\n\t\t} as PageRoute;\n\t}\n\n\tpublic add(entry: PageRouteEntry) {\n\t\tif (this.alepha.isReady()) {\n\t\t\tthrow new Error(\"Router is already initialized\");\n\t\t}\n\n\t\tentry.name ??= this.nextId();\n\t\tconst page = entry as PageRoute;\n\n\t\tpage.match = this.createMatch(page);\n\t\tthis.pages.push(page);\n\n\t\tif (page.children) {\n\t\t\tfor (const child of page.children) {\n\t\t\t\t(child as PageRoute).parent = page;\n\t\t\t\tthis.add(child);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected createMatch(page: PageRoute): string {\n\t\tlet url = page.path ?? \"/\";\n\t\tlet target = page.parent;\n\t\twhile (target) {\n\t\t\turl = `${target.path ?? \"\"}/${url}`;\n\t\t\ttarget = target.parent;\n\t\t}\n\n\t\tlet path = url.replace(/\\/\\/+/g, \"/\");\n\n\t\tif (path.endsWith(\"/\") && path !== \"/\") {\n\t\t\t// remove trailing slash\n\t\t\tpath = path.slice(0, -1);\n\t\t}\n\n\t\treturn path;\n\t}\n\n\tprotected _next = 0;\n\n\tprotected nextId(): string {\n\t\tthis._next += 1;\n\t\treturn `P${this._next}`;\n\t}\n}\n\nexport const isPageRoute = (it: any): it is PageRoute => {\n\treturn (\n\t\tit &&\n\t\ttypeof it === \"object\" &&\n\t\ttypeof it.path === \"string\" &&\n\t\ttypeof it.page === \"object\"\n\t);\n};\n\nexport interface PageRouteEntry\n\textends Omit<PageDescriptorOptions, \"children\" | \"parent\"> {\n\tchildren?: PageRouteEntry[];\n}\n\nexport interface PageRoute extends PageRouteEntry {\n\ttype: \"page\";\n\tname: string;\n\tparent?: PageRoute;\n\tmatch: string;\n}\n\nexport interface Layer {\n\tconfig?: {\n\t\tquery?: Record<string, any>;\n\t\tparams?: Record<string, any>;\n\t\t// stack of resolved props\n\t\tcontext?: Record<string, any>;\n\t};\n\n\tname: string;\n\tprops?: Record<string, any>;\n\terror?: Error;\n\tpart?: string;\n\telement: ReactNode;\n\tindex: number;\n\tpath: string;\n}\n\nexport type PreviousLayerData = Omit<Layer, \"element\">;\n\nexport interface AnchorProps {\n\thref: string;\n\tonClick: (ev: any) => any;\n}\n\nexport interface RouterState {\n\tpathname: string;\n\tsearch: string;\n\tlayers: Array<Layer>;\n}\n\nexport interface TransitionOptions {\n\tstate?: RouterState;\n\tprevious?: PreviousLayerData[];\n\tcontext?: PageReactContext;\n}\n\nexport interface RouterStackItem {\n\troute: PageRoute;\n\tconfig?: Record<string, any>;\n\tprops?: Record<string, any>;\n\terror?: Error;\n}\n\nexport interface RouterRenderResult {\n\tstate: RouterState;\n\tcontext: PageReactContext;\n\tredirect?: string;\n}\n\nexport interface PageRequest extends PageReactContext {\n\tparams: Record<string, any>;\n\tquery: Record<string, string>;\n\n\t// previous layers (browser history or browser hydration, always null on server)\n\tprevious?: PreviousLayerData[];\n}\n\nexport interface CreateLayersResult extends RouterState {\n\tredirect?: string;\n}\n\n/**\n * It's like RouterState, but publicly available in React context.\n * This is where we store all plugin data!\n */\nexport interface PageReactContext {\n\turl: URL;\n\thead: Head;\n\tonError: (error: Error) => ReactNode;\n\tlinks?: ApiLinksResponse;\n}\n","import type { Head } from \"./ServerHeadProvider.ts\";\n\nexport class BrowserHeadProvider {\n\trenderHead(document: Document, head: Head): void {\n\t\tif (head.title) {\n\t\t\tdocument.title = head.title;\n\t\t}\n\n\t\tif (head.bodyAttributes) {\n\t\t\tfor (const [key, value] of Object.entries(head.bodyAttributes)) {\n\t\t\t\tif (value) {\n\t\t\t\t\tdocument.body.setAttribute(key, value);\n\t\t\t\t} else {\n\t\t\t\t\tdocument.body.removeAttribute(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (head.htmlAttributes) {\n\t\t\tfor (const [key, value] of Object.entries(head.htmlAttributes)) {\n\t\t\t\tif (value) {\n\t\t\t\t\tdocument.documentElement.setAttribute(key, value);\n\t\t\t\t} else {\n\t\t\t\t\tdocument.documentElement.removeAttribute(key);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (head.meta) {\n\t\t\tfor (const [key, value] of Object.entries(head.meta)) {\n\t\t\t\tconst meta = document.querySelector(`meta[name=\"${key}\"]`);\n\t\t\t\tif (meta) {\n\t\t\t\t\tmeta.setAttribute(\"content\", value.content);\n\t\t\t\t} else {\n\t\t\t\t\tconst newMeta = document.createElement(\"meta\");\n\t\t\t\t\tnewMeta.setAttribute(\"name\", key);\n\t\t\t\t\tnewMeta.setAttribute(\"content\", value.content);\n\t\t\t\t\tdocument.head.appendChild(newMeta);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import { $hook, $inject, $logger, Alepha } from \"@alepha/core\";\nimport { type Route, RouterProvider } from \"@alepha/router\";\nimport type { ReactNode } from \"react\";\nimport {\n\tPageDescriptorProvider,\n\ttype PageReactContext,\n\ttype PageRequest,\n\ttype PageRoute,\n\ttype PageRouteEntry,\n\ttype RouterRenderResult,\n\ttype RouterState,\n\ttype TransitionOptions,\n\tisPageRoute,\n} from \"./PageDescriptorProvider.ts\";\n\nexport interface BrowserRoute extends Route {\n\tpage: PageRoute;\n}\n\nexport class BrowserRouterProvider extends RouterProvider<BrowserRoute> {\n\tprotected readonly log = $logger();\n\tprotected readonly alepha = $inject(Alepha);\n\tprotected readonly pageDescriptorProvider = $inject(PageDescriptorProvider);\n\n\tpublic add(entry: PageRouteEntry) {\n\t\tthis.pageDescriptorProvider.add(entry);\n\t}\n\n\tprotected readonly configure = $hook({\n\t\tname: \"configure\",\n\t\thandler: async () => {\n\t\t\tfor (const page of this.pageDescriptorProvider.getPages()) {\n\t\t\t\t// mount only if a view is provided\n\t\t\t\tif (page.component || page.lazy) {\n\t\t\t\t\tthis.push({\n\t\t\t\t\t\tpath: page.match,\n\t\t\t\t\t\tpage,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t});\n\n\tpublic async transition(\n\t\turl: URL,\n\t\toptions: TransitionOptions = {},\n\t): Promise<RouterRenderResult> {\n\t\tconst { pathname, search } = url;\n\t\tconst state: RouterState = {\n\t\t\tpathname,\n\t\t\tsearch,\n\t\t\tlayers: [],\n\t\t};\n\n\t\tconst context: PageRequest = {\n\t\t\turl,\n\t\t\tquery: {},\n\t\t\tparams: {},\n\t\t\thead: {},\n\t\t\tonError: () => null,\n\t\t\t...(options.context ?? {}),\n\t\t};\n\n\t\tawait this.alepha.emit(\"react:transition:begin\", { state, context });\n\n\t\ttry {\n\t\t\tconst previous = options.previous;\n\t\t\tconst { route, params } = this.match(pathname);\n\n\t\t\tconst query: Record<string, string> = {};\n\t\t\tif (search) {\n\t\t\t\tfor (const [key, value] of new URLSearchParams(search).entries()) {\n\t\t\t\t\tquery[key] = String(value);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcontext.query = query;\n\t\t\tcontext.params = params ?? {};\n\t\t\tcontext.previous = previous;\n\n\t\t\tif (isPageRoute(route)) {\n\t\t\t\tconst result = await this.pageDescriptorProvider.createLayers(\n\t\t\t\t\troute.page,\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\n\t\t\t\tif (result.redirect) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tredirect: result.redirect,\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tstate.layers = result.layers;\n\t\t\t}\n\n\t\t\tif (state.layers.length === 0) {\n\t\t\t\tstate.layers.push({\n\t\t\t\t\tname: \"not-found\",\n\t\t\t\t\telement: \"Not Found\",\n\t\t\t\t\tindex: 0,\n\t\t\t\t\tpath: \"/\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tawait this.alepha.emit(\"react:transition:success\", { state });\n\t\t} catch (e) {\n\t\t\tthis.log.error(e);\n\t\t\tstate.layers = [\n\t\t\t\t{\n\t\t\t\t\tname: \"error\",\n\t\t\t\t\telement: this.pageDescriptorProvider.renderError(e as Error),\n\t\t\t\t\tindex: 0,\n\t\t\t\t\tpath: \"/\",\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tawait this.alepha.emit(\"react:transition:error\", {\n\t\t\t\terror: e as Error,\n\t\t\t\tstate,\n\t\t\t\tcontext,\n\t\t\t});\n\t\t}\n\n\t\tif (options.state) {\n\t\t\toptions.state.layers = state.layers;\n\t\t\toptions.state.pathname = state.pathname;\n\t\t\toptions.state.search = state.search;\n\t\t}\n\n\t\tawait this.alepha.emit(\"react:transition:end\", {\n\t\t\tstate: options.state,\n\t\t\tcontext,\n\t\t});\n\n\t\treturn {\n\t\t\tcontext,\n\t\t\tstate,\n\t\t};\n\t}\n\n\tpublic root(state: RouterState, context: PageReactContext): ReactNode {\n\t\treturn this.pageDescriptorProvider.root(state, context);\n\t}\n}\n","import { $hook, $inject, $logger, Alepha, type Static, t } from \"@alepha/core\";\nimport { HttpClient, type HttpClientLink } from \"@alepha/server\";\nimport type { Root } from \"react-dom/client\";\nimport { createRoot, hydrateRoot } from \"react-dom/client\";\nimport { BrowserHeadProvider } from \"./BrowserHeadProvider.ts\";\nimport { BrowserRouterProvider } from \"./BrowserRouterProvider.ts\";\nimport type {\n\tPreviousLayerData,\n\tRouterRenderResult,\n\tRouterState,\n\tTransitionOptions,\n} from \"./PageDescriptorProvider.ts\";\n\nconst envSchema = t.object({\n\tREACT_ROOT_ID: t.string({ default: \"root\" }),\n});\n\ndeclare module \"@alepha/core\" {\n\tinterface Env extends Partial<Static<typeof envSchema>> {}\n}\n\nexport class ReactBrowserProvider {\n\tprotected readonly log = $logger();\n\tprotected readonly client = $inject(HttpClient);\n\tprotected readonly alepha = $inject(Alepha);\n\tprotected readonly router = $inject(BrowserRouterProvider);\n\tprotected readonly headProvider = $inject(BrowserHeadProvider);\n\tprotected readonly env = $inject(envSchema);\n\tprotected root!: Root;\n\n\tpublic transitioning?: {\n\t\tto: string;\n\t};\n\n\tpublic state: RouterState = {\n\t\tlayers: [],\n\t\tpathname: \"\",\n\t\tsearch: \"\",\n\t};\n\n\tpublic get document() {\n\t\treturn window.document;\n\t}\n\n\tpublic get history() {\n\t\treturn window.history;\n\t}\n\n\tpublic get url(): string {\n\t\treturn window.location.pathname + window.location.search;\n\t}\n\n\tpublic async invalidate(props?: Record<string, any>) {\n\t\tconst previous: PreviousLayerData[] = [];\n\n\t\tif (props) {\n\t\t\tconst [key] = Object.keys(props);\n\t\t\tconst value = props[key];\n\n\t\t\tfor (const layer of this.state.layers) {\n\t\t\t\tif (layer.props?.[key]) {\n\t\t\t\t\tprevious.push({\n\t\t\t\t\t\t...layer,\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\t...layer.props,\n\t\t\t\t\t\t\t[key]: value,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tprevious.push(layer);\n\t\t\t}\n\t\t}\n\n\t\tawait this.render({ previous });\n\t}\n\n\t/**\n\t *\n\t * @param url\n\t * @param options\n\t */\n\tpublic async go(url: string, options: RouterGoOptions = {}): Promise<void> {\n\t\tconst result = await this.render({\n\t\t\turl,\n\t\t});\n\n\t\t// when redirecting in browser\n\t\tif (result.context.url.pathname !== url) {\n\t\t\t// TODO: check if losing search params is acceptable?\n\t\t\tthis.history.replaceState({}, \"\", result.context.url.pathname);\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.replace) {\n\t\t\tthis.history.replaceState({}, \"\", url);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.history.pushState({}, \"\", url);\n\t}\n\n\tprotected async render(\n\t\toptions: {\n\t\t\turl?: string;\n\t\t\tprevious?: PreviousLayerData[];\n\t\t} = {},\n\t): Promise<RouterRenderResult> {\n\t\tconst previous = options.previous ?? this.state.layers;\n\t\tconst url = options.url ?? this.url;\n\n\t\tthis.transitioning = { to: url };\n\n\t\tconst result = await this.router.transition(\n\t\t\tnew URL(`http://localhost${url}`),\n\t\t\t{\n\t\t\t\tprevious,\n\t\t\t\tstate: this.state,\n\t\t\t},\n\t\t);\n\n\t\tif (result.redirect) {\n\t\t\treturn await this.render({ url: result.redirect });\n\t\t}\n\n\t\tthis.transitioning = undefined;\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get embedded layers from the server.\n\t *\n\t * @protected\n\t */\n\tprotected getHydrationState(): ReactHydrationState | undefined {\n\t\ttry {\n\t\t\tif (\"__ssr\" in window && typeof window.__ssr === \"object\") {\n\t\t\t\treturn window.__ssr as ReactHydrationState;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @protected\n\t */\n\tprotected getRootElement() {\n\t\tconst root = this.document.getElementById(this.env.REACT_ROOT_ID);\n\t\tif (root) {\n\t\t\treturn root;\n\t\t}\n\n\t\tconst div = this.document.createElement(\"div\");\n\t\tdiv.id = this.env.REACT_ROOT_ID;\n\n\t\tthis.document.body.prepend(div);\n\n\t\treturn div;\n\t}\n\n\t// -------------------------------------------------------------------------------------------------------------------\n\n\t/**\n\t *\n\t * @protected\n\t */\n\tpublic readonly ready = $hook({\n\t\tname: \"ready\",\n\t\thandler: async () => {\n\t\t\tconst hydration = this.getHydrationState();\n\t\t\tconst previous = hydration?.layers ?? [];\n\n\t\t\tif (hydration?.links) {\n\t\t\t\tfor (const link of hydration.links) {\n\t\t\t\t\tthis.client.pushLink(link);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst { context } = await this.render({ previous });\n\t\t\tif (context.head) {\n\t\t\t\tthis.headProvider.renderHead(this.document, context.head);\n\t\t\t}\n\n\t\t\tawait this.alepha.emit(\"react:browser:render\", {\n\t\t\t\tstate: this.state,\n\t\t\t\tcontext,\n\t\t\t\thydration,\n\t\t\t});\n\n\t\t\tconst element = this.router.root(this.state, context);\n\n\t\t\tif (previous.length > 0) {\n\t\t\t\tthis.root = hydrateRoot(this.getRootElement(), element);\n\t\t\t\tthis.log.info(\"Hydrated root element\");\n\t\t\t} else {\n\t\t\t\tthis.root ??= createRoot(this.getRootElement());\n\t\t\t\tthis.root.render(element);\n\t\t\t\tthis.log.info(\"Created root element\");\n\t\t\t}\n\n\t\t\twindow.addEventListener(\"popstate\", () => {\n\t\t\t\tthis.render();\n\t\t\t});\n\t\t},\n\t});\n\n\tpublic readonly onTransitionEnd = $hook({\n\t\tname: \"react:transition:end\",\n\t\thandler: async ({ context }) => {\n\t\t\tthis.headProvider.renderHead(this.document, context.head);\n\t\t},\n\t});\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface RouterGoOptions {\n\treplace?: boolean;\n\tmatch?: TransitionOptions;\n\tparams?: Record<string, string>;\n}\n\nexport interface ReactHydrationState {\n\tlayers?: PreviousLayerData[];\n\tlinks?: HttpClientLink[];\n}\n","import type { PageDescriptor } from \"../descriptors/$page.ts\";\nimport type {\n\tAnchorProps,\n\tRouterState,\n} from \"../providers/PageDescriptorProvider.ts\";\nimport type {\n\tReactBrowserProvider,\n\tRouterGoOptions,\n} from \"../providers/ReactBrowserProvider.ts\";\n\nexport class RouterHookApi {\n\tconstructor(\n\t\tprivate readonly state: RouterState,\n\t\tprivate readonly layer: {\n\t\t\tpath: string;\n\t\t},\n\t\tprivate readonly browser?: ReactBrowserProvider,\n\t) {}\n\n\t/**\n\t *\n\t */\n\tpublic get current(): RouterState {\n\t\treturn this.state;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get pathname(): string {\n\t\treturn this.state.pathname;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get query(): Record<string, string> {\n\t\tconst query: Record<string, string> = {};\n\n\t\tfor (const [key, value] of new URLSearchParams(\n\t\t\tthis.state.search,\n\t\t).entries()) {\n\t\t\tquery[key] = String(value);\n\t\t}\n\n\t\treturn query;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic async back() {\n\t\tthis.browser?.history.back();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic async forward() {\n\t\tthis.browser?.history.forward();\n\t}\n\n\t/**\n\t *\n\t * @param props\n\t */\n\tpublic async invalidate(props?: Record<string, any>) {\n\t\tawait this.browser?.invalidate(props);\n\t}\n\n\t/**\n\t * Create a valid href for the given pathname.\n\t *\n\t * @param pathname\n\t * @param layer\n\t */\n\tpublic createHref(pathname: HrefLike, layer: { path: string } = this.layer) {\n\t\tif (typeof pathname === \"object\") {\n\t\t\tpathname = pathname.options.path ?? \"\";\n\t\t}\n\n\t\treturn pathname.startsWith(\"/\")\n\t\t\t? pathname\n\t\t\t: `${layer.path}/${pathname}`.replace(/\\/\\/+/g, \"/\");\n\t}\n\n\tpublic async go(path: string, options?: RouterGoOptions): Promise<void>;\n\tpublic async go<T extends object>(\n\t\tpath: keyof VirtualRouter<T>,\n\t\toptions?: RouterGoOptions,\n\t): Promise<void>;\n\tpublic async go(path: string, options?: RouterGoOptions): Promise<void> {\n\t\tawait this.browser?.go(this.createHref(path, this.layer), options);\n\t}\n\n\tpublic anchor(path: string): AnchorProps {\n\t\tconst href = this.createHref(path, this.layer);\n\t\treturn {\n\t\t\thref,\n\t\t\tonClick: (ev: any) => {\n\t\t\t\tev.stopPropagation();\n\t\t\t\tev.preventDefault();\n\n\t\t\t\tthis.go(path).catch(console.error);\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Set query params.\n\t *\n\t * @param record\n\t * @param options\n\t */\n\tpublic setQueryParams(\n\t\trecord:\n\t\t\t| Record<string, any>\n\t\t\t| ((queryParams: Record<string, any>) => Record<string, any>),\n\t\toptions: {\n\t\t\t/**\n\t\t\t * If true, this will add a new entry to the history stack.\n\t\t\t */\n\t\t\tpush?: boolean;\n\t\t} = {},\n\t) {\n\t\tconst func = typeof record === \"function\" ? record : () => record;\n\t\tconst search = new URLSearchParams(func(this.query)).toString();\n\t\tconst state = search ? `${this.pathname}?${search}` : this.pathname;\n\n\t\tif (options.push) {\n\t\t\twindow.history.pushState({}, \"\", state);\n\t\t} else {\n\t\t\twindow.history.replaceState({}, \"\", state);\n\t\t}\n\t}\n}\n\nexport type HrefLike = string | { options: { path?: string; name?: string } };\n\nexport type VirtualRouter<T> = {\n\t[K in keyof T as T[K] extends PageDescriptor ? K : never]: T[K];\n};\n","import { useContext, useMemo } from \"react\";\nimport { RouterContext } from \"../contexts/RouterContext.ts\";\nimport { RouterLayerContext } from \"../contexts/RouterLayerContext.ts\";\nimport { ReactBrowserProvider } from \"../providers/ReactBrowserProvider.ts\";\nimport { RouterHookApi } from \"./RouterHookApi.ts\";\n\nexport const useRouter = (): RouterHookApi => {\n\tconst ctx = useContext(RouterContext);\n\tconst layer = useContext(RouterLayerContext);\n\tif (!ctx || !layer) {\n\t\tthrow new Error(\"useRouter must be used within a RouterProvider\");\n\t}\n\n\treturn useMemo(\n\t\t() =>\n\t\t\tnew RouterHookApi(\n\t\t\t\tctx.state,\n\t\t\t\tlayer,\n\t\t\t\tctx.alepha.isBrowser()\n\t\t\t\t\t? ctx.alepha.get(ReactBrowserProvider)\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t[layer],\n\t);\n};\n","import { OPTIONS } from \"@alepha/core\";\nimport React from \"react\";\nimport type { AnchorHTMLAttributes } from \"react\";\nimport { RouterContext } from \"../contexts/RouterContext.ts\";\nimport type { PageDescriptor } from \"../descriptors/$page.ts\";\nimport { useRouter } from \"../hooks/useRouter.ts\";\n\nexport interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n\tto: string | PageDescriptor;\n\tchildren?: React.ReactNode;\n}\n\nconst Link = (props: LinkProps) => {\n\tReact.useContext(RouterContext);\n\n\tconst to = typeof props.to === \"string\" ? props.to : props.to[OPTIONS].path;\n\tif (!to) {\n\t\treturn null;\n\t}\n\n\tconst can = typeof props.to === \"string\" ? undefined : props.to[OPTIONS].can;\n\tif (can && !can()) {\n\t\treturn null;\n\t}\n\n\tconst name =\n\t\ttypeof props.to === \"string\" ? undefined : props.to[OPTIONS].name;\n\n\tconst router = useRouter();\n\treturn (\n\t\t<a {...router.anchor(to)} {...props}>\n\t\t\t{props.children ?? name}\n\t\t</a>\n\t);\n};\n\nexport default Link;\n","import type { Class } from \"@alepha/core\";\nimport { useContext, useMemo } from \"react\";\nimport { RouterContext } from \"../contexts/RouterContext.ts\";\n\nexport const useInject = <T extends object>(clazz: Class<T>): T => {\n\tconst ctx = useContext(RouterContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"useRouter must be used within a <RouterProvider>\");\n\t}\n\n\treturn useMemo(() => ctx.alepha.get(clazz), []);\n};\n","import { HttpClient } from \"@alepha/server\";\nimport { useInject } from \"./useInject.ts\";\n\nexport const useClient = (): HttpClient => {\n\treturn useInject(HttpClient);\n};\n\nexport const useApi = <T extends object>() => {\n\treturn useInject(HttpClient).of<T>();\n};\n","import type { Alepha, Static, TObject } from \"@alepha/core\";\nimport { useContext, useEffect, useState } from \"react\";\nimport { RouterContext } from \"../contexts/RouterContext.ts\";\nimport { useRouter } from \"./useRouter.ts\";\n\nexport interface UseQueryParamsHookOptions {\n\tformat?: \"base64\" | \"querystring\";\n\tkey?: string;\n\tpush?: boolean;\n}\n\nexport const useQueryParams = <T extends TObject>(\n\tschema: T,\n\toptions: UseQueryParamsHookOptions = {},\n): [Static<T>, (data: Static<T>) => void] => {\n\tconst ctx = useContext(RouterContext);\n\tif (!ctx) {\n\t\tthrow new Error(\"useQueryParams must be used within a RouterProvider\");\n\t}\n\n\tconst key = options.key ?? \"q\";\n\tconst router = useRouter();\n\tconst querystring = router.query[key];\n\n\tconst [queryParams, setQueryParams] = useState(\n\t\tdecode(ctx.alepha, schema, router.query[key]),\n\t);\n\n\tuseEffect(() => {\n\t\tsetQueryParams(decode(ctx.alepha, schema, querystring));\n\t}, [querystring]);\n\n\treturn [\n\t\tqueryParams,\n\t\t(queryParams: Static<T>) => {\n\t\t\tsetQueryParams(queryParams);\n\t\t\trouter.setQueryParams((data) => {\n\t\t\t\treturn { ...data, [key]: encode(ctx.alepha, schema, queryParams) };\n\t\t\t});\n\t\t},\n\t];\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst encode = (alepha: Alepha, schema: TObject, data: any) => {\n\treturn btoa(JSON.stringify(alepha.parse(schema, data)));\n};\n\nconst decode = (alepha: Alepha, schema: TObject, data: any) => {\n\ttry {\n\t\treturn alepha.parse(schema, JSON.parse(atob(decodeURIComponent(data))));\n\t} catch (error) {\n\t\treturn {};\n\t}\n};\n","import { useContext, useState } from \"react\";\nimport { RouterContext } from \"../contexts/RouterContext.ts\";\nimport { RouterLayerContext } from \"../contexts/RouterLayerContext.ts\";\nimport type { RouterState } from \"../providers/PageDescriptorProvider.ts\";\nimport { useRouterEvents } from \"./useRouterEvents.ts\";\n\nexport const useRouterState = (): RouterState => {\n\tconst ctx = useContext(RouterContext);\n\tconst layer = useContext(RouterLayerContext);\n\tif (!ctx || !layer) {\n\t\tthrow new Error(\"useRouter must be used within a RouterProvider\");\n\t}\n\n\tconst [state, setState] = useState(ctx.state);\n\n\tuseRouterEvents({\n\t\tonEnd: ({ state }) => setState({ ...state }),\n\t});\n\n\treturn state;\n};\n","import { useContext, useMemo, useState } from \"react\";\nimport { RouterContext } from \"../contexts/RouterContext.ts\";\nimport { RouterLayerContext } from \"../contexts/RouterLayerContext.ts\";\nimport type { AnchorProps } from \"../providers/PageDescriptorProvider.ts\";\nimport type { HrefLike } from \"./RouterHookApi.ts\";\nimport { useRouter } from \"./useRouter.ts\";\nimport { useRouterEvents } from \"./useRouterEvents.ts\";\n\nexport const useActive = (path: HrefLike): UseActiveHook => {\n\tconst router = useRouter();\n\tconst ctx = useContext(RouterContext);\n\tconst layer = useContext(RouterLayerContext);\n\tif (!ctx || !layer) {\n\t\tthrow new Error(\"useRouter must be used within a RouterProvider\");\n\t}\n\n\tlet name: string | undefined;\n\tif (typeof path === \"object\" && path.options.name) {\n\t\tname = path.options.name;\n\t}\n\n\tconst [current, setCurrent] = useState(ctx.state.pathname);\n\tconst href = useMemo(() => router.createHref(path, layer), [path, layer]);\n\tconst [isPending, setPending] = useState(false);\n\tconst isActive = current === href;\n\n\tuseRouterEvents({\n\t\tonEnd: ({ state }) => setCurrent(state.pathname),\n\t});\n\n\treturn {\n\t\tname,\n\t\tisPending,\n\t\tisActive,\n\t\tanchorProps: {\n\t\t\thref,\n\t\t\tonClick: (ev: any) => {\n\t\t\t\tev.stopPropagation();\n\t\t\t\tev.preventDefault();\n\t\t\t\tif (isActive) return;\n\t\t\t\tif (isPending) return;\n\n\t\t\t\tsetPending(true);\n\t\t\t\trouter.go(href).then(() => {\n\t\t\t\t\tsetPending(false);\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t};\n};\n\nexport interface UseActiveHook {\n\tisActive: boolean;\n\tanchorProps: AnchorProps;\n\tisPending: boolean;\n\tname?: string;\n}\n"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
- var React = require('react');
5
4
  var core = require('@alepha/core');
5
+ var React = require('react');
6
6
  var server = require('@alepha/server');
7
7
  var client = require('react-dom/client');
8
8
  var router = require('@alepha/router');
@@ -93,6 +93,36 @@ const useRouterEvents = (opts = {}, deps = []) => {
93
93
  }, deps);
94
94
  };
95
95
 
96
+ class ErrorBoundary extends React.Component {
97
+ constructor(props) {
98
+ super(props);
99
+ this.state = {};
100
+ }
101
+ /**
102
+ * Update state so the next render shows the fallback UI.
103
+ */
104
+ static getDerivedStateFromError(error) {
105
+ return {
106
+ error
107
+ };
108
+ }
109
+ /**
110
+ * Lifecycle method called when an error is caught.
111
+ * You can log the error or perform side effects here.
112
+ */
113
+ componentDidCatch(error, info) {
114
+ if (this.props.onError) {
115
+ this.props.onError(error, info);
116
+ }
117
+ }
118
+ render() {
119
+ if (this.state.error) {
120
+ return this.props.fallback(this.state.error);
121
+ }
122
+ return this.props.children;
123
+ }
124
+ }
125
+
96
126
  const NestedView = (props) => {
97
127
  const app = React.useContext(RouterContext);
98
128
  const layer = React.useContext(RouterLayerContext);
@@ -108,7 +138,11 @@ const NestedView = (props) => {
108
138
  },
109
139
  [app]
110
140
  );
111
- return view ?? props.children ?? null;
141
+ if (!app) {
142
+ throw new Error("NestedView must be used within a RouterContext.");
143
+ }
144
+ const element = view ?? props.children ?? null;
145
+ return /* @__PURE__ */ jsxRuntime.jsx(ErrorBoundary, { fallback: app.context.onError, children: element });
112
146
  };
113
147
 
114
148
  class RedirectionError extends Error {
@@ -133,7 +167,7 @@ class PageDescriptorProvider {
133
167
  }
134
168
  throw new Error(`Page ${name} not found`);
135
169
  }
136
- root(state, context = {}) {
170
+ root(state, context) {
137
171
  return React.createElement(
138
172
  RouterContext.Provider,
139
173
  {
@@ -151,6 +185,7 @@ class PageDescriptorProvider {
151
185
  const layers = [];
152
186
  let context = {};
153
187
  const stack = [{ route }];
188
+ let onError = this.renderError;
154
189
  let parent = route.parent;
155
190
  while (parent) {
156
191
  stack.unshift({ route: parent });
@@ -222,7 +257,6 @@ class PageDescriptorProvider {
222
257
  return {
223
258
  layers: [],
224
259
  redirect: typeof e.page === "string" ? e.page : this.href(e.page),
225
- head: request.head,
226
260
  pathname,
227
261
  search
228
262
  };
@@ -249,13 +283,12 @@ class PageDescriptorProvider {
249
283
  acc += "/";
250
284
  acc += it.route.path ? this.compile(it.route.path, params) : "";
251
285
  const path = acc.replace(/\/+/, "/");
286
+ const localErrorHandler = this.getErrorHandler(it.route);
287
+ if (localErrorHandler) {
288
+ onError = localErrorHandler;
289
+ }
252
290
  if (it.error) {
253
- const errorHandler = this.getErrorHandler(it.route);
254
- const element = await (errorHandler ? errorHandler({
255
- ...it.config,
256
- error: it.error,
257
- url: ""
258
- }) : this.renderError(it.error));
291
+ const element = await onError(it.error);
259
292
  layers.push({
260
293
  props,
261
294
  error: it.error,
@@ -282,7 +315,7 @@ class PageDescriptorProvider {
282
315
  path
283
316
  });
284
317
  }
285
- return { layers, head: request.head, pathname, search };
318
+ return { layers, pathname, search };
286
319
  }
287
320
  getErrorHandler(route) {
288
321
  if (route.errorHandler) return route.errorHandler;
@@ -499,10 +532,17 @@ class BrowserRouterProvider extends router.RouterProvider {
499
532
  const state = {
500
533
  pathname,
501
534
  search,
502
- layers: [],
503
- head: {}
535
+ layers: []
536
+ };
537
+ const context = {
538
+ url,
539
+ query: {},
540
+ params: {},
541
+ head: {},
542
+ onError: () => null,
543
+ ...options.context ?? {}
504
544
  };
505
- await this.alepha.emit("react:transition:begin", { state });
545
+ await this.alepha.emit("react:transition:begin", { state, context });
506
546
  try {
507
547
  const previous = options.previous;
508
548
  const { route, params } = this.match(pathname);
@@ -512,29 +552,22 @@ class BrowserRouterProvider extends router.RouterProvider {
512
552
  query[key] = String(value);
513
553
  }
514
554
  }
555
+ context.query = query;
556
+ context.params = params ?? {};
557
+ context.previous = previous;
515
558
  if (isPageRoute(route)) {
516
559
  const result = await this.pageDescriptorProvider.createLayers(
517
560
  route.page,
518
- {
519
- url,
520
- params: params ?? {},
521
- query,
522
- previous,
523
- ...state,
524
- head: state.head,
525
- ...options.context ?? {}
526
- }
561
+ context
527
562
  );
528
563
  if (result.redirect) {
529
564
  return {
530
- element: null,
531
- layers: [],
532
565
  redirect: result.redirect,
533
- head: state.head
566
+ state,
567
+ context
534
568
  };
535
569
  }
536
570
  state.layers = result.layers;
537
- state.head = result.head;
538
571
  }
539
572
  if (state.layers.length === 0) {
540
573
  state.layers.push({
@@ -557,33 +590,25 @@ class BrowserRouterProvider extends router.RouterProvider {
557
590
  ];
558
591
  await this.alepha.emit("react:transition:error", {
559
592
  error: e,
560
- state
593
+ state,
594
+ context
561
595
  });
562
596
  }
563
- if (!options.state) {
564
- await this.alepha.emit("react:transition:end", {
565
- state
566
- });
567
- return {
568
- element: this.root(state, options.context),
569
- layers: state.layers,
570
- head: state.head
571
- };
597
+ if (options.state) {
598
+ options.state.layers = state.layers;
599
+ options.state.pathname = state.pathname;
600
+ options.state.search = state.search;
572
601
  }
573
- options.state.layers = state.layers;
574
- options.state.pathname = state.pathname;
575
- options.state.search = state.search;
576
- options.state.head = state.head;
577
602
  await this.alepha.emit("react:transition:end", {
578
- state: options.state
603
+ state: options.state,
604
+ context
579
605
  });
580
606
  return {
581
- element: this.root(state, options.context),
582
- layers: options.state.layers,
583
- head: state.head
607
+ context,
608
+ state
584
609
  };
585
610
  }
586
- root(state, context = {}) {
611
+ root(state, context) {
587
612
  return this.pageDescriptorProvider.root(state, context);
588
613
  }
589
614
  }
@@ -603,8 +628,7 @@ class ReactBrowserProvider {
603
628
  state = {
604
629
  layers: [],
605
630
  pathname: "",
606
- search: "",
607
- head: {}
631
+ search: ""
608
632
  };
609
633
  get document() {
610
634
  return window.document;
@@ -645,8 +669,8 @@ class ReactBrowserProvider {
645
669
  const result = await this.render({
646
670
  url
647
671
  });
648
- if (result.url !== url) {
649
- this.history.replaceState({}, "", result.url);
672
+ if (result.context.url.pathname !== url) {
673
+ this.history.replaceState({}, "", result.context.url.pathname);
650
674
  return;
651
675
  }
652
676
  if (options.replace) {
@@ -670,7 +694,7 @@ class ReactBrowserProvider {
670
694
  return await this.render({ url: result.redirect });
671
695
  }
672
696
  this.transitioning = void 0;
673
- return { url, head: result.head };
697
+ return result;
674
698
  }
675
699
  /**
676
700
  * Get embedded layers from the server.
@@ -711,14 +735,16 @@ class ReactBrowserProvider {
711
735
  const hydration = this.getHydrationState();
712
736
  const previous = hydration?.layers ?? [];
713
737
  if (hydration?.links) {
714
- this.client.links = hydration.links;
738
+ for (const link of hydration.links) {
739
+ this.client.pushLink(link);
740
+ }
715
741
  }
716
- const { head } = await this.render({ previous });
717
- if (head) {
718
- this.headProvider.renderHead(this.document, head);
742
+ const { context } = await this.render({ previous });
743
+ if (context.head) {
744
+ this.headProvider.renderHead(this.document, context.head);
719
745
  }
720
- const context = {};
721
746
  await this.alepha.emit("react:browser:render", {
747
+ state: this.state,
722
748
  context,
723
749
  hydration
724
750
  });
@@ -734,17 +760,12 @@ class ReactBrowserProvider {
734
760
  window.addEventListener("popstate", () => {
735
761
  this.render();
736
762
  });
737
- this.alepha.on("react:transition:end", {
738
- callback: ({ state }) => {
739
- this.headProvider.renderHead(this.document, state.head);
740
- }
741
- });
742
763
  }
743
764
  });
744
765
  onTransitionEnd = core.$hook({
745
766
  name: "react:transition:end",
746
- handler: async ({ state }) => {
747
- this.headProvider.renderHead(this.document, state.head);
767
+ handler: async ({ context }) => {
768
+ this.headProvider.renderHead(this.document, context.head);
748
769
  }
749
770
  });
750
771
  }
@@ -810,19 +831,10 @@ class RouterHookApi {
810
831
  }
811
832
  return pathname.startsWith("/") ? pathname : `${layer.path}/${pathname}`.replace(/\/\/+/g, "/");
812
833
  }
813
- /**
814
- *
815
- * @param path
816
- * @param options
817
- */
818
- async go(path, options = {}) {
819
- return await this.browser?.go(this.createHref(path, this.layer), options);
834
+ async go(path, options) {
835
+ await this.browser?.go(this.createHref(path, this.layer), options);
820
836
  }
821
- /**
822
- *
823
- * @param path
824
- */
825
- createAnchorProps(path) {
837
+ anchor(path) {
826
838
  const href = this.createHref(path, this.layer);
827
839
  return {
828
840
  href,
@@ -840,14 +852,8 @@ class RouterHookApi {
840
852
  * @param options
841
853
  */
842
854
  setQueryParams(record, options = {}) {
843
- const search = new URLSearchParams(
844
- options.merge ? {
845
- ...this.query,
846
- ...record
847
- } : {
848
- ...record
849
- }
850
- ).toString();
855
+ const func = typeof record === "function" ? record : () => record;
856
+ const search = new URLSearchParams(func(this.query)).toString();
851
857
  const state = search ? `${this.pathname}?${search}` : this.pathname;
852
858
  if (options.push) {
853
859
  window.history.pushState({}, "", state);
@@ -885,7 +891,7 @@ const Link = (props) => {
885
891
  }
886
892
  const name = typeof props.to === "string" ? void 0 : props.to[core.OPTIONS].name;
887
893
  const router = useRouter();
888
- return /* @__PURE__ */ jsxRuntime.jsx("a", { ...router.createAnchorProps(to), ...props, children: props.children ?? name });
894
+ return /* @__PURE__ */ jsxRuntime.jsx("a", { ...router.anchor(to), ...props, children: props.children ?? name });
889
895
  };
890
896
 
891
897
  const useInject = (clazz) => {
@@ -893,12 +899,7 @@ const useInject = (clazz) => {
893
899
  if (!ctx) {
894
900
  throw new Error("useRouter must be used within a <RouterProvider>");
895
901
  }
896
- return React.useMemo(
897
- () => ctx.alepha.get(clazz, {
898
- skipRegistration: true
899
- }),
900
- []
901
- );
902
+ return React.useMemo(() => ctx.alepha.get(clazz), []);
902
903
  };
903
904
 
904
905
  const useClient = () => {
@@ -926,12 +927,9 @@ const useQueryParams = (schema, options = {}) => {
926
927
  queryParams,
927
928
  (queryParams2) => {
928
929
  setQueryParams(queryParams2);
929
- router.setQueryParams(
930
- { [key]: encode(ctx.alepha, schema, queryParams2) },
931
- {
932
- merge: true
933
- }
934
- );
930
+ router.setQueryParams((data) => {
931
+ return { ...data, [key]: encode(ctx.alepha, schema, queryParams2) };
932
+ });
935
933
  }
936
934
  ];
937
935
  };
@@ -999,6 +997,7 @@ const useActive = (path) => {
999
997
 
1000
998
  exports.$page = $page;
1001
999
  exports.BrowserRouterProvider = BrowserRouterProvider;
1000
+ exports.ErrorBoundary = ErrorBoundary;
1002
1001
  exports.Link = Link;
1003
1002
  exports.NestedView = NestedView;
1004
1003
  exports.PageDescriptorProvider = PageDescriptorProvider;
@@ -1016,4 +1015,4 @@ exports.useQueryParams = useQueryParams;
1016
1015
  exports.useRouter = useRouter;
1017
1016
  exports.useRouterEvents = useRouterEvents;
1018
1017
  exports.useRouterState = useRouterState;
1019
- //# sourceMappingURL=useActive-4QlZKGbw.cjs.map
1018
+ //# sourceMappingURL=useActive-DjpZBEuB.cjs.map