@typed/router 0.27.6 → 0.28.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 (46) hide show
  1. package/MatchInput/package.json +6 -0
  2. package/RouteGuard/package.json +6 -0
  3. package/RouteMatch/package.json +6 -0
  4. package/dist/cjs/CurrentRoute.js +48 -31
  5. package/dist/cjs/CurrentRoute.js.map +1 -1
  6. package/dist/cjs/MatchInput.js +96 -0
  7. package/dist/cjs/MatchInput.js.map +1 -0
  8. package/dist/cjs/Matcher.js +97 -73
  9. package/dist/cjs/Matcher.js.map +1 -1
  10. package/dist/cjs/RouteGuard.js +78 -0
  11. package/dist/cjs/RouteGuard.js.map +1 -0
  12. package/dist/cjs/RouteMatch.js +49 -0
  13. package/dist/cjs/RouteMatch.js.map +1 -0
  14. package/dist/cjs/index.js +25 -0
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/dts/CurrentRoute.d.ts +19 -14
  17. package/dist/dts/CurrentRoute.d.ts.map +1 -1
  18. package/dist/dts/MatchInput.d.ts +135 -0
  19. package/dist/dts/MatchInput.d.ts.map +1 -0
  20. package/dist/dts/Matcher.d.ts +94 -33
  21. package/dist/dts/Matcher.d.ts.map +1 -1
  22. package/dist/dts/RouteGuard.d.ts +94 -0
  23. package/dist/dts/RouteGuard.d.ts.map +1 -0
  24. package/dist/dts/RouteMatch.d.ts +50 -0
  25. package/dist/dts/RouteMatch.d.ts.map +1 -0
  26. package/dist/dts/index.d.ts +12 -0
  27. package/dist/dts/index.d.ts.map +1 -1
  28. package/dist/esm/CurrentRoute.js +46 -29
  29. package/dist/esm/CurrentRoute.js.map +1 -1
  30. package/dist/esm/MatchInput.js +79 -0
  31. package/dist/esm/MatchInput.js.map +1 -0
  32. package/dist/esm/Matcher.js +95 -67
  33. package/dist/esm/Matcher.js.map +1 -1
  34. package/dist/esm/RouteGuard.js +57 -0
  35. package/dist/esm/RouteGuard.js.map +1 -0
  36. package/dist/esm/RouteMatch.js +29 -0
  37. package/dist/esm/RouteMatch.js.map +1 -0
  38. package/dist/esm/index.js +12 -0
  39. package/dist/esm/index.js.map +1 -1
  40. package/package.json +35 -10
  41. package/src/CurrentRoute.ts +113 -63
  42. package/src/MatchInput.ts +282 -0
  43. package/src/Matcher.ts +325 -143
  44. package/src/RouteGuard.ts +217 -0
  45. package/src/RouteMatch.ts +104 -0
  46. package/src/index.ts +15 -0
@@ -1,92 +1,64 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import { CurrentEnvironment } from "@typed/environment";
5
4
  import * as Fx from "@typed/fx/Fx";
6
5
  import * as Match from "@typed/fx/Match";
7
- import * as RefSubject from "@typed/fx/RefSubject";
8
- import * as Guard from "@typed/guard";
9
- import * as Navigation from "@typed/navigation";
10
- import * as Route from "@typed/route";
6
+ import { CurrentPath, isRedirectError, navigate, RedirectError } from "@typed/navigation";
7
+ import * as Data from "effect/Data";
11
8
  import * as Effect from "effect/Effect";
9
+ import { dual, pipe } from "effect/Function";
12
10
  import * as Option from "effect/Option";
13
- import { makeHref, withCurrentRoute } from "./CurrentRoute.js";
11
+ import { hasProperty } from "effect/Predicate";
12
+ import * as Unify from "effect/Unify";
13
+ import { makeHref } from "./CurrentRoute.js";
14
+ import * as RouteMatch from "./RouteMatch.js";
15
+ /**
16
+ * @since 1.0.0
17
+ */
18
+ export const RouteMatcherTypeId = Symbol.for("@typed/router/RouteMatcher");
14
19
  class RouteMatcherImpl {
15
- guards;
16
- constructor(guards) {
17
- this.guards = guards;
20
+ matches;
21
+ [RouteMatcherTypeId] = RouteMatcherTypeId;
22
+ constructor(matches) {
23
+ this.matches = matches;
24
+ this.add = this.add.bind(this);
18
25
  this.match = this.match.bind(this);
26
+ this.switch = this.switch.bind(this);
27
+ this.effect = this.effect.bind(this);
19
28
  this.to = this.to.bind(this);
20
- this.notFound = this.notFound.bind(this);
21
- this.redirect = this.redirect.bind(this);
22
29
  }
23
- match(...args) {
24
- const route = getRoute(args[0]);
25
- if (args.length === 2) {
26
- return new RouteMatcherImpl([...this.guards, {
27
- route,
28
- guard: getGuard(route),
29
- match: (ref) => Fx.scoped(args[1](ref))
30
- }]);
31
- }
32
- else {
33
- return new RouteMatcherImpl([...this.guards, {
34
- route,
35
- guard: getGuard(route, args[1]),
36
- match: (ref) => Fx.scoped(args[2](ref))
37
- }]);
38
- }
30
+ add(match) {
31
+ return new RouteMatcherImpl([...this.matches, match]);
39
32
  }
40
- to(...args) {
41
- const route = getRoute(args[0]);
42
- if (args.length === 2) {
43
- return this.match(route, (ref) => RefSubject.map(ref, args[1]));
44
- }
45
- else {
46
- return this.match(route, args[1], (ref) => RefSubject.map(ref, args[2]));
47
- }
33
+ match(input, match) {
34
+ return this.add(RouteMatch.fromInput(input, match));
48
35
  }
49
- notFound(f) {
50
- return Fx.fromFxEffect(CurrentEnvironment.with((env) => {
51
- const onNotFound = Fx.scoped(f(Navigation.CurrentEntry));
52
- let matcher = Match
53
- .value(
54
- // Only if we're rendering in a DOM-based environment should we allow for routing to last indefinitely
55
- env === "dom" || env === "test:dom" ? Navigation.CurrentPath : Fx.take(Navigation.CurrentPath, 1));
56
- for (const { guard, match, route } of this.guards) {
57
- matcher = matcher.when(guard, (ref) => Fx.middleware(match(ref), withCurrentRoute(route)));
58
- }
59
- return Fx.filterMapErrorEffect(matcher.getOrElse(() => onNotFound), (e) => Navigation.isRedirectError(e)
60
- // Fork the redirect to ensure it does not occur within the same runUpdates as the initial navigation
61
- ? Effect.as(Effect.forkScoped(Navigation.handleRedirect(e)), Option.none())
62
- : Effect.succeedSome(e));
63
- }));
36
+ switch(input, match) {
37
+ return this.match(input, Fx.switchMap(match));
64
38
  }
65
- redirect(route, ...params) {
66
- return this.notFound(() => RefSubject.mapEffect(makeHref(route, ...params), (s) => Effect.fail(Navigation.redirectToPath(s))));
67
- }
68
- }
69
- function getGuard(path, guard) {
70
- if (guard) {
71
- return Guard.compose(path, guard);
39
+ effect(input, match) {
40
+ return this.match(input, Fx.switchMapEffect(match));
72
41
  }
73
- else {
74
- return path.asGuard();
42
+ to(input, f) {
43
+ return this.match(input, Fx.map(f));
75
44
  }
76
45
  }
77
- function getRoute(route) {
78
- return typeof route === "string" ? Route.fromPath(route) : route;
79
- }
80
46
  /**
81
47
  * @since 1.0.0
82
48
  */
83
- export function empty() {
84
- return new RouteMatcherImpl([]);
49
+ export function make(matches) {
50
+ return new RouteMatcherImpl(matches);
85
51
  }
86
52
  /**
87
- * @since 1.18.0
53
+ * @since 1.0.0
54
+ */
55
+ export const empty = make([]);
56
+ const { effect, match, switch: switch_, to } = empty;
57
+ export {
58
+ /**
59
+ * @since 1.0.0
88
60
  */
89
- export const {
61
+ effect,
90
62
  /**
91
63
  * @since 1.0.0
92
64
  */
@@ -94,5 +66,61 @@ match,
94
66
  /**
95
67
  * @since 1.0.0
96
68
  */
97
- to } = empty();
69
+ switch_ as switch,
70
+ /**
71
+ * @since 1.0.0
72
+ */
73
+ to };
74
+ /**
75
+ * @since 1.0.0
76
+ */
77
+ export const catchRedirectError = (fx) => Fx.filterMapErrorEffect(fx, Unify.unify((_) => isRedirectError(_)
78
+ ? Effect.as(Effect.forkScoped(Effect.ignoreLogged(navigate(_.path, _.options))), Option.none())
79
+ : Effect.succeedSome(_)));
80
+ /**
81
+ * @since 1.0.0
82
+ */
83
+ export const notFound = dual(2, function notFound(router, onNotFound) {
84
+ let matcher = Match.value(CurrentPath);
85
+ for (const match of router.matches) {
86
+ matcher = matcher.when(match.guard, match.match);
87
+ }
88
+ return catchRedirectError(matcher.getOrElse(() => onNotFound));
89
+ });
90
+ /**
91
+ * @since 1.0.0
92
+ */
93
+ export const notFoundWith = dual(2, function notFoundWith(router, onNotFound) {
94
+ return notFound(router, Fx.fromEffect(onNotFound));
95
+ });
96
+ /**
97
+ * @since 1.0.0
98
+ */
99
+ export function isRouteMatcher(value) {
100
+ return hasProperty(value, RouteMatcherTypeId);
101
+ }
102
+ /**
103
+ * @since 1.0.0
104
+ */
105
+ export const redirectWith = dual(2, function redirectWith(router, effect) {
106
+ return notFoundWith(router, Effect.flatMap(effect, (path) => new RedirectError({ path })));
107
+ });
108
+ /**
109
+ * @since 1.0.0
110
+ */
111
+ export const redirectTo = dual((args) => isRouteMatcher(args[0]), function redirect(router, route, ...params) {
112
+ return redirectWith(router, pipe(Effect.catchTag(makeHref(route, ...params), "NoSuchElementException", () => Effect.fail(new RedirectRouteMatchError(route, (params[0] || {})))), Effect.flatMap((path) => new RedirectError({ path }))));
113
+ });
114
+ /**
115
+ * @since 1.0.0
116
+ */
117
+ export class RedirectRouteMatchError extends Data.TaggedError("RedirectRouteMatchError") {
118
+ route;
119
+ params;
120
+ constructor(route, params) {
121
+ super();
122
+ this.route = route;
123
+ this.params = params;
124
+ }
125
+ }
98
126
  //# sourceMappingURL=Matcher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Matcher.js","sourceRoot":"","sources":["../../src/Matcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Matcher.js","sourceRoot":"","sources":["../../src/Matcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Guard from "@typed/guard";
5
+ import * as Route from "@typed/route";
6
+ import * as Effect from "effect/Effect";
7
+ import { dual, flow } from "effect/Function";
8
+ import * as Option from "effect/Option";
9
+ /**
10
+ * @since 1.0.0
11
+ */
12
+ export function make(route, guard) {
13
+ return { route, guard };
14
+ }
15
+ /**
16
+ * @since 1.0.0
17
+ */
18
+ export function fromRoute(route) {
19
+ return make(route, flow(Route.decode_(route), Effect.optionFromOptional));
20
+ }
21
+ /**
22
+ * @since 1.0.0
23
+ */
24
+ export const map = dual(2, function map(self, f) {
25
+ return make(self.route, Guard.map(self.guard, f));
26
+ });
27
+ /**
28
+ * @since 1.0.0
29
+ */
30
+ export const mapEffect = dual(2, function mapEffect(self, f) {
31
+ return make(self.route, Guard.mapEffect(self.guard, f));
32
+ });
33
+ /**
34
+ * @since 1.0.0
35
+ */
36
+ export const filter = dual(2, function filter(self, f) {
37
+ return make(self.route, Guard.filter(self.guard, f));
38
+ });
39
+ /**
40
+ * @since 1.0.0
41
+ */
42
+ export const filterMap = dual(2, function filterMap(self, f) {
43
+ return make(self.route, Guard.filterMap(self.guard, f));
44
+ });
45
+ /**
46
+ * @since 1.0.0
47
+ */
48
+ export const flatMap = dual(2, function flatMap(self, guard) {
49
+ return make(self.route, Guard.compose(self.guard, guard));
50
+ });
51
+ /**
52
+ * @since 1.0.0
53
+ */
54
+ export const concat = dual(2, function concat(self, other) {
55
+ return make(Route.concat(self.route, other.route), (input) => Effect.Do.pipe(Effect.bind("a", () => self.guard(input)), Effect.bind("b", () => other.guard(input)), Effect.map((options) => Option.map(Option.all(options), ({ a, b }) => ({ ...a, ...b })))));
56
+ });
57
+ //# sourceMappingURL=RouteGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteGuard.js","sourceRoot":"","sources":["../../src/RouteGuard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import { middleware } from "@typed/fx/Fx";
5
+ import { flow } from "effect/Function";
6
+ import { withCurrentRoute } from "./CurrentRoute.js";
7
+ import { asRouteGuard } from "./MatchInput.js";
8
+ import * as RouteGuard from "./RouteGuard.js";
9
+ /**
10
+ * @since 1.0.0
11
+ */
12
+ export function make(route, guard, match) {
13
+ return { route, guard, match: flow(match, middleware(withCurrentRoute(route))) };
14
+ }
15
+ /**
16
+ * @since 1.0.0
17
+ */
18
+ export function fromRoute(route, match) {
19
+ const { guard } = RouteGuard.fromRoute(route);
20
+ return make(route, guard, match);
21
+ }
22
+ /**
23
+ * @since 1.0.0
24
+ */
25
+ export function fromInput(input, match) {
26
+ const { guard, route } = asRouteGuard(input);
27
+ return make(route, guard, match);
28
+ }
29
+ //# sourceMappingURL=RouteMatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RouteMatch.js","sourceRoot":"","sources":["../../src/RouteMatch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAW,UAAU,EAAE,MAAM,cAAc,CAAA;AAIlD,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,EAAqB,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AA0C7C;;GAEG;AACH,MAAM,UAAU,IAAI,CAClB,KAAQ,EACR,KAA+B,EAC/B,KAA4C;IAE5C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;AAClF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,KAAQ,EACR,KAA8D;IAU9D,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAE7C,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CACvB,KAAQ,EACR,KAA8D;IAU9D,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IAE5C,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AAClC,CAAC"}
package/dist/esm/index.js CHANGED
@@ -9,4 +9,16 @@ export * from "./CurrentRoute.js";
9
9
  * @since 1.0.0
10
10
  */
11
11
  export * from "./Matcher.js";
12
+ /**
13
+ * @since 1.0.0
14
+ */
15
+ export * from "./MatchInput.js";
16
+ /**
17
+ * @since 1.0.0
18
+ */
19
+ export * as RouteGuard from "./RouteGuard.js";
20
+ /**
21
+ * @since 1.0.0
22
+ */
23
+ export * as RouteMatch from "./RouteMatch.js";
12
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,cAAc,mBAAmB,CAAA;AAEjC;;GAEG;AACH,cAAc,cAAc,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,cAAc,mBAAmB,CAAA;AAEjC;;GAEG;AACH,cAAc,cAAc,CAAA;AAE5B;;GAEG;AACH,cAAc,iBAAiB,CAAA;AAE/B;;GAEG;AACH,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAE7C;;GAEG;AACH,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typed/router",
3
- "version": "0.27.6",
3
+ "version": "0.28.0",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -10,15 +10,16 @@
10
10
  "sideEffects": [],
11
11
  "author": "Typed contributors",
12
12
  "dependencies": {
13
- "effect": "^2.4.1",
14
- "@typed/context": "0.25.1",
15
- "@typed/dom": "13.0.1",
16
- "@typed/environment": "0.6.3",
17
- "@typed/fx": "1.27.3",
18
- "@typed/guard": "0.1.3",
19
- "@typed/navigation": "0.13.4",
20
- "@typed/path": "0.10.2",
21
- "@typed/route": "4.0.3"
13
+ "@effect/schema": "^0.66.10",
14
+ "effect": "^3.0.7",
15
+ "@typed/context": "0.26.0",
16
+ "@typed/dom": "14.0.0",
17
+ "@typed/environment": "0.7.0",
18
+ "@typed/fx": "1.28.0",
19
+ "@typed/guard": "0.2.0",
20
+ "@typed/navigation": "0.14.0",
21
+ "@typed/path": "0.11.0",
22
+ "@typed/route": "5.0.0"
22
23
  },
23
24
  "main": "./dist/cjs/index.js",
24
25
  "module": "./dist/esm/index.js",
@@ -35,10 +36,25 @@
35
36
  "import": "./dist/esm/CurrentRoute.js",
36
37
  "default": "./dist/cjs/CurrentRoute.js"
37
38
  },
39
+ "./MatchInput": {
40
+ "types": "./dist/dts/MatchInput.d.ts",
41
+ "import": "./dist/esm/MatchInput.js",
42
+ "default": "./dist/cjs/MatchInput.js"
43
+ },
38
44
  "./Matcher": {
39
45
  "types": "./dist/dts/Matcher.d.ts",
40
46
  "import": "./dist/esm/Matcher.js",
41
47
  "default": "./dist/cjs/Matcher.js"
48
+ },
49
+ "./RouteGuard": {
50
+ "types": "./dist/dts/RouteGuard.d.ts",
51
+ "import": "./dist/esm/RouteGuard.js",
52
+ "default": "./dist/cjs/RouteGuard.js"
53
+ },
54
+ "./RouteMatch": {
55
+ "types": "./dist/dts/RouteMatch.d.ts",
56
+ "import": "./dist/esm/RouteMatch.js",
57
+ "default": "./dist/cjs/RouteMatch.js"
42
58
  }
43
59
  },
44
60
  "typesVersions": {
@@ -46,8 +62,17 @@
46
62
  "CurrentRoute": [
47
63
  "./dist/dts/CurrentRoute.d.ts"
48
64
  ],
65
+ "MatchInput": [
66
+ "./dist/dts/MatchInput.d.ts"
67
+ ],
49
68
  "Matcher": [
50
69
  "./dist/dts/Matcher.d.ts"
70
+ ],
71
+ "RouteGuard": [
72
+ "./dist/dts/RouteGuard.d.ts"
73
+ ],
74
+ "RouteMatch": [
75
+ "./dist/dts/RouteMatch.d.ts"
51
76
  ]
52
77
  }
53
78
  }