kiru 0.54.0-preview.1 → 0.54.1
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/components/derive.d.ts +1 -1
- package/dist/components/derive.d.ts.map +1 -1
- package/dist/components/derive.js +2 -3
- package/dist/components/derive.js.map +1 -1
- package/dist/components/memo.d.ts +1 -3
- package/dist/components/memo.d.ts.map +1 -1
- package/dist/components/memo.js +2 -2
- package/dist/components/memo.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +1 -23
- package/dist/context.js.map +1 -1
- package/dist/dom.d.ts.map +1 -1
- package/dist/dom.js +111 -78
- package/dist/dom.js.map +1 -1
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +2 -4
- package/dist/error.js.map +1 -1
- package/dist/form/index.d.ts.map +1 -1
- package/dist/form/index.js +6 -10
- package/dist/form/index.js.map +1 -1
- package/dist/globals.d.ts +1 -1
- package/dist/globals.d.ts.map +1 -1
- package/dist/globals.js.map +1 -1
- package/dist/hmr.d.ts +1 -0
- package/dist/hmr.d.ts.map +1 -1
- package/dist/hmr.js +11 -3
- package/dist/hmr.js.map +1 -1
- package/dist/hooks/useEffectEvent.d.ts.map +1 -1
- package/dist/hooks/useEffectEvent.js.map +1 -1
- package/dist/hooks/usePromise.d.ts +1 -2
- package/dist/hooks/usePromise.d.ts.map +1 -1
- package/dist/hooks/usePromise.js +62 -31
- package/dist/hooks/usePromise.js.map +1 -1
- package/dist/hooks/utils.d.ts.map +1 -1
- package/dist/hooks/utils.js +10 -10
- package/dist/hooks/utils.js.map +1 -1
- package/dist/hydration.d.ts +6 -13
- package/dist/hydration.d.ts.map +1 -1
- package/dist/hydration.js +20 -50
- package/dist/hydration.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/reconciler.d.ts.map +1 -1
- package/dist/reconciler.js +3 -6
- package/dist/reconciler.js.map +1 -1
- package/dist/recursiveRender.d.ts.map +1 -1
- package/dist/recursiveRender.js +9 -8
- package/dist/recursiveRender.js.map +1 -1
- package/dist/renderToString.d.ts.map +1 -1
- package/dist/renderToString.js.map +1 -1
- package/dist/router/client/index.d.ts +2 -4
- package/dist/router/client/index.d.ts.map +1 -1
- package/dist/router/client/index.js +13 -59
- package/dist/router/client/index.js.map +1 -1
- package/dist/router/context.d.ts +5 -2
- package/dist/router/context.d.ts.map +1 -1
- package/dist/router/context.js +1 -5
- package/dist/router/context.js.map +1 -1
- package/dist/router/fileRouter.d.ts.map +1 -1
- package/dist/router/fileRouter.js +2 -4
- package/dist/router/fileRouter.js.map +1 -1
- package/dist/router/fileRouterController.d.ts +2 -2
- package/dist/router/fileRouterController.d.ts.map +1 -1
- package/dist/router/fileRouterController.js +135 -214
- package/dist/router/fileRouterController.js.map +1 -1
- package/dist/router/globals.d.ts +0 -3
- package/dist/router/globals.d.ts.map +1 -1
- package/dist/router/globals.js +0 -3
- package/dist/router/globals.js.map +1 -1
- package/dist/router/head.d.ts.map +1 -1
- package/dist/router/head.js +7 -5
- package/dist/router/head.js.map +1 -1
- package/dist/router/index.d.ts +1 -2
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +1 -2
- package/dist/router/index.js.map +1 -1
- package/dist/router/link.js +3 -3
- package/dist/router/link.js.map +1 -1
- package/dist/router/{ssg → server}/index.d.ts +4 -4
- package/dist/router/server/index.d.ts.map +1 -0
- package/dist/router/{ssg → server}/index.js +7 -9
- package/dist/router/server/index.js.map +1 -0
- package/dist/router/types.d.ts +16 -42
- package/dist/router/types.d.ts.map +1 -1
- package/dist/router/types.internal.d.ts +0 -4
- package/dist/router/types.internal.d.ts.map +1 -1
- package/dist/router/utils/index.d.ts +3 -8
- package/dist/router/utils/index.d.ts.map +1 -1
- package/dist/router/utils/index.js +8 -40
- package/dist/router/utils/index.js.map +1 -1
- package/dist/scheduler.d.ts +3 -14
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +64 -56
- package/dist/scheduler.js.map +1 -1
- package/dist/signals/base.d.ts +0 -2
- package/dist/signals/base.d.ts.map +1 -1
- package/dist/signals/base.js +0 -6
- package/dist/signals/base.js.map +1 -1
- package/dist/signals/computed.d.ts +3 -0
- package/dist/signals/computed.d.ts.map +1 -1
- package/dist/signals/computed.js +29 -20
- package/dist/signals/computed.js.map +1 -1
- package/dist/signals/for.d.ts +3 -3
- package/dist/signals/for.d.ts.map +1 -1
- package/dist/signals/for.js +2 -1
- package/dist/signals/for.js.map +1 -1
- package/dist/signals/utils.d.ts.map +1 -1
- package/dist/signals/utils.js +2 -1
- package/dist/signals/utils.js.map +1 -1
- package/dist/signals/watch.d.ts.map +1 -1
- package/dist/signals/watch.js +18 -22
- package/dist/signals/watch.js.map +1 -1
- package/dist/ssr/client.d.ts +1 -1
- package/dist/ssr/client.d.ts.map +1 -1
- package/dist/ssr/client.js +0 -2
- package/dist/ssr/client.js.map +1 -1
- package/dist/ssr/server.d.ts +3 -9
- package/dist/ssr/server.d.ts.map +1 -1
- package/dist/ssr/server.js +30 -37
- package/dist/ssr/server.js.map +1 -1
- package/dist/types.d.ts +0 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.dom.d.ts +3 -3
- package/dist/types.dom.d.ts.map +1 -1
- package/dist/utils/format.d.ts +1 -2
- package/dist/utils/format.d.ts.map +1 -1
- package/dist/utils/format.js +1 -4
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/promise.d.ts +0 -2
- package/dist/utils/promise.d.ts.map +1 -1
- package/dist/utils/promise.js +1 -45
- package/dist/utils/promise.js.map +1 -1
- package/dist/utils/runtime.d.ts +3 -2
- package/dist/utils/runtime.d.ts.map +1 -1
- package/dist/utils/runtime.js +5 -2
- package/dist/utils/runtime.js.map +1 -1
- package/dist/utils/vdom.d.ts.map +1 -1
- package/dist/utils/vdom.js +2 -2
- package/dist/utils/vdom.js.map +1 -1
- package/package.json +4 -8
- package/src/components/derive.ts +3 -5
- package/src/components/memo.ts +3 -11
- package/src/context.ts +1 -24
- package/src/dom.ts +146 -101
- package/src/error.ts +2 -4
- package/src/form/index.ts +6 -9
- package/src/globals.ts +1 -1
- package/src/hmr.ts +14 -5
- package/src/hooks/useEffectEvent.ts +0 -1
- package/src/hooks/usePromise.ts +77 -58
- package/src/hooks/utils.ts +12 -12
- package/src/hydration.ts +21 -57
- package/src/index.ts +1 -1
- package/src/reconciler.ts +2 -6
- package/src/recursiveRender.ts +10 -9
- package/src/renderToString.ts +0 -1
- package/src/router/client/index.ts +16 -114
- package/src/router/context.ts +6 -7
- package/src/router/fileRouter.ts +2 -6
- package/src/router/fileRouterController.ts +161 -324
- package/src/router/globals.ts +0 -4
- package/src/router/head.ts +7 -5
- package/src/router/index.ts +1 -12
- package/src/router/link.ts +3 -3
- package/src/router/{ssg → server}/index.ts +13 -18
- package/src/router/types.internal.ts +0 -5
- package/src/router/types.ts +16 -53
- package/src/router/utils/index.ts +16 -79
- package/src/scheduler.ts +85 -89
- package/src/signals/base.ts +0 -8
- package/src/signals/computed.ts +30 -18
- package/src/signals/for.ts +15 -10
- package/src/signals/utils.ts +2 -1
- package/src/signals/watch.ts +27 -22
- package/src/ssr/client.ts +1 -4
- package/src/ssr/server.ts +34 -59
- package/src/types.dom.ts +4 -5
- package/src/types.ts +0 -10
- package/src/utils/format.ts +0 -5
- package/src/utils/index.ts +1 -1
- package/src/utils/promise.ts +1 -70
- package/src/utils/runtime.ts +6 -2
- package/src/utils/vdom.ts +2 -7
- package/dist/router/constants.d.ts +0 -2
- package/dist/router/constants.d.ts.map +0 -1
- package/dist/router/constants.js +0 -2
- package/dist/router/constants.js.map +0 -1
- package/dist/router/guard.d.ts +0 -17
- package/dist/router/guard.d.ts.map +0 -1
- package/dist/router/guard.js +0 -45
- package/dist/router/guard.js.map +0 -1
- package/dist/router/ssg/index.d.ts.map +0 -1
- package/dist/router/ssg/index.js.map +0 -1
- package/dist/router/ssr/index.d.ts +0 -20
- package/dist/router/ssr/index.d.ts.map +0 -1
- package/dist/router/ssr/index.js +0 -163
- package/dist/router/ssr/index.js.map +0 -1
- package/src/router/constants.ts +0 -1
- package/src/router/guard.ts +0 -72
- package/src/router/ssr/index.ts +0 -252
package/src/router/globals.ts
CHANGED
package/src/router/head.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Signal } from "../signals/base.js"
|
|
2
|
-
import { isValidTextChild, isVNode
|
|
2
|
+
import { isValidTextChild, isVNode } from "../utils/index.js"
|
|
3
3
|
import { createElement } from "../element.js"
|
|
4
4
|
import { __DEV__ } from "../env.js"
|
|
5
5
|
import { KiruError } from "../error.js"
|
|
@@ -12,7 +12,7 @@ const validHeadChildren = ["title", "base", "link", "meta", "style", "script"]
|
|
|
12
12
|
function HeadContent({ children }: { children: JSX.Children }): JSX.Element {
|
|
13
13
|
if (__DEV__) {
|
|
14
14
|
const n = node.current!
|
|
15
|
-
const asArray =
|
|
15
|
+
const asArray = Array.isArray(children) ? children : [children]
|
|
16
16
|
const invalidNodes = asArray.filter(
|
|
17
17
|
(c) =>
|
|
18
18
|
!isVNode(c) ||
|
|
@@ -29,14 +29,16 @@ function HeadContent({ children }: { children: JSX.Children }): JSX.Element {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
if ("window" in globalThis) {
|
|
32
|
-
const
|
|
33
|
-
const titleNode =
|
|
32
|
+
const asArray = Array.isArray(children) ? children : [children]
|
|
33
|
+
const titleNode = asArray.find(
|
|
34
34
|
(c) => isVNode(c) && c.type === "title"
|
|
35
35
|
) as Kiru.VNode
|
|
36
36
|
|
|
37
37
|
if (titleNode) {
|
|
38
38
|
const props = titleNode.props
|
|
39
|
-
const titleChildren =
|
|
39
|
+
const titleChildren = Array.isArray(props.children)
|
|
40
|
+
? props.children
|
|
41
|
+
: [props.children]
|
|
40
42
|
|
|
41
43
|
document.title = titleChildren
|
|
42
44
|
.map((c) => (Signal.isSignal(c) ? c.value : c))
|
package/src/router/index.ts
CHANGED
|
@@ -1,20 +1,9 @@
|
|
|
1
1
|
import { createElement } from "../element.js"
|
|
2
2
|
import { __DEV__ } from "../env.js"
|
|
3
3
|
|
|
4
|
-
export {
|
|
5
|
-
useRequestContext,
|
|
6
|
-
useFileRouter,
|
|
7
|
-
type FileRouterContextType,
|
|
8
|
-
} from "./context.js"
|
|
4
|
+
export { useFileRouter, type FileRouterContextType } from "./context.js"
|
|
9
5
|
export * from "./errors.js"
|
|
10
6
|
export { FileRouter, type FileRouterProps } from "./fileRouter.js"
|
|
11
|
-
export {
|
|
12
|
-
createNavGuard,
|
|
13
|
-
type GuardBeforeEach,
|
|
14
|
-
type GuardAfterEach,
|
|
15
|
-
type NavGuard,
|
|
16
|
-
type NavGuardBuilder,
|
|
17
|
-
} from "./guard.js"
|
|
18
7
|
export * from "./link.js"
|
|
19
8
|
export * from "./pageConfig.js"
|
|
20
9
|
export type * from "./types.js"
|
package/src/router/link.ts
CHANGED
|
@@ -37,7 +37,7 @@ export const Link: Kiru.FC<LinkProps> = ({
|
|
|
37
37
|
prefetchJs,
|
|
38
38
|
...props
|
|
39
39
|
}) => {
|
|
40
|
-
const { navigate, prefetchRouteModules } = useFileRouter()
|
|
40
|
+
const { navigate, prefetchRouteModules, baseUrl } = useFileRouter()
|
|
41
41
|
|
|
42
42
|
const handleMouseOver = useCallback(
|
|
43
43
|
(e: Kiru.MouseEvent<HTMLAnchorElement>) => {
|
|
@@ -63,13 +63,13 @@ export const Link: Kiru.FC<LinkProps> = ({
|
|
|
63
63
|
onclick?.(e)
|
|
64
64
|
if (e.defaultPrevented) return
|
|
65
65
|
e.preventDefault()
|
|
66
|
-
navigate(to, { replace, transition })
|
|
66
|
+
navigate(baseUrl + to, { replace, transition })
|
|
67
67
|
},
|
|
68
68
|
[onclick, navigate, to, replace, transition]
|
|
69
69
|
)
|
|
70
70
|
|
|
71
71
|
return createElement("a", {
|
|
72
|
-
href: to,
|
|
72
|
+
href: baseUrl + to,
|
|
73
73
|
onclick: handleClick,
|
|
74
74
|
onmouseover: handleMouseOver,
|
|
75
75
|
onfocus: handleFocus,
|
|
@@ -1,29 +1,26 @@
|
|
|
1
1
|
import { createElement, Fragment } from "../../element.js"
|
|
2
|
+
|
|
2
3
|
import {
|
|
3
|
-
|
|
4
|
+
matchLayouts,
|
|
4
5
|
matchRoute,
|
|
5
6
|
match404Route,
|
|
6
7
|
parseQuery,
|
|
7
8
|
wrapWithLayouts,
|
|
8
9
|
} from "../utils/index.js"
|
|
9
10
|
import { RouterContext } from "../context.js"
|
|
11
|
+
import type { PageConfig, PageProps, RouterState } from "../types.js"
|
|
12
|
+
import { FormattedViteImportMap, PageModule } from "../types.internal.js"
|
|
10
13
|
import { __DEV__ } from "../../env.js"
|
|
11
14
|
import { FileRouterDataLoadError } from "../errors.js"
|
|
12
15
|
import { renderToString } from "../../renderToString.js"
|
|
13
|
-
import type { PageConfig, PageProps, RouterState } from "../types.js"
|
|
14
|
-
import type {
|
|
15
|
-
FormattedViteImportMap,
|
|
16
|
-
GuardModule,
|
|
17
|
-
PageModule,
|
|
18
|
-
} from "../types.internal.js"
|
|
19
16
|
|
|
20
17
|
export interface RenderContext {
|
|
21
|
-
|
|
18
|
+
baseUrl: string
|
|
19
|
+
pages: FormattedViteImportMap
|
|
22
20
|
layouts: FormattedViteImportMap
|
|
23
|
-
guards: FormattedViteImportMap<GuardModule>
|
|
24
21
|
Document: Kiru.FC
|
|
25
22
|
registerModule: (moduleId: string) => void
|
|
26
|
-
|
|
23
|
+
registerPreloadedPageProps: (props: Record<string, unknown>) => void
|
|
27
24
|
}
|
|
28
25
|
|
|
29
26
|
export interface RenderResult {
|
|
@@ -68,7 +65,7 @@ export async function render(
|
|
|
68
65
|
|
|
69
66
|
const { pageEntry, routeSegments, params } = routeMatch
|
|
70
67
|
const is404Route = routeMatch.routeSegments.includes("404")
|
|
71
|
-
const layoutEntries =
|
|
68
|
+
const layoutEntries = matchLayouts(ctx.layouts, routeSegments)
|
|
72
69
|
|
|
73
70
|
;[pageEntry, ...layoutEntries].forEach((e) => {
|
|
74
71
|
ctx.registerModule(e.filePath)
|
|
@@ -86,7 +83,7 @@ export async function render(
|
|
|
86
83
|
const abortController = new AbortController()
|
|
87
84
|
|
|
88
85
|
if (config.loader) {
|
|
89
|
-
if (
|
|
86
|
+
if (config.loader.mode !== "static" || __DEV__) {
|
|
90
87
|
props = { loading: true, data: null, error: null }
|
|
91
88
|
} else {
|
|
92
89
|
const routerState: RouterState = {
|
|
@@ -103,10 +100,7 @@ export async function render(
|
|
|
103
100
|
}, 10000)
|
|
104
101
|
|
|
105
102
|
try {
|
|
106
|
-
const data = await config.loader.load(
|
|
107
|
-
...routerState,
|
|
108
|
-
context: {},
|
|
109
|
-
})
|
|
103
|
+
const data = await config.loader.load(routerState)
|
|
110
104
|
props = {
|
|
111
105
|
data,
|
|
112
106
|
error: null,
|
|
@@ -120,7 +114,7 @@ export async function render(
|
|
|
120
114
|
}
|
|
121
115
|
} finally {
|
|
122
116
|
clearTimeout(timeout)
|
|
123
|
-
ctx.
|
|
117
|
+
ctx.registerPreloadedPageProps({ data: props.data, error: props.error })
|
|
124
118
|
}
|
|
125
119
|
}
|
|
126
120
|
}
|
|
@@ -147,6 +141,7 @@ export async function render(
|
|
|
147
141
|
const app = createElement(RouterContext.Provider, {
|
|
148
142
|
children: Fragment({ children }),
|
|
149
143
|
value: {
|
|
144
|
+
baseUrl: ctx.baseUrl,
|
|
150
145
|
state: {
|
|
151
146
|
params,
|
|
152
147
|
query,
|
|
@@ -186,7 +181,7 @@ export async function render(
|
|
|
186
181
|
// console.log("immediate", immediate)
|
|
187
182
|
|
|
188
183
|
return {
|
|
189
|
-
status: is404Route ? 404 : result?.status ?? 200,
|
|
184
|
+
status: is404Route ? 404 : (result?.status ?? 200),
|
|
190
185
|
body: `<!doctype html>${prePageOutlet}<body>${pageOutletContent}</body>${postPageOutlet}`,
|
|
191
186
|
}
|
|
192
187
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { FileRouterContextType } from "./context"
|
|
2
2
|
import type { PageConfig } from "./types"
|
|
3
|
-
import type { NavGuardBuilder } from "./guard"
|
|
4
3
|
|
|
5
4
|
export interface CurrentPage {
|
|
6
5
|
component: Kiru.FC<any>
|
|
@@ -21,10 +20,6 @@ export interface PageModule {
|
|
|
21
20
|
>
|
|
22
21
|
}
|
|
23
22
|
|
|
24
|
-
export interface GuardModule {
|
|
25
|
-
guard: NavGuardBuilder
|
|
26
|
-
}
|
|
27
|
-
|
|
28
23
|
export interface ViteImportMap {
|
|
29
24
|
[fp: string]: () => Promise<DefaultComponentModule>
|
|
30
25
|
}
|
package/src/router/types.ts
CHANGED
|
@@ -3,17 +3,14 @@ import type { FileRouterDataLoadError } from "./errors"
|
|
|
3
3
|
import type {
|
|
4
4
|
DefaultComponentModule,
|
|
5
5
|
FormattedViteImportMap,
|
|
6
|
-
GuardModule,
|
|
7
6
|
PageModule,
|
|
8
7
|
} from "./types.internal"
|
|
9
8
|
|
|
10
9
|
export interface FileRouterPreloadConfig {
|
|
11
|
-
pages: FormattedViteImportMap
|
|
10
|
+
pages: FormattedViteImportMap
|
|
12
11
|
layouts: FormattedViteImportMap
|
|
13
|
-
guards?: FormattedViteImportMap<GuardModule>
|
|
14
12
|
page: PageModule
|
|
15
13
|
pageProps: Record<string, unknown>
|
|
16
|
-
pagePropsPromise?: Promise<AsyncTaskState<unknown, FileRouterDataLoadError>>
|
|
17
14
|
pageLayouts: DefaultComponentModule[]
|
|
18
15
|
params: RouteParams
|
|
19
16
|
query: RouteQuery
|
|
@@ -43,14 +40,6 @@ export interface FileRouterConfig {
|
|
|
43
40
|
* ```
|
|
44
41
|
*/
|
|
45
42
|
layouts: Record<string, unknown>
|
|
46
|
-
/**
|
|
47
|
-
* The import map to use for loading nav guards
|
|
48
|
-
* @example
|
|
49
|
-
* ```tsx
|
|
50
|
-
* <FileRouter config={{ guards: import.meta.glob("/∗∗/guard.{ts,js}"), ... }} />
|
|
51
|
-
* ```
|
|
52
|
-
*/
|
|
53
|
-
guards?: Record<string, unknown>
|
|
54
43
|
|
|
55
44
|
/**
|
|
56
45
|
* The base url to use as a prefix for route matching
|
|
@@ -109,40 +98,28 @@ export interface RouterState {
|
|
|
109
98
|
signal: AbortSignal
|
|
110
99
|
}
|
|
111
100
|
|
|
101
|
+
type PageDataLoaderContext = RouterState & {}
|
|
102
|
+
|
|
112
103
|
export interface PageDataLoaderCacheConfig {
|
|
113
104
|
type: "memory" | "localStorage" | "sessionStorage"
|
|
114
105
|
ttl: number
|
|
115
106
|
}
|
|
116
107
|
|
|
117
|
-
interface LoaderContext extends RouterState {
|
|
118
|
-
/**
|
|
119
|
-
* The request context - in SSR, this is the data from the server
|
|
120
|
-
* that's passed to the `renderPage` function
|
|
121
|
-
* @example
|
|
122
|
-
* ```ts
|
|
123
|
-
* // server.ts
|
|
124
|
-
* renderPage({ url, context: { test: 123 } })
|
|
125
|
-
*
|
|
126
|
-
* // page.tsx
|
|
127
|
-
* loader: {
|
|
128
|
-
* load: ({ context }) => context.test
|
|
129
|
-
* }
|
|
130
|
-
* ```
|
|
131
|
-
*/
|
|
132
|
-
context: Kiru.RequestContext
|
|
133
|
-
}
|
|
134
|
-
|
|
135
108
|
export type PageDataLoaderConfig<T = unknown> = {
|
|
136
109
|
/**
|
|
137
110
|
* The function to load the page data
|
|
138
111
|
*/
|
|
139
|
-
load: (context:
|
|
112
|
+
load: (context: PageDataLoaderContext) => Promise<T>
|
|
140
113
|
} & (
|
|
141
114
|
| {
|
|
142
115
|
/**
|
|
143
|
-
*
|
|
116
|
+
* The mode to use for the page data loader
|
|
117
|
+
* @default "client"
|
|
118
|
+
* @description
|
|
119
|
+
* - **static**: The page data is loaded at build time and never updated
|
|
120
|
+
* - **client**: The page data is loaded upon navigation and updated on subsequent navigations
|
|
144
121
|
*/
|
|
145
|
-
|
|
122
|
+
mode?: "client"
|
|
146
123
|
/**
|
|
147
124
|
* Enable transitions when swapping between "load", "error" and "data" states
|
|
148
125
|
*/
|
|
@@ -162,28 +139,16 @@ export type PageDataLoaderConfig<T = unknown> = {
|
|
|
162
139
|
}
|
|
163
140
|
| {
|
|
164
141
|
/**
|
|
165
|
-
*
|
|
142
|
+
* The mode to use for the page data loader
|
|
143
|
+
* @default "client"
|
|
144
|
+
* @description
|
|
145
|
+
* - **static**: The page data is loaded at build time and never updated
|
|
146
|
+
* - **client**: The page data is loaded upon navigation and updated on subsequent navigations
|
|
166
147
|
*/
|
|
167
|
-
|
|
148
|
+
mode: "static"
|
|
168
149
|
}
|
|
169
150
|
)
|
|
170
151
|
|
|
171
|
-
export type NavigationHook<T> = (
|
|
172
|
-
context: Kiru.RequestContext,
|
|
173
|
-
to: string,
|
|
174
|
-
from: string
|
|
175
|
-
) => T
|
|
176
|
-
|
|
177
|
-
export type OnBeforeEnterHook = NavigationHook<
|
|
178
|
-
string | void | Promise<string | void>
|
|
179
|
-
>
|
|
180
|
-
export type OnBeforeLeaveHook = NavigationHook<false | void>
|
|
181
|
-
|
|
182
|
-
interface PageContextHooks {
|
|
183
|
-
onBeforeEnter?: OnBeforeEnterHook | OnBeforeEnterHook[]
|
|
184
|
-
onBeforeLeave?: OnBeforeLeaveHook | OnBeforeLeaveHook[]
|
|
185
|
-
}
|
|
186
|
-
|
|
187
152
|
export interface PageConfig<T = unknown> {
|
|
188
153
|
/**
|
|
189
154
|
* The loader configuration for this page
|
|
@@ -194,8 +159,6 @@ export interface PageConfig<T = unknown> {
|
|
|
194
159
|
* returned, a page will be generated
|
|
195
160
|
*/
|
|
196
161
|
generateStaticParams?: () => RouteParams[] | Promise<RouteParams[]>
|
|
197
|
-
|
|
198
|
-
hooks?: PageContextHooks
|
|
199
162
|
}
|
|
200
163
|
|
|
201
164
|
export type PageProps<T extends PageConfig<any>> = T extends PageConfig<infer U>
|
|
@@ -1,27 +1,19 @@
|
|
|
1
1
|
import { createElement } from "../../element.js"
|
|
2
2
|
import { __DEV__ } from "../../env.js"
|
|
3
|
-
import { resolveNavguard } from "../guard.js"
|
|
4
3
|
import type {
|
|
5
|
-
DefaultComponentModule,
|
|
6
4
|
FormattedViteImportMap,
|
|
7
|
-
GuardModule,
|
|
8
5
|
RouteMatch,
|
|
9
6
|
ViteImportMap,
|
|
10
7
|
} from "../types.internal"
|
|
11
|
-
import { OnBeforeEnterHook, OnBeforeLeaveHook } from "../types.js"
|
|
12
8
|
|
|
13
9
|
export {
|
|
14
10
|
formatViteImportMap,
|
|
15
11
|
matchRoute,
|
|
16
12
|
match404Route,
|
|
17
|
-
|
|
13
|
+
matchLayouts,
|
|
18
14
|
normalizePrefixPath,
|
|
19
15
|
parseQuery,
|
|
20
16
|
wrapWithLayouts,
|
|
21
|
-
runBeforeLeaveHooks,
|
|
22
|
-
runBeforeEnterHooks,
|
|
23
|
-
runBeforeEachGuards,
|
|
24
|
-
runAfterEachGuards,
|
|
25
17
|
}
|
|
26
18
|
|
|
27
19
|
function formatViteImportMap(
|
|
@@ -41,7 +33,7 @@ function formatViteImportMap(
|
|
|
41
33
|
}
|
|
42
34
|
|
|
43
35
|
let specificity = 0
|
|
44
|
-
let k = key.slice(dirIndex + dir.length)
|
|
36
|
+
let k = baseUrl + key.slice(dirIndex + dir.length)
|
|
45
37
|
while (k.startsWith("/")) {
|
|
46
38
|
k = k.slice(1)
|
|
47
39
|
}
|
|
@@ -95,7 +87,7 @@ function formatViteImportMap(
|
|
|
95
87
|
|
|
96
88
|
return {
|
|
97
89
|
...acc,
|
|
98
|
-
[
|
|
90
|
+
[segments.join("/")]: value,
|
|
99
91
|
}
|
|
100
92
|
}, {})
|
|
101
93
|
}
|
|
@@ -185,20 +177,23 @@ function match404Route(
|
|
|
185
177
|
return null
|
|
186
178
|
}
|
|
187
179
|
|
|
188
|
-
function
|
|
189
|
-
|
|
180
|
+
function matchLayouts(
|
|
181
|
+
layouts: FormattedViteImportMap,
|
|
190
182
|
routeSegments: string[]
|
|
191
183
|
) {
|
|
192
|
-
return ["/", ...routeSegments].reduce(
|
|
193
|
-
|
|
194
|
-
|
|
184
|
+
return ["/", ...routeSegments].reduce(
|
|
185
|
+
(acc, _, i) => {
|
|
186
|
+
const layoutPath = routeSegments.slice(0, i).join("/")
|
|
187
|
+
const layout = layouts[layoutPath]
|
|
195
188
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
189
|
+
if (!layout) {
|
|
190
|
+
return acc
|
|
191
|
+
}
|
|
199
192
|
|
|
200
|
-
|
|
201
|
-
|
|
193
|
+
return [...acc, layout]
|
|
194
|
+
},
|
|
195
|
+
[] as FormattedViteImportMap[string][]
|
|
196
|
+
)
|
|
202
197
|
}
|
|
203
198
|
|
|
204
199
|
function normalizePrefixPath(path: string) {
|
|
@@ -247,61 +242,3 @@ function wrapWithLayouts(
|
|
|
247
242
|
createElement(page, props)
|
|
248
243
|
)
|
|
249
244
|
}
|
|
250
|
-
|
|
251
|
-
function runBeforeLeaveHooks(
|
|
252
|
-
hooks: OnBeforeLeaveHook[],
|
|
253
|
-
context: Kiru.RequestContext,
|
|
254
|
-
to: string,
|
|
255
|
-
from: string = to
|
|
256
|
-
): false | void {
|
|
257
|
-
for (const hook of hooks) {
|
|
258
|
-
const res = hook(context, to, from)
|
|
259
|
-
if (res === false) {
|
|
260
|
-
return false
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
async function runBeforeEnterHooks(
|
|
266
|
-
hooks: OnBeforeEnterHook[],
|
|
267
|
-
context: Kiru.RequestContext,
|
|
268
|
-
to: string,
|
|
269
|
-
from: string = to
|
|
270
|
-
) {
|
|
271
|
-
for (const hook of hooks) {
|
|
272
|
-
const result = await hook(context, to, from)
|
|
273
|
-
if (typeof result === "string") {
|
|
274
|
-
return result
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
return null
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
async function runBeforeEachGuards(
|
|
282
|
-
guardModules: GuardModule[],
|
|
283
|
-
context: Kiru.RequestContext,
|
|
284
|
-
to: string,
|
|
285
|
-
from: string = to
|
|
286
|
-
): Promise<string | null> {
|
|
287
|
-
const beforeHooks = guardModules
|
|
288
|
-
.map((guardModule) => resolveNavguard(guardModule)?.beforeEach)
|
|
289
|
-
.filter((x) => typeof x === "function")
|
|
290
|
-
|
|
291
|
-
return runBeforeEnterHooks(beforeHooks, context, to, from)
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
async function runAfterEachGuards(
|
|
295
|
-
guardModules: GuardModule[],
|
|
296
|
-
context: Kiru.RequestContext,
|
|
297
|
-
to: string,
|
|
298
|
-
from: string = to
|
|
299
|
-
): Promise<void> {
|
|
300
|
-
const afterHooks = guardModules
|
|
301
|
-
.map((guardModule) => resolveNavguard(guardModule)?.afterEach)
|
|
302
|
-
.filter((x) => typeof x === "function")
|
|
303
|
-
|
|
304
|
-
for (const hook of afterHooks) {
|
|
305
|
-
await hook(context, to, from)
|
|
306
|
-
}
|
|
307
|
-
}
|