alabjs 0.1.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.
Files changed (277) hide show
  1. package/dist/adapters/cloudflare.d.ts +31 -0
  2. package/dist/adapters/cloudflare.d.ts.map +1 -0
  3. package/dist/adapters/cloudflare.js +30 -0
  4. package/dist/adapters/cloudflare.js.map +1 -0
  5. package/dist/adapters/deno.d.ts +22 -0
  6. package/dist/adapters/deno.d.ts.map +1 -0
  7. package/dist/adapters/deno.js +21 -0
  8. package/dist/adapters/deno.js.map +1 -0
  9. package/dist/adapters/web.d.ts +47 -0
  10. package/dist/adapters/web.d.ts.map +1 -0
  11. package/dist/adapters/web.js +212 -0
  12. package/dist/adapters/web.js.map +1 -0
  13. package/dist/cli.d.ts +11 -0
  14. package/dist/cli.d.ts.map +1 -0
  15. package/dist/cli.js +61 -0
  16. package/dist/cli.js.map +1 -0
  17. package/dist/client/hooks.d.ts +119 -0
  18. package/dist/client/hooks.d.ts.map +1 -0
  19. package/dist/client/hooks.js +220 -0
  20. package/dist/client/hooks.js.map +1 -0
  21. package/dist/client/hooks.test.d.ts +2 -0
  22. package/dist/client/hooks.test.d.ts.map +1 -0
  23. package/dist/client/hooks.test.js +45 -0
  24. package/dist/client/hooks.test.js.map +1 -0
  25. package/dist/client/index.d.ts +6 -0
  26. package/dist/client/index.d.ts.map +1 -0
  27. package/dist/client/index.js +4 -0
  28. package/dist/client/index.js.map +1 -0
  29. package/dist/client/offline.d.ts +52 -0
  30. package/dist/client/offline.d.ts.map +1 -0
  31. package/dist/client/offline.js +90 -0
  32. package/dist/client/offline.js.map +1 -0
  33. package/dist/client/provider.d.ts +12 -0
  34. package/dist/client/provider.d.ts.map +1 -0
  35. package/dist/client/provider.js +10 -0
  36. package/dist/client/provider.js.map +1 -0
  37. package/dist/commands/build.d.ts +18 -0
  38. package/dist/commands/build.d.ts.map +1 -0
  39. package/dist/commands/build.js +173 -0
  40. package/dist/commands/build.js.map +1 -0
  41. package/dist/commands/dev.d.ts +8 -0
  42. package/dist/commands/dev.d.ts.map +1 -0
  43. package/dist/commands/dev.js +447 -0
  44. package/dist/commands/dev.js.map +1 -0
  45. package/dist/commands/info.d.ts +6 -0
  46. package/dist/commands/info.d.ts.map +1 -0
  47. package/dist/commands/info.js +92 -0
  48. package/dist/commands/info.js.map +1 -0
  49. package/dist/commands/ssg.d.ts +8 -0
  50. package/dist/commands/ssg.d.ts.map +1 -0
  51. package/dist/commands/ssg.js +124 -0
  52. package/dist/commands/ssg.js.map +1 -0
  53. package/dist/commands/start.d.ts +7 -0
  54. package/dist/commands/start.d.ts.map +1 -0
  55. package/dist/commands/start.js +26 -0
  56. package/dist/commands/start.js.map +1 -0
  57. package/dist/commands/test.d.ts +24 -0
  58. package/dist/commands/test.d.ts.map +1 -0
  59. package/dist/commands/test.js +87 -0
  60. package/dist/commands/test.js.map +1 -0
  61. package/dist/components/ErrorBoundary.d.ts +38 -0
  62. package/dist/components/ErrorBoundary.d.ts.map +1 -0
  63. package/dist/components/ErrorBoundary.js +46 -0
  64. package/dist/components/ErrorBoundary.js.map +1 -0
  65. package/dist/components/Font.d.ts +57 -0
  66. package/dist/components/Font.d.ts.map +1 -0
  67. package/dist/components/Font.js +33 -0
  68. package/dist/components/Font.js.map +1 -0
  69. package/dist/components/Image.d.ts +74 -0
  70. package/dist/components/Image.d.ts.map +1 -0
  71. package/dist/components/Image.js +85 -0
  72. package/dist/components/Image.js.map +1 -0
  73. package/dist/components/Link.d.ts +23 -0
  74. package/dist/components/Link.d.ts.map +1 -0
  75. package/dist/components/Link.js +48 -0
  76. package/dist/components/Link.js.map +1 -0
  77. package/dist/components/Script.d.ts +37 -0
  78. package/dist/components/Script.d.ts.map +1 -0
  79. package/dist/components/Script.js +70 -0
  80. package/dist/components/Script.js.map +1 -0
  81. package/dist/components/index.d.ts +10 -0
  82. package/dist/components/index.d.ts.map +1 -0
  83. package/dist/components/index.js +6 -0
  84. package/dist/components/index.js.map +1 -0
  85. package/dist/i18n/i18n.test.d.ts +2 -0
  86. package/dist/i18n/i18n.test.d.ts.map +1 -0
  87. package/dist/i18n/i18n.test.js +132 -0
  88. package/dist/i18n/i18n.test.js.map +1 -0
  89. package/dist/i18n/index.d.ts +135 -0
  90. package/dist/i18n/index.d.ts.map +1 -0
  91. package/dist/i18n/index.js +189 -0
  92. package/dist/i18n/index.js.map +1 -0
  93. package/dist/index.d.ts +4 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +3 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/router/code-router.d.ts +204 -0
  98. package/dist/router/code-router.d.ts.map +1 -0
  99. package/dist/router/code-router.js +258 -0
  100. package/dist/router/code-router.js.map +1 -0
  101. package/dist/router/code-router.test.d.ts +2 -0
  102. package/dist/router/code-router.test.d.ts.map +1 -0
  103. package/dist/router/code-router.test.js +128 -0
  104. package/dist/router/code-router.test.js.map +1 -0
  105. package/dist/router/index.d.ts +4 -0
  106. package/dist/router/index.d.ts.map +1 -0
  107. package/dist/router/index.js +2 -0
  108. package/dist/router/index.js.map +1 -0
  109. package/dist/router/manifest.d.ts +12 -0
  110. package/dist/router/manifest.d.ts.map +1 -0
  111. package/dist/router/manifest.js +2 -0
  112. package/dist/router/manifest.js.map +1 -0
  113. package/dist/server/app.d.ts +13 -0
  114. package/dist/server/app.d.ts.map +1 -0
  115. package/dist/server/app.js +407 -0
  116. package/dist/server/app.js.map +1 -0
  117. package/dist/server/cache.d.ts +99 -0
  118. package/dist/server/cache.d.ts.map +1 -0
  119. package/dist/server/cache.js +161 -0
  120. package/dist/server/cache.js.map +1 -0
  121. package/dist/server/cache.test.d.ts +2 -0
  122. package/dist/server/cache.test.d.ts.map +1 -0
  123. package/dist/server/cache.test.js +150 -0
  124. package/dist/server/cache.test.js.map +1 -0
  125. package/dist/server/csrf.d.ts +28 -0
  126. package/dist/server/csrf.d.ts.map +1 -0
  127. package/dist/server/csrf.js +66 -0
  128. package/dist/server/csrf.js.map +1 -0
  129. package/dist/server/csrf.test.d.ts +2 -0
  130. package/dist/server/csrf.test.d.ts.map +1 -0
  131. package/dist/server/csrf.test.js +154 -0
  132. package/dist/server/csrf.test.js.map +1 -0
  133. package/dist/server/image.d.ts +18 -0
  134. package/dist/server/image.d.ts.map +1 -0
  135. package/dist/server/image.js +97 -0
  136. package/dist/server/image.js.map +1 -0
  137. package/dist/server/index.d.ts +57 -0
  138. package/dist/server/index.d.ts.map +1 -0
  139. package/dist/server/index.js +58 -0
  140. package/dist/server/index.js.map +1 -0
  141. package/dist/server/middleware.d.ts +53 -0
  142. package/dist/server/middleware.d.ts.map +1 -0
  143. package/dist/server/middleware.js +80 -0
  144. package/dist/server/middleware.js.map +1 -0
  145. package/dist/server/middleware.test.d.ts +2 -0
  146. package/dist/server/middleware.test.d.ts.map +1 -0
  147. package/dist/server/middleware.test.js +125 -0
  148. package/dist/server/middleware.test.js.map +1 -0
  149. package/dist/server/revalidate.d.ts +49 -0
  150. package/dist/server/revalidate.d.ts.map +1 -0
  151. package/dist/server/revalidate.js +62 -0
  152. package/dist/server/revalidate.js.map +1 -0
  153. package/dist/server/revalidate.test.d.ts +2 -0
  154. package/dist/server/revalidate.test.d.ts.map +1 -0
  155. package/dist/server/revalidate.test.js +93 -0
  156. package/dist/server/revalidate.test.js.map +1 -0
  157. package/dist/server/server-fn.test.d.ts +2 -0
  158. package/dist/server/server-fn.test.d.ts.map +1 -0
  159. package/dist/server/server-fn.test.js +105 -0
  160. package/dist/server/server-fn.test.js.map +1 -0
  161. package/dist/server/sitemap.d.ts +9 -0
  162. package/dist/server/sitemap.d.ts.map +1 -0
  163. package/dist/server/sitemap.js +26 -0
  164. package/dist/server/sitemap.js.map +1 -0
  165. package/dist/server/sitemap.test.d.ts +2 -0
  166. package/dist/server/sitemap.test.d.ts.map +1 -0
  167. package/dist/server/sitemap.test.js +61 -0
  168. package/dist/server/sitemap.test.js.map +1 -0
  169. package/dist/server/sse.d.ts +59 -0
  170. package/dist/server/sse.d.ts.map +1 -0
  171. package/dist/server/sse.js +91 -0
  172. package/dist/server/sse.js.map +1 -0
  173. package/dist/server/sse.test.d.ts +2 -0
  174. package/dist/server/sse.test.d.ts.map +1 -0
  175. package/dist/server/sse.test.js +68 -0
  176. package/dist/server/sse.test.js.map +1 -0
  177. package/dist/signals/index.d.ts +101 -0
  178. package/dist/signals/index.d.ts.map +1 -0
  179. package/dist/signals/index.js +149 -0
  180. package/dist/signals/index.js.map +1 -0
  181. package/dist/signals/signals.test.d.ts +2 -0
  182. package/dist/signals/signals.test.d.ts.map +1 -0
  183. package/dist/signals/signals.test.js +146 -0
  184. package/dist/signals/signals.test.js.map +1 -0
  185. package/dist/ssr/html.d.ts +27 -0
  186. package/dist/ssr/html.d.ts.map +1 -0
  187. package/dist/ssr/html.js +107 -0
  188. package/dist/ssr/html.js.map +1 -0
  189. package/dist/ssr/html.test.d.ts +2 -0
  190. package/dist/ssr/html.test.d.ts.map +1 -0
  191. package/dist/ssr/html.test.js +178 -0
  192. package/dist/ssr/html.test.js.map +1 -0
  193. package/dist/ssr/render.d.ts +46 -0
  194. package/dist/ssr/render.d.ts.map +1 -0
  195. package/dist/ssr/render.js +87 -0
  196. package/dist/ssr/render.js.map +1 -0
  197. package/dist/ssr/router-dev.d.ts +60 -0
  198. package/dist/ssr/router-dev.d.ts.map +1 -0
  199. package/dist/ssr/router-dev.js +205 -0
  200. package/dist/ssr/router-dev.js.map +1 -0
  201. package/dist/ssr/router-dev.test.d.ts +2 -0
  202. package/dist/ssr/router-dev.test.d.ts.map +1 -0
  203. package/dist/ssr/router-dev.test.js +189 -0
  204. package/dist/ssr/router-dev.test.js.map +1 -0
  205. package/dist/test/index.d.ts +93 -0
  206. package/dist/test/index.d.ts.map +1 -0
  207. package/dist/test/index.js +146 -0
  208. package/dist/test/index.js.map +1 -0
  209. package/dist/types/index.d.ts +117 -0
  210. package/dist/types/index.d.ts.map +1 -0
  211. package/dist/types/index.js +2 -0
  212. package/dist/types/index.js.map +1 -0
  213. package/dist/types/napi.d.ts +15 -0
  214. package/dist/types/napi.d.ts.map +1 -0
  215. package/dist/types/napi.js +2 -0
  216. package/dist/types/napi.js.map +1 -0
  217. package/package.json +107 -0
  218. package/src/adapters/cloudflare.ts +30 -0
  219. package/src/adapters/deno.ts +21 -0
  220. package/src/adapters/web.ts +259 -0
  221. package/src/cli.ts +68 -0
  222. package/src/client/hooks.test.ts +54 -0
  223. package/src/client/hooks.ts +329 -0
  224. package/src/client/index.ts +5 -0
  225. package/src/client/offline-sw.ts +191 -0
  226. package/src/client/offline.ts +114 -0
  227. package/src/client/provider.tsx +14 -0
  228. package/src/commands/build.ts +201 -0
  229. package/src/commands/dev.ts +509 -0
  230. package/src/commands/info.ts +111 -0
  231. package/src/commands/ssg.ts +177 -0
  232. package/src/commands/start.ts +32 -0
  233. package/src/commands/test.ts +102 -0
  234. package/src/components/ErrorBoundary.tsx +73 -0
  235. package/src/components/Font.tsx +100 -0
  236. package/src/components/Image.tsx +141 -0
  237. package/src/components/Link.tsx +64 -0
  238. package/src/components/Script.tsx +97 -0
  239. package/src/components/index.ts +9 -0
  240. package/src/i18n/i18n.test.tsx +169 -0
  241. package/src/i18n/index.tsx +256 -0
  242. package/src/index.ts +10 -0
  243. package/src/router/code-router.test.ts +146 -0
  244. package/src/router/code-router.tsx +459 -0
  245. package/src/router/index.ts +18 -0
  246. package/src/router/manifest.ts +13 -0
  247. package/src/server/app.ts +466 -0
  248. package/src/server/cache.test.ts +192 -0
  249. package/src/server/cache.ts +195 -0
  250. package/src/server/csrf.test.ts +199 -0
  251. package/src/server/csrf.ts +80 -0
  252. package/src/server/image.ts +112 -0
  253. package/src/server/index.ts +144 -0
  254. package/src/server/middleware.test.ts +151 -0
  255. package/src/server/middleware.ts +95 -0
  256. package/src/server/revalidate.test.ts +106 -0
  257. package/src/server/revalidate.ts +75 -0
  258. package/src/server/server-fn.test.ts +127 -0
  259. package/src/server/sitemap.test.ts +68 -0
  260. package/src/server/sitemap.ts +30 -0
  261. package/src/server/sse.test.ts +81 -0
  262. package/src/server/sse.ts +110 -0
  263. package/src/signals/index.ts +177 -0
  264. package/src/signals/signals.test.ts +164 -0
  265. package/src/ssr/html.test.ts +200 -0
  266. package/src/ssr/html.ts +140 -0
  267. package/src/ssr/render.ts +144 -0
  268. package/src/ssr/router-dev.test.ts +230 -0
  269. package/src/ssr/router-dev.ts +229 -0
  270. package/src/test/index.ts +206 -0
  271. package/src/types/compiler.d.ts +25 -0
  272. package/src/types/index.ts +147 -0
  273. package/src/types/napi.ts +20 -0
  274. package/src/types/plugins.d.ts +3 -0
  275. package/tsconfig.json +11 -0
  276. package/tsconfig.tsbuildinfo +1 -0
  277. package/vitest.config.ts +32 -0
@@ -0,0 +1,258 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Alab Code-Based Router — type-safe client-side navigation.
4
+ *
5
+ * The file-system router stays the default (zero config). This module is
6
+ * opt-in for large apps that need IDE searchability, typed `href` props,
7
+ * search param schemas, and co-located loaders.
8
+ *
9
+ * Inspired by TanStack Router.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * // routes.ts
14
+ * import { createRoute, createRouter } from "alabjs/router";
15
+ * import { z } from "zod";
16
+ * import UserPage from "./app/users/[id]/page.js";
17
+ * import UserError from "./app/users/[id]/error.js";
18
+ *
19
+ * export const userRoute = createRoute({
20
+ * path: "/users/$id",
21
+ * search: z.object({ tab: z.enum(["posts", "about"]).optional() }),
22
+ * loader: ({ params }) => getUser(params.id),
23
+ * component: UserPage,
24
+ * errorComponent: UserError,
25
+ * });
26
+ *
27
+ * export const router = createRouter([userRoute]);
28
+ * ```
29
+ *
30
+ * ```tsx
31
+ * // app/layout.tsx
32
+ * import { RouterProvider } from "alabjs/router";
33
+ * import { router } from "../routes.js";
34
+ *
35
+ * export default function RootLayout({ children }) {
36
+ * return <RouterProvider router={router}>{children}</RouterProvider>;
37
+ * }
38
+ * ```
39
+ */
40
+ import { createContext, useContext, useState, useEffect, useCallback, } from "react";
41
+ /**
42
+ * Define a type-safe route.
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * export const postRoute = createRoute({
47
+ * path: "/posts/$id",
48
+ * loader: ({ params }) => fetchPost(params.id),
49
+ * component: PostPage,
50
+ * });
51
+ * ```
52
+ */
53
+ export function createRoute(config) {
54
+ const paramNames = [];
55
+ const regexStr = config.path
56
+ .split("/")
57
+ .map((seg) => {
58
+ if (seg.startsWith("$")) {
59
+ paramNames.push(seg.slice(1));
60
+ return "([^/]+)";
61
+ }
62
+ return seg.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
63
+ })
64
+ .join("/");
65
+ const regex = config.path === "/" ? /^\/$/ : new RegExp(`^${regexStr}\\/?$`);
66
+ return { ...config, _regex: regex, _paramNames: paramNames };
67
+ }
68
+ /** Assemble multiple routes into a router instance. */
69
+ export function createRouter(routes) {
70
+ // Sort: static routes before dynamic ones (fewer params = higher priority).
71
+ const sorted = [...routes].sort((a, b) => a._paramNames.length - b._paramNames.length);
72
+ return { routes: sorted };
73
+ }
74
+ const RouterCtx = createContext(null);
75
+ function useRouterCtx() {
76
+ const ctx = useContext(RouterCtx);
77
+ if (!ctx)
78
+ throw new Error("[alabjs] useParams / useSearch / navigate must be used inside <RouterProvider>");
79
+ return ctx;
80
+ }
81
+ // ─── Route matching ───────────────────────────────────────────────────────────
82
+ function matchRoute(routes, pathname) {
83
+ for (const route of routes) {
84
+ const match = route._regex.exec(pathname);
85
+ if (match) {
86
+ const params = {};
87
+ route._paramNames.forEach((name, i) => {
88
+ params[name] = decodeURIComponent(match[i + 1] ?? "");
89
+ });
90
+ return { route, params };
91
+ }
92
+ }
93
+ return null;
94
+ }
95
+ function parseSearch(searchStr, schema) {
96
+ const raw = Object.fromEntries(new URLSearchParams(searchStr).entries());
97
+ if (!schema)
98
+ return raw;
99
+ const result = schema.safeParse(raw);
100
+ return result.success ? result.data : raw;
101
+ }
102
+ /**
103
+ * Wrap your root layout with `RouterProvider` to enable typed navigation.
104
+ *
105
+ * @example
106
+ * ```tsx
107
+ * import { RouterProvider } from "alabjs/router";
108
+ * import { router } from "../routes.js";
109
+ *
110
+ * export default function RootLayout({ children }) {
111
+ * return <RouterProvider router={router}>{children}</RouterProvider>;
112
+ * }
113
+ * ```
114
+ */
115
+ export function RouterProvider({ router, children }) {
116
+ const buildState = useCallback(async (pathname, search) => {
117
+ const matched = matchRoute(router.routes, pathname);
118
+ if (!matched) {
119
+ return {
120
+ pathname, search,
121
+ params: {},
122
+ searchParsed: parseSearch(search),
123
+ loaderData: undefined,
124
+ matchedRoute: null,
125
+ };
126
+ }
127
+ const { route, params } = matched;
128
+ const searchParsed = parseSearch(search, route.search);
129
+ let loaderData = undefined;
130
+ if (route.loader) {
131
+ loaderData = await route.loader({
132
+ params: params,
133
+ search: searchParsed,
134
+ });
135
+ }
136
+ return { pathname, search, params, searchParsed, loaderData, matchedRoute: route };
137
+ }, [router]);
138
+ const [state, setState] = useState({
139
+ pathname: typeof window !== "undefined" ? window.location.pathname : "/",
140
+ search: typeof window !== "undefined" ? window.location.search : "",
141
+ params: {},
142
+ searchParsed: {},
143
+ loaderData: undefined,
144
+ matchedRoute: null,
145
+ });
146
+ // Run loader for initial route.
147
+ useEffect(() => {
148
+ void buildState(window.location.pathname, window.location.search).then(setState);
149
+ }, [buildState]);
150
+ // Intercept Alab's SPA navigate events.
151
+ useEffect(() => {
152
+ const handler = () => {
153
+ void buildState(window.location.pathname, window.location.search).then(setState);
154
+ };
155
+ window.addEventListener("popstate", handler);
156
+ return () => window.removeEventListener("popstate", handler);
157
+ }, [buildState]);
158
+ const navigate = useCallback((href) => {
159
+ if (typeof window !== "undefined" && "__alabjs_navigate" in window) {
160
+ window.__alabjs_navigate(href);
161
+ }
162
+ else {
163
+ window.location.href = href;
164
+ }
165
+ void buildState(href.split("?")[0] ?? href, href.includes("?") ? href.split("?")[1] ?? "" : "").then(setState);
166
+ }, [buildState]);
167
+ return (_jsx(RouterCtx.Provider, { value: { ...state, navigate }, children: children }));
168
+ }
169
+ // ─── Hooks ────────────────────────────────────────────────────────────────────
170
+ /**
171
+ * Access typed path params for a specific route.
172
+ *
173
+ * @example
174
+ * ```tsx
175
+ * const params = useParams(userRoute);
176
+ * params.id; // string ✅
177
+ * params.foo; // TS error ✅
178
+ * ```
179
+ */
180
+ export function useParams(_route) {
181
+ return useRouterCtx().params;
182
+ }
183
+ /**
184
+ * Access typed, schema-validated search params for a specific route.
185
+ *
186
+ * @example
187
+ * ```tsx
188
+ * const search = useSearch(postRoute);
189
+ * search.tab; // "posts" | "about" | undefined ✅
190
+ * ```
191
+ */
192
+ export function useSearch(_route) {
193
+ return useRouterCtx().searchParsed;
194
+ }
195
+ /**
196
+ * Access the data returned by the route's `loader` function.
197
+ *
198
+ * @example
199
+ * ```tsx
200
+ * const user = useLoaderData(userRoute);
201
+ * user.name; // typed from loader return ✅
202
+ * ```
203
+ */
204
+ export function useLoaderData(_route) {
205
+ return useRouterCtx().loaderData;
206
+ }
207
+ /**
208
+ * Returns a typed `navigate` function.
209
+ *
210
+ * @example
211
+ * ```tsx
212
+ * const nav = useNavigate();
213
+ * nav("/users/42");
214
+ * nav("/users/42?tab=posts");
215
+ * ```
216
+ */
217
+ export function useNavigate() {
218
+ return useRouterCtx().navigate;
219
+ }
220
+ /**
221
+ * A type-safe `<Link>` bound to a route descriptor.
222
+ * Compile-time error if required params are missing or wrong type.
223
+ *
224
+ * @example
225
+ * ```tsx
226
+ * <RouteLink to={userRoute} params={{ id: "42" }}>
227
+ * View user
228
+ * </RouteLink>
229
+ * ```
230
+ */
231
+ export function RouteLink({ to, params, search, children, onClick, ...rest }) {
232
+ const { navigate } = useRouterCtx();
233
+ // Build href from route path + params + search.
234
+ const href = buildHref(to.path, params, search);
235
+ const handleClick = (e) => {
236
+ onClick?.(e);
237
+ if (e.defaultPrevented)
238
+ return;
239
+ if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey)
240
+ return;
241
+ e.preventDefault();
242
+ navigate(href);
243
+ };
244
+ return (_jsx("a", { href: href, onClick: handleClick, ...rest, children: children }));
245
+ }
246
+ function buildHref(path, params, search) {
247
+ let resolved = path;
248
+ if (params) {
249
+ for (const [k, v] of Object.entries(params)) {
250
+ resolved = resolved.replace(`$${k}`, encodeURIComponent(v));
251
+ }
252
+ }
253
+ if (search && Object.keys(search).length > 0) {
254
+ resolved += "?" + new URLSearchParams(Object.fromEntries(Object.entries(search).map(([k, v]) => [k, String(v)]))).toString();
255
+ }
256
+ return resolved;
257
+ }
258
+ //# sourceMappingURL=code-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-router.js","sourceRoot":"","sources":["../../src/router/code-router.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=code-router.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-router.test.d.ts","sourceRoot":"","sources":["../../src/router/code-router.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,128 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { createRoute, createRouter } from "./code-router.js";
3
+ // ─── createRoute ──────────────────────────────────────────────────────────────
4
+ describe("createRoute", () => {
5
+ it("creates a route descriptor with regex and param names", () => {
6
+ const route = createRoute({
7
+ path: "/users/$id",
8
+ component: () => null,
9
+ });
10
+ expect(route._regex).toBeInstanceOf(RegExp);
11
+ expect(route._paramNames).toEqual(["id"]);
12
+ });
13
+ it("matches static paths", () => {
14
+ const route = createRoute({
15
+ path: "/about",
16
+ component: () => null,
17
+ });
18
+ expect(route._regex.test("/about")).toBe(true);
19
+ expect(route._regex.test("/about/")).toBe(true);
20
+ expect(route._regex.test("/other")).toBe(false);
21
+ });
22
+ it("matches dynamic segments", () => {
23
+ const route = createRoute({
24
+ path: "/users/$id",
25
+ component: () => null,
26
+ });
27
+ expect(route._regex.test("/users/42")).toBe(true);
28
+ expect(route._regex.test("/users/abc")).toBe(true);
29
+ expect(route._regex.test("/users")).toBe(false);
30
+ expect(route._regex.test("/users/42/extra")).toBe(false);
31
+ });
32
+ it("extracts multiple params", () => {
33
+ const route = createRoute({
34
+ path: "/posts/$slug/comments/$commentId",
35
+ component: () => null,
36
+ });
37
+ expect(route._paramNames).toEqual(["slug", "commentId"]);
38
+ const match = route._regex.exec("/posts/hello-world/comments/99");
39
+ expect(match).not.toBe(null);
40
+ expect(match[1]).toBe("hello-world");
41
+ expect(match[2]).toBe("99");
42
+ });
43
+ it("matches root path", () => {
44
+ const route = createRoute({
45
+ path: "/",
46
+ component: () => null,
47
+ });
48
+ expect(route._regex.test("/")).toBe(true);
49
+ expect(route._regex.test("/other")).toBe(false);
50
+ expect(route._paramNames).toEqual([]);
51
+ });
52
+ it("escapes special regex characters in static segments", () => {
53
+ const route = createRoute({
54
+ path: "/search.html",
55
+ component: () => null,
56
+ });
57
+ expect(route._regex.test("/search.html")).toBe(true);
58
+ expect(route._regex.test("/searchXhtml")).toBe(false);
59
+ });
60
+ it("preserves config properties", () => {
61
+ const component = () => null;
62
+ const loader = async () => ({ data: true });
63
+ const route = createRoute({
64
+ path: "/test",
65
+ component,
66
+ loader,
67
+ });
68
+ expect(route.component).toBe(component);
69
+ expect(route.loader).toBe(loader);
70
+ expect(route.path).toBe("/test");
71
+ });
72
+ });
73
+ // ─── createRouter ─────────────────────────────────────────────────────────────
74
+ describe("createRouter", () => {
75
+ it("returns a router with sorted routes", () => {
76
+ const staticRoute = createRoute({ path: "/users/new", component: () => null });
77
+ const dynamicRoute = createRoute({ path: "/users/$id", component: () => null });
78
+ const router = createRouter([dynamicRoute, staticRoute]);
79
+ // Static route (0 params) should come first
80
+ expect(router.routes[0]._paramNames).toHaveLength(0);
81
+ expect(router.routes[1]._paramNames).toHaveLength(1);
82
+ });
83
+ it("handles empty routes array", () => {
84
+ const router = createRouter([]);
85
+ expect(router.routes).toEqual([]);
86
+ });
87
+ it("preserves routes with equal param counts", () => {
88
+ const a = createRoute({ path: "/users/$id", component: () => null });
89
+ const b = createRoute({ path: "/posts/$slug", component: () => null });
90
+ const router = createRouter([a, b]);
91
+ expect(router.routes).toHaveLength(2);
92
+ });
93
+ });
94
+ // ─── Route matching via regex ─────────────────────────────────────────────────
95
+ describe("route matching", () => {
96
+ it("dynamic route captures params correctly", () => {
97
+ const route = createRoute({
98
+ path: "/users/$id",
99
+ component: () => null,
100
+ });
101
+ const match = route._regex.exec("/users/42");
102
+ expect(match).not.toBe(null);
103
+ const params = {};
104
+ route._paramNames.forEach((name, i) => {
105
+ params[name] = decodeURIComponent(match[i + 1]);
106
+ });
107
+ expect(params).toEqual({ id: "42" });
108
+ });
109
+ it("handles encoded URI components in params", () => {
110
+ const route = createRoute({
111
+ path: "/posts/$slug",
112
+ component: () => null,
113
+ });
114
+ const match = route._regex.exec("/posts/hello%20world");
115
+ expect(match).not.toBe(null);
116
+ expect(decodeURIComponent(match[1])).toBe("hello world");
117
+ });
118
+ it("multiple dynamic routes in router — first match wins", () => {
119
+ const staticRoute = createRoute({ path: "/users/admin", component: () => null });
120
+ const dynamicRoute = createRoute({ path: "/users/$id", component: () => null });
121
+ const router = createRouter([dynamicRoute, staticRoute]);
122
+ // Static should be first in sorted order (0 params)
123
+ const first = router.routes[0];
124
+ expect(first._regex.test("/users/admin")).toBe(true);
125
+ expect(first._paramNames).toHaveLength(0);
126
+ });
127
+ });
128
+ //# sourceMappingURL=code-router.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-router.test.js","sourceRoot":"","sources":["../../src/router/code-router.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type { Route, RouteKind, RouteManifest } from "./manifest.js";
2
+ export { createRoute, createRouter, RouterProvider, RouteLink, useParams, useSearch, useLoaderData, useNavigate, } from "./code-router.js";
3
+ export type { RouteDescriptor, RouteConfig, RouteParams, Router, RouterProviderProps, } from "./code-router.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EACL,WAAW,EACX,YAAY,EACZ,cAAc,EACd,SAAS,EACT,SAAS,EACT,SAAS,EACT,aAAa,EACb,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,eAAe,EACf,WAAW,EACX,WAAW,EACX,MAAM,EACN,mBAAmB,GACpB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createRoute, createRouter, RouterProvider, RouteLink, useParams, useSearch, useLoaderData, useNavigate, } from "./code-router.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,YAAY,EACZ,cAAc,EACd,SAAS,EACT,SAAS,EACT,SAAS,EACT,aAAa,EACb,WAAW,GACZ,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type RouteKind = "page" | "server" | "layout" | "error" | "loading" | "api";
2
+ export interface Route {
3
+ path: string;
4
+ file: string;
5
+ kind: RouteKind;
6
+ ssr: boolean;
7
+ params: string[];
8
+ }
9
+ export interface RouteManifest {
10
+ routes: Route[];
11
+ }
12
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/router/manifest.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC;AAEnF,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/router/manifest.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import type { RouteManifest } from "../router/manifest.js";
2
+ export interface AlabApp {
3
+ listen(port?: number): void;
4
+ }
5
+ /**
6
+ * Create and return an Alab HTTP application backed by H3.
7
+ *
8
+ * In production (`alab start`), this is the entry point.
9
+ * In development, Vite's dev server wraps the SSR logic directly via the
10
+ * dev command middleware — this function is not used in dev.
11
+ */
12
+ export declare function createApp(manifest: RouteManifest, distDir: string): AlabApp;
13
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAwD3D,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAyY3E"}