@typed/router 0.13.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/Link.d.ts +26 -11
  2. package/dist/Link.d.ts.map +1 -1
  3. package/dist/Link.js +47 -23
  4. package/dist/Link.js.map +1 -1
  5. package/dist/Match.d.ts +33 -0
  6. package/dist/Match.d.ts.map +1 -0
  7. package/dist/Match.js +16 -0
  8. package/dist/Match.js.map +1 -0
  9. package/dist/Matcher.d.ts +28 -0
  10. package/dist/Matcher.d.ts.map +1 -0
  11. package/dist/Matcher.js +24 -0
  12. package/dist/Matcher.js.map +1 -0
  13. package/dist/Navigation.d.ts +10 -0
  14. package/dist/Navigation.d.ts.map +1 -0
  15. package/dist/Navigation.js +7 -0
  16. package/dist/Navigation.js.map +1 -0
  17. package/dist/Redirect.d.ts +29 -0
  18. package/dist/Redirect.d.ts.map +1 -0
  19. package/dist/Redirect.js +17 -0
  20. package/dist/Redirect.js.map +1 -0
  21. package/dist/RouteOutlet.d.ts +3 -0
  22. package/dist/RouteOutlet.d.ts.map +1 -0
  23. package/dist/RouteOutlet.js +2 -0
  24. package/dist/RouteOutlet.js.map +1 -0
  25. package/dist/ScrollRestoration.d.ts +19 -0
  26. package/dist/ScrollRestoration.d.ts.map +1 -0
  27. package/dist/ScrollRestoration.js +64 -0
  28. package/dist/ScrollRestoration.js.map +1 -0
  29. package/dist/cjs/Link.d.ts +26 -11
  30. package/dist/cjs/Link.d.ts.map +1 -1
  31. package/dist/cjs/Link.js +47 -22
  32. package/dist/cjs/Link.js.map +1 -1
  33. package/dist/cjs/Match.d.ts +33 -0
  34. package/dist/cjs/Match.d.ts.map +1 -0
  35. package/dist/cjs/Match.js +43 -0
  36. package/dist/cjs/Match.js.map +1 -0
  37. package/dist/cjs/Matcher.d.ts +28 -0
  38. package/dist/cjs/Matcher.d.ts.map +1 -0
  39. package/dist/cjs/Matcher.js +52 -0
  40. package/dist/cjs/Matcher.js.map +1 -0
  41. package/dist/cjs/Navigation.d.ts +10 -0
  42. package/dist/cjs/Navigation.d.ts.map +1 -0
  43. package/dist/cjs/Navigation.js +34 -0
  44. package/dist/cjs/Navigation.js.map +1 -0
  45. package/dist/cjs/Redirect.d.ts +29 -0
  46. package/dist/cjs/Redirect.d.ts.map +1 -0
  47. package/dist/cjs/Redirect.js +44 -0
  48. package/dist/cjs/Redirect.js.map +1 -0
  49. package/dist/cjs/ScrollRestoration.d.ts +19 -0
  50. package/dist/cjs/ScrollRestoration.d.ts.map +1 -0
  51. package/dist/cjs/ScrollRestoration.js +91 -0
  52. package/dist/cjs/ScrollRestoration.js.map +1 -0
  53. package/dist/cjs/index.d.ts +7 -3
  54. package/dist/cjs/index.d.ts.map +1 -1
  55. package/dist/cjs/index.js +7 -3
  56. package/dist/cjs/index.js.map +1 -1
  57. package/dist/cjs/matchRoutes.d.ts +8 -0
  58. package/dist/cjs/matchRoutes.d.ts.map +1 -0
  59. package/dist/cjs/matchRoutes.js +77 -0
  60. package/dist/cjs/matchRoutes.js.map +1 -0
  61. package/dist/cjs/router.d.ts +24 -63
  62. package/dist/cjs/router.d.ts.map +1 -1
  63. package/dist/cjs/router.js +22 -160
  64. package/dist/cjs/router.js.map +1 -1
  65. package/dist/index.d.ts +7 -3
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +7 -3
  68. package/dist/index.js.map +1 -1
  69. package/dist/matchRoutes.d.ts +8 -0
  70. package/dist/matchRoutes.d.ts.map +1 -0
  71. package/dist/matchRoutes.js +50 -0
  72. package/dist/matchRoutes.js.map +1 -0
  73. package/dist/router.d.ts +24 -63
  74. package/dist/router.d.ts.map +1 -1
  75. package/dist/router.js +18 -153
  76. package/dist/router.js.map +1 -1
  77. package/dist/tsconfig.cjs.build.tsbuildinfo +1 -1
  78. package/package.json +13 -11
  79. package/project.json +12 -10
  80. package/src/Link.ts +129 -39
  81. package/src/Match.ts +114 -0
  82. package/src/Matcher.ts +139 -0
  83. package/src/Navigation.ts +24 -0
  84. package/src/Redirect.ts +21 -0
  85. package/src/ScrollRestoration.ts +110 -0
  86. package/src/index.ts +7 -3
  87. package/src/matchRoutes.ts +112 -0
  88. package/src/router.ts +53 -311
  89. package/tsconfig.build.json +5 -1
  90. package/tsconfig.build.tsbuildinfo +1 -1
  91. package/tsconfig.cjs.build.json +6 -0
  92. package/tsconfig.json +6 -0
  93. package/vite.config.js +3 -0
  94. package/src/RouteMatch.ts +0 -56
  95. package/src/RouteMatcher.ts +0 -264
package/dist/Link.d.ts CHANGED
@@ -1,17 +1,32 @@
1
1
  import * as Effect from '@effect/io/Effect';
2
2
  import * as Scope from '@effect/io/Scope';
3
3
  import * as Fx from '@typed/fx';
4
- import { RenderContext, type Placeholder } from '@typed/html';
4
+ import { Placeholder } from '@typed/html';
5
+ import * as Navigation from '@typed/navigation';
5
6
  import { Router } from './router.js';
6
- export declare function Link<R = never, E = never, R2 = never>(props: LinkProps<R, E, R2>): Fx.Fx<R | R2 | Document | RenderContext | Router | Scope.Scope, E, HTMLAnchorElement>;
7
- export interface LinkProps<R, E, R2> {
8
- readonly href: string;
9
- readonly label: string | Placeholder<R, E>;
10
- readonly className?: string;
11
- readonly onClick?: (event: MouseEvent & {
12
- currentTarget: HTMLAnchorElement;
13
- }) => Effect.Effect<R2, never, unknown>;
14
- readonly useBase?: boolean;
15
- readonly fullReload?: boolean;
7
+ export interface UseLinkParams<R = never, E = never, R2 = never, E2 = never, R3 = never, E3 = never, R4 = never, E4 = never, R5 = never, E5 = never> {
8
+ readonly to: Placeholder<R, E, string>;
9
+ readonly replace?: Placeholder<R2, E2, boolean>;
10
+ readonly state?: Placeholder<R3, E3, unknown> | unknown;
11
+ readonly relative?: Placeholder<R4, E4, boolean>;
12
+ readonly key?: Placeholder<R5, E5, string>;
16
13
  }
14
+ export declare namespace UseLinkParams {
15
+ type Any = UseLinkParams<any, any, any, any, any, any, any, any, any, any>;
16
+ type Context<T extends Any> = Placeholder.ResourcesOf<T['to'] | T['replace'] | T['state'] | T['relative'] | T['key']>;
17
+ type Error<T extends Any> = Placeholder.ErrorsOf<T['to'] | T['replace'] | T['state'] | T['relative'] | T['key']>;
18
+ }
19
+ export interface UseLink<E> {
20
+ readonly url: Fx.Computed<Router, E, string>;
21
+ readonly options: Fx.Computed<never, E, Navigation.NavigateOptions>;
22
+ readonly navigate: Effect.Effect<Router, E, Navigation.Destination>;
23
+ readonly active: Fx.Computed<Router, E, boolean>;
24
+ }
25
+ export declare namespace UseLink {
26
+ type FromParams<T extends UseLinkParams.Any> = [UseLink<UseLinkParams.Error<T>>] extends [
27
+ infer U
28
+ ] ? U : never;
29
+ }
30
+ export declare function useLink<Params extends UseLinkParams.Any>(params: Params): Effect.Effect<UseLinkParams.Context<Params> | Scope.Scope, never, UseLink.FromParams<Params>>;
31
+ export declare function Link<Params extends UseLinkParams.Any, R, E, A>(params: Params, render: (use: UseLink.FromParams<Params>) => Fx.Fx<R, E, A>): Fx.Fx<Scope.Scope | R | UseLinkParams.Context<Params>, E, A>;
17
32
  //# sourceMappingURL=Link.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../src/Link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;AAEzC,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAsB,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAGjF,OAAO,EAAE,MAAM,EAAe,MAAM,aAAa,CAAA;AAEjD,wBAAgB,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,EACnD,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GACzB,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,aAAa,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAwBvF;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,CACjB,KAAK,EAAE,UAAU,GAAG;QAAE,aAAa,EAAE,iBAAiB,CAAA;KAAE,KACrD,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;IAEtC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAC9B"}
1
+ {"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../src/Link.ts"],"names":[],"mappings":"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"}
package/dist/Link.js CHANGED
@@ -1,30 +1,54 @@
1
1
  import * as Effect from '@effect/io/Effect';
2
- import { assign } from '@typed/dom';
3
2
  import * as Fx from '@typed/fx';
4
- import { EventHandler, html } from '@typed/html';
3
+ import { Placeholder } from '@typed/html';
5
4
  import { pathJoin } from '@typed/path';
6
- import { Router, getBasePath } from './router.js';
7
- export function Link(props) {
8
- return Fx.gen(function* ($) {
9
- const useBase = props.useBase ?? true;
10
- const href = useBase ? pathJoin(yield* $(getBasePath), props.href) || '/' : props.href;
11
- const router = yield* $(Router);
12
- const clickHandler = (event) => Effect.gen(function* ($) {
13
- if (props.fullReload) {
14
- yield* $(assign(href));
5
+ import { Router, getCurrentPathFromUrl } from './router.js';
6
+ export function useLink(params) {
7
+ return Effect.map(Effect.all([
8
+ Placeholder.asRef(params.to),
9
+ Placeholder.asRef(params.replace ?? false),
10
+ Placeholder.asRef(params.state ?? null),
11
+ Placeholder.asRef(params.key),
12
+ Placeholder.asRef(params.relative ?? true),
13
+ ]), ([to, replace, state, key, relative]) => {
14
+ const url = Fx.RefSubject.tuple(to, relative).mapEffect(([to, relative]) => Effect.gen(function* ($) {
15
+ let url = to;
16
+ // Check if we should make the URL relative to the current route
17
+ if (relative) {
18
+ const { route, params } = yield* $(Router);
19
+ const matched = yield* $(params);
20
+ const basePath = route.make(matched);
21
+ url = pathJoin(basePath, url);
15
22
  }
16
- else {
17
- yield* $(router.currentPath.set(href));
18
- }
19
- if (props.onClick) {
20
- yield* $(props.onClick(event));
21
- }
22
- });
23
- return html.as() `<a
24
- class=${props.className}
25
- href=${href}
26
- onclick=${EventHandler.preventDefault(clickHandler)}
27
- >${props.label}</a>`;
23
+ return url;
24
+ }));
25
+ const options = Fx.RefSubject.tuple(replace, state, key).map(([replace, state, key]) => ({
26
+ history: replace ? 'replace' : 'push',
27
+ state,
28
+ key: key ?? undefined,
29
+ }));
30
+ const active = url.mapEffect((url) => Effect.gen(function* ($) {
31
+ const { navigation: { currentEntry }, } = yield* $(Router);
32
+ return isActive(url, (yield* $(currentEntry)).url);
33
+ }));
34
+ const navigate = Effect.flatMap(Effect.all([url, options]), ([url, options]) => Router.withEffect((r) => r.navigation.navigate(url, options)));
35
+ return {
36
+ url,
37
+ options,
38
+ navigate,
39
+ active,
40
+ };
28
41
  });
29
42
  }
43
+ export function Link(params, render) {
44
+ return Fx.fromFxEffect(Effect.map(useLink(params), render));
45
+ }
46
+ function isActive(url, current) {
47
+ const { pathname } = current;
48
+ return (url === current.href ||
49
+ url === pathname ||
50
+ url === pathname + current.search ||
51
+ url === pathname + current.hash ||
52
+ url === getCurrentPathFromUrl(current));
53
+ }
30
54
  //# sourceMappingURL=Link.js.map
package/dist/Link.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Link.js","sourceRoot":"","sources":["../src/Link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,IAAI,EAAmC,MAAM,aAAa,CAAA;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEjD,MAAM,UAAU,IAAI,CAClB,KAA0B;IAE1B,OAAO,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,CAAA;QACrC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;QACtF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAC/B,MAAM,YAAY,GAAG,CAAC,KAAwD,EAAE,EAAE,CAChF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrB,IAAI,KAAK,CAAC,UAAU,EAAE;gBACpB,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;aACvB;iBAAM;gBACL,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;aACvC;YAED,IAAI,KAAK,CAAC,OAAO,EAAE;gBACjB,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;aAC/B;QACH,CAAC,CAAC,CAAA;QAEJ,OAAO,IAAI,CAAC,EAAE,EAAqB,CAAA;cACzB,KAAK,CAAC,SAAS;aAChB,IAAI;gBACD,YAAY,CAAC,cAAc,CAAC,YAAY,CAAC;SAChD,KAAK,CAAC,KAAK,MAAM,CAAA;IACxB,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"Link.js","sourceRoot":"","sources":["../src/Link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import * as Effect from '@effect/io/Effect';
2
+ import * as Fx from '@typed/fx';
3
+ import { NavigationError } from '@typed/navigation';
4
+ import { ParamsOf } from '@typed/path';
5
+ import { Route } from '@typed/route';
6
+ export type MatchOptions<P extends string, Guard extends Effect.Effect<any, NavigationError, boolean> = Effect.Effect<never, NavigationError, boolean>, Matched extends Effect.Effect<any, any, any> = Effect.Effect<never, never, unknown>> = {
7
+ readonly guard?: (params: ParamsOf<P>) => Guard;
8
+ readonly onMatch?: (params: ParamsOf<P>) => Matched;
9
+ };
10
+ export declare namespace MatchOptions {
11
+ type Any<P extends string> = MatchOptions<P, any, any> | MatchOptions<P, never, never> | MatchOptions<P, any, never> | MatchOptions<P, never, any>;
12
+ }
13
+ export type Match<in out P extends string, out Rendered extends Fx.Fx<any, any, any>, in out Options extends MatchOptions.Any<P> = MatchOptions<P>> = {
14
+ readonly route: Route<P>;
15
+ readonly render: (params: Fx.Filtered<never, never, ParamsOf<P>>) => Rendered;
16
+ readonly options?: Options;
17
+ };
18
+ export declare namespace Match {
19
+ type Any = Match<any, any, any> | Match<any, any, never>;
20
+ type Rendered<M extends Any> = M extends Match<any, infer R, infer _> ? R : never;
21
+ type Options<M extends Any> = M extends Match<any, any, infer Options> ? Options : never;
22
+ type Guard<M extends Any> = [Options<M>] extends [MatchOptions<any, infer Guard, infer _>] ? Guard : never;
23
+ type Matched<M extends Any> = Options<M> extends MatchOptions<any, infer _, infer Matched> ? Matched : never;
24
+ type Context<M extends Any> = Fx.Fx.ResourcesOf<Rendered<M>> | ([Guard<M>] extends [never] ? never : Effect.Effect.Context<Guard<M>>) | ([Matched<M>] extends [never] ? never : Effect.Effect.Context<Matched<M>>);
25
+ type Error<M extends Any> = Fx.Fx.ErrorsOf<Rendered<M>> | ([Guard<M>] extends [never] ? never : Exclude<Effect.Effect.Error<Guard<M>>, NavigationError>) | ([Matched<M>] extends [never] ? never : Effect.Effect.Error<Matched<M>>);
26
+ type Success<M extends Any> = Fx.Fx.OutputOf<Rendered<M>>;
27
+ }
28
+ export declare function Match<P extends string, Rendered extends Fx.Fx<any, any, any>>(route: Route<P>, render: (params: Fx.Filtered<never, never, ParamsOf<P>>) => Rendered): Match<P, Rendered, MatchOptions<P>>;
29
+ export declare function Match<P extends string, Rendered extends Fx.Fx<any, any, any>, Options extends MatchOptions.Any<P>>(route: Route<P>, render: (params: Fx.Filtered<never, never, ParamsOf<P>>) => Rendered, options: Options): Match<P, Rendered, Options>;
30
+ export declare namespace Match {
31
+ var lazy: <P extends string, Rendered_1 extends Fx.Fx<any, any, any>, Options_1 extends MatchOptions.Any<P> = MatchOptions<P, Effect.Effect<never, NavigationError, boolean>, Effect.Effect<never, never, unknown>>>(route: Route<P>, render: () => Promise<(params: Fx.Filtered<never, never, import("@typed/path").PartsToParams<import("@typed/path").PathToParts<P>, {}> extends infer T ? { readonly [K in keyof T]: import("@typed/path").PartsToParams<import("@typed/path").PathToParts<P>, {}>[K]; } : never>) => Rendered_1>, options?: Options_1 | undefined) => Match<P, Rendered_1, Options_1> | Match<P, Rendered_1, never>;
32
+ }
33
+ //# sourceMappingURL=Match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Match.d.ts","sourceRoot":"","sources":["../src/Match.ts"],"names":[],"mappings":"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"}
package/dist/Match.js ADDED
@@ -0,0 +1,16 @@
1
+ import * as Fx from '@typed/fx';
2
+ export function Match(route, render, options) {
3
+ return {
4
+ route,
5
+ render,
6
+ options,
7
+ };
8
+ }
9
+ Match.lazy = function (route, render, options) {
10
+ return {
11
+ route,
12
+ render: (params) => Fx.promiseFx(() => render().then((f) => f(params))),
13
+ options,
14
+ };
15
+ };
16
+ //# sourceMappingURL=Match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Match.js","sourceRoot":"","sources":["../src/Match.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAkF/B,MAAM,UAAU,KAAK,CAKnB,KAAe,EACf,MAAoE,EACpE,OAAiB;IAEjB,OAAO;QACL,KAAK;QACL,MAAM;QACN,OAAO;KACR,CAAA;AACH,CAAC;AAED,KAAK,CAAC,IAAI,GAAG,UAKX,KAAe,EACf,MAAmF,EACnF,OAAiB;IAEjB,OAAO;QACL,KAAK;QACL,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAa;QACnF,OAAO;KACR,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,28 @@
1
+ import * as Chunk from '@effect/data/Chunk';
2
+ import * as Effect from '@effect/io/Effect';
3
+ import * as Fx from '@typed/fx';
4
+ import { RenderContext } from '@typed/html';
5
+ import { ParamsOf } from '@typed/path';
6
+ import { Route } from '@typed/route';
7
+ import { Match, MatchOptions } from './Match.js';
8
+ import { Redirect } from './Redirect.js';
9
+ import { Router } from './router.js';
10
+ export interface Matcher<Matches extends ReadonlyArray<Match.Any>> {
11
+ /** @internal */
12
+ readonly matches: Chunk.Chunk<Match.Any>;
13
+ readonly match: <P extends string, R, E, A, Opts extends MatchOptions.Any<P> = MatchOptions<P>>(route: Route<P>, render: (params: Fx.Filtered<never, never, ParamsOf<P>>) => Fx.Fx<R, E, A>, options?: Opts) => Matcher<readonly [...Matches, Match<P, Fx.Fx<R, E, A>, Opts>]>;
14
+ readonly matchLazy: <P extends string, R, E, A, Opts extends MatchOptions.Any<P> = MatchOptions<P>>(route: Route<P>, render: () => Promise<(params: Fx.Filtered<never, never, ParamsOf<P>>) => Fx.Fx<R, E, A>>, options?: Opts) => Matcher<readonly [...Matches, Match<P, Fx.Fx<R, E, A>, Opts>]>;
15
+ readonly notFound: <R, E, A>(render: (params: Fx.Filtered<never, never, Readonly<Record<string, string>>>) => Fx.Fx<R, E, A>) => Fx.Fx<Router | RenderContext | R | Match.Context<Matches[number]>, Exclude<E | Match.Error<Matches[number]>, Redirect>, A | Match.Success<Matches[number]>>;
16
+ readonly concat: <OtherMatches extends ReadonlyArray<Match.Any>>(other: Matcher<OtherMatches>) => Matcher<readonly [...Matches, ...OtherMatches]>;
17
+ }
18
+ export declare function Matcher<const Matches extends ReadonlyArray<Match.Any>>(matches: Chunk.Chunk<Match.Any>): Matcher<Matches>;
19
+ export declare const match: <P extends string, R, E, A, Opts extends MatchOptions.Any<P> = MatchOptions<P>>(route: Route<P>, render: (params: Fx.Filtered<never, never, import("@typed/path").PartsToParams<import("@typed/path").PathToParts<P>, {}> extends infer T ? { readonly [K in keyof T]: import("@typed/path").PartsToParams<import("@typed/path").PathToParts<P>, {}>[K]; } : never>) => Fx.Fx<R, E, A>, options?: Opts | undefined) => Matcher<readonly [Match<P, Fx.Fx<R, E, A>, Opts>]>, matchLazy: <P extends string, R, E, A, Opts extends MatchOptions.Any<P> = MatchOptions<P>>(route: Route<P>, render: () => Promise<(params: Fx.Filtered<never, never, import("@typed/path").PartsToParams<import("@typed/path").PathToParts<P>, {}> extends infer T ? { readonly [K in keyof T]: import("@typed/path").PartsToParams<import("@typed/path").PathToParts<P>, {}>[K]; } : never>) => Fx.Fx<R, E, A>>, options?: Opts | undefined) => Matcher<readonly [Match<P, Fx.Fx<R, E, A>, Opts>]>;
20
+ export declare const notFound: {
21
+ <R, E, A>(render: (params: Fx.Filtered<never, never, Readonly<Record<string, string>>>) => Fx.Fx<R, E, A>): <Matches extends readonly Match.Any[]>(matcher: Matcher<Matches>) => Fx.Fx<Router | R | Match.Context<Matches[number]>, Exclude<E | Match.Error<Matches[number]>, Redirect>, A | Fx.Fx.OutputOf<Match.Rendered<Matches[number]>>>;
22
+ <Matches extends readonly Match.Any[], R, E, A>(matcher: Matcher<Matches>, render: (params: Fx.Filtered<never, never, Readonly<Record<string, string>>>) => Fx.Fx<R, E, A>): Fx.Fx<Router | R | Match.Context<Matches[number]>, Exclude<E | Match.Error<Matches[number]>, Redirect>, A | Fx.Fx.OutputOf<Match.Rendered<Matches[number]>>>;
23
+ };
24
+ export declare const redirectEffect: {
25
+ <R, E>(effect: Effect.Effect<R, E, never>): <Matches extends readonly Match.Any[]>(matcher: Matcher<Matches>) => Fx.Fx<Router | R | Match.Context<Matches[number]>, Exclude<E | Match.Error<Matches[number]>, Redirect>, Match.Success<Matches[number]>>;
26
+ <Matches extends readonly Match.Any[], R, E>(matcher: Matcher<Matches>, effect: Effect.Effect<R, E, never>): Fx.Fx<Router | R | Match.Context<Matches[number]>, Exclude<E | Match.Error<Matches[number]>, Redirect>, Match.Success<Matches[number]>>;
27
+ };
28
+ //# sourceMappingURL=Matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Matcher.d.ts","sourceRoot":"","sources":["../src/Matcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import * as Chunk from '@effect/data/Chunk';
2
+ import * as Debug from '@effect/data/Function';
3
+ import * as Fx from '@typed/fx';
4
+ import { Match } from './Match.js';
5
+ import { matchRoutes } from './matchRoutes.js';
6
+ export function Matcher(matches) {
7
+ return {
8
+ matches,
9
+ match(route, render, options) {
10
+ return Matcher(Chunk.append(matches, Match(route, render, options || {})));
11
+ },
12
+ matchLazy(route, render, options) {
13
+ return Matcher(Chunk.append(matches, Match.lazy(route, render, options || {})));
14
+ },
15
+ notFound: (render) => Fx.scoped(matchRoutes(Chunk.toReadonlyArray(matches), render)),
16
+ concat: (other) => {
17
+ return Matcher(Chunk.appendAll(matches, other.matches));
18
+ },
19
+ };
20
+ }
21
+ export const { match, matchLazy } = Matcher(Chunk.empty());
22
+ export const notFound = Debug.dual(2, (matcher, render) => matcher.notFound(render));
23
+ export const redirectEffect = Debug.dual(2, (matcher, effect) => notFound(matcher, () => Fx.fromEffect(effect)));
24
+ //# sourceMappingURL=Matcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Matcher.js","sourceRoot":"","sources":["../src/Matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAA;AAE9C,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAK/B,OAAO,EAAE,KAAK,EAAgB,MAAM,YAAY,CAAA;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAsC9C,MAAM,UAAU,OAAO,CACrB,OAA+B;IAE/B,OAAO;QACL,OAAO;QAEP,KAAK,CACH,KAAe,EACf,MAA0E,EAC1E,OAAc;YAEd,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAC5E,CAAC;QAED,SAAS,CACP,KAAe,EACf,MAAyF,EACzF,OAAc;YAEd,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QACjF,CAAC;QAED,QAAQ,EAAE,CACR,MAEmB,EACnB,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAY,EAAE,MAAM,CAAC,CAAC;QAE9E,MAAM,EAAE,CACN,KAA4B,EACqB,EAAE;YACnD,OAAO,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;QACzD,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAc,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;AAEvE,MAAM,CAAC,MAAM,QAAQ,GAmBjB,KAAK,CAAC,IAAI,CACZ,CAAC,EACD,CACE,OAAyB,EACzB,MAA+F,EAC/F,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC9B,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAmBvB,KAAK,CAAC,IAAI,CACZ,CAAC,EACD,CACE,OAAyB,EACzB,MAAkC,EAClC,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CACpD,CAAA"}
@@ -0,0 +1,10 @@
1
+ import * as Fx from '@typed/fx';
2
+ import { Placeholder } from '@typed/html';
3
+ import { NavigateOptions } from '@typed/navigation';
4
+ import { Redirect } from './Redirect.js';
5
+ export interface NavigationParams<R, E, R2, E2> {
6
+ readonly url: Placeholder<R, E, string>;
7
+ readonly options?: Placeholder<R2, E2, NavigateOptions>;
8
+ }
9
+ export declare function Navigation<R = never, E = never, R2 = never, E2 = never>(params: NavigationParams<R, E, R2, E2>): Fx.Fx<R | R2, E | E2 | Redirect, null>;
10
+ //# sourceMappingURL=Navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Navigation.d.ts","sourceRoot":"","sources":["../src/Navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,WAAW,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE;IAE5C,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;IAEvC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,CAAA;CACxD;AAED,wBAAgB,UAAU,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,EACrE,MAAM,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GACrC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,IAAI,CAAC,CAQxC"}
@@ -0,0 +1,7 @@
1
+ import * as Fx from '@typed/fx';
2
+ import { Placeholder } from '@typed/html';
3
+ import { Redirect } from './Redirect.js';
4
+ export function Navigation(params) {
5
+ return Fx.startWith(Fx.switchMapEffect(Fx.combine(Placeholder.asFx(params.url), Placeholder.asFx(params.options)), ([url, options]) => Redirect.redirect(url, options)), null);
6
+ }
7
+ //# sourceMappingURL=Navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Navigation.js","sourceRoot":"","sources":["../src/Navigation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AASxC,MAAM,UAAU,UAAU,CACxB,MAAsC;IAEtC,OAAO,EAAE,CAAC,SAAS,CACjB,EAAE,CAAC,eAAe,CAChB,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAC1E,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CACpD,EACD,IAAI,CACL,CAAA;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ import * as Effect from '@effect/io/Effect';
2
+ import * as E from '@typed/error';
3
+ import * as Fx from '@typed/fx';
4
+ import { NavigateOptions } from '@typed/navigation';
5
+ declare const Redirect_base: {
6
+ new (message?: string | undefined): {
7
+ readonly _tag: "@typed/router/Redirect";
8
+ readonly is: <T extends E.TaggedConstructor<any>>(constructor: T) => this is InstanceType<T>;
9
+ name: string;
10
+ message: string;
11
+ stack?: string | undefined;
12
+ };
13
+ _tag: "@typed/router/Redirect";
14
+ fail<T_1 extends E.TaggedConstructor<"@typed/router/Redirect">>(this: T_1, ...params: ConstructorParameters<T_1>): Effect.Effect<never, E.Tagged<"@typed/router/Redirect">, never>;
15
+ failFx<T_2 extends E.TaggedConstructor<"@typed/router/Redirect">>(this: T_2, ...params: ConstructorParameters<T_2>): Fx.Fx<never, E.Tagged<"@typed/router/Redirect">, never>;
16
+ catch<T_3 extends E.TaggedConstructor<"@typed/router/Redirect">, R, E, A>(this: T_3, f: (error: InstanceType<T_3>) => Effect.Effect<R, E, A>): <R2, E2, A2>(effect: Effect.Effect<R2, InstanceType<T_3> | E2, A2>) => Effect.Effect<R | R2, E | Exclude<E2, InstanceType<T_3>>, A | A2>;
17
+ catchAll<T_4 extends E.TaggedConstructor<"@typed/router/Redirect">, R_1, E_1, A_1>(this: T_4, f: (error: InstanceType<T_4>) => Fx.Fx<R_1, E_1, A_1>): <R2_1, E2_1, A2_1>(fx: Fx.Fx<R2_1, InstanceType<T_4> | E2_1, A2_1>) => Fx.Fx<R_1 | R2_1, E_1 | Exclude<E2_1, InstanceType<T_4>>, A_1 | A2_1>;
18
+ switchCatch<T_5 extends E.TaggedConstructor<"@typed/router/Redirect">, R_2, E_2, A_2>(this: T_5, f: (error: InstanceType<T_5>) => Fx.Fx<R_2, E_2, A_2>): <R2_2, E2_2, A2_2>(fx: Fx.Fx<R2_2, InstanceType<T_5> | E2_2, A2_2>) => Fx.Fx<R_2 | R2_2, E_2 | Exclude<E2_2, InstanceType<T_5>>, A_2 | A2_2>;
19
+ switchMatch<T_6 extends E.TaggedConstructor<"@typed/router/Redirect">, I, R_3, E_3, A_3, R2_3, E2_3, B>(this: T_6, f: (error: InstanceType<T_6>) => Fx.Fx<R_3, E_3, A_3>, g: (i: I) => Fx.Fx<R2_3, E2_3, B>): <R3, E3>(fx: Fx.Fx<R3, E3 | InstanceType<T_6>, I>) => Fx.Fx<R_3 | R2_3 | R3, E_3 | E2_3 | Exclude<E3, InstanceType<T_6>>, A_3 | B>;
20
+ };
21
+ export declare class Redirect extends Redirect_base {
22
+ readonly url: string;
23
+ readonly options?: NavigateOptions | undefined;
24
+ constructor(url: string, options?: NavigateOptions | undefined);
25
+ static redirect(url: string, options?: NavigateOptions): Effect.Effect<never, Redirect, never>;
26
+ static redirectFx(url: string, options?: NavigateOptions): Fx.Fx<never, Redirect, never>;
27
+ }
28
+ export {};
29
+ //# sourceMappingURL=Redirect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Redirect.d.ts","sourceRoot":"","sources":["../src/Redirect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AACjC,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;;;;;;;;;;;;;;;;;AAEnD,qBAAa,QAAS,SAAQ,aAAkC;IAE5D,QAAQ,CAAC,GAAG,EAAE,MAAM;IACpB,QAAQ,CAAC,OAAO,CAAC;gBADR,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,6BAAiB;IAKpC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC;IAI9F,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC;CAGzF"}
@@ -0,0 +1,17 @@
1
+ import * as Effect from '@effect/io/Effect';
2
+ import * as E from '@typed/error';
3
+ import * as Fx from '@typed/fx';
4
+ export class Redirect extends E.tagged('@typed/router/Redirect') {
5
+ constructor(url, options) {
6
+ super(`Redirect to ${url}`);
7
+ this.url = url;
8
+ this.options = options;
9
+ }
10
+ static redirect(url, options) {
11
+ return Effect.fail(new Redirect(url, options));
12
+ }
13
+ static redirectFx(url, options) {
14
+ return Fx.fail(new Redirect(url, options));
15
+ }
16
+ }
17
+ //# sourceMappingURL=Redirect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Redirect.js","sourceRoot":"","sources":["../src/Redirect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AACjC,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAG/B,MAAM,OAAO,QAAS,SAAQ,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC;IAC9D,YACW,GAAW,EACX,OAAyB;QAElC,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC,CAAA;QAHlB,QAAG,GAAH,GAAG,CAAQ;QACX,YAAO,GAAP,OAAO,CAAkB;IAGpC,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,GAAW,EAAE,OAAyB;QACpD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;IAChD,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,GAAW,EAAE,OAAyB;QACtD,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;IAC5C,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export interface RouteOutlet {
2
+ }
3
+ //# sourceMappingURL=RouteOutlet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteOutlet.d.ts","sourceRoot":"","sources":["../src/RouteOutlet.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;CAE3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=RouteOutlet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteOutlet.js","sourceRoot":"","sources":["../src/RouteOutlet.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import * as Duration from '@effect/data/Duration';
2
+ import * as Scope from '@effect/io/Scope';
3
+ import * as Fx from '@typed/fx';
4
+ import { ElementRef } from '@typed/html';
5
+ import * as Navigation from '@typed/navigation';
6
+ export interface ScrollRestorationParams<A extends HTMLElement> {
7
+ readonly ref: ElementRef<A>;
8
+ readonly behavior?: ScrollBehavior;
9
+ readonly retries?: number;
10
+ readonly retryDelay?: (depth: number) => Duration.Duration;
11
+ }
12
+ export type ScrollRestorationState = {
13
+ readonly scrollRestoration?: {
14
+ readonly scrollLeft: number;
15
+ readonly scrollTop: number;
16
+ };
17
+ };
18
+ export declare function ScrollRestoration<A extends HTMLElement>(params: ScrollRestorationParams<A>): Fx.Fx<Navigation.Navigation | Scope.Scope, never, null>;
19
+ //# sourceMappingURL=ScrollRestoration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollRestoration.d.ts","sourceRoot":"","sources":["../src/ScrollRestoration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,uBAAuB,CAAA;AAGjD,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAE/C,MAAM,WAAW,uBAAuB,CAAC,CAAC,SAAS,WAAW;IAC5D,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAA;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,QAAQ,CAAC,QAAQ,CAAA;CAC3D;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;QAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;QAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAC3B,CAAA;CACF,CAAA;AAID,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,WAAW,EACrD,MAAM,EAAE,uBAAuB,CAAC,CAAC,CAAC,GACjC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAmFzD"}
@@ -0,0 +1,64 @@
1
+ import * as Duration from '@effect/data/Duration';
2
+ import { pipe } from '@effect/data/Function';
3
+ import * as Effect from '@effect/io/Effect';
4
+ import * as Fx from '@typed/fx';
5
+ import * as Navigation from '@typed/navigation';
6
+ const defaultDelay = (depth) => Duration.millis(10 * depth);
7
+ export function ScrollRestoration(params) {
8
+ return Fx.gen(function* ($) {
9
+ const { retries = 3, retryDelay = defaultDelay } = params;
10
+ const { onNavigation, onNavigationEnd } = yield* $(Navigation.Navigation);
11
+ yield* $(onNavigation((ev) => Effect.catchTag(Effect.gen(function* ($) {
12
+ const state = (ev.destination.state ?? {});
13
+ // If ScrollRestoration is not set, set it
14
+ if (!state.scrollRestoration) {
15
+ const el = yield* $(params.ref.element);
16
+ const scrollLeft = el.scrollLeft;
17
+ const scrollTop = el.scrollTop;
18
+ return yield* $(Navigation.redirect(ev.destination.url.href, {
19
+ history: ev.navigationType === Navigation.NavigationType.Replace ? 'replace' : 'push',
20
+ state: {
21
+ ...state,
22
+ scrollRestoration: {
23
+ scrollLeft,
24
+ scrollTop,
25
+ },
26
+ },
27
+ }));
28
+ }
29
+ }),
30
+ // If there is not Element to scroll, ignore the error
31
+ 'NoSuchElementException', Effect.succeed)));
32
+ yield* $(onNavigationEnd(function restoreScroll(ev, depth = 0) {
33
+ return pipe(Effect.gen(function* ($) {
34
+ if (depth > retries) {
35
+ return;
36
+ }
37
+ const state = (ev.destination.state ?? {});
38
+ // Restore scroll position on back/forward navigation
39
+ if (ev.navigationType === Navigation.NavigationType.Back ||
40
+ ev.navigationType === Navigation.NavigationType.Forward) {
41
+ const scrollRestoration = state?.scrollRestoration;
42
+ if (scrollRestoration) {
43
+ const el = yield* $(params.ref.element);
44
+ el.scroll({
45
+ left: scrollRestoration.scrollLeft,
46
+ top: scrollRestoration.scrollTop,
47
+ behavior: params.behavior || 'smooth',
48
+ });
49
+ }
50
+ }
51
+ }),
52
+ // HACK: This isn't great, we should have some kind of way of letting the
53
+ // navigation know when an external render has finished.
54
+ Effect.catchTag(
55
+ // If there is not Element to scroll, attempt to retry a few times.
56
+ 'NoSuchElementException', () => {
57
+ const d = depth + 1;
58
+ return Effect.delay(restoreScroll(ev, d), retryDelay(d));
59
+ }));
60
+ }));
61
+ return Fx.succeed(null);
62
+ });
63
+ }
64
+ //# sourceMappingURL=ScrollRestoration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollRestoration.js","sourceRoot":"","sources":["../src/ScrollRestoration.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,32 @@
1
1
  import * as Effect from '@effect/io/Effect';
2
2
  import * as Scope from '@effect/io/Scope';
3
3
  import * as Fx from '@typed/fx';
4
- import { RenderContext, type Placeholder } from '@typed/html';
4
+ import { Placeholder } from '@typed/html';
5
+ import * as Navigation from '@typed/navigation';
5
6
  import { Router } from './router.js';
6
- export declare function Link<R = never, E = never, R2 = never>(props: LinkProps<R, E, R2>): Fx.Fx<R | R2 | Document | RenderContext | Router | Scope.Scope, E, HTMLAnchorElement>;
7
- export interface LinkProps<R, E, R2> {
8
- readonly href: string;
9
- readonly label: string | Placeholder<R, E>;
10
- readonly className?: string;
11
- readonly onClick?: (event: MouseEvent & {
12
- currentTarget: HTMLAnchorElement;
13
- }) => Effect.Effect<R2, never, unknown>;
14
- readonly useBase?: boolean;
15
- readonly fullReload?: boolean;
7
+ export interface UseLinkParams<R = never, E = never, R2 = never, E2 = never, R3 = never, E3 = never, R4 = never, E4 = never, R5 = never, E5 = never> {
8
+ readonly to: Placeholder<R, E, string>;
9
+ readonly replace?: Placeholder<R2, E2, boolean>;
10
+ readonly state?: Placeholder<R3, E3, unknown> | unknown;
11
+ readonly relative?: Placeholder<R4, E4, boolean>;
12
+ readonly key?: Placeholder<R5, E5, string>;
16
13
  }
14
+ export declare namespace UseLinkParams {
15
+ type Any = UseLinkParams<any, any, any, any, any, any, any, any, any, any>;
16
+ type Context<T extends Any> = Placeholder.ResourcesOf<T['to'] | T['replace'] | T['state'] | T['relative'] | T['key']>;
17
+ type Error<T extends Any> = Placeholder.ErrorsOf<T['to'] | T['replace'] | T['state'] | T['relative'] | T['key']>;
18
+ }
19
+ export interface UseLink<E> {
20
+ readonly url: Fx.Computed<Router, E, string>;
21
+ readonly options: Fx.Computed<never, E, Navigation.NavigateOptions>;
22
+ readonly navigate: Effect.Effect<Router, E, Navigation.Destination>;
23
+ readonly active: Fx.Computed<Router, E, boolean>;
24
+ }
25
+ export declare namespace UseLink {
26
+ type FromParams<T extends UseLinkParams.Any> = [UseLink<UseLinkParams.Error<T>>] extends [
27
+ infer U
28
+ ] ? U : never;
29
+ }
30
+ export declare function useLink<Params extends UseLinkParams.Any>(params: Params): Effect.Effect<UseLinkParams.Context<Params> | Scope.Scope, never, UseLink.FromParams<Params>>;
31
+ export declare function Link<Params extends UseLinkParams.Any, R, E, A>(params: Params, render: (use: UseLink.FromParams<Params>) => Fx.Fx<R, E, A>): Fx.Fx<Scope.Scope | R | UseLinkParams.Context<Params>, E, A>;
17
32
  //# sourceMappingURL=Link.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/Link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;AAEzC,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAsB,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAGjF,OAAO,EAAE,MAAM,EAAe,MAAM,aAAa,CAAA;AAEjD,wBAAgB,IAAI,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,GAAG,KAAK,EACnD,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GACzB,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,aAAa,GAAG,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAwBvF;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,CACjB,KAAK,EAAE,UAAU,GAAG;QAAE,aAAa,EAAE,iBAAiB,CAAA;KAAE,KACrD,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;IAEtC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAC9B"}
1
+ {"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/Link.ts"],"names":[],"mappings":"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"}