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.
Files changed (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +356 -0
  3. package/dist/bin/helium.d.ts +3 -0
  4. package/dist/bin/helium.d.ts.map +1 -0
  5. package/dist/bin/helium.js +236 -0
  6. package/dist/bin/helium.js.map +1 -0
  7. package/dist/client/Router.d.ts +83 -0
  8. package/dist/client/Router.d.ts.map +1 -0
  9. package/dist/client/Router.js +329 -0
  10. package/dist/client/Router.js.map +1 -0
  11. package/dist/client/cache.d.ts +8 -0
  12. package/dist/client/cache.d.ts.map +1 -0
  13. package/dist/client/cache.js +82 -0
  14. package/dist/client/cache.js.map +1 -0
  15. package/dist/client/index.d.ts +10 -0
  16. package/dist/client/index.d.ts.map +1 -0
  17. package/dist/client/index.js +9 -0
  18. package/dist/client/index.js.map +1 -0
  19. package/dist/client/prefetch.d.ts +12 -0
  20. package/dist/client/prefetch.d.ts.map +1 -0
  21. package/dist/client/prefetch.js +33 -0
  22. package/dist/client/prefetch.js.map +1 -0
  23. package/dist/client/routerManifest.d.ts +28 -0
  24. package/dist/client/routerManifest.d.ts.map +1 -0
  25. package/dist/client/routerManifest.js +242 -0
  26. package/dist/client/routerManifest.js.map +1 -0
  27. package/dist/client/rpcClient.d.ts +33 -0
  28. package/dist/client/rpcClient.d.ts.map +1 -0
  29. package/dist/client/rpcClient.js +383 -0
  30. package/dist/client/rpcClient.js.map +1 -0
  31. package/dist/client/transitions.d.ts +85 -0
  32. package/dist/client/transitions.d.ts.map +1 -0
  33. package/dist/client/transitions.js +92 -0
  34. package/dist/client/transitions.js.map +1 -0
  35. package/dist/client/types.d.ts +6 -0
  36. package/dist/client/types.d.ts.map +1 -0
  37. package/dist/client/types.js +2 -0
  38. package/dist/client/types.js.map +1 -0
  39. package/dist/client/useCall.d.ts +31 -0
  40. package/dist/client/useCall.d.ts.map +1 -0
  41. package/dist/client/useCall.js +40 -0
  42. package/dist/client/useCall.js.map +1 -0
  43. package/dist/client/useFetch.d.ts +34 -0
  44. package/dist/client/useFetch.d.ts.map +1 -0
  45. package/dist/client/useFetch.js +152 -0
  46. package/dist/client/useFetch.js.map +1 -0
  47. package/dist/index.d.ts +4 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +4 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/runtime/protocol.d.ts +25 -0
  52. package/dist/runtime/protocol.d.ts.map +1 -0
  53. package/dist/runtime/protocol.js +2 -0
  54. package/dist/runtime/protocol.js.map +1 -0
  55. package/dist/server/config.d.ts +216 -0
  56. package/dist/server/config.d.ts.map +1 -0
  57. package/dist/server/config.js +130 -0
  58. package/dist/server/config.js.map +1 -0
  59. package/dist/server/context.d.ts +38 -0
  60. package/dist/server/context.d.ts.map +1 -0
  61. package/dist/server/context.js +2 -0
  62. package/dist/server/context.js.map +1 -0
  63. package/dist/server/defineHTTPRequest.d.ts +49 -0
  64. package/dist/server/defineHTTPRequest.d.ts.map +1 -0
  65. package/dist/server/defineHTTPRequest.js +34 -0
  66. package/dist/server/defineHTTPRequest.js.map +1 -0
  67. package/dist/server/defineMethod.d.ts +20 -0
  68. package/dist/server/defineMethod.d.ts.map +1 -0
  69. package/dist/server/defineMethod.js +23 -0
  70. package/dist/server/defineMethod.js.map +1 -0
  71. package/dist/server/devServer.d.ts +15 -0
  72. package/dist/server/devServer.d.ts.map +1 -0
  73. package/dist/server/devServer.js +219 -0
  74. package/dist/server/devServer.js.map +1 -0
  75. package/dist/server/handlerLoader.d.ts +1 -0
  76. package/dist/server/handlerLoader.d.ts.map +1 -0
  77. package/dist/server/handlerLoader.js +2 -0
  78. package/dist/server/handlerLoader.js.map +1 -0
  79. package/dist/server/httpRouter.d.ts +17 -0
  80. package/dist/server/httpRouter.d.ts.map +1 -0
  81. package/dist/server/httpRouter.js +227 -0
  82. package/dist/server/httpRouter.js.map +1 -0
  83. package/dist/server/index.d.ts +11 -0
  84. package/dist/server/index.d.ts.map +1 -0
  85. package/dist/server/index.js +13 -0
  86. package/dist/server/index.js.map +1 -0
  87. package/dist/server/middleware.d.ts +30 -0
  88. package/dist/server/middleware.d.ts.map +1 -0
  89. package/dist/server/middleware.js +23 -0
  90. package/dist/server/middleware.js.map +1 -0
  91. package/dist/server/prodServer.d.ts +27 -0
  92. package/dist/server/prodServer.d.ts.map +1 -0
  93. package/dist/server/prodServer.js +301 -0
  94. package/dist/server/prodServer.js.map +1 -0
  95. package/dist/server/rateLimiter.d.ts +36 -0
  96. package/dist/server/rateLimiter.d.ts.map +1 -0
  97. package/dist/server/rateLimiter.js +113 -0
  98. package/dist/server/rateLimiter.js.map +1 -0
  99. package/dist/server/rpcRegistry.d.ts +34 -0
  100. package/dist/server/rpcRegistry.d.ts.map +1 -0
  101. package/dist/server/rpcRegistry.js +231 -0
  102. package/dist/server/rpcRegistry.js.map +1 -0
  103. package/dist/server/security.d.ts +5 -0
  104. package/dist/server/security.d.ts.map +1 -0
  105. package/dist/server/security.js +59 -0
  106. package/dist/server/security.js.map +1 -0
  107. package/dist/server/serializer.d.ts +9 -0
  108. package/dist/server/serializer.d.ts.map +1 -0
  109. package/dist/server/serializer.js +40 -0
  110. package/dist/server/serializer.js.map +1 -0
  111. package/dist/utils/envLoader.d.ts +27 -0
  112. package/dist/utils/envLoader.d.ts.map +1 -0
  113. package/dist/utils/envLoader.js +68 -0
  114. package/dist/utils/envLoader.js.map +1 -0
  115. package/dist/utils/ipExtractor.d.ts +59 -0
  116. package/dist/utils/ipExtractor.d.ts.map +1 -0
  117. package/dist/utils/ipExtractor.js +126 -0
  118. package/dist/utils/ipExtractor.js.map +1 -0
  119. package/dist/utils/logger.d.ts +2 -0
  120. package/dist/utils/logger.d.ts.map +1 -0
  121. package/dist/utils/logger.js +24 -0
  122. package/dist/utils/logger.js.map +1 -0
  123. package/dist/vite/heliumPlugin.d.ts +3 -0
  124. package/dist/vite/heliumPlugin.d.ts.map +1 -0
  125. package/dist/vite/heliumPlugin.js +294 -0
  126. package/dist/vite/heliumPlugin.js.map +1 -0
  127. package/dist/vite/index.d.ts +3 -0
  128. package/dist/vite/index.d.ts.map +1 -0
  129. package/dist/vite/index.js +3 -0
  130. package/dist/vite/index.js.map +1 -0
  131. package/dist/vite/paths.d.ts +8 -0
  132. package/dist/vite/paths.d.ts.map +1 -0
  133. package/dist/vite/paths.js +8 -0
  134. package/dist/vite/paths.js.map +1 -0
  135. package/dist/vite/scanner.d.ts +35 -0
  136. package/dist/vite/scanner.d.ts.map +1 -0
  137. package/dist/vite/scanner.js +167 -0
  138. package/dist/vite/scanner.js.map +1 -0
  139. package/dist/vite/ssg.d.ts +22 -0
  140. package/dist/vite/ssg.d.ts.map +1 -0
  141. package/dist/vite/ssg.js +547 -0
  142. package/dist/vite/ssg.js.map +1 -0
  143. package/dist/vite/virtualServerModule.d.ts +6 -0
  144. package/dist/vite/virtualServerModule.d.ts.map +1 -0
  145. package/dist/vite/virtualServerModule.js +82 -0
  146. package/dist/vite/virtualServerModule.js.map +1 -0
  147. 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":"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"}
@@ -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"}