@fresho/router 0.3.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -39,7 +39,7 @@ export default { fetch: api.handler() };
39
39
 
40
40
  ## Features
41
41
 
42
- - **Type-safe path params** — `$id` creates dynamic segments, typed via `route.ctx<>()`
42
+ - **Type-safe path params** — `$id` creates dynamic segments whose names are inferred by handlers and clients
43
43
  - **Schema validation** — query and body validated at runtime, typed at compile time
44
44
  - **Property-based routing** — property names become URL segments
45
45
  - **Typed HTTP client** — call your API with full type safety
@@ -210,7 +210,7 @@ const api = router(
210
210
  );
211
211
  ```
212
212
 
213
- Built-in middleware: `cors`, `errorHandler`, `logger`, `rateLimit`, `requestId`, `timeout`, `basicAuth`, `bearerAuth`, `jwtAuth`, `contentType`.
213
+ Built-in middleware: `cors`, `errorHandler`, `logger`, `rateLimit`, `requestId`, `timeout`, `basicAuth`, `bearerAuth`, `jwtAuth`, `contentType`, `cookies`.
214
214
 
215
215
  See **[Middleware Documentation](docs/middleware.md)** for detailed usage.
216
216
 
@@ -278,6 +278,26 @@ await client.users.$get(); // GET /users
278
278
  await client.users.$post({ body: { name: "Bob" } }); // POST /users
279
279
  ```
280
280
 
281
+ The `$id` segment determines the `id` key in the client's `path` option, so missing or misspelled
282
+ parameter names are caught at compile time.
283
+
284
+ ### Routers Built by a Factory
285
+
286
+ If your router is created inside a factory so its handlers can close over injected dependencies,
287
+ derive the API type from the factory's return type. The type-only import keeps server code out of the
288
+ client bundle:
289
+
290
+ ```typescript
291
+ import { createHttpClient } from "@fresho/router";
292
+ import type { createServer } from "./server";
293
+
294
+ type Api = ReturnType<typeof createServer>["api"];
295
+
296
+ const client = createHttpClient<Api>({
297
+ baseUrl: "https://api.example.com",
298
+ });
299
+ ```
300
+
281
301
  ### HTTP Method Syntax
282
302
 
283
303
  HTTP methods are prefixed with `$` to distinguish them from path navigation:
@@ -295,6 +315,27 @@ client.api.get.$get(); // GET /api/get (navigate to "get", then execute GET)
295
315
 
296
316
  This allows routes with path segments named after HTTP methods (e.g., `/api/get`, `/resources/delete`).
297
317
 
318
+ ### Building URLs Without Fetching
319
+
320
+ Use `$url` to derive a URL string from the typed routes without firing a request. It accepts the
321
+ same `path`/`query` options as a real call, including the parameter names inferred from `$id`
322
+ segments:
323
+
324
+ ```typescript
325
+ // Absolute URL when baseUrl is configured:
326
+ client.media.playlist.$url({ query: { channel: "classics", chunks: 1 } });
327
+ // → "https://api.example.com/media/playlist?channel=classics&chunks=1"
328
+
329
+ client.users.$id.$url({ path: { id: "123" } });
330
+ // → "https://api.example.com/users/123"
331
+
332
+ // Relative URL (pathname + search) when no baseUrl is set:
333
+ createHttpClient<typeof api>({}).users.$id.$url({ path: { id: "123" } });
334
+ // → "/users/123"
335
+ ```
336
+
337
+ This keeps route paths as the single source of truth for URLs embedded in response bodies, deep links, or server-side URL generation — cases where `raw: true` can't help, since `Response.url` only exists after a request runs.
338
+
298
339
  ## Local Client
299
340
 
300
341
  Test handlers directly without HTTP overhead:
@@ -336,16 +377,36 @@ const docs = router({
336
377
  ```typescript
337
378
  import { sseResponse } from "@fresho/router";
338
379
 
380
+ export interface ItemEvents {
381
+ message: { connected: boolean };
382
+ update: { count: number };
383
+ removed: { id: string };
384
+ }
385
+
339
386
  events: router({
340
387
  get: async () =>
341
- sseResponse(async (send, close) => {
342
- send({ data: "connected" });
388
+ sseResponse<ItemEvents>(async (send, close) => {
389
+ send({ data: { connected: true } });
343
390
  send({ event: "update", data: { count: 1 } });
391
+ send({ event: "removed", data: { id: "item-1" } });
344
392
  close();
345
393
  }),
346
394
  });
347
395
  ```
348
396
 
397
+ The event map checks event names and their corresponding payloads. The reserved `message` key types
398
+ events that omit the `event` field. Export the map for consumers, or extract it from a typed client
399
+ method:
400
+
401
+ ```typescript
402
+ import type { SSEEventsOf } from "@fresho/router";
403
+
404
+ type ClientEvents = SSEEventsOf<ReturnType<typeof client.events>>;
405
+ ```
406
+
407
+ HTTP and local clients return streaming routes as raw `Response` objects instead of parsing their
408
+ bodies as JSON, so callers can consume `response.body` as data arrives.
409
+
349
410
  ### JSON Lines
350
411
 
351
412
  ```typescript
package/dist/index.d.mts CHANGED
@@ -75,7 +75,7 @@ interface CtxBuilder<Ctx> {
75
75
  * export default { fetch: api.handler() };
76
76
  * ```
77
77
  */
78
- declare function router<T extends RouterRoutes, M$1 extends Middleware<any>[]>(routes: T, ...middleware: M$1): Router<T>;
78
+ declare function router<T extends RouterRoutes, M extends Middleware<any>[]>(routes: T, ...middleware: M): Router<T>;
79
79
  //#endregion
80
80
  //#region src/docs.d.ts
81
81
  /** Generates OpenAPI documentation from a router. */
@@ -92,7 +92,7 @@ type LowercaseMethods = 'get' | 'post' | 'put' | 'patch' | 'delete';
92
92
  /** Map lowercase method to $-prefixed version. */
93
93
  type PrefixedMethod<T extends LowercaseMethods> = T extends 'get' ? '$get' : T extends 'post' ? '$post' : T extends 'put' ? '$put' : T extends 'patch' ? '$patch' : T extends 'delete' ? '$delete' : never;
94
94
  /** Extract return type from a handler. */
95
- type ExtractReturn<T> = T extends ((...args: unknown[]) => infer R) ? R extends Promise<infer U> ? U : R : unknown;
95
+ type ExtractReturn<T> = T extends ((...args: never[]) => infer R) ? R extends Promise<infer U> ? U : R : unknown;
96
96
  /** Detects if a type is `any`. */
97
97
  type IsAny<T> = 0 extends 1 & T ? true : false;
98
98
  /** Checks if a schema type should require a property. */
@@ -102,7 +102,7 @@ type SafeInferSchema<T> = IsAny<T> extends true ? {} : keyof T extends never ? {
102
102
  /** Check if router tree contains any $param properties. */
103
103
  type HasParams<Path extends string[]> = Path extends [infer Head, ...infer Rest extends string[]] ? Head extends `$${string}` ? true : HasParams<Rest> : false;
104
104
  /** Extract the MethodEntry part from a union type. */
105
- type ExtractMethod<T> = Extract<T, RouteDefinition<any, any, any, any, any> | ((...args: unknown[]) => unknown)>;
105
+ type ExtractMethod<T> = T extends RouteDefinition<infer _Q, infer _B, infer _R, infer _P, infer _Ctx> ? T : T extends ((...args: never[]) => unknown) ? T : never;
106
106
  /** Remove string/number index signatures from a type. */
107
107
  type RemoveIndex<T> = { [K in keyof T as string extends K ? never : number extends K ? never : K]: T[K] };
108
108
  /** Header value that can be static or dynamic. */
@@ -116,8 +116,8 @@ interface BaseRequestOptions {
116
116
  /** Full request options including client-specific extras. */
117
117
  type RequestOptions<Extra> = BaseRequestOptions & Extra;
118
118
  /** Build options type based on whether path params are needed. */
119
- type BuildOptions<HasPathParams extends boolean, Q$1, B$1, Extra> = HasPathParams extends true ? {
120
- path: Record<string, string>;
119
+ type BuildOptions<Path extends string[], Q$1, B$1, Extra> = HasParams<Path> extends true ? {
120
+ path: CollectPathParams<Path>;
121
121
  } & (RequiresProperty<Q$1> extends true ? {
122
122
  query?: Q$1;
123
123
  } : {}) & (RequiresProperty<B$1> extends true ? {
@@ -128,19 +128,33 @@ type BuildOptions<HasPathParams extends boolean, Q$1, B$1, Extra> = HasPathParam
128
128
  body: B$1;
129
129
  } : {}) & Extra;
130
130
  /** Client type for a method entry (route or bare function). */
131
- type MethodClient<T, Extra, HasPathParams extends boolean = false> = T extends RouteDefinition<infer Q, infer B, infer R, any, any> ? (options?: BuildOptions<HasPathParams, SafeInferSchema<Q>, SafeInferSchema<B>, Extra>) => Promise<R> : T extends ((...args: unknown[]) => unknown) ? (options?: BuildOptions<HasPathParams, {}, {}, Extra>) => Promise<ExtractReturn<T>> : never;
131
+ type MethodClient<T, Extra, Path extends string[] = []> = T extends RouteDefinition<infer Q, infer B, infer R, infer _P, infer _Ctx> ? (options?: BuildOptions<Path, SafeInferSchema<Q>, SafeInferSchema<B>, Extra>) => Promise<R> : T extends ((...args: never[]) => unknown) ? (options?: BuildOptions<Path, {}, {}, Extra>) => Promise<ExtractReturn<T>> : never;
132
132
  /** Helper to extract return type for implicit GET calls. */
133
- type ImplicitGetCall<T extends RouterRoutes, Extra, Path extends string[] = []> = 'get' extends keyof T ? ExtractMethod<T['get']> extends RouteDefinition<infer _Q, infer _B, infer R, any, any> ? HasParams<Path> extends true ? (options: {
134
- path: Record<string, string>;
133
+ type ImplicitGetCall<T extends RouterRoutes, Extra, Path extends string[] = []> = 'get' extends keyof T ? ExtractMethod<T['get']> extends RouteDefinition<infer _Q, infer _B, infer R, infer _P, infer _Ctx> ? HasParams<Path> extends true ? (options: {
134
+ path: CollectPathParams<Path>;
135
135
  } & {
136
136
  query?: Record<string, unknown>;
137
- } & Extra) => Promise<R> : (options?: RequestOptions<Extra>) => Promise<R> : ExtractMethod<T['get']> extends ((...args: unknown[]) => unknown) ? HasParams<Path> extends true ? (options: {
138
- path: Record<string, string>;
137
+ } & Extra) => Promise<R> : (options?: RequestOptions<Extra>) => Promise<R> : ExtractMethod<T['get']> extends ((...args: never[]) => unknown) ? HasParams<Path> extends true ? (options: {
138
+ path: CollectPathParams<Path>;
139
139
  } & {
140
140
  query?: Record<string, unknown>;
141
141
  } & Extra) => Promise<ExtractReturn<ExtractMethod<T['get']>>> : (options?: RequestOptions<Extra>) => Promise<ExtractReturn<ExtractMethod<T['get']>>> : (options?: RequestOptions<Extra>) => Promise<unknown> : (options?: RequestOptions<Extra>) => Promise<unknown>;
142
+ /**
143
+ * Builds a URL string from the route path without executing a request.
144
+ *
145
+ * Path params are required when the path contains `$param` segments. Query
146
+ * params are always optional and untyped, since `$url` is method-agnostic.
147
+ */
148
+ type UrlMethod<Path extends string[]> = HasParams<Path> extends true ? (options: {
149
+ path: CollectPathParams<Path>;
150
+ query?: Record<string, unknown>;
151
+ }) => string : (options?: {
152
+ query?: Record<string, unknown>;
153
+ }) => string;
142
154
  /** Client type for a router. */
143
- type RouterClient<T extends RouterRoutes, Extra, Path extends string[] = []> = { [K in keyof RemoveIndex<T> as K extends LowercaseMethods ? PrefixedMethod<K> : never]: ExtractMethod<T[K]> extends infer M ? M extends RouteDefinition<any, any, any, any, any> | ((...args: unknown[]) => unknown) ? MethodClient<M, Extra, HasParams<Path>> : never : never } & { [K in keyof RemoveIndex<T>]: IsAny<T[K]> extends true ? never : Extract<T[K], Router<any>> extends infer R ? R extends Router<infer Routes> ? RouterClient<Routes, Extra, [...Path, K & string]> & ImplicitGetCall<Routes, Extra, [...Path, K & string]> : never : never } & ImplicitGetCall<T, Extra, Path>;
155
+ type RouterClient<T extends RouterRoutes, Extra, Path extends string[] = []> = {
156
+ $url: UrlMethod<Path>;
157
+ } & { [K in keyof RemoveIndex<T> as K extends LowercaseMethods ? PrefixedMethod<K> : never]: MethodClient<ExtractMethod<T[K]>, Extra, Path> } & { [K in keyof RemoveIndex<T>]: IsAny<T[K]> extends true ? never : Extract<T[K], Router<RouterRoutes>> extends infer R ? R extends Router<infer Routes> ? RouterClient<Routes, Extra, [...Path, K & string]> & ImplicitGetCall<Routes, Extra, [...Path, K & string]> : never : never } & ImplicitGetCall<T, Extra, Path>;
144
158
  //#endregion
145
159
  //#region src/http-client.d.ts
146
160
  /** HTTP client configuration. */
@@ -197,6 +211,18 @@ type HttpClient<T extends Router<RouterRoutes>> = {
197
211
  * // GET /api/get
198
212
  * await client.api.get.$get();
199
213
  * ```
214
+ *
215
+ * @example Router built by a dependency-injected factory:
216
+ * ```typescript
217
+ * import type { createServer } from './server';
218
+ * import { createHttpClient } from '@fresho/router';
219
+ *
220
+ * type Api = ReturnType<typeof createServer>['api'];
221
+ *
222
+ * const client = createHttpClient<Api>({
223
+ * baseUrl: 'https://api.example.com',
224
+ * });
225
+ * ```
200
226
  */
201
227
  declare function createHttpClient<T extends Router<RouterRoutes>>(config?: HttpClientConfig): HttpClient<T>;
202
228
  //#endregion
@@ -246,10 +272,14 @@ declare function createLocalClient<T extends Router<RouterRoutes>>(routerDef: T)
246
272
  * ```typescript
247
273
  * import { router, sseResponse, streamJsonLines } from '@fresho/router';
248
274
  *
275
+ * interface Events {
276
+ * tick: { count: number };
277
+ * }
278
+ *
249
279
  * const api = router({
250
280
  * // SSE for real-time updates
251
281
  * events: router({
252
- * get: async () => sseResponse(async (send, close) => {
282
+ * get: async () => sseResponse<Events>(async (send, close) => {
253
283
  * for (let i = 0; i < 10; i++) {
254
284
  * send({ event: 'tick', data: { count: i } });
255
285
  * await sleep(1000);
@@ -280,27 +310,77 @@ interface SSEOptions {
280
310
  keepAliveInterval?: number;
281
311
  }
282
312
  /**
283
- * Server-Sent Event message structure.
313
+ * Data supported by an SSE message.
284
314
  */
285
- interface SSEMessage {
286
- /** Event type (optional). */
287
- event?: string;
288
- /** Event data. */
289
- data: string | object;
315
+ type SSEData = string | object;
316
+ /**
317
+ * Untyped map of SSE event names to their payloads.
318
+ *
319
+ * Define a narrower map and pass it to {@link sseResponse} to type-check event
320
+ * names and their corresponding data.
321
+ */
322
+ type SSEEventMap = Record<string, SSEData>;
323
+ type ValidSSEEventMap<Events$1> = { [Name in keyof Events$1]: SSEData };
324
+ interface SSEMessageMetadata {
290
325
  /** Event ID (optional). */
291
326
  id?: string;
292
327
  /** Retry interval hint for client (optional). */
293
328
  retry?: number;
294
329
  }
330
+ /**
331
+ * Server-Sent Event message structure without a typed event map.
332
+ */
333
+ interface SSEMessage extends SSEMessageMetadata {
334
+ /** Event type (optional). */
335
+ event?: string;
336
+ /** Event data. */
337
+ data: SSEData;
338
+ }
339
+ type NamedSSEMessage<Events$1> = { [Name in Exclude<keyof Events$1 & string, 'message'>]: {
340
+ event: Name;
341
+ data: Events$1[Name];
342
+ } }[Exclude<keyof Events$1 & string, 'message'>];
343
+ type DefaultSSEMessage<Events$1> = 'message' extends keyof Events$1 ? {
344
+ /** Omit the event name to dispatch the default `message` event. */
345
+ event?: 'message';
346
+ data: Events$1['message'];
347
+ } : never;
348
+ /**
349
+ * Server-Sent Event message structure.
350
+ *
351
+ * For a typed event map, each event name is coupled to its payload type. Use
352
+ * the reserved `message` key to type messages that omit the `event` field.
353
+ */
354
+ type SSEEventMessage<Events$1 extends ValidSSEEventMap<Events$1>> = (string extends keyof Events$1 ? SSEMessage : NamedSSEMessage<Events$1> | DefaultSSEMessage<Events$1>) & SSEMessageMetadata;
355
+ declare const SSE_EVENTS: unique symbol;
356
+ /**
357
+ * Response carrying its SSE event map at the type level.
358
+ */
359
+ type SSEResponse<Events$1 extends ValidSSEEventMap<Events$1> = SSEEventMap> = Response & {
360
+ readonly [SSE_EVENTS]: Events$1;
361
+ };
362
+ /**
363
+ * Extracts the event map carried by an SSE response or typed client method.
364
+ *
365
+ * @example
366
+ * ```typescript
367
+ * type Events = SSEEventsOf<ReturnType<typeof client.events>>;
368
+ * ```
369
+ */
370
+ type SSEEventsOf<T> = Awaited<T> extends SSEResponse<infer Events> ? Events : never;
295
371
  /**
296
372
  * Creates a Server-Sent Events (SSE) response.
297
373
  *
298
374
  * @example
299
375
  * ```typescript
376
+ * interface CounterEvents {
377
+ * tick: { count: number };
378
+ * }
379
+ *
300
380
  * const handler = async (c) => {
301
- * return sseResponse(async (send, close) => {
381
+ * return sseResponse<CounterEvents>(async (send, close) => {
302
382
  * for (let i = 0; i < 5; i++) {
303
- * await send({ data: { count: i } });
383
+ * send({ event: 'tick', data: { count: i } });
304
384
  * await new Promise(r => setTimeout(r, 1000));
305
385
  * }
306
386
  * close();
@@ -308,7 +388,7 @@ interface SSEMessage {
308
388
  * };
309
389
  * ```
310
390
  */
311
- declare function sseResponse(handler: (send: (message: SSEMessage) => void, close: () => void) => void | Promise<void>, options?: SSEOptions): Response;
391
+ declare function sseResponse<Events$1 extends ValidSSEEventMap<Events$1> = SSEEventMap>(handler: (send: (message: SSEEventMessage<Events$1>) => void, close: () => void) => void | Promise<void>, options?: SSEOptions): SSEResponse<Events$1>;
312
392
  /**
313
393
  * Creates a streaming JSON response where each line is a JSON object.
314
394
  *
@@ -331,5 +411,5 @@ declare function streamJsonLines(handler: (send: (data: object) => void, close:
331
411
  headers?: HeadersInit;
332
412
  }): Response;
333
413
  //#endregion
334
- export { type CollectPathParams, type CompiledSchema, type Context, type ExecutionContext, type FetchHandler, type HttpClient, type HttpClientConfig, type HttpRequestOptions, type InferSchema, type LocalClient, type LocalClientConfig, type LocalRequestOptions, type Method, type MethodEntry, type Middleware, type MiddlewareContext, type MiddlewareNext, type RouteDefinition, type Router, type RouterBrand, type RouterRoutes, type SSEMessage, type SSEOptions, type SchemaDefinition, type SchemaType, type SchemaTypeMap, type TypedHandler, type TypedResponse, type ValidationResult, compileSchema, createHttpClient, createLocalClient, generateDocs, isFunction, isRoute, isRouter, route, router, runMiddleware, sseResponse, streamJsonLines };
414
+ export { type CollectPathParams, type CompiledSchema, type Context, type ExecutionContext, type FetchHandler, type HttpClient, type HttpClientConfig, type HttpRequestOptions, type InferSchema, type LocalClient, type LocalClientConfig, type LocalRequestOptions, type Method, type MethodEntry, type Middleware, type MiddlewareContext, type MiddlewareNext, type RouteDefinition, type Router, type RouterBrand, type RouterRoutes, type SSEData, type SSEEventMap, type SSEEventMessage, type SSEEventsOf, type SSEMessage, type SSEOptions, type SSEResponse, type SchemaDefinition, type SchemaType, type SchemaTypeMap, type TypedHandler, type TypedResponse, type ValidationResult, compileSchema, createHttpClient, createLocalClient, generateDocs, isFunction, isRoute, isRouter, route, router, runMiddleware, sseResponse, streamJsonLines };
335
415
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/core.ts","../src/docs.ts","../src/client-types.ts","../src/http-client.ts","../src/local-client.ts","../src/streaming.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/core.ts","../src/docs.ts","../src/client-types.ts","../src/http-client.ts","../src/local-client.ts","../src/streaming.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -706,6 +706,7 @@ function createRecursiveProxy(config, segments = []) {
706
706
  get(_target, prop) {
707
707
  if (typeof prop !== "string") return void 0;
708
708
  if (prop === "apply" || prop === "call" || prop === "bind" || prop === "toString" || prop === "toJSON") return _target[prop];
709
+ if (prop === "$url" && config.onBuildUrl) return (options) => config.onBuildUrl(segments, options);
709
710
  if (PREFIXED_HTTP_METHODS.has(prop)) {
710
711
  const method = prop.slice(1);
711
712
  return (options) => {
@@ -720,6 +721,22 @@ function createRecursiveProxy(config, segments = []) {
720
721
  });
721
722
  }
722
723
 
724
+ //#endregion
725
+ //#region src/client-response.ts
726
+ const STREAMING_CONTENT_TYPES = new Set([
727
+ "text/event-stream",
728
+ "application/x-ndjson",
729
+ "application/ndjson"
730
+ ]);
731
+ /**
732
+ * Parses ordinary client responses as JSON while preserving streaming bodies.
733
+ */
734
+ async function parseClientResponse(response, raw = false) {
735
+ const contentType = response.headers.get("Content-Type")?.split(";", 1)[0].trim().toLowerCase();
736
+ if (raw || contentType && STREAMING_CONTENT_TYPES.has(contentType)) return response;
737
+ return response.json();
738
+ }
739
+
723
740
  //#endregion
724
741
  //#region src/http-client.ts
725
742
  /**
@@ -795,15 +812,30 @@ const BODY_METHODS = new Set([
795
812
  * // GET /api/get
796
813
  * await client.api.get.$get();
797
814
  * ```
815
+ *
816
+ * @example Router built by a dependency-injected factory:
817
+ * ```typescript
818
+ * import type { createServer } from './server';
819
+ * import { createHttpClient } from '@fresho/router';
820
+ *
821
+ * type Api = ReturnType<typeof createServer>['api'];
822
+ *
823
+ * const client = createHttpClient<Api>({
824
+ * baseUrl: 'https://api.example.com',
825
+ * });
826
+ * ```
798
827
  */
799
828
  function createHttpClient(config = {}) {
800
829
  const sharedConfig = { current: { ...config } };
801
830
  const client = { configure(newConfig) {
802
831
  Object.assign(sharedConfig.current, newConfig);
803
832
  } };
804
- const proxy = createRecursiveProxy({ onRequest: (segments, method, options) => {
805
- return executeRequest(sharedConfig, segments, method, options);
806
- } });
833
+ const proxy = createRecursiveProxy({
834
+ onRequest: (segments, method, options) => {
835
+ return executeRequest(sharedConfig, segments, method, options);
836
+ },
837
+ onBuildUrl: (segments, options) => buildUrl(sharedConfig.current, segments, options)
838
+ });
807
839
  return new Proxy(client, {
808
840
  get(target, prop) {
809
841
  if (prop === "configure") return target.configure;
@@ -825,15 +857,24 @@ function buildPath(segments, pathParams) {
825
857
  } else parts.push(segment);
826
858
  return `/${parts.join("/")}`;
827
859
  }
828
- /** Executes an HTTP request. */
829
- async function executeRequest(sharedConfig, segments, method, options) {
830
- const config = sharedConfig.current;
860
+ /**
861
+ * Builds a URL string from path segments and options without executing a request.
862
+ *
863
+ * Returns an absolute URL when a `baseUrl` is configured, otherwise a relative
864
+ * `pathname + search` string suitable for same-origin fetches.
865
+ */
866
+ function buildUrl(config, segments, options) {
831
867
  const path = buildPath(segments, options?.path);
832
868
  const baseUrl = config.baseUrl || (typeof window !== "undefined" ? window.location?.origin : "");
833
869
  const url = new URL(path, baseUrl || "http://localhost");
834
870
  if (options?.query) {
835
871
  for (const [key, value] of Object.entries(options.query)) if (value !== void 0) url.searchParams.set(key, String(value));
836
872
  }
873
+ return config.baseUrl ? url.toString() : url.pathname + url.search;
874
+ }
875
+ /** Executes an HTTP request. */
876
+ async function executeRequest(sharedConfig, segments, method, options) {
877
+ const config = sharedConfig.current;
837
878
  const headers = new Headers();
838
879
  if (config.headers) for (const [key, value] of Object.entries(config.headers)) {
839
880
  const resolved = typeof value === "function" ? await value() : value;
@@ -849,11 +890,10 @@ async function executeRequest(sharedConfig, segments, method, options) {
849
890
  headers.set("Content-Type", "application/json");
850
891
  init.body = JSON.stringify(options.body);
851
892
  }
852
- const fetchUrl = config.baseUrl ? url.toString() : url.pathname + url.search;
893
+ const fetchUrl = buildUrl(config, segments, options);
853
894
  const response = await (config.fetch || fetch)(fetchUrl, init);
854
895
  if (!response.ok) throw new Error(await response.text() || response.statusText);
855
- if (options?.raw) return response;
856
- return response.json();
896
+ return parseClientResponse(response, options?.raw);
857
897
  }
858
898
 
859
899
  //#endregion
@@ -938,9 +978,12 @@ function createLocalClient(routerDef) {
938
978
  const client = { configure(config) {
939
979
  Object.assign(sharedConfig.current, config);
940
980
  } };
941
- const proxy = createRecursiveProxy({ onRequest: (segments, method, options) => {
942
- return invokeHandler(sharedConfig, routerDef, segments, method, options);
943
- } });
981
+ const proxy = createRecursiveProxy({
982
+ onRequest: (segments, method, options) => {
983
+ return invokeHandler(sharedConfig, routerDef, segments, method, options);
984
+ },
985
+ onBuildUrl: (segments, options) => buildLocalUrl(segments, options)
986
+ });
944
987
  return new Proxy(client, {
945
988
  get(target, prop) {
946
989
  if (prop === "configure") return target.configure;
@@ -951,6 +994,21 @@ function createLocalClient(routerDef) {
951
994
  }
952
995
  });
953
996
  }
997
+ /**
998
+ * Builds a relative URL string from path segments and options.
999
+ *
1000
+ * The local client has no baseUrl, so it returns a relative `pathname + search`
1001
+ * string. Mirrors the synthetic URL construction used in {@link invokeHandler}.
1002
+ */
1003
+ function buildLocalUrl(segments, options) {
1004
+ const pathParams = collectPathParams(segments, options?.path);
1005
+ const pathParts = segments.map((s) => s.startsWith("$") ? encodeURIComponent(pathParams[s.slice(1)]) : s);
1006
+ const url = new URL(`/${pathParts.join("/")}`, "http://localhost");
1007
+ if (options?.query) {
1008
+ for (const [key, value] of Object.entries(options.query)) if (value !== void 0) url.searchParams.set(key, String(value));
1009
+ }
1010
+ return url.pathname + url.search;
1011
+ }
954
1012
  /** Invokes a handler directly. */
955
1013
  async function invokeHandler(sharedConfig, routerDef, segments, method, options) {
956
1014
  const config = sharedConfig.current;
@@ -992,7 +1050,7 @@ async function invokeHandler(sharedConfig, routerDef, segments, method, options)
992
1050
  executionCtx: options?.ctx ?? config.ctx
993
1051
  };
994
1052
  const result = await routeInfo.handler(context);
995
- if (result instanceof Response) return result.json();
1053
+ if (result instanceof Response) return parseClientResponse(result);
996
1054
  return result;
997
1055
  }
998
1056
 
@@ -1015,10 +1073,14 @@ function formatSSEMessage(message) {
1015
1073
  *
1016
1074
  * @example
1017
1075
  * ```typescript
1076
+ * interface CounterEvents {
1077
+ * tick: { count: number };
1078
+ * }
1079
+ *
1018
1080
  * const handler = async (c) => {
1019
- * return sseResponse(async (send, close) => {
1081
+ * return sseResponse<CounterEvents>(async (send, close) => {
1020
1082
  * for (let i = 0; i < 5; i++) {
1021
- * await send({ data: { count: i } });
1083
+ * send({ event: 'tick', data: { count: i } });
1022
1084
  * await new Promise(r => setTimeout(r, 1000));
1023
1085
  * }
1024
1086
  * close();