@igniter-js/caller 0.1.3 → 0.1.4
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/AGENTS.md +2275 -172
- package/CHANGELOG.md +13 -0
- package/README.md +108 -14
- package/dist/adapters/index.d.mts +1 -0
- package/dist/adapters/index.d.ts +1 -0
- package/dist/adapters/index.js +91 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/index.mjs +89 -0
- package/dist/adapters/index.mjs.map +1 -0
- package/dist/index-COZVROi_.d.mts +121 -0
- package/dist/index-COZVROi_.d.ts +121 -0
- package/dist/index.d.mts +754 -280
- package/dist/index.d.ts +754 -280
- package/dist/index.js +992 -241
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +989 -242
- package/dist/index.mjs.map +1 -1
- package/dist/telemetry/index.d.mts +100 -0
- package/dist/telemetry/index.d.ts +100 -0
- package/dist/telemetry/index.js +54 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/index.mjs +52 -0
- package/dist/telemetry/index.mjs.map +1 -0
- package/package.json +24 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/builder/igniter-caller.builder.ts","../src/errors/igniter-caller.error.ts","../src/utils/body.ts","../src/utils/cache.ts","../src/utils/schema.ts","../src/utils/url.ts","../src/builder/igniter-caller-request.builder.ts","../src/core/igniter-caller-events.ts","../src/core/igniter-caller.ts","../src/utils/testing.ts"],"names":["IgniterError","match","callbacks"],"mappings":"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","file":"index.js","sourcesContent":["import type { IgniterLogger } from '@igniter-js/core'\nimport type {\n IgniterCallerRequestInterceptor,\n IgniterCallerResponseInterceptor,\n} from '../types/interceptors'\nimport type {\n IgniterCallerSchemaMap,\n IgniterCallerSchemaValidationOptions,\n} from '../types/schemas'\nimport type {\n IgniterCallerStoreAdapter,\n IgniterCallerStoreOptions,\n} from '../types/store'\n\nexport type IgniterCallerBuilderState<\n TSchemas extends IgniterCallerSchemaMap = IgniterCallerSchemaMap,\n> = {\n baseURL?: string\n headers?: Record<string, string>\n cookies?: Record<string, string>\n logger?: IgniterLogger\n requestInterceptors?: IgniterCallerRequestInterceptor[]\n responseInterceptors?: IgniterCallerResponseInterceptor[]\n store?: IgniterCallerStoreAdapter\n storeOptions?: IgniterCallerStoreOptions\n schemas?: TSchemas\n schemaValidation?: IgniterCallerSchemaValidationOptions\n}\n\nexport type IgniterCallerBuilderFactory<\n TCaller,\n TSchemas extends IgniterCallerSchemaMap = IgniterCallerSchemaMap,\n> = (state: IgniterCallerBuilderState<TSchemas>) => TCaller\n\n/**\n * Utility type to replace the schema type in a caller.\n * Used by withSchemas to properly type the returned caller.\n */\nexport type ReplaceCallerSchema<TCaller, TNewSchemas extends IgniterCallerSchemaMap> =\n TCaller extends { schemas?: infer _ }\n ? Omit<TCaller, 'schemas'> & { schemas?: TNewSchemas }\n : TCaller\n\n/**\n * Builder used by developers to initialize the `IgniterCaller` client.\n *\n * This API is designed to remain stable when extracted to `@igniter-js/caller`.\n */\nexport class IgniterCallerBuilder<\n TCaller = unknown,\n TSchemas extends IgniterCallerSchemaMap = any,\n> {\n private readonly state: IgniterCallerBuilderState<TSchemas>\n private readonly factory: IgniterCallerBuilderFactory<TCaller, TSchemas>\n\n private constructor(\n state: IgniterCallerBuilderState<TSchemas>,\n factory: IgniterCallerBuilderFactory<TCaller, TSchemas>,\n ) {\n this.state = state\n this.factory = factory\n }\n\n /**\n * Creates a new builder instance.\n */\n static create<TCaller, TSchemas extends IgniterCallerSchemaMap = any>(\n factory: IgniterCallerBuilderFactory<TCaller, TSchemas>,\n ): IgniterCallerBuilder<TCaller, TSchemas> {\n return new IgniterCallerBuilder({}, factory)\n }\n\n /** Sets the base URL for all requests. */\n withBaseUrl(baseURL: string): IgniterCallerBuilder<TCaller, TSchemas> {\n return new IgniterCallerBuilder({ ...this.state, baseURL }, this.factory)\n }\n\n /** Merges default headers for all requests. */\n withHeaders(headers: Record<string, string>): IgniterCallerBuilder<TCaller> {\n return new IgniterCallerBuilder({ ...this.state, headers }, this.factory)\n }\n\n /** Sets default cookies (sent as the `Cookie` header). */\n withCookies(cookies: Record<string, string>): IgniterCallerBuilder<TCaller> {\n return new IgniterCallerBuilder({ ...this.state, cookies }, this.factory)\n }\n\n /** Attaches a logger instance. */\n withLogger(logger: IgniterLogger): IgniterCallerBuilder<TCaller, TSchemas> {\n return new IgniterCallerBuilder({ ...this.state, logger }, this.factory)\n }\n\n /** Adds a request interceptor that runs before each request. */\n withRequestInterceptor(\n interceptor: IgniterCallerRequestInterceptor,\n ): IgniterCallerBuilder<TCaller, TSchemas> {\n const requestInterceptors = [\n ...(this.state.requestInterceptors || []),\n interceptor,\n ]\n return new IgniterCallerBuilder(\n { ...this.state, requestInterceptors },\n this.factory,\n )\n }\n\n /** Adds a response interceptor that runs after each request. */\n withResponseInterceptor(\n interceptor: IgniterCallerResponseInterceptor,\n ): IgniterCallerBuilder<TCaller, TSchemas> {\n const responseInterceptors = [\n ...(this.state.responseInterceptors || []),\n interceptor,\n ]\n return new IgniterCallerBuilder(\n { ...this.state, responseInterceptors },\n this.factory,\n )\n }\n\n /**\n * Configures a persistent store adapter for caching.\n *\n * When configured, cache operations will use the store (e.g., Redis)\n * instead of in-memory cache, enabling persistent cache across deployments.\n */\n withStore(\n store: IgniterCallerStoreAdapter,\n options?: IgniterCallerStoreOptions,\n ): IgniterCallerBuilder<TCaller, TSchemas> {\n return new IgniterCallerBuilder(\n { ...this.state, store, storeOptions: options },\n this.factory,\n )\n }\n\n /**\n * Configures schema-based type safety and validation.\n *\n * Enables automatic type inference for requests/responses based on\n * route and method, with optional runtime validation via Zod.\n *\n * @example\n * ```ts\n * const api = IgniterCaller.create()\n * .withSchemas({\n * '/users': {\n * GET: {\n * responses: {\n * 200: z.array(UserSchema),\n * 401: ErrorSchema,\n * },\n * },\n * POST: {\n * request: CreateUserSchema,\n * responses: {\n * 201: UserSchema,\n * 400: ValidationErrorSchema,\n * },\n * },\n * },\n * })\n * .build()\n * ```\n */\n withSchemas<TNewSchemas extends IgniterCallerSchemaMap>(\n schemas: TNewSchemas,\n validation?: IgniterCallerSchemaValidationOptions,\n ): IgniterCallerBuilder<TCaller, TNewSchemas> {\n return new IgniterCallerBuilder(\n { ...this.state, schemas, schemaValidation: validation },\n this.factory as any,\n )\n }\n\n /**\n * Builds the `IgniterCaller` instance.\n */\n build(): TCaller {\n return this.factory(this.state)\n }\n}\n","import { IgniterError, type IgniterLogger } from '@igniter-js/core'\n\nexport type IgniterCallerErrorCode =\n | 'IGNITER_CALLER_HTTP_ERROR'\n | 'IGNITER_CALLER_TIMEOUT'\n | 'IGNITER_CALLER_REQUEST_VALIDATION_FAILED'\n | 'IGNITER_CALLER_RESPONSE_VALIDATION_FAILED'\n | 'IGNITER_CALLER_UNKNOWN_ERROR'\n\nexport type IgniterCallerOperation =\n | 'execute'\n | 'download'\n | 'buildRequest'\n | 'parseResponse'\n | 'validateRequest'\n | 'validateResponse'\n\n/**\n * Payload used to create an {@link IgniterCallerError}.\n */\nexport type IgniterCallerErrorPayload = {\n /** Machine-readable error code. */\n code: IgniterCallerErrorCode\n /** Where the error happened. */\n operation: IgniterCallerOperation\n /** Human-readable message. */\n message: string\n /** Optional HTTP status code when surfacing errors through HTTP boundaries. */\n statusCode?: number\n /** Optional HTTP status text (when available). */\n statusText?: string\n /** Extra diagnostic details (e.g. response body or schema issues). */\n details?: unknown\n /** Arbitrary metadata for debugging. */\n metadata?: Record<string, unknown>\n /** Optional original cause. */\n cause?: unknown\n /** Optional logger used by IgniterError. */\n logger?: IgniterLogger\n}\n\n/**\n * Typed error for predictable failures in `IgniterCaller`.\n *\n * Designed to be extracted into `@igniter-js/caller`.\n */\nexport class IgniterCallerError extends IgniterError {\n declare readonly code: IgniterCallerErrorCode\n readonly operation: IgniterCallerOperation\n readonly statusText?: string\n readonly cause?: unknown\n\n constructor(payload: IgniterCallerErrorPayload) {\n const metadata = {\n ...payload.metadata,\n operation: payload.operation,\n statusText: payload.statusText,\n }\n\n const details =\n payload.details ??\n (payload.cause !== undefined ? { cause: payload.cause } : undefined)\n\n super({\n code: payload.code,\n message: payload.message,\n statusCode: payload.statusCode,\n causer: '@igniter-js/caller',\n details,\n metadata,\n logger: payload.logger,\n })\n\n this.name = 'IgniterCallerError'\n this.operation = payload.operation\n this.statusText = payload.statusText\n this.cause = payload.cause\n }\n\n static is(error: unknown): error is IgniterCallerError {\n return error instanceof IgniterCallerError\n }\n}\n\n","export class IgniterCallerBodyUtils {\n /**\n * Returns true when the request body should be passed to `fetch` as-is.\n */\n static isRawBody(body: unknown): boolean {\n if (!body) return false\n\n if (typeof FormData !== 'undefined' && body instanceof FormData) return true\n if (typeof Blob !== 'undefined' && body instanceof Blob) return true\n if (typeof ArrayBuffer !== 'undefined' && body instanceof ArrayBuffer)\n return true\n if (\n typeof URLSearchParams !== 'undefined' &&\n body instanceof URLSearchParams\n )\n return true\n if (typeof ReadableStream !== 'undefined' && body instanceof ReadableStream)\n return true\n\n // Node Buffer\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(body)) return true\n\n // DataView, Int8Array, etc.\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(body as any))\n return true\n\n return false\n }\n\n /**\n * Removes Content-Type for FormData so fetch can set boundaries automatically.\n */\n static normalizeHeadersForBody(\n headers: Record<string, string> | undefined,\n body: unknown,\n ): Record<string, string> | undefined {\n if (!headers) return headers\n\n const isFormData = typeof FormData !== 'undefined' && body instanceof FormData\n if (!isFormData) return headers\n\n if (!('Content-Type' in headers)) return headers\n\n const { 'Content-Type': _contentType, ...rest } = headers\n return rest\n }\n}\n","import type {\n IgniterCallerStoreAdapter,\n IgniterCallerStoreOptions,\n} from '../types/store'\n\n/**\n * Cache interface for HTTP responses.\n *\n * Supports both in-memory caching and persistent store-based caching (Redis, etc).\n */\nexport class IgniterCallerCacheUtils {\n private static cache = new Map<\n string,\n { data: unknown; timestamp: number }\n >()\n private static store: IgniterCallerStoreAdapter | null = null\n private static storeOptions: IgniterCallerStoreOptions = {\n ttl: 3600,\n keyPrefix: 'igniter:caller:',\n fallbackToFetch: true,\n }\n\n /**\n * Configures a persistent store adapter for caching.\n *\n * When configured, cache operations will use the store (e.g., Redis)\n * instead of in-memory cache, enabling persistent cache across deployments.\n */\n static setStore(\n store: IgniterCallerStoreAdapter,\n options?: IgniterCallerStoreOptions,\n ): void {\n IgniterCallerCacheUtils.store = store\n if (options) {\n IgniterCallerCacheUtils.storeOptions = {\n ...IgniterCallerCacheUtils.storeOptions,\n ...options,\n }\n }\n }\n\n /**\n * Gets the configured store adapter.\n */\n static getStore(): IgniterCallerStoreAdapter | null {\n return IgniterCallerCacheUtils.store\n }\n\n /**\n * Gets cached data if it exists and is not stale.\n */\n static async get<T>(key: string, staleTime?: number): Promise<T | undefined> {\n const prefixedKey = IgniterCallerCacheUtils.getPrefixedKey(key)\n\n // Try store first if available\n if (IgniterCallerCacheUtils.store) {\n try {\n const data = await IgniterCallerCacheUtils.store.get<T>(prefixedKey)\n if (data !== null) {\n return data\n }\n } catch (error) {\n console.error('IgniterCaller: Store get failed', error)\n // Fall through to in-memory cache\n }\n }\n\n // Fallback to in-memory cache\n const entry = IgniterCallerCacheUtils.cache.get(prefixedKey)\n if (!entry) return undefined\n\n if (staleTime && Date.now() - entry.timestamp > staleTime) {\n IgniterCallerCacheUtils.cache.delete(prefixedKey)\n return undefined\n }\n\n return entry.data as T\n }\n\n /**\n * Stores data in cache with current timestamp.\n */\n static async set(key: string, data: unknown, ttl?: number): Promise<void> {\n const prefixedKey = IgniterCallerCacheUtils.getPrefixedKey(key)\n const effectiveTtl = ttl || IgniterCallerCacheUtils.storeOptions.ttl || 3600\n\n // Try store first if available\n if (IgniterCallerCacheUtils.store) {\n try {\n await IgniterCallerCacheUtils.store.set(prefixedKey, data, {\n ttl: effectiveTtl,\n })\n return\n } catch (error) {\n console.error('IgniterCaller: Store set failed', error)\n // Fall through to in-memory cache\n }\n }\n\n // Fallback to in-memory cache\n IgniterCallerCacheUtils.cache.set(prefixedKey, {\n data,\n timestamp: Date.now(),\n })\n }\n\n /**\n * Clears a specific cache entry.\n */\n static async clear(key: string): Promise<void> {\n const prefixedKey = IgniterCallerCacheUtils.getPrefixedKey(key)\n\n // Try store first\n if (IgniterCallerCacheUtils.store) {\n try {\n await IgniterCallerCacheUtils.store.delete(prefixedKey)\n } catch (error) {\n console.error('IgniterCaller: Store delete failed', error)\n }\n }\n\n // Also clear from in-memory cache\n IgniterCallerCacheUtils.cache.delete(prefixedKey)\n }\n\n /**\n * Clears all cache entries matching a pattern.\n *\n * @param pattern Glob pattern (e.g., '/users/*') or exact key\n */\n static async clearPattern(pattern: string): Promise<void> {\n const prefixedPattern = IgniterCallerCacheUtils.getPrefixedKey(pattern)\n const regex = IgniterCallerCacheUtils.globToRegex(prefixedPattern)\n\n // Clear from in-memory cache\n for (const key of IgniterCallerCacheUtils.cache.keys()) {\n if (regex.test(key)) {\n IgniterCallerCacheUtils.cache.delete(key)\n }\n }\n\n // Note: Store pattern deletion depends on store implementation\n // Redis supports SCAN + DEL, but we keep it simple here\n if (IgniterCallerCacheUtils.store) {\n console.warn(\n 'IgniterCaller: Pattern-based cache invalidation in store requires manual implementation',\n )\n }\n }\n\n /**\n * Clears all cache entries.\n */\n static async clearAll(): Promise<void> {\n IgniterCallerCacheUtils.cache.clear()\n\n if (IgniterCallerCacheUtils.store) {\n console.warn(\n 'IgniterCaller: clearAll() only clears in-memory cache. Store cache requires manual cleanup.',\n )\n }\n }\n\n /**\n * Adds the configured prefix to a key.\n */\n private static getPrefixedKey(key: string): string {\n const prefix = IgniterCallerCacheUtils.storeOptions.keyPrefix || ''\n return `${prefix}${key}`\n }\n\n /**\n * Converts a glob pattern to a RegExp.\n */\n private static globToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n return new RegExp(`^${escaped}$`)\n }\n}\n","import type { IgniterLogger, StandardSchemaV1 } from '@igniter-js/core'\nimport { IgniterCallerError } from '../errors/igniter-caller.error'\nimport type {\n IgniterCallerEndpointSchema,\n IgniterCallerSchemaMap,\n IgniterCallerSchemaMethod,\n IgniterCallerSchemaValidationOptions,\n} from '../types/schemas'\n\n/**\n * Utilities for schema matching and validation.\n *\n * @internal\n */\nexport class IgniterCallerSchemaUtils {\n /**\n * Matches a URL path against schema map paths (supports path parameters).\n *\n * @example\n * ```ts\n * matchPath('/users/123', '/users/:id') // { matched: true, params: { id: '123' } }\n * matchPath('/users', '/users/:id') // { matched: false }\n * ```\n */\n static matchPath(\n actualPath: string,\n schemaPath: string,\n ): { matched: boolean; params?: Record<string, string> } {\n // Exact match (no params)\n if (actualPath === schemaPath) {\n return { matched: true, params: {} }\n }\n\n // Build regex from schema path pattern\n const paramNames: string[] = []\n const regexPattern = schemaPath\n .replace(/:[^/]+/g, (match) => {\n paramNames.push(match.slice(1)) // Remove ':'\n return '([^/]+)'\n })\n .replace(/\\//g, '\\\\/')\n\n const regex = new RegExp(`^${regexPattern}$`)\n const match = actualPath.match(regex)\n\n if (!match) {\n return { matched: false }\n }\n\n // Extract params\n const params: Record<string, string> = {}\n for (let i = 0; i < paramNames.length; i++) {\n params[paramNames[i]] = match[i + 1]\n }\n\n return { matched: true, params }\n }\n\n /**\n * Finds the schema for a given path and method from the schema map.\n */\n static findSchema(\n schemaMap: IgniterCallerSchemaMap | undefined,\n path: string,\n method: string,\n ): {\n schema: IgniterCallerEndpointSchema | undefined\n params: Record<string, string>\n } {\n if (!schemaMap) {\n return { schema: undefined, params: {} }\n }\n\n // Try exact match first\n const exactMatch = schemaMap[path]?.[method as IgniterCallerSchemaMethod]\n if (exactMatch) {\n return { schema: exactMatch, params: {} }\n }\n\n // Try pattern matching with path params\n for (const [schemaPath, methods] of Object.entries(schemaMap)) {\n const matchResult = IgniterCallerSchemaUtils.matchPath(path, schemaPath)\n if (matchResult.matched) {\n const schema = methods?.[method as IgniterCallerSchemaMethod]\n if (schema) {\n return { schema, params: matchResult.params || {} }\n }\n }\n }\n\n return { schema: undefined, params: {} }\n }\n\n /**\n * Validates input using StandardSchemaV1.\n *\n * If the schema provides `~standard.validate`, it will be used.\n * Otherwise, returns the input as-is.\n */\n private static async validateWithStandardSchema<\n TSchema extends StandardSchemaV1,\n >(\n schema: TSchema,\n input: unknown,\n ): Promise<StandardSchemaV1.InferInput<TSchema>> {\n const standard = (schema as any)?.['~standard'] as\n | {\n validate: (\n value: unknown,\n ) =>\n | { value?: unknown; issues?: unknown[] }\n | Promise<{ value?: unknown; issues?: unknown[] }>\n }\n | undefined\n\n if (!standard?.validate) {\n return input as StandardSchemaV1.InferInput<TSchema>\n }\n\n const result = await standard.validate(input)\n\n if ((result as any)?.issues?.length) {\n throw {\n issues: (result as any).issues,\n _standardSchemaValidationError: true,\n }\n }\n\n return ((result as any)?.value ??\n input) as StandardSchemaV1.InferInput<TSchema>\n }\n\n /**\n * Validates request body against schema.\n *\n * @returns Validated data or throws/logs error based on validation mode\n */\n static async validateRequest<T>(\n data: unknown,\n schema: StandardSchemaV1 | undefined,\n options: IgniterCallerSchemaValidationOptions | undefined,\n context: { url: string; method: string },\n logger?: IgniterLogger,\n ): Promise<T> {\n if (!schema || options?.mode === 'off') {\n return data as T\n }\n\n try {\n const validated =\n await IgniterCallerSchemaUtils.validateWithStandardSchema(schema, data)\n return validated as T\n } catch (error: any) {\n // Handle validation error\n if (options?.onValidationError && error?._standardSchemaValidationError) {\n options.onValidationError(error, { ...context, statusCode: 0 })\n }\n\n if (options?.mode === 'soft') {\n logger?.warn('Request validation failed (soft mode)', {\n url: context.url,\n method: context.method,\n errors: error?.issues,\n })\n return data as T\n }\n\n // Strict mode: throw\n throw new IgniterCallerError({\n code: 'IGNITER_CALLER_REQUEST_VALIDATION_FAILED',\n message: `Request validation failed for ${context.method} ${context.url}`,\n statusCode: 400,\n details: error?.issues,\n operation: 'validateRequest',\n })\n }\n }\n\n /**\n * Validates response data against schema.\n *\n * @returns Validated data or throws/logs error based on validation mode\n */\n static async validateResponse<T>(\n data: unknown,\n schema: StandardSchemaV1 | undefined,\n statusCode: number,\n options: IgniterCallerSchemaValidationOptions | undefined,\n context: { url: string; method: string },\n logger?: IgniterLogger,\n ): Promise<T> {\n if (!schema || options?.mode === 'off') {\n return data as T\n }\n\n try {\n const validated =\n await IgniterCallerSchemaUtils.validateWithStandardSchema(schema, data)\n return validated as T\n } catch (error: any) {\n // Handle validation error\n if (options?.onValidationError && error?._standardSchemaValidationError) {\n options.onValidationError(error, { ...context, statusCode })\n }\n\n if (options?.mode === 'soft') {\n logger?.warn('Response validation failed (soft mode)', {\n url: context.url,\n method: context.method,\n statusCode,\n errors: error?.issues,\n })\n return data as T\n }\n\n // Strict mode: throw\n throw new IgniterCallerError({\n code: 'IGNITER_CALLER_RESPONSE_VALIDATION_FAILED',\n message: `Response validation failed for ${context.method} ${context.url} (${statusCode})`,\n statusCode,\n details: error?.issues,\n operation: 'validateResponse',\n })\n }\n }\n}\n","export class IgniterCallerUrlUtils {\n static buildUrl(params: {\n url: string\n baseURL?: string\n query?: Record<string, string | number | boolean>\n }): string {\n const { url, baseURL, query } = params\n\n // If url is absolute, disregard baseURL\n let fullUrl = url\n if (baseURL && !/^https?:\\/\\//i.test(url)) {\n fullUrl = baseURL + url\n }\n\n if (query && Object.keys(query).length > 0) {\n const queryParams = new URLSearchParams(\n Object.entries(query).map(([key, value]) => [key, String(value)]),\n ).toString()\n\n fullUrl += (fullUrl.includes('?') ? '&' : '?') + queryParams\n }\n\n return fullUrl\n }\n}\n","import type { IgniterLogger, StandardSchemaV1 } from '@igniter-js/core'\nimport type { z } from 'zod'\nimport { IgniterCallerError } from '../errors/igniter-caller.error'\nimport type { IgniterCallerHttpMethod } from '../types/http'\nimport type {\n IgniterCallerRequestInterceptor,\n IgniterCallerResponseInterceptor,\n} from '../types/interceptors'\nimport type { IgniterCallerRequestOptions } from '../types/request'\nimport type {\n IgniterCallerApiResponse,\n IgniterCallerFileResponse,\n IgniterCallerResponseContentType,\n IgniterCallerValidatableContentType,\n} from '../types/response'\nimport type { IgniterCallerRetryOptions } from '../types/retry'\nimport type {\n IgniterCallerSchemaMap,\n IgniterCallerSchemaValidationOptions,\n} from '../types/schemas'\nimport { IgniterCallerBodyUtils } from '../utils/body'\nimport { IgniterCallerCacheUtils } from '../utils/cache'\nimport { IgniterCallerSchemaUtils } from '../utils/schema'\nimport { IgniterCallerUrlUtils } from '../utils/url'\n\n/**\n * Content types that support schema validation.\n */\nconst VALIDATABLE_CONTENT_TYPES: IgniterCallerValidatableContentType[] = [\n 'json',\n 'xml',\n 'csv',\n]\n\n/**\n * Detects the response content type from headers.\n */\nfunction detectContentType(\n contentType: string | null,\n): IgniterCallerResponseContentType {\n if (!contentType) return 'text'\n\n const ct = contentType.toLowerCase()\n\n if (ct.includes('application/json')) return 'json'\n if (ct.includes('application/xml') || ct.includes('text/xml')) return 'xml'\n if (ct.includes('text/csv')) return 'csv'\n if (ct.includes('text/html')) return 'html'\n if (ct.includes('text/plain')) return 'text'\n if (ct.includes('multipart/form-data')) return 'formdata'\n if (ct.includes('application/octet-stream')) return 'blob'\n\n // Check for file-like content types\n if (\n ct.includes('image/') ||\n ct.includes('audio/') ||\n ct.includes('video/') ||\n ct.includes('application/pdf') ||\n ct.includes('application/zip')\n ) {\n return 'blob'\n }\n\n return 'text'\n}\n\n/**\n * Checks if a content type supports schema validation.\n */\nfunction isValidatableContentType(\n contentType: IgniterCallerResponseContentType,\n): contentType is IgniterCallerValidatableContentType {\n return VALIDATABLE_CONTENT_TYPES.includes(\n contentType as IgniterCallerValidatableContentType,\n )\n}\n\n/**\n * Parse response data based on content type.\n */\nasync function parseResponseByContentType(\n response: Response,\n contentType: IgniterCallerResponseContentType,\n): Promise<unknown> {\n switch (contentType) {\n case 'json':\n return response.json()\n case 'xml':\n case 'csv':\n case 'html':\n case 'text':\n return response.text()\n case 'blob':\n return response.blob()\n case 'stream':\n return response.body\n case 'arraybuffer':\n return response.arrayBuffer()\n case 'formdata':\n return response.formData()\n default:\n return response.text()\n }\n}\n\n/**\n * Constructor params for the request builder.\n */\nexport interface IgniterCallerRequestBuilderParams {\n baseURL?: string\n defaultHeaders?: Record<string, string>\n defaultCookies?: Record<string, string>\n logger?: IgniterLogger\n requestInterceptors?: IgniterCallerRequestInterceptor[]\n responseInterceptors?: IgniterCallerResponseInterceptor[]\n eventEmitter?: (url: string, method: string, result: any) => Promise<void>\n schemas?: IgniterCallerSchemaMap\n schemaValidation?: IgniterCallerSchemaValidationOptions\n}\n\n/**\n * Fluent request builder for `IgniterCaller`.\n *\n * When created via specific HTTP methods (get, post, put, patch, delete),\n * the method is already set and cannot be changed.\n */\nexport class IgniterCallerRequestBuilder<TResponse = unknown> {\n private options: IgniterCallerRequestOptions = {\n method: 'GET',\n url: '',\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: 30000,\n cache: 'default',\n }\n\n private logger?: IgniterLogger\n private retryOptions?: IgniterCallerRetryOptions\n private fallbackFn?: () => any\n private cacheKey?: string\n private staleTime?: number\n private requestInterceptors?: IgniterCallerRequestInterceptor[]\n private responseInterceptors?: IgniterCallerResponseInterceptor[]\n private eventEmitter?: (\n url: string,\n method: string,\n result: any,\n ) => Promise<void>\n private schemas?: IgniterCallerSchemaMap\n private schemaValidation?: IgniterCallerSchemaValidationOptions\n private responseTypeSchema?: z.ZodSchema<any> | StandardSchemaV1\n\n constructor(params: IgniterCallerRequestBuilderParams) {\n if (params.baseURL) this.options.baseURL = params.baseURL\n\n if (params.defaultHeaders) {\n this.options.headers = {\n ...this.options.headers,\n ...params.defaultHeaders,\n }\n }\n\n if (params.defaultCookies) {\n const cookieStr = Object.entries(params.defaultCookies)\n .map(([k, v]) => `${k}=${v}`)\n .join('; ')\n this.options.headers = { ...this.options.headers, Cookie: cookieStr }\n }\n\n this.logger = params.logger\n this.requestInterceptors = params.requestInterceptors\n this.responseInterceptors = params.responseInterceptors\n this.eventEmitter = params.eventEmitter\n this.schemas = params.schemas\n this.schemaValidation = params.schemaValidation\n }\n\n /**\n * Sets the HTTP method for this request.\n * @internal Used by IgniterCaller.request() for generic requests.\n */\n _setMethod(method: IgniterCallerHttpMethod): this {\n this.options.method = method\n return this\n }\n\n /**\n * Sets the URL for this request.\n * @internal Used when URL is passed to HTTP method directly.\n */\n _setUrl(url: string): this {\n this.options.url = url\n return this\n }\n\n /**\n * Overrides the logger for this request chain.\n */\n withLogger(logger: IgniterLogger): this {\n this.logger = logger\n return this\n }\n\n /**\n * Sets the request URL.\n */\n url(url: string): this {\n this.options.url = url\n return this\n }\n\n /**\n * Sets the request body.\n * For GET/HEAD requests, body will be automatically converted to query params.\n */\n body<TBody>(body: TBody): this {\n this.options.body = body\n return this\n }\n\n /**\n * Sets URL query parameters.\n */\n params(params: Record<string, string | number | boolean>): this {\n this.options.params = params\n return this\n }\n\n /**\n * Merges additional headers into the request.\n */\n headers(headers: Record<string, string>): this {\n this.options.headers = { ...this.options.headers, ...headers }\n return this\n }\n\n /**\n * Sets request timeout in milliseconds.\n */\n timeout(timeout: number): this {\n this.options.timeout = timeout\n return this\n }\n\n /**\n * Sets cache strategy and optional cache key.\n */\n cache(cache: RequestCache, key?: string): this {\n this.options.cache = cache\n this.cacheKey = key\n return this\n }\n\n /**\n * Configures retry behavior for failed requests.\n */\n retry(\n maxAttempts: number,\n options?: Omit<IgniterCallerRetryOptions, 'maxAttempts'>,\n ): this {\n this.retryOptions = { maxAttempts, ...options }\n return this\n }\n\n /**\n * Provides a fallback value if the request fails.\n */\n fallback<T>(fn: () => T): this {\n this.fallbackFn = fn\n return this\n }\n\n /**\n * Sets cache stale time in milliseconds.\n */\n stale(milliseconds: number): this {\n this.staleTime = milliseconds\n return this\n }\n\n /**\n * Sets the expected response type for TypeScript inference.\n *\n * - If a Zod/StandardSchema is passed, it will validate the response (only for JSON/XML/CSV)\n * - If a type parameter is passed (e.g., `responseType<File>()`), it's for typing only\n *\n * The actual parsing is based on Content-Type headers, not this setting.\n *\n * @example\n * ```ts\n * // With Zod schema (validates JSON response)\n * const result = await api.get('/users').responseType(UserSchema).execute()\n *\n * // With type marker (typing only, no validation)\n * const result = await api.get('/file').responseType<Blob>().execute()\n * ```\n */\n responseType<T>(schema?: z.ZodSchema<T> | StandardSchemaV1): IgniterCallerRequestBuilder<T> {\n if (schema) {\n this.responseTypeSchema = schema\n }\n return this as unknown as IgniterCallerRequestBuilder<T>\n }\n\n /**\n * Downloads a file via GET request.\n * @deprecated Use `.responseType<File>().execute()` instead. The response type is auto-detected.\n */\n getFile(url: string) {\n this.options.method = 'GET'\n this.options.url = url\n\n return {\n execute: async (): Promise<IgniterCallerFileResponse> => {\n const {\n url: finalUrl,\n requestInit,\n controller,\n timeoutId,\n } = this.buildRequest()\n\n this.logger?.debug('IgniterCaller.getFile started', { url: finalUrl })\n\n try {\n const response = await fetch(finalUrl, {\n ...requestInit,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '')\n\n return {\n file: null,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_HTTP_ERROR',\n operation: 'download',\n message: errorText || `HTTP error! status: ${response.status}`,\n statusText: response.statusText,\n statusCode: response.status,\n logger: this.logger,\n metadata: { url: finalUrl },\n }),\n }\n }\n\n const data = await response.blob()\n\n const contentType = response.headers.get('content-type')\n const extension = contentType?.split('/')[1]\n\n const filenameHeader = response.headers.get('content-disposition')\n const filename = filenameHeader?.split('filename=')[1]\n const filenameExtension = filename?.split('.').pop()\n\n // NOTE: Node 20+ includes `File` via undici. In older runtimes, this may not exist.\n if (typeof File === 'undefined') {\n return {\n file: null,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_UNKNOWN_ERROR',\n operation: 'download',\n message:\n '`File` is not available in this runtime. Consider using `response.blob()` directly.',\n logger: this.logger,\n metadata: { url: finalUrl },\n }),\n }\n }\n\n const file = new File(\n [data],\n filename || `file.${extension || filenameExtension || 'unknown'}`,\n )\n\n this.logger?.info('IgniterCaller.getFile success', {\n url: finalUrl,\n size: file.size,\n type: file.type,\n })\n\n return { file, error: null }\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n return {\n file: null,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_TIMEOUT',\n operation: 'download',\n message: `Request timeout after ${this.options.timeout || 30000}ms`,\n statusCode: 408,\n logger: this.logger,\n metadata: { url: finalUrl },\n cause: error,\n }),\n }\n }\n\n return {\n file: null,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_UNKNOWN_ERROR',\n operation: 'download',\n message: (error as Error)?.message || 'Failed to download file',\n logger: this.logger,\n metadata: { url: finalUrl },\n cause: error,\n }),\n }\n }\n },\n }\n }\n\n /**\n * Executes the HTTP request.\n *\n * Response parsing is automatic based on Content-Type headers:\n * - `application/json` → parsed as JSON\n * - `text/xml`, `application/xml` → returned as text (parse with your XML library)\n * - `text/csv` → returned as text\n * - `text/html`, `text/plain` → returned as text\n * - `image/*`, `audio/*`, `video/*`, `application/pdf`, etc. → returned as Blob\n * - `application/octet-stream` → returned as Blob\n *\n * Schema validation (if configured) only runs for validatable content types (JSON, XML, CSV).\n */\n async execute(): Promise<IgniterCallerApiResponse<TResponse>> {\n // Check cache first if cache key is provided\n const effectiveCacheKey = this.cacheKey || this.options.url\n if (effectiveCacheKey && this.staleTime) {\n const cached = await IgniterCallerCacheUtils.get<TResponse>(\n effectiveCacheKey,\n this.staleTime,\n )\n if (cached !== undefined) {\n this.logger?.debug('IgniterCaller.execute cache hit', {\n key: effectiveCacheKey,\n })\n const cachedResult: IgniterCallerApiResponse<TResponse> = {\n data: cached,\n error: undefined,\n }\n // Emit event for cached response\n await this.emitEvent(cachedResult)\n return cachedResult\n }\n }\n\n // Execute with retry logic\n const result = await this.executeWithRetry()\n\n // Apply fallback if request failed\n if (result.error && this.fallbackFn) {\n this.logger?.debug('IgniterCaller.execute applying fallback', {\n error: result.error,\n })\n const fallbackResult: IgniterCallerApiResponse<TResponse> = {\n data: this.fallbackFn() as TResponse,\n error: undefined,\n }\n await this.emitEvent(fallbackResult)\n return fallbackResult\n }\n\n // Store in cache if successful and cache key is provided\n if (!result.error && result.data !== undefined && effectiveCacheKey) {\n await IgniterCallerCacheUtils.set(\n effectiveCacheKey,\n result.data,\n this.staleTime,\n )\n }\n\n // Emit event for response\n await this.emitEvent(result)\n\n return result\n }\n\n private async executeWithRetry(): Promise<IgniterCallerApiResponse<TResponse>> {\n const maxAttempts = this.retryOptions?.maxAttempts || 1\n const baseDelay = this.retryOptions?.baseDelay || 1000\n const backoff = this.retryOptions?.backoff || 'linear'\n const retryOnStatus = this.retryOptions?.retryOnStatus || [\n 408, 429, 500, 502, 503, 504,\n ]\n\n let lastError: Error | undefined\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (attempt > 0) {\n const delay =\n backoff === 'exponential'\n ? baseDelay * 2 ** (attempt - 1)\n : baseDelay * attempt\n\n this.logger?.debug('IgniterCaller.execute retrying', {\n attempt,\n delay,\n })\n\n await new Promise((resolve) => setTimeout(resolve, delay))\n }\n\n const result = await this.executeSingleRequest()\n\n // Success case\n if (!result.error) {\n return result\n }\n\n // Check if we should retry based on status code\n const shouldRetry =\n result.error instanceof IgniterCallerError &&\n result.error.statusCode &&\n retryOnStatus.includes(result.error.statusCode)\n\n if (!shouldRetry || attempt === maxAttempts - 1) {\n return result\n }\n\n lastError = result.error\n }\n\n return {\n data: undefined,\n error: lastError,\n }\n }\n\n private async executeSingleRequest(): Promise<IgniterCallerApiResponse<TResponse>> {\n let { url, requestInit, controller, timeoutId } = this.buildRequest()\n\n this.logger?.debug('IgniterCaller.execute started', {\n method: this.options.method,\n url,\n })\n\n // Apply request interceptors\n if (this.requestInterceptors && this.requestInterceptors.length > 0) {\n let modifiedOptions = { ...this.options, url }\n for (const interceptor of this.requestInterceptors) {\n modifiedOptions = await interceptor(modifiedOptions)\n }\n // Rebuild request with intercepted options\n this.options = modifiedOptions\n const rebuilt = this.buildRequest()\n url = rebuilt.url\n requestInit = rebuilt.requestInit\n controller = rebuilt.controller\n timeoutId = rebuilt.timeoutId\n }\n\n // Validate request body if schema exists\n if (this.schemas && this.options.body) {\n const { schema: endpointSchema } = IgniterCallerSchemaUtils.findSchema(\n this.schemas,\n url,\n this.options.method,\n )\n\n if (endpointSchema?.request) {\n try {\n await IgniterCallerSchemaUtils.validateRequest(\n this.options.body,\n endpointSchema.request,\n this.schemaValidation,\n { url, method: this.options.method },\n this.logger,\n )\n } catch (error) {\n clearTimeout(timeoutId)\n // Validation failed in strict mode\n return {\n data: undefined,\n error: error as IgniterCallerError,\n }\n }\n }\n }\n\n try {\n const httpResponse = await fetch(url, {\n ...requestInit,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!httpResponse.ok) {\n const errorText = await httpResponse.text().catch(() => '')\n\n return {\n data: undefined,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_HTTP_ERROR',\n operation: 'execute',\n message: errorText || `HTTP error! status: ${httpResponse.status}`,\n statusText: httpResponse.statusText,\n statusCode: httpResponse.status,\n logger: this.logger,\n metadata: {\n method: this.options.method,\n url,\n },\n }),\n status: httpResponse.status,\n headers: httpResponse.headers,\n }\n }\n\n // Detect content type from headers\n const contentTypeHeader = httpResponse.headers.get('content-type')\n const detectedContentType = detectContentType(contentTypeHeader)\n\n // Parse response based on detected content type\n let data = await parseResponseByContentType(httpResponse, detectedContentType)\n\n // Validate response if:\n // 1. Content type is validatable (json, xml, csv)\n // 2. Either schemas are configured OR responseTypeSchema is set\n const shouldValidate = isValidatableContentType(detectedContentType)\n\n if (shouldValidate) {\n // First, try schema map validation\n if (this.schemas) {\n const { schema: endpointSchema } = IgniterCallerSchemaUtils.findSchema(\n this.schemas,\n url,\n this.options.method,\n )\n\n const responseSchema = endpointSchema?.responses?.[httpResponse.status]\n\n if (responseSchema) {\n try {\n data = await IgniterCallerSchemaUtils.validateResponse(\n data,\n responseSchema,\n httpResponse.status,\n this.schemaValidation,\n { url, method: this.options.method },\n this.logger,\n )\n } catch (error) {\n return {\n data: undefined,\n error: error as IgniterCallerError,\n status: httpResponse.status,\n headers: httpResponse.headers,\n }\n }\n }\n }\n\n // Then, try responseType schema validation (Zod or StandardSchema)\n if (this.responseTypeSchema) {\n // Check if it's a Zod schema\n if ('safeParse' in this.responseTypeSchema) {\n const zodSchema = this.responseTypeSchema as z.ZodSchema<any>\n const result = zodSchema.safeParse(data)\n if (!result.success) {\n return {\n data: undefined,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_RESPONSE_VALIDATION_FAILED',\n operation: 'parseResponse',\n message: `Response validation failed: ${result.error.message}`,\n logger: this.logger,\n statusCode: httpResponse.status,\n metadata: {\n method: this.options.method,\n url,\n },\n cause: result.error,\n }),\n status: httpResponse.status,\n headers: httpResponse.headers,\n }\n }\n data = result.data\n }\n // Check if it's a StandardSchema\n else if ('~standard' in this.responseTypeSchema) {\n try {\n const standardSchema = this.responseTypeSchema as StandardSchemaV1\n const result = await standardSchema['~standard'].validate(data)\n if (result.issues) {\n return {\n data: undefined,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_RESPONSE_VALIDATION_FAILED',\n operation: 'parseResponse',\n message: `Response validation failed`,\n logger: this.logger,\n statusCode: httpResponse.status,\n metadata: {\n method: this.options.method,\n url,\n issues: result.issues,\n },\n }),\n status: httpResponse.status,\n headers: httpResponse.headers,\n }\n }\n data = result.value\n } catch (error) {\n return {\n data: undefined,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_RESPONSE_VALIDATION_FAILED',\n operation: 'parseResponse',\n message: (error as Error)?.message || 'Response validation failed',\n logger: this.logger,\n statusCode: httpResponse.status,\n metadata: {\n method: this.options.method,\n url,\n },\n cause: error,\n }),\n status: httpResponse.status,\n headers: httpResponse.headers,\n }\n }\n }\n }\n }\n\n let response: IgniterCallerApiResponse<TResponse> = {\n data: data as TResponse,\n error: undefined,\n status: httpResponse.status,\n headers: httpResponse.headers,\n }\n\n // Apply response interceptors\n if (this.responseInterceptors && this.responseInterceptors.length > 0) {\n for (const interceptor of this.responseInterceptors) {\n response = await interceptor(response)\n }\n }\n\n return response\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n return {\n data: undefined,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_TIMEOUT',\n operation: 'execute',\n message: `Request timeout after ${this.options.timeout || 30000}ms`,\n statusCode: 408,\n logger: this.logger,\n metadata: {\n method: this.options.method,\n url,\n },\n cause: error,\n }),\n }\n }\n\n return {\n data: undefined,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_UNKNOWN_ERROR',\n operation: 'execute',\n message:\n (error as Error)?.message ||\n 'Unknown error occurred during request',\n statusCode: 500,\n logger: this.logger,\n metadata: {\n method: this.options.method,\n url,\n },\n cause: error,\n }),\n }\n }\n }\n\n private buildRequest() {\n const { method, url, body, params, headers, timeout, baseURL, cache } =\n this.options\n\n // For GET/HEAD requests, convert body to query params\n let finalParams = params\n if ((method === 'GET' || method === 'HEAD') && body && typeof body === 'object') {\n const bodyParams: Record<string, string | number | boolean> = {}\n for (const [key, value] of Object.entries(body as Record<string, unknown>)) {\n if (value !== undefined && value !== null) {\n bodyParams[key] = String(value)\n }\n }\n finalParams = { ...bodyParams, ...params }\n }\n\n const fullUrl = IgniterCallerUrlUtils.buildUrl({\n url,\n baseURL,\n query: finalParams,\n })\n\n // Only include body for non-GET/HEAD methods\n const shouldIncludeBody = body && method !== 'GET' && method !== 'HEAD'\n const rawBody = shouldIncludeBody && IgniterCallerBodyUtils.isRawBody(body)\n const finalHeaders = IgniterCallerBodyUtils.normalizeHeadersForBody(\n headers,\n shouldIncludeBody ? body : undefined,\n )\n\n const requestInit: RequestInit = {\n method,\n headers: finalHeaders,\n cache,\n ...(shouldIncludeBody\n ? { body: rawBody ? (body as any) : JSON.stringify(body) }\n : {}),\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout || 30000)\n\n return {\n url: fullUrl,\n requestInit,\n controller,\n timeoutId,\n }\n }\n\n /**\n * Emits event for this response using injected emitter.\n */\n private async emitEvent(\n result: IgniterCallerApiResponse<TResponse>,\n ): Promise<void> {\n if (this.eventEmitter) {\n try {\n await this.eventEmitter(this.options.url, this.options.method, result)\n } catch (error) {\n // Silently fail if event emission fails\n this.logger?.debug('Failed to emit event', { error })\n }\n }\n }\n}\n\n/**\n * Request builder type without internal methods.\n * Used when creating requests via specific HTTP methods (get, post, etc.)\n */\nexport type IgniterCallerMethodRequestBuilder<TResponse = unknown> = Omit<\n IgniterCallerRequestBuilder<TResponse>,\n '_setMethod' | '_setUrl'\n>\n\n/**\n * Request builder with typed response based on schema inference.\n * Used when creating requests via HTTP methods with URL that matches a schema.\n *\n * This type ensures that the execute() method returns the correct response type\n * based on the schema map configuration.\n */\nexport type IgniterCallerTypedRequestBuilder<TResponse = unknown> = Omit<\n IgniterCallerRequestBuilder<TResponse>,\n '_setMethod' | '_setUrl'\n>\n","import type {\n IgniterCallerEventCallback,\n IgniterCallerUrlPattern,\n} from '../types/events'\n\n/**\n * Event emitter for observing HTTP responses across the application.\n *\n * This allows developers to listen to API responses globally for:\n * - Debugging and logging\n * - Real-time monitoring\n * - Cache invalidation triggers\n * - Analytics and telemetry\n */\nexport class IgniterCallerEvents {\n private listeners = new Map<string, Set<IgniterCallerEventCallback>>()\n private patternListeners = new Map<RegExp, Set<IgniterCallerEventCallback>>()\n\n /**\n * Registers a listener for a specific URL or pattern.\n *\n * @param pattern URL string (exact match) or RegExp pattern\n * @param callback Function to execute when a response matches\n * @returns Cleanup function to remove the listener\n *\n * @example\n * ```ts\n * // Listen to specific endpoint\n * const cleanup = api.on('/users', (result) => {\n * console.log('Users fetched:', result.data)\n * })\n *\n * // Listen to pattern\n * api.on(/^\\/users\\/\\d+$/, (result) => {\n * console.log('User detail fetched')\n * })\n *\n * // Cleanup when done\n * cleanup()\n * ```\n */\n on(pattern: IgniterCallerUrlPattern, callback: IgniterCallerEventCallback): () => void {\n if (typeof pattern === 'string') {\n if (!this.listeners.has(pattern)) {\n this.listeners.set(pattern, new Set())\n }\n const callbacks = this.listeners.get(pattern)\n if (callbacks) {\n callbacks.add(callback)\n }\n\n // Return cleanup function\n return () => {\n const callbacks = this.listeners.get(pattern)\n if (callbacks) {\n callbacks.delete(callback)\n if (callbacks.size === 0) {\n this.listeners.delete(pattern)\n }\n }\n }\n }\n\n // RegExp pattern\n if (!this.patternListeners.has(pattern)) {\n this.patternListeners.set(pattern, new Set())\n }\n const callbacks = this.patternListeners.get(pattern)\n if (callbacks) {\n callbacks.add(callback)\n }\n\n return () => {\n const callbacks = this.patternListeners.get(pattern)\n if (callbacks) {\n callbacks.delete(callback)\n if (callbacks.size === 0) {\n this.patternListeners.delete(pattern)\n }\n }\n }\n }\n\n /**\n * Removes a specific listener or all listeners for a pattern.\n */\n off(pattern: IgniterCallerUrlPattern, callback?: IgniterCallerEventCallback): void {\n if (typeof pattern === 'string') {\n if (callback !== undefined) {\n this.listeners.get(pattern)?.delete(callback)\n } else {\n this.listeners.delete(pattern)\n }\n } else {\n if (callback !== undefined) {\n this.patternListeners.get(pattern)?.delete(callback)\n } else {\n this.patternListeners.delete(pattern)\n }\n }\n }\n\n /**\n * Emits an event to all matching listeners.\n *\n * @internal\n */\n async emit(url: string, method: string, result: any): Promise<void> {\n const context = {\n url,\n method,\n timestamp: Date.now(),\n }\n\n // Exact match listeners\n const exactListeners = this.listeners.get(url)\n if (exactListeners) {\n for (const callback of exactListeners) {\n try {\n await callback(result, context)\n } catch (error) {\n console.error('Error in IgniterCaller event listener:', error)\n }\n }\n }\n\n // Pattern match listeners\n for (const [pattern, callbacks] of this.patternListeners.entries()) {\n if (pattern.test(url)) {\n for (const callback of callbacks) {\n try {\n await callback(result, context)\n } catch (error) {\n console.error('Error in IgniterCaller event listener:', error)\n }\n }\n }\n }\n }\n\n /**\n * Removes all listeners.\n */\n clear(): void {\n this.listeners.clear()\n this.patternListeners.clear()\n }\n}\n","import type { IgniterLogger, StandardSchemaV1 } from '@igniter-js/core'\nimport { IgniterCallerBuilder } from '../builder/igniter-caller.builder'\nimport {\n IgniterCallerRequestBuilder,\n type IgniterCallerMethodRequestBuilder,\n type IgniterCallerRequestBuilderParams,\n type IgniterCallerTypedRequestBuilder,\n} from '../builder/igniter-caller-request.builder'\nimport type {\n IgniterCallerEventCallback,\n IgniterCallerUrlPattern,\n} from '../types/events'\nimport type {\n IgniterCallerRequestInterceptor,\n IgniterCallerResponseInterceptor,\n} from '../types/interceptors'\nimport type { IgniterCallerDirectRequestOptions } from '../types/request'\nimport type { IgniterCallerApiResponse } from '../types/response'\nimport type {\n DeletePaths,\n EndpointInfo,\n ExtractPathParams,\n GetPaths,\n HeadPaths,\n IgniterCallerEndpointSchema,\n IgniterCallerSchemaMap,\n IgniterCallerSchemaMethod,\n IgniterCallerSchemaValidationOptions,\n PatchPaths,\n PostPaths,\n PutPaths,\n} from '../types/schemas'\nimport { IgniterCallerCacheUtils } from '../utils/cache'\nimport { IgniterCallerEvents } from './igniter-caller-events'\n\n/**\n * Infer success response type from endpoint schema (200 or 201).\n */\ntype InferSuccessResponse<T> = T extends IgniterCallerEndpointSchema<any, infer R>\n ? 200 extends keyof R\n ? R[200] extends StandardSchemaV1\n ? StandardSchemaV1.InferOutput<R[200]>\n : unknown\n : 201 extends keyof R\n ? R[201] extends StandardSchemaV1\n ? StandardSchemaV1.InferOutput<R[201]>\n : unknown\n : unknown\n : unknown\n\n/**\n * Get the endpoint schema for a path and method from a schema map.\n */\ntype GetEndpoint<\n TSchemas extends IgniterCallerSchemaMap,\n TPath extends string,\n TMethod extends IgniterCallerSchemaMethod,\n> = TPath extends keyof TSchemas\n ? TMethod extends keyof TSchemas[TPath]\n ? TSchemas[TPath][TMethod]\n : undefined\n : undefined\n\n/**\n * Infer the response type for a given path and method.\n * Returns `unknown` if the path/method is not in the schema.\n */\ntype InferResponse<\n TSchemas extends IgniterCallerSchemaMap,\n TPath extends string,\n TMethod extends IgniterCallerSchemaMethod,\n> = InferSuccessResponse<GetEndpoint<TSchemas, TPath, TMethod>>\n\n/**\n * Typed request builder with inferred body and params types.\n */\nexport type TypedRequestBuilder<\n TSchemas extends IgniterCallerSchemaMap,\n TPath extends string,\n TMethod extends IgniterCallerSchemaMethod,\n> = Omit<\n IgniterCallerMethodRequestBuilder<EndpointInfo<TSchemas, TPath, TMethod>['response']>,\n 'body' | 'params'\n> & {\n /**\n * Sets the request body with type inference from schema.\n */\n body: EndpointInfo<TSchemas, TPath, TMethod>['request'] extends never\n ? <TBody>(body: TBody) => TypedRequestBuilder<TSchemas, TPath, TMethod>\n : (body: EndpointInfo<TSchemas, TPath, TMethod>['request']) => TypedRequestBuilder<TSchemas, TPath, TMethod>\n \n /**\n * Sets URL path parameters with type inference from URL pattern.\n */\n params: keyof EndpointInfo<TSchemas, TPath, TMethod>['params'] extends never\n ? (params: Record<string, string | number | boolean>) => TypedRequestBuilder<TSchemas, TPath, TMethod>\n : (params: EndpointInfo<TSchemas, TPath, TMethod>['params'] & Record<string, string | number | boolean>) => TypedRequestBuilder<TSchemas, TPath, TMethod>\n}\n\n/**\n * HTTP client runtime for Igniter.js.\n *\n * This module is intentionally structured to be extracted into a standalone package\n * in the Igniter.js ecosystem as `@igniter-js/caller`.\n *\n * @template TSchemas - The schema map type for type-safe requests/responses.\n */\nexport class IgniterCaller<TSchemas extends IgniterCallerSchemaMap = IgniterCallerSchemaMap> {\n /** Global event emitter for observing HTTP responses */\n private static readonly events = new IgniterCallerEvents()\n\n private baseURL?: string\n private headers?: Record<string, string>\n private cookies?: Record<string, string>\n private logger?: IgniterLogger\n private requestInterceptors?: IgniterCallerRequestInterceptor[]\n private responseInterceptors?: IgniterCallerResponseInterceptor[]\n private schemas?: TSchemas\n private schemaValidation?: IgniterCallerSchemaValidationOptions\n\n constructor(\n baseURL?: string,\n opts?: {\n headers?: Record<string, string>\n cookies?: Record<string, string>\n logger?: IgniterLogger\n requestInterceptors?: IgniterCallerRequestInterceptor[]\n responseInterceptors?: IgniterCallerResponseInterceptor[]\n schemas?: TSchemas\n schemaValidation?: IgniterCallerSchemaValidationOptions\n },\n ) {\n this.baseURL = baseURL\n this.headers = opts?.headers\n this.cookies = opts?.cookies\n this.logger = opts?.logger\n this.requestInterceptors = opts?.requestInterceptors\n this.responseInterceptors = opts?.responseInterceptors\n this.schemas = opts?.schemas\n this.schemaValidation = opts?.schemaValidation\n }\n\n /**\n * Canonical initialization entrypoint.\n *\n * This is designed to remain stable when extracted to `@igniter-js/caller`.\n */\n static create<TInitSchemas extends IgniterCallerSchemaMap = IgniterCallerSchemaMap>(): IgniterCallerBuilder<IgniterCaller<TInitSchemas>, TInitSchemas> {\n return IgniterCallerBuilder.create<IgniterCaller<any>, any>((state) => {\n // Configure store if provided\n if (state.store) {\n IgniterCallerCacheUtils.setStore(state.store, state.storeOptions)\n }\n\n return new IgniterCaller(state.baseURL, {\n headers: state.headers,\n cookies: state.cookies,\n logger: state.logger,\n requestInterceptors: state.requestInterceptors,\n responseInterceptors: state.responseInterceptors,\n schemas: state.schemas,\n schemaValidation: state.schemaValidation,\n })\n }) as IgniterCallerBuilder<IgniterCaller<TInitSchemas>, TInitSchemas>\n }\n\n /**\n * Returns a new client with the same config and a new logger.\n */\n withLogger(logger: IgniterLogger): IgniterCaller<TSchemas> {\n return new IgniterCaller<TSchemas>(this.baseURL, {\n headers: this.headers,\n cookies: this.cookies,\n logger,\n requestInterceptors: this.requestInterceptors,\n responseInterceptors: this.responseInterceptors,\n schemas: this.schemas,\n schemaValidation: this.schemaValidation,\n })\n }\n\n setBaseURL(baseURL: string): this {\n this.baseURL = baseURL\n return this\n }\n\n setHeaders(headers: Record<string, string>): this {\n this.headers = headers\n return this\n }\n\n setCookies(cookies: Record<string, string>): this {\n this.cookies = cookies\n return this\n }\n\n /**\n * Creates common request builder params.\n */\n private createBuilderParams(): IgniterCallerRequestBuilderParams {\n return {\n baseURL: this.baseURL,\n defaultHeaders: this.headers,\n defaultCookies: this.cookies,\n logger: this.logger,\n requestInterceptors: this.requestInterceptors,\n responseInterceptors: this.responseInterceptors,\n eventEmitter: async (url, method, result) => {\n await IgniterCaller.emitEvent(url, method, result)\n },\n schemas: this.schemas,\n schemaValidation: this.schemaValidation,\n }\n }\n\n /**\n * Resolves the full URL path by prepending baseURL if needed.\n */\n private resolveSchemaPath(url: string): string {\n if (this.baseURL && !url.startsWith('http')) {\n return `${this.baseURL}${url}`\n }\n return url\n }\n\n /**\n * Creates a GET request.\n *\n * When a URL is provided and matches a schema, the response, body, and params types\n * are automatically inferred from the schema definition.\n *\n * @param url Optional URL for the request. When provided and matching a schema path,\n * enables full type inference for response, body, and path params.\n *\n * @example\n * ```ts\n * // With typed schema - full type inference\n * const result = await api.get('/users/:id')\n * .params({ id: '123' }) // params are typed based on URL pattern\n * .execute()\n * // result.data is typed based on schema\n *\n * // Without URL (set later with .url())\n * const result = await api.get().url('/users').execute()\n * ```\n */\n get<TPath extends GetPaths<TSchemas>>(url: TPath): TypedRequestBuilder<TSchemas, TPath, 'GET'>\n get<TPath extends string>(url?: TPath): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'GET'>>\n get<TPath extends string>(url?: TPath): any {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('GET')\n if (url) builder._setUrl(url)\n return builder\n }\n\n /**\n * Creates a POST request.\n *\n * When a URL is provided and matches a schema, the response type is automatically inferred.\n /**\n * Creates a POST request.\n *\n * When a URL is provided and matches a schema, the response, body, and params types\n * are automatically inferred from the schema definition.\n *\n * @param url Optional URL for the request.\n *\n * @example\n * ```ts\n * // With typed schema - body type is inferred from schema\n * const result = await api.post('/users')\n * .body({ name: 'John', email: 'john@example.com' }) // body is typed\n * .execute()\n * ```\n */\n post<TPath extends PostPaths<TSchemas>>(url: TPath): TypedRequestBuilder<TSchemas, TPath, 'POST'>\n post<TPath extends string>(url?: TPath): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'POST'>>\n post<TPath extends string>(url?: TPath): any {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('POST')\n if (url) builder._setUrl(url)\n return builder\n }\n\n /**\n * Creates a PUT request.\n *\n * When a URL is provided and matches a schema, the response, body, and params types\n * are automatically inferred from the schema definition.\n *\n * @param url Optional URL for the request.\n *\n * @example\n * ```ts\n * const result = await api.put('/users/:id')\n * .params({ id: '1' })\n * .body({ name: 'Jane' })\n * .execute()\n * ```\n */\n put<TPath extends PutPaths<TSchemas>>(url: TPath): TypedRequestBuilder<TSchemas, TPath, 'PUT'>\n put<TPath extends string>(url?: TPath): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'PUT'>>\n put<TPath extends string>(url?: TPath): any {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('PUT')\n if (url) builder._setUrl(url)\n return builder\n }\n\n /**\n * Creates a PATCH request.\n *\n * When a URL is provided and matches a schema, the response, body, and params types\n * are automatically inferred from the schema definition.\n *\n * @param url Optional URL for the request.\n *\n * @example\n * ```ts\n * const result = await api.patch('/users/:id')\n * .params({ id: '1' })\n * .body({ name: 'Jane' })\n * .execute()\n * ```\n */\n patch<TPath extends PatchPaths<TSchemas>>(url: TPath): TypedRequestBuilder<TSchemas, TPath, 'PATCH'>\n patch<TPath extends string>(url?: TPath): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'PATCH'>>\n patch<TPath extends string>(url?: TPath): any {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('PATCH')\n if (url) builder._setUrl(url)\n return builder\n }\n\n /**\n * Creates a DELETE request.\n *\n * When a URL is provided and matches a schema, the response, body, and params types\n * are automatically inferred from the schema definition.\n *\n * @param url Optional URL for the request.\n *\n * @example\n * ```ts\n * const result = await api.delete('/users/:id')\n * .params({ id: '1' })\n * .execute()\n * ```\n */\n delete<TPath extends DeletePaths<TSchemas>>(url: TPath): TypedRequestBuilder<TSchemas, TPath, 'DELETE'>\n delete<TPath extends string>(url?: TPath): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'DELETE'>>\n delete<TPath extends string>(url?: TPath): any {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('DELETE')\n if (url) builder._setUrl(url)\n return builder\n }\n\n /**\n * Creates a HEAD request.\n *\n * When a URL is provided and matches a schema, the response, body, and params types\n * are automatically inferred from the schema definition.\n *\n * @param url Optional URL for the request.\n */\n head<TPath extends HeadPaths<TSchemas>>(url: TPath): TypedRequestBuilder<TSchemas, TPath, 'HEAD'>\n head<TPath extends string>(url?: TPath): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'HEAD'>>\n head<TPath extends string>(url?: TPath): any {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('HEAD')\n if (url) builder._setUrl(url)\n return builder\n }\n\n /**\n * Executes a request directly with all options in one object (axios-style).\n *\n * This is a convenience method for making requests without using the builder pattern.\n * Useful for dynamic requests where options are constructed programmatically.\n *\n * @example\n * ```ts\n * const result = await api.request({\n * method: 'POST',\n * url: '/users',\n * body: { name: 'John' },\n * headers: { 'X-Custom': 'value' },\n * timeout: 5000,\n * })\n *\n * // With caching\n * const result = await api.request({\n * method: 'GET',\n * url: '/users',\n * staleTime: 30000,\n * })\n *\n * // With retry\n * const result = await api.request({\n * method: 'GET',\n * url: '/health',\n * retry: { maxAttempts: 3, backoff: 'exponential' },\n * })\n * ```\n */\n async request<T = unknown>(\n options: IgniterCallerDirectRequestOptions,\n ): Promise<IgniterCallerApiResponse<T>> {\n const builder = new IgniterCallerRequestBuilder<T>({\n ...this.createBuilderParams(),\n // Override with request-specific options\n defaultHeaders: {\n ...this.headers,\n ...options.headers,\n },\n })\n\n // Set method and URL\n builder._setMethod(options.method)\n builder._setUrl(options.url)\n\n // Set body if provided\n if (options.body !== undefined) {\n builder.body(options.body)\n }\n\n // Set params if provided\n if (options.params) {\n builder.params(options.params)\n }\n\n // Set timeout if provided\n if (options.timeout) {\n builder.timeout(options.timeout)\n }\n\n // Set cache options\n if (options.cache) {\n builder.cache(options.cache, options.cacheKey)\n }\n\n // Set stale time\n if (options.staleTime) {\n builder.stale(options.staleTime)\n }\n\n // Set retry options\n if (options.retry) {\n builder.retry(options.retry.maxAttempts, options.retry)\n }\n\n // Set fallback\n if (options.fallback) {\n builder.fallback(options.fallback)\n }\n\n // Set response schema\n if (options.responseSchema) {\n builder.responseType(options.responseSchema)\n }\n\n return builder.execute()\n }\n\n /**\n * Executes multiple requests in parallel and returns results as an array.\n *\n * This is useful for batching independent API calls.\n */\n static async batch<\n T extends readonly Promise<IgniterCallerApiResponse<any>>[],\n >(\n requests: [...T],\n ): Promise<{\n [K in keyof T]: T[K] extends Promise<infer R> ? R : never\n }> {\n return Promise.all(requests) as any\n }\n\n /**\n * Registers a global event listener for HTTP responses.\n *\n * This allows observing API responses across the application for:\n * - Debugging and logging\n * - Real-time monitoring\n * - Cache invalidation triggers\n * - Analytics and telemetry\n *\n * @param pattern URL string (exact match) or RegExp pattern\n * @param callback Function to execute when a response matches\n * @returns Cleanup function to remove the listener\n *\n * @example\n * ```ts\n * // Listen to all user endpoints\n * const cleanup = IgniterCaller.on(/^\\/users/, (result, context) => {\n * console.log(`${context.method} ${context.url}`, result)\n * })\n *\n * // Cleanup when done\n * cleanup()\n * ```\n */\n static on(\n pattern: IgniterCallerUrlPattern,\n callback: IgniterCallerEventCallback,\n ): () => void {\n return IgniterCaller.events.on(pattern, callback)\n }\n\n /**\n * Removes event listeners for a pattern.\n */\n static off(\n pattern: IgniterCallerUrlPattern,\n callback?: IgniterCallerEventCallback,\n ): void {\n IgniterCaller.events.off(pattern, callback)\n }\n\n /**\n * Invalidates a specific cache entry.\n *\n * This is useful after mutations to ensure fresh data on next fetch.\n *\n * @example\n * ```ts\n * // After creating a user\n * await api.post('/users').body(newUser).execute()\n * await IgniterCaller.invalidate('/users') // Clear users list cache\n * ```\n */\n static async invalidate(key: string): Promise<void> {\n await IgniterCallerCacheUtils.clear(key)\n }\n\n /**\n * Invalidates all cache entries matching a pattern.\n *\n * @param pattern Glob pattern (e.g., '/users/*') or exact key\n *\n * @example\n * ```ts\n * // Invalidate all user-related caches\n * await IgniterCaller.invalidatePattern('/users/*')\n * ```\n */\n static async invalidatePattern(pattern: string): Promise<void> {\n await IgniterCallerCacheUtils.clearPattern(pattern)\n }\n\n /**\n * Emits an event to all registered listeners.\n *\n * @internal\n */\n static async emitEvent(\n url: string,\n method: string,\n result: IgniterCallerApiResponse<any>,\n ): Promise<void> {\n await IgniterCaller.events.emit(url, method, result)\n }\n}\n","import {\n IgniterCallerError,\n type IgniterCallerErrorCode,\n} from '../errors/igniter-caller.error'\nimport type {\n IgniterCallerApiResponse,\n IgniterCallerFileResponse,\n} from '../types/response'\n\n/**\n * Testing utilities for `IgniterCaller`.\n *\n * Designed to simplify mocking HTTP responses in unit tests.\n */\nexport class IgniterCallerMock {\n /**\n * Creates a successful mock response.\n */\n static mockResponse<T>(data: T): IgniterCallerApiResponse<T> {\n return { data, error: undefined }\n }\n\n /**\n * Creates an error mock response.\n */\n static mockError<T = never>(\n code: IgniterCallerErrorCode,\n message = 'Mock error',\n ): IgniterCallerApiResponse<T> {\n return {\n data: undefined,\n error: new IgniterCallerError({\n code,\n operation: 'execute',\n message,\n }),\n }\n }\n\n /**\n * Creates a successful file download mock.\n */\n static mockFile(\n filename: string,\n content: string | Blob,\n ): IgniterCallerFileResponse {\n const blob = typeof content === 'string' ? new Blob([content]) : content\n const file = new File([blob], filename)\n\n return { file, error: null }\n }\n\n /**\n * Creates a failed file download mock.\n */\n static mockFileError(message = 'Mock file error'): IgniterCallerFileResponse {\n return {\n file: null,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_UNKNOWN_ERROR',\n operation: 'download',\n message,\n }),\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/caller.error.ts","../src/utils/body.ts","../src/utils/cache.ts","../src/utils/schema.ts","../src/utils/url.ts","../src/builders/request.builder.ts","../src/core/events.ts","../src/core/manager.ts","../src/builders/main.builder.ts","../src/builders/schema-path.builder.ts","../src/builders/schema.builder.ts","../src/adapters/mock.adapter.ts","../src/utils/testing.ts"],"names":["IgniterError","match","durationMs","callbacks","z"],"mappings":"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","file":"index.js","sourcesContent":["import { IgniterError, type IgniterLogger } from '@igniter-js/core'\n\n/**\n * Stable error codes emitted by `IgniterCaller`.\n */\nexport type IgniterCallerErrorCode =\n | 'IGNITER_CALLER_HTTP_ERROR'\n | 'IGNITER_CALLER_TIMEOUT'\n | 'IGNITER_CALLER_REQUEST_VALIDATION_FAILED'\n | 'IGNITER_CALLER_RESPONSE_VALIDATION_FAILED'\n | 'IGNITER_CALLER_SCHEMA_DUPLICATE'\n | 'IGNITER_CALLER_SCHEMA_INVALID'\n | 'IGNITER_CALLER_UNKNOWN_ERROR'\n\n/**\n * Operation identifiers used to describe where an error happened.\n */\nexport type IgniterCallerOperation =\n | 'execute'\n | 'download'\n | 'buildRequest'\n | 'parseResponse'\n | 'validateRequest'\n | 'validateResponse'\n | 'buildSchema'\n\n/**\n * Payload used to create an {@link IgniterCallerError}.\n */\nexport type IgniterCallerErrorPayload = {\n /** Machine-readable error code. */\n code: IgniterCallerErrorCode\n /** Where the error happened. */\n operation: IgniterCallerOperation\n /** Human-readable message. */\n message: string\n /** Optional HTTP status code when surfacing errors through HTTP boundaries. */\n statusCode?: number\n /** Optional HTTP status text (when available). */\n statusText?: string\n /** Extra diagnostic details (e.g. response body or schema issues). */\n details?: unknown\n /** Arbitrary metadata for debugging. */\n metadata?: Record<string, unknown>\n /** Optional original cause. */\n cause?: Error\n /** Optional logger used by IgniterError. */\n logger?: IgniterLogger\n}\n\n/**\n * Typed error for predictable failures in `IgniterCaller`.\n *\n * Designed to be extracted into `@igniter-js/caller`.\n */\nexport class IgniterCallerError extends IgniterError {\n /** Machine-readable error code. */\n declare readonly code: IgniterCallerErrorCode\n /** Operation that produced the error. */\n readonly operation: IgniterCallerOperation\n /** Optional HTTP status text. */\n readonly statusText?: string\n /** Optional original error cause. */\n readonly cause?: Error\n\n /**\n * Creates a new typed caller error.\n *\n * @param payload - Error payload with code, message, and metadata.\n */\n constructor(payload: IgniterCallerErrorPayload) {\n const metadata = {\n ...payload.metadata,\n operation: payload.operation,\n statusText: payload.statusText,\n }\n\n const details =\n payload.details ??\n (payload.cause !== undefined ? { cause: payload.cause } : undefined)\n\n super({\n code: payload.code,\n message: payload.message,\n statusCode: payload.statusCode,\n causer: '@igniter-js/caller',\n details,\n metadata,\n logger: payload.logger,\n cause: payload.cause,\n })\n\n this.name = 'IgniterCallerError'\n this.operation = payload.operation\n this.statusText = payload.statusText\n this.cause = payload.cause\n }\n\n /**\n * Type guard for `IgniterCallerError`.\n *\n * @param error - Value to check.\n */\n static is(error: unknown): error is IgniterCallerError {\n return error instanceof IgniterCallerError\n }\n}\n","/**\n * Body utilities for `IgniterCaller`.\n */\nexport class IgniterCallerBodyUtils {\n /**\n * Returns true when the request body should be passed to `fetch` as-is.\n *\n * @param body - Request body to inspect.\n * @returns True if the body should be sent as raw data.\n */\n static isRawBody(body: unknown): boolean {\n if (!body) return false\n\n if (typeof FormData !== 'undefined' && body instanceof FormData) return true\n if (typeof Blob !== 'undefined' && body instanceof Blob) return true\n if (typeof ArrayBuffer !== 'undefined' && body instanceof ArrayBuffer)\n return true\n if (\n typeof URLSearchParams !== 'undefined' &&\n body instanceof URLSearchParams\n )\n return true\n if (typeof ReadableStream !== 'undefined' && body instanceof ReadableStream)\n return true\n\n // Node Buffer\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(body)) return true\n\n // DataView, Int8Array, etc.\n if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(body as any))\n return true\n\n return false\n }\n\n /**\n * Removes Content-Type for FormData so fetch can set boundaries automatically.\n *\n * @param headers - Request headers map.\n * @param body - Request body.\n * @returns Updated headers without Content-Type when needed.\n */\n static normalizeHeadersForBody(\n headers: Record<string, string> | undefined,\n body: unknown,\n ): Record<string, string> | undefined {\n if (!headers) return headers\n\n const isFormData = typeof FormData !== 'undefined' && body instanceof FormData\n if (!isFormData) return headers\n\n if (!('Content-Type' in headers)) return headers\n\n const { 'Content-Type': _contentType, ...rest } = headers\n return rest\n }\n}\n","import type {\n IgniterCallerStoreAdapter,\n IgniterCallerStoreOptions,\n} from '../types/store'\n\n/**\n * Cache interface for HTTP responses.\n *\n * Supports both in-memory caching and persistent store-based caching (Redis, etc).\n */\nexport class IgniterCallerCacheUtils {\n private static cache = new Map<\n string,\n { data: unknown; timestamp: number }\n >()\n private static store: IgniterCallerStoreAdapter | null = null\n private static storeOptions: IgniterCallerStoreOptions = {\n ttl: 3600,\n keyPrefix: 'igniter:caller:',\n fallbackToFetch: true,\n }\n\n /**\n * Configures a persistent store adapter for caching.\n *\n * When configured, cache operations will use the store (e.g., Redis)\n * instead of in-memory cache, enabling persistent cache across deployments.\n *\n * @param store - Store adapter implementation.\n * @param options - Store options such as ttl and key prefix.\n */\n static setStore(\n store: IgniterCallerStoreAdapter,\n options?: IgniterCallerStoreOptions,\n ): void {\n IgniterCallerCacheUtils.store = store\n if (options) {\n IgniterCallerCacheUtils.storeOptions = {\n ...IgniterCallerCacheUtils.storeOptions,\n ...options,\n }\n }\n }\n\n /**\n * Gets the configured store adapter.\n *\n * @returns Store adapter or null when unset.\n */\n static getStore(): IgniterCallerStoreAdapter | null {\n return IgniterCallerCacheUtils.store\n }\n\n /**\n * Gets cached data if it exists and is not stale.\n *\n * @param key - Cache key (without prefix).\n * @param staleTime - Optional stale time in milliseconds.\n * @returns Cached value or undefined when missing/stale.\n */\n static async get<T>(key: string, staleTime?: number): Promise<T | undefined> {\n const prefixedKey = IgniterCallerCacheUtils.getPrefixedKey(key)\n\n // Try store first if available\n if (IgniterCallerCacheUtils.store) {\n try {\n const data = await IgniterCallerCacheUtils.store.get<T>(prefixedKey)\n if (data !== null) {\n return data\n }\n } catch (error) {\n console.error('IgniterCaller: Store get failed', error)\n // Fall through to in-memory cache\n }\n }\n\n // Fallback to in-memory cache\n const entry = IgniterCallerCacheUtils.cache.get(prefixedKey)\n if (!entry) return undefined\n\n if (staleTime && Date.now() - entry.timestamp > staleTime) {\n IgniterCallerCacheUtils.cache.delete(prefixedKey)\n return undefined\n }\n\n return entry.data as T\n }\n\n /**\n * Stores data in cache with current timestamp.\n *\n * @param key - Cache key (without prefix).\n * @param data - Data to cache.\n * @param ttl - Optional TTL override in seconds.\n */\n static async set(key: string, data: unknown, ttl?: number): Promise<void> {\n const prefixedKey = IgniterCallerCacheUtils.getPrefixedKey(key)\n const effectiveTtl = ttl || IgniterCallerCacheUtils.storeOptions.ttl || 3600\n\n // Try store first if available\n if (IgniterCallerCacheUtils.store) {\n try {\n await IgniterCallerCacheUtils.store.set(prefixedKey, data, {\n ttl: effectiveTtl,\n })\n return\n } catch (error) {\n console.error('IgniterCaller: Store set failed', error)\n // Fall through to in-memory cache\n }\n }\n\n // Fallback to in-memory cache\n IgniterCallerCacheUtils.cache.set(prefixedKey, {\n data,\n timestamp: Date.now(),\n })\n }\n\n /**\n * Clears a specific cache entry.\n *\n * @param key - Cache key (without prefix).\n */\n static async clear(key: string): Promise<void> {\n const prefixedKey = IgniterCallerCacheUtils.getPrefixedKey(key)\n\n // Try store first\n if (IgniterCallerCacheUtils.store) {\n try {\n await IgniterCallerCacheUtils.store.delete(prefixedKey)\n } catch (error) {\n console.error('IgniterCaller: Store delete failed', error)\n }\n }\n\n // Also clear from in-memory cache\n IgniterCallerCacheUtils.cache.delete(prefixedKey)\n }\n\n /**\n * Clears all cache entries matching a pattern.\n *\n * @param pattern Glob pattern (e.g., '/users/*') or exact key\n */\n static async clearPattern(pattern: string): Promise<void> {\n const prefixedPattern = IgniterCallerCacheUtils.getPrefixedKey(pattern)\n const regex = IgniterCallerCacheUtils.globToRegex(prefixedPattern)\n\n // Clear from in-memory cache\n for (const key of IgniterCallerCacheUtils.cache.keys()) {\n if (regex.test(key)) {\n IgniterCallerCacheUtils.cache.delete(key)\n }\n }\n\n // Note: Store pattern deletion depends on store implementation\n // Redis supports SCAN + DEL, but we keep it simple here\n if (IgniterCallerCacheUtils.store) {\n console.warn(\n 'IgniterCaller: Pattern-based cache invalidation in store requires manual implementation',\n )\n }\n }\n\n /**\n * Clears all cache entries.\n *\n * @returns Promise that resolves when in-memory cache is cleared.\n */\n static async clearAll(): Promise<void> {\n IgniterCallerCacheUtils.cache.clear()\n\n if (IgniterCallerCacheUtils.store) {\n console.warn(\n 'IgniterCaller: clearAll() only clears in-memory cache. Store cache requires manual cleanup.',\n )\n }\n }\n\n /**\n * Adds the configured prefix to a key.\n */\n private static getPrefixedKey(key: string): string {\n const prefix = IgniterCallerCacheUtils.storeOptions.keyPrefix || ''\n return `${prefix}${key}`\n }\n\n /**\n * Converts a glob pattern to a RegExp.\n */\n private static globToRegex(pattern: string): RegExp {\n const escaped = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*')\n return new RegExp(`^${escaped}$`)\n }\n}\n","import type { IgniterLogger, StandardSchemaV1 } from '@igniter-js/core'\nimport { IgniterCallerError } from '../errors/caller.error'\nimport type {\n IgniterCallerEndpointSchema,\n IgniterCallerSchemaMap,\n IgniterCallerSchemaMethod,\n IgniterCallerSchemaValidationOptions,\n} from '../types/schemas'\n\n/**\n * Utilities for schema matching and validation.\n *\n * @internal\n */\nexport class IgniterCallerSchemaUtils {\n /**\n * Matches a URL path against schema map paths (supports path parameters).\n *\n * @param actualPath - Incoming request path.\n * @param schemaPath - Schema path pattern.\n * @returns Match result with params when matched.\n *\n * @example\n * ```ts\n * matchPath('/users/123', '/users/:id') // { matched: true, params: { id: '123' } }\n * matchPath('/users', '/users/:id') // { matched: false }\n * ```\n */\n static matchPath(\n actualPath: string,\n schemaPath: string,\n ): { matched: boolean; params?: Record<string, string> } {\n // Exact match (no params)\n if (actualPath === schemaPath) {\n return { matched: true, params: {} }\n }\n\n // Build regex from schema path pattern\n const paramNames: string[] = []\n const regexPattern = schemaPath\n .replace(/:[^/]+/g, (match) => {\n paramNames.push(match.slice(1)) // Remove ':'\n return '([^/]+)'\n })\n .replace(/\\//g, '\\\\/')\n\n const regex = new RegExp(`^${regexPattern}$`)\n const match = actualPath.match(regex)\n\n if (!match) {\n return { matched: false }\n }\n\n // Extract params\n const params: Record<string, string> = {}\n for (let i = 0; i < paramNames.length; i++) {\n params[paramNames[i]] = match[i + 1]\n }\n\n return { matched: true, params }\n }\n\n /**\n * Finds the schema for a given path and method from the schema map.\n *\n * @param schemaMap - Schema map from the builder.\n * @param path - Request path to match.\n * @param method - HTTP method to match.\n * @returns Matching schema and extracted params.\n */\n static findSchema(\n schemaMap: IgniterCallerSchemaMap | undefined,\n path: string,\n method: string,\n ): {\n schema: IgniterCallerEndpointSchema | undefined\n params: Record<string, string>\n } {\n if (!schemaMap) {\n return { schema: undefined, params: {} }\n }\n\n // Try exact match first\n const exactMatch = schemaMap[path]?.[method as IgniterCallerSchemaMethod]\n if (exactMatch) {\n return { schema: exactMatch, params: {} }\n }\n\n // Try pattern matching with path params\n for (const [schemaPath, methods] of Object.entries(schemaMap)) {\n const matchResult = IgniterCallerSchemaUtils.matchPath(path, schemaPath)\n if (matchResult.matched) {\n const schema = methods?.[method as IgniterCallerSchemaMethod]\n if (schema) {\n return { schema, params: matchResult.params || {} }\n }\n }\n }\n\n return { schema: undefined, params: {} }\n }\n\n /**\n * Validates input using StandardSchemaV1.\n *\n * If the schema provides `~standard.validate`, it will be used.\n * Otherwise, returns the input as-is.\n *\n * @param schema - StandardSchema instance.\n * @param input - Input value to validate.\n * @returns Validated input value.\n */\n private static async validateWithStandardSchema<\n TSchema extends StandardSchemaV1,\n >(\n schema: TSchema,\n input: unknown,\n ): Promise<StandardSchemaV1.InferInput<TSchema>> {\n const standard = (schema as any)?.['~standard'] as\n | {\n validate: (\n value: unknown,\n ) =>\n | { value?: unknown; issues?: unknown[] }\n | Promise<{ value?: unknown; issues?: unknown[] }>\n }\n | undefined\n\n if (!standard?.validate) {\n return input as StandardSchemaV1.InferInput<TSchema>\n }\n\n const result = await standard.validate(input)\n\n if ((result as any)?.issues?.length) {\n throw {\n issues: (result as any).issues,\n _standardSchemaValidationError: true,\n }\n }\n\n return ((result as any)?.value ??\n input) as StandardSchemaV1.InferInput<TSchema>\n }\n\n /**\n * Validates request body against schema.\n *\n * @param data - Request body data.\n * @param schema - Request schema (if any).\n * @param options - Validation options.\n * @param context - Request context for error reporting.\n * @param logger - Optional logger instance.\n * @returns Validated data or throws/logs error based on validation mode.\n */\n static async validateRequest<T>(\n data: unknown,\n schema: StandardSchemaV1 | undefined,\n options: IgniterCallerSchemaValidationOptions | undefined,\n context: { url: string; method: string },\n logger?: IgniterLogger,\n ): Promise<T> {\n if (!schema || options?.mode === 'off') {\n return data as T\n }\n\n try {\n const validated =\n await IgniterCallerSchemaUtils.validateWithStandardSchema(schema, data)\n return validated as T\n } catch (error: any) {\n // Handle validation error\n if (options?.onValidationError && error?._standardSchemaValidationError) {\n options.onValidationError(error, { ...context, statusCode: 0 })\n }\n\n if (options?.mode === 'soft') {\n logger?.warn('Request validation failed (soft mode)', {\n url: context.url,\n method: context.method,\n errors: error?.issues,\n })\n return data as T\n }\n\n // Strict mode: throw\n throw new IgniterCallerError({\n code: 'IGNITER_CALLER_REQUEST_VALIDATION_FAILED',\n message: `Request validation failed for ${context.method} ${context.url}`,\n statusCode: 400,\n details: error?.issues,\n operation: 'validateRequest',\n })\n }\n }\n\n /**\n * Validates response data against schema.\n *\n * @param data - Response payload to validate.\n * @param schema - Response schema (if any).\n * @param statusCode - HTTP status code.\n * @param options - Validation options.\n * @param context - Request context for error reporting.\n * @param logger - Optional logger instance.\n * @returns Validated data or throws/logs error based on validation mode.\n */\n static async validateResponse<T>(\n data: unknown,\n schema: StandardSchemaV1 | undefined,\n statusCode: number,\n options: IgniterCallerSchemaValidationOptions | undefined,\n context: { url: string; method: string },\n logger?: IgniterLogger,\n ): Promise<T> {\n if (!schema || options?.mode === 'off') {\n return data as T\n }\n\n try {\n const validated =\n await IgniterCallerSchemaUtils.validateWithStandardSchema(schema, data)\n return validated as T\n } catch (error: any) {\n // Handle validation error\n if (options?.onValidationError && error?._standardSchemaValidationError) {\n options.onValidationError(error, { ...context, statusCode })\n }\n\n if (options?.mode === 'soft') {\n logger?.warn('Response validation failed (soft mode)', {\n url: context.url,\n method: context.method,\n statusCode,\n errors: error?.issues,\n })\n return data as T\n }\n\n // Strict mode: throw\n throw new IgniterCallerError({\n code: 'IGNITER_CALLER_RESPONSE_VALIDATION_FAILED',\n message: `Response validation failed for ${context.method} ${context.url} (${statusCode})`,\n statusCode,\n details: error?.issues,\n operation: 'validateResponse',\n })\n }\n }\n}\n","/**\n * URL utilities for `IgniterCaller`.\n */\nexport class IgniterCallerUrlUtils {\n /**\n * Builds a full URL with optional base URL and query parameters.\n *\n * @param params - URL construction parameters.\n * @returns Full URL string.\n */\n static buildUrl(params: {\n url: string\n baseURL?: string\n query?: Record<string, string | number | boolean>\n }): string {\n const { url, baseURL, query } = params\n\n // If url is absolute, disregard baseURL\n let fullUrl = url\n if (baseURL && !/^https?:\\/\\//i.test(url)) {\n fullUrl = baseURL + url\n }\n\n if (query && Object.keys(query).length > 0) {\n const queryParams = new URLSearchParams(\n Object.entries(query).map(([key, value]) => [key, String(value)]),\n ).toString()\n\n fullUrl += (fullUrl.includes('?') ? '&' : '?') + queryParams\n }\n\n return fullUrl\n }\n}\n","import type { IgniterError, IgniterLogger, StandardSchemaV1 } from '@igniter-js/core'\nimport type { IgniterTelemetryManager } from '@igniter-js/telemetry'\nimport type { z } from 'zod'\nimport { IgniterCallerError } from '../errors/caller.error'\nimport type { IgniterCallerHttpMethod } from '../types/http'\nimport type {\n IgniterCallerRequestInterceptor,\n IgniterCallerResponseInterceptor,\n} from '../types/interceptors'\nimport type { IgniterCallerRequestOptions } from '../types/request'\nimport type {\n IgniterCallerApiResponse,\n IgniterCallerFileResponse,\n IgniterCallerResponseContentType,\n IgniterCallerValidatableContentType,\n} from '../types/response'\nimport type { IgniterCallerRetryOptions } from '../types/retry'\nimport type {\n IgniterCallerSchemaMap,\n IgniterCallerSchemaValidationOptions,\n} from '../types/schemas'\nimport type { IgniterCallerRequestBuilderParams } from '../types/builder'\nimport { IgniterCallerBodyUtils } from '../utils/body'\nimport { IgniterCallerCacheUtils } from '../utils/cache'\nimport { IgniterCallerSchemaUtils } from '../utils/schema'\nimport { IgniterCallerUrlUtils } from '../utils/url'\n\n/**\n * Content types that support schema validation.\n */\nconst VALIDATABLE_CONTENT_TYPES: IgniterCallerValidatableContentType[] = [\n 'json',\n 'xml',\n 'csv',\n]\n\n/**\n * Detects the response content type from headers.\n */\nfunction detectContentType(\n contentType: string | null,\n): IgniterCallerResponseContentType {\n if (!contentType) return 'text'\n\n const ct = contentType.toLowerCase()\n\n if (ct.includes('application/json')) return 'json'\n if (ct.includes('application/xml') || ct.includes('text/xml')) return 'xml'\n if (ct.includes('text/csv')) return 'csv'\n if (ct.includes('text/html')) return 'html'\n if (ct.includes('text/plain')) return 'text'\n if (ct.includes('multipart/form-data')) return 'formdata'\n if (ct.includes('application/octet-stream')) return 'blob'\n\n // Check for file-like content types\n if (\n ct.includes('image/') ||\n ct.includes('audio/') ||\n ct.includes('video/') ||\n ct.includes('application/pdf') ||\n ct.includes('application/zip')\n ) {\n return 'blob'\n }\n\n return 'text'\n}\n\n/**\n * Checks if a content type supports schema validation.\n */\nfunction isValidatableContentType(\n contentType: IgniterCallerResponseContentType,\n): contentType is IgniterCallerValidatableContentType {\n return VALIDATABLE_CONTENT_TYPES.includes(\n contentType as IgniterCallerValidatableContentType,\n )\n}\n\n/**\n * Parse response data based on content type.\n */\nasync function parseResponseByContentType(\n response: Response,\n contentType: IgniterCallerResponseContentType,\n): Promise<unknown> {\n switch (contentType) {\n case 'json':\n return response.json()\n case 'xml':\n case 'csv':\n case 'html':\n case 'text':\n return response.text()\n case 'blob':\n return response.blob()\n case 'stream':\n return response.body\n case 'arraybuffer':\n return response.arrayBuffer()\n case 'formdata':\n return response.formData()\n default:\n return response.text()\n }\n}\n\n/**\n * Fluent request builder for `IgniterCaller`.\n *\n * When created via specific HTTP methods (get, post, put, patch, delete),\n * the method is already set and cannot be changed.\n */\nexport class IgniterCallerRequestBuilder<TResponse = unknown> {\n private options: IgniterCallerRequestOptions = {\n method: 'GET',\n url: '',\n headers: {\n 'Content-Type': 'application/json',\n },\n timeout: 30000,\n cache: 'default',\n }\n\n private logger?: IgniterLogger\n private telemetry?: IgniterTelemetryManager<{}>\n private retryOptions?: IgniterCallerRetryOptions\n private fallbackFn?: () => any\n private cacheKey?: string\n private staleTime?: number\n private requestInterceptors?: IgniterCallerRequestInterceptor[]\n private responseInterceptors?: IgniterCallerResponseInterceptor[]\n private eventEmitter?: (\n url: string,\n method: string,\n result: any,\n ) => Promise<void>\n private schemas?: IgniterCallerSchemaMap\n private schemaValidation?: IgniterCallerSchemaValidationOptions\n private responseTypeSchema?: z.ZodSchema<any> | StandardSchemaV1\n\n /**\n * Creates a new request builder instance.\n *\n * @param params - Builder configuration from the manager.\n */\n constructor(params: IgniterCallerRequestBuilderParams) {\n if (params.baseURL) this.options.baseURL = params.baseURL\n\n if (params.defaultHeaders) {\n this.options.headers = {\n ...this.options.headers,\n ...params.defaultHeaders,\n }\n }\n\n if (params.defaultCookies) {\n const cookieStr = Object.entries(params.defaultCookies)\n .map(([k, v]) => `${k}=${v}`)\n .join('; ')\n this.options.headers = { ...this.options.headers, Cookie: cookieStr }\n }\n\n this.logger = params.logger\n this.telemetry = params.telemetry\n this.requestInterceptors = params.requestInterceptors\n this.responseInterceptors = params.responseInterceptors\n this.eventEmitter = params.eventEmitter\n this.schemas = params.schemas\n this.schemaValidation = params.schemaValidation\n }\n\n /**\n * Sets the HTTP method for this request.\n * @internal Used by IgniterCaller.request() for generic requests.\n *\n * @param method - HTTP method for the request.\n */\n _setMethod(method: IgniterCallerHttpMethod): this {\n this.options.method = method\n return this\n }\n\n /**\n * Sets the URL for this request.\n * @internal Used when URL is passed to HTTP method directly.\n *\n * @param url - Request URL or path.\n */\n _setUrl(url: string): this {\n this.options.url = url\n return this\n }\n\n /**\n * Overrides the logger for this request chain.\n *\n * @param logger - Logger implementation from `@igniter-js/core`.\n */\n withLogger(logger: IgniterLogger): this {\n this.logger = logger\n return this\n }\n\n /**\n * Sets the request URL.\n *\n * @param url - Request URL or path.\n */\n url(url: string): this {\n this.options.url = url\n return this\n }\n\n /**\n * Sets the request body.\n * For GET/HEAD requests, body will be automatically converted to query params.\n *\n * @param body - Body payload for the request.\n */\n body<TBody>(body: TBody): this {\n this.options.body = body\n return this\n }\n\n /**\n * Sets URL query parameters.\n *\n * @param params - Query string parameters.\n */\n params(params: Record<string, string | number | boolean>): this {\n this.options.params = params\n return this\n }\n\n /**\n * Merges additional headers into the request.\n *\n * @param headers - Header map merged into existing headers.\n */\n headers(headers: Record<string, string>): this {\n this.options.headers = { ...this.options.headers, ...headers }\n return this\n }\n\n /**\n * Sets request timeout in milliseconds.\n *\n * @param timeout - Timeout in milliseconds.\n */\n timeout(timeout: number): this {\n this.options.timeout = timeout\n return this\n }\n\n /**\n * Sets cache strategy and optional cache key.\n *\n * @param cache - Cache strategy for the request.\n * @param key - Optional cache key override.\n */\n cache(cache: RequestCache, key?: string): this {\n this.options.cache = cache\n this.cacheKey = key\n return this\n }\n\n /**\n * Configures retry behavior for failed requests.\n *\n * @param maxAttempts - Maximum number of attempts.\n * @param options - Retry options excluding `maxAttempts`.\n */\n retry(\n maxAttempts: number,\n options?: Omit<IgniterCallerRetryOptions, 'maxAttempts'>,\n ): this {\n this.retryOptions = { maxAttempts, ...options }\n return this\n }\n\n /**\n * Provides a fallback value if the request fails.\n *\n * @param fn - Fallback factory called when the request fails.\n */\n fallback<T>(fn: () => T): this {\n this.fallbackFn = fn\n return this\n }\n\n /**\n * Sets cache stale time in milliseconds.\n *\n * @param milliseconds - Stale time in milliseconds.\n */\n stale(milliseconds: number): this {\n this.staleTime = milliseconds\n return this\n }\n\n /**\n * Sets the expected response type for TypeScript inference.\n *\n * - If a Zod/StandardSchema is passed, it will validate the response (only for JSON/XML/CSV)\n * - If a type parameter is passed (e.g., `responseType<File>()`), it's for typing only\n *\n * The actual parsing is based on Content-Type headers, not this setting.\n *\n * @param schema - Zod/StandardSchema instance for validation (optional).\n *\n * @example\n * ```ts\n * // With Zod schema (validates JSON response)\n * const result = await api.get('/users').responseType(UserSchema).execute()\n *\n * // With type marker (typing only, no validation)\n * const result = await api.get('/file').responseType<Blob>().execute()\n * ```\n */\n responseType<T>(\n schema?: z.ZodSchema<T> | StandardSchemaV1,\n ): IgniterCallerRequestBuilder<T> {\n if (schema) {\n this.responseTypeSchema = schema\n }\n return this as unknown as IgniterCallerRequestBuilder<T>\n }\n\n /**\n * Downloads a file via GET request.\n * @deprecated Use `.responseType<File>().execute()` instead. The response type is auto-detected.\n *\n * @param url - URL or path to download.\n */\n getFile(url: string) {\n this.options.method = 'GET'\n this.options.url = url\n\n return {\n execute: async (): Promise<IgniterCallerFileResponse> => {\n const {\n url: finalUrl,\n requestInit,\n controller,\n timeoutId,\n } = this.buildRequest()\n\n this.logger?.debug('IgniterCaller.getFile started', { url: finalUrl })\n\n try {\n const response = await fetch(finalUrl, {\n ...requestInit,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => '')\n\n return {\n file: null,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_HTTP_ERROR',\n operation: 'download',\n message: errorText || `HTTP error! status: ${response.status}`,\n statusText: response.statusText,\n statusCode: response.status,\n logger: this.logger,\n metadata: { url: finalUrl },\n }),\n }\n }\n\n const data = await response.blob()\n\n const contentType = response.headers.get('content-type')\n const extension = contentType?.split('/')[1]\n\n const filenameHeader = response.headers.get('content-disposition')\n const filename = filenameHeader?.split('filename=')[1]\n const filenameExtension = filename?.split('.').pop()\n\n // NOTE: Node 20+ includes `File` via undici. In older runtimes, this may not exist.\n if (typeof File === 'undefined') {\n return {\n file: null,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_UNKNOWN_ERROR',\n operation: 'download',\n message:\n '`File` is not available in this runtime. Consider using `response.blob()` directly.',\n logger: this.logger,\n metadata: { url: finalUrl },\n }),\n }\n }\n\n const file = new File(\n [data],\n filename || `file.${extension || filenameExtension || 'unknown'}`,\n )\n\n this.logger?.info('IgniterCaller.getFile success', {\n url: finalUrl,\n size: file.size,\n type: file.type,\n })\n\n return { file, error: null }\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n return {\n file: null,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_TIMEOUT',\n operation: 'download',\n message: `Request timeout after ${this.options.timeout || 30000}ms`,\n statusCode: 408,\n logger: this.logger,\n metadata: { url: finalUrl },\n cause: error instanceof Error ? error : undefined,\n }),\n }\n }\n\n return {\n file: null,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_UNKNOWN_ERROR',\n operation: 'download',\n message: (error as Error)?.message || 'Failed to download file',\n logger: this.logger,\n metadata: { url: finalUrl },\n cause: error instanceof Error ? error : undefined,\n }),\n }\n }\n },\n }\n }\n\n /**\n * Executes the HTTP request.\n *\n * Response parsing is automatic based on Content-Type headers:\n * - `application/json` → parsed as JSON\n * - `text/xml`, `application/xml` → returned as text (parse with your XML library)\n * - `text/csv` → returned as text\n * - `text/html`, `text/plain` → returned as text\n * - `image/*`, `audio/*`, `video/*`, `application/pdf`, etc. → returned as Blob\n * - `application/octet-stream` → returned as Blob\n *\n * Schema validation (if configured) only runs for validatable content types (JSON, XML, CSV).\n *\n * @returns Response envelope with data or error.\n */\n async execute(): Promise<IgniterCallerApiResponse<TResponse>> {\n const startTime = Date.now()\n const { safeUrl } = this.resolveUrl()\n const method = this.options.method\n const baseURL = this.options.baseURL\n const timeoutMs = this.options.timeout\n\n // TODO: @ts-expect-error DTS build hit TS2589 (type instantiation too deep) on this emit call.\n this.telemetry?.emit(\n 'igniter.caller.request.execute.started',\n {\n level: 'debug',\n attributes: {\n 'ctx.request.method': method,\n 'ctx.request.url': safeUrl,\n 'ctx.request.baseUrl': baseURL,\n 'ctx.request.timeoutMs': timeoutMs,\n },\n },\n )\n\n this.logger?.debug('IgniterCaller.request.execute started', {\n method,\n url: safeUrl,\n baseURL,\n })\n\n // Check cache first if cache key is provided\n const effectiveCacheKey = this.cacheKey || this.options.url\n if (effectiveCacheKey && this.staleTime) {\n const cached = await IgniterCallerCacheUtils.get<TResponse>(\n effectiveCacheKey,\n this.staleTime,\n )\n if (cached !== undefined) {\n this.telemetry?.emit(\n 'igniter.caller.cache.read.hit',\n {\n level: 'debug',\n attributes: {\n 'ctx.request.method': method,\n 'ctx.request.url': safeUrl,\n 'ctx.cache.key': effectiveCacheKey,\n 'ctx.cache.staleTime': this.staleTime,\n },\n },\n )\n\n const durationMs = Date.now() - startTime\n this.telemetry?.emit(\n 'igniter.caller.request.execute.success',\n {\n level: 'info',\n attributes: {\n 'ctx.request.method': method,\n 'ctx.request.url': safeUrl,\n 'ctx.request.durationMs': durationMs,\n 'ctx.cache.hit': true,\n },\n },\n )\n\n this.logger?.info('IgniterCaller.request.execute success (cache)', {\n key: effectiveCacheKey,\n method,\n url: safeUrl,\n durationMs,\n })\n const cachedResult: IgniterCallerApiResponse<TResponse> = {\n data: cached,\n error: undefined,\n }\n // Emit event for cached response\n await this.emitEvent(cachedResult)\n return cachedResult\n }\n }\n\n // Execute with retry logic\n const result = await this.executeWithRetry()\n\n // Apply fallback if request failed\n if (result.error && this.fallbackFn) {\n this.logger?.debug('IgniterCaller.request.execute applying fallback', {\n method,\n url: safeUrl,\n error: result.error,\n })\n const fallbackResult: IgniterCallerApiResponse<TResponse> = {\n data: this.fallbackFn() as TResponse,\n error: undefined,\n }\n const durationMs = Date.now() - startTime\n this.telemetry?.emit(\n 'igniter.caller.request.execute.success',\n {\n level: 'info',\n attributes: {\n 'ctx.request.method': method,\n 'ctx.request.url': safeUrl,\n 'ctx.request.durationMs': durationMs,\n 'ctx.request.fallback': true,\n },\n },\n )\n this.logger?.info('IgniterCaller.request.execute success (fallback)', {\n method,\n url: safeUrl,\n durationMs,\n })\n await this.emitEvent(fallbackResult)\n return fallbackResult\n }\n\n // Store in cache if successful and cache key is provided\n if (!result.error && result.data !== undefined && effectiveCacheKey) {\n await IgniterCallerCacheUtils.set(\n effectiveCacheKey,\n result.data,\n this.staleTime,\n )\n }\n\n const durationMs = Date.now() - startTime\n if (result.error) {\n this.telemetry?.emit(\n 'igniter.caller.request.execute.error',\n {\n level: 'error',\n attributes: {\n 'ctx.request.method': method,\n 'ctx.request.url': safeUrl,\n 'ctx.request.durationMs': durationMs,\n 'ctx.error.code':\n result.error instanceof IgniterCallerError\n ? result.error.code\n : 'IGNITER_CALLER_UNKNOWN_ERROR',\n 'ctx.error.message': result.error.message,\n 'ctx.response.status': result.status,\n },\n },\n )\n this.logger?.error('IgniterCaller.request.execute failed', {\n method,\n url: safeUrl,\n durationMs,\n error: result.error,\n })\n } else {\n const contentType = result.headers?.get('content-type') || undefined\n this.telemetry?.emit(\n 'igniter.caller.request.execute.success',\n {\n level: 'info',\n attributes: {\n 'ctx.request.method': method,\n 'ctx.request.url': safeUrl,\n 'ctx.request.durationMs': durationMs,\n 'ctx.response.status': result.status,\n 'ctx.response.contentType': contentType,\n 'ctx.cache.hit': false,\n },\n },\n )\n this.logger?.info('IgniterCaller.request.execute success', {\n method,\n url: safeUrl,\n durationMs,\n status: result.status,\n })\n }\n\n // Emit event for response\n await this.emitEvent(result)\n\n return result\n }\n\n private async executeWithRetry(): Promise<IgniterCallerApiResponse<TResponse>> {\n const maxAttempts = this.retryOptions?.maxAttempts || 1\n const baseDelay = this.retryOptions?.baseDelay ?? 1000\n const backoff = this.retryOptions?.backoff || 'linear'\n const retryOnStatus = this.retryOptions?.retryOnStatus || [\n 408, 429, 500, 502, 503, 504,\n ]\n const { safeUrl } = this.resolveUrl()\n const method = this.options.method\n\n let lastError: IgniterError | undefined\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (attempt > 0) {\n const delay =\n backoff === 'exponential'\n ? baseDelay * 2 ** (attempt - 1)\n : baseDelay * attempt\n\n this.telemetry?.emit(\n 'igniter.caller.retry.attempt.started',\n {\n level: 'debug',\n attributes: {\n 'ctx.request.method': method,\n 'ctx.request.url': safeUrl,\n 'ctx.retry.attempt': attempt + 1,\n 'ctx.retry.maxAttempts': maxAttempts,\n 'ctx.retry.delayMs': delay,\n },\n },\n )\n this.logger?.debug('IgniterCaller.request.execute retrying', {\n method,\n url: safeUrl,\n attempt: attempt + 1,\n delayMs: delay,\n })\n\n await new Promise((resolve) => setTimeout(resolve, delay))\n }\n\n const result = await this.executeSingleRequest()\n\n // Success case\n if (!result.error) {\n return result\n }\n\n // Check if we should retry based on status code\n const shouldRetry =\n result.error instanceof IgniterCallerError &&\n result.error.statusCode &&\n retryOnStatus.includes(result.error.statusCode)\n\n if (!shouldRetry || attempt === maxAttempts - 1) {\n return result\n }\n\n lastError = result.error\n }\n\n return {\n data: undefined,\n error: lastError,\n }\n }\n\n private async executeSingleRequest(): Promise<IgniterCallerApiResponse<TResponse>> {\n let { url, requestInit, controller, timeoutId } = this.buildRequest()\n const { safeUrl } = this.resolveUrl()\n const method = this.options.method\n\n // Apply request interceptors\n if (this.requestInterceptors && this.requestInterceptors.length > 0) {\n let modifiedOptions = { ...this.options, url }\n for (const interceptor of this.requestInterceptors) {\n modifiedOptions = await interceptor(modifiedOptions)\n }\n // Rebuild request with intercepted options\n this.options = modifiedOptions\n const rebuilt = this.buildRequest()\n url = rebuilt.url\n requestInit = rebuilt.requestInit\n controller = rebuilt.controller\n timeoutId = rebuilt.timeoutId\n }\n\n // Validate request body if schema exists\n if (this.schemas && this.options.body) {\n const { schema: endpointSchema } = IgniterCallerSchemaUtils.findSchema(\n this.schemas,\n url,\n this.options.method,\n )\n\n if (endpointSchema?.request) {\n try {\n await IgniterCallerSchemaUtils.validateRequest(\n this.options.body,\n endpointSchema.request,\n this.schemaValidation,\n { url, method: this.options.method },\n this.logger,\n )\n } catch (error) {\n clearTimeout(timeoutId)\n const err = error as IgniterCallerError\n this.telemetry?.emit(\n 'igniter.caller.validation.request.error',\n {\n level: 'error',\n attributes: {\n 'ctx.request.method': method,\n 'ctx.request.url': safeUrl,\n 'ctx.validation.type': 'request',\n 'ctx.validation.error': err.message,\n },\n },\n )\n this.logger?.error('IgniterCaller.request.validation failed', {\n method,\n url: safeUrl,\n error: err,\n })\n // Validation failed in strict mode\n return {\n data: undefined,\n error: err,\n }\n }\n }\n }\n\n try {\n const httpResponse = await fetch(url, {\n ...requestInit,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!httpResponse.ok) {\n const errorText = await httpResponse.text().catch(() => '')\n\n return {\n data: undefined,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_HTTP_ERROR',\n operation: 'execute',\n message: errorText || `HTTP error! status: ${httpResponse.status}`,\n statusText: httpResponse.statusText,\n statusCode: httpResponse.status,\n logger: this.logger,\n metadata: {\n method: this.options.method,\n url,\n },\n }),\n status: httpResponse.status,\n headers: httpResponse.headers,\n }\n }\n\n // Detect content type from headers\n const contentTypeHeader = httpResponse.headers.get('content-type')\n const detectedContentType = detectContentType(contentTypeHeader)\n\n // Parse response based on detected content type\n let data = await parseResponseByContentType(httpResponse, detectedContentType)\n\n // Validate response if:\n // 1. Content type is validatable (json, xml, csv)\n // 2. Either schemas are configured OR responseTypeSchema is set\n const shouldValidate = isValidatableContentType(detectedContentType)\n\n if (shouldValidate) {\n // First, try schema map validation\n if (this.schemas) {\n const { schema: endpointSchema } = IgniterCallerSchemaUtils.findSchema(\n this.schemas,\n url,\n this.options.method,\n )\n\n const responseSchema = endpointSchema?.responses?.[httpResponse.status]\n\n if (responseSchema) {\n try {\n data = await IgniterCallerSchemaUtils.validateResponse(\n data,\n responseSchema,\n httpResponse.status,\n this.schemaValidation,\n { url, method: this.options.method },\n this.logger,\n )\n } catch (error) {\n const err = error as IgniterCallerError\n this.telemetry?.emit(\n 'igniter.caller.validation.response.error',\n {\n level: 'error',\n attributes: {\n 'ctx.request.method': method,\n 'ctx.request.url': safeUrl,\n 'ctx.validation.type': 'response',\n 'ctx.validation.error': err.message,\n 'ctx.response.status': httpResponse.status,\n },\n },\n )\n this.logger?.error('IgniterCaller.response.validation failed', {\n method,\n url: safeUrl,\n status: httpResponse.status,\n error: err,\n })\n return {\n data: undefined,\n error: err,\n status: httpResponse.status,\n headers: httpResponse.headers,\n }\n }\n }\n }\n\n // Then, try responseType schema validation (Zod or StandardSchema)\n if (this.responseTypeSchema) {\n // Check if it's a Zod schema\n if ('safeParse' in this.responseTypeSchema) {\n const zodSchema = this.responseTypeSchema as z.ZodSchema<any>\n const result = zodSchema.safeParse(data)\n if (!result.success) {\n const err = new IgniterCallerError({\n code: 'IGNITER_CALLER_RESPONSE_VALIDATION_FAILED',\n operation: 'parseResponse',\n message: `Response validation failed: ${result.error.message}`,\n logger: this.logger,\n statusCode: httpResponse.status,\n metadata: {\n method: this.options.method,\n url,\n },\n cause: result.error,\n })\n this.telemetry?.emit(\n 'igniter.caller.validation.response.error',\n {\n level: 'error',\n attributes: {\n 'ctx.request.method': method,\n 'ctx.request.url': safeUrl,\n 'ctx.validation.type': 'response',\n 'ctx.validation.error': err.message,\n 'ctx.response.status': httpResponse.status,\n },\n },\n )\n this.logger?.error('IgniterCaller.response.validation failed', {\n method,\n url: safeUrl,\n status: httpResponse.status,\n error: err,\n })\n return {\n data: undefined,\n error: err,\n status: httpResponse.status,\n headers: httpResponse.headers,\n }\n }\n data = result.data\n }\n // Check if it's a StandardSchema\n else if ('~standard' in this.responseTypeSchema) {\n try {\n const standardSchema = this.responseTypeSchema as StandardSchemaV1\n const result = await standardSchema['~standard'].validate(data)\n if (result.issues) {\n const err = new IgniterCallerError({\n code: 'IGNITER_CALLER_RESPONSE_VALIDATION_FAILED',\n operation: 'parseResponse',\n message: `Response validation failed`,\n logger: this.logger,\n statusCode: httpResponse.status,\n metadata: {\n method: this.options.method,\n url,\n issues: result.issues,\n },\n })\n this.telemetry?.emit(\n 'igniter.caller.validation.response.error',\n {\n level: 'error',\n attributes: {\n 'ctx.request.method': method,\n 'ctx.request.url': safeUrl,\n 'ctx.validation.type': 'response',\n 'ctx.validation.error': err.message,\n 'ctx.response.status': httpResponse.status,\n },\n },\n )\n this.logger?.error('IgniterCaller.response.validation failed', {\n method,\n url: safeUrl,\n status: httpResponse.status,\n error: err,\n })\n return {\n data: undefined,\n error: err,\n status: httpResponse.status,\n headers: httpResponse.headers,\n }\n }\n data = result.value\n } catch (error) {\n const err = new IgniterCallerError({\n code: 'IGNITER_CALLER_RESPONSE_VALIDATION_FAILED',\n operation: 'parseResponse',\n message: (error as Error)?.message || 'Response validation failed',\n logger: this.logger,\n statusCode: httpResponse.status,\n metadata: {\n method: this.options.method,\n url,\n },\n cause: error instanceof Error ? error : undefined,\n })\n this.telemetry?.emit(\n 'igniter.caller.validation.response.error',\n {\n level: 'error',\n attributes: {\n 'ctx.request.method': method,\n 'ctx.request.url': safeUrl,\n 'ctx.validation.type': 'response',\n 'ctx.validation.error': err.message,\n 'ctx.response.status': httpResponse.status,\n },\n },\n )\n this.logger?.error('IgniterCaller.response.validation failed', {\n method,\n url: safeUrl,\n status: httpResponse.status,\n error: err,\n })\n return {\n data: undefined,\n error: err,\n status: httpResponse.status,\n headers: httpResponse.headers,\n }\n }\n }\n }\n }\n\n let response: IgniterCallerApiResponse<TResponse> = {\n data: data as TResponse,\n error: undefined,\n status: httpResponse.status,\n headers: httpResponse.headers,\n }\n\n // Apply response interceptors\n if (this.responseInterceptors && this.responseInterceptors.length > 0) {\n for (const interceptor of this.responseInterceptors) {\n response = await interceptor(response)\n }\n }\n\n return response\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof Error && error.name === 'AbortError') {\n const err = new IgniterCallerError({\n code: 'IGNITER_CALLER_TIMEOUT',\n operation: 'execute',\n message: `Request timeout after ${this.options.timeout || 30000}ms`,\n statusCode: 408,\n logger: this.logger,\n metadata: {\n method: this.options.method,\n url,\n },\n cause: error instanceof Error ? error : undefined,\n })\n this.telemetry?.emit(\n 'igniter.caller.request.timeout.error',\n {\n level: 'error',\n attributes: {\n 'ctx.request.method': method,\n 'ctx.request.url': safeUrl,\n 'ctx.request.timeoutMs': this.options.timeout || 30000,\n },\n },\n )\n this.logger?.error('IgniterCaller.request.execute timeout', {\n method,\n url: safeUrl,\n timeoutMs: this.options.timeout || 30000,\n error: err,\n })\n return {\n data: undefined,\n error: err,\n }\n }\n\n return {\n data: undefined,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_UNKNOWN_ERROR',\n operation: 'execute',\n message:\n (error as Error)?.message ||\n 'Unknown error occurred during request',\n statusCode: 500,\n logger: this.logger,\n metadata: {\n method: this.options.method,\n url,\n },\n cause: error instanceof Error ? error : undefined,\n }),\n }\n }\n }\n\n private resolveUrl(): { url: string; safeUrl: string } {\n const { method, url, body, params, baseURL } = this.options\n\n // For GET/HEAD requests, convert body to query params\n let finalParams = params\n if ((method === 'GET' || method === 'HEAD') && body && typeof body === 'object') {\n const bodyParams: Record<string, string | number | boolean> = {}\n for (const [key, value] of Object.entries(body as Record<string, unknown>)) {\n if (value !== undefined && value !== null) {\n bodyParams[key] = String(value)\n }\n }\n finalParams = { ...bodyParams, ...params }\n }\n\n const fullUrl = IgniterCallerUrlUtils.buildUrl({\n url,\n baseURL,\n query: finalParams,\n })\n\n return {\n url: fullUrl,\n safeUrl: fullUrl.split('?')[0],\n }\n }\n\n private buildRequest() {\n const { method, body, headers, timeout, cache } = this.options\n const { url } = this.resolveUrl()\n\n // Only include body for non-GET/HEAD methods\n const shouldIncludeBody = body && method !== 'GET' && method !== 'HEAD'\n const rawBody = shouldIncludeBody && IgniterCallerBodyUtils.isRawBody(body)\n const finalHeaders = IgniterCallerBodyUtils.normalizeHeadersForBody(\n headers,\n shouldIncludeBody ? body : undefined,\n )\n\n const requestInit: RequestInit = {\n method,\n headers: finalHeaders,\n cache,\n ...(shouldIncludeBody\n ? { body: rawBody ? (body as any) : JSON.stringify(body) }\n : {}),\n }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout || 30000)\n\n return {\n url,\n requestInit,\n controller,\n timeoutId,\n }\n }\n\n /**\n * Emits event for this response using injected emitter.\n */\n private async emitEvent(\n result: IgniterCallerApiResponse<TResponse>,\n ): Promise<void> {\n if (this.eventEmitter) {\n try {\n await this.eventEmitter(this.options.url, this.options.method, result)\n } catch (error) {\n // Silently fail if event emission fails\n this.logger?.debug('Failed to emit event', { error })\n }\n }\n }\n}\n","import type {\n IgniterCallerEventCallback,\n IgniterCallerUrlPattern,\n} from '../types/events'\n\n/**\n * Event emitter for observing HTTP responses across the application.\n *\n * This allows developers to listen to API responses globally for:\n * - Debugging and logging\n * - Real-time monitoring\n * - Cache invalidation triggers\n * - Analytics and telemetry\n */\nexport class IgniterCallerEvents {\n private listeners = new Map<string, Set<IgniterCallerEventCallback>>()\n private patternListeners = new Map<RegExp, Set<IgniterCallerEventCallback>>()\n\n /**\n * Registers a listener for a specific URL or pattern.\n *\n * @param pattern URL string (exact match) or RegExp pattern\n * @param callback Function to execute when a response matches\n * @returns Cleanup function to remove the listener\n *\n * @example\n * ```ts\n * // Listen to specific endpoint\n * const cleanup = api.on('/users', (result) => {\n * console.log('Users fetched:', result.data)\n * })\n *\n * // Listen to pattern\n * api.on(/^\\/users\\/\\d+$/, (result) => {\n * console.log('User detail fetched')\n * })\n *\n * // Cleanup when done\n * cleanup()\n * ```\n */\n on(pattern: IgniterCallerUrlPattern, callback: IgniterCallerEventCallback): () => void {\n if (typeof pattern === 'string') {\n if (!this.listeners.has(pattern)) {\n this.listeners.set(pattern, new Set())\n }\n const callbacks = this.listeners.get(pattern)\n if (callbacks) {\n callbacks.add(callback)\n }\n\n // Return cleanup function\n return () => {\n const callbacks = this.listeners.get(pattern)\n if (callbacks) {\n callbacks.delete(callback)\n if (callbacks.size === 0) {\n this.listeners.delete(pattern)\n }\n }\n }\n }\n\n // RegExp pattern\n if (!this.patternListeners.has(pattern)) {\n this.patternListeners.set(pattern, new Set())\n }\n const callbacks = this.patternListeners.get(pattern)\n if (callbacks) {\n callbacks.add(callback)\n }\n\n return () => {\n const callbacks = this.patternListeners.get(pattern)\n if (callbacks) {\n callbacks.delete(callback)\n if (callbacks.size === 0) {\n this.patternListeners.delete(pattern)\n }\n }\n }\n }\n\n /**\n * Removes a specific listener or all listeners for a pattern.\n *\n * @param pattern - URL string or RegExp pattern.\n * @param callback - Optional specific callback to remove.\n */\n off(pattern: IgniterCallerUrlPattern, callback?: IgniterCallerEventCallback): void {\n if (typeof pattern === 'string') {\n if (callback !== undefined) {\n this.listeners.get(pattern)?.delete(callback)\n } else {\n this.listeners.delete(pattern)\n }\n } else {\n if (callback !== undefined) {\n this.patternListeners.get(pattern)?.delete(callback)\n } else {\n this.patternListeners.delete(pattern)\n }\n }\n }\n\n /**\n * Emits an event to all matching listeners.\n *\n * @internal\n *\n * @param url - Request URL to match listeners against.\n * @param method - HTTP method.\n * @param result - Response envelope.\n */\n async emit(url: string, method: string, result: any): Promise<void> {\n const context = {\n url,\n method,\n timestamp: Date.now(),\n }\n\n // Exact match listeners\n const exactListeners = this.listeners.get(url)\n if (exactListeners) {\n for (const callback of exactListeners) {\n try {\n await callback(result, context)\n } catch (error) {\n console.error('Error in IgniterCaller event listener:', error)\n }\n }\n }\n\n // Pattern match listeners\n for (const [pattern, callbacks] of this.patternListeners.entries()) {\n if (pattern.test(url)) {\n for (const callback of callbacks) {\n try {\n await callback(result, context)\n } catch (error) {\n console.error('Error in IgniterCaller event listener:', error)\n }\n }\n }\n }\n }\n\n /**\n * Removes all listeners.\n *\n * @returns Nothing.\n */\n clear(): void {\n this.listeners.clear()\n this.patternListeners.clear()\n }\n}\n","import type { IgniterLogger } from '@igniter-js/core'\nimport type { IgniterTelemetryManager } from '@igniter-js/telemetry'\nimport type { IgniterCallerTelemetryEvents } from '../telemetry'\nimport { IgniterCallerRequestBuilder } from '../builders/request.builder'\nimport type {\n IgniterCallerRequestBuilderParams,\n IgniterCallerTypedRequestBuilder,\n} from '../types/builder'\nimport type {\n IgniterCallerEventCallback,\n IgniterCallerUrlPattern,\n} from '../types/events'\nimport type { IIgniterCallerManager } from '../types/manager'\nimport type {\n IgniterCallerRequestInterceptor,\n IgniterCallerResponseInterceptor,\n} from '../types/interceptors'\nimport type { IgniterCallerDirectRequestOptions } from '../types/request'\nimport type { IgniterCallerApiResponse } from '../types/response'\nimport type {\n DeletePaths,\n GetPaths,\n HeadPaths,\n IgniterCallerSchemaMap,\n IgniterCallerSchemaValidationOptions,\n PatchPaths,\n PostPaths,\n PutPaths,\n} from '../types/schemas'\nimport type { InferResponse, TypedRequestBuilder } from '../types/infer'\nimport { IgniterCallerCacheUtils } from '../utils/cache'\nimport { IgniterCallerEvents } from './events'\n\n/**\n * HTTP client runtime for Igniter.js.\n *\n * This module is intentionally structured to be extracted into a standalone package\n * in the Igniter.js ecosystem as `@igniter-js/caller`.\n *\n * @template TSchemas - The schema map type for type-safe requests/responses.\n */\nexport class IgniterCallerManager<\n TSchemas extends IgniterCallerSchemaMap,\n> implements IIgniterCallerManager<TSchemas> {\n /** Global event emitter for observing HTTP responses */\n private static readonly events = new IgniterCallerEvents()\n\n private baseURL?: string\n private headers?: Record<string, string>\n private cookies?: Record<string, string>\n private logger?: IgniterLogger\n private telemetry?: IgniterTelemetryManager<IgniterCallerTelemetryEvents>\n private requestInterceptors?: IgniterCallerRequestInterceptor[]\n private responseInterceptors?: IgniterCallerResponseInterceptor[]\n private schemas?: TSchemas\n private schemaValidation?: IgniterCallerSchemaValidationOptions\n\n /**\n * Creates a new manager instance.\n *\n * @param baseURL - Base URL prefix for requests.\n * @param opts - Optional configuration (headers, cookies, telemetry, schemas).\n */\n constructor(\n baseURL?: string,\n opts?: {\n headers?: Record<string, string>\n cookies?: Record<string, string>\n logger?: IgniterLogger\n telemetry?: IgniterTelemetryManager<any>\n requestInterceptors?: IgniterCallerRequestInterceptor[]\n responseInterceptors?: IgniterCallerResponseInterceptor[]\n schemas?: TSchemas\n schemaValidation?: IgniterCallerSchemaValidationOptions\n },\n ) {\n this.baseURL = baseURL\n this.headers = opts?.headers\n this.cookies = opts?.cookies\n this.logger = opts?.logger\n this.telemetry = opts?.telemetry\n this.requestInterceptors = opts?.requestInterceptors\n this.responseInterceptors = opts?.responseInterceptors\n this.schemas = opts?.schemas\n this.schemaValidation = opts?.schemaValidation\n }\n\n /**\n * Creates common request builder params.\n */\n private createBuilderParams(): IgniterCallerRequestBuilderParams {\n return {\n baseURL: this.baseURL,\n defaultHeaders: this.headers,\n defaultCookies: this.cookies,\n logger: this.logger,\n telemetry: this.telemetry,\n requestInterceptors: this.requestInterceptors,\n responseInterceptors: this.responseInterceptors,\n eventEmitter: async (url, method, result) => {\n await IgniterCallerManager.emitEvent(url, method, result)\n },\n schemas: this.schemas,\n schemaValidation: this.schemaValidation,\n }\n }\n\n /**\n * Creates a GET request.\n *\n * When a URL is provided and matches a schema, the response, body, and params types\n * are automatically inferred from the schema definition.\n *\n * @param url Optional URL for the request. When provided and matching a schema path,\n * enables full type inference for response, body, and path params.\n *\n * @example\n * ```ts\n * // With typed schema - full type inference\n * const result = await api.get('/users/:id')\n * .params({ id: '123' }) // params are typed based on URL pattern\n * .execute()\n * // result.data is typed based on schema\n *\n * // Without URL (set later with .url())\n * const result = await api.get().url('/users').execute()\n * ```\n */\n get<TPath extends GetPaths<TSchemas>>(url: TPath): TypedRequestBuilder<TSchemas, TPath, 'GET'>\n get<TPath extends string>(url?: TPath): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'GET'>>\n get<TPath extends string>(url?: TPath): any {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('GET')\n if (url) builder._setUrl(url)\n return builder\n }\n\n /**\n * Creates a POST request.\n *\n * When a URL is provided and matches a schema, the response, body, and params types\n * are automatically inferred from the schema definition.\n *\n * @param url Optional URL for the request.\n *\n * @example\n * ```ts\n * // With typed schema - body type is inferred from schema\n * const result = await api.post('/users')\n * .body({ name: 'John', email: 'john@example.com' }) // body is typed\n * .execute()\n * ```\n */\n post<TPath extends PostPaths<TSchemas>>(\n url: TPath,\n ): TypedRequestBuilder<TSchemas, TPath, 'POST'>\n post<TPath extends string>(\n url?: TPath,\n ): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'POST'>>\n post<TPath extends string>(url?: TPath): any {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('POST')\n if (url) builder._setUrl(url)\n return builder\n }\n\n /**\n * Creates a PUT request.\n *\n * When a URL is provided and matches a schema, the response, body, and params types\n * are automatically inferred from the schema definition.\n *\n * @param url Optional URL for the request.\n *\n * @example\n * ```ts\n * const result = await api.put('/users/:id')\n * .params({ id: '1' })\n * .body({ name: 'Jane' })\n * .execute()\n * ```\n */\n put<TPath extends PutPaths<TSchemas>>(url: TPath): TypedRequestBuilder<TSchemas, TPath, 'PUT'>\n put<TPath extends string>(url?: TPath): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'PUT'>>\n put<TPath extends string>(url?: TPath): any {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('PUT')\n if (url) builder._setUrl(url)\n return builder\n }\n\n /**\n * Creates a PATCH request.\n *\n * When a URL is provided and matches a schema, the response, body, and params types\n * are automatically inferred from the schema definition.\n *\n * @param url Optional URL for the request.\n *\n * @example\n * ```ts\n * const result = await api.patch('/users/:id')\n * .params({ id: '1' })\n * .body({ name: 'Jane' })\n * .execute()\n * ```\n */\n patch<TPath extends PatchPaths<TSchemas>>(url: TPath): TypedRequestBuilder<TSchemas, TPath, 'PATCH'>\n patch<TPath extends string>(url?: TPath): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'PATCH'>>\n patch<TPath extends string>(url?: TPath): any {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('PATCH')\n if (url) builder._setUrl(url)\n return builder\n }\n\n /**\n * Creates a DELETE request.\n *\n * When a URL is provided and matches a schema, the response, body, and params types\n * are automatically inferred from the schema definition.\n *\n * @param url Optional URL for the request.\n *\n * @example\n * ```ts\n * const result = await api.delete('/users/:id')\n * .params({ id: '1' })\n * .execute()\n * ```\n */\n delete<TPath extends DeletePaths<TSchemas>>(url: TPath): TypedRequestBuilder<TSchemas, TPath, 'DELETE'>\n delete<TPath extends string>(url?: TPath): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'DELETE'>>\n delete<TPath extends string>(url?: TPath): any {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('DELETE')\n if (url) builder._setUrl(url)\n return builder\n }\n\n /**\n * Creates a HEAD request.\n *\n * When a URL is provided and matches a schema, the response, body, and params types\n * are automatically inferred from the schema definition.\n *\n * @param url Optional URL for the request.\n */\n head<TPath extends HeadPaths<TSchemas>>(url: TPath): TypedRequestBuilder<TSchemas, TPath, 'HEAD'>\n head<TPath extends string>(url?: TPath): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'HEAD'>>\n head<TPath extends string>(url?: TPath): any {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('HEAD')\n if (url) builder._setUrl(url)\n return builder\n }\n\n /**\n * Executes a request directly with all options in one object (axios-style).\n *\n * This is a convenience method for making requests without using the builder pattern.\n * Useful for dynamic requests where options are constructed programmatically.\n *\n * @param options - Request configuration for method, url, and behavior.\n * @returns Response envelope with data or error.\n *\n * @example\n * ```ts\n * const result = await api.request({\n * method: 'POST',\n * url: '/users',\n * body: { name: 'John' },\n * headers: { 'X-Custom': 'value' },\n * timeout: 5000,\n * })\n *\n * // With caching\n * const result = await api.request({\n * method: 'GET',\n * url: '/users',\n * staleTime: 30000,\n * })\n *\n * // With retry\n * const result = await api.request({\n * method: 'GET',\n * url: '/health',\n * retry: { maxAttempts: 3, backoff: 'exponential' },\n * })\n * ```\n */\n async request<T = unknown>(\n options: IgniterCallerDirectRequestOptions,\n ): Promise<IgniterCallerApiResponse<T>> {\n const builder = new IgniterCallerRequestBuilder<T>({\n ...this.createBuilderParams(),\n // Override with request-specific options\n defaultHeaders: {\n ...this.headers,\n ...options.headers,\n },\n })\n\n // Set method and URL\n builder._setMethod(options.method)\n builder._setUrl(options.url)\n\n // Set body if provided\n if (options.body !== undefined) {\n builder.body(options.body)\n }\n\n // Set params if provided\n if (options.params) {\n builder.params(options.params)\n }\n\n // Set timeout if provided\n if (options.timeout) {\n builder.timeout(options.timeout)\n }\n\n // Set cache options\n if (options.cache) {\n builder.cache(options.cache, options.cacheKey)\n }\n\n // Set stale time\n if (options.staleTime) {\n builder.stale(options.staleTime)\n }\n\n // Set retry options\n if (options.retry) {\n builder.retry(options.retry.maxAttempts, options.retry)\n }\n\n // Set fallback\n if (options.fallback) {\n builder.fallback(options.fallback)\n }\n\n // Set response schema\n if (options.responseSchema) {\n builder.responseType(options.responseSchema)\n }\n\n return builder.execute()\n }\n\n /**\n * Executes multiple requests in parallel and returns results as an array.\n *\n * This is useful for batching independent API calls.\n *\n * @param requests - Array of request promises.\n * @returns Array of resolved results in the same order.\n */\n static async batch<\n T extends readonly Promise<IgniterCallerApiResponse<any>>[],\n >(\n requests: [...T],\n ): Promise<{\n [K in keyof T]: T[K] extends Promise<infer R> ? R : never\n }> {\n return Promise.all(requests) as any\n }\n\n /**\n * Registers a global event listener for HTTP responses.\n *\n * This allows observing API responses across the application for:\n * - Debugging and logging\n * - Real-time monitoring\n * - Cache invalidation triggers\n * - Analytics and telemetry\n *\n * @param pattern URL string (exact match) or RegExp pattern\n * @param callback Function to execute when a response matches\n * @returns Cleanup function to remove the listener\n *\n * @example\n * ```ts\n * // Listen to all user endpoints\n * const cleanup = IgniterCallerManager.on(/^\\/users/, (result, context) => {\n * console.log(`${context.method} ${context.url}`, result)\n * })\n *\n * // Cleanup when done\n * cleanup()\n * ```\n */\n static on(\n pattern: IgniterCallerUrlPattern,\n callback: IgniterCallerEventCallback,\n ): () => void {\n return IgniterCallerManager.events.on(pattern, callback)\n }\n\n /**\n * Removes event listeners for a pattern.\n *\n * @param pattern - URL string or RegExp pattern.\n * @param callback - Callback to remove (optional).\n */\n static off(\n pattern: IgniterCallerUrlPattern,\n callback?: IgniterCallerEventCallback,\n ): void {\n IgniterCallerManager.events.off(pattern, callback)\n }\n\n /**\n * Invalidates a specific cache entry.\n *\n * This is useful after mutations to ensure fresh data on next fetch.\n *\n * @param key - Cache key to invalidate.\n *\n * @example\n * ```ts\n * // After creating a user\n * await api.post('/users').body(newUser).execute()\n * await IgniterCallerManager.invalidate('/users') // Clear users list cache\n * ```\n */\n static async invalidate(key: string): Promise<void> {\n await IgniterCallerCacheUtils.clear(key)\n }\n\n /**\n * Invalidates all cache entries matching a pattern.\n *\n * @param pattern Glob pattern (e.g., '/users/*') or exact key\n * @returns Promise that resolves when invalidation completes.\n *\n * @example\n * ```ts\n * // Invalidate all user-related caches\n * await IgniterCallerManager.invalidatePattern('/users/*')\n * ```\n */\n static async invalidatePattern(pattern: string): Promise<void> {\n await IgniterCallerCacheUtils.clearPattern(pattern)\n }\n\n /**\n * Emits an event to all registered listeners.\n *\n * @internal\n *\n * @param url - Request URL (resolved).\n * @param method - HTTP method.\n * @param result - Response envelope.\n */\n static async emitEvent(\n url: string,\n method: string,\n result: IgniterCallerApiResponse<any>,\n ): Promise<void> {\n await IgniterCallerManager.events.emit(url, method, result)\n }\n}\n","import type { IgniterLogger } from '@igniter-js/core'\nimport type { IgniterTelemetryManager } from '@igniter-js/telemetry'\nimport type { IgniterCallerBuilderState } from '../types/builder'\nimport type {\n IgniterCallerRequestInterceptor,\n IgniterCallerResponseInterceptor,\n} from '../types/interceptors'\nimport type {\n IgniterCallerSchemaMap,\n IgniterCallerSchemaValidationOptions,\n} from '../types/schemas'\nimport type {\n IgniterCallerSchemaInput,\n IgniterCallerSchemaMapFrom,\n} from '../types/schema-builder'\nimport type {\n IgniterCallerStoreAdapter,\n IgniterCallerStoreOptions,\n} from '../types/store'\nimport { IgniterCallerCacheUtils } from '../utils/cache'\nimport { IgniterCallerManager } from '../core/manager'\n\n/**\n * Builder used by developers to initialize the `IgniterCaller` client.\n *\n * This API is designed to remain stable when extracted to `@igniter-js/caller`.\n */\nexport class IgniterCallerBuilder<\n TSchemas extends IgniterCallerSchemaMap = IgniterCallerSchemaMap,\n> {\n private readonly state: IgniterCallerBuilderState<TSchemas>;\n\n private constructor(state: IgniterCallerBuilderState<TSchemas>) {\n this.state = state;\n }\n\n /**\n * Creates a new builder instance.\n *\n * @returns New builder instance with empty state.\n */\n static create(): IgniterCallerBuilder<{}> {\n return new IgniterCallerBuilder<{}>({});\n }\n\n /**\n * Sets the base URL for all requests.\n *\n * @param baseURL - Base URL prefix for outgoing requests.\n */\n withBaseUrl(baseURL: string): IgniterCallerBuilder<TSchemas> {\n return new IgniterCallerBuilder({ ...this.state, baseURL });\n }\n\n /**\n * Merges default headers for all requests.\n *\n * @param headers - Header map merged into every request.\n */\n withHeaders(headers: Record<string, string>): IgniterCallerBuilder<TSchemas> {\n return new IgniterCallerBuilder({ ...this.state, headers });\n }\n\n /**\n * Sets default cookies (sent as the `Cookie` header).\n *\n * @param cookies - Cookie key/value pairs.\n */\n withCookies(cookies: Record<string, string>): IgniterCallerBuilder<TSchemas> {\n return new IgniterCallerBuilder({ ...this.state, cookies });\n }\n\n /**\n * Attaches a logger instance.\n *\n * @param logger - Logger implementation from `@igniter-js/core`.\n */\n withLogger(logger: IgniterLogger): IgniterCallerBuilder<TSchemas> {\n return new IgniterCallerBuilder({ ...this.state, logger });\n }\n\n /**\n * Adds a request interceptor that runs before each request.\n *\n * @param interceptor - Interceptor called with request options.\n */\n withRequestInterceptor(\n interceptor: IgniterCallerRequestInterceptor,\n ): IgniterCallerBuilder<TSchemas> {\n const requestInterceptors = [\n ...(this.state.requestInterceptors || []),\n interceptor,\n ];\n return new IgniterCallerBuilder({ ...this.state, requestInterceptors });\n }\n\n /**\n * Adds a response interceptor that runs after each request.\n *\n * @param interceptor - Interceptor called with the response result.\n */\n withResponseInterceptor(\n interceptor: IgniterCallerResponseInterceptor,\n ): IgniterCallerBuilder<TSchemas> {\n const responseInterceptors = [\n ...(this.state.responseInterceptors || []),\n interceptor,\n ];\n return new IgniterCallerBuilder({ ...this.state, responseInterceptors });\n }\n\n /**\n * Configures a persistent store adapter for caching.\n *\n * When configured, cache operations will use the store (e.g., Redis)\n * instead of in-memory cache, enabling persistent cache across deployments.\n *\n * @param store - Store adapter implementation.\n * @param options - Store options (ttl, keyPrefix, fallback).\n */\n withStore(\n store: IgniterCallerStoreAdapter,\n options?: IgniterCallerStoreOptions,\n ): IgniterCallerBuilder<TSchemas> {\n return new IgniterCallerBuilder({\n ...this.state,\n store,\n storeOptions: options,\n })\n }\n\n /**\n * Configures schema-based type safety and validation.\n *\n * Enables automatic type inference for requests/responses based on\n * route and method, with optional runtime validation via StandardSchemaV1\n * (Zod is supported).\n *\n * @param schemas - Schema map keyed by URL path and method.\n * @param validation - Validation options for request/response checks.\n *\n * @example\n * ```ts\n * const api = IgniterCaller.create()\n * .withSchemas({\n * '/users': {\n * GET: {\n * responses: {\n * 200: z.array(UserSchema),\n * 401: ErrorSchema,\n * },\n * },\n * POST: {\n * request: CreateUserSchema,\n * responses: {\n * 201: UserSchema,\n * 400: ValidationErrorSchema,\n * },\n * },\n * },\n * })\n * .build()\n * ```\n */\n withSchemas<TNewSchemas extends IgniterCallerSchemaInput>(\n schemas: TNewSchemas,\n validation?: IgniterCallerSchemaValidationOptions,\n ): IgniterCallerBuilder<IgniterCallerSchemaMapFrom<TNewSchemas>> {\n const nextState = {\n ...this.state,\n schemas: schemas as IgniterCallerSchemaMapFrom<TNewSchemas>,\n schemaValidation: validation,\n } as unknown as IgniterCallerBuilderState<IgniterCallerSchemaMapFrom<TNewSchemas>>;\n\n return new IgniterCallerBuilder<IgniterCallerSchemaMapFrom<TNewSchemas>>(nextState);\n }\n\n /**\n * Attaches telemetry for request monitoring and observability.\n *\n * Telemetry is optional and only emits events when a manager is provided.\n *\n * Telemetry events emitted by the caller package include:\n * - `request.execute.started`\n * - `request.execute.success`\n * - `request.execute.error`\n * - `request.timeout.error`\n * - `cache.read.hit`\n * - `retry.attempt.started`\n * - `validation.request.error`\n * - `validation.response.error`\n *\n * @param telemetry - Telemetry manager instance.\n *\n * @example\n * ```ts\n * import { IgniterTelemetry } from '@igniter-js/telemetry'\n * import { IgniterCallerTelemetryEvents } from '@igniter-js/caller/telemetry'\n *\n * const telemetry = IgniterTelemetry.create()\n * .withService('my-api')\n * .addEvents(IgniterCallerTelemetryEvents)\n * .build()\n *\n * const api = IgniterCaller.create()\n * .withBaseUrl('https://api.example.com')\n * .withTelemetry(telemetry)\n * .build()\n * ```\n */\n withTelemetry(\n telemetry: IgniterTelemetryManager<any>,\n ): IgniterCallerBuilder<TSchemas> {\n return new IgniterCallerBuilder({ ...this.state, telemetry });\n }\n\n /**\n * Builds the `IgniterCaller` instance.\n *\n * @returns Configured manager instance.\n */\n build(): IgniterCallerManager<TSchemas> {\n if (this.state.store) {\n IgniterCallerCacheUtils.setStore(this.state.store, this.state.storeOptions);\n }\n\n const manager = new IgniterCallerManager<TSchemas>(this.state.baseURL, {\n headers: this.state.headers,\n cookies: this.state.cookies,\n logger: this.state.logger,\n telemetry: this.state.telemetry,\n requestInterceptors: this.state.requestInterceptors,\n responseInterceptors: this.state.responseInterceptors,\n schemas: this.state.schemas,\n schemaValidation: this.state.schemaValidation,\n });\n\n this.state.logger?.info('IgniterCaller initialized', {\n baseURL: this.state.baseURL,\n hasTelemetry: Boolean(this.state.telemetry),\n hasStore: Boolean(this.state.store),\n hasSchemas: Boolean(this.state.schemas),\n });\n\n return manager;\n }\n}\n\n/**\n * Main entrypoint for the caller builder.\n *\n * @example\n * ```ts\n * const api = IgniterCaller.create().withBaseUrl('https://api.example.com').build()\n * ```\n */\nexport const IgniterCaller = {\n create: IgniterCallerBuilder.create,\n};\n","/**\n * @fileoverview Path-first schema builder for @igniter-js/caller.\n * @module @igniter-js/caller/builders/schema-path\n */\n\nimport { z } from 'zod'\nimport { IgniterCallerError } from '../errors/caller.error'\nimport type { StandardSchemaV1 } from '@igniter-js/core'\nimport type {\n IgniterCallerEndpointSchema,\n IgniterCallerSchemaMethod,\n} from '../types/schemas'\nimport type {\n IgniterCallerSchemaEndpointConfig,\n IgniterCallerSchemaRegistry,\n SchemaArray,\n SchemaNullable,\n SchemaOptional,\n SchemaRecord,\n} from '../types/schema-builder'\n\n/**\n * Builder for schema methods within a single path.\n */\nexport class IgniterCallerSchemaPathBuilder<\n TMethods extends Partial<\n Record<IgniterCallerSchemaMethod, IgniterCallerEndpointSchema<any, any>>\n > = {},\n TRegistry extends IgniterCallerSchemaRegistry = {},\n> {\n private readonly methods: TMethods\n private readonly registry: TRegistry\n\n private constructor(methods: TMethods, registry: TRegistry) {\n this.methods = methods\n this.registry = registry\n }\n\n /**\n * Creates a new path builder for the provided registry.\n */\n static create<TRegistry extends IgniterCallerSchemaRegistry>(\n registry: TRegistry,\n ): IgniterCallerSchemaPathBuilder<{}, TRegistry> {\n return new IgniterCallerSchemaPathBuilder({}, registry)\n }\n\n /**\n * Returns a registry reference helper for a given key.\n * The helper exposes optional Zod-based wrappers (array/optional/nullable/record).\n */\n ref<TKey extends keyof TRegistry>(key: TKey): {\n schema: TRegistry[TKey]\n array: () => SchemaArray<TRegistry[TKey]>\n nullable: () => SchemaNullable<TRegistry[TKey]>\n optional: () => SchemaOptional<TRegistry[TKey]>\n record: (keyType?: StandardSchemaV1) => SchemaRecord<TRegistry[TKey]>\n } {\n const schema = this.registry[key]\n const zodSchema = schema as unknown as z.ZodTypeAny\n\n return {\n schema,\n array: () => z.array(zodSchema) as unknown as SchemaArray<TRegistry[TKey]>,\n nullable: () =>\n zodSchema.nullable() as unknown as SchemaNullable<TRegistry[TKey]>,\n optional: () =>\n zodSchema.optional() as unknown as SchemaOptional<TRegistry[TKey]>,\n record: (keyType?: StandardSchemaV1) =>\n z.record(\n z.any(),\n zodSchema,\n ) as unknown as SchemaRecord<TRegistry[TKey]>,\n }\n }\n\n /**\n * Defines a GET endpoint.\n */\n get<TRequest extends StandardSchemaV1 | undefined, TResponses extends Record<number | string, StandardSchemaV1>>(\n config: IgniterCallerSchemaEndpointConfig<TRequest, TResponses>,\n ): IgniterCallerSchemaPathBuilder<\n TMethods & { GET: IgniterCallerEndpointSchema<TRequest, TResponses> },\n TRegistry\n > {\n return this.addMethod('GET', config)\n }\n\n /**\n * Defines a POST endpoint.\n */\n post<TRequest extends StandardSchemaV1 | undefined, TResponses extends Record<number | string, StandardSchemaV1>>(\n config: IgniterCallerSchemaEndpointConfig<TRequest, TResponses>,\n ): IgniterCallerSchemaPathBuilder<\n TMethods & { POST: IgniterCallerEndpointSchema<TRequest, TResponses> },\n TRegistry\n > {\n return this.addMethod('POST', config)\n }\n\n /**\n * Defines a PUT endpoint.\n */\n put<TRequest extends StandardSchemaV1 | undefined, TResponses extends Record<number | string, StandardSchemaV1>>(\n config: IgniterCallerSchemaEndpointConfig<TRequest, TResponses>,\n ): IgniterCallerSchemaPathBuilder<\n TMethods & { PUT: IgniterCallerEndpointSchema<TRequest, TResponses> },\n TRegistry\n > {\n return this.addMethod('PUT', config)\n }\n\n /**\n * Defines a PATCH endpoint.\n */\n patch<TRequest extends StandardSchemaV1 | undefined, TResponses extends Record<number | string, StandardSchemaV1>>(\n config: IgniterCallerSchemaEndpointConfig<TRequest, TResponses>,\n ): IgniterCallerSchemaPathBuilder<\n TMethods & { PATCH: IgniterCallerEndpointSchema<TRequest, TResponses> },\n TRegistry\n > {\n return this.addMethod('PATCH', config)\n }\n\n /**\n * Defines a DELETE endpoint.\n */\n delete<TRequest extends StandardSchemaV1 | undefined, TResponses extends Record<number | string, StandardSchemaV1>>(\n config: IgniterCallerSchemaEndpointConfig<TRequest, TResponses>,\n ): IgniterCallerSchemaPathBuilder<\n TMethods & { DELETE: IgniterCallerEndpointSchema<TRequest, TResponses> },\n TRegistry\n > {\n return this.addMethod('DELETE', config)\n }\n\n /**\n * Defines a HEAD endpoint.\n */\n head<TRequest extends StandardSchemaV1 | undefined, TResponses extends Record<number | string, StandardSchemaV1>>(\n config: IgniterCallerSchemaEndpointConfig<TRequest, TResponses>,\n ): IgniterCallerSchemaPathBuilder<\n TMethods & { HEAD: IgniterCallerEndpointSchema<TRequest, TResponses> },\n TRegistry\n > {\n return this.addMethod('HEAD', config)\n }\n\n /**\n * Builds the accumulated method map for the path.\n */\n build(): TMethods {\n return this.methods\n }\n\n private addMethod<\n TMethod extends IgniterCallerSchemaMethod,\n TRequest extends StandardSchemaV1 | undefined,\n TResponses extends Record<number | string, StandardSchemaV1>,\n >(\n method: TMethod,\n config: IgniterCallerSchemaEndpointConfig<TRequest, TResponses>,\n ): IgniterCallerSchemaPathBuilder<\n TMethods & { [K in TMethod]: IgniterCallerEndpointSchema<TRequest, TResponses> },\n TRegistry\n > {\n if (method in this.methods) {\n throw new IgniterCallerError({\n code: 'IGNITER_CALLER_SCHEMA_DUPLICATE',\n operation: 'buildSchema',\n message: `Schema for method \"${method}\" is already defined on this path.`,\n statusCode: 400,\n metadata: { method },\n })\n }\n\n return new IgniterCallerSchemaPathBuilder(\n {\n ...this.methods,\n [method]: {\n ...config,\n },\n } as TMethods & { [K in TMethod]: IgniterCallerEndpointSchema<TRequest, TResponses> },\n this.registry,\n )\n }\n}\n","/**\n * @fileoverview Schema builder for @igniter-js/caller.\n * @module @igniter-js/caller/builders/schema\n */\n\nimport type { StandardSchemaV1 } from '@igniter-js/core'\nimport { IgniterCallerError } from '../errors/caller.error'\nimport type {\n IgniterCallerEndpointSchema,\n IgniterCallerSchemaMap,\n IgniterCallerSchemaMethod,\n} from '../types/schemas'\nimport type {\n IgniterCallerSchemaBuildResult,\n IgniterCallerSchemaGetters,\n IgniterCallerSchemaInfer,\n IgniterCallerSchemaRegistry,\n} from '../types/schema-builder'\nimport { IgniterCallerSchemaPathBuilder } from './schema-path.builder'\n\n/**\n * Path-first builder for caller schemas with registry support.\n */\nexport class IgniterCallerSchema<\n TSchemas extends IgniterCallerSchemaMap = {},\n TRegistry extends IgniterCallerSchemaRegistry = {},\n> {\n private readonly schemas: TSchemas\n private readonly registry: TRegistry\n\n private constructor(schemas: TSchemas, registry: TRegistry) {\n this.schemas = schemas\n this.registry = registry\n }\n\n /**\n * Creates a new empty schema builder.\n */\n static create(): IgniterCallerSchema<{}, {}> {\n return new IgniterCallerSchema({}, {})\n }\n\n /**\n * Registers a reusable schema in the registry.\n */\n schema<TKey extends string, TSchema extends StandardSchemaV1>(\n key: TKey,\n schema: TSchema,\n options?: { internal?: boolean },\n ): IgniterCallerSchema<TSchemas, TRegistry & { [K in TKey]: TSchema }> {\n ensureValidSchemaKey(key)\n\n if (key in this.registry) {\n throw new IgniterCallerError({\n code: 'IGNITER_CALLER_SCHEMA_DUPLICATE',\n operation: 'buildSchema',\n message: `Schema registry key \"${key}\" is already defined.`,\n statusCode: 400,\n metadata: { key },\n })\n }\n\n const nextRegistry = {\n ...this.registry,\n [key]: schema,\n } as TRegistry & { [K in TKey]: TSchema }\n\n void options?.internal\n\n return new IgniterCallerSchema(this.schemas, nextRegistry)\n }\n\n /**\n * Defines a path with its methods using a fluent builder.\n */\n path<\n TPath extends string,\n TMethods extends Partial<\n Record<IgniterCallerSchemaMethod, IgniterCallerEndpointSchema<any, any>>\n >,\n >(\n path: TPath,\n builder: (\n pathBuilder: IgniterCallerSchemaPathBuilder<{}, TRegistry>,\n ) => IgniterCallerSchemaPathBuilder<TMethods, TRegistry>,\n ): IgniterCallerSchema<TSchemas & { [K in TPath]: TMethods }, TRegistry> {\n ensureValidPath(path)\n\n const pathBuilder = IgniterCallerSchemaPathBuilder.create(this.registry)\n const builtMethods = builder(pathBuilder).build()\n\n const existing = (this.schemas as IgniterCallerSchemaMap)[path] ?? {}\n for (const method of Object.keys(\n builtMethods,\n ) as IgniterCallerSchemaMethod[]) {\n if (method in existing) {\n throw new IgniterCallerError({\n code: 'IGNITER_CALLER_SCHEMA_DUPLICATE',\n operation: 'buildSchema',\n message: `Schema for \"${path}\" with method \"${method}\" is already defined.`,\n statusCode: 400,\n metadata: { path, method },\n })\n }\n }\n\n const merged = {\n ...existing,\n ...builtMethods,\n } as TMethods\n\n const nextSchemas = {\n ...(this.schemas as IgniterCallerSchemaMap),\n [path]: merged,\n } as TSchemas & { [K in TPath]: TMethods }\n\n return new IgniterCallerSchema(nextSchemas, this.registry)\n }\n\n /**\n * Builds the schema map and attaches inference + runtime helpers.\n */\n build(): IgniterCallerSchemaBuildResult<TSchemas, TRegistry> {\n const result = {\n ...(this.schemas as IgniterCallerSchemaMap),\n } as IgniterCallerSchemaBuildResult<TSchemas, TRegistry>\n\n const inferHelpers = createInferHelpers<TSchemas, TRegistry>()\n const getHelpers = createGetHelpers(this.schemas, this.registry)\n\n Object.defineProperty(result, '$Infer', {\n value: inferHelpers,\n enumerable: false,\n })\n\n Object.defineProperty(result, 'get', {\n value: getHelpers,\n enumerable: false,\n })\n\n return result\n }\n}\n\nfunction createInferHelpers<\n TSchemas extends IgniterCallerSchemaMap,\n TRegistry extends IgniterCallerSchemaRegistry,\n>(): IgniterCallerSchemaInfer<TSchemas, TRegistry> {\n return {\n Path: undefined as unknown as IgniterCallerSchemaInfer<TSchemas, TRegistry>['Path'],\n Endpoint: (() => undefined) as unknown as IgniterCallerSchemaInfer<\n TSchemas,\n TRegistry\n >['Endpoint'],\n Request: (() => undefined) as unknown as IgniterCallerSchemaInfer<\n TSchemas,\n TRegistry\n >['Request'],\n Response: (() => undefined) as unknown as IgniterCallerSchemaInfer<\n TSchemas,\n TRegistry\n >['Response'],\n Responses: (() => undefined) as unknown as IgniterCallerSchemaInfer<\n TSchemas,\n TRegistry\n >['Responses'],\n Schema: (() => undefined) as unknown as IgniterCallerSchemaInfer<\n TSchemas,\n TRegistry\n >['Schema'],\n }\n}\n\nfunction createGetHelpers<\n TSchemas extends IgniterCallerSchemaMap,\n TRegistry extends IgniterCallerSchemaRegistry,\n>(schemas: TSchemas, registry: TRegistry): IgniterCallerSchemaGetters<TSchemas, TRegistry> {\n return {\n path: (path) => schemas[path],\n endpoint: (path, method) => schemas[path][method],\n request: (path, method) => schemas[path][method]?.request,\n response: (path, method, status) => schemas[path][method]?.responses?.[status],\n schema: (key) => registry[key],\n }\n}\n\nfunction ensureValidPath(path: string): void {\n if (!path || path.trim().length === 0) {\n throw new IgniterCallerError({\n code: 'IGNITER_CALLER_SCHEMA_INVALID',\n operation: 'buildSchema',\n message: 'Path cannot be empty.',\n statusCode: 400,\n })\n }\n\n if (!path.startsWith('/')) {\n throw new IgniterCallerError({\n code: 'IGNITER_CALLER_SCHEMA_INVALID',\n operation: 'buildSchema',\n message: `Path \"${path}\" must start with \"/\".`,\n statusCode: 400,\n metadata: { path },\n })\n }\n}\n\nfunction ensureValidSchemaKey(key: string): void {\n if (!key || key.trim().length === 0) {\n throw new IgniterCallerError({\n code: 'IGNITER_CALLER_SCHEMA_INVALID',\n operation: 'buildSchema',\n message: 'Schema registry key cannot be empty.',\n statusCode: 400,\n })\n }\n}\n","/**\n * @fileoverview In-memory mock store adapter for @igniter-js/caller.\n * @module @igniter-js/caller/adapters/mock\n */\n\nimport type { IgniterCallerStoreAdapter, IgniterCallerStoreOptions } from \"../types/store\";\n\n/**\n * In-memory mock adapter for request caching in tests.\n */\nexport class MockCallerStoreAdapter\n implements IgniterCallerStoreAdapter<Map<string, unknown>>\n{\n /** Creates a new mock adapter instance. */\n static create(): MockCallerStoreAdapter {\n return new MockCallerStoreAdapter();\n }\n\n /** Underlying in-memory store. */\n readonly client = new Map<string, unknown>();\n\n /** Tracks all calls for assertions. */\n readonly calls = {\n get: 0,\n set: 0,\n delete: 0,\n has: 0,\n };\n\n /** Captures recent operations. */\n readonly history = {\n get: [] as string[],\n set: [] as Array<{ key: string; value: unknown; options?: IgniterCallerStoreOptions }>,\n delete: [] as string[],\n has: [] as string[],\n };\n\n /**\n * Retrieves a cached value by key.\n *\n * @param key - Cache key (without prefix).\n * @returns Cached value or null.\n */\n async get<T = any>(key: string): Promise<T | null> {\n this.calls.get += 1;\n this.history.get.push(key);\n return (this.client.has(key) ? (this.client.get(key) as T) : null);\n }\n\n /**\n * Stores a cached value.\n *\n * @param key - Cache key (without prefix).\n * @param value - Value to store.\n * @param options - Cache options (ttl, etc).\n */\n async set(\n key: string,\n value: any,\n options?: IgniterCallerStoreOptions,\n ): Promise<void> {\n this.calls.set += 1;\n this.history.set.push({ key, value, options });\n this.client.set(key, value);\n }\n\n /**\n * Removes a cached value.\n *\n * @param key - Cache key (without prefix).\n */\n async delete(key: string): Promise<void> {\n this.calls.delete += 1;\n this.history.delete.push(key);\n this.client.delete(key);\n }\n\n /**\n * Checks if a cached value exists.\n *\n * @param key - Cache key (without prefix).\n * @returns True when the key exists.\n */\n async has(key: string): Promise<boolean> {\n this.calls.has += 1;\n this.history.has.push(key);\n return this.client.has(key);\n }\n\n /**\n * Clears all tracked state.\n *\n * @returns Nothing.\n */\n clear(): void {\n this.client.clear();\n this.calls.get = 0;\n this.calls.set = 0;\n this.calls.delete = 0;\n this.calls.has = 0;\n this.history.get = [];\n this.history.set = [];\n this.history.delete = [];\n this.history.has = [];\n }\n}\n","import {\n IgniterCallerError,\n type IgniterCallerErrorCode,\n} from '../errors/caller.error'\nimport type {\n IgniterCallerApiResponse,\n IgniterCallerFileResponse,\n} from '../types/response'\n\n/**\n * Testing utilities for `IgniterCaller`.\n *\n * Designed to simplify mocking HTTP responses in unit tests.\n */\nexport class IgniterCallerMock {\n /**\n * Creates a successful mock response.\n *\n * @param data - Mock response data.\n */\n static mockResponse<T>(data: T): IgniterCallerApiResponse<T> {\n return { data, error: undefined }\n }\n\n /**\n * Creates an error mock response.\n *\n * @param code - Error code to use.\n * @param message - Optional error message.\n */\n static mockError<T = never>(\n code: IgniterCallerErrorCode,\n message = 'Mock error',\n ): IgniterCallerApiResponse<T> {\n return {\n data: undefined,\n error: new IgniterCallerError({\n code,\n operation: 'execute',\n message,\n }),\n }\n }\n\n /**\n * Creates a successful file download mock.\n *\n * @param filename - File name for the mock.\n * @param content - File contents as string or Blob.\n */\n static mockFile(\n filename: string,\n content: string | Blob,\n ): IgniterCallerFileResponse {\n const blob = typeof content === 'string' ? new Blob([content]) : content\n const file = new File([blob], filename)\n\n return { file, error: null }\n }\n\n /**\n * Creates a failed file download mock.\n *\n * @param message - Optional error message.\n */\n static mockFileError(message = 'Mock file error'): IgniterCallerFileResponse {\n return {\n file: null,\n error: new IgniterCallerError({\n code: 'IGNITER_CALLER_UNKNOWN_ERROR',\n operation: 'download',\n message,\n }),\n }\n }\n}\n"]}
|