@kasperrt/smolter 0.0.1 → 0.3.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.
- package/{src/internal → .generated}/client/index.ts +1 -0
- package/.generated/core/environment.ts +43 -0
- package/{src/internal → .generated}/core/errors.ts +1 -1
- package/{src/internal → .generated}/core/index.ts +2 -0
- package/.generated/core/navigation-router.ts +107 -0
- package/.generated/core/navigation.ts +147 -0
- package/.generated/core/presentation.ts +108 -0
- package/.generated/core/resource-types.ts +44 -0
- package/.generated/core/resources.ts +444 -0
- package/.generated/core/responses.ts +86 -0
- package/{src/internal → .generated}/core/router.ts +136 -63
- package/.generated/core/serialize.ts +20 -0
- package/.generated/core/store.ts +25 -0
- package/.generated/core/submission.ts +116 -0
- package/{src/internal → .generated}/core/types.ts +18 -1
- package/.generated/core/url.ts +29 -0
- package/.generated/core/utils.ts +5 -0
- package/.generated/preact/await.tsx +41 -0
- package/.generated/preact/client.tsx +93 -0
- package/.generated/preact/context.ts +59 -0
- package/.generated/preact/document.tsx +198 -0
- package/{src/internal → .generated}/preact/fetcher.ts +43 -23
- package/.generated/preact/form.ts +58 -0
- package/{src/internal → .generated}/preact/hooks.ts +25 -28
- package/.generated/preact/index.ts +34 -0
- package/.generated/preact/lazy-route.ts +100 -0
- package/.generated/preact/navigation-state.ts +9 -0
- package/.generated/preact/navigation.tsx +147 -0
- package/.generated/preact/root-context.ts +21 -0
- package/.generated/preact/root-data.ts +45 -0
- package/.generated/preact/route-hooks.tsx +170 -0
- package/.generated/preact/route-types.ts +76 -0
- package/.generated/preact/router.tsx +107 -0
- package/{src/internal → .generated}/preact/routes.ts +17 -9
- package/.generated/react/context.ts +59 -0
- package/.generated/react/data.ts +25 -0
- package/{src/internal → .generated}/react/fetcher.ts +13 -11
- package/.generated/react/form.ts +58 -0
- package/{src/internal → .generated}/react/hooks.ts +9 -14
- package/{src/internal/preact → .generated/react}/index.ts +5 -1
- package/{src/internal → .generated}/react/link.ts +13 -21
- package/.generated/react/resources/components.tsx +404 -0
- package/{src/internal → .generated}/react/routes.ts +17 -9
- package/.generated/server/application.tsx +185 -0
- package/.generated/server/assets.ts +19 -0
- package/.generated/server/handler.ts +69 -0
- package/.generated/server/http.ts +55 -0
- package/{src/internal → .generated}/server/index.ts +4 -17
- package/.generated/server/node.ts +4 -0
- package/.generated/server/preact.ts +7 -0
- package/.generated/vite/application/browser-boundary.ts +42 -0
- package/.generated/vite/application/lazy-files.ts +136 -0
- package/.generated/vite/application/vite.ts +144 -0
- package/{src/internal → .generated}/vite/index.ts +4 -2
- package/.generated/vite/preact.ts +24 -0
- package/.generated/vite/react.ts +18 -0
- package/{src/internal → .generated}/vite/transport.ts +2 -1
- package/CHANGELOG.md +54 -0
- package/README.md +269 -55
- package/dist/client/deserialize.js +10 -0
- package/dist/{internal/client → client}/index.d.ts +1 -0
- package/dist/client/index.js +46 -0
- package/dist/core/environment.d.ts +12 -0
- package/dist/core/environment.js +23 -0
- package/dist/core/errors.js +7 -0
- package/dist/{internal/core → core}/index.d.ts +2 -0
- package/dist/core/match.js +33 -0
- package/dist/core/navigation-router.d.ts +15 -0
- package/dist/core/navigation-router.js +64 -0
- package/dist/core/navigation.d.ts +15 -0
- package/dist/core/navigation.js +92 -0
- package/dist/core/presentation.d.ts +5 -0
- package/dist/core/presentation.js +69 -0
- package/dist/core/resource-types.d.ts +37 -0
- package/dist/core/resources.d.ts +19 -0
- package/dist/core/resources.js +345 -0
- package/dist/core/responses.d.ts +15 -0
- package/dist/core/responses.js +48 -0
- package/dist/{internal/core → core}/router.d.ts +1 -1
- package/dist/core/router.js +204 -0
- package/dist/core/serialize.d.ts +5 -0
- package/dist/core/serialize.js +17 -0
- package/dist/core/store.d.ts +6 -0
- package/dist/core/store.js +21 -0
- package/dist/core/submission.d.ts +30 -0
- package/dist/core/submission.js +41 -0
- package/dist/{internal/core → core}/types.d.ts +16 -1
- package/dist/core/url.d.ts +7 -0
- package/dist/core/url.js +12 -0
- package/dist/core/utils.d.ts +5 -0
- package/dist/core/utils.js +5 -0
- package/dist/files/index.js +64 -0
- package/dist/preact/await.d.ts +7 -0
- package/dist/preact/await.js +19 -0
- package/dist/preact/client.d.ts +7 -0
- package/dist/preact/client.js +67 -0
- package/dist/preact/context.d.ts +18 -0
- package/dist/preact/context.js +23 -0
- package/dist/preact/document.d.ts +15 -0
- package/dist/preact/document.js +155 -0
- package/dist/{internal/preact → preact}/fetcher.d.ts +9 -5
- package/dist/preact/fetcher.js +45 -0
- package/dist/{internal/preact → preact}/form.d.ts +5 -6
- package/dist/preact/form.js +21 -0
- package/dist/{internal/preact → preact}/hooks.d.ts +7 -6
- package/dist/preact/hooks.js +25 -0
- package/dist/preact/index.d.ts +18 -0
- package/dist/preact/index.js +15 -0
- package/dist/preact/lazy-route.d.ts +19 -0
- package/dist/preact/lazy-route.js +51 -0
- package/dist/preact/navigation-state.d.ts +2 -0
- package/dist/preact/navigation-state.js +9 -0
- package/dist/preact/navigation.d.ts +28 -0
- package/dist/preact/navigation.js +60 -0
- package/dist/preact/root-context.d.ts +13 -0
- package/dist/preact/root-context.js +9 -0
- package/dist/preact/root-data.d.ts +8 -0
- package/dist/preact/root-data.js +28 -0
- package/dist/preact/route-hooks.d.ts +32 -0
- package/dist/preact/route-hooks.js +94 -0
- package/dist/preact/route-types.d.ts +54 -0
- package/dist/preact/router.d.ts +16 -0
- package/dist/preact/router.js +63 -0
- package/dist/{internal/preact → preact}/routes.d.ts +1 -1
- package/dist/preact/routes.js +12 -0
- package/dist/{internal/preact → preact}/runtime.js +1 -1
- package/dist/react/context.d.ts +18 -0
- package/dist/react/context.js +23 -0
- package/dist/react/data.d.ts +5 -0
- package/dist/react/data.js +3 -0
- package/dist/{internal/react → react}/fetcher.d.ts +2 -2
- package/dist/react/fetcher.js +34 -0
- package/dist/{internal/react → react}/form.d.ts +5 -6
- package/dist/react/form.js +21 -0
- package/dist/react/hooks.js +25 -0
- package/dist/{internal/react → react}/index.d.ts +1 -1
- package/dist/react/index.js +10 -0
- package/dist/{internal/react → react}/link.d.ts +2 -2
- package/dist/react/link.js +27 -0
- package/dist/react/resources/components.d.ts +64 -0
- package/dist/react/resources/components.js +239 -0
- package/dist/{internal/react → react}/routes.d.ts +1 -1
- package/dist/react/routes.js +12 -0
- package/dist/react/runtime.js +1 -0
- package/dist/server/application.d.ts +4 -0
- package/dist/server/application.js +119 -0
- package/dist/server/assets.d.ts +5 -0
- package/dist/server/assets.js +7 -0
- package/dist/server/handler.d.ts +19 -0
- package/dist/server/handler.js +22 -0
- package/dist/server/http.d.ts +4 -0
- package/dist/server/http.js +27 -0
- package/dist/{internal/server → server}/index.d.ts +2 -3
- package/dist/server/index.js +76 -0
- package/dist/server/node.d.ts +3 -0
- package/dist/server/node.js +3 -0
- package/dist/server/preact.d.ts +3 -0
- package/dist/server/preact.js +4 -0
- package/dist/vite/application/browser-boundary.d.ts +3 -0
- package/dist/vite/application/browser-boundary.js +35 -0
- package/dist/vite/application/lazy-files.d.ts +2 -0
- package/dist/vite/application/lazy-files.js +87 -0
- package/dist/vite/application/vite.d.ts +9 -0
- package/dist/vite/application/vite.js +101 -0
- package/dist/{internal/vite → vite}/index.d.ts +2 -1
- package/dist/vite/index.js +104 -0
- package/dist/vite/preact.d.ts +11 -0
- package/dist/vite/preact.js +15 -0
- package/dist/vite/react.d.ts +9 -0
- package/dist/vite/react.js +14 -0
- package/dist/{internal/vite → vite}/transport.d.ts +1 -1
- package/dist/vite/transport.js +35 -0
- package/jsr.json +28 -11
- package/package.json +119 -38
- package/dist/client.d.ts +0 -2
- package/dist/client.js +0 -2
- package/dist/core.d.ts +0 -2
- package/dist/core.js +0 -2
- package/dist/files.d.ts +0 -2
- package/dist/files.js +0 -2
- package/dist/internal/client/deserialize.js +0 -11
- package/dist/internal/client/index.js +0 -44
- package/dist/internal/core/errors.js +0 -6
- package/dist/internal/core/index.js +0 -6
- package/dist/internal/core/match.js +0 -27
- package/dist/internal/core/router.js +0 -189
- package/dist/internal/core/types.js +0 -5
- package/dist/internal/core/url.d.ts +0 -2
- package/dist/internal/core/url.js +0 -6
- package/dist/internal/files/index.js +0 -77
- package/dist/internal/preact/context.d.ts +0 -18
- package/dist/internal/preact/context.js +0 -20
- package/dist/internal/preact/fetcher.js +0 -28
- package/dist/internal/preact/form.js +0 -41
- package/dist/internal/preact/hooks.js +0 -35
- package/dist/internal/preact/index.d.ts +0 -9
- package/dist/internal/preact/index.js +0 -7
- package/dist/internal/preact/link.d.ts +0 -12
- package/dist/internal/preact/link.js +0 -28
- package/dist/internal/preact/routes.js +0 -22
- package/dist/internal/react/context.d.ts +0 -18
- package/dist/internal/react/context.js +0 -20
- package/dist/internal/react/fetcher.js +0 -28
- package/dist/internal/react/form.js +0 -41
- package/dist/internal/react/hooks.js +0 -35
- package/dist/internal/react/index.js +0 -7
- package/dist/internal/react/link.js +0 -28
- package/dist/internal/react/routes.js +0 -22
- package/dist/internal/react/runtime.js +0 -2
- package/dist/internal/server/index.js +0 -81
- package/dist/internal/vite/index.js +0 -132
- package/dist/internal/vite/transport.js +0 -42
- package/dist/preact.d.ts +0 -2
- package/dist/preact.js +0 -2
- package/dist/react.d.ts +0 -2
- package/dist/react.js +0 -2
- package/dist/server.d.ts +0 -2
- package/dist/server.js +0 -2
- package/dist/vite.d.ts +0 -2
- package/dist/vite.js +0 -2
- package/src/client.ts +0 -2
- package/src/core.ts +0 -2
- package/src/files.ts +0 -2
- package/src/internal/core/url.ts +0 -6
- package/src/internal/preact/context.ts +0 -46
- package/src/internal/preact/form.ts +0 -79
- package/src/internal/preact/link.ts +0 -46
- package/src/internal/react/context.ts +0 -46
- package/src/internal/react/form.ts +0 -79
- package/src/internal/react/index.ts +0 -13
- package/src/preact.ts +0 -2
- package/src/react.ts +0 -2
- package/src/server.ts +0 -2
- package/src/vite.ts +0 -2
- /package/{src/internal → .generated}/client/deserialize.ts +0 -0
- /package/{src/internal → .generated}/core/match.ts +0 -0
- /package/{src/internal → .generated}/files/index.ts +0 -0
- /package/{src/internal → .generated}/preact/runtime.ts +0 -0
- /package/{src/internal → .generated}/react/runtime.ts +0 -0
- /package/dist/{internal/client → client}/deserialize.d.ts +0 -0
- /package/dist/{internal/core → core}/errors.d.ts +0 -0
- /package/dist/{internal/core → core}/match.d.ts +0 -0
- /package/dist/{internal/files → files}/index.d.ts +0 -0
- /package/dist/{internal/preact → preact}/runtime.d.ts +0 -0
- /package/dist/{internal/react → react}/hooks.d.ts +0 -0
- /package/dist/{internal/react → react}/runtime.d.ts +0 -0
|
@@ -5,8 +5,13 @@
|
|
|
5
5
|
|
|
6
6
|
import type { Route as RouteDefinition, RouteModule } from "../core/index.ts";
|
|
7
7
|
import { useRouter, useSnapshot } from "./context.ts";
|
|
8
|
-
|
|
9
|
-
import {
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
type ComponentType,
|
|
11
|
+
createElement,
|
|
12
|
+
type ReactNode,
|
|
13
|
+
useMemo,
|
|
14
|
+
} from "./runtime.ts";
|
|
10
15
|
|
|
11
16
|
/** Renderable route module with optional loading and error components. */
|
|
12
17
|
export interface ViewModule extends RouteModule {
|
|
@@ -25,17 +30,20 @@ export interface RoutesProps {
|
|
|
25
30
|
fallback?: ReactNode;
|
|
26
31
|
}
|
|
27
32
|
/** Renders the first matching registered module. */
|
|
28
|
-
export function Routes({ fallback
|
|
33
|
+
export function Routes({ fallback }: RoutesProps): ReactNode {
|
|
29
34
|
const router = useRouter();
|
|
30
|
-
const state = useSnapshot(
|
|
35
|
+
const state = useSnapshot();
|
|
31
36
|
const module = router.routes.find((route) => route.path === state.path) as
|
|
32
37
|
| RouteDefinition<ViewModule>
|
|
33
38
|
| undefined;
|
|
34
|
-
const component =
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
const component =
|
|
40
|
+
module?.[
|
|
41
|
+
state.error
|
|
42
|
+
? "ErrorBoundary"
|
|
43
|
+
: state.state === "loading" && !state.loaded
|
|
44
|
+
? "HydrateFallback"
|
|
45
|
+
: "default"
|
|
46
|
+
];
|
|
39
47
|
|
|
40
48
|
const element = useMemo(
|
|
41
49
|
() =>
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React components and typed data hooks. Import from @kasperrt/smolter/react.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { NavigationRouter, Snapshot } from "../core/index.ts";
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
createContext,
|
|
10
|
+
createElement,
|
|
11
|
+
type ReactNode,
|
|
12
|
+
useContext,
|
|
13
|
+
useEffect,
|
|
14
|
+
useSyncExternalStore,
|
|
15
|
+
} from "./runtime.ts";
|
|
16
|
+
|
|
17
|
+
const RouterContext = createContext<NavigationRouter | undefined>(undefined);
|
|
18
|
+
|
|
19
|
+
/** Router instance and children rendered within its context. */
|
|
20
|
+
export interface RouterProviderProps {
|
|
21
|
+
router: NavigationRouter;
|
|
22
|
+
children?: ReactNode;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Provide a router to descendant hooks and connect its browser lifecycle. */
|
|
26
|
+
export function RouterProvider({
|
|
27
|
+
router,
|
|
28
|
+
children,
|
|
29
|
+
}: RouterProviderProps): ReactNode {
|
|
30
|
+
useEffect(router.start, [router]);
|
|
31
|
+
|
|
32
|
+
return createElement(RouterContext.Provider, { value: router }, children);
|
|
33
|
+
}
|
|
34
|
+
/** Hooks require a RouterProvider. */
|
|
35
|
+
export function useRouter<T extends NavigationRouter = NavigationRouter>(): T {
|
|
36
|
+
return useContext(RouterContext) as T;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function useSnapshot(): Snapshot;
|
|
40
|
+
|
|
41
|
+
export function useSnapshot<K extends keyof Snapshot>(key: K): Snapshot[K];
|
|
42
|
+
|
|
43
|
+
export function useSnapshot<K extends keyof Snapshot>(
|
|
44
|
+
key: K,
|
|
45
|
+
path: string | undefined,
|
|
46
|
+
): Snapshot[K] | undefined;
|
|
47
|
+
|
|
48
|
+
export function useSnapshot(key?: keyof Snapshot, path?: string) {
|
|
49
|
+
const router = useRouter();
|
|
50
|
+
const getSnapshot = () => {
|
|
51
|
+
const snapshot = router.getSnapshot();
|
|
52
|
+
|
|
53
|
+
if (path !== undefined && path !== snapshot.path) return undefined;
|
|
54
|
+
|
|
55
|
+
return key ? snapshot[key] : snapshot;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
return useSyncExternalStore(router.subscribe, getSnapshot, getSnapshot);
|
|
59
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Resource subscriptions independent of URL navigation. @module */
|
|
2
|
+
export type {
|
|
3
|
+
ActionFunctionArgs as ResourceActionArgs,
|
|
4
|
+
DataResult as ResourceResult,
|
|
5
|
+
LoaderFunctionArgs as ResourceLoaderArgs,
|
|
6
|
+
ShouldRevalidateFunctionArgs as ResourceRevalidationArgs,
|
|
7
|
+
} from "../core/resource-types.ts";
|
|
8
|
+
export {
|
|
9
|
+
createResourceRouter,
|
|
10
|
+
ResourceRouter,
|
|
11
|
+
} from "../core/resources.ts";
|
|
12
|
+
export type { ResourceRouteModule } from "./resources/components.tsx";
|
|
13
|
+
export {
|
|
14
|
+
Form as ResourceForm,
|
|
15
|
+
Route as Resource,
|
|
16
|
+
RouterProvider as ResourceProvider,
|
|
17
|
+
useActionData as useResourceActionData,
|
|
18
|
+
useFetcher as useResourceFetcher,
|
|
19
|
+
useLoaderData as useResourceData,
|
|
20
|
+
useNavigation as useResourceNavigation,
|
|
21
|
+
useRevalidator as useResourceRevalidator,
|
|
22
|
+
useRouteLoaderData,
|
|
23
|
+
useRouter as useResourceRouter,
|
|
24
|
+
useSubmit as useResourceSubmit,
|
|
25
|
+
} from "./resources/components.tsx";
|
|
@@ -3,20 +3,22 @@
|
|
|
3
3
|
* @module
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import
|
|
7
|
-
AnyDataFunction,
|
|
8
|
-
DataFunction,
|
|
9
|
-
DataOf,
|
|
10
|
-
FetcherSnapshot,
|
|
11
|
-
Result,
|
|
12
|
-
Route as RouteDefinition,
|
|
13
|
-
RouteModule,
|
|
14
|
-
|
|
6
|
+
import {
|
|
7
|
+
type AnyDataFunction,
|
|
8
|
+
type DataFunction,
|
|
9
|
+
type DataOf,
|
|
10
|
+
type FetcherSnapshot,
|
|
11
|
+
type Result,
|
|
12
|
+
type Route as RouteDefinition,
|
|
13
|
+
type RouteModule,
|
|
14
|
+
type Router,
|
|
15
|
+
type SubmitOptions,
|
|
15
16
|
} from "../core/index.ts";
|
|
16
17
|
import { useRouter } from "./context.ts";
|
|
17
18
|
import { Form, type FormProps } from "./form.ts";
|
|
18
|
-
|
|
19
|
+
|
|
19
20
|
import {
|
|
21
|
+
type ComponentType,
|
|
20
22
|
createElement,
|
|
21
23
|
useEffect,
|
|
22
24
|
useMemo,
|
|
@@ -51,7 +53,7 @@ export function useFetcher<
|
|
|
51
53
|
|
|
52
54
|
/** Create a fetcher for independent route reads and mutations; its data stays local. */
|
|
53
55
|
export function useFetcher(route?: RouteDefinition): TypedFetcher<unknown> {
|
|
54
|
-
const router = useRouter();
|
|
56
|
+
const router = useRouter<Router>();
|
|
55
57
|
const path = route?.path;
|
|
56
58
|
const fetcher = useMemo(() => {
|
|
57
59
|
const store = router.createFetcher();
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React components and typed data hooks. Import from @kasperrt/smolter/react.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { type Fetcher, type Router } from "../core/index.ts";
|
|
7
|
+
import { type RouteFormOptions, submitForm } from "../core/submission.ts";
|
|
8
|
+
import { useRouter } from "./context.ts";
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
createElement,
|
|
12
|
+
type FormHTMLAttributes,
|
|
13
|
+
type ReactNode,
|
|
14
|
+
} from "./runtime.ts";
|
|
15
|
+
|
|
16
|
+
/** Form attributes with GET loader requests or POST, PUT, PATCH, and DELETE actions. */
|
|
17
|
+
export interface FormProps
|
|
18
|
+
extends Omit<FormHTMLAttributes<HTMLFormElement>, "action" | "method">,
|
|
19
|
+
RouteFormOptions {}
|
|
20
|
+
|
|
21
|
+
type FormSubmitEvent = Parameters<NonNullable<FormProps["onSubmit"]>>[0];
|
|
22
|
+
|
|
23
|
+
interface InternalFormProps extends FormProps {
|
|
24
|
+
fetcher?: Fetcher;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Submit form data to a registered route without a document reload. */
|
|
28
|
+
export function Form(options: InternalFormProps): ReactNode {
|
|
29
|
+
const {
|
|
30
|
+
action,
|
|
31
|
+
method,
|
|
32
|
+
fetcher,
|
|
33
|
+
onSubmit,
|
|
34
|
+
reloadDocument,
|
|
35
|
+
preventScrollReset,
|
|
36
|
+
replace,
|
|
37
|
+
...props
|
|
38
|
+
} = options;
|
|
39
|
+
const router = useRouter<Router>();
|
|
40
|
+
const submit = (event: FormSubmitEvent) => {
|
|
41
|
+
onSubmit?.(event);
|
|
42
|
+
|
|
43
|
+
submitForm(
|
|
44
|
+
router,
|
|
45
|
+
event,
|
|
46
|
+
(event.nativeEvent as SubmitEvent).submitter,
|
|
47
|
+
options,
|
|
48
|
+
fetcher,
|
|
49
|
+
);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
return createElement("form", {
|
|
53
|
+
...props,
|
|
54
|
+
action,
|
|
55
|
+
method: method === "get" ? "get" : "post",
|
|
56
|
+
onSubmit: submit,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
@@ -30,43 +30,38 @@ export type ActionData<T> = T extends AnyDataFunction
|
|
|
30
30
|
: T extends RouteModule
|
|
31
31
|
? DataOf<Extract<T["action"] | T["clientAction"], AnyDataFunction>>
|
|
32
32
|
: unknown;
|
|
33
|
-
function useData(key: "data" | "actionData", route?: LoaderSource): unknown {
|
|
34
|
-
const path = (route as Route | undefined)?.path;
|
|
35
|
-
|
|
36
|
-
return useSnapshot((snapshot) => {
|
|
37
|
-
if (path !== undefined && path !== snapshot.path) return undefined;
|
|
38
|
-
|
|
39
|
-
return snapshot[key];
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
33
|
/** Pass a route for inference, or use useLoaderData<typeof loader>() in its module. */
|
|
43
34
|
export function useLoaderData<T extends LoaderSource = RouteModule>(
|
|
44
35
|
route?: T,
|
|
45
36
|
): LoaderData<T> | undefined {
|
|
46
|
-
return
|
|
37
|
+
return useSnapshot("data", (route as Route | undefined)?.path) as
|
|
38
|
+
| LoaderData<T>
|
|
39
|
+
| undefined;
|
|
47
40
|
}
|
|
48
41
|
|
|
49
42
|
/** Read the last page action result, optionally inferring its type from a route. */
|
|
50
43
|
export function useActionData<T extends LoaderSource = RouteModule>(
|
|
51
44
|
route?: T,
|
|
52
45
|
): ActionData<T> | undefined {
|
|
53
|
-
return
|
|
46
|
+
return useSnapshot("actionData", (route as Route | undefined)?.path) as
|
|
47
|
+
| ActionData<T>
|
|
48
|
+
| undefined;
|
|
54
49
|
}
|
|
55
50
|
|
|
56
51
|
/** Read path parameters for the active route. */
|
|
57
52
|
export function useParams(): Snapshot["params"] {
|
|
58
|
-
return useSnapshot(
|
|
53
|
+
return useSnapshot("params");
|
|
59
54
|
}
|
|
60
55
|
|
|
61
56
|
/** Read the current path, search, and hash together with the navigate function. */
|
|
62
57
|
export function useLocation(): readonly [string, Router["navigate"]] {
|
|
63
58
|
const router = useRouter();
|
|
64
|
-
const url = useSnapshot(
|
|
59
|
+
const url = useSnapshot("url");
|
|
65
60
|
|
|
66
61
|
return [url.replace(/^\w+:\/\/[^/]+/, ""), router.navigate];
|
|
67
62
|
}
|
|
68
63
|
|
|
69
64
|
/** Get the function that revalidates the current loader subject to shouldRevalidate. */
|
|
70
65
|
export function useRevalidator(): Router["revalidate"] {
|
|
71
|
-
return useRouter().revalidate;
|
|
66
|
+
return useRouter<Router>().revalidate;
|
|
72
67
|
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/** Framework components and typed data hooks. @module */
|
|
2
2
|
export type * from "../core/index.ts";
|
|
3
|
-
export {
|
|
3
|
+
export {
|
|
4
|
+
createDataRouter,
|
|
5
|
+
createRouter,
|
|
6
|
+
defineRoute,
|
|
7
|
+
} from "../core/index.ts";
|
|
4
8
|
export {
|
|
5
9
|
RouterProvider,
|
|
6
10
|
type RouterProviderProps,
|
|
@@ -3,10 +3,15 @@
|
|
|
3
3
|
* @module
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { internalURL } from "../core/
|
|
6
|
+
import { internalURL, navigationClick } from "../core/url.ts";
|
|
7
7
|
import { useRouter } from "./context.ts";
|
|
8
|
-
|
|
9
|
-
import {
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
type AnchorHTMLAttributes,
|
|
11
|
+
createElement,
|
|
12
|
+
type MouseEvent,
|
|
13
|
+
type ReactNode,
|
|
14
|
+
} from "./runtime.ts";
|
|
10
15
|
|
|
11
16
|
/** Anchor attributes with internal navigation and optional history replacement. */
|
|
12
17
|
export interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
|
|
@@ -15,31 +20,18 @@ export interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
|
|
|
15
20
|
}
|
|
16
21
|
|
|
17
22
|
/** Render an anchor that handles internal navigation and preserves native modified clicks. */
|
|
18
|
-
export function Link({
|
|
19
|
-
href,
|
|
20
|
-
replace,
|
|
21
|
-
onClick,
|
|
22
|
-
...props
|
|
23
|
-
}: LinkProps): ReactNode {
|
|
23
|
+
export function Link(options: LinkProps): ReactNode {
|
|
24
|
+
const { href, replace, onClick, ...props } = options;
|
|
24
25
|
const router = useRouter();
|
|
25
26
|
const click = (event: MouseEvent<HTMLAnchorElement>) => {
|
|
26
27
|
onClick?.(event);
|
|
27
28
|
|
|
28
|
-
if (
|
|
29
|
-
event.defaultPrevented ||
|
|
30
|
-
event.button ||
|
|
31
|
-
event.metaKey ||
|
|
32
|
-
event.ctrlKey ||
|
|
33
|
-
event.altKey ||
|
|
34
|
-
event.shiftKey ||
|
|
35
|
-
props.download !== undefined ||
|
|
36
|
-
(props.target && props.target !== "_self")
|
|
37
|
-
)
|
|
38
|
-
return;
|
|
29
|
+
if (!navigationClick(event, event.currentTarget)) return;
|
|
39
30
|
|
|
40
31
|
if (!internalURL(router.getSnapshot().url, href)) return;
|
|
32
|
+
|
|
41
33
|
event.preventDefault();
|
|
42
|
-
void router.navigate(href,
|
|
34
|
+
void router.navigate(href, options);
|
|
43
35
|
};
|
|
44
36
|
|
|
45
37
|
return createElement("a", { ...props, href, onClick: click });
|