heliumts 0.2.2
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/LICENSE +21 -0
- package/README.md +356 -0
- package/dist/bin/helium.d.ts +3 -0
- package/dist/bin/helium.d.ts.map +1 -0
- package/dist/bin/helium.js +236 -0
- package/dist/bin/helium.js.map +1 -0
- package/dist/client/Router.d.ts +83 -0
- package/dist/client/Router.d.ts.map +1 -0
- package/dist/client/Router.js +329 -0
- package/dist/client/Router.js.map +1 -0
- package/dist/client/cache.d.ts +8 -0
- package/dist/client/cache.d.ts.map +1 -0
- package/dist/client/cache.js +82 -0
- package/dist/client/cache.js.map +1 -0
- package/dist/client/index.d.ts +10 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +9 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/prefetch.d.ts +12 -0
- package/dist/client/prefetch.d.ts.map +1 -0
- package/dist/client/prefetch.js +33 -0
- package/dist/client/prefetch.js.map +1 -0
- package/dist/client/routerManifest.d.ts +28 -0
- package/dist/client/routerManifest.d.ts.map +1 -0
- package/dist/client/routerManifest.js +242 -0
- package/dist/client/routerManifest.js.map +1 -0
- package/dist/client/rpcClient.d.ts +33 -0
- package/dist/client/rpcClient.d.ts.map +1 -0
- package/dist/client/rpcClient.js +383 -0
- package/dist/client/rpcClient.js.map +1 -0
- package/dist/client/transitions.d.ts +85 -0
- package/dist/client/transitions.d.ts.map +1 -0
- package/dist/client/transitions.js +92 -0
- package/dist/client/transitions.js.map +1 -0
- package/dist/client/types.d.ts +6 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/useCall.d.ts +31 -0
- package/dist/client/useCall.d.ts.map +1 -0
- package/dist/client/useCall.js +40 -0
- package/dist/client/useCall.js.map +1 -0
- package/dist/client/useFetch.d.ts +34 -0
- package/dist/client/useFetch.d.ts.map +1 -0
- package/dist/client/useFetch.js +152 -0
- package/dist/client/useFetch.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/protocol.d.ts +25 -0
- package/dist/runtime/protocol.d.ts.map +1 -0
- package/dist/runtime/protocol.js +2 -0
- package/dist/runtime/protocol.js.map +1 -0
- package/dist/server/config.d.ts +216 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +130 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/context.d.ts +38 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +2 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/defineHTTPRequest.d.ts +49 -0
- package/dist/server/defineHTTPRequest.d.ts.map +1 -0
- package/dist/server/defineHTTPRequest.js +34 -0
- package/dist/server/defineHTTPRequest.js.map +1 -0
- package/dist/server/defineMethod.d.ts +20 -0
- package/dist/server/defineMethod.d.ts.map +1 -0
- package/dist/server/defineMethod.js +23 -0
- package/dist/server/defineMethod.js.map +1 -0
- package/dist/server/devServer.d.ts +15 -0
- package/dist/server/devServer.d.ts.map +1 -0
- package/dist/server/devServer.js +219 -0
- package/dist/server/devServer.js.map +1 -0
- package/dist/server/handlerLoader.d.ts +1 -0
- package/dist/server/handlerLoader.d.ts.map +1 -0
- package/dist/server/handlerLoader.js +2 -0
- package/dist/server/handlerLoader.js.map +1 -0
- package/dist/server/httpRouter.d.ts +17 -0
- package/dist/server/httpRouter.d.ts.map +1 -0
- package/dist/server/httpRouter.js +227 -0
- package/dist/server/httpRouter.js.map +1 -0
- package/dist/server/index.d.ts +11 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +13 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware.d.ts +30 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/middleware.js +23 -0
- package/dist/server/middleware.js.map +1 -0
- package/dist/server/prodServer.d.ts +27 -0
- package/dist/server/prodServer.d.ts.map +1 -0
- package/dist/server/prodServer.js +301 -0
- package/dist/server/prodServer.js.map +1 -0
- package/dist/server/rateLimiter.d.ts +36 -0
- package/dist/server/rateLimiter.d.ts.map +1 -0
- package/dist/server/rateLimiter.js +113 -0
- package/dist/server/rateLimiter.js.map +1 -0
- package/dist/server/rpcRegistry.d.ts +34 -0
- package/dist/server/rpcRegistry.d.ts.map +1 -0
- package/dist/server/rpcRegistry.js +231 -0
- package/dist/server/rpcRegistry.js.map +1 -0
- package/dist/server/security.d.ts +5 -0
- package/dist/server/security.d.ts.map +1 -0
- package/dist/server/security.js +59 -0
- package/dist/server/security.js.map +1 -0
- package/dist/server/serializer.d.ts +9 -0
- package/dist/server/serializer.d.ts.map +1 -0
- package/dist/server/serializer.js +40 -0
- package/dist/server/serializer.js.map +1 -0
- package/dist/utils/envLoader.d.ts +27 -0
- package/dist/utils/envLoader.d.ts.map +1 -0
- package/dist/utils/envLoader.js +68 -0
- package/dist/utils/envLoader.js.map +1 -0
- package/dist/utils/ipExtractor.d.ts +59 -0
- package/dist/utils/ipExtractor.d.ts.map +1 -0
- package/dist/utils/ipExtractor.js +126 -0
- package/dist/utils/ipExtractor.js.map +1 -0
- package/dist/utils/logger.d.ts +2 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +24 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/vite/heliumPlugin.d.ts +3 -0
- package/dist/vite/heliumPlugin.d.ts.map +1 -0
- package/dist/vite/heliumPlugin.js +294 -0
- package/dist/vite/heliumPlugin.js.map +1 -0
- package/dist/vite/index.d.ts +3 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +3 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/paths.d.ts +8 -0
- package/dist/vite/paths.d.ts.map +1 -0
- package/dist/vite/paths.js +8 -0
- package/dist/vite/paths.js.map +1 -0
- package/dist/vite/scanner.d.ts +35 -0
- package/dist/vite/scanner.d.ts.map +1 -0
- package/dist/vite/scanner.js +167 -0
- package/dist/vite/scanner.js.map +1 -0
- package/dist/vite/ssg.d.ts +22 -0
- package/dist/vite/ssg.d.ts.map +1 -0
- package/dist/vite/ssg.js +547 -0
- package/dist/vite/ssg.js.map +1 -0
- package/dist/vite/virtualServerModule.d.ts +6 -0
- package/dist/vite/virtualServerModule.d.ts.map +1 -0
- package/dist/vite/virtualServerModule.js +82 -0
- package/dist/vite/virtualServerModule.js.map +1 -0
- package/package.json +103 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { ComponentType } from "react";
|
|
2
|
+
import React from "react";
|
|
3
|
+
type RouterEvent = "navigation" | "before-navigation";
|
|
4
|
+
type EventListener = (event: {
|
|
5
|
+
from: string;
|
|
6
|
+
to: string;
|
|
7
|
+
preventDefault?: () => void;
|
|
8
|
+
}) => void;
|
|
9
|
+
/** Options for push/replace navigation methods */
|
|
10
|
+
export interface RouterNavigationOptions {
|
|
11
|
+
/** Scroll to top after navigation (default: true) */
|
|
12
|
+
scrollToTop?: boolean;
|
|
13
|
+
}
|
|
14
|
+
type RouterContext = {
|
|
15
|
+
path: string;
|
|
16
|
+
params: Record<string, string | string[]>;
|
|
17
|
+
searchParams: URLSearchParams;
|
|
18
|
+
push: (href: string, options?: RouterNavigationOptions) => void;
|
|
19
|
+
replace: (href: string, options?: RouterNavigationOptions) => void;
|
|
20
|
+
on: (event: RouterEvent, listener: EventListener) => () => void;
|
|
21
|
+
status: 200 | 404;
|
|
22
|
+
isNavigating: boolean;
|
|
23
|
+
/** Indicates content is stale (old content shown while new content renders) - React 18+ concurrent feature */
|
|
24
|
+
isPending: boolean;
|
|
25
|
+
};
|
|
26
|
+
export declare const RouterContext: React.Context<RouterContext | null>;
|
|
27
|
+
/**
|
|
28
|
+
* Access router context inside a component tree managed by <AppRouter />.
|
|
29
|
+
*
|
|
30
|
+
* Provides current path, route params, URL search params and navigation helpers
|
|
31
|
+
* (\`push\`, \`replace\`) as well as an \`on\` method to subscribe to navigation events.
|
|
32
|
+
* The \`isNavigating\` property indicates when a navigation is in progress.
|
|
33
|
+
* The \`isPending\` property indicates when content is stale (React concurrent features).
|
|
34
|
+
* Throws when used outside of an <AppRouter /> provider.
|
|
35
|
+
*/
|
|
36
|
+
export declare function useRouter(): RouterContext;
|
|
37
|
+
/**
|
|
38
|
+
* Redirect component for declarative navigation.
|
|
39
|
+
* Use this instead of calling router.push() during render.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* \`\`\`tsx
|
|
43
|
+
* export default function Docs() {
|
|
44
|
+
* return <Redirect to="/docs/getting-started" />;
|
|
45
|
+
* }
|
|
46
|
+
* \`\`\`
|
|
47
|
+
*/
|
|
48
|
+
export declare function Redirect({ to, replace }: {
|
|
49
|
+
to: string;
|
|
50
|
+
replace?: boolean;
|
|
51
|
+
}): null;
|
|
52
|
+
export type LinkProps = React.PropsWithChildren<Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, "href"> & {
|
|
53
|
+
href: string;
|
|
54
|
+
replace?: boolean;
|
|
55
|
+
/** Disable prefetching on hover (default: false - prefetch is enabled) */
|
|
56
|
+
prefetch?: boolean;
|
|
57
|
+
/** Scroll to top after navigation (default: true) */
|
|
58
|
+
scrollToTop?: boolean;
|
|
59
|
+
}>;
|
|
60
|
+
/**
|
|
61
|
+
* Client-side navigation link.
|
|
62
|
+
*
|
|
63
|
+
* Intercepts left-clicks and uses the router's navigation helpers for SPA
|
|
64
|
+
* navigation. Keeps normal anchor behaviour when modifier keys are used
|
|
65
|
+
* or when the link is external.
|
|
66
|
+
*
|
|
67
|
+
* Automatically prefetches page chunks on hover for faster navigation.
|
|
68
|
+
*/
|
|
69
|
+
export declare function Link(props: LinkProps): import("react/jsx-runtime").JSX.Element;
|
|
70
|
+
/**
|
|
71
|
+
* Props passed to an optional \`AppShell\` wrapper component used by <AppRouter />.
|
|
72
|
+
*
|
|
73
|
+
* \`Component\` — the page component to render. \`pageProps\` — props provided to the page.
|
|
74
|
+
*/
|
|
75
|
+
export type AppShellProps<TPageProps extends Record<string, unknown> = Record<string, unknown>> = {
|
|
76
|
+
Component: ComponentType<TPageProps>;
|
|
77
|
+
pageProps: TPageProps;
|
|
78
|
+
};
|
|
79
|
+
export declare function AppRouter({ AppShell }: {
|
|
80
|
+
AppShell?: ComponentType<AppShellProps>;
|
|
81
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
82
|
+
export {};
|
|
83
|
+
//# sourceMappingURL=Router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../../src/client/Router.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAuD,MAAM,OAAO,CAAC;AAM5E,KAAK,WAAW,GAAG,YAAY,GAAG,mBAAmB,CAAC;AACtD,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,KAAK,IAAI,CAAC;AAsHhG,kDAAkD;AAClD,MAAM,WAAW,uBAAuB;IACpC,qDAAqD;IACrD,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAGD,KAAK,aAAa,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC1C,YAAY,EAAE,eAAe,CAAC;IAC9B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAChE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACnE,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,KAAK,MAAM,IAAI,CAAC;IAChE,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,8GAA8G;IAC9G,SAAS,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,aAAa,qCAAkD,CAAC;AAE7E;;;;;;;;GAQG;AACH,wBAAgB,SAAS,kBAkCxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAe,EAAE,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,QAyBlF;AA2CD,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,iBAAiB,CAC3C,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,GAAG;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qDAAqD;IACrD,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB,CACJ,CAAC;AAoBF;;;;;;;;GAQG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,2CA6CpC;AAGD;;;;GAIG;AACH,MAAM,MAAM,aAAa,CAAC,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IAC9F,SAAS,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACrC,SAAS,EAAE,UAAU,CAAC;CACzB,CAAC;AAGF,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;CAAE,2CAqElF"}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React, { useMemo, useSyncExternalStore, useTransition } from "react";
|
|
3
|
+
import { buildRoutes } from "./routerManifest.js";
|
|
4
|
+
class RouterEventEmitter {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.listeners = new Map();
|
|
7
|
+
}
|
|
8
|
+
on(event, listener) {
|
|
9
|
+
if (!this.listeners.has(event)) {
|
|
10
|
+
this.listeners.set(event, new Set());
|
|
11
|
+
}
|
|
12
|
+
this.listeners.get(event).add(listener);
|
|
13
|
+
// Return unsubscribe function
|
|
14
|
+
return () => {
|
|
15
|
+
this.listeners.get(event)?.delete(listener);
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
emit(event, data) {
|
|
19
|
+
const eventListeners = this.listeners.get(event);
|
|
20
|
+
if (!eventListeners || eventListeners.size === 0) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
let prevented = false;
|
|
24
|
+
const preventDefault = () => {
|
|
25
|
+
prevented = true;
|
|
26
|
+
};
|
|
27
|
+
const eventData = event === "before-navigation" ? { ...data, preventDefault } : data;
|
|
28
|
+
eventListeners.forEach((listener) => {
|
|
29
|
+
listener(eventData);
|
|
30
|
+
});
|
|
31
|
+
return !prevented;
|
|
32
|
+
}
|
|
33
|
+
// Clear all listeners - useful for HMR
|
|
34
|
+
clear() {
|
|
35
|
+
this.listeners.clear();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Use a singleton that survives HMR by attaching to window in dev mode
|
|
39
|
+
let routerEventEmitter;
|
|
40
|
+
if (typeof window !== "undefined" && import.meta.env?.DEV) {
|
|
41
|
+
// In dev mode, reuse the same emitter instance across HMR
|
|
42
|
+
const globalWindow = window;
|
|
43
|
+
if (!globalWindow.__heliumRouterEmitter) {
|
|
44
|
+
globalWindow.__heliumRouterEmitter = new RouterEventEmitter();
|
|
45
|
+
}
|
|
46
|
+
routerEventEmitter = globalWindow.__heliumRouterEmitter;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
routerEventEmitter = new RouterEventEmitter();
|
|
50
|
+
}
|
|
51
|
+
function getLocation() {
|
|
52
|
+
const { pathname, search } = window.location;
|
|
53
|
+
return {
|
|
54
|
+
path: pathname,
|
|
55
|
+
searchParams: new URLSearchParams(search),
|
|
56
|
+
isNavigating: false,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function matchRoute(path, routes) {
|
|
60
|
+
for (const r of routes) {
|
|
61
|
+
const m = r.matcher(path);
|
|
62
|
+
if (m) {
|
|
63
|
+
return { params: m.params, route: r };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
// Location store for useSyncExternalStore
|
|
69
|
+
let currentLocation = typeof window !== "undefined" ? getLocation() : { path: "/", searchParams: new URLSearchParams(), isNavigating: false };
|
|
70
|
+
const locationListeners = new Set();
|
|
71
|
+
function subscribeToLocation(callback) {
|
|
72
|
+
locationListeners.add(callback);
|
|
73
|
+
return () => locationListeners.delete(callback);
|
|
74
|
+
}
|
|
75
|
+
function getLocationSnapshot() {
|
|
76
|
+
return currentLocation;
|
|
77
|
+
}
|
|
78
|
+
function getServerSnapshot() {
|
|
79
|
+
return { path: "/", searchParams: new URLSearchParams(), isNavigating: false };
|
|
80
|
+
}
|
|
81
|
+
function updateLocation(isNavigating = false) {
|
|
82
|
+
currentLocation = { ...getLocation(), isNavigating };
|
|
83
|
+
locationListeners.forEach((listener) => listener());
|
|
84
|
+
}
|
|
85
|
+
// Set up global listeners once
|
|
86
|
+
if (typeof window !== "undefined") {
|
|
87
|
+
// Only set up once, survives HMR
|
|
88
|
+
const globalWindow = window;
|
|
89
|
+
if (!globalWindow.__heliumLocationListenerSetup) {
|
|
90
|
+
globalWindow.__heliumLocationListenerSetup = true;
|
|
91
|
+
window.addEventListener("popstate", () => updateLocation(false));
|
|
92
|
+
// Also listen to navigation events from the emitter
|
|
93
|
+
routerEventEmitter.on("navigation", () => updateLocation(false));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export const RouterContext = React.createContext(null);
|
|
97
|
+
/**
|
|
98
|
+
* Access router context inside a component tree managed by <AppRouter />.
|
|
99
|
+
*
|
|
100
|
+
* Provides current path, route params, URL search params and navigation helpers
|
|
101
|
+
* (\`push\`, \`replace\`) as well as an \`on\` method to subscribe to navigation events.
|
|
102
|
+
* The \`isNavigating\` property indicates when a navigation is in progress.
|
|
103
|
+
* The \`isPending\` property indicates when content is stale (React concurrent features).
|
|
104
|
+
* Throws when used outside of an <AppRouter /> provider.
|
|
105
|
+
*/
|
|
106
|
+
export function useRouter() {
|
|
107
|
+
const ctx = React.useContext(RouterContext);
|
|
108
|
+
if (!ctx) {
|
|
109
|
+
// During HMR in development, context might be temporarily unavailable
|
|
110
|
+
// Provide a temporary fallback to prevent white screen of death
|
|
111
|
+
if (typeof window !== "undefined" && import.meta.env?.DEV) {
|
|
112
|
+
console.warn("useRouter called before RouterContext is available (HMR reload). Using fallback.");
|
|
113
|
+
return {
|
|
114
|
+
path: window.location.pathname,
|
|
115
|
+
params: {},
|
|
116
|
+
searchParams: new URLSearchParams(window.location.search),
|
|
117
|
+
push: (href, options) => {
|
|
118
|
+
window.history.pushState({}, "", href);
|
|
119
|
+
if (options?.scrollToTop !== false) {
|
|
120
|
+
window.scrollTo({ top: 0, left: 0, behavior: "smooth" });
|
|
121
|
+
}
|
|
122
|
+
window.dispatchEvent(new PopStateEvent("popstate"));
|
|
123
|
+
},
|
|
124
|
+
replace: (href, options) => {
|
|
125
|
+
window.history.replaceState({}, "", href);
|
|
126
|
+
if (options?.scrollToTop !== false) {
|
|
127
|
+
window.scrollTo({ top: 0, left: 0, behavior: "smooth" });
|
|
128
|
+
}
|
|
129
|
+
window.dispatchEvent(new PopStateEvent("popstate"));
|
|
130
|
+
},
|
|
131
|
+
on: () => () => { },
|
|
132
|
+
status: 200,
|
|
133
|
+
isNavigating: false,
|
|
134
|
+
isPending: false,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
throw new Error("useRouter must be used inside <AppRouter>");
|
|
138
|
+
}
|
|
139
|
+
return ctx;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Redirect component for declarative navigation.
|
|
143
|
+
* Use this instead of calling router.push() during render.
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* \`\`\`tsx
|
|
147
|
+
* export default function Docs() {
|
|
148
|
+
* return <Redirect to="/docs/getting-started" />;
|
|
149
|
+
* }
|
|
150
|
+
* \`\`\`
|
|
151
|
+
*/
|
|
152
|
+
export function Redirect({ to, replace = false }) {
|
|
153
|
+
const hasRedirected = React.useRef(false);
|
|
154
|
+
// Use useLayoutEffect to redirect before paint
|
|
155
|
+
React.useLayoutEffect(() => {
|
|
156
|
+
const targetPath = to.split("?")[0];
|
|
157
|
+
if (!hasRedirected.current && window.location.pathname !== targetPath) {
|
|
158
|
+
hasRedirected.current = true;
|
|
159
|
+
// Perform navigation
|
|
160
|
+
if (replace) {
|
|
161
|
+
window.history.replaceState(null, "", to);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
window.history.pushState(null, "", to);
|
|
165
|
+
}
|
|
166
|
+
// Emit navigation event to update router state
|
|
167
|
+
routerEventEmitter.emit("navigation", {
|
|
168
|
+
from: window.location.pathname,
|
|
169
|
+
to: targetPath,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}, [to, replace]);
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
// Navigation helper
|
|
176
|
+
function navigate(href, options = {}) {
|
|
177
|
+
const { replace = false, scrollToTop = true } = options;
|
|
178
|
+
const from = window.location.pathname;
|
|
179
|
+
const to = href.split("?")[0]; // Extract pathname from href
|
|
180
|
+
// Emit before-navigation event (can be prevented)
|
|
181
|
+
const canNavigate = routerEventEmitter.emit("before-navigation", { from, to });
|
|
182
|
+
if (!canNavigate) {
|
|
183
|
+
return; // Navigation was prevented
|
|
184
|
+
}
|
|
185
|
+
// Set navigating state to true before navigation
|
|
186
|
+
currentLocation = { ...currentLocation, isNavigating: true };
|
|
187
|
+
locationListeners.forEach((listener) => listener());
|
|
188
|
+
if (replace) {
|
|
189
|
+
window.history.replaceState(null, "", href);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
window.history.pushState(null, "", href);
|
|
193
|
+
}
|
|
194
|
+
// Update location and clear navigating state after navigation
|
|
195
|
+
// Use requestAnimationFrame to allow the new page to start rendering
|
|
196
|
+
requestAnimationFrame(() => {
|
|
197
|
+
updateLocation(false);
|
|
198
|
+
// Scroll to top if enabled
|
|
199
|
+
if (scrollToTop) {
|
|
200
|
+
window.scrollTo({ top: 0, left: 0, behavior: "smooth" });
|
|
201
|
+
}
|
|
202
|
+
// Emit navigation event after navigation completes
|
|
203
|
+
routerEventEmitter.emit("navigation", { from, to });
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Check if a URL is external (different origin).
|
|
208
|
+
*/
|
|
209
|
+
function isExternalUrl(href) {
|
|
210
|
+
if (typeof window === "undefined") {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
const url = new URL(href, window.location.origin);
|
|
215
|
+
return url.origin !== window.location.origin;
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// Store routes globally for prefetching (set by AppRouter)
|
|
222
|
+
let globalRoutes = [];
|
|
223
|
+
/**
|
|
224
|
+
* Client-side navigation link.
|
|
225
|
+
*
|
|
226
|
+
* Intercepts left-clicks and uses the router's navigation helpers for SPA
|
|
227
|
+
* navigation. Keeps normal anchor behaviour when modifier keys are used
|
|
228
|
+
* or when the link is external.
|
|
229
|
+
*
|
|
230
|
+
* Automatically prefetches page chunks on hover for faster navigation.
|
|
231
|
+
*/
|
|
232
|
+
export function Link(props) {
|
|
233
|
+
const { prefetch = true, scrollToTop = true } = props;
|
|
234
|
+
const onClick = (e) => {
|
|
235
|
+
if (e.defaultPrevented ||
|
|
236
|
+
e.button !== 0 || // only left click
|
|
237
|
+
e.metaKey ||
|
|
238
|
+
e.ctrlKey ||
|
|
239
|
+
e.shiftKey ||
|
|
240
|
+
e.altKey ||
|
|
241
|
+
isExternalUrl(props.href) // let browser handle external links
|
|
242
|
+
) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
e.preventDefault();
|
|
246
|
+
navigate(props.href, { replace: props.replace, scrollToTop });
|
|
247
|
+
props.onClick?.(e);
|
|
248
|
+
};
|
|
249
|
+
const onMouseEnter = async (e) => {
|
|
250
|
+
// Prefetch the route on hover if enabled and not external (lazy-load prefetch logic)
|
|
251
|
+
if (prefetch && !isExternalUrl(props.href) && globalRoutes.length > 0) {
|
|
252
|
+
const { prefetchRoute } = await import("./prefetch.js");
|
|
253
|
+
prefetchRoute(props.href, globalRoutes);
|
|
254
|
+
}
|
|
255
|
+
props.onMouseEnter?.(e);
|
|
256
|
+
};
|
|
257
|
+
const onFocus = async (e) => {
|
|
258
|
+
// Also prefetch on focus (keyboard navigation)
|
|
259
|
+
if (prefetch && !isExternalUrl(props.href) && globalRoutes.length > 0) {
|
|
260
|
+
const { prefetchRoute } = await import("./prefetch.js");
|
|
261
|
+
prefetchRoute(props.href, globalRoutes);
|
|
262
|
+
}
|
|
263
|
+
props.onFocus?.(e);
|
|
264
|
+
};
|
|
265
|
+
const { children, href, className, prefetch: _prefetch, scrollToTop: _scrollToTop, ...safeProps } = props;
|
|
266
|
+
return (_jsx("a", { href: href, onClick: onClick, onMouseEnter: onMouseEnter, onFocus: onFocus, className: className, ...safeProps, children: children }));
|
|
267
|
+
}
|
|
268
|
+
// Main router component
|
|
269
|
+
export function AppRouter({ AppShell }) {
|
|
270
|
+
// useTransition for concurrent rendering - allows React to keep UI responsive during navigation
|
|
271
|
+
const [isPending, startTransition] = useTransition();
|
|
272
|
+
// Build routes once on mount (client-side only)
|
|
273
|
+
const { routes, NotFound } = useMemo(() => {
|
|
274
|
+
if (typeof window === "undefined") {
|
|
275
|
+
return { routes: [], NotFound: undefined };
|
|
276
|
+
}
|
|
277
|
+
const result = buildRoutes();
|
|
278
|
+
// Store routes globally for Link prefetching
|
|
279
|
+
globalRoutes = result.routes;
|
|
280
|
+
return result;
|
|
281
|
+
}, []);
|
|
282
|
+
// Use useSyncExternalStore to subscribe to location changes
|
|
283
|
+
// This ensures synchronous updates when location changes
|
|
284
|
+
const state = useSyncExternalStore(subscribeToLocation, getLocationSnapshot, getServerSnapshot);
|
|
285
|
+
const match = useMemo(() => matchRoute(state.path, routes), [state.path, routes]);
|
|
286
|
+
const routerValue = {
|
|
287
|
+
path: state.path,
|
|
288
|
+
params: match?.params ?? {},
|
|
289
|
+
searchParams: state.searchParams,
|
|
290
|
+
push: (href, options) => {
|
|
291
|
+
// Wrap navigation in startTransition for smoother updates
|
|
292
|
+
startTransition(() => {
|
|
293
|
+
navigate(href, { scrollToTop: options?.scrollToTop });
|
|
294
|
+
});
|
|
295
|
+
},
|
|
296
|
+
replace: (href, options) => {
|
|
297
|
+
startTransition(() => {
|
|
298
|
+
navigate(href, { replace: true, scrollToTop: options?.scrollToTop });
|
|
299
|
+
});
|
|
300
|
+
},
|
|
301
|
+
on: (event, listener) => routerEventEmitter.on(event, listener),
|
|
302
|
+
status: match ? 200 : 404,
|
|
303
|
+
isNavigating: state.isNavigating,
|
|
304
|
+
isPending,
|
|
305
|
+
};
|
|
306
|
+
if (!match) {
|
|
307
|
+
const NotFoundComp = NotFound ?? (() => _jsx("div", { children: "Not found" }));
|
|
308
|
+
const content = _jsx(NotFoundComp, {});
|
|
309
|
+
return _jsx(RouterContext.Provider, { value: routerValue, children: AppShell ? _jsx(AppShell, { Component: NotFoundComp, pageProps: {} }) : content });
|
|
310
|
+
}
|
|
311
|
+
const Page = match.route.Component;
|
|
312
|
+
const pageProps = {
|
|
313
|
+
params: match.params,
|
|
314
|
+
searchParams: state.searchParams,
|
|
315
|
+
};
|
|
316
|
+
// Create a wrapped component that includes all layouts
|
|
317
|
+
const WrappedPage = () => {
|
|
318
|
+
let content = _jsx(Page, { ...pageProps });
|
|
319
|
+
// Wrap page with layouts (from outer to inner)
|
|
320
|
+
for (let i = match.route.layouts.length - 1; i >= 0; i--) {
|
|
321
|
+
const Layout = match.route.layouts[i];
|
|
322
|
+
content = _jsx(Layout, { children: content });
|
|
323
|
+
}
|
|
324
|
+
return content;
|
|
325
|
+
};
|
|
326
|
+
const finalContent = AppShell ? _jsx(AppShell, { Component: WrappedPage, pageProps: {} }) : _jsx(WrappedPage, {});
|
|
327
|
+
return _jsx(RouterContext.Provider, { value: routerValue, children: finalContent });
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=Router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Router.js","sourceRoot":"","sources":["../../src/client/Router.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function cacheKey(methodId: string, args: unknown): string;
|
|
2
|
+
export declare function get<T>(key: string): T | undefined;
|
|
3
|
+
export declare function set(key: string, value: unknown, ttl?: number): void;
|
|
4
|
+
export declare function has(key: string): boolean;
|
|
5
|
+
export declare function invalidateByMethod(methodId: string): void;
|
|
6
|
+
export declare function subscribeInvalidations(listener: (methodId: string) => void): () => void;
|
|
7
|
+
export declare function invalidateAll(): void;
|
|
8
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/client/cache.ts"],"names":[],"mappings":"AAUA,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhE;AASD,wBAAgB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAYjD;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,QAM5D;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAYxC;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,QAalD;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,cAK1E;AAED,wBAAgB,aAAa,SAkB5B"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
const store = new Map();
|
|
2
|
+
const listeners = new Set();
|
|
3
|
+
const DEFAULT_TTL = 5 * 60 * 1000; // 5 minutes
|
|
4
|
+
export function cacheKey(methodId, args) {
|
|
5
|
+
return JSON.stringify([methodId, args ?? null]);
|
|
6
|
+
}
|
|
7
|
+
function isExpired(entry) {
|
|
8
|
+
if (!entry.ttl) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
return Date.now() - entry.timestamp > entry.ttl;
|
|
12
|
+
}
|
|
13
|
+
export function get(key) {
|
|
14
|
+
const entry = store.get(key);
|
|
15
|
+
if (!entry) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
if (isExpired(entry)) {
|
|
19
|
+
store.delete(key);
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
return entry.value;
|
|
23
|
+
}
|
|
24
|
+
export function set(key, value, ttl) {
|
|
25
|
+
store.set(key, {
|
|
26
|
+
value,
|
|
27
|
+
timestamp: Date.now(),
|
|
28
|
+
ttl: ttl ?? DEFAULT_TTL,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export function has(key) {
|
|
32
|
+
const entry = store.get(key);
|
|
33
|
+
if (!entry) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (isExpired(entry)) {
|
|
37
|
+
store.delete(key);
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
export function invalidateByMethod(methodId) {
|
|
43
|
+
let invalidated = false;
|
|
44
|
+
for (const key of store.keys()) {
|
|
45
|
+
if (key.startsWith(`["${methodId}"`)) {
|
|
46
|
+
store.delete(key);
|
|
47
|
+
invalidated = true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (invalidated || listeners.size) {
|
|
51
|
+
for (const listener of listeners) {
|
|
52
|
+
listener(methodId);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function subscribeInvalidations(listener) {
|
|
57
|
+
listeners.add(listener);
|
|
58
|
+
return () => {
|
|
59
|
+
listeners.delete(listener);
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export function invalidateAll() {
|
|
63
|
+
const methodIds = new Set();
|
|
64
|
+
for (const key of store.keys()) {
|
|
65
|
+
try {
|
|
66
|
+
const parsed = JSON.parse(key);
|
|
67
|
+
if (Array.isArray(parsed) && parsed.length > 0) {
|
|
68
|
+
methodIds.add(parsed[0]);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Ignore malformed keys
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
store.clear();
|
|
76
|
+
for (const methodId of methodIds) {
|
|
77
|
+
for (const listener of listeners) {
|
|
78
|
+
listener(methodId);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/client/cache.ts"],"names":[],"mappings":"AAMA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;AAC5C,MAAM,SAAS,GAAG,IAAI,GAAG,EAA8B,CAAC;AACxD,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAE/C,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,IAAa;IACpD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,SAAS,CAAC,KAAiB;IAChC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACb,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,GAAG,CAAI,GAAW;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,KAAK,CAAC,KAAsB,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,KAAc,EAAE,GAAY;IACzD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;QACX,KAAK;QACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,GAAG,EAAE,GAAG,IAAI,WAAW;KAC1B,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,GAAW;IAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IAC/C,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7B,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,QAAQ,GAAG,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClB,WAAW,GAAG,IAAI,CAAC;QACvB,CAAC;IACL,CAAC;IACD,IAAI,WAAW,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;QAChC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC/B,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACL,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAoC;IACvE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE;QACR,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,aAAa;IACzB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7C,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,wBAAwB;QAC5B,CAAC;IACL,CAAC;IACD,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC/B,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;IACL,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type { AppShellProps, LinkProps, RouterNavigationOptions } from "./Router.js";
|
|
2
|
+
export { AppRouter, Link, Redirect, RouterContext, useRouter } from "./Router.js";
|
|
3
|
+
export type { LayoutProps } from "./routerManifest.js";
|
|
4
|
+
export type { PageTransitionProps } from "./transitions.js";
|
|
5
|
+
export * from "./useCall.js";
|
|
6
|
+
export * from "./useFetch.js";
|
|
7
|
+
export type { RpcTransport } from "./rpcClient.js";
|
|
8
|
+
export { getRpcTransport, isAutoHttpOnMobileEnabled, preconnect } from "./rpcClient.js";
|
|
9
|
+
export * from "./types.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClF,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG5D,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAG9B,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGxF,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { AppRouter, Link, Redirect, RouterContext, useRouter } from "./Router.js";
|
|
2
|
+
// RPC hooks for data fetching and mutations
|
|
3
|
+
export * from "./useCall.js";
|
|
4
|
+
export * from "./useFetch.js";
|
|
5
|
+
export { getRpcTransport, isAutoHttpOnMobileEnabled, preconnect } from "./rpcClient.js";
|
|
6
|
+
// Type definitions
|
|
7
|
+
export * from "./types.js";
|
|
8
|
+
// Internal - rpcClient and cache are used by hooks, not exposed to users
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAOlF,4CAA4C;AAC5C,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAI9B,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAExF,mBAAmB;AACnB,cAAc,YAAY,CAAC;AAE3B,yEAAyE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RouteEntry } from "./routerManifest.js";
|
|
2
|
+
/**
|
|
3
|
+
* Prefetch a route's page component.
|
|
4
|
+
* Called on Link hover to preload page chunks before navigation.
|
|
5
|
+
*/
|
|
6
|
+
export declare function prefetchRoute(href: string, routes: RouteEntry[]): void;
|
|
7
|
+
/**
|
|
8
|
+
* Clear the prefetch cache.
|
|
9
|
+
* Useful for testing or forcing re-prefetch.
|
|
10
|
+
*/
|
|
11
|
+
export declare function clearPrefetchCache(): void;
|
|
12
|
+
//# sourceMappingURL=prefetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefetch.d.ts","sourceRoot":"","sources":["../../src/client/prefetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKtD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAoB/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,SAEjC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Prefetch cache to avoid duplicate preloads
|
|
2
|
+
const prefetchedRoutes = new Set();
|
|
3
|
+
/**
|
|
4
|
+
* Prefetch a route's page component.
|
|
5
|
+
* Called on Link hover to preload page chunks before navigation.
|
|
6
|
+
*/
|
|
7
|
+
export function prefetchRoute(href, routes) {
|
|
8
|
+
const pathname = href.split("?")[0];
|
|
9
|
+
// Skip if already prefetched
|
|
10
|
+
if (prefetchedRoutes.has(pathname)) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
// Find matching route
|
|
14
|
+
for (const route of routes) {
|
|
15
|
+
if (route.matcher(pathname)) {
|
|
16
|
+
prefetchedRoutes.add(pathname);
|
|
17
|
+
// Trigger the preload
|
|
18
|
+
route.preload().catch(() => {
|
|
19
|
+
// Remove from cache if preload fails so it can be retried
|
|
20
|
+
prefetchedRoutes.delete(pathname);
|
|
21
|
+
});
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Clear the prefetch cache.
|
|
28
|
+
* Useful for testing or forcing re-prefetch.
|
|
29
|
+
*/
|
|
30
|
+
export function clearPrefetchCache() {
|
|
31
|
+
prefetchedRoutes.clear();
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=prefetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefetch.js","sourceRoot":"","sources":["../../src/client/prefetch.ts"],"names":[],"mappings":"AAEA,6CAA6C;AAC7C,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,MAAoB;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpC,6BAA6B;IAC7B,IAAI,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,OAAO;IACX,CAAC;IAED,sBAAsB;IACtB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC/B,sBAAsB;YACtB,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;gBACvB,0DAA0D;gBAC1D,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YACH,MAAM;QACV,CAAC;IACL,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAC9B,gBAAgB,CAAC,KAAK,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ComponentType, LazyExoticComponent } from "react";
|
|
2
|
+
import React from "react";
|
|
3
|
+
export type LayoutProps = {
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
};
|
|
6
|
+
export type RouteEntry = {
|
|
7
|
+
pathPattern: string;
|
|
8
|
+
matcher: (path: string) => {
|
|
9
|
+
params: Record<string, string | string[]>;
|
|
10
|
+
} | null;
|
|
11
|
+
Component: ComponentType<unknown>;
|
|
12
|
+
LazyComponent: LazyExoticComponent<ComponentType<unknown>>;
|
|
13
|
+
layouts: ComponentType<LayoutProps>[];
|
|
14
|
+
preload: () => Promise<{
|
|
15
|
+
default: ComponentType<unknown>;
|
|
16
|
+
}>;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Build route manifest from pages directory
|
|
20
|
+
* Uses import.meta.glob to discover all page files
|
|
21
|
+
* Supports both eager and lazy loading for Suspense compatibility
|
|
22
|
+
*/
|
|
23
|
+
export declare function buildRoutes(): {
|
|
24
|
+
routes: RouteEntry[];
|
|
25
|
+
NotFound?: ComponentType<unknown>;
|
|
26
|
+
AppShell?: ComponentType<unknown>;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=routerManifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routerManifest.d.ts","sourceRoot":"","sources":["../../src/client/routerManifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,MAAM,WAAW,GAAG;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAChF,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAClC,aAAa,EAAE,mBAAmB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;IACtC,OAAO,EAAE,MAAM,OAAO,CAAC;QAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;CAC/D,CAAC;AAgIF;;;;GAIG;AACH,wBAAgB,WAAW,IAAI;IAC3B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CACrC,CAsJA"}
|