@typed/router 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,16 @@
1
+ import * as Effect from '@effect/io/Effect';
2
+ import * as Fx from '@typed/fx';
3
+ import { Hole, type Placeholder } from '@typed/html';
4
+ import { Router } from './router.js';
5
+ export declare function Link<R = never, E = never, R2 = never>(props: LinkProps<R, E, R2>): Fx.Fx<R | R2 | Location | Router, E, Hole>;
6
+ export interface LinkProps<R, E, R2> {
7
+ readonly href: string;
8
+ readonly label: string | Placeholder<R, E>;
9
+ readonly className?: string;
10
+ readonly onClick?: (event: MouseEvent & {
11
+ currentTarget: HTMLAnchorElement;
12
+ }) => Effect.Effect<R2, never, unknown>;
13
+ readonly useBase?: boolean;
14
+ readonly fullReload?: boolean;
15
+ }
16
+ //# sourceMappingURL=Link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../../src/Link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAE3C,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAsB,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAGxE,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,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAyB5C;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"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.Link = void 0;
27
+ const Effect = __importStar(require("@effect/io/Effect"));
28
+ const dom_1 = require("@typed/dom");
29
+ const Fx = __importStar(require("@typed/fx"));
30
+ const html_1 = require("@typed/html");
31
+ const path_1 = require("@typed/path");
32
+ const router_js_1 = require("./router.js");
33
+ function Link(props) {
34
+ return Fx.gen(function* ($) {
35
+ const useBase = props.useBase ?? true;
36
+ const href = useBase ? (0, path_1.pathJoin)(yield* $(router_js_1.getBasePath), props.href) || '/' : props.href;
37
+ const router = yield* $(router_js_1.Router.get);
38
+ const clickHandler = (event) => Effect.gen(function* ($) {
39
+ if (props.fullReload) {
40
+ yield* $((0, dom_1.assign)(href));
41
+ }
42
+ else {
43
+ yield* $(router.currentPath.set(href));
44
+ }
45
+ if (props.onClick) {
46
+ yield* $(props.onClick(event));
47
+ }
48
+ });
49
+ return (0, html_1.html) `<a
50
+ class=${props.className}
51
+ href=${href}
52
+ onclick=${html_1.EventHandler.preventDefault(clickHandler)}
53
+ >${props.label}</a
54
+ >`;
55
+ });
56
+ }
57
+ exports.Link = Link;
58
+ //# sourceMappingURL=Link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Link.js","sourceRoot":"","sources":["../../src/Link.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0DAA2C;AAC3C,oCAAmC;AACnC,8CAA+B;AAC/B,sCAAwE;AACxE,sCAAsC;AAEtC,2CAAiD;AAEjD,SAAgB,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,IAAA,eAAQ,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,uBAAW,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;QACtF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,kBAAM,CAAC,GAAG,CAAC,CAAA;QACnC,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,IAAA,YAAM,EAAC,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,IAAA,WAAI,EAAA;cACD,KAAK,CAAC,SAAS;aAChB,IAAI;gBACD,mBAAY,CAAC,cAAc,CAAC,YAAY,CAAC;SAChD,KAAK,CAAC,KAAK;MACd,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AA3BD,oBA2BC"}
@@ -0,0 +1,16 @@
1
+ import type * as Layer from '@effect/io/Layer';
2
+ import * as Context from '@typed/context';
3
+ import * as Fx from '@typed/fx';
4
+ import type * as html from '@typed/html';
5
+ import type * as Path from '@typed/path';
6
+ import * as Route from '@typed/route';
7
+ export interface RouteMatch<R, E, P extends string> {
8
+ readonly route: Route.Route<R, E, P>;
9
+ readonly layout?: Fx.Fx<R, E, html.Renderable>;
10
+ readonly match: (params: Fx.Fx<never, never, Path.ParamsOf<P>>) => Fx.Fx<R, E, html.Renderable>;
11
+ readonly provideContext: (environment: Context.Context<R>) => RouteMatch<never, E, P>;
12
+ readonly provideService: <S>(tag: Context.Tag<S>, service: S) => RouteMatch<Exclude<R, S>, E, P>;
13
+ readonly provideSomeLayer: <R2, S>(layer: Layer.Layer<R2, never, S>) => RouteMatch<R2 | Exclude<R, S>, E, P>;
14
+ }
15
+ export declare function RouteMatch<R, E, P extends string, R2, E2, R3, E3>(route: Route.Route<R, E, P>, match: (params: Fx.Fx<never, never, Path.ParamsOf<P>>) => Fx.Fx<R2, E2, html.Renderable>, layout?: Fx.Fx<R3, E3, html.Renderable>): RouteMatch<R | R2 | R3, E | E2 | E3, P>;
16
+ //# sourceMappingURL=RouteMatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteMatch.d.ts","sourceRoot":"","sources":["../../src/RouteMatch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,kBAAkB,CAAA;AAC9C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,KAAK,KAAK,IAAI,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,KAAK,IAAI,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,MAAM,WAAW,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,MAAM;IAChD,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAEpC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;IAE9C,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;IAE/F,QAAQ,CAAC,cAAc,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAErF,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAEhG,QAAQ,CAAC,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC,EAC/B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAC7B,UAAU,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CAC1C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAC/D,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC3B,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,EACxF,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,GACtC,UAAU,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CA0BzC"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.RouteMatch = void 0;
27
+ /* eslint-disable @typescript-eslint/ban-types */
28
+ const Function_1 = require("@effect/data/Function");
29
+ const Context = __importStar(require("@typed/context"));
30
+ const Fx = __importStar(require("@typed/fx"));
31
+ const Route = __importStar(require("@typed/route"));
32
+ function RouteMatch(route, match, layout) {
33
+ const routeMatch = {
34
+ route,
35
+ match,
36
+ layout,
37
+ provideContext: (env) => RouteMatch(Route.provideContext(env)(route), (0, Function_1.flow)(match, Fx.contramapContext(Context.merge(env))), layout ? Fx.provideContext(env)(layout) : undefined),
38
+ provideService: (tag, service) => RouteMatch(Route.provideService(tag, service)(route), (0, Function_1.flow)(match, Fx.provideService(tag)(service)), layout ? Fx.provideService(tag)(service)(layout) : undefined),
39
+ provideSomeLayer: (layer) => RouteMatch(Route.provideSomeLayer(layer)(route), (0, Function_1.flow)(match, Fx.provideSomeLayer(layer)), layout ? Fx.provideSomeLayer(layer)(layout) : undefined),
40
+ };
41
+ return routeMatch;
42
+ }
43
+ exports.RouteMatch = RouteMatch;
44
+ //# sourceMappingURL=RouteMatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteMatch.js","sourceRoot":"","sources":["../../src/RouteMatch.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAiD;AACjD,oDAA4C;AAE5C,wDAAyC;AACzC,8CAA+B;AAG/B,oDAAqC;AAkBrC,SAAgB,UAAU,CACxB,KAA2B,EAC3B,KAAwF,EACxF,MAAuC;IAEvC,MAAM,UAAU,GAA4C;QAC1D,KAAK;QACL,KAAK;QACL,MAAM;QACN,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CACtB,UAAU,CACR,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAChC,IAAA,eAAI,EAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EACpD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CACpD;QACH,cAAc,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAC/B,UAAU,CACR,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,EACzC,IAAA,eAAI,EAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAC5C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAC7D;QACH,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAC1B,UAAU,CACR,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EACpC,IAAA,eAAI,EAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EACvC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CACxD;KACJ,CAAA;IAED,OAAO,UAAU,CAAA;AACnB,CAAC;AA9BD,gCA8BC"}
@@ -0,0 +1,35 @@
1
+ import * as Effect from '@effect/io/Effect';
2
+ import type * as Layer from '@effect/io/Layer';
3
+ import type * as Context from '@typed/context';
4
+ import * as Fx from '@typed/fx';
5
+ import type * as html from '@typed/html';
6
+ import type * as Path from '@typed/path';
7
+ import type * as Route from '@typed/route';
8
+ import { RouteMatch } from './RouteMatch.js';
9
+ import { Redirect, Router } from './router.js';
10
+ export interface RouteMatcher<R = never, E = never> {
11
+ readonly routes: ReadonlyMap<Route.Route<any, any, any>, RouteMatch<any, any, any>>;
12
+ readonly match: <R2, E2, P extends string, R3, E3>(route: Route.Route<R2, E2, P>, f: (params: Path.ParamsOf<P>) => Fx.Fx<R3, E3, html.Renderable>) => RouteMatcher<R | R2 | R3, E | E2 | E3>;
13
+ readonly matchFx: <R2, E2, P extends string, R3, E3>(route: Route.Route<R2, E2, P>, f: (params: Fx.Fx<never, never, Path.ParamsOf<P>>) => Fx.Fx<R3, E3, html.Renderable>) => RouteMatcher<R | R2 | R3, E | E2 | E3>;
14
+ readonly matchEffect: <R2, E2, P extends string, R3, E3>(route: Route.Route<R2, E2, P>, f: (params: Path.ParamsOf<P>) => Effect.Effect<R3, E3, html.Renderable>) => RouteMatcher<R | R2 | R3, E | E2 | E3>;
15
+ readonly withLayout: <R2, E2>(fx: Fx.Fx<R2, E2, html.Renderable>) => RouteMatcher<R | R2, E | E2>;
16
+ readonly provideContext: <R2>(environment: Context.Context<R2>) => RouteMatcher<Exclude<R, R2>, E>;
17
+ readonly provideService: <R2>(tag: Context.Tag<R2>, service: R2) => RouteMatcher<Exclude<R, R2>, E>;
18
+ readonly provideSomeLayer: <R2, S>(layer: Layer.Layer<R2, never, S>) => RouteMatcher<Exclude<R, S> | R2, E>;
19
+ readonly notFound: <R2, E2, R3 = never, E3 = never>(f: (path: string) => Fx.Fx<R2, E2, html.Renderable>, options?: FallbackOptions<R3, E3>) => Fx.Fx<Router | R | R2 | R3, E | E2 | E3, html.Renderable>;
20
+ readonly notFoundEffect: <R2, E2, R3 = never, E3 = never>(f: (path: string) => Effect.Effect<R2, E2, html.Renderable>, options?: FallbackOptions<R3, E3>) => Fx.Fx<Router | R | R2 | R3, E | E2 | E3, html.Renderable>;
21
+ readonly redirectTo: <R2, E2, P extends string>(route: Route.Route<R2, E2, P>, ...params: [keyof Path.ParamsOf<P>] extends [never] ? [
22
+ {}?
23
+ ] : [(path: string) => Path.ParamsOf<P>]) => Fx.Fx<Router | R | R2, E | Redirect, html.Renderable>;
24
+ readonly run: Fx.Fx<Router | R, E | Redirect, html.Renderable | null>;
25
+ }
26
+ export interface FallbackOptions<R, E> {
27
+ readonly layout?: Fx.Fx<R, E, html.Renderable>;
28
+ }
29
+ export declare function RouteMatcher<R, E>(routes: RouteMatcher<R, E>['routes']): RouteMatcher<R, E>;
30
+ export declare namespace RouteMatcher {
31
+ const empty: RouteMatcher<never, never>;
32
+ const concat: <R, E, R2, E2>(matcher: RouteMatcher<R, E>, matcher2: RouteMatcher<R2, E2>) => RouteMatcher<R | R2, E | E2>;
33
+ }
34
+ export declare const matchFx: <R2, E2, P extends string, R3, E3>(route: Route.Route<R2, E2, P>, f: (params: Fx.Fx<never, never, Path.PartsToParams<Path.PathToParts<P>, {}> extends infer T ? { readonly [K in keyof T]: Path.PartsToParams<Path.PathToParts<P>, {}>[K]; } : never>) => Fx.Fx<R3, E3, html.Renderable>) => RouteMatcher<R2 | R3, E2 | E3>, match: <R2, E2, P extends string, R3, E3>(route: Route.Route<R2, E2, P>, f: (params: Path.PartsToParams<Path.PathToParts<P>, {}> extends infer T ? { readonly [K in keyof T]: Path.PartsToParams<Path.PathToParts<P>, {}>[K]; } : never) => Fx.Fx<R3, E3, html.Renderable>) => RouteMatcher<R2 | R3, E2 | E3>, matchEffect: <R2, E2, P extends string, R3, E3>(route: Route.Route<R2, E2, P>, f: (params: Path.PartsToParams<Path.PathToParts<P>, {}> extends infer T ? { readonly [K in keyof T]: Path.PartsToParams<Path.PathToParts<P>, {}>[K]; } : never) => Effect.Effect<R3, E3, html.Renderable>) => RouteMatcher<R2 | R3, E2 | E3>;
35
+ //# sourceMappingURL=RouteMatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteMatcher.d.ts","sourceRoot":"","sources":["../../src/RouteMatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var _a;
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.matchEffect = exports.match = exports.matchFx = exports.RouteMatcher = void 0;
28
+ /* eslint-disable @typescript-eslint/ban-types */
29
+ const Function_1 = require("@effect/data/Function");
30
+ const Option = __importStar(require("@effect/data/Option"));
31
+ const Cause = __importStar(require("@effect/io/Cause"));
32
+ const Effect = __importStar(require("@effect/io/Effect"));
33
+ const Fiber = __importStar(require("@effect/io/Fiber"));
34
+ const Fx = __importStar(require("@typed/fx"));
35
+ const html_1 = require("@typed/html");
36
+ const RouteMatch_js_1 = require("./RouteMatch.js");
37
+ const router_js_1 = require("./router.js");
38
+ function RouteMatcher(routes) {
39
+ const matcher = {
40
+ routes,
41
+ matchFx: (route, f) => RouteMatcher(new Map(routes).set(route, (0, RouteMatch_js_1.RouteMatch)(route, f))),
42
+ match: (route, f) => RouteMatcher(new Map(routes).set(route, (0, RouteMatch_js_1.RouteMatch)(route, Fx.switchMap(f)))),
43
+ matchEffect: (route, f) => RouteMatcher(new Map(routes).set(route, (0, RouteMatch_js_1.RouteMatch)(route, Fx.switchMapEffect(f)))),
44
+ withLayout: (layout) => RouteMatcher(new Map(Array.from(routes).map(([k, match]) => [
45
+ k,
46
+ (0, RouteMatch_js_1.RouteMatch)(match.route, match.match, match.layout ?? layout),
47
+ ]))),
48
+ provideContext: (environment) => RouteMatcher(new Map(Array.from(routes).map(([k, v]) => [k, v.provideContext(environment)]))),
49
+ provideService: (tag, service) => RouteMatcher(new Map(Array.from(routes).map(([k, v]) => [k, v.provideService(tag, service)]))),
50
+ provideSomeLayer: (layer) => RouteMatcher(new Map(Array.from(routes).map(([k, v]) => [k, v.provideSomeLayer(layer)]))),
51
+ notFound: (f, options = {}) => router_js_1.Router.withFx((router) => Fx.gen(function* ($) {
52
+ const { environment } = yield* $(html_1.RenderContext.get);
53
+ // Create stable references to the route matchers
54
+ const matchers = Array.from(routes.values()).map((v) => [{ ...v, route: router.route.concat(v.route) }, runRouteMatch(router, v)]);
55
+ const renderFallback = Fx.switchMap(f)(router.currentPath);
56
+ let previousFiber;
57
+ let previousLayout;
58
+ let previousRender;
59
+ const samplePreviousValues = () => ({
60
+ fiber: previousFiber,
61
+ layout: previousLayout,
62
+ render: previousRender,
63
+ });
64
+ // This function helps us to ensure shared layouts are only rendered once
65
+ // and the outlet content is changed
66
+ const verifyShouldRerender = (render, layout) => Effect.gen(function* ($) {
67
+ const { outlet } = yield* $(router_js_1.Router.get);
68
+ const previous = samplePreviousValues();
69
+ // Update the previous values
70
+ previousRender = render;
71
+ previousLayout = layout;
72
+ previousFiber = undefined;
73
+ // Skip rerendering if the render function is the same
74
+ if (previous.render === render && previous.layout === layout) {
75
+ return Option.none();
76
+ }
77
+ // Interrupt the previous fiber if it exists
78
+ if (previous.render !== render && previous.fiber) {
79
+ yield* $(Fiber.interrupt(previous.fiber));
80
+ }
81
+ // If we have a layout, we need to render it and use the route outlet.
82
+ if (layout) {
83
+ // Render into the route outlet
84
+ if (previous.render !== render) {
85
+ previousFiber = yield* $((0, Function_1.pipe)(render, Fx.observe(outlet.set), Effect.onError((cause) => Cause.isInterruptedOnly(cause)
86
+ ? Effect.unit()
87
+ : outlet.error(cause)), Effect.forkScoped));
88
+ }
89
+ return Option.some(layout);
90
+ }
91
+ // If we don't have a layout, but we did, we need to clear the outlet
92
+ if (previous.layout) {
93
+ yield* $(outlet.set(null));
94
+ }
95
+ // Otherwise use the render function directly
96
+ return Option.some(render);
97
+ });
98
+ return (0, Function_1.pipe)(router.currentPath, environment === 'browser' ? Fx.skipRepeats : Fx.take(1), Fx.switchMapEffect((path) => Effect.gen(function* ($) {
99
+ yield* $(Effect.logDebug(`[@typed/router] Matching path: ${path}`));
100
+ // Attempt to find the best match
101
+ for (const [match, render] of matchers) {
102
+ yield* $(Effect.logDebug(`[@typed/router] Matching against: ${match.route.path}`));
103
+ const result = yield* $(match.route.match(path));
104
+ if (Option.isSome(result)) {
105
+ yield* $(Effect.logDebug(`[@typed/router] Matched against: ${match.route.path}`));
106
+ return yield* $(verifyShouldRerender(render, match.layout));
107
+ }
108
+ }
109
+ yield* $(Effect.logDebug(`[@typed/router] Rendering fallback`));
110
+ // If we didn't find a match, render the not found page
111
+ return yield* $(verifyShouldRerender(renderFallback, options.layout));
112
+ })), Fx.compact, Fx.skipRepeats, // Stable render references are used to avoid mounting the same component twice
113
+ Fx.switchLatest);
114
+ })),
115
+ notFoundEffect: (f) => matcher.notFound((path) => Fx.fromEffect(f(path))),
116
+ redirectTo: ((route, ...params) => matcher.notFound(() => router_js_1.redirectTo.fx(route, ...params))),
117
+ run: Fx.suspend(() => matcher.notFound(() => Fx.succeed(null))),
118
+ };
119
+ return matcher;
120
+ }
121
+ exports.RouteMatcher = RouteMatcher;
122
+ (function (RouteMatcher) {
123
+ RouteMatcher.empty = RouteMatcher(new Map());
124
+ RouteMatcher.concat = (matcher, matcher2) => RouteMatcher(new Map([...matcher.routes, ...matcher2.routes]));
125
+ })(RouteMatcher = exports.RouteMatcher || (exports.RouteMatcher = {}));
126
+ _a = RouteMatcher(new Map()), exports.matchFx = _a.matchFx, exports.match = _a.match, exports.matchEffect = _a.matchEffect;
127
+ function runRouteMatch(router, { route, match }) {
128
+ return Fx.gen(function* ($) {
129
+ const env = yield* $(Effect.context());
130
+ const nestedRouter = router.define(route);
131
+ const params = (0, Function_1.pipe)(nestedRouter.params, Fx.provideContext(env));
132
+ const render = (0, Function_1.pipe)(match(params), router_js_1.Router.provideFx(nestedRouter));
133
+ return render;
134
+ });
135
+ }
136
+ //# sourceMappingURL=RouteMatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteMatcher.js","sourceRoot":"","sources":["../../src/RouteMatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './router.js';
2
+ export * from './Link.js';
3
+ export * from './RouteMatcher.js';
4
+ export * from './RouteMatch.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./router.js"), exports);
18
+ __exportStar(require("./Link.js"), exports);
19
+ __exportStar(require("./RouteMatcher.js"), exports);
20
+ __exportStar(require("./RouteMatch.js"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,4CAAyB;AACzB,oDAAiC;AACjC,kDAA+B"}
@@ -0,0 +1,74 @@
1
+ import * as Option from '@effect/data/Option';
2
+ import * as Effect from '@effect/io/Effect';
3
+ import type * as Layer from '@effect/io/Layer';
4
+ import type * as Scope from '@effect/io/Scope';
5
+ import * as Context from '@typed/context';
6
+ import { Document, Location, History } from '@typed/dom';
7
+ import * as Fx from '@typed/fx';
8
+ import type * as html from '@typed/html';
9
+ import { RenderContext } from '@typed/html';
10
+ import * as Path from '@typed/path';
11
+ import * as Route from '@typed/route';
12
+ export interface Router<out R = never, out E = never, in out P extends string = string> {
13
+ /**
14
+ * The base route the Router is starting from.
15
+ */
16
+ readonly route: Route.Route<R, E, P>;
17
+ /**
18
+ * The current path of the application
19
+ */
20
+ readonly currentPath: Fx.RefSubject<string>;
21
+ /**
22
+ * The current matched params of the router
23
+ */
24
+ readonly params: Fx.Fx<R, E, Path.ParamsOf<P>>;
25
+ /**
26
+ * The current outlet of this Router
27
+ */
28
+ readonly outlet: Fx.RefSubject<html.Renderable>;
29
+ /**
30
+ * Helper for constructing a path from a route relative to the router.
31
+ */
32
+ readonly createPath: <R2 extends Route.Route<any, any, string>, P extends Route.ParamsOf<R2>>(route: R2, ...[params]: [keyof P] extends [never] ? [] : [P]) => Effect.Effect<R, never, Path.PathJoin<[
33
+ Path.Interpolate<Route.PathOf<R>, Route.ParamsOf<R>>,
34
+ Path.Interpolate<Route.PathOf<R2>, P>
35
+ ]>>;
36
+ /**
37
+ * Helper for constructing a nested router
38
+ */
39
+ readonly define: <R2, E2, Path2 extends string>(route: Route.Route<R2, E2, Path2>) => Router<R | R2, E | E2, Path.PathJoin<[P, Path2]>>;
40
+ /**
41
+ * The parent router if one exists
42
+ */
43
+ readonly parent: Option.Option<Router<any, string>>;
44
+ /**
45
+ * Provide all the resources needed for a Router
46
+ */
47
+ readonly provideContext: (environment: Context.Context<R>) => Router<never, E, P>;
48
+ }
49
+ export declare const Router: (<R = never, E = never, P extends string = string>(route: Route.Route<R, E, P>, currentPath: Fx.RefSubject<string>, parent?: Option.Option<Router<any, any, string>>) => Router<R, E, P>) & Context.Tag<Router<never, never, string>>;
50
+ export declare const outlet: Fx.Fx<RenderContext | Router, never, html.Renderable>;
51
+ export declare const currentPath: Fx.Fx<Router, never, string>;
52
+ export declare function provideContext<R>(environment: Context.Context<R>): <E, P extends string>(router: Router<R, E, P>) => Router<never, E, P>;
53
+ export interface Redirect {
54
+ readonly _tag: 'Redirect';
55
+ readonly path: string;
56
+ }
57
+ export declare namespace Redirect {
58
+ const make: (path: string) => Redirect;
59
+ const is: (r: unknown) => r is Redirect;
60
+ }
61
+ export declare function redirect(path: string): Effect.Effect<never, Redirect, never>;
62
+ export declare namespace redirect {
63
+ var fx: (path: string) => Fx.Fx<never, Redirect, never>;
64
+ }
65
+ export declare const redirectTo: {
66
+ <R, E, P extends string>(route: Route.Route<R, E, P>, ...[params]: [keyof Path.PartsToParams<Path.PathToParts<P>, {}>] extends [never] ? [({} | undefined)?] : [Path.PartsToParams<Path.PathToParts<P>, {}> extends infer T ? { readonly [K in keyof T]: Path.PartsToParams<Path.PathToParts<P>, {}>[K]; } : never]): Effect.Effect<Router, Redirect, never>;
67
+ fx<R_1, E_1, P_1 extends string>(route: Route.Route<R_1, E_1, P_1>, ...params: [keyof Path.PartsToParams<Path.PathToParts<P_1>, {}>] extends [never] ? [({} | undefined)?] : [(path: string) => Path.PartsToParams<Path.PathToParts<P_1>, {}> extends infer T_1 ? { readonly [K_1 in keyof T_1]: Path.PartsToParams<Path.PathToParts<P_1>, {}>[K_1]; } : never]): Fx.Fx<Router, Redirect, never>;
68
+ };
69
+ export declare const makeRouter: (currentPath?: Fx.RefSubject<string>) => Effect.Effect<Location | History | Window | Document | Scope.Scope, never, Router>;
70
+ export declare const live: (currentPath?: Fx.RefSubject<string>) => Layer.Layer<Location | History | Window | Document, never, Router<never, never, string>>;
71
+ export declare function getCurrentPathFromLocation(location: Location | HTMLAnchorElement | URL): string;
72
+ export declare const getCurrentPath: Effect.Effect<Router<never, never, string>, never, string>;
73
+ export declare const getBasePath: Effect.Effect<Router<never, never, string>, never, string>;
74
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router.ts"],"names":[],"mappings":"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"}