@typed/router 0.0.7 → 0.0.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/Link.d.ts +1 -0
- package/dist/Link.d.ts.map +1 -1
- package/dist/Link.js +6 -3
- package/dist/Link.js.map +1 -1
- package/dist/router.d.ts +9 -2
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +21 -9
- package/dist/router.js.map +1 -1
- package/package.json +10 -9
- package/src/Link.ts +8 -3
- package/src/router.ts +29 -8
- package/tsconfig.build.tsbuildinfo +1 -1
package/dist/Link.d.ts
CHANGED
package/dist/Link.d.ts.map
CHANGED
|
@@ -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,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAsB,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../src/Link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAsB,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGnE,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,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAqBjC;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;CAC3B"}
|
package/dist/Link.js
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import * as Effect from '@effect/io/Effect';
|
|
2
2
|
import * as Fx from '@typed/fx';
|
|
3
3
|
import { EventHandler, html } from '@typed/html';
|
|
4
|
-
import {
|
|
4
|
+
import { pathJoin } from '@typed/path';
|
|
5
|
+
import { Router, getBasePath } from './router.js';
|
|
5
6
|
export function Link(props) {
|
|
6
7
|
return Fx.gen(function* ($) {
|
|
8
|
+
const useBase = props.useBase ?? true;
|
|
9
|
+
const href = useBase ? pathJoin(yield* $(getBasePath), props.href) : props.href;
|
|
7
10
|
const router = yield* $(Router.get);
|
|
8
11
|
const clickHandler = (event) => Effect.gen(function* ($) {
|
|
9
|
-
yield* $(router.currentPath.set(
|
|
12
|
+
yield* $(router.currentPath.set(href));
|
|
10
13
|
if (props.onClick) {
|
|
11
14
|
yield* $(props.onClick(event));
|
|
12
15
|
}
|
|
13
16
|
});
|
|
14
17
|
return html `<a
|
|
15
18
|
class=${props.className}
|
|
16
|
-
href
|
|
19
|
+
href=${href}
|
|
17
20
|
onclick=${EventHandler.preventDefault(clickHandler)}
|
|
18
21
|
>${props.label}</a
|
|
19
22
|
>`;
|
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;AAC3C,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,IAAI,EAAqB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"Link.js","sourceRoot":"","sources":["../src/Link.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,IAAI,EAAqB,MAAM,aAAa,CAAA;AACnE,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,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;QAC/E,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACnC,MAAM,YAAY,GAAG,CAAC,KAAwD,EAAE,EAAE,CAChF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;YAEtC,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,CAAA;cACD,KAAK,CAAC,SAAS;aAChB,IAAI;gBACD,YAAY,CAAC,cAAc,CAAC,YAAY,CAAC;SAChD,KAAK,CAAC,KAAK;MACd,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/router.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as Effect from '@effect/io/Effect';
|
|
2
2
|
import * as Layer from '@effect/io/Layer';
|
|
3
3
|
import * as Scope from '@effect/io/Scope';
|
|
4
|
+
import * as Option from '@fp-ts/data/Option';
|
|
4
5
|
import * as Context from '@typed/context';
|
|
5
6
|
import { Document, Location, History } from '@typed/dom';
|
|
6
7
|
import * as Fx from '@typed/fx';
|
|
@@ -40,8 +41,12 @@ export interface Router<out R = never, in out P extends string = string> {
|
|
|
40
41
|
* Provide all the resources needed for a Router
|
|
41
42
|
*/
|
|
42
43
|
readonly provideEnvironment: (environment: Context.Context<R>) => Router<never, P>;
|
|
44
|
+
/**
|
|
45
|
+
* The parent router if one exists
|
|
46
|
+
*/
|
|
47
|
+
readonly parent: Option.Option<Router<any, string>>;
|
|
43
48
|
}
|
|
44
|
-
export declare const Router: (<R = never, P extends string = string>(route: Route.Route<R, P>, currentPath: Fx.RefSubject<string
|
|
49
|
+
export declare const Router: (<R = never, P extends string = string>(route: Route.Route<R, P>, currentPath: Fx.RefSubject<string>, parent?: Option.Option<Router<any, string>>) => Router<R, P>) & Context.Tag<Router<never, string>>;
|
|
45
50
|
export declare const outlet: Fx.Fx<RenderContext | Router, never, html.Renderable>;
|
|
46
51
|
export declare const currentPath: Fx.Fx<Router, never, string>;
|
|
47
52
|
export declare function provideEnvironment<R>(environment: Context.Context<R>): <P extends string>(router: Router<R, P>) => Router<never, P>;
|
|
@@ -63,5 +68,7 @@ export declare const redirectTo: {
|
|
|
63
68
|
};
|
|
64
69
|
export declare const makeRouter: (currentPath?: Fx.RefSubject<string>) => Effect.Effect<Location | History | Window | Document | Scope.Scope, never, Router>;
|
|
65
70
|
export declare const live: (currentPath?: Fx.RefSubject<string>) => Layer.Layer<Location | History | Window | Document, never, Router<never, string>>;
|
|
66
|
-
export declare function
|
|
71
|
+
export declare function getCurrentPathFromLocation(location: Location | HTMLAnchorElement | URL): string;
|
|
72
|
+
export declare const getCurrentPath: Effect.Effect<Router<never, string>, never, string>;
|
|
73
|
+
export declare const getBasePath: Effect.Effect<Router<never, string>, never, string>;
|
|
67
74
|
//# sourceMappingURL=router.d.ts.map
|
package/dist/router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;AACzC,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
|
package/dist/router.js
CHANGED
|
@@ -6,8 +6,9 @@ import * as Context from '@typed/context';
|
|
|
6
6
|
import { Document, Location, History, addWindowListener } from '@typed/dom';
|
|
7
7
|
import * as Fx from '@typed/fx';
|
|
8
8
|
import { RenderContext } from '@typed/html';
|
|
9
|
+
import * as Path from '@typed/path';
|
|
9
10
|
import * as Route from '@typed/route';
|
|
10
|
-
export const Router = Object.assign(function makeRouter(route, currentPath) {
|
|
11
|
+
export const Router = Object.assign(function makeRouter(route, currentPath, parent = Option.none) {
|
|
11
12
|
const outlet = Fx.RefSubject.unsafeMake(() => null);
|
|
12
13
|
const createPath = (other, ...[params]) => Effect.gen(function* ($) {
|
|
13
14
|
const path = yield* $(currentPath.get);
|
|
@@ -26,8 +27,9 @@ export const Router = Object.assign(function makeRouter(route, currentPath) {
|
|
|
26
27
|
params: pipe(currentPath, Fx.switchMapEffect(route.match), Fx.compact, Fx.skipRepeats),
|
|
27
28
|
outlet,
|
|
28
29
|
createPath: createPath,
|
|
29
|
-
define: (other) => makeRouter(route.concat(other), currentPath),
|
|
30
|
+
define: (other) => makeRouter(route.concat(other), currentPath, Option.some(router)),
|
|
30
31
|
provideEnvironment: (env) => provideEnvironment(env)(router),
|
|
32
|
+
parent,
|
|
31
33
|
};
|
|
32
34
|
return router;
|
|
33
35
|
}, Context.Tag());
|
|
@@ -63,7 +65,7 @@ export const makeRouter = (currentPath) => Effect.gen(function* ($) {
|
|
|
63
65
|
const history = yield* $(History.get);
|
|
64
66
|
const location = yield* $(Location.get);
|
|
65
67
|
if (!currentPath) {
|
|
66
|
-
currentPath = Fx.RefSubject.unsafeMake(() =>
|
|
68
|
+
currentPath = Fx.RefSubject.unsafeMake(() => getCurrentPathFromLocation(location));
|
|
67
69
|
}
|
|
68
70
|
// Patch history events to emit an event when the path changes
|
|
69
71
|
const historyEvents = yield* $(patchHistory);
|
|
@@ -73,24 +75,34 @@ export const makeRouter = (currentPath) => Effect.gen(function* ($) {
|
|
|
73
75
|
// - history events
|
|
74
76
|
yield* $(pipe(Fx.mergeAll(addWindowListener('popstate'), addWindowListener('hashchange'), historyEvents),
|
|
75
77
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
76
|
-
Fx.switchMapEffect(() => currentPath.set(
|
|
78
|
+
Fx.switchMapEffect(() => currentPath.set(getCurrentPathFromLocation(location))), Fx.forkScoped));
|
|
77
79
|
// Listen to path changes and update the current history location, if necessary
|
|
78
80
|
yield* $(pipe(currentPath, Fx.skipRepeats, Fx.observe((path) => Effect.sync(() => {
|
|
79
|
-
if (path !==
|
|
81
|
+
if (path !== getCurrentPathFromLocation(location)) {
|
|
80
82
|
history.pushState({}, '', path);
|
|
81
83
|
}
|
|
82
84
|
})), Effect.forkScoped));
|
|
83
85
|
// Find the configured base path
|
|
84
86
|
const document = yield* $(Document.get);
|
|
85
87
|
const base = document.querySelector('base');
|
|
86
|
-
const baseHref = base ?
|
|
88
|
+
const baseHref = base ? getBasePathFromHref(base.href) : '/';
|
|
87
89
|
// Make our base router
|
|
88
90
|
return Router(Route.Route(baseHref), currentPath);
|
|
89
91
|
});
|
|
90
92
|
export const live = (currentPath) => Router.layerSoped(makeRouter(currentPath));
|
|
91
|
-
export function
|
|
93
|
+
export function getCurrentPathFromLocation(location) {
|
|
92
94
|
return location.pathname + location.search + location.hash;
|
|
93
95
|
}
|
|
96
|
+
export const getCurrentPath = Router.withEffect((r) => r.currentPath.get);
|
|
97
|
+
export const getBasePath = Router.with((r) => {
|
|
98
|
+
const routers = [r];
|
|
99
|
+
let current = r;
|
|
100
|
+
while (Option.isSome(current.parent)) {
|
|
101
|
+
current = current.parent.value;
|
|
102
|
+
routers.push(current);
|
|
103
|
+
}
|
|
104
|
+
return routers.reduceRight((acc, r) => Path.pathJoin(r.route.path, acc), '');
|
|
105
|
+
});
|
|
94
106
|
const patchHistory = Effect.gen(function* ($) {
|
|
95
107
|
const history = yield* $(History.get);
|
|
96
108
|
const historyEvents = Fx.Subject.unsafeMake();
|
|
@@ -135,10 +147,10 @@ function patchHistory_(history, sendEvent) {
|
|
|
135
147
|
history.forward = forward;
|
|
136
148
|
};
|
|
137
149
|
}
|
|
138
|
-
function
|
|
150
|
+
function getBasePathFromHref(href) {
|
|
139
151
|
try {
|
|
140
152
|
const url = new URL(href);
|
|
141
|
-
return
|
|
153
|
+
return getCurrentPathFromLocation(url);
|
|
142
154
|
}
|
|
143
155
|
catch {
|
|
144
156
|
return href;
|
package/dist/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAG3C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAA;AAC5C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC3E,OAAO,KAAK,EAAE,MAAM,WAAW,CAAA;AAE/B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@typed/router",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -23,15 +23,16 @@
|
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@effect/io": "~0.0.61",
|
|
25
25
|
"@fp-ts/data": "~0.0.36",
|
|
26
|
-
"@typed/context": "0.0.
|
|
27
|
-
"@typed/dom": "8.0.
|
|
28
|
-
"@typed/fx": "1.0.
|
|
29
|
-
"@typed/html": "3.0.
|
|
30
|
-
"@typed/path": "0.0.
|
|
31
|
-
"@typed/route": "0.0.
|
|
26
|
+
"@typed/context": "0.0.7",
|
|
27
|
+
"@typed/dom": "8.0.7",
|
|
28
|
+
"@typed/fx": "1.0.6",
|
|
29
|
+
"@typed/html": "3.0.7",
|
|
30
|
+
"@typed/path": "0.0.6",
|
|
31
|
+
"@typed/route": "0.0.6"
|
|
32
32
|
},
|
|
33
|
-
"gitHead": "
|
|
33
|
+
"gitHead": "4074c3ca01265f7b3bd008a8613b14d6cb72811e",
|
|
34
34
|
"publishConfig": {
|
|
35
35
|
"access": "public"
|
|
36
|
-
}
|
|
36
|
+
},
|
|
37
|
+
"sideEffects": false
|
|
37
38
|
}
|
package/src/Link.ts
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import * as Effect from '@effect/io/Effect'
|
|
2
2
|
import * as Fx from '@typed/fx'
|
|
3
3
|
import { EventHandler, html, Hole, Placeholder } from '@typed/html'
|
|
4
|
+
import { pathJoin } from '@typed/path'
|
|
4
5
|
|
|
5
|
-
import { Router } from './router.js'
|
|
6
|
+
import { Router, getBasePath } from './router.js'
|
|
6
7
|
|
|
7
8
|
export function Link<R = never, E = never, R2 = never>(
|
|
8
9
|
props: LinkProps<R, E, R2>,
|
|
9
10
|
): Fx.Fx<R | R2 | Router, E, Hole> {
|
|
10
11
|
return Fx.gen(function* ($) {
|
|
12
|
+
const useBase = props.useBase ?? true
|
|
13
|
+
const href = useBase ? pathJoin(yield* $(getBasePath), props.href) : props.href
|
|
11
14
|
const router = yield* $(Router.get)
|
|
12
15
|
const clickHandler = (event: MouseEvent & { currentTarget: HTMLAnchorElement }) =>
|
|
13
16
|
Effect.gen(function* ($) {
|
|
14
|
-
yield* $(router.currentPath.set(
|
|
17
|
+
yield* $(router.currentPath.set(href))
|
|
15
18
|
|
|
16
19
|
if (props.onClick) {
|
|
17
20
|
yield* $(props.onClick(event))
|
|
@@ -20,7 +23,7 @@ export function Link<R = never, E = never, R2 = never>(
|
|
|
20
23
|
|
|
21
24
|
return html`<a
|
|
22
25
|
class=${props.className}
|
|
23
|
-
href
|
|
26
|
+
href=${href}
|
|
24
27
|
onclick=${EventHandler.preventDefault(clickHandler)}
|
|
25
28
|
>${props.label}</a
|
|
26
29
|
>`
|
|
@@ -34,4 +37,6 @@ export interface LinkProps<R, E, R2> {
|
|
|
34
37
|
readonly onClick?: (
|
|
35
38
|
event: MouseEvent & { currentTarget: HTMLAnchorElement },
|
|
36
39
|
) => Effect.Effect<R2, never, unknown>
|
|
40
|
+
|
|
41
|
+
readonly useBase?: boolean
|
|
37
42
|
}
|
package/src/router.ts
CHANGED
|
@@ -58,11 +58,17 @@ export interface Router<out R = never, in out P extends string = string> {
|
|
|
58
58
|
* Provide all the resources needed for a Router
|
|
59
59
|
*/
|
|
60
60
|
readonly provideEnvironment: (environment: Context.Context<R>) => Router<never, P>
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The parent router if one exists
|
|
64
|
+
*/
|
|
65
|
+
readonly parent: Option.Option<Router<any, string>>
|
|
61
66
|
}
|
|
62
67
|
|
|
63
68
|
export const Router = Object.assign(function makeRouter<R = never, P extends string = string>(
|
|
64
69
|
route: Route.Route<R, P>,
|
|
65
70
|
currentPath: Fx.RefSubject<string>,
|
|
71
|
+
parent: Option.Option<Router<any, string>> = Option.none,
|
|
66
72
|
): Router<R, P> {
|
|
67
73
|
const outlet = Fx.RefSubject.unsafeMake((): html.Renderable => null)
|
|
68
74
|
|
|
@@ -101,8 +107,9 @@ export const Router = Object.assign(function makeRouter<R = never, P extends str
|
|
|
101
107
|
outlet,
|
|
102
108
|
createPath: createPath as Router<R, P>['createPath'],
|
|
103
109
|
define: <R2, Path2 extends string>(other: Route.Route<R2, Path2>) =>
|
|
104
|
-
makeRouter(route.concat(other), currentPath),
|
|
110
|
+
makeRouter(route.concat(other), currentPath, Option.some(router as any)),
|
|
105
111
|
provideEnvironment: (env) => provideEnvironment(env)(router),
|
|
112
|
+
parent,
|
|
106
113
|
}
|
|
107
114
|
|
|
108
115
|
return router
|
|
@@ -189,7 +196,7 @@ export const makeRouter = (
|
|
|
189
196
|
const location = yield* $(Location.get)
|
|
190
197
|
|
|
191
198
|
if (!currentPath) {
|
|
192
|
-
currentPath = Fx.RefSubject.unsafeMake(() =>
|
|
199
|
+
currentPath = Fx.RefSubject.unsafeMake(() => getCurrentPathFromLocation(location))
|
|
193
200
|
}
|
|
194
201
|
|
|
195
202
|
// Patch history events to emit an event when the path changes
|
|
@@ -203,7 +210,7 @@ export const makeRouter = (
|
|
|
203
210
|
pipe(
|
|
204
211
|
Fx.mergeAll(addWindowListener('popstate'), addWindowListener('hashchange'), historyEvents),
|
|
205
212
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
206
|
-
Fx.switchMapEffect(() => currentPath!.set(
|
|
213
|
+
Fx.switchMapEffect(() => currentPath!.set(getCurrentPathFromLocation(location))),
|
|
207
214
|
Fx.forkScoped,
|
|
208
215
|
),
|
|
209
216
|
)
|
|
@@ -215,7 +222,7 @@ export const makeRouter = (
|
|
|
215
222
|
Fx.skipRepeats,
|
|
216
223
|
Fx.observe((path) =>
|
|
217
224
|
Effect.sync(() => {
|
|
218
|
-
if (path !==
|
|
225
|
+
if (path !== getCurrentPathFromLocation(location)) {
|
|
219
226
|
history.pushState({}, '', path)
|
|
220
227
|
}
|
|
221
228
|
}),
|
|
@@ -227,7 +234,7 @@ export const makeRouter = (
|
|
|
227
234
|
// Find the configured base path
|
|
228
235
|
const document = yield* $(Document.get)
|
|
229
236
|
const base = document.querySelector('base')
|
|
230
|
-
const baseHref = base ?
|
|
237
|
+
const baseHref = base ? getBasePathFromHref(base.href) : '/'
|
|
231
238
|
|
|
232
239
|
// Make our base router
|
|
233
240
|
return Router(Route.Route(baseHref), currentPath) as Router
|
|
@@ -238,10 +245,24 @@ export const live = (
|
|
|
238
245
|
): Layer.Layer<Location | History | Window | Document, never, Router<never, string>> =>
|
|
239
246
|
Router.layerSoped(makeRouter(currentPath))
|
|
240
247
|
|
|
241
|
-
export function
|
|
248
|
+
export function getCurrentPathFromLocation(location: Location | HTMLAnchorElement | URL) {
|
|
242
249
|
return location.pathname + location.search + location.hash
|
|
243
250
|
}
|
|
244
251
|
|
|
252
|
+
export const getCurrentPath = Router.withEffect((r) => r.currentPath.get)
|
|
253
|
+
|
|
254
|
+
export const getBasePath = Router.with((r) => {
|
|
255
|
+
const routers: Router<any, any>[] = [r]
|
|
256
|
+
let current: Router<any, any> = r
|
|
257
|
+
|
|
258
|
+
while (Option.isSome(current.parent)) {
|
|
259
|
+
current = current.parent.value
|
|
260
|
+
routers.push(current)
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return routers.reduceRight((acc, r) => Path.pathJoin(r.route.path, acc), '')
|
|
264
|
+
})
|
|
265
|
+
|
|
245
266
|
const patchHistory = Effect.gen(function* ($) {
|
|
246
267
|
const history = yield* $(History.get)
|
|
247
268
|
const historyEvents = Fx.Subject.unsafeMake<never, void>()
|
|
@@ -296,11 +317,11 @@ function patchHistory_(history: History, sendEvent: () => void) {
|
|
|
296
317
|
}
|
|
297
318
|
}
|
|
298
319
|
|
|
299
|
-
function
|
|
320
|
+
function getBasePathFromHref(href: string) {
|
|
300
321
|
try {
|
|
301
322
|
const url = new URL(href)
|
|
302
323
|
|
|
303
|
-
return
|
|
324
|
+
return getCurrentPathFromLocation(url)
|
|
304
325
|
} catch {
|
|
305
326
|
return href
|
|
306
327
|
}
|