@spfn/core 0.1.0-alpha.88 → 0.2.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1046 -384
- package/dist/boss-D-fGtVgM.d.ts +187 -0
- package/dist/cache/index.d.ts +13 -33
- package/dist/cache/index.js +14 -703
- package/dist/cache/index.js.map +1 -1
- package/dist/codegen/index.d.ts +167 -17
- package/dist/codegen/index.js +76 -1419
- package/dist/codegen/index.js.map +1 -1
- package/dist/config/index.d.ts +1191 -0
- package/dist/config/index.js +264 -0
- package/dist/config/index.js.map +1 -0
- package/dist/db/index.d.ts +728 -59
- package/dist/db/index.js +1028 -1225
- package/dist/db/index.js.map +1 -1
- package/dist/env/index.d.ts +579 -308
- package/dist/env/index.js +438 -930
- package/dist/env/index.js.map +1 -1
- package/dist/errors/index.d.ts +417 -29
- package/dist/errors/index.js +359 -98
- package/dist/errors/index.js.map +1 -1
- package/dist/event/index.d.ts +108 -0
- package/dist/event/index.js +122 -0
- package/dist/event/index.js.map +1 -0
- package/dist/job/index.d.ts +172 -0
- package/dist/job/index.js +361 -0
- package/dist/job/index.js.map +1 -0
- package/dist/logger/index.d.ts +20 -79
- package/dist/logger/index.js +82 -387
- package/dist/logger/index.js.map +1 -1
- package/dist/middleware/index.d.ts +2 -11
- package/dist/middleware/index.js +49 -703
- package/dist/middleware/index.js.map +1 -1
- package/dist/nextjs/index.d.ts +120 -0
- package/dist/nextjs/index.js +416 -0
- package/dist/nextjs/index.js.map +1 -0
- package/dist/{client/nextjs/index.d.ts → nextjs/server.d.ts} +288 -262
- package/dist/nextjs/server.js +568 -0
- package/dist/nextjs/server.js.map +1 -0
- package/dist/route/index.d.ts +686 -25
- package/dist/route/index.js +440 -1287
- package/dist/route/index.js.map +1 -1
- package/dist/route/types.d.ts +38 -0
- package/dist/route/types.js +3 -0
- package/dist/route/types.js.map +1 -0
- package/dist/server/index.d.ts +201 -67
- package/dist/server/index.js +921 -3182
- package/dist/server/index.js.map +1 -1
- package/dist/types-BGl4QL1w.d.ts +77 -0
- package/dist/types-DRG2XMTR.d.ts +157 -0
- package/package.json +52 -47
- package/dist/auto-loader-JFaZ9gON.d.ts +0 -80
- package/dist/client/index.d.ts +0 -358
- package/dist/client/index.js +0 -357
- package/dist/client/index.js.map +0 -1
- package/dist/client/nextjs/index.js +0 -371
- package/dist/client/nextjs/index.js.map +0 -1
- package/dist/codegen/generators/index.d.ts +0 -19
- package/dist/codegen/generators/index.js +0 -1404
- package/dist/codegen/generators/index.js.map +0 -1
- package/dist/database-errors-BNNmLTJE.d.ts +0 -86
- package/dist/events/index.d.ts +0 -183
- package/dist/events/index.js +0 -77
- package/dist/events/index.js.map +0 -1
- package/dist/index-DHiAqhKv.d.ts +0 -101
- package/dist/index.d.ts +0 -8
- package/dist/index.js +0 -3674
- package/dist/index.js.map +0 -1
- package/dist/types/index.d.ts +0 -121
- package/dist/types/index.js +0 -38
- package/dist/types/index.js.map +0 -1
- package/dist/types-BXibIEyj.d.ts +0 -60
package/dist/client/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/contract-client.ts","../../src/client/universal-client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Contract-Based API Client\n *\n * Type-safe HTTP client that works with RouteContract for full end-to-end type safety\n */\nimport type { RouteContract, InferContract } from '../route';\n\nexport type RequestInterceptor = (\n url: string,\n init: RequestInit\n) => Promise<RequestInit> | RequestInit;\n\nexport interface ClientConfig\n{\n /**\n * API base URL (e.g., http://localhost:4000)\n */\n baseUrl?: string;\n\n /**\n * Default headers to include in all requests\n */\n headers?: Record<string, string>;\n\n /**\n * Request timeout in milliseconds\n */\n timeout?: number;\n\n /**\n * Custom fetch implementation\n */\n fetch?: typeof fetch;\n}\n\nexport interface CallOptions<TContract extends RouteContract>\n{\n params?: InferContract<TContract>['params'];\n query?: InferContract<TContract>['query'];\n body?: InferContract<TContract>['body'];\n headers?: Record<string, string>;\n baseUrl?: string;\n\n /**\n * Additional fetch options (extends RequestInit)\n *\n * Can be used for environment-specific options like Next.js cache/next\n *\n * @example\n * ```ts\n * // Next.js time-based revalidation\n * { fetchOptions: { next: { revalidate: 60 } } }\n *\n * // Next.js disable cache\n * { fetchOptions: { cache: 'no-store' } }\n *\n * // Next.js on-demand revalidation\n * { fetchOptions: { next: { tags: ['products'] } } }\n * ```\n */\n fetchOptions?: Record<string, any>;\n}\n\n/**\n * API Client Error\n */\nexport class ApiClientError extends Error\n{\n constructor(\n message: string,\n public readonly status: number,\n public readonly url: string,\n public readonly response?: unknown,\n public readonly errorType?: 'timeout' | 'network' | 'http'\n )\n {\n super(message);\n this.name = 'ApiClientError';\n }\n}\n\n/**\n * Contract-based API Client\n */\nexport class ContractClient\n{\n private readonly config: Required<ClientConfig>;\n private readonly interceptors: RequestInterceptor[] = [];\n\n constructor(config: ClientConfig = {})\n {\n this.config = {\n baseUrl: config.baseUrl || process.env.SERVER_API_URL || process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000',\n headers: config.headers || {},\n timeout: config.timeout || 30000,\n fetch: config.fetch || globalThis.fetch.bind(globalThis),\n };\n }\n\n /**\n * Add request interceptor\n */\n use(interceptor: RequestInterceptor): void\n {\n this.interceptors.push(interceptor);\n }\n\n /**\n * Make a type-safe API call using a contract\n *\n * @param contract - Route contract with absolute path\n * @param options - Call options (params, query, body, headers)\n */\n async call<TContract extends RouteContract>(\n contract: TContract,\n options?: CallOptions<TContract>\n ): Promise<InferContract<TContract>['response']>\n {\n const baseUrl = options?.baseUrl || this.config.baseUrl;\n\n // Use contract.path directly (contracts use absolute paths)\n const urlPath = ContractClient.buildUrl(\n contract.path,\n options?.params as Record<string, string | number> | undefined\n );\n\n const queryString = ContractClient.buildQuery(\n options?.query as Record<string, string | string[] | number | boolean> | undefined\n );\n\n const url = `${baseUrl}${urlPath}${queryString}`;\n\n const method = ContractClient.getHttpMethod(contract, options);\n\n const headers: Record<string, string> = {\n ...this.config.headers,\n ...options?.headers,\n };\n\n const isFormData = ContractClient.isFormData(options?.body);\n\n if (options?.body !== undefined && !isFormData && !headers['Content-Type'])\n {\n headers['Content-Type'] = 'application/json';\n }\n\n let init: RequestInit = {\n method,\n headers,\n ...options?.fetchOptions, // Spread environment-specific options (e.g., Next.js cache/next)\n };\n\n if (options?.body !== undefined)\n {\n init.body = isFormData ? (options.body as FormData) : JSON.stringify(options.body);\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n init.signal = controller.signal;\n\n for (const interceptor of this.interceptors)\n {\n init = await interceptor(url, init);\n }\n\n const response = await this.config.fetch(url, init).catch((error) =>\n {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError')\n {\n throw new ApiClientError(\n `Request timed out after ${this.config.timeout}ms`,\n 0,\n url,\n undefined,\n 'timeout'\n );\n }\n\n if (error instanceof Error)\n {\n throw new ApiClientError(\n `Network error: ${error.message}`,\n 0,\n url,\n undefined,\n 'network'\n );\n }\n\n throw error;\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok)\n {\n const errorBody = await response.json().catch(() => null);\n throw new ApiClientError(\n `${method} ${urlPath} failed: ${response.status} ${response.statusText}`,\n response.status,\n url,\n errorBody,\n 'http'\n );\n }\n\n const data = await response.json();\n return data as InferContract<TContract>['response'];\n }\n\n /**\n * Create a new client with merged configuration\n */\n withConfig(config: Partial<ClientConfig>): ContractClient\n {\n return new ContractClient({\n baseUrl: config.baseUrl || this.config.baseUrl,\n headers: { ...this.config.headers, ...config.headers },\n timeout: config.timeout || this.config.timeout,\n fetch: config.fetch || this.config.fetch,\n });\n }\n\n private static buildUrl(path: string, params?: Record<string, string | number>): string\n {\n if (!params) return path;\n\n let url = path;\n for (const [key, value] of Object.entries(params))\n {\n url = url.replace(`:${key}`, String(value));\n }\n\n return url;\n }\n\n private static buildQuery(query?: Record<string, string | string[] | number | boolean>): string\n {\n if (!query || Object.keys(query).length === 0) return '';\n\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query))\n {\n if (Array.isArray(value))\n {\n value.forEach((v) => params.append(key, String(v)));\n }\n else if (value !== undefined && value !== null)\n {\n params.append(key, String(value));\n }\n }\n\n const queryString = params.toString();\n return queryString ? `?${queryString}` : '';\n }\n\n private static getHttpMethod<TContract extends RouteContract>(\n contract: TContract,\n options?: CallOptions<TContract>\n ): string\n {\n if ('method' in contract && typeof contract.method === 'string')\n {\n return contract.method.toUpperCase();\n }\n\n if (options?.body !== undefined)\n {\n return 'POST';\n }\n\n return 'GET';\n }\n\n private static isFormData(body: unknown): body is FormData\n {\n return body instanceof FormData;\n }\n}\n\n/**\n * Create a new contract-based API client\n */\nexport function createClient(config?: ClientConfig): ContractClient\n{\n return new ContractClient(config);\n}\n\n/**\n * Global client singleton instance\n */\nlet _clientInstance: ContractClient = new ContractClient();\n\n/**\n * Configure the global client instance\n *\n * Call this in your app initialization to set default configuration\n * for all auto-generated API calls.\n *\n * @example\n * ```ts\n * // In app initialization (layout.tsx, _app.tsx, etc)\n * import { configureClient } from '@spfn/core/client';\n *\n * configureClient({\n * baseUrl: process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000',\n * timeout: 60000,\n * headers: {\n * 'X-App-Version': '1.0.0'\n * }\n * });\n *\n * // Add interceptors\n * import { client } from '@spfn/core/client';\n * client.use(async (url, init) => {\n * // Add auth header\n * return {\n * ...init,\n * headers: {\n * ...init.headers,\n * Authorization: `Bearer ${getToken()}`\n * }\n * };\n * });\n * ```\n */\nexport function configureClient(config: ClientConfig): void\n{\n _clientInstance = new ContractClient(config);\n}\n\n/**\n * Global client singleton with Proxy\n *\n * This client can be configured using configureClient() before use.\n * Used by auto-generated API client code.\n */\nexport const client = new Proxy({} as ContractClient, {\n get(_target, prop)\n {\n return _clientInstance[prop as keyof ContractClient];\n }\n});\n\n/**\n * Type guard for timeout errors\n *\n * @example\n * ```ts\n * try {\n * await api.users.getById({ params: { id: '123' } });\n * } catch (error) {\n * if (isTimeoutError(error)) {\n * console.error('Request timed out, retrying...');\n * // Implement retry logic\n * }\n * }\n * ```\n */\nexport function isTimeoutError(error: unknown): error is ApiClientError\n{\n return error instanceof ApiClientError && error.errorType === 'timeout';\n}\n\n/**\n * Type guard for network errors\n *\n * @example\n * ```ts\n * try {\n * await api.users.list();\n * } catch (error) {\n * if (isNetworkError(error)) {\n * showOfflineMessage();\n * }\n * }\n * ```\n */\nexport function isNetworkError(error: unknown): error is ApiClientError\n{\n return error instanceof ApiClientError && error.errorType === 'network';\n}\n\n/**\n * Type guard for HTTP errors (4xx, 5xx)\n *\n * @example\n * ```ts\n * try {\n * await api.users.create({ body: userData });\n * } catch (error) {\n * if (isHttpError(error)) {\n * if (error.status === 401) {\n * redirectToLogin();\n * } else if (error.status === 404) {\n * showNotFoundMessage();\n * }\n * }\n * }\n * ```\n */\nexport function isHttpError(error: unknown): error is ApiClientError\n{\n return error instanceof ApiClientError && error.errorType === 'http';\n}\n\n/**\n * Check if error is a specific server error type\n *\n * @example\n * ```ts\n * try {\n * await api.workflows.getById({ params: { uuid: 'xxx' } });\n * } catch (error) {\n * if (isServerError(error, 'NotFoundError')) {\n * showNotFoundMessage();\n * } else if (isServerError(error, 'ValidationError')) {\n * showValidationErrors(getServerErrorDetails(error));\n * }\n * }\n * ```\n */\nexport function isServerError(error: unknown, errorType: string): error is ApiClientError\n{\n if (!isHttpError(error)) return false;\n const response = error.response as any;\n return response?.error?.type === errorType;\n}\n\n/**\n * Get server error type from ApiClientError\n *\n * @example\n * ```ts\n * const errorType = getServerErrorType(error);\n * // 'NotFoundError', 'ValidationError', 'PaymentFailedError', etc.\n * ```\n */\nexport function getServerErrorType(error: ApiClientError): string | undefined\n{\n const response = error.response as any;\n return response?.error?.type;\n}\n\n/**\n * Get server error details from ApiClientError\n *\n * @example\n * ```ts\n * if (isServerError(error, 'PaymentFailedError')) {\n * const details = getServerErrorDetails(error);\n * console.log('Payment ID:', details.paymentId);\n * }\n * ```\n */\nexport function getServerErrorDetails<T = any>(error: ApiClientError): T | undefined\n{\n const response = error.response as any;\n return response?.error?.details;\n}\n","/**\n * Universal API Client\n *\n * Automatically routes requests based on execution environment:\n * - Server Environment: Direct call to SPFN API (internal network)\n * - Browser Environment: Proxies through Next.js API Route (cookie forwarding)\n */\n\nimport type { RouteContract, InferContract } from '../route';\nimport { ContractClient, type CallOptions, ApiClientError } from './contract-client';\n\n// Type declaration for window (available in browser)\ndeclare const window: unknown | undefined;\n\n/**\n * Detect if code is running in server environment\n *\n * Uses typeof window check for reliable browser detection\n */\nfunction isServerEnvironment(): boolean\n{\n return typeof window === 'undefined';\n}\n\n/**\n * Request interceptor function\n *\n * Called before each request to modify headers dynamically\n * Useful for adding authentication tokens, session data, etc.\n *\n * @param headers - Current request headers (mutable)\n * @param contract - Route contract being called\n * @returns Modified headers or void (modify in place)\n */\nexport type RequestInterceptor = (\n headers: Record<string, string>,\n contract: RouteContract\n) => Promise<void> | void;\n\n/**\n * Universal Client Configuration\n */\nexport interface UniversalClientConfig\n{\n /**\n * SPFN API server URL (for server-side direct calls)\n *\n * @default process.env.SERVER_API_URL || process.env.SPFN_API_URL || 'http://localhost:8790'\n */\n apiUrl?: string;\n\n /**\n * Next.js API route base path (for client-side proxy calls)\n *\n * @default '/api/actions'\n * @example '/api/proxy'\n */\n proxyBasePath?: string;\n\n /**\n * Additional headers to include in all requests\n */\n headers?: Record<string, string>;\n\n /**\n * Request timeout in milliseconds\n *\n * @default 30000\n */\n timeout?: number;\n\n /**\n * Custom fetch implementation\n */\n fetch?: typeof fetch;\n}\n\n/**\n * Universal API Client\n *\n * Automatically detects execution environment and routes requests accordingly:\n *\n * **Server Environment** (Next.js Server Components, API Routes):\n * - Direct HTTP call to SPFN API server\n * - Uses internal network (e.g., http://localhost:8790)\n * - No proxy overhead\n *\n * **Browser Environment** (Next.js Client Components):\n * - Routes through Next.js API Route proxy (e.g., /api/proxy/*)\n * - Enables HttpOnly cookie forwarding\n * - Maintains CORS security\n *\n * @example\n * ```typescript\n * // Server Component - direct call\n * import { createUniversalClient } from '@spfn/core/client';\n * const client = createUniversalClient();\n * const result = await client.call(loginContract, { body: {...} });\n *\n * // Client Component - proxied call (automatic)\n * 'use client';\n * const client = createUniversalClient();\n * const result = await client.call(loginContract, { body: {...} }); // Goes through /api/proxy\n * ```\n */\nexport class UniversalClient\n{\n private readonly directClient: ContractClient;\n private readonly proxyBasePath: string;\n private readonly isServer: boolean;\n private readonly fetchImpl: typeof fetch;\n\n constructor(config: UniversalClientConfig = {})\n {\n // Detect environment once during construction\n this.isServer = isServerEnvironment();\n\n // Direct client for server-side calls\n this.directClient = new ContractClient({\n baseUrl: config.apiUrl,\n headers: config.headers,\n timeout: config.timeout,\n fetch: config.fetch,\n });\n\n // Proxy configuration for client-side calls\n this.proxyBasePath = config.proxyBasePath || '/api/actions';\n\n // Fetch implementation\n this.fetchImpl = config.fetch || globalThis.fetch.bind(globalThis);\n }\n\n /**\n * Make a type-safe API call using a contract\n *\n * Automatically routes based on environment:\n * - Server: Direct SPFN API call\n * - Browser: Next.js API Route proxy\n *\n * @param contract - Route contract with absolute path\n * @param options - Call options (params, query, body, headers)\n */\n async call<TContract extends RouteContract>(\n contract: TContract,\n options?: CallOptions<TContract>\n ): Promise<InferContract<TContract>['response']>\n {\n if (this.isServer)\n {\n // Server environment: Direct call to SPFN API\n return this.directClient.call(contract, options);\n }\n else\n {\n // Browser environment: Proxy through Next.js API Route\n return this.callViaProxy(contract, options);\n }\n }\n\n /**\n * Call via Next.js API Route proxy (client-side)\n *\n * Routes request through /api/proxy/[...path] to enable:\n * - HttpOnly cookie forwarding\n * - CORS security\n * - Server-side session management\n *\n * @private\n */\n private async callViaProxy<TContract extends RouteContract>(\n contract: TContract,\n options?: CallOptions<TContract>\n ): Promise<InferContract<TContract>['response']>\n {\n // Build proxy URL: /api/proxy + contract.path\n // Example: /_auth/login -> /api/proxy/_auth/login\n const path = this.buildUrlPath(\n contract.path,\n options?.params as Record<string, string | number> | undefined\n );\n const queryString = this.buildQueryString(\n options?.query as Record<string, string | string[] | number | boolean> | undefined\n );\n const proxyUrl = `${this.proxyBasePath}${path}${queryString}`;\n\n const method = this.getHttpMethod(contract, options);\n\n const headers: Record<string, string> = {\n ...options?.headers,\n };\n\n const isFormData = this.isFormData(options?.body);\n\n // Set Content-Type for JSON bodies\n if (options?.body !== undefined && !isFormData && !headers['Content-Type'])\n {\n headers['Content-Type'] = 'application/json';\n }\n\n const init: RequestInit = {\n method,\n headers,\n credentials: 'include', // Important: Include cookies for session\n ...options?.fetchOptions, // Spread environment-specific options (e.g., Next.js cache/next)\n };\n\n // Add body for POST/PUT/PATCH\n if (options?.body !== undefined)\n {\n init.body = isFormData\n ? (options.body as FormData)\n : JSON.stringify(options.body);\n }\n\n const response = await this.fetchImpl(proxyUrl, init);\n\n if (!response.ok)\n {\n const errorBody = await response.json().catch(() => null);\n throw new ApiClientError(\n `${method} ${path} failed: ${response.status} ${response.statusText}`,\n response.status,\n proxyUrl,\n errorBody,\n 'http'\n );\n }\n\n const data = await response.json();\n return data as InferContract<TContract>['response'];\n }\n\n /**\n * Build URL path with parameter substitution\n */\n private buildUrlPath(\n path: string,\n params?: Record<string, string | number>\n ): string\n {\n if (!params) return path;\n\n let url = path;\n for (const [key, value] of Object.entries(params))\n {\n url = url.replace(`:${key}`, String(value));\n }\n\n return url;\n }\n\n /**\n * Build query string from query parameters\n */\n private buildQueryString(\n query?: Record<string, string | string[] | number | boolean>\n ): string\n {\n if (!query || Object.keys(query).length === 0) return '';\n\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query))\n {\n if (Array.isArray(value))\n {\n value.forEach((v) => params.append(key, String(v)));\n }\n else if (value !== undefined && value !== null)\n {\n params.append(key, String(value));\n }\n }\n\n const queryString = params.toString();\n return queryString ? `?${queryString}` : '';\n }\n\n /**\n * Get HTTP method from contract or infer from options\n */\n private getHttpMethod<TContract extends RouteContract>(\n contract: TContract,\n options?: CallOptions<TContract>\n ): string\n {\n if ('method' in contract && typeof contract.method === 'string')\n {\n return contract.method.toUpperCase();\n }\n\n if (options?.body !== undefined)\n {\n return 'POST';\n }\n\n return 'GET';\n }\n\n /**\n * Check if body is FormData\n */\n private isFormData(body: unknown): body is FormData\n {\n return typeof FormData !== 'undefined' && body instanceof FormData;\n }\n\n /**\n * Check if currently running in server environment\n */\n isServerEnv(): boolean\n {\n return this.isServer;\n }\n\n /**\n * Create a new client with merged configuration\n */\n withConfig(config: Partial<UniversalClientConfig>): UniversalClient\n {\n return new UniversalClient({\n apiUrl: config.apiUrl || this.directClient['config'].baseUrl,\n proxyBasePath: config.proxyBasePath || this.proxyBasePath,\n headers: {\n ...this.directClient['config'].headers,\n ...config.headers,\n },\n timeout: config.timeout || this.directClient['config'].timeout,\n fetch: config.fetch || this.fetchImpl,\n });\n }\n}\n\n/**\n * Create a new universal API client\n *\n * @example\n * ```typescript\n * // Default configuration\n * const client = createUniversalClient();\n *\n * // Custom configuration\n * const client = createUniversalClient({\n * apiUrl: 'http://localhost:4000',\n * proxyBasePath: '/api/spfn',\n * headers: { 'X-App-Version': '1.0.0' },\n * });\n * ```\n */\nexport function createUniversalClient(config?: UniversalClientConfig): UniversalClient\n{\n return new UniversalClient(config);\n}\n\n/**\n * Global universal client singleton instance\n */\nlet _universalClientInstance: UniversalClient | null = null;\n\n/**\n * Configure the global universal client instance\n *\n * Call this in your app initialization to set default configuration\n * for all auto-generated API calls.\n *\n * @example\n * ```typescript\n * // In app initialization (layout.tsx, _app.tsx, etc)\n * import { configureUniversalClient } from '@spfn/core/client';\n *\n * configureUniversalClient({\n * apiUrl: process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8790',\n * proxyBasePath: '/api/proxy',\n * headers: {\n * 'X-App-Version': '1.0.0'\n * }\n * });\n * ```\n */\nexport function configureUniversalClient(config: UniversalClientConfig): void\n{\n _universalClientInstance = new UniversalClient(config);\n}\n\n/**\n * Get the global universal client instance\n *\n * Creates a default instance if not configured\n */\nexport function getUniversalClient(): UniversalClient\n{\n if (!_universalClientInstance)\n {\n _universalClientInstance = new UniversalClient();\n }\n\n return _universalClientInstance;\n}\n\n/**\n * Global universal client singleton with Proxy\n *\n * This client can be configured using configureUniversalClient() before use.\n * Used by auto-generated API client code.\n */\nexport const universalClient = new Proxy({} as UniversalClient, {\n get(_target, prop)\n {\n const instance = getUniversalClient();\n return instance[prop as keyof UniversalClient];\n }\n});"]}
|
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
import { NextResponse } from 'next/server';
|
|
2
|
-
import { cookies } from 'next/headers.js';
|
|
3
|
-
|
|
4
|
-
// src/client/nextjs/proxy.ts
|
|
5
|
-
|
|
6
|
-
// src/client/nextjs/interceptor.ts
|
|
7
|
-
function matchPath(path, pattern) {
|
|
8
|
-
if (pattern === "*") {
|
|
9
|
-
return true;
|
|
10
|
-
}
|
|
11
|
-
if (pattern instanceof RegExp) {
|
|
12
|
-
return pattern.test(path);
|
|
13
|
-
}
|
|
14
|
-
const regexPattern = pattern.replace(/\*/g, ".*").replace(/:[^/]+/g, "[^/]+").replace(/\//g, "\\/");
|
|
15
|
-
const regex = new RegExp(`^${regexPattern}$`);
|
|
16
|
-
return regex.test(path);
|
|
17
|
-
}
|
|
18
|
-
function matchMethod(method, pattern) {
|
|
19
|
-
if (!pattern) {
|
|
20
|
-
return true;
|
|
21
|
-
}
|
|
22
|
-
if (typeof pattern === "string") {
|
|
23
|
-
return method.toUpperCase() === pattern.toUpperCase();
|
|
24
|
-
}
|
|
25
|
-
return pattern.some((m) => m.toUpperCase() === method.toUpperCase());
|
|
26
|
-
}
|
|
27
|
-
function filterMatchingInterceptors(rules, path, method) {
|
|
28
|
-
return rules.filter((rule) => {
|
|
29
|
-
return matchPath(path, rule.pathPattern) && matchMethod(method, rule.method);
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
async function executeRequestInterceptors(context, interceptors) {
|
|
33
|
-
let index = 0;
|
|
34
|
-
const next = async () => {
|
|
35
|
-
if (index >= interceptors.length) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
const interceptor = interceptors[index];
|
|
39
|
-
index++;
|
|
40
|
-
await interceptor(context, next);
|
|
41
|
-
};
|
|
42
|
-
await next();
|
|
43
|
-
}
|
|
44
|
-
async function executeResponseInterceptors(context, interceptors) {
|
|
45
|
-
let index = 0;
|
|
46
|
-
const next = async () => {
|
|
47
|
-
if (index >= interceptors.length) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
const interceptor = interceptors[index];
|
|
51
|
-
index++;
|
|
52
|
-
await interceptor(context, next);
|
|
53
|
-
};
|
|
54
|
-
await next();
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// src/client/nextjs/registry.ts
|
|
58
|
-
var InterceptorRegistry = class {
|
|
59
|
-
interceptors = /* @__PURE__ */ new Map();
|
|
60
|
-
/**
|
|
61
|
-
* Register interceptors for a package
|
|
62
|
-
*
|
|
63
|
-
* @param packageName - Unique package identifier (e.g., 'auth', 'storage')
|
|
64
|
-
* @param interceptors - Array of interceptor rules
|
|
65
|
-
*
|
|
66
|
-
* @example
|
|
67
|
-
* ```typescript
|
|
68
|
-
* registerInterceptors('auth', [
|
|
69
|
-
* {
|
|
70
|
-
* pathPattern: '/_auth/*',
|
|
71
|
-
* request: async (ctx, next) => { ... }
|
|
72
|
-
* }
|
|
73
|
-
* ]);
|
|
74
|
-
* ```
|
|
75
|
-
*/
|
|
76
|
-
register(packageName, interceptors) {
|
|
77
|
-
console.log(`[SPFN Registry] Registering ${interceptors.length} interceptors for package "${packageName}"`);
|
|
78
|
-
if (this.interceptors.has(packageName)) {
|
|
79
|
-
console.warn(
|
|
80
|
-
`[SPFN Registry] Interceptors for "${packageName}" already registered. Overwriting.`
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
this.interceptors.set(packageName, interceptors);
|
|
84
|
-
console.log(`[SPFN Registry] Successfully registered interceptors for "${packageName}". Total packages: ${this.getPackageNames().length}`);
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Get all registered interceptors
|
|
88
|
-
*
|
|
89
|
-
* @param exclude - Package names to exclude
|
|
90
|
-
* @returns Flat array of all interceptor rules
|
|
91
|
-
*/
|
|
92
|
-
getAll(exclude = []) {
|
|
93
|
-
const all = [];
|
|
94
|
-
for (const [packageName, interceptors] of this.interceptors.entries()) {
|
|
95
|
-
if (!exclude.includes(packageName)) {
|
|
96
|
-
all.push(...interceptors);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return all;
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Get interceptors for specific package
|
|
103
|
-
*
|
|
104
|
-
* @param packageName - Package identifier
|
|
105
|
-
* @returns Interceptor rules or undefined
|
|
106
|
-
*/
|
|
107
|
-
get(packageName) {
|
|
108
|
-
return this.interceptors.get(packageName);
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Get list of registered package names
|
|
112
|
-
*/
|
|
113
|
-
getPackageNames() {
|
|
114
|
-
return Array.from(this.interceptors.keys());
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Check if package has registered interceptors
|
|
118
|
-
*/
|
|
119
|
-
has(packageName) {
|
|
120
|
-
return this.interceptors.has(packageName);
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Unregister interceptors for a package
|
|
124
|
-
*
|
|
125
|
-
* @param packageName - Package identifier
|
|
126
|
-
*/
|
|
127
|
-
unregister(packageName) {
|
|
128
|
-
this.interceptors.delete(packageName);
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Clear all registered interceptors
|
|
132
|
-
*
|
|
133
|
-
* Useful for testing
|
|
134
|
-
*/
|
|
135
|
-
clear() {
|
|
136
|
-
this.interceptors.clear();
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Get total count of registered interceptors
|
|
140
|
-
*/
|
|
141
|
-
count() {
|
|
142
|
-
let total = 0;
|
|
143
|
-
for (const interceptors of this.interceptors.values()) {
|
|
144
|
-
total += interceptors.length;
|
|
145
|
-
}
|
|
146
|
-
return total;
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
var interceptorRegistry = new InterceptorRegistry();
|
|
150
|
-
function registerInterceptors(packageName, interceptors) {
|
|
151
|
-
interceptorRegistry.register(packageName, interceptors);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// src/client/nextjs/proxy.ts
|
|
155
|
-
function getApiUrl(config) {
|
|
156
|
-
return config?.apiUrl || process.env.SERVER_API_URL || process.env.SPFN_API_URL || "http://localhost:8790";
|
|
157
|
-
}
|
|
158
|
-
async function handleProxy(request, context, method, config) {
|
|
159
|
-
try {
|
|
160
|
-
const params = "then" in context.params ? await context.params : context.params;
|
|
161
|
-
const pathSegments = params.path;
|
|
162
|
-
const path = `/${pathSegments.join("/")}`;
|
|
163
|
-
const query = {};
|
|
164
|
-
request.nextUrl.searchParams.forEach((value, key) => {
|
|
165
|
-
const existing = query[key];
|
|
166
|
-
if (existing) {
|
|
167
|
-
query[key] = Array.isArray(existing) ? [...existing, value] : [existing, value];
|
|
168
|
-
} else {
|
|
169
|
-
query[key] = value;
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
const cookieStore = await cookies();
|
|
173
|
-
const cookieMap = /* @__PURE__ */ new Map();
|
|
174
|
-
cookieStore.getAll().forEach((cookie) => {
|
|
175
|
-
cookieMap.set(cookie.name, cookie.value);
|
|
176
|
-
});
|
|
177
|
-
const headers = {
|
|
178
|
-
"Content-Type": "application/json"
|
|
179
|
-
};
|
|
180
|
-
let body = void 0;
|
|
181
|
-
const contentType = request.headers.get("Content-Type");
|
|
182
|
-
if (method === "POST" || method === "PUT" || method === "PATCH") {
|
|
183
|
-
if (contentType?.includes("application/json")) {
|
|
184
|
-
const text = await request.text();
|
|
185
|
-
if (text) {
|
|
186
|
-
try {
|
|
187
|
-
body = JSON.parse(text);
|
|
188
|
-
} catch (error) {
|
|
189
|
-
body = text;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
} else if (contentType?.includes("multipart/form-data")) {
|
|
193
|
-
body = await request.formData();
|
|
194
|
-
} else {
|
|
195
|
-
body = await request.text();
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
const requestContext = {
|
|
199
|
-
path,
|
|
200
|
-
method,
|
|
201
|
-
headers,
|
|
202
|
-
body,
|
|
203
|
-
query,
|
|
204
|
-
cookies: cookieMap,
|
|
205
|
-
request,
|
|
206
|
-
metadata: {}
|
|
207
|
-
};
|
|
208
|
-
const rules = config?.interceptors || [];
|
|
209
|
-
console.log(`[SPFN Proxy] Handling ${method} ${path}`);
|
|
210
|
-
console.log(`[SPFN Proxy] Total available interceptor rules: ${rules.length}`);
|
|
211
|
-
const matchedRules = filterMatchingInterceptors(rules, path, method);
|
|
212
|
-
console.log(`[SPFN Proxy] Matched ${matchedRules.length} interceptor rules for this request`);
|
|
213
|
-
const requestInterceptors = matchedRules.map((rule) => rule.request).filter((interceptor) => !!interceptor);
|
|
214
|
-
console.log(`[SPFN Proxy] Executing ${requestInterceptors.length} request interceptors`);
|
|
215
|
-
await executeRequestInterceptors(requestContext, requestInterceptors);
|
|
216
|
-
const apiUrl = getApiUrl(config);
|
|
217
|
-
const queryString = Object.entries(query).flatMap(
|
|
218
|
-
([key, value]) => Array.isArray(value) ? value.map((v) => `${key}=${v}`) : [`${key}=${value}`]
|
|
219
|
-
).join("&");
|
|
220
|
-
const url = `${apiUrl}${path}${queryString ? `?${queryString}` : ""}`;
|
|
221
|
-
const init = {
|
|
222
|
-
method,
|
|
223
|
-
headers: requestContext.headers
|
|
224
|
-
};
|
|
225
|
-
if (requestContext.body !== void 0) {
|
|
226
|
-
if (requestContext.body instanceof FormData) {
|
|
227
|
-
init.body = requestContext.body;
|
|
228
|
-
delete requestContext.headers["Content-Type"];
|
|
229
|
-
} else if (typeof requestContext.body === "string") {
|
|
230
|
-
init.body = requestContext.body;
|
|
231
|
-
} else {
|
|
232
|
-
init.body = JSON.stringify(requestContext.body);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
if (config?.debug) {
|
|
236
|
-
console.log(`[SPFN Proxy] Calling ${url}`);
|
|
237
|
-
console.log(`[SPFN Proxy] Headers:`, requestContext.headers);
|
|
238
|
-
}
|
|
239
|
-
const response = await fetch(url, init);
|
|
240
|
-
const responseText = await response.text();
|
|
241
|
-
let responseBody;
|
|
242
|
-
try {
|
|
243
|
-
responseBody = JSON.parse(responseText);
|
|
244
|
-
} catch (error) {
|
|
245
|
-
responseBody = responseText;
|
|
246
|
-
}
|
|
247
|
-
const responseContext = {
|
|
248
|
-
path,
|
|
249
|
-
method,
|
|
250
|
-
request: {
|
|
251
|
-
headers: requestContext.headers,
|
|
252
|
-
body: requestContext.body
|
|
253
|
-
},
|
|
254
|
-
response: {
|
|
255
|
-
status: response.status,
|
|
256
|
-
statusText: response.statusText,
|
|
257
|
-
headers: response.headers,
|
|
258
|
-
body: responseBody
|
|
259
|
-
},
|
|
260
|
-
setCookies: [],
|
|
261
|
-
metadata: requestContext.metadata
|
|
262
|
-
// Pass metadata from request
|
|
263
|
-
};
|
|
264
|
-
const responseInterceptors = matchedRules.map((rule) => rule.response).filter((interceptor) => !!interceptor);
|
|
265
|
-
if (config?.debug) {
|
|
266
|
-
console.log(`[SPFN Proxy] Response interceptors: ${responseInterceptors.length}`);
|
|
267
|
-
}
|
|
268
|
-
await executeResponseInterceptors(responseContext, responseInterceptors);
|
|
269
|
-
const nextResponse = NextResponse.json(responseContext.response.body, {
|
|
270
|
-
status: responseContext.response.status,
|
|
271
|
-
statusText: responseContext.response.statusText
|
|
272
|
-
});
|
|
273
|
-
for (const cookie of responseContext.setCookies) {
|
|
274
|
-
const cookieString = [`${cookie.name}=${cookie.value}`];
|
|
275
|
-
if (cookie.options?.httpOnly) {
|
|
276
|
-
cookieString.push("HttpOnly");
|
|
277
|
-
}
|
|
278
|
-
if (cookie.options?.secure) {
|
|
279
|
-
cookieString.push("Secure");
|
|
280
|
-
}
|
|
281
|
-
if (cookie.options?.sameSite) {
|
|
282
|
-
cookieString.push(`SameSite=${cookie.options.sameSite}`);
|
|
283
|
-
}
|
|
284
|
-
if (cookie.options?.maxAge !== void 0) {
|
|
285
|
-
cookieString.push(`Max-Age=${cookie.options.maxAge}`);
|
|
286
|
-
}
|
|
287
|
-
if (cookie.options?.path) {
|
|
288
|
-
cookieString.push(`Path=${cookie.options.path}`);
|
|
289
|
-
}
|
|
290
|
-
if (cookie.options?.domain) {
|
|
291
|
-
cookieString.push(`Domain=${cookie.options.domain}`);
|
|
292
|
-
}
|
|
293
|
-
nextResponse.headers.append("Set-Cookie", cookieString.join("; "));
|
|
294
|
-
}
|
|
295
|
-
const setCookieHeaders = response.headers.get("Set-Cookie");
|
|
296
|
-
if (setCookieHeaders) {
|
|
297
|
-
nextResponse.headers.append("Set-Cookie", setCookieHeaders);
|
|
298
|
-
}
|
|
299
|
-
if (config?.debug) {
|
|
300
|
-
console.log(`[SPFN Proxy] Response: ${responseContext.response.status}`);
|
|
301
|
-
}
|
|
302
|
-
return nextResponse;
|
|
303
|
-
} catch (error) {
|
|
304
|
-
console.error("[SPFN Proxy] Error:", error);
|
|
305
|
-
return NextResponse.json(
|
|
306
|
-
{
|
|
307
|
-
success: false,
|
|
308
|
-
error: {
|
|
309
|
-
code: "PROXY_ERROR",
|
|
310
|
-
message: error instanceof Error ? error.message : "Unknown proxy error"
|
|
311
|
-
}
|
|
312
|
-
},
|
|
313
|
-
{ status: 500 }
|
|
314
|
-
);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
function createProxy(config) {
|
|
318
|
-
const finalConfig = {
|
|
319
|
-
autoDiscoverInterceptors: true,
|
|
320
|
-
...config
|
|
321
|
-
};
|
|
322
|
-
let allInterceptors = [];
|
|
323
|
-
console.log("[SPFN Proxy] Creating proxy with config:", {
|
|
324
|
-
autoDiscoverInterceptors: finalConfig.autoDiscoverInterceptors,
|
|
325
|
-
customInterceptors: finalConfig.interceptors?.length || 0,
|
|
326
|
-
disableAutoInterceptors: finalConfig.disableAutoInterceptors || []
|
|
327
|
-
});
|
|
328
|
-
if (finalConfig.autoDiscoverInterceptors) {
|
|
329
|
-
const registeredPackages = interceptorRegistry.getPackageNames();
|
|
330
|
-
console.log("[SPFN Proxy] Registered packages in registry:", registeredPackages);
|
|
331
|
-
const autoInterceptors = interceptorRegistry.getAll(
|
|
332
|
-
finalConfig.disableAutoInterceptors || []
|
|
333
|
-
);
|
|
334
|
-
allInterceptors.push(...autoInterceptors);
|
|
335
|
-
console.log("[SPFN Proxy] Auto-discovered interceptors from packages:", registeredPackages);
|
|
336
|
-
console.log(`[SPFN Proxy] Total auto-discovered interceptors: ${autoInterceptors.length}`);
|
|
337
|
-
}
|
|
338
|
-
if (finalConfig.interceptors) {
|
|
339
|
-
allInterceptors.push(...finalConfig.interceptors);
|
|
340
|
-
console.log(`[SPFN Proxy] Custom interceptors: ${finalConfig.interceptors.length}`);
|
|
341
|
-
}
|
|
342
|
-
const proxyConfig = {
|
|
343
|
-
...finalConfig,
|
|
344
|
-
interceptors: allInterceptors
|
|
345
|
-
};
|
|
346
|
-
console.log(`[SPFN Proxy] Total interceptors loaded: ${allInterceptors.length}`);
|
|
347
|
-
return {
|
|
348
|
-
GET: async (request, context) => handleProxy(request, context, "GET", proxyConfig),
|
|
349
|
-
POST: async (request, context) => handleProxy(request, context, "POST", proxyConfig),
|
|
350
|
-
PUT: async (request, context) => handleProxy(request, context, "PUT", proxyConfig),
|
|
351
|
-
PATCH: async (request, context) => handleProxy(request, context, "PATCH", proxyConfig),
|
|
352
|
-
DELETE: async (request, context) => handleProxy(request, context, "DELETE", proxyConfig)
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
var defaultProxy = null;
|
|
356
|
-
function getDefaultProxy() {
|
|
357
|
-
if (!defaultProxy) {
|
|
358
|
-
console.log("[SPFN Proxy] Initializing default proxy with auto-discovery");
|
|
359
|
-
defaultProxy = createProxy();
|
|
360
|
-
}
|
|
361
|
-
return defaultProxy;
|
|
362
|
-
}
|
|
363
|
-
var GET = async (request, context) => getDefaultProxy().GET(request, context);
|
|
364
|
-
var POST = async (request, context) => getDefaultProxy().POST(request, context);
|
|
365
|
-
var PUT = async (request, context) => getDefaultProxy().PUT(request, context);
|
|
366
|
-
var PATCH = async (request, context) => getDefaultProxy().PATCH(request, context);
|
|
367
|
-
var DELETE = async (request, context) => getDefaultProxy().DELETE(request, context);
|
|
368
|
-
|
|
369
|
-
export { DELETE, GET, PATCH, POST, PUT, createProxy, executeRequestInterceptors, executeResponseInterceptors, filterMatchingInterceptors, interceptorRegistry, matchMethod, matchPath, registerInterceptors };
|
|
370
|
-
//# sourceMappingURL=index.js.map
|
|
371
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/client/nextjs/interceptor.ts","../../../src/client/nextjs/registry.ts","../../../src/client/nextjs/proxy.ts"],"names":[],"mappings":";;;;;;AA0BO,SAAS,SAAA,CAAU,MAAc,OAAA,EACxC;AAEI,EAAA,IAAI,YAAY,GAAA,EAChB;AACI,IAAA,OAAO,IAAA;AAAA,EACX;AAGA,EAAA,IAAI,mBAAmB,MAAA,EACvB;AACI,IAAA,OAAO,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,EAC5B;AAMA,EAAA,MAAM,YAAA,GAAe,OAAA,CAChB,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA,CACnB,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA,CAC1B,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA;AAEzB,EAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,CAAG,CAAA;AAC5C,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAC1B;AASO,SAAS,WAAA,CACZ,QACA,OAAA,EAEJ;AAEI,EAAA,IAAI,CAAC,OAAA,EACL;AACI,IAAA,OAAO,IAAA;AAAA,EACX;AAGA,EAAA,IAAI,OAAO,YAAY,QAAA,EACvB;AACI,IAAA,OAAO,MAAA,CAAO,WAAA,EAAY,KAAM,OAAA,CAAQ,WAAA,EAAY;AAAA,EACxD;AAGA,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAM,EAAE,WAAA,EAAY,KAAM,MAAA,CAAO,WAAA,EAAa,CAAA;AACvE;AAUO,SAAS,0BAAA,CACZ,KAAA,EACA,IAAA,EACA,MAAA,EAEJ;AACI,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS;AAC1B,IAAA,OAAO,SAAA,CAAU,MAAM,IAAA,CAAK,WAAW,KAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,MAAM,CAAA;AAAA,EAC/E,CAAC,CAAA;AACL;AAgBA,eAAsB,0BAAA,CAClB,SACA,YAAA,EAEJ;AACI,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,MAAM,OAAO,YAA2B;AACpC,IAAA,IAAI,KAAA,IAAS,aAAa,MAAA,EAC1B;AACI,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,WAAA,GAAc,aAAa,KAAK,CAAA;AACtC,IAAA,KAAA,EAAA;AAEA,IAAA,MAAM,WAAA,CAAY,SAAS,IAAI,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,IAAA,EAAK;AACf;AAgBA,eAAsB,2BAAA,CAClB,SACA,YAAA,EAEJ;AACI,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,MAAM,OAAO,YAA2B;AACpC,IAAA,IAAI,KAAA,IAAS,aAAa,MAAA,EAC1B;AACI,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,WAAA,GAAc,aAAa,KAAK,CAAA;AACtC,IAAA,KAAA,EAAA;AAEA,IAAA,MAAM,WAAA,CAAY,SAAS,IAAI,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,MAAM,IAAA,EAAK;AACf;;;AC3JA,IAAM,sBAAN,MACA;AAAA,EACY,YAAA,uBAAmB,GAAA,EAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkB1D,QAAA,CAAS,aAAqB,YAAA,EAC9B;AACI,IAAA,OAAA,CAAQ,IAAI,CAAA,4BAAA,EAA+B,YAAA,CAAa,MAAM,CAAA,2BAAA,EAA8B,WAAW,CAAA,CAAA,CAAG,CAAA;AAE1G,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,WAAW,CAAA,EACrC;AACI,MAAA,OAAA,CAAQ,IAAA;AAAA,QACJ,qCAAqC,WAAW,CAAA,kCAAA;AAAA,OACpD;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,YAAY,CAAA;AAC/C,IAAA,OAAA,CAAQ,GAAA,CAAI,6DAA6D,WAAW,CAAA,mBAAA,EAAsB,KAAK,eAAA,EAAgB,CAAE,MAAM,CAAA,CAAE,CAAA;AAAA,EAC7I;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CAAO,OAAA,GAAoB,EAAC,EAC5B;AACI,IAAA,MAAM,MAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,CAAC,WAAA,EAAa,YAAY,KAAK,IAAA,CAAK,YAAA,CAAa,SAAQ,EACpE;AACI,MAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EACjC;AACI,QAAA,GAAA,CAAI,IAAA,CAAK,GAAG,YAAY,CAAA;AAAA,MAC5B;AAAA,IACJ;AAEA,IAAA,OAAO,GAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,WAAA,EACJ;AACI,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,WAAW,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GACA;AACI,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAA,EACJ;AACI,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,WAAW,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,WAAA,EACX;AACI,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,WAAW,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAA,GACA;AACI,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GACA;AACI,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,YAAA,IAAgB,IAAA,CAAK,YAAA,CAAa,MAAA,EAAO,EACpD;AACI,MAAA,KAAA,IAAS,YAAA,CAAa,MAAA;AAAA,IAC1B;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AACJ,CAAA;AAKO,IAAM,mBAAA,GAAsB,IAAI,mBAAA;AA+BhC,SAAS,oBAAA,CACZ,aACA,YAAA,EAEJ;AACI,EAAA,mBAAA,CAAoB,QAAA,CAAS,aAAa,YAAY,CAAA;AAC1D;;;AC/HA,SAAS,UAAU,MAAA,EACnB;AACI,EAAA,OACI,QAAQ,MAAA,IACR,OAAA,CAAQ,IAAI,cAAA,IACZ,OAAA,CAAQ,IAAI,YAAA,IACZ,uBAAA;AAER;AAKA,eAAe,WAAA,CACX,OAAA,EACA,OAAA,EACA,MAAA,EACA,MAAA,EAEJ;AACI,EAAA,IACA;AAEI,IAAA,MAAM,SAAS,MAAA,IAAU,OAAA,CAAQ,SAAS,MAAM,OAAA,CAAQ,SAAS,OAAA,CAAQ,MAAA;AACzE,IAAA,MAAM,eAAe,MAAA,CAAO,IAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,CAAA,CAAA,EAAI,YAAA,CAAa,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAGvC,IAAA,MAAM,QAA2C,EAAC;AAClD,IAAA,OAAA,CAAQ,OAAA,CAAQ,YAAA,CAAa,OAAA,CAAQ,CAAC,OAAO,GAAA,KAAQ;AACjD,MAAA,MAAM,QAAA,GAAW,MAAM,GAAG,CAAA;AAC1B,MAAA,IAAI,QAAA,EACJ;AACI,QAAA,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,CAAC,GAAG,QAAA,EAAU,KAAK,CAAA,GAAI,CAAC,UAAU,KAAK,CAAA;AAAA,MAClF,CAAA,MAEA;AACI,QAAA,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,MACjB;AAAA,IACJ,CAAC,CAAA;AAGD,IAAA,MAAM,WAAA,GAAc,MAAM,OAAA,EAAQ;AAClC,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,IAAA,WAAA,CAAY,MAAA,EAAO,CAAE,OAAA,CAAQ,CAAC,MAAA,KAAW;AACrC,MAAA,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA;AAAA,IAC3C,CAAC,CAAA;AAGD,IAAA,MAAM,OAAA,GAAkC;AAAA,MACpC,cAAA,EAAgB;AAAA,KACpB;AAGA,IAAA,IAAI,IAAA,GAAY,MAAA;AAChB,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AAEtD,IAAA,IAAI,MAAA,KAAW,MAAA,IAAU,MAAA,KAAW,KAAA,IAAS,WAAW,OAAA,EACxD;AACI,MAAA,IAAI,WAAA,EAAa,QAAA,CAAS,kBAAkB,CAAA,EAC5C;AACI,QAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,IAAA,EAAK;AAChC,QAAA,IAAI,IAAA,EACJ;AACI,UAAA,IACA;AACI,YAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,UAC1B,SACO,KAAA,EACP;AACI,YAAA,IAAA,GAAO,IAAA;AAAA,UACX;AAAA,QACJ;AAAA,MACJ,CAAA,MAAA,IACS,WAAA,EAAa,QAAA,CAAS,qBAAqB,CAAA,EACpD;AACI,QAAA,IAAA,GAAO,MAAM,QAAQ,QAAA,EAAS;AAAA,MAClC,CAAA,MAEA;AACI,QAAA,IAAA,GAAO,MAAM,QAAQ,IAAA,EAAK;AAAA,MAC9B;AAAA,IACJ;AAGA,IAAA,MAAM,cAAA,GAA4C;AAAA,MAC9C,IAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA,EAAS,SAAA;AAAA,MACT,OAAA;AAAA,MACA,UAAU;AAAC,KACf;AAGA,IAAA,MAAM,KAAA,GAAQ,MAAA,EAAQ,YAAA,IAAgB,EAAC;AACvC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAyB,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AACrD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gDAAA,EAAmD,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAE7E,IAAA,MAAM,YAAA,GAAe,0BAAA,CAA2B,KAAA,EAAO,IAAA,EAAM,MAAM,CAAA;AACnE,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,YAAA,CAAa,MAAM,CAAA,mCAAA,CAAqC,CAAA;AAE5F,IAAA,MAAM,mBAAA,GAAsB,YAAA,CACvB,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,CAAA,CAC1B,MAAA,CAAO,CAAC,WAAA,KAAgE,CAAC,CAAC,WAAW,CAAA;AAE1F,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uBAAA,EAA0B,mBAAA,CAAoB,MAAM,CAAA,qBAAA,CAAuB,CAAA;AAEvF,IAAA,MAAM,0BAAA,CAA2B,gBAAgB,mBAAmB,CAAA;AAGpE,IAAA,MAAM,MAAA,GAAS,UAAU,MAAM,CAAA;AAC/B,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CACnC,OAAA;AAAA,MAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KACjB,MAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;AAAA,KAC/E,CACC,KAAK,GAAG,CAAA;AACb,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA,EAAG,IAAI,GAAG,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAGnE,IAAA,MAAM,IAAA,GAAoB;AAAA,MACtB,MAAA;AAAA,MACA,SAAS,cAAA,CAAe;AAAA,KAC5B;AAGA,IAAA,IAAI,cAAA,CAAe,SAAS,MAAA,EAC5B;AACI,MAAA,IAAI,cAAA,CAAe,gBAAgB,QAAA,EACnC;AACI,QAAA,IAAA,CAAK,OAAO,cAAA,CAAe,IAAA;AAE3B,QAAA,OAAO,cAAA,CAAe,QAAQ,cAAc,CAAA;AAAA,MAChD,CAAA,MAAA,IACS,OAAO,cAAA,CAAe,IAAA,KAAS,QAAA,EACxC;AACI,QAAA,IAAA,CAAK,OAAO,cAAA,CAAe,IAAA;AAAA,MAC/B,CAAA,MAEA;AACI,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,IAAI,CAAA;AAAA,MAClD;AAAA,IACJ;AAEA,IAAA,IAAI,QAAQ,KAAA,EACZ;AACI,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,GAAG,CAAA,CAAE,CAAA;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,CAAA,EAAyB,cAAA,CAAe,OAAO,CAAA;AAAA,IAC/D;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA;AACtC,IAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AAGzC,IAAA,IAAI,YAAA;AACJ,IAAA,IACA;AACI,MAAA,YAAA,GAAe,IAAA,CAAK,MAAM,YAAY,CAAA;AAAA,IAC1C,SACO,KAAA,EACP;AACI,MAAA,YAAA,GAAe,YAAA;AAAA,IACnB;AAGA,IAAA,MAAM,eAAA,GAA8C;AAAA,MAChD,IAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACL,SAAS,cAAA,CAAe,OAAA;AAAA,QACxB,MAAM,cAAA,CAAe;AAAA,OACzB;AAAA,MACA,QAAA,EAAU;AAAA,QACN,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,IAAA,EAAM;AAAA,OACV;AAAA,MACA,YAAY,EAAC;AAAA,MACb,UAAU,cAAA,CAAe;AAAA;AAAA,KAC7B;AAGA,IAAA,MAAM,oBAAA,GAAuB,YAAA,CACxB,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,QAAQ,CAAA,CAC3B,MAAA,CAAO,CAAC,WAAA,KAAgE,CAAC,CAAC,WAAW,CAAA;AAE1F,IAAA,IAAI,QAAQ,KAAA,EACZ;AACI,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAuC,oBAAA,CAAqB,MAAM,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,MAAM,2BAAA,CAA4B,iBAAiB,oBAAoB,CAAA;AAGvE,IAAA,MAAM,YAAA,GAAe,YAAA,CAAa,IAAA,CAAK,eAAA,CAAgB,SAAS,IAAA,EAAM;AAAA,MAClE,MAAA,EAAQ,gBAAgB,QAAA,CAAS,MAAA;AAAA,MACjC,UAAA,EAAY,gBAAgB,QAAA,CAAS;AAAA,KACxC,CAAA;AAGD,IAAA,KAAA,MAAW,MAAA,IAAU,gBAAgB,UAAA,EACrC;AACI,MAAA,MAAM,YAAA,GAAe,CAAC,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AAEtD,MAAA,IAAI,MAAA,CAAO,SAAS,QAAA,EACpB;AACI,QAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAAA,MAChC;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EACpB;AACI,QAAA,YAAA,CAAa,KAAK,QAAQ,CAAA;AAAA,MAC9B;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,QAAA,EACpB;AACI,QAAA,YAAA,CAAa,IAAA,CAAK,CAAA,SAAA,EAAY,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC3D;AACA,MAAA,IAAI,MAAA,CAAO,OAAA,EAAS,MAAA,KAAW,MAAA,EAC/B;AACI,QAAA,YAAA,CAAa,IAAA,CAAK,CAAA,QAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,MACxD;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,IAAA,EACpB;AACI,QAAA,YAAA,CAAa,IAAA,CAAK,CAAA,KAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,MACnD;AACA,MAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EACpB;AACI,QAAA,YAAA,CAAa,IAAA,CAAK,CAAA,OAAA,EAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,MACvD;AAEA,MAAA,YAAA,CAAa,QAAQ,MAAA,CAAO,YAAA,EAAc,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACrE;AAGA,IAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AAC1D,IAAA,IAAI,gBAAA,EACJ;AACI,MAAA,YAAA,CAAa,OAAA,CAAQ,MAAA,CAAO,YAAA,EAAc,gBAAgB,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,QAAQ,KAAA,EACZ;AACI,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uBAAA,EAA0B,eAAA,CAAgB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAC3E;AAEA,IAAA,OAAO,YAAA;AAAA,EACX,SACO,KAAA,EACP;AACI,IAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAE1C,IAAA,OAAO,YAAA,CAAa,IAAA;AAAA,MAChB;AAAA,QACI,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACH,IAAA,EAAM,aAAA;AAAA,UACN,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA;AACtD,OACJ;AAAA,MACA,EAAE,QAAQ,GAAA;AAAI,KAClB;AAAA,EACJ;AACJ;AA0CO,SAAS,YAAY,MAAA,EAC5B;AAEI,EAAA,MAAM,WAAA,GAAc;AAAA,IAChB,wBAAA,EAA0B,IAAA;AAAA,IAC1B,GAAG;AAAA,GACP;AAEA,EAAA,IAAI,kBAAqC,EAAC;AAE1C,EAAA,OAAA,CAAQ,IAAI,0CAAA,EAA4C;AAAA,IACpD,0BAA0B,WAAA,CAAY,wBAAA;AAAA,IACtC,kBAAA,EAAoB,WAAA,CAAY,YAAA,EAAc,MAAA,IAAU,CAAA;AAAA,IACxD,uBAAA,EAAyB,WAAA,CAAY,uBAAA,IAA2B;AAAC,GACpE,CAAA;AAGD,EAAA,IAAI,YAAY,wBAAA,EAChB;AACI,IAAA,MAAM,kBAAA,GAAqB,oBAAoB,eAAA,EAAgB;AAC/D,IAAA,OAAA,CAAQ,GAAA,CAAI,iDAAiD,kBAAkB,CAAA;AAE/E,IAAA,MAAM,mBAAmB,mBAAA,CAAoB,MAAA;AAAA,MACzC,WAAA,CAAY,2BAA2B;AAAC,KAC5C;AACA,IAAA,eAAA,CAAgB,IAAA,CAAK,GAAG,gBAAgB,CAAA;AAExC,IAAA,OAAA,CAAQ,GAAA,CAAI,4DAA4D,kBAAkB,CAAA;AAC1F,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iDAAA,EAAoD,gBAAA,CAAiB,MAAM,CAAA,CAAE,CAAA;AAAA,EAC7F;AAGA,EAAA,IAAI,YAAY,YAAA,EAChB;AACI,IAAA,eAAA,CAAgB,IAAA,CAAK,GAAG,WAAA,CAAY,YAAY,CAAA;AAChD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kCAAA,EAAqC,WAAA,CAAY,YAAA,CAAa,MAAM,CAAA,CAAE,CAAA;AAAA,EACtF;AAGA,EAAA,MAAM,WAAA,GAA2B;AAAA,IAC7B,GAAG,WAAA;AAAA,IACH,YAAA,EAAc;AAAA,GAClB;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wCAAA,EAA2C,eAAA,CAAgB,MAAM,CAAA,CAAE,CAAA;AAE/E,EAAA,OAAO;AAAA,IACH,GAAA,EAAK,OACD,OAAA,EACA,OAAA,KACC,YAAY,OAAA,EAAS,OAAA,EAAS,OAAO,WAAW,CAAA;AAAA,IAErD,IAAA,EAAM,OACF,OAAA,EACA,OAAA,KACC,YAAY,OAAA,EAAS,OAAA,EAAS,QAAQ,WAAW,CAAA;AAAA,IAEtD,GAAA,EAAK,OACD,OAAA,EACA,OAAA,KACC,YAAY,OAAA,EAAS,OAAA,EAAS,OAAO,WAAW,CAAA;AAAA,IAErD,KAAA,EAAO,OACH,OAAA,EACA,OAAA,KACC,YAAY,OAAA,EAAS,OAAA,EAAS,SAAS,WAAW,CAAA;AAAA,IAEvD,MAAA,EAAQ,OACJ,OAAA,EACA,OAAA,KACC,YAAY,OAAA,EAAS,OAAA,EAAS,UAAU,WAAW;AAAA,GAC5D;AACJ;AAcA,IAAI,YAAA,GAAsD,IAAA;AAE1D,SAAS,eAAA,GACT;AACI,EAAA,IAAI,CAAC,YAAA,EACL;AACI,IAAA,OAAA,CAAQ,IAAI,6DAA6D,CAAA;AACzE,IAAA,YAAA,GAAe,WAAA,EAAY;AAAA,EAC/B;AACA,EAAA,OAAO,YAAA;AACX;AAEO,IAAM,GAAA,GAAM,OACf,OAAA,EACA,OAAA,KACC,iBAAgB,CAAE,GAAA,CAAI,SAAS,OAAO;AAEpC,IAAM,IAAA,GAAO,OAChB,OAAA,EACA,OAAA,KACC,iBAAgB,CAAE,IAAA,CAAK,SAAS,OAAO;AAErC,IAAM,GAAA,GAAM,OACf,OAAA,EACA,OAAA,KACC,iBAAgB,CAAE,GAAA,CAAI,SAAS,OAAO;AAEpC,IAAM,KAAA,GAAQ,OACjB,OAAA,EACA,OAAA,KACC,iBAAgB,CAAE,KAAA,CAAM,SAAS,OAAO;AAEtC,IAAM,MAAA,GAAS,OAClB,OAAA,EACA,OAAA,KACC,iBAAgB,CAAE,MAAA,CAAO,SAAS,OAAO","file":"index.js","sourcesContent":["/**\n * SPFN Next.js Proxy Interceptor Execution Engine\n */\n\nimport type {\n InterceptorRule,\n RequestInterceptor,\n ResponseInterceptor,\n RequestInterceptorContext,\n ResponseInterceptorContext,\n} from './types';\n\n/**\n * Check if path matches pattern\n *\n * Supports:\n * - Wildcards: '/_auth/*' matches '/_auth/login'\n * - Path params: '/users/:id' matches '/users/123'\n * - RegExp: /^\\/_auth\\/.+$/ matches '/_auth/login'\n * - Exact match: '/_auth/login' matches '/_auth/login'\n * - All: '*' matches any path\n *\n * @param path - Request path to test\n * @param pattern - Pattern to match against\n * @returns True if path matches pattern\n */\nexport function matchPath(path: string, pattern: string | RegExp): boolean\n{\n // Match all\n if (pattern === '*')\n {\n return true;\n }\n\n // RegExp pattern\n if (pattern instanceof RegExp)\n {\n return pattern.test(path);\n }\n\n // String pattern\n // Convert wildcard pattern to RegExp\n // '/_auth/*' -> /^\\/_auth\\/.*/\n // '/users/:id' -> /^\\/users\\/[^/]+$/\n const regexPattern = pattern\n .replace(/\\*/g, '.*')\n .replace(/:[^/]+/g, '[^/]+')\n .replace(/\\//g, '\\\\/');\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(path);\n}\n\n/**\n * Check if method matches pattern\n *\n * @param method - Request method (e.g., 'POST')\n * @param pattern - Method pattern (e.g., 'POST' or ['POST', 'PUT'])\n * @returns True if method matches pattern\n */\nexport function matchMethod(\n method: string,\n pattern?: string | string[]\n): boolean\n{\n // No method filter = match all\n if (!pattern)\n {\n return true;\n }\n\n // Single method\n if (typeof pattern === 'string')\n {\n return method.toUpperCase() === pattern.toUpperCase();\n }\n\n // Multiple methods\n return pattern.some((m) => m.toUpperCase() === method.toUpperCase());\n}\n\n/**\n * Filter interceptors that match the request\n *\n * @param rules - All interceptor rules\n * @param path - Request path\n * @param method - Request method\n * @returns Matched interceptors\n */\nexport function filterMatchingInterceptors(\n rules: InterceptorRule[],\n path: string,\n method: string\n): InterceptorRule[]\n{\n return rules.filter((rule) => {\n return matchPath(path, rule.pathPattern) && matchMethod(method, rule.method);\n });\n}\n\n/**\n * Execute request interceptors in chain\n *\n * Interceptors are executed in order:\n * 1. First registered interceptor\n * 2. Second registered interceptor\n * 3. ... and so on\n *\n * Each interceptor must call next() to continue the chain.\n * If next() is not called, the chain stops and remaining interceptors are skipped.\n *\n * @param context - Request interceptor context\n * @param interceptors - Interceptors to execute\n */\nexport async function executeRequestInterceptors(\n context: RequestInterceptorContext,\n interceptors: RequestInterceptor[]\n): Promise<void>\n{\n let index = 0;\n\n const next = async (): Promise<void> => {\n if (index >= interceptors.length)\n {\n return;\n }\n\n const interceptor = interceptors[index];\n index++;\n\n await interceptor(context, next);\n };\n\n await next();\n}\n\n/**\n * Execute response interceptors in chain\n *\n * Interceptors are executed in order:\n * 1. First registered interceptor\n * 2. Second registered interceptor\n * 3. ... and so on\n *\n * Each interceptor must call next() to continue the chain.\n * If next() is not called, the chain stops and remaining interceptors are skipped.\n *\n * @param context - Response interceptor context\n * @param interceptors - Interceptors to execute\n */\nexport async function executeResponseInterceptors(\n context: ResponseInterceptorContext,\n interceptors: ResponseInterceptor[]\n): Promise<void>\n{\n let index = 0;\n\n const next = async (): Promise<void> => {\n if (index >= interceptors.length)\n {\n return;\n }\n\n const interceptor = interceptors[index];\n index++;\n\n await interceptor(context, next);\n };\n\n await next();\n}","/**\n * Global Interceptor Registry\n *\n * Allows packages to automatically register their interceptors\n * for Next.js proxy without manual configuration.\n */\n\nimport type { InterceptorRule } from './types';\n\n/**\n * Global interceptor registry\n *\n * Packages register their interceptors on import,\n * and proxy automatically discovers and applies them.\n */\nclass InterceptorRegistry\n{\n private interceptors = new Map<string, InterceptorRule[]>();\n\n /**\n * Register interceptors for a package\n *\n * @param packageName - Unique package identifier (e.g., 'auth', 'storage')\n * @param interceptors - Array of interceptor rules\n *\n * @example\n * ```typescript\n * registerInterceptors('auth', [\n * {\n * pathPattern: '/_auth/*',\n * request: async (ctx, next) => { ... }\n * }\n * ]);\n * ```\n */\n register(packageName: string, interceptors: InterceptorRule[]): void\n {\n console.log(`[SPFN Registry] Registering ${interceptors.length} interceptors for package \"${packageName}\"`);\n\n if (this.interceptors.has(packageName))\n {\n console.warn(\n `[SPFN Registry] Interceptors for \"${packageName}\" already registered. Overwriting.`\n );\n }\n\n this.interceptors.set(packageName, interceptors);\n console.log(`[SPFN Registry] Successfully registered interceptors for \"${packageName}\". Total packages: ${this.getPackageNames().length}`);\n }\n\n /**\n * Get all registered interceptors\n *\n * @param exclude - Package names to exclude\n * @returns Flat array of all interceptor rules\n */\n getAll(exclude: string[] = []): InterceptorRule[]\n {\n const all: InterceptorRule[] = [];\n\n for (const [packageName, interceptors] of this.interceptors.entries())\n {\n if (!exclude.includes(packageName))\n {\n all.push(...interceptors);\n }\n }\n\n return all;\n }\n\n /**\n * Get interceptors for specific package\n *\n * @param packageName - Package identifier\n * @returns Interceptor rules or undefined\n */\n get(packageName: string): InterceptorRule[] | undefined\n {\n return this.interceptors.get(packageName);\n }\n\n /**\n * Get list of registered package names\n */\n getPackageNames(): string[]\n {\n return Array.from(this.interceptors.keys());\n }\n\n /**\n * Check if package has registered interceptors\n */\n has(packageName: string): boolean\n {\n return this.interceptors.has(packageName);\n }\n\n /**\n * Unregister interceptors for a package\n *\n * @param packageName - Package identifier\n */\n unregister(packageName: string): void\n {\n this.interceptors.delete(packageName);\n }\n\n /**\n * Clear all registered interceptors\n *\n * Useful for testing\n */\n clear(): void\n {\n this.interceptors.clear();\n }\n\n /**\n * Get total count of registered interceptors\n */\n count(): number\n {\n let total = 0;\n for (const interceptors of this.interceptors.values())\n {\n total += interceptors.length;\n }\n return total;\n }\n}\n\n/**\n * Global singleton registry instance\n */\nexport const interceptorRegistry = new InterceptorRegistry();\n\n/**\n * Register interceptors for a package\n *\n * This should be called during package initialization (on import).\n * The interceptors will be automatically applied by the Next.js proxy.\n *\n * @param packageName - Unique package identifier (e.g., 'auth', 'storage')\n * @param interceptors - Array of interceptor rules\n *\n * @example\n * ```typescript\n * // packages/auth/src/adapters/nextjs/interceptors/index.ts\n * import { registerInterceptors } from '@spfn/core/client/nextjs';\n *\n * const authInterceptors = [\n * {\n * pathPattern: '/_auth/*',\n * request: async (ctx, next) => {\n * // Add JWT token\n * ctx.headers['Authorization'] = 'Bearer token';\n * await next();\n * }\n * }\n * ];\n *\n * // Auto-register on import\n * registerInterceptors('auth', authInterceptors);\n * ```\n */\nexport function registerInterceptors(\n packageName: string,\n interceptors: InterceptorRule[]\n): void\n{\n interceptorRegistry.register(packageName, interceptors);\n}","/**\n * SPFN Next.js API Route Proxy with Interceptor Pattern\n *\n * Automatically proxies requests to SPFN API server with:\n * - Cookie forwarding\n * - Request/Response interceptors\n * - Flexible header manipulation\n *\n * Usage:\n * ```typescript\n * // Basic usage (no interceptors)\n * // app/api/actions/[...path]/route.ts\n * export { GET, POST, PUT, DELETE, PATCH } from '@spfn/core/nextjs';\n *\n * // With interceptors\n * import { createProxy } from '@spfn/core/nextjs';\n *\n * export const { GET, POST } = createProxy({\n * interceptors: [\n * {\n * pathPattern: '/_auth/*',\n * request: async (ctx, next) => {\n * ctx.headers['Authorization'] = 'Bearer token';\n * await next();\n * }\n * }\n * ]\n * });\n * ```\n */\n\nimport { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\nimport { cookies } from 'next/headers.js';\nimport type { ProxyConfig, RequestInterceptorContext, ResponseInterceptorContext, InterceptorRule } from './types';\nimport {\n filterMatchingInterceptors,\n executeRequestInterceptors,\n executeResponseInterceptors,\n} from './interceptor';\nimport { interceptorRegistry } from './registry';\n\n/**\n * Get SPFN API URL from environment or config\n */\nfunction getApiUrl(config?: ProxyConfig): string\n{\n return (\n config?.apiUrl ||\n process.env.SERVER_API_URL ||\n process.env.SPFN_API_URL ||\n 'http://localhost:8790'\n );\n}\n\n/**\n * Generic proxy handler for all HTTP methods\n */\nasync function handleProxy(\n request: NextRequest,\n context: { params: Promise<{ path: string[] }> | { path: string[] } },\n method: string,\n config?: ProxyConfig\n): Promise<NextResponse>\n{\n try\n {\n // Resolve params (Next.js 15+ async params support)\n const params = 'then' in context.params ? await context.params : context.params;\n const pathSegments = params.path;\n const path = `/${pathSegments.join('/')}`;\n\n // Get query parameters\n const query: Record<string, string | string[]> = {};\n request.nextUrl.searchParams.forEach((value, key) => {\n const existing = query[key];\n if (existing)\n {\n query[key] = Array.isArray(existing) ? [...existing, value] : [existing, value];\n }\n else\n {\n query[key] = value;\n }\n });\n\n // Get cookies\n const cookieStore = await cookies();\n const cookieMap = new Map<string, string>();\n cookieStore.getAll().forEach((cookie) => {\n cookieMap.set(cookie.name, cookie.value);\n });\n\n // Prepare initial headers\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Get request body\n let body: any = undefined;\n const contentType = request.headers.get('Content-Type');\n\n if (method === 'POST' || method === 'PUT' || method === 'PATCH')\n {\n if (contentType?.includes('application/json'))\n {\n const text = await request.text();\n if (text)\n {\n try\n {\n body = JSON.parse(text);\n }\n catch (error)\n {\n body = text;\n }\n }\n }\n else if (contentType?.includes('multipart/form-data'))\n {\n body = await request.formData();\n }\n else\n {\n body = await request.text();\n }\n }\n\n // Create request interceptor context\n const requestContext: RequestInterceptorContext = {\n path,\n method,\n headers,\n body,\n query,\n cookies: cookieMap,\n request,\n metadata: {},\n };\n\n // Execute request interceptors\n const rules = config?.interceptors || [];\n console.log(`[SPFN Proxy] Handling ${method} ${path}`);\n console.log(`[SPFN Proxy] Total available interceptor rules: ${rules.length}`);\n\n const matchedRules = filterMatchingInterceptors(rules, path, method);\n console.log(`[SPFN Proxy] Matched ${matchedRules.length} interceptor rules for this request`);\n\n const requestInterceptors = matchedRules\n .map((rule) => rule.request)\n .filter((interceptor): interceptor is NonNullable<typeof interceptor> => !!interceptor);\n\n console.log(`[SPFN Proxy] Executing ${requestInterceptors.length} request interceptors`);\n\n await executeRequestInterceptors(requestContext, requestInterceptors);\n\n // Build SPFN API URL\n const apiUrl = getApiUrl(config);\n const queryString = Object.entries(query)\n .flatMap(([key, value]) =>\n Array.isArray(value) ? value.map((v) => `${key}=${v}`) : [`${key}=${value}`]\n )\n .join('&');\n const url = `${apiUrl}${path}${queryString ? `?${queryString}` : ''}`;\n\n // Build fetch options\n const init: RequestInit = {\n method,\n headers: requestContext.headers,\n };\n\n // Add body for POST/PUT/PATCH\n if (requestContext.body !== undefined)\n {\n if (requestContext.body instanceof FormData)\n {\n init.body = requestContext.body;\n // Remove Content-Type to let fetch set it with boundary\n delete requestContext.headers['Content-Type'];\n }\n else if (typeof requestContext.body === 'string')\n {\n init.body = requestContext.body;\n }\n else\n {\n init.body = JSON.stringify(requestContext.body);\n }\n }\n\n if (config?.debug)\n {\n console.log(`[SPFN Proxy] Calling ${url}`);\n console.log(`[SPFN Proxy] Headers:`, requestContext.headers);\n }\n\n // Call SPFN API\n const response = await fetch(url, init);\n const responseText = await response.text();\n\n // Parse response body\n let responseBody: any;\n try\n {\n responseBody = JSON.parse(responseText);\n }\n catch (error)\n {\n responseBody = responseText;\n }\n\n // Create response interceptor context\n const responseContext: ResponseInterceptorContext = {\n path,\n method,\n request: {\n headers: requestContext.headers,\n body: requestContext.body,\n },\n response: {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n body: responseBody,\n },\n setCookies: [],\n metadata: requestContext.metadata, // Pass metadata from request\n };\n\n // Execute response interceptors\n const responseInterceptors = matchedRules\n .map((rule) => rule.response)\n .filter((interceptor): interceptor is NonNullable<typeof interceptor> => !!interceptor);\n\n if (config?.debug)\n {\n console.log(`[SPFN Proxy] Response interceptors: ${responseInterceptors.length}`);\n }\n\n await executeResponseInterceptors(responseContext, responseInterceptors);\n\n // Create NextResponse\n const nextResponse = NextResponse.json(responseContext.response.body, {\n status: responseContext.response.status,\n statusText: responseContext.response.statusText,\n });\n\n // Set cookies from interceptors\n for (const cookie of responseContext.setCookies)\n {\n const cookieString = [`${cookie.name}=${cookie.value}`];\n\n if (cookie.options?.httpOnly)\n {\n cookieString.push('HttpOnly');\n }\n if (cookie.options?.secure)\n {\n cookieString.push('Secure');\n }\n if (cookie.options?.sameSite)\n {\n cookieString.push(`SameSite=${cookie.options.sameSite}`);\n }\n if (cookie.options?.maxAge !== undefined)\n {\n cookieString.push(`Max-Age=${cookie.options.maxAge}`);\n }\n if (cookie.options?.path)\n {\n cookieString.push(`Path=${cookie.options.path}`);\n }\n if (cookie.options?.domain)\n {\n cookieString.push(`Domain=${cookie.options.domain}`);\n }\n\n nextResponse.headers.append('Set-Cookie', cookieString.join('; '));\n }\n\n // Forward Set-Cookie from SPFN API response\n const setCookieHeaders = response.headers.get('Set-Cookie');\n if (setCookieHeaders)\n {\n nextResponse.headers.append('Set-Cookie', setCookieHeaders);\n }\n\n if (config?.debug)\n {\n console.log(`[SPFN Proxy] Response: ${responseContext.response.status}`);\n }\n\n return nextResponse;\n }\n catch (error)\n {\n console.error('[SPFN Proxy] Error:', error);\n\n return NextResponse.json(\n {\n success: false,\n error: {\n code: 'PROXY_ERROR',\n message: error instanceof Error ? error.message : 'Unknown proxy error',\n },\n },\n { status: 500 }\n );\n }\n}\n\n/**\n * Create proxy with custom configuration and interceptors\n *\n * @param config - Proxy configuration with interceptors\n * @returns HTTP method handlers for Next.js API routes\n *\n * @example\n * ```typescript\n * // app/api/actions/[...path]/route.ts\n * import { createProxy } from '@spfn/core/nextjs';\n *\n * export const { GET, POST, PUT, DELETE, PATCH } = createProxy({\n * apiUrl: 'http://localhost:8790',\n * debug: true,\n * interceptors: [\n * {\n * pathPattern: '/_auth/*',\n * method: 'POST',\n * request: async (ctx, next) => {\n * const session = await getSession();\n * if (session) {\n * ctx.headers['Authorization'] = `Bearer ${session.token}`;\n * }\n * await next();\n * },\n * response: async (ctx, next) => {\n * if (ctx.response.status === 200) {\n * ctx.setCookies.push({\n * name: 'session',\n * value: ctx.response.body.token,\n * options: { httpOnly: true, maxAge: 3600 }\n * });\n * }\n * await next();\n * }\n * }\n * ]\n * });\n * ```\n */\nexport function createProxy(config?: ProxyConfig)\n{\n // Merge auto-discovered and custom interceptors\n const finalConfig = {\n autoDiscoverInterceptors: true,\n ...config,\n };\n\n let allInterceptors: InterceptorRule[] = [];\n\n console.log('[SPFN Proxy] Creating proxy with config:', {\n autoDiscoverInterceptors: finalConfig.autoDiscoverInterceptors,\n customInterceptors: finalConfig.interceptors?.length || 0,\n disableAutoInterceptors: finalConfig.disableAutoInterceptors || [],\n });\n\n // Auto-discover interceptors from registry\n if (finalConfig.autoDiscoverInterceptors)\n {\n const registeredPackages = interceptorRegistry.getPackageNames();\n console.log('[SPFN Proxy] Registered packages in registry:', registeredPackages);\n\n const autoInterceptors = interceptorRegistry.getAll(\n finalConfig.disableAutoInterceptors || []\n );\n allInterceptors.push(...autoInterceptors);\n\n console.log('[SPFN Proxy] Auto-discovered interceptors from packages:', registeredPackages);\n console.log(`[SPFN Proxy] Total auto-discovered interceptors: ${autoInterceptors.length}`);\n }\n\n // Add custom interceptors\n if (finalConfig.interceptors)\n {\n allInterceptors.push(...finalConfig.interceptors);\n console.log(`[SPFN Proxy] Custom interceptors: ${finalConfig.interceptors.length}`);\n }\n\n // Create final config with merged interceptors\n const proxyConfig: ProxyConfig = {\n ...finalConfig,\n interceptors: allInterceptors,\n };\n\n console.log(`[SPFN Proxy] Total interceptors loaded: ${allInterceptors.length}`);\n\n return {\n GET: async (\n request: NextRequest,\n context: { params: Promise<{ path: string[] }> | { path: string[] } }\n ) => handleProxy(request, context, 'GET', proxyConfig),\n\n POST: async (\n request: NextRequest,\n context: { params: Promise<{ path: string[] }> | { path: string[] } }\n ) => handleProxy(request, context, 'POST', proxyConfig),\n\n PUT: async (\n request: NextRequest,\n context: { params: Promise<{ path: string[] }> | { path: string[] } }\n ) => handleProxy(request, context, 'PUT', proxyConfig),\n\n PATCH: async (\n request: NextRequest,\n context: { params: Promise<{ path: string[] }> | { path: string[] } }\n ) => handleProxy(request, context, 'PATCH', proxyConfig),\n\n DELETE: async (\n request: NextRequest,\n context: { params: Promise<{ path: string[] }> | { path: string[] } }\n ) => handleProxy(request, context, 'DELETE', proxyConfig),\n };\n}\n\n/**\n * Default proxy with lazy initialization\n *\n * Lazy initialization ensures that auto-registered interceptors\n * are loaded before the proxy is created.\n *\n * @example\n * ```typescript\n * // app/api/actions/[...path]/route.ts\n * export { GET, POST, PUT, DELETE, PATCH } from '@spfn/core/nextjs';\n * ```\n */\nlet defaultProxy: ReturnType<typeof createProxy> | null = null;\n\nfunction getDefaultProxy(): ReturnType<typeof createProxy>\n{\n if (!defaultProxy)\n {\n console.log('[SPFN Proxy] Initializing default proxy with auto-discovery');\n defaultProxy = createProxy();\n }\n return defaultProxy;\n}\n\nexport const GET = async (\n request: NextRequest,\n context: { params: Promise<{ path: string[] }> | { path: string[] } }\n) => getDefaultProxy().GET(request, context);\n\nexport const POST = async (\n request: NextRequest,\n context: { params: Promise<{ path: string[] }> | { path: string[] } }\n) => getDefaultProxy().POST(request, context);\n\nexport const PUT = async (\n request: NextRequest,\n context: { params: Promise<{ path: string[] }> | { path: string[] } }\n) => getDefaultProxy().PUT(request, context);\n\nexport const PATCH = async (\n request: NextRequest,\n context: { params: Promise<{ path: string[] }> | { path: string[] } }\n) => getDefaultProxy().PATCH(request, context);\n\nexport const DELETE = async (\n request: NextRequest,\n context: { params: Promise<{ path: string[] }> | { path: string[] } }\n) => getDefaultProxy().DELETE(request, context);"]}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { c as createContractGenerator } from '../../index-DHiAqhKv.js';
|
|
2
|
-
export { C as ContractGeneratorConfig } from '../../index-DHiAqhKv.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Built-in Generators Export
|
|
6
|
-
*
|
|
7
|
-
* Provides a registry of all built-in generators
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Registry of available generators
|
|
12
|
-
*
|
|
13
|
-
* Used by package-based generator loading (e.g., "@spfn/core:contract")
|
|
14
|
-
*/
|
|
15
|
-
declare const generators: {
|
|
16
|
-
contract: typeof createContractGenerator;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
export { createContractGenerator, generators };
|