@alepha/react 0.6.8 → 0.6.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.browser.cjs +1 -1
- package/dist/index.browser.js +2 -2
- package/dist/index.cjs +1 -1
- package/dist/index.js +2 -2
- package/dist/{useActive-CQMy9Zda.cjs → useActive-4QlZKGbw.cjs} +7 -4
- package/dist/{useActive-CQMy9Zda.cjs.map → useActive-4QlZKGbw.cjs.map} +1 -1
- package/dist/{useActive-C5OBB9sz.js → useActive-ClUsghB5.js} +7 -4
- package/dist/{useActive-C5OBB9sz.js.map → useActive-ClUsghB5.js.map} +1 -1
- package/package.json +15 -5
- package/src/hooks/useInject.ts +8 -4
package/dist/index.browser.cjs
CHANGED
package/dist/index.browser.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __bind, $inject, Alepha } from '@alepha/core';
|
|
2
|
-
import { $ as $page, P as PageDescriptorProvider, l as ReactBrowserProvider, B as BrowserRouterProvider } from './useActive-
|
|
3
|
-
export { L as Link, N as NestedView, j as RedirectionError, R as RouterContext, b as RouterHookApi, a as RouterLayerContext, i as useActive, d as useApi, c as useClient, u as useInject, e as useQueryParams, f as useRouter, g as useRouterEvents, h as useRouterState } from './useActive-
|
|
2
|
+
import { $ as $page, P as PageDescriptorProvider, l as ReactBrowserProvider, B as BrowserRouterProvider } from './useActive-ClUsghB5.js';
|
|
3
|
+
export { L as Link, N as NestedView, j as RedirectionError, R as RouterContext, b as RouterHookApi, a as RouterLayerContext, i as useActive, d as useApi, c as useClient, u as useInject, e as useQueryParams, f as useRouter, g as useRouterEvents, h as useRouterState } from './useActive-ClUsghB5.js';
|
|
4
4
|
import 'react/jsx-runtime';
|
|
5
5
|
import 'react';
|
|
6
6
|
import '@alepha/server';
|
package/dist/index.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var core = require('@alepha/core');
|
|
4
4
|
var server = require('@alepha/server');
|
|
5
|
-
var useActive = require('./useActive-
|
|
5
|
+
var useActive = require('./useActive-4QlZKGbw.cjs');
|
|
6
6
|
var node_fs = require('node:fs');
|
|
7
7
|
var promises = require('node:fs/promises');
|
|
8
8
|
var node_path = require('node:path');
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t, $logger, $inject, Alepha, $hook, OPTIONS, __bind } from '@alepha/core';
|
|
2
2
|
import { ServerRouterProvider, ServerLinksProvider, ServerModule } from '@alepha/server';
|
|
3
|
-
import { P as PageDescriptorProvider, $ as $page } from './useActive-
|
|
4
|
-
export { L as Link, N as NestedView, l as ReactBrowserProvider, j as RedirectionError, R as RouterContext, b as RouterHookApi, a as RouterLayerContext, k as isPageRoute, i as useActive, d as useApi, c as useClient, u as useInject, e as useQueryParams, f as useRouter, g as useRouterEvents, h as useRouterState } from './useActive-
|
|
3
|
+
import { P as PageDescriptorProvider, $ as $page } from './useActive-ClUsghB5.js';
|
|
4
|
+
export { L as Link, N as NestedView, l as ReactBrowserProvider, j as RedirectionError, R as RouterContext, b as RouterHookApi, a as RouterLayerContext, k as isPageRoute, i as useActive, d as useApi, c as useClient, u as useInject, e as useQueryParams, f as useRouter, g as useRouterEvents, h as useRouterState } from './useActive-ClUsghB5.js';
|
|
5
5
|
import { existsSync } from 'node:fs';
|
|
6
6
|
import { readFile } from 'node:fs/promises';
|
|
7
7
|
import { join } from 'node:path';
|
|
@@ -893,9 +893,12 @@ const useInject = (clazz) => {
|
|
|
893
893
|
if (!ctx) {
|
|
894
894
|
throw new Error("useRouter must be used within a <RouterProvider>");
|
|
895
895
|
}
|
|
896
|
-
return
|
|
897
|
-
|
|
898
|
-
|
|
896
|
+
return React.useMemo(
|
|
897
|
+
() => ctx.alepha.get(clazz, {
|
|
898
|
+
skipRegistration: true
|
|
899
|
+
}),
|
|
900
|
+
[]
|
|
901
|
+
);
|
|
899
902
|
};
|
|
900
903
|
|
|
901
904
|
const useClient = () => {
|
|
@@ -1013,4 +1016,4 @@ exports.useQueryParams = useQueryParams;
|
|
|
1013
1016
|
exports.useRouter = useRouter;
|
|
1014
1017
|
exports.useRouterEvents = useRouterEvents;
|
|
1015
1018
|
exports.useRouterState = useRouterState;
|
|
1016
|
-
//# sourceMappingURL=useActive-
|
|
1019
|
+
//# sourceMappingURL=useActive-4QlZKGbw.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useActive-CQMy9Zda.cjs","sources":["../src/descriptors/$page.ts","../src/contexts/RouterContext.ts","../src/contexts/RouterLayerContext.ts","../src/hooks/useRouterEvents.ts","../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 } from \"react\";\nimport type { RouterHookApi } from \"../hooks/RouterHookApi.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?: FC<{ error: Error; url: string }>;\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 & PageResolveContext;\n\nexport interface PageResolveContext {\n\turl: URL;\n\thead: Head;\n}\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 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\";\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\treturn view ?? props.children ?? null;\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 { HttpClientLink } 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\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\thead: request.head,\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\n\t\t\t// handler has thrown an error, render an error view\n\t\t\tif (it.error) {\n\t\t\t\tconst errorHandler = this.getErrorHandler(it.route);\n\t\t\t\tconst element = await (errorHandler\n\t\t\t\t\t? errorHandler({\n\t\t\t\t\t\t\t...it.config,\n\t\t\t\t\t\t\terror: it.error,\n\t\t\t\t\t\t\turl: \"\",\n\t\t\t\t\t\t})\n\t\t\t\t\t: this.renderError(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, head: request.head, 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\thead: Head;\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\tredirect?: string;\n\tlayers: Layer[];\n\thead: Head;\n\telement: ReactNode;\n}\n\nexport interface PageRequest extends PageReactContext {\n\turl: URL;\n\tparams: Record<string, any>;\n\tquery: Record<string, string>;\n\thead: Head;\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// will be passed to ReactContext\nexport interface PageReactContext {\n\tlinks?: HttpClientLink[];\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 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\thead: {},\n\t\t};\n\n\t\tawait this.alepha.emit(\"react:transition:begin\", { state });\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\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\t{\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tparams: params ?? {},\n\t\t\t\t\t\tquery,\n\t\t\t\t\t\tprevious,\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\thead: state.head,\n\t\t\t\t\t\t...(options.context ?? {}),\n\t\t\t\t\t},\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\telement: null,\n\t\t\t\t\t\tlayers: [],\n\t\t\t\t\t\tredirect: result.redirect,\n\t\t\t\t\t\thead: state.head,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tstate.layers = result.layers;\n\t\t\t\tstate.head = result.head;\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});\n\t\t}\n\n\t\tif (!options.state) {\n\t\t\tawait this.alepha.emit(\"react:transition:end\", {\n\t\t\t\tstate,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\telement: this.root(state, options.context),\n\t\t\t\tlayers: state.layers,\n\t\t\t\thead: state.head,\n\t\t\t};\n\t\t}\n\n\t\toptions.state.layers = state.layers;\n\t\toptions.state.pathname = state.pathname;\n\t\toptions.state.search = state.search;\n\t\toptions.state.head = state.head;\n\n\t\tawait this.alepha.emit(\"react:transition:end\", {\n\t\t\tstate: options.state,\n\t\t});\n\n\t\treturn {\n\t\t\telement: this.root(state, options.context),\n\t\t\tlayers: options.state.layers,\n\t\t\thead: state.head,\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 type { Head } from \"../descriptors/$page.ts\";\nimport { BrowserHeadProvider } from \"./BrowserHeadProvider.ts\";\nimport { BrowserRouterProvider } from \"./BrowserRouterProvider.ts\";\nimport type {\n\tPreviousLayerData,\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\thead: {},\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\tif (result.url !== url) {\n\t\t\tthis.history.replaceState({}, \"\", result.url);\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<{ url: string; head: Head }> {\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 { url, head: result.head };\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\tthis.client.links = hydration.links as HttpClientLink[];\n\t\t\t}\n\n\t\t\tconst { head } = await this.render({ previous });\n\t\t\tif (head) {\n\t\t\t\tthis.headProvider.renderHead(this.document, head);\n\t\t\t}\n\n\t\t\tconst context = {};\n\n\t\t\tawait this.alepha.emit(\"react:browser:render\", {\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\n\t\t\tthis.alepha.on(\"react:transition:end\", {\n\t\t\t\tcallback: ({ state }) => {\n\t\t\t\t\tthis.headProvider.renderHead(this.document, state.head);\n\t\t\t\t},\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 ({ state }) => {\n\t\t\tthis.headProvider.renderHead(this.document, state.head);\n\t\t},\n\t});\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface RouterGoOptions {\n\treplace?: boolean;\n\tmatch?: TransitionOptions;\n}\n\nexport interface ReactHydrationState {\n\tlayers?: PreviousLayerData[];\n\tlinks?: HttpClientLink[];\n}\n","import 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\t/**\n\t *\n\t * @param path\n\t * @param options\n\t */\n\tpublic async go(\n\t\tpath: HrefLike,\n\t\toptions: RouterGoOptions = {},\n\t): Promise<void> {\n\t\treturn await this.browser?.go(this.createHref(path, this.layer), options);\n\t}\n\n\t/**\n\t *\n\t * @param path\n\t */\n\tpublic createAnchorProps(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: Record<string, any>,\n\t\toptions: {\n\t\t\t/**\n\t\t\t * If true, this will merge current query params with the new ones.\n\t\t\t */\n\t\t\tmerge?: boolean;\n\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 search = new URLSearchParams(\n\t\t\toptions.merge\n\t\t\t\t? {\n\t\t\t\t\t\t...this.query,\n\t\t\t\t\t\t...record,\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\t...record,\n\t\t\t\t\t},\n\t\t).toString();\n\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","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 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\";\nimport { OPTIONS } from \"@alepha/core\";\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.createAnchorProps(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 } 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 ctx.alepha.get(clazz, {\n\t\tskipRegistration: true,\n\t});\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(\n\t\t\t\t{ [key]: encode(ctx.alepha, schema, queryParams) },\n\t\t\t\t{\n\t\t\t\t\tmerge: true,\n\t\t\t\t},\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":["__descriptor","OPTIONS","KIND","NotImplementedError","createContext","useContext","useEffect","useState","$logger","$inject","Alepha","createElement","$hook","RouterProvider","t","HttpClient","hydrateRoot","createRoot","useMemo","jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useActive-4QlZKGbw.cjs","sources":["../src/descriptors/$page.ts","../src/contexts/RouterContext.ts","../src/contexts/RouterLayerContext.ts","../src/hooks/useRouterEvents.ts","../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 } from \"react\";\nimport type { RouterHookApi } from \"../hooks/RouterHookApi.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?: FC<{ error: Error; url: string }>;\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 & PageResolveContext;\n\nexport interface PageResolveContext {\n\turl: URL;\n\thead: Head;\n}\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 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\";\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\treturn view ?? props.children ?? null;\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 { HttpClientLink } 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\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\thead: request.head,\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\n\t\t\t// handler has thrown an error, render an error view\n\t\t\tif (it.error) {\n\t\t\t\tconst errorHandler = this.getErrorHandler(it.route);\n\t\t\t\tconst element = await (errorHandler\n\t\t\t\t\t? errorHandler({\n\t\t\t\t\t\t\t...it.config,\n\t\t\t\t\t\t\terror: it.error,\n\t\t\t\t\t\t\turl: \"\",\n\t\t\t\t\t\t})\n\t\t\t\t\t: this.renderError(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, head: request.head, 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\thead: Head;\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\tredirect?: string;\n\tlayers: Layer[];\n\thead: Head;\n\telement: ReactNode;\n}\n\nexport interface PageRequest extends PageReactContext {\n\turl: URL;\n\tparams: Record<string, any>;\n\tquery: Record<string, string>;\n\thead: Head;\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// will be passed to ReactContext\nexport interface PageReactContext {\n\tlinks?: HttpClientLink[];\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 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\thead: {},\n\t\t};\n\n\t\tawait this.alepha.emit(\"react:transition:begin\", { state });\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\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\t{\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tparams: params ?? {},\n\t\t\t\t\t\tquery,\n\t\t\t\t\t\tprevious,\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\thead: state.head,\n\t\t\t\t\t\t...(options.context ?? {}),\n\t\t\t\t\t},\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\telement: null,\n\t\t\t\t\t\tlayers: [],\n\t\t\t\t\t\tredirect: result.redirect,\n\t\t\t\t\t\thead: state.head,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tstate.layers = result.layers;\n\t\t\t\tstate.head = result.head;\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});\n\t\t}\n\n\t\tif (!options.state) {\n\t\t\tawait this.alepha.emit(\"react:transition:end\", {\n\t\t\t\tstate,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\telement: this.root(state, options.context),\n\t\t\t\tlayers: state.layers,\n\t\t\t\thead: state.head,\n\t\t\t};\n\t\t}\n\n\t\toptions.state.layers = state.layers;\n\t\toptions.state.pathname = state.pathname;\n\t\toptions.state.search = state.search;\n\t\toptions.state.head = state.head;\n\n\t\tawait this.alepha.emit(\"react:transition:end\", {\n\t\t\tstate: options.state,\n\t\t});\n\n\t\treturn {\n\t\t\telement: this.root(state, options.context),\n\t\t\tlayers: options.state.layers,\n\t\t\thead: state.head,\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 type { Head } from \"../descriptors/$page.ts\";\nimport { BrowserHeadProvider } from \"./BrowserHeadProvider.ts\";\nimport { BrowserRouterProvider } from \"./BrowserRouterProvider.ts\";\nimport type {\n\tPreviousLayerData,\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\thead: {},\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\tif (result.url !== url) {\n\t\t\tthis.history.replaceState({}, \"\", result.url);\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<{ url: string; head: Head }> {\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 { url, head: result.head };\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\tthis.client.links = hydration.links as HttpClientLink[];\n\t\t\t}\n\n\t\t\tconst { head } = await this.render({ previous });\n\t\t\tif (head) {\n\t\t\t\tthis.headProvider.renderHead(this.document, head);\n\t\t\t}\n\n\t\t\tconst context = {};\n\n\t\t\tawait this.alepha.emit(\"react:browser:render\", {\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\n\t\t\tthis.alepha.on(\"react:transition:end\", {\n\t\t\t\tcallback: ({ state }) => {\n\t\t\t\t\tthis.headProvider.renderHead(this.document, state.head);\n\t\t\t\t},\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 ({ state }) => {\n\t\t\tthis.headProvider.renderHead(this.document, state.head);\n\t\t},\n\t});\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface RouterGoOptions {\n\treplace?: boolean;\n\tmatch?: TransitionOptions;\n}\n\nexport interface ReactHydrationState {\n\tlayers?: PreviousLayerData[];\n\tlinks?: HttpClientLink[];\n}\n","import 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\t/**\n\t *\n\t * @param path\n\t * @param options\n\t */\n\tpublic async go(\n\t\tpath: HrefLike,\n\t\toptions: RouterGoOptions = {},\n\t): Promise<void> {\n\t\treturn await this.browser?.go(this.createHref(path, this.layer), options);\n\t}\n\n\t/**\n\t *\n\t * @param path\n\t */\n\tpublic createAnchorProps(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: Record<string, any>,\n\t\toptions: {\n\t\t\t/**\n\t\t\t * If true, this will merge current query params with the new ones.\n\t\t\t */\n\t\t\tmerge?: boolean;\n\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 search = new URLSearchParams(\n\t\t\toptions.merge\n\t\t\t\t? {\n\t\t\t\t\t\t...this.query,\n\t\t\t\t\t\t...record,\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\t...record,\n\t\t\t\t\t},\n\t\t).toString();\n\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","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 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\";\nimport { OPTIONS } from \"@alepha/core\";\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.createAnchorProps(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(\n\t\t() =>\n\t\t\tctx.alepha.get(clazz, {\n\t\t\t\tskipRegistration: true,\n\t\t\t}),\n\t\t[],\n\t);\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(\n\t\t\t\t{ [key]: encode(ctx.alepha, schema, queryParams) },\n\t\t\t\t{\n\t\t\t\t\tmerge: true,\n\t\t\t\t},\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":["__descriptor","OPTIONS","KIND","NotImplementedError","createContext","useContext","useEffect","useState","$logger","$inject","Alepha","createElement","$hook","RouterProvider","t","HttpClient","hydrateRoot","createRoot","useMemo","jsx"],"mappings":"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"}
|
|
@@ -891,9 +891,12 @@ const useInject = (clazz) => {
|
|
|
891
891
|
if (!ctx) {
|
|
892
892
|
throw new Error("useRouter must be used within a <RouterProvider>");
|
|
893
893
|
}
|
|
894
|
-
return
|
|
895
|
-
|
|
896
|
-
|
|
894
|
+
return useMemo(
|
|
895
|
+
() => ctx.alepha.get(clazz, {
|
|
896
|
+
skipRegistration: true
|
|
897
|
+
}),
|
|
898
|
+
[]
|
|
899
|
+
);
|
|
897
900
|
};
|
|
898
901
|
|
|
899
902
|
const useClient = () => {
|
|
@@ -993,4 +996,4 @@ const useActive = (path) => {
|
|
|
993
996
|
};
|
|
994
997
|
|
|
995
998
|
export { $page as $, BrowserRouterProvider as B, Link as L, NestedView as N, PageDescriptorProvider as P, RouterContext as R, RouterLayerContext as a, RouterHookApi as b, useClient as c, useApi as d, useQueryParams as e, useRouter as f, useRouterEvents as g, useRouterState as h, useActive as i, RedirectionError as j, isPageRoute as k, ReactBrowserProvider as l, useInject as u };
|
|
996
|
-
//# sourceMappingURL=useActive-
|
|
999
|
+
//# sourceMappingURL=useActive-ClUsghB5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useActive-C5OBB9sz.js","sources":["../src/descriptors/$page.ts","../src/contexts/RouterContext.ts","../src/contexts/RouterLayerContext.ts","../src/hooks/useRouterEvents.ts","../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 } from \"react\";\nimport type { RouterHookApi } from \"../hooks/RouterHookApi.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?: FC<{ error: Error; url: string }>;\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 & PageResolveContext;\n\nexport interface PageResolveContext {\n\turl: URL;\n\thead: Head;\n}\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 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\";\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\treturn view ?? props.children ?? null;\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 { HttpClientLink } 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\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\thead: request.head,\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\n\t\t\t// handler has thrown an error, render an error view\n\t\t\tif (it.error) {\n\t\t\t\tconst errorHandler = this.getErrorHandler(it.route);\n\t\t\t\tconst element = await (errorHandler\n\t\t\t\t\t? errorHandler({\n\t\t\t\t\t\t\t...it.config,\n\t\t\t\t\t\t\terror: it.error,\n\t\t\t\t\t\t\turl: \"\",\n\t\t\t\t\t\t})\n\t\t\t\t\t: this.renderError(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, head: request.head, 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\thead: Head;\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\tredirect?: string;\n\tlayers: Layer[];\n\thead: Head;\n\telement: ReactNode;\n}\n\nexport interface PageRequest extends PageReactContext {\n\turl: URL;\n\tparams: Record<string, any>;\n\tquery: Record<string, string>;\n\thead: Head;\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// will be passed to ReactContext\nexport interface PageReactContext {\n\tlinks?: HttpClientLink[];\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 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\thead: {},\n\t\t};\n\n\t\tawait this.alepha.emit(\"react:transition:begin\", { state });\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\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\t{\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tparams: params ?? {},\n\t\t\t\t\t\tquery,\n\t\t\t\t\t\tprevious,\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\thead: state.head,\n\t\t\t\t\t\t...(options.context ?? {}),\n\t\t\t\t\t},\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\telement: null,\n\t\t\t\t\t\tlayers: [],\n\t\t\t\t\t\tredirect: result.redirect,\n\t\t\t\t\t\thead: state.head,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tstate.layers = result.layers;\n\t\t\t\tstate.head = result.head;\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});\n\t\t}\n\n\t\tif (!options.state) {\n\t\t\tawait this.alepha.emit(\"react:transition:end\", {\n\t\t\t\tstate,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\telement: this.root(state, options.context),\n\t\t\t\tlayers: state.layers,\n\t\t\t\thead: state.head,\n\t\t\t};\n\t\t}\n\n\t\toptions.state.layers = state.layers;\n\t\toptions.state.pathname = state.pathname;\n\t\toptions.state.search = state.search;\n\t\toptions.state.head = state.head;\n\n\t\tawait this.alepha.emit(\"react:transition:end\", {\n\t\t\tstate: options.state,\n\t\t});\n\n\t\treturn {\n\t\t\telement: this.root(state, options.context),\n\t\t\tlayers: options.state.layers,\n\t\t\thead: state.head,\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 type { Head } from \"../descriptors/$page.ts\";\nimport { BrowserHeadProvider } from \"./BrowserHeadProvider.ts\";\nimport { BrowserRouterProvider } from \"./BrowserRouterProvider.ts\";\nimport type {\n\tPreviousLayerData,\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\thead: {},\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\tif (result.url !== url) {\n\t\t\tthis.history.replaceState({}, \"\", result.url);\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<{ url: string; head: Head }> {\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 { url, head: result.head };\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\tthis.client.links = hydration.links as HttpClientLink[];\n\t\t\t}\n\n\t\t\tconst { head } = await this.render({ previous });\n\t\t\tif (head) {\n\t\t\t\tthis.headProvider.renderHead(this.document, head);\n\t\t\t}\n\n\t\t\tconst context = {};\n\n\t\t\tawait this.alepha.emit(\"react:browser:render\", {\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\n\t\t\tthis.alepha.on(\"react:transition:end\", {\n\t\t\t\tcallback: ({ state }) => {\n\t\t\t\t\tthis.headProvider.renderHead(this.document, state.head);\n\t\t\t\t},\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 ({ state }) => {\n\t\t\tthis.headProvider.renderHead(this.document, state.head);\n\t\t},\n\t});\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface RouterGoOptions {\n\treplace?: boolean;\n\tmatch?: TransitionOptions;\n}\n\nexport interface ReactHydrationState {\n\tlayers?: PreviousLayerData[];\n\tlinks?: HttpClientLink[];\n}\n","import 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\t/**\n\t *\n\t * @param path\n\t * @param options\n\t */\n\tpublic async go(\n\t\tpath: HrefLike,\n\t\toptions: RouterGoOptions = {},\n\t): Promise<void> {\n\t\treturn await this.browser?.go(this.createHref(path, this.layer), options);\n\t}\n\n\t/**\n\t *\n\t * @param path\n\t */\n\tpublic createAnchorProps(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: Record<string, any>,\n\t\toptions: {\n\t\t\t/**\n\t\t\t * If true, this will merge current query params with the new ones.\n\t\t\t */\n\t\t\tmerge?: boolean;\n\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 search = new URLSearchParams(\n\t\t\toptions.merge\n\t\t\t\t? {\n\t\t\t\t\t\t...this.query,\n\t\t\t\t\t\t...record,\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\t...record,\n\t\t\t\t\t},\n\t\t).toString();\n\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","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 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\";\nimport { OPTIONS } from \"@alepha/core\";\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.createAnchorProps(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 } 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 ctx.alepha.get(clazz, {\n\t\tskipRegistration: true,\n\t});\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(\n\t\t\t\t{ [key]: encode(ctx.alepha, schema, queryParams) },\n\t\t\t\t{\n\t\t\t\t\tmerge: true,\n\t\t\t\t},\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
|
+
{"version":3,"file":"useActive-ClUsghB5.js","sources":["../src/descriptors/$page.ts","../src/contexts/RouterContext.ts","../src/contexts/RouterLayerContext.ts","../src/hooks/useRouterEvents.ts","../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 } from \"react\";\nimport type { RouterHookApi } from \"../hooks/RouterHookApi.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?: FC<{ error: Error; url: string }>;\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 & PageResolveContext;\n\nexport interface PageResolveContext {\n\turl: URL;\n\thead: Head;\n}\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 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\";\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\treturn view ?? props.children ?? null;\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 { HttpClientLink } 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\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\thead: request.head,\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\n\t\t\t// handler has thrown an error, render an error view\n\t\t\tif (it.error) {\n\t\t\t\tconst errorHandler = this.getErrorHandler(it.route);\n\t\t\t\tconst element = await (errorHandler\n\t\t\t\t\t? errorHandler({\n\t\t\t\t\t\t\t...it.config,\n\t\t\t\t\t\t\terror: it.error,\n\t\t\t\t\t\t\turl: \"\",\n\t\t\t\t\t\t})\n\t\t\t\t\t: this.renderError(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, head: request.head, 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\thead: Head;\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\tredirect?: string;\n\tlayers: Layer[];\n\thead: Head;\n\telement: ReactNode;\n}\n\nexport interface PageRequest extends PageReactContext {\n\turl: URL;\n\tparams: Record<string, any>;\n\tquery: Record<string, string>;\n\thead: Head;\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// will be passed to ReactContext\nexport interface PageReactContext {\n\tlinks?: HttpClientLink[];\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 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\thead: {},\n\t\t};\n\n\t\tawait this.alepha.emit(\"react:transition:begin\", { state });\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\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\t{\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tparams: params ?? {},\n\t\t\t\t\t\tquery,\n\t\t\t\t\t\tprevious,\n\t\t\t\t\t\t...state,\n\t\t\t\t\t\thead: state.head,\n\t\t\t\t\t\t...(options.context ?? {}),\n\t\t\t\t\t},\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\telement: null,\n\t\t\t\t\t\tlayers: [],\n\t\t\t\t\t\tredirect: result.redirect,\n\t\t\t\t\t\thead: state.head,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tstate.layers = result.layers;\n\t\t\t\tstate.head = result.head;\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});\n\t\t}\n\n\t\tif (!options.state) {\n\t\t\tawait this.alepha.emit(\"react:transition:end\", {\n\t\t\t\tstate,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\telement: this.root(state, options.context),\n\t\t\t\tlayers: state.layers,\n\t\t\t\thead: state.head,\n\t\t\t};\n\t\t}\n\n\t\toptions.state.layers = state.layers;\n\t\toptions.state.pathname = state.pathname;\n\t\toptions.state.search = state.search;\n\t\toptions.state.head = state.head;\n\n\t\tawait this.alepha.emit(\"react:transition:end\", {\n\t\t\tstate: options.state,\n\t\t});\n\n\t\treturn {\n\t\t\telement: this.root(state, options.context),\n\t\t\tlayers: options.state.layers,\n\t\t\thead: state.head,\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 type { Head } from \"../descriptors/$page.ts\";\nimport { BrowserHeadProvider } from \"./BrowserHeadProvider.ts\";\nimport { BrowserRouterProvider } from \"./BrowserRouterProvider.ts\";\nimport type {\n\tPreviousLayerData,\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\thead: {},\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\tif (result.url !== url) {\n\t\t\tthis.history.replaceState({}, \"\", result.url);\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<{ url: string; head: Head }> {\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 { url, head: result.head };\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\tthis.client.links = hydration.links as HttpClientLink[];\n\t\t\t}\n\n\t\t\tconst { head } = await this.render({ previous });\n\t\t\tif (head) {\n\t\t\t\tthis.headProvider.renderHead(this.document, head);\n\t\t\t}\n\n\t\t\tconst context = {};\n\n\t\t\tawait this.alepha.emit(\"react:browser:render\", {\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\n\t\t\tthis.alepha.on(\"react:transition:end\", {\n\t\t\t\tcallback: ({ state }) => {\n\t\t\t\t\tthis.headProvider.renderHead(this.document, state.head);\n\t\t\t\t},\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 ({ state }) => {\n\t\t\tthis.headProvider.renderHead(this.document, state.head);\n\t\t},\n\t});\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface RouterGoOptions {\n\treplace?: boolean;\n\tmatch?: TransitionOptions;\n}\n\nexport interface ReactHydrationState {\n\tlayers?: PreviousLayerData[];\n\tlinks?: HttpClientLink[];\n}\n","import 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\t/**\n\t *\n\t * @param path\n\t * @param options\n\t */\n\tpublic async go(\n\t\tpath: HrefLike,\n\t\toptions: RouterGoOptions = {},\n\t): Promise<void> {\n\t\treturn await this.browser?.go(this.createHref(path, this.layer), options);\n\t}\n\n\t/**\n\t *\n\t * @param path\n\t */\n\tpublic createAnchorProps(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: Record<string, any>,\n\t\toptions: {\n\t\t\t/**\n\t\t\t * If true, this will merge current query params with the new ones.\n\t\t\t */\n\t\t\tmerge?: boolean;\n\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 search = new URLSearchParams(\n\t\t\toptions.merge\n\t\t\t\t? {\n\t\t\t\t\t\t...this.query,\n\t\t\t\t\t\t...record,\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\t...record,\n\t\t\t\t\t},\n\t\t).toString();\n\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","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 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\";\nimport { OPTIONS } from \"@alepha/core\";\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.createAnchorProps(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(\n\t\t() =>\n\t\t\tctx.alepha.get(clazz, {\n\t\t\t\tskipRegistration: true,\n\t\t\t}),\n\t\t[],\n\t);\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(\n\t\t\t\t{ [key]: encode(ctx.alepha, schema, queryParams) },\n\t\t\t\t{\n\t\t\t\t\tmerge: true,\n\t\t\t\t},\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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alepha/react",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.9",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
"src"
|
|
14
14
|
],
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@alepha/core": "0.6.
|
|
17
|
-
"@alepha/router": "0.6.
|
|
18
|
-
"@alepha/server": "0.6.
|
|
19
|
-
"@alepha/server-static": "0.6.
|
|
16
|
+
"@alepha/core": "0.6.9",
|
|
17
|
+
"@alepha/router": "0.6.9",
|
|
18
|
+
"@alepha/server": "0.6.9",
|
|
19
|
+
"@alepha/server-static": "0.6.9",
|
|
20
20
|
"react-dom": "^19.1.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
@@ -33,6 +33,16 @@
|
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build": "pkgroll --clean-dist --sourcemap"
|
|
35
35
|
},
|
|
36
|
+
"homepage": "https://github.com/feunard/alepha",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "git+https://github.com/feunard/alepha.git"
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"alepha",
|
|
43
|
+
"react",
|
|
44
|
+
"router"
|
|
45
|
+
],
|
|
36
46
|
"module": "./dist/index.js",
|
|
37
47
|
"exports": {
|
|
38
48
|
".": {
|
package/src/hooks/useInject.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Class } from "@alepha/core";
|
|
2
|
-
import { useContext } from "react";
|
|
2
|
+
import { useContext, useMemo } from "react";
|
|
3
3
|
import { RouterContext } from "../contexts/RouterContext.ts";
|
|
4
4
|
|
|
5
5
|
export const useInject = <T extends object>(clazz: Class<T>): T => {
|
|
@@ -8,7 +8,11 @@ export const useInject = <T extends object>(clazz: Class<T>): T => {
|
|
|
8
8
|
throw new Error("useRouter must be used within a <RouterProvider>");
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
return
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
return useMemo(
|
|
12
|
+
() =>
|
|
13
|
+
ctx.alepha.get(clazz, {
|
|
14
|
+
skipRegistration: true,
|
|
15
|
+
}),
|
|
16
|
+
[],
|
|
17
|
+
);
|
|
14
18
|
};
|