@fresho/router 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["OAUTH_PROVIDERS: Record<string, OAuthProvider>","headers: Record<string, string>"],"sources":["../../src/auth/oauth.ts"],"sourcesContent":["/**\n * @fileoverview OAuth 2.0 utilities for @fresho/router.\n *\n * Provides reusable primitives for implementing OAuth 2.0 Authorization Code flows.\n * This implementation is designed as a confidential client suitable for server-side\n * applications that can securely store client secrets.\n *\n * ## Design Decisions\n *\n * ### Why Not PKCE?\n *\n * PKCE (Proof Key for Code Exchange, RFC 7636) is a security extension designed to\n * protect against authorization code interception attacks. However:\n *\n * - PKCE is **required** only for public clients (mobile apps, SPAs without backend)\n * - PKCE is **optional** for confidential clients that can securely store secrets\n * - These utilities assume a confidential client with a `client_secret`\n * - The `client_secret` provides equivalent protection during token exchange\n *\n * ### HMAC-Signed State Parameter\n *\n * Instead of PKCE, we provide HMAC-signed state utilities that:\n *\n * 1. **Prevent CSRF attacks** - The signature is verified on callback\n * 2. **Carry custom data** - Embed arbitrary data (e.g., user ID) in the state\n * 3. **Include a nonce** - Random bytes prevent replay attacks\n * 4. **Use Web Crypto API** - Works in Cloudflare Workers, Deno, and browsers\n *\n * ## Provider Compatibility\n *\n * This implementation pattern works with ~60-70% of OAuth 2.0 providers:\n *\n * | Provider | PKCE | Auth Method | Compatible |\n * |------------|----------|-------------|------------|\n * | Google | Optional | Body | ✅ Yes |\n * | GitHub | None | Basic Auth | ✅ Minor tweak |\n * | Slack | None | Body | ✅ Yes |\n * | LinkedIn | None | Body | ✅ Yes |\n * | Spotify | Optional | Basic Auth | ✅ Yes |\n * | Discord | Optional | Body | ✅ Yes |\n * | Dropbox | None | Basic Auth | ✅ Minor tweak |\n * | Twitter | Required | - | ❌ Needs PKCE |\n * | TikTok | Required | - | ❌ Needs PKCE |\n *\n * @see https://tools.ietf.org/html/rfc6749 - OAuth 2.0 Authorization Framework\n * @see https://tools.ietf.org/html/rfc7636 - PKCE Extension\n *\n * @example\n * ```typescript\n * import { encodeOAuthState, decodeOAuthState, exchangeCode } from '@fresho/router/middleware';\n *\n * // In your authorize route:\n * const state = await encodeOAuthState({ uid: 'user-123' }, SECRET);\n * const authUrl = `https://provider.com/oauth/authorize?state=${state}&...`;\n *\n * // In your callback route:\n * const data = await decodeOAuthState(state, SECRET);\n * if (data) {\n * const tokens = await exchangeCode(code, { ... });\n * }\n * ```\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** OAuth 2.0 token response as per RFC 6749. */\nexport interface OAuthTokenResponse {\n /** The access token issued by the authorization server. */\n access_token: string;\n /** The refresh token (optional, returned with offline access). */\n refresh_token?: string;\n /** The type of token (typically \"Bearer\"). */\n token_type: string;\n /** The lifetime in seconds of the access token. */\n expires_in: number;\n /** The scopes granted by the authorization server. */\n scope?: string;\n /** OpenID Connect ID token (if openid scope was requested). */\n id_token?: string;\n}\n\n/** OAuth 2.0 provider configuration. */\nexport interface OAuthProvider {\n /** Authorization endpoint URL. */\n authorizationUrl: string;\n /** Token endpoint URL. */\n tokenUrl: string;\n /** Token revocation endpoint URL (optional). */\n revokeUrl?: string;\n /** User info endpoint URL (optional). */\n userInfoUrl?: string;\n}\n\n/** Common OAuth 2.0 providers with their endpoints. */\nexport const OAUTH_PROVIDERS: Record<string, OAuthProvider> = {\n google: {\n authorizationUrl: 'https://accounts.google.com/o/oauth2/v2/auth',\n tokenUrl: 'https://oauth2.googleapis.com/token',\n revokeUrl: 'https://oauth2.googleapis.com/revoke',\n userInfoUrl: 'https://www.googleapis.com/oauth2/v3/userinfo',\n },\n github: {\n authorizationUrl: 'https://github.com/login/oauth/authorize',\n tokenUrl: 'https://github.com/login/oauth/access_token',\n revokeUrl: undefined,\n userInfoUrl: 'https://api.github.com/user',\n },\n discord: {\n authorizationUrl: 'https://discord.com/oauth2/authorize',\n tokenUrl: 'https://discord.com/api/oauth2/token',\n revokeUrl: 'https://discord.com/api/oauth2/token/revoke',\n userInfoUrl: 'https://discord.com/api/users/@me',\n },\n slack: {\n authorizationUrl: 'https://slack.com/openid/connect/authorize',\n tokenUrl: 'https://slack.com/api/openid.connect.token',\n revokeUrl: undefined,\n userInfoUrl: undefined,\n },\n linkedin: {\n authorizationUrl: 'https://www.linkedin.com/oauth/v2/authorization',\n tokenUrl: 'https://www.linkedin.com/oauth/v2/accessToken',\n revokeUrl: undefined,\n userInfoUrl: 'https://api.linkedin.com/v2/userinfo',\n },\n spotify: {\n authorizationUrl: 'https://accounts.spotify.com/authorize',\n tokenUrl: 'https://accounts.spotify.com/api/token',\n revokeUrl: undefined,\n userInfoUrl: 'https://api.spotify.com/v1/me',\n },\n dropbox: {\n authorizationUrl: 'https://www.dropbox.com/oauth2/authorize',\n tokenUrl: 'https://api.dropboxapi.com/oauth2/token',\n revokeUrl: 'https://api.dropboxapi.com/2/auth/token/revoke',\n userInfoUrl: undefined,\n },\n};\n\n/** Token endpoint authentication method. */\nexport type TokenAuthMethod = 'body' | 'basic';\n\n/** Configuration for token exchange. */\nexport interface ExchangeCodeOptions {\n /** Token endpoint URL. */\n tokenUrl: string;\n /** OAuth client ID. */\n clientId: string;\n /** OAuth client secret. */\n clientSecret: string;\n /** Redirect URI used in authorization request. */\n redirectUri: string;\n /** Authentication method (default: 'body'). */\n authMethod?: TokenAuthMethod;\n}\n\n/** Configuration for token revocation. */\nexport interface RevokeTokenOptions {\n /** Revocation endpoint URL. */\n revokeUrl: string;\n /** Token to revoke. */\n token: string;\n /** Token type hint (optional, e.g., 'refresh_token' or 'access_token'). */\n tokenTypeHint?: string;\n /** OAuth client ID (for providers that require it). */\n clientId?: string;\n /** OAuth client secret (for providers that require it). */\n clientSecret?: string;\n /** Authentication method (default: 'body'). */\n authMethod?: TokenAuthMethod;\n}\n\n// =============================================================================\n// State Encoding/Decoding (HMAC-signed)\n// =============================================================================\n\n/**\n * Encodes arbitrary data into an HMAC-signed state parameter.\n *\n * The state is base64url-encoded and includes:\n * - The JSON-serialized payload\n * - A random nonce (12 bytes) for replay protection\n * - An HMAC-SHA256 signature (truncated to 16 hex chars)\n *\n * @param data - Arbitrary data to encode in the state\n * @param secret - Secret key for HMAC signing\n * @returns Base64url-encoded state string\n *\n * @example\n * ```typescript\n * const state = await encodeOAuthState({ uid: 'user-123', returnTo: '/dashboard' }, SECRET);\n * // Use in OAuth authorization URL\n * ```\n */\nexport async function encodeOAuthState(\n data: Record<string, unknown>,\n secret: string,\n): Promise<string> {\n // Generate random nonce.\n const nonceBytes = new Uint8Array(12);\n crypto.getRandomValues(nonceBytes);\n const nonce = btoa(String.fromCharCode(...nonceBytes))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\n // Create payload with nonce.\n const payload = JSON.stringify({ ...data, _nonce: nonce });\n\n // Generate HMAC signature.\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n\n const signature = await crypto.subtle.sign('HMAC', key, encoder.encode(payload));\n const signatureHex = Array.from(new Uint8Array(signature))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n .slice(0, 16);\n\n // Encode the full state.\n const stateData = JSON.stringify({ payload, sig: signatureHex });\n return btoa(stateData).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\n/**\n * Decodes and verifies an HMAC-signed state parameter.\n *\n * @param state - Base64url-encoded state string\n * @param secret - Secret key for HMAC verification\n * @returns The decoded data, or null if verification fails\n *\n * @example\n * ```typescript\n * const data = await decodeOAuthState(state, SECRET);\n * if (data) {\n * console.log(data.uid); // 'user-123'\n * }\n * ```\n */\nexport async function decodeOAuthState<T extends Record<string, unknown> = Record<string, unknown>>(\n state: string,\n secret: string,\n): Promise<T | null> {\n try {\n // Decode base64url.\n const base64 = state.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), '=');\n const stateData = JSON.parse(atob(padded));\n\n const { payload, sig } = stateData;\n\n // Verify HMAC signature.\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n\n const expectedSignature = await crypto.subtle.sign('HMAC', key, encoder.encode(payload));\n const expectedSigHex = Array.from(new Uint8Array(expectedSignature))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n .slice(0, 16);\n\n // Constant-time comparison (simple version).\n if (sig !== expectedSigHex) {\n return null;\n }\n\n // Extract data from payload (remove internal _nonce field).\n const payloadData = JSON.parse(payload);\n delete payloadData._nonce;\n return payloadData as T;\n } catch {\n return null;\n }\n}\n\n// =============================================================================\n// Token Exchange\n// =============================================================================\n\n/**\n * Exchanges an authorization code for tokens.\n *\n * @param code - Authorization code from OAuth callback\n * @param options - Token exchange configuration\n * @returns Token response from the OAuth provider\n * @throws Error if token exchange fails\n *\n * @example\n * ```typescript\n * const tokens = await exchangeCode(code, {\n * tokenUrl: OAUTH_PROVIDERS.google.tokenUrl,\n * clientId: env.CLIENT_ID,\n * clientSecret: env.CLIENT_SECRET,\n * redirectUri: 'https://example.com/callback',\n * });\n * ```\n */\nexport async function exchangeCode(\n code: string,\n options: ExchangeCodeOptions,\n): Promise<OAuthTokenResponse> {\n const { tokenUrl, clientId, clientSecret, redirectUri, authMethod = 'body' } = options;\n\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n redirect_uri: redirectUri,\n });\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n };\n\n if (authMethod === 'basic') {\n headers.Authorization = `Basic ${btoa(`${clientId}:${clientSecret}`)}`;\n } else {\n body.set('client_id', clientId);\n body.set('client_secret', clientSecret);\n }\n\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers,\n body: body.toString(),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Token exchange failed: ${response.status} ${errorText}`);\n }\n\n return response.json();\n}\n\n/**\n * Refreshes an access token using a refresh token.\n *\n * @param refreshToken - The refresh token\n * @param options - Token exchange configuration (same as exchangeCode)\n * @returns New token response from the OAuth provider\n * @throws Error if token refresh fails\n *\n * @example\n * ```typescript\n * const tokens = await refreshAccessToken(refreshToken, {\n * tokenUrl: OAUTH_PROVIDERS.google.tokenUrl,\n * clientId: env.CLIENT_ID,\n * clientSecret: env.CLIENT_SECRET,\n * redirectUri: 'https://example.com/callback',\n * });\n * ```\n */\nexport async function refreshAccessToken(\n refreshToken: string,\n options: Omit<ExchangeCodeOptions, 'redirectUri'>,\n): Promise<OAuthTokenResponse> {\n const { tokenUrl, clientId, clientSecret, authMethod = 'body' } = options;\n\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n });\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Accept: 'application/json',\n };\n\n if (authMethod === 'basic') {\n headers.Authorization = `Basic ${btoa(`${clientId}:${clientSecret}`)}`;\n } else {\n body.set('client_id', clientId);\n body.set('client_secret', clientSecret);\n }\n\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers,\n body: body.toString(),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Token refresh failed: ${response.status} ${errorText}`);\n }\n\n return response.json();\n}\n\n/**\n * Revokes an OAuth token.\n *\n * @param options - Token revocation configuration\n * @returns True if revocation succeeded\n * @throws Error if revocation fails\n *\n * @example\n * ```typescript\n * await revokeToken({\n * revokeUrl: OAUTH_PROVIDERS.google.revokeUrl!,\n * token: refreshToken,\n * tokenTypeHint: 'refresh_token',\n * });\n * ```\n */\nexport async function revokeToken(options: RevokeTokenOptions): Promise<boolean> {\n const { revokeUrl, token, tokenTypeHint, clientId, clientSecret, authMethod = 'body' } = options;\n\n const body = new URLSearchParams({ token });\n if (tokenTypeHint) {\n body.set('token_type_hint', tokenTypeHint);\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n };\n\n if (authMethod === 'basic' && clientId && clientSecret) {\n headers.Authorization = `Basic ${btoa(`${clientId}:${clientSecret}`)}`;\n } else if (clientId && clientSecret) {\n body.set('client_id', clientId);\n body.set('client_secret', clientSecret);\n }\n\n const response = await fetch(revokeUrl, {\n method: 'POST',\n headers,\n body: body.toString(),\n });\n\n // Some providers return 200, others return 204 for successful revocation.\n return response.ok;\n}\n\n// =============================================================================\n// Authorization URL Builder\n// =============================================================================\n\n/** Options for building an authorization URL. */\nexport interface AuthorizationUrlOptions {\n /** Authorization endpoint URL. */\n authorizationUrl: string;\n /** OAuth client ID. */\n clientId: string;\n /** Redirect URI for OAuth callback. */\n redirectUri: string;\n /** Requested scopes. */\n scopes: string[];\n /** State parameter (use encodeOAuthState to generate). */\n state: string;\n /** Response type (default: 'code'). */\n responseType?: string;\n /** Additional provider-specific parameters. */\n extraParams?: Record<string, string>;\n}\n\n/**\n * Builds an OAuth authorization URL.\n *\n * @param options - Authorization URL configuration\n * @returns The complete authorization URL\n *\n * @example\n * ```typescript\n * const state = await encodeOAuthState({ uid: 'user-123' }, SECRET);\n * const authUrl = buildAuthorizationUrl({\n * authorizationUrl: OAUTH_PROVIDERS.google.authorizationUrl,\n * clientId: env.CLIENT_ID,\n * redirectUri: 'https://example.com/callback',\n * scopes: ['openid', 'email', 'profile'],\n * state,\n * extraParams: {\n * access_type: 'offline',\n * prompt: 'consent',\n * },\n * });\n * ```\n */\nexport function buildAuthorizationUrl(options: AuthorizationUrlOptions): string {\n const {\n authorizationUrl,\n clientId,\n redirectUri,\n scopes,\n state,\n responseType = 'code',\n extraParams = {},\n } = options;\n\n const params = new URLSearchParams({\n response_type: responseType,\n client_id: clientId,\n redirect_uri: redirectUri,\n scope: scopes.join(' '),\n state,\n ...extraParams,\n });\n\n return `${authorizationUrl}?${params.toString()}`;\n}\n"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as SchemaDefinition, D as compileSchema, E as ValidationResult, S as InferSchema, T as SchemaTypeMap, _ as TypedResponse, a as runMiddleware, b as isRouter, c as ExecutionContext, d as MethodEntry, f as RouteDefinition, g as TypedHandler, h as RouterRoutes, l as FetchHandler, m as RouterBrand, n as MiddlewareContext, o as CollectPathParams, p as Router, r as MiddlewareNext, s as Context, t as Middleware, u as Method, v as isFunction, w as SchemaType, x as CompiledSchema, y as isRoute } from "./middleware-CqtYOc6D.mjs";
1
+ import { C as SchemaDefinition, D as compileSchema, E as ValidationResult, S as InferSchema, T as SchemaTypeMap, _ as TypedResponse, a as runMiddleware, b as isRouter, c as ExecutionContext, d as MethodEntry, f as RouteDefinition, g as TypedHandler, h as RouterRoutes, l as FetchHandler, m as RouterBrand, n as MiddlewareContext, o as CollectPathParams, p as Router, r as MiddlewareNext, s as Context, t as Middleware, u as Method, v as isFunction, w as SchemaType, x as CompiledSchema, y as isRoute } from "./middleware-Bxq0LHLS.mjs";
2
2
 
3
3
  //#region src/core.d.ts
4
4
 
@@ -86,80 +86,79 @@ declare function generateDocs(config: {
86
86
  router: Router<RouterRoutes>;
87
87
  }): object;
88
88
  //#endregion
89
- //#region src/http-client.d.ts
90
- /** Header value that can be static or dynamic. */
91
- type HeaderValue = string | (() => string | null | undefined | Promise<string | null | undefined>);
92
- /** HTTP client configuration. */
93
- interface HttpClientConfig {
94
- baseUrl?: string;
95
- headers?: Record<string, HeaderValue>;
96
- credentials?: RequestCredentials;
97
- }
98
- /** Options for an HTTP request. */
99
- interface HttpRequestOptions {
100
- path?: Record<string, string>;
101
- query?: Record<string, unknown>;
102
- body?: unknown;
103
- headers?: HeadersInit;
104
- }
89
+ //#region src/client-types.d.ts
105
90
  /** HTTP method names as defined in routes (lowercase). */
106
91
  type LowercaseMethods = 'get' | 'post' | 'put' | 'patch' | 'delete';
107
92
  /** Map lowercase method to $-prefixed version. */
108
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;
109
94
  /** Extract return type from a handler. */
110
- type ExtractReturn$1<T> = T extends ((...args: unknown[]) => infer R) ? R extends Promise<infer U> ? U : R : unknown;
95
+ type ExtractReturn<T> = T extends ((...args: unknown[]) => infer R) ? R extends Promise<infer U> ? U : R : unknown;
111
96
  /** Detects if a type is `any`. */
112
- type IsAny$1<T> = 0 extends 1 & T ? true : false;
97
+ type IsAny<T> = 0 extends 1 & T ? true : false;
113
98
  /** Checks if a schema type should require a property. */
114
- type RequiresProperty$1<T> = IsAny$1<T> extends true ? false : keyof T extends never ? false : true;
99
+ type RequiresProperty<T> = IsAny<T> extends true ? false : keyof T extends never ? false : true;
100
+ /** Safely infer schema, returning {} for any or non-schema types. */
101
+ type SafeInferSchema<T> = IsAny<T> extends true ? {} : T extends SchemaDefinition ? InferSchema<T> : {};
102
+ /** Check if router tree contains any $param properties. */
103
+ type HasParams<Path extends string[]> = Path extends [infer Head, ...infer Rest extends string[]] ? Head extends `$${string}` ? true : HasParams<Rest> : false;
104
+ /** Extract the MethodEntry part from a union type. */
105
+ type ExtractMethod<T> = Extract<T, RouteDefinition<any, any, any, any, any> | ((...args: unknown[]) => unknown)>;
106
+ /** Remove string/number index signatures from a type. */
107
+ type RemoveIndex<T> = { [K in keyof T as string extends K ? never : number extends K ? never : K]: T[K] };
108
+ /** Header value that can be static or dynamic. */
109
+ type HeaderValue = string | (() => string | null | undefined | Promise<string | null | undefined>);
110
+ /** Base options for any request. */
111
+ interface BaseRequestOptions {
112
+ path?: Record<string, string>;
113
+ query?: Record<string, unknown>;
114
+ body?: unknown;
115
+ }
116
+ /** Full request options including client-specific extras. */
117
+ type RequestOptions<Extra> = BaseRequestOptions & Extra;
115
118
  /** Build options type based on whether path params are needed. */
116
- type BuildOptions$1<HasPathParams extends boolean, Q$1, B$1> = HasPathParams extends true ? {
119
+ type BuildOptions<HasPathParams extends boolean, Q$1, B$1, Extra> = HasPathParams extends true ? {
117
120
  path: Record<string, string>;
118
- } & (RequiresProperty$1<Q$1> extends true ? {
121
+ } & (RequiresProperty<Q$1> extends true ? {
119
122
  query?: Q$1;
120
- } : {}) & (RequiresProperty$1<B$1> extends true ? {
123
+ } : {}) & (RequiresProperty<B$1> extends true ? {
121
124
  body: B$1;
122
- } : {}) & {
123
- headers?: HeadersInit;
124
- } : (RequiresProperty$1<Q$1> extends true ? {
125
+ } : {}) & Extra : (RequiresProperty<Q$1> extends true ? {
125
126
  query?: Q$1;
126
- } : {}) & (RequiresProperty$1<B$1> extends true ? {
127
+ } : {}) & (RequiresProperty<B$1> extends true ? {
127
128
  body: B$1;
128
- } : {}) & {
129
- headers?: HeadersInit;
130
- };
131
- /** Safely infer schema, returning {} for any or non-schema types. */
132
- type SafeInferSchema$1<T> = IsAny$1<T> extends true ? {} : T extends SchemaDefinition ? InferSchema<T> : {};
129
+ } : {}) & Extra;
133
130
  /** Client type for a method entry (route or bare function). */
134
- type MethodClient$1<T, HasPathParams extends boolean = false> = T extends RouteDefinition<infer Q, infer B, infer R, any, any> ? (options?: BuildOptions$1<HasPathParams, SafeInferSchema$1<Q>, SafeInferSchema$1<B>>) => Promise<R> : T extends ((...args: unknown[]) => unknown) ? (options?: BuildOptions$1<HasPathParams, {}, {}>) => Promise<ExtractReturn$1<T>> : never;
135
- /** Check if router tree contains any $param properties. */
136
- type HasParams$1<Path extends string[]> = Path extends [infer Head, ...infer Rest extends string[]] ? Head extends `$${string}` ? true : HasParams$1<Rest> : false;
137
- /** Extract the MethodEntry part from a union type. */
138
- type ExtractMethod$1<T> = Extract<T, RouteDefinition<any, any, any, any, any> | ((...args: unknown[]) => unknown)>;
139
- /** Client type for a router. */
140
- type RouterClient$1<T extends RouterRoutes, Path extends string[] = []> = { [K in keyof T as K extends LowercaseMethods ? PrefixedMethod<K> : never]: ExtractMethod$1<T[K]> extends infer M ? M extends RouteDefinition<any, any, any, any, any> | ((...args: unknown[]) => unknown) ? MethodClient$1<M, HasParams$1<Path>> : never : never } & { [K in keyof T]: Extract<T[K], {
141
- routes: RouterRoutes;
142
- }> extends {
143
- routes: infer Routes extends RouterRoutes;
144
- } ? RouterClient$1<Routes, [...Path, K & string]> & ImplicitGetCall$1<Routes, [...Path, K & string]> : never } & ImplicitGetCall$1<T, Path>;
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;
145
132
  /** Helper to extract return type for implicit GET calls. */
146
- type ImplicitGetCall$1<T extends RouterRoutes, Path extends string[] = []> = 'get' extends keyof T ? ExtractMethod$1<T['get']> extends RouteDefinition<infer _Q, infer _B, infer R, any, any> ? HasParams$1<Path> extends true ? (options: {
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: {
147
134
  path: Record<string, string>;
148
135
  } & {
149
136
  query?: Record<string, unknown>;
150
- } & {
151
- headers?: HeadersInit;
152
- }) => Promise<R> : (options?: HttpRequestOptions) => Promise<R> : ExtractMethod$1<T['get']> extends ((...args: unknown[]) => unknown) ? HasParams$1<Path> extends true ? (options: {
137
+ } & Extra) => Promise<R> : (options?: RequestOptions<Extra>) => Promise<R> : ExtractMethod<T['get']> extends ((...args: unknown[]) => unknown) ? HasParams<Path> extends true ? (options: {
153
138
  path: Record<string, string>;
154
139
  } & {
155
140
  query?: Record<string, unknown>;
156
- } & {
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
+ /** 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>;
144
+ //#endregion
145
+ //#region src/http-client.d.ts
146
+ /** HTTP client configuration. */
147
+ interface HttpClientConfig {
148
+ baseUrl?: string;
149
+ headers?: Record<string, HeaderValue>;
150
+ credentials?: RequestCredentials;
151
+ }
152
+ /** Extra options for HTTP requests (headers). */
153
+ interface HttpExtraOptions {
157
154
  headers?: HeadersInit;
158
- }) => Promise<ExtractReturn$1<ExtractMethod$1<T['get']>>> : (options?: HttpRequestOptions) => Promise<ExtractReturn$1<ExtractMethod$1<T['get']>>> : (options?: HttpRequestOptions) => Promise<unknown> : (options?: HttpRequestOptions) => Promise<unknown>;
155
+ }
156
+ /** Options for an HTTP request. */
157
+ type HttpRequestOptions = RequestOptions<HttpExtraOptions>;
159
158
  /** Top-level HTTP client type. */
160
159
  type HttpClient<T extends Router<RouterRoutes>> = {
161
160
  configure(config: HttpClientConfig): void;
162
- } & RouterClient$1<T['routes']>;
161
+ } & RouterClient<T['routes'], HttpExtraOptions>;
163
162
  /**
164
163
  * Creates a typed HTTP client.
165
164
  *
@@ -204,55 +203,10 @@ interface LocalClientConfig {
204
203
  ctx?: ExecutionContext;
205
204
  }
206
205
  /** Options for a local client request. */
207
- interface LocalRequestOptions {
208
- path?: Record<string, string>;
209
- query?: Record<string, unknown>;
210
- body?: unknown;
211
- env?: unknown;
212
- ctx?: ExecutionContext;
213
- }
214
- type HttpMethods = 'get' | 'post' | 'put' | 'patch' | 'delete';
215
- type ExtractReturn<T> = T extends ((...args: unknown[]) => infer R) ? R extends Promise<infer U> ? U : R : unknown;
216
- /** Detects if a type is `any`. */
217
- type IsAny<T> = 0 extends 1 & T ? true : false;
218
- /** Checks if a schema type should require a property. */
219
- type RequiresProperty<T> = IsAny<T> extends true ? false : keyof T extends never ? false : true;
220
- type BuildOptions<HasPathParams extends boolean, Q$1, B$1> = HasPathParams extends true ? {
221
- path: Record<string, string>;
222
- } & (RequiresProperty<Q$1> extends true ? {
223
- query?: Q$1;
224
- } : {}) & (RequiresProperty<B$1> extends true ? {
225
- body: B$1;
226
- } : {}) & LocalClientConfig : (RequiresProperty<Q$1> extends true ? {
227
- query?: Q$1;
228
- } : {}) & (RequiresProperty<B$1> extends true ? {
229
- body: B$1;
230
- } : {}) & LocalClientConfig;
231
- /** Safely infer schema, returning {} for any or non-schema types. */
232
- type SafeInferSchema<T> = IsAny<T> extends true ? {} : T extends SchemaDefinition ? InferSchema<T> : {};
233
- type MethodClient<T, HasPathParams extends boolean = false> = T extends RouteDefinition<infer Q, infer B, infer R, any, any> ? (options?: BuildOptions<HasPathParams, SafeInferSchema<Q>, SafeInferSchema<B>>) => Promise<R> : T extends ((...args: unknown[]) => unknown) ? (options?: BuildOptions<HasPathParams, {}, {}>) => Promise<ExtractReturn<T>> : never;
234
- type HasParams<Path extends string[]> = Path extends [infer Head, ...infer Rest extends string[]] ? Head extends `$${string}` ? true : HasParams<Rest> : false;
235
- /** Extract the MethodEntry part from a union type. */
236
- type ExtractMethod<T> = Extract<T, RouteDefinition<any, any, any, any, any> | ((...args: unknown[]) => unknown)>;
237
- /** Helper to extract return type for implicit GET calls. */
238
- type ImplicitGetCall<T extends RouterRoutes, 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: {
239
- path: Record<string, string>;
240
- } & {
241
- query?: Record<string, unknown>;
242
- } & LocalClientConfig) => Promise<R> : (options?: LocalRequestOptions) => Promise<R> : ExtractMethod<T['get']> extends ((...args: unknown[]) => unknown) ? HasParams<Path> extends true ? (options: {
243
- path: Record<string, string>;
244
- } & {
245
- query?: Record<string, unknown>;
246
- } & LocalClientConfig) => Promise<ExtractReturn<ExtractMethod<T['get']>>> : (options?: LocalRequestOptions) => Promise<ExtractReturn<ExtractMethod<T['get']>>> : (options?: LocalRequestOptions) => Promise<unknown> : (options?: LocalRequestOptions) => Promise<unknown>;
247
- /** Client type for a router. */
248
- type RouterClient<T extends RouterRoutes, Path extends string[] = []> = { [K in keyof T as K extends HttpMethods ? K : never]: ExtractMethod<T[K]> extends infer M ? M extends RouteDefinition<any, any, any, any, any> | ((...args: unknown[]) => unknown) ? MethodClient<M, HasParams<Path>> : never : never } & { [K in keyof T as K extends HttpMethods ? never : K]: Extract<T[K], {
249
- routes: RouterRoutes;
250
- }> extends {
251
- routes: infer Routes extends RouterRoutes;
252
- } ? RouterClient<Routes, [...Path, K & string]> & ImplicitGetCall<Routes, [...Path, K & string]> : never } & ImplicitGetCall<T, Path>;
206
+ type LocalRequestOptions = RequestOptions<LocalClientConfig>;
253
207
  type LocalClient<T extends Router<RouterRoutes>> = {
254
208
  configure(config: LocalClientConfig): void;
255
- } & RouterClient<T['routes']>;
209
+ } & RouterClient<T['routes'], LocalClientConfig>;
256
210
  /**
257
211
  * Creates a typed local client from a router definition.
258
212
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/core.ts","../src/docs.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
@@ -1,4 +1,4 @@
1
- import { n as runMiddleware } from "./middleware-BpFh0XrR.mjs";
1
+ import { n as runMiddleware } from "./middleware-XMbIevSv.mjs";
2
2
 
3
3
  //#region src/schema.ts
4
4
  /** Valid base types for primitives and arrays. */
@@ -678,13 +678,8 @@ function generateDocs(config) {
678
678
  }
679
679
 
680
680
  //#endregion
681
- //#region src/http-client.ts
682
- const BODY_METHODS = new Set([
683
- "post",
684
- "put",
685
- "patch"
686
- ]);
687
- const HTTP_METHODS$1 = new Set([
681
+ //#region src/client-proxy.ts
682
+ const PREFIXED_HTTP_METHODS = new Set([
688
683
  "$get",
689
684
  "$post",
690
685
  "$put",
@@ -694,6 +689,79 @@ const HTTP_METHODS$1 = new Set([
694
689
  "$head"
695
690
  ]);
696
691
  /**
692
+ * Creates a recursive proxy that accumulates path segments and traps method calls.
693
+ *
694
+ * Use cases:
695
+ * 1. HTTP Client: Accumulates path segments and executes HTTP requests on method calls.
696
+ * 2. Local Client: Accumulates path segments and invokes local handlers on method calls.
697
+ *
698
+ * @param config - The proxy configuration.
699
+ * @param segments - The initial path segments (default: []).
700
+ */
701
+ function createRecursiveProxy(config, segments = []) {
702
+ const callable = (options) => {
703
+ return config.onRequest(segments, "get", options);
704
+ };
705
+ return new Proxy(callable, {
706
+ get(_target, prop) {
707
+ if (typeof prop !== "string") return void 0;
708
+ if (prop === "apply" || prop === "call" || prop === "bind" || prop === "toString" || prop === "toJSON") return _target[prop];
709
+ if (PREFIXED_HTTP_METHODS.has(prop)) {
710
+ const method = prop.slice(1);
711
+ return (options) => {
712
+ return config.onRequest(segments, method, options);
713
+ };
714
+ }
715
+ return createRecursiveProxy(config, [...segments, prop]);
716
+ },
717
+ apply(_target, _thisArg, args) {
718
+ return callable(args[0]);
719
+ }
720
+ });
721
+ }
722
+
723
+ //#endregion
724
+ //#region src/http-client.ts
725
+ /**
726
+ * @fileoverview HTTP client for @fresho/router.
727
+ *
728
+ * Provides a typed HTTP client using type-only imports.
729
+ * URLs are built from property access chains:
730
+ * - Property names = path segments (including `get`, `post`, etc.)
731
+ * - `$param` = dynamic segment (substituted from path options)
732
+ * - `$get()`, `$post()`, etc. = HTTP method execution
733
+ * - Direct call `()` = implicit GET
734
+ *
735
+ * The `$` prefix distinguishes HTTP method execution from path navigation,
736
+ * allowing routes with path segments named after HTTP methods (e.g., `/api/get`).
737
+ *
738
+ * @example
739
+ * ```typescript
740
+ * // Type-only import - no server code in bundle!
741
+ * import type { api } from './server/api.js';
742
+ * import { createHttpClient } from '@fresho/router';
743
+ *
744
+ * const client = createHttpClient<typeof api>({
745
+ * baseUrl: 'https://api.example.com',
746
+ * });
747
+ *
748
+ * // URLs from property chains:
749
+ * await client.health(); // GET /health (implicit)
750
+ * await client.users.$get(); // GET /users (explicit)
751
+ * await client.users.$post({ body: {...} }); // POST /users
752
+ * await client.users.$id({ path: { id: '123' } }); // GET /users/123
753
+ *
754
+ * // Navigate to path segments named after HTTP methods:
755
+ * await client.api.get.$get(); // GET /api/get
756
+ * await client.resources.delete.$get(); // GET /resources/delete
757
+ * ```
758
+ */
759
+ const BODY_METHODS = new Set([
760
+ "post",
761
+ "put",
762
+ "patch"
763
+ ]);
764
+ /**
697
765
  * Creates a typed HTTP client.
698
766
  *
699
767
  * HTTP methods are prefixed with `$` to distinguish them from path segments:
@@ -730,39 +798,22 @@ const HTTP_METHODS$1 = new Set([
730
798
  */
731
799
  function createHttpClient(config = {}) {
732
800
  const sharedConfig = { current: { ...config } };
733
- return new Proxy({ configure(newConfig) {
801
+ const client = { configure(newConfig) {
734
802
  Object.assign(sharedConfig.current, newConfig);
735
- } }, {
803
+ } };
804
+ const proxy = createRecursiveProxy({ onRequest: (segments, method, options) => {
805
+ return executeRequest(sharedConfig, segments, method, options);
806
+ } });
807
+ return new Proxy(client, {
736
808
  get(target, prop) {
737
809
  if (prop === "configure") return target.configure;
738
- if (typeof prop === "string") return createPathProxy$1(sharedConfig, [prop]);
810
+ return proxy[prop];
739
811
  },
740
812
  apply(_target, _thisArg, args) {
741
813
  return executeRequest(sharedConfig, [], "get", args[0]);
742
814
  }
743
815
  });
744
816
  }
745
- /** Creates a proxy that tracks path segments. */
746
- function createPathProxy$1(sharedConfig, segments) {
747
- const callable = (options) => {
748
- return executeRequest(sharedConfig, segments, "get", options);
749
- };
750
- return new Proxy(callable, {
751
- get(_target, prop) {
752
- if (typeof prop !== "string") return void 0;
753
- if (HTTP_METHODS$1.has(prop)) {
754
- const method = prop.slice(1);
755
- return (options) => {
756
- return executeRequest(sharedConfig, segments, method, options);
757
- };
758
- }
759
- return createPathProxy$1(sharedConfig, [...segments, prop]);
760
- },
761
- apply(_target, _thisArg, args) {
762
- return callable(args[0]);
763
- }
764
- });
765
- }
766
817
  /** Builds a URL path from segments, substituting $param with values. */
767
818
  function buildPath(segments, pathParams) {
768
819
  const parts = [];
@@ -807,6 +858,26 @@ async function executeRequest(sharedConfig, segments, method, options) {
807
858
  //#endregion
808
859
  //#region src/local-client.ts
809
860
  /**
861
+ * @fileoverview Local client for @fresho/router.
862
+ *
863
+ * Provides a typed client that invokes route handlers directly without HTTP.
864
+ * Uses the same API as createHttpClient for consistency.
865
+ *
866
+ * @example
867
+ * ```typescript
868
+ * import { createLocalClient } from '@fresho/router';
869
+ * import { api } from './api.js';
870
+ *
871
+ * const client = createLocalClient(api);
872
+ *
873
+ * // Same API as HTTP client
874
+ * await client.health();
875
+ * await client.users();
876
+ * await client.users.post({ body: { name: 'Alice' } });
877
+ * await client.users.$id({ path: { id: '123' } });
878
+ * ```
879
+ */
880
+ /**
810
881
  * Finds a method handler in a router tree.
811
882
  */
812
883
  function findHandler(routerDef, segments, method) {
@@ -863,36 +934,22 @@ function collectPathParams(segments, pathValues) {
863
934
  */
864
935
  function createLocalClient(routerDef) {
865
936
  const sharedConfig = { current: {} };
866
- return new Proxy({ configure(config) {
937
+ const client = { configure(config) {
867
938
  Object.assign(sharedConfig.current, config);
868
- } }, {
939
+ } };
940
+ const proxy = createRecursiveProxy({ onRequest: (segments, method, options) => {
941
+ return invokeHandler(sharedConfig, routerDef, segments, method, options);
942
+ } });
943
+ return new Proxy(client, {
869
944
  get(target, prop) {
870
945
  if (prop === "configure") return target.configure;
871
- if (typeof prop === "string") return createPathProxy(sharedConfig, routerDef, [prop]);
946
+ return proxy[prop];
872
947
  },
873
948
  apply(_target, _thisArg, args) {
874
949
  return invokeHandler(sharedConfig, routerDef, [], "get", args[0]);
875
950
  }
876
951
  });
877
952
  }
878
- /** Creates a proxy that tracks path segments. */
879
- function createPathProxy(sharedConfig, routerDef, segments) {
880
- const callable = (options) => {
881
- return invokeHandler(sharedConfig, routerDef, segments, "get", options);
882
- };
883
- return new Proxy(callable, {
884
- get(_target, prop) {
885
- if (typeof prop !== "string") return void 0;
886
- if (HTTP_METHODS.has(prop)) return (options) => {
887
- return invokeHandler(sharedConfig, routerDef, segments, prop, options);
888
- };
889
- return createPathProxy(sharedConfig, routerDef, [...segments, prop]);
890
- },
891
- apply(_target, _thisArg, args) {
892
- return callable(args[0]);
893
- }
894
- });
895
- }
896
953
  /** Invokes a handler directly. */
897
954
  async function invokeHandler(sharedConfig, routerDef, segments, method, options) {
898
955
  const config = sharedConfig.current;