@igniter-js/caller 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +64 -15
- package/dist/index.d.ts +64 -15
- package/dist/index.js +24 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +24 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.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":["match","callbacks"],"mappings":"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","file":"index.mjs","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 = any,\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 = any,\n> = (state: IgniterCallerBuilderState<TSchemas>) => 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","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 } from '@igniter-js/core'\nimport { IgniterCallerBuilder } from '../builder/igniter-caller.builder'\nimport {\n IgniterCallerRequestBuilder,\n type IgniterCallerMethodRequestBuilder,\n type IgniterCallerRequestBuilderParams,\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 IgniterCallerSchemaMap,\n IgniterCallerSchemaValidationOptions,\n} from '../types/schemas'\nimport { IgniterCallerCacheUtils } from '../utils/cache'\nimport { IgniterCallerEvents } from './igniter-caller-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 */\nexport class IgniterCaller {\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?: IgniterCallerSchemaMap\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?: IgniterCallerSchemaMap\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(): IgniterCallerBuilder<IgniterCaller> {\n return IgniterCallerBuilder.create((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 })\n }\n\n /**\n * Returns a new client with the same config and a new logger.\n */\n withLogger(logger: IgniterLogger): IgniterCaller {\n return new IgniterCaller(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 * Creates a GET request.\n *\n * @param url Optional URL for the request. Can also be set via `.url()`.\n *\n * @example\n * ```ts\n * // With URL directly\n * const result = await api.get('/users').execute()\n *\n * // With URL via method\n * const result = await api.get().url('/users').execute()\n * ```\n */\n get(url?: string): IgniterCallerMethodRequestBuilder {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('GET')\n if (url) builder._setUrl(url)\n return builder as IgniterCallerMethodRequestBuilder\n }\n\n /**\n * Creates a POST request.\n *\n * @param url Optional URL for the request. Can also be set via `.url()`.\n *\n * @example\n * ```ts\n * const result = await api.post('/users').body({ name: 'John' }).execute()\n * ```\n */\n post(url?: string): IgniterCallerMethodRequestBuilder {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('POST')\n if (url) builder._setUrl(url)\n return builder as IgniterCallerMethodRequestBuilder\n }\n\n /**\n * Creates a PUT request.\n *\n * @param url Optional URL for the request. Can also be set via `.url()`.\n *\n * @example\n * ```ts\n * const result = await api.put('/users/1').body({ name: 'Jane' }).execute()\n * ```\n */\n put(url?: string): IgniterCallerMethodRequestBuilder {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('PUT')\n if (url) builder._setUrl(url)\n return builder as IgniterCallerMethodRequestBuilder\n }\n\n /**\n * Creates a PATCH request.\n *\n * @param url Optional URL for the request. Can also be set via `.url()`.\n *\n * @example\n * ```ts\n * const result = await api.patch('/users/1').body({ name: 'Jane' }).execute()\n * ```\n */\n patch(url?: string): IgniterCallerMethodRequestBuilder {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('PATCH')\n if (url) builder._setUrl(url)\n return builder as IgniterCallerMethodRequestBuilder\n }\n\n /**\n * Creates a DELETE request.\n *\n * @param url Optional URL for the request. Can also be set via `.url()`.\n *\n * @example\n * ```ts\n * const result = await api.delete('/users/1').execute()\n * ```\n */\n delete(url?: string): IgniterCallerMethodRequestBuilder {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('DELETE')\n if (url) builder._setUrl(url)\n return builder as IgniterCallerMethodRequestBuilder\n }\n\n /**\n * Creates a HEAD request.\n *\n * @param url Optional URL for the request. Can also be set via `.url()`.\n */\n head(url?: string): IgniterCallerMethodRequestBuilder {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('HEAD')\n if (url) builder._setUrl(url)\n return builder as IgniterCallerMethodRequestBuilder\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/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":["match","callbacks"],"mappings":"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","file":"index.mjs","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 IgniterCallerEndpointSchema,\n IgniterCallerSchemaMap,\n IgniterCallerSchemaMethod,\n IgniterCallerSchemaValidationOptions,\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 * 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 type is automatically inferred.\n *\n * @param url Optional URL for the request. Can also be set via `.url()`.\n *\n * @example\n * ```ts\n * // With typed schema - response type is inferred\n * const result = await api.get('/users').execute()\n * // result.data is typed based on schema\n *\n * // Without schema or URL set later\n * const result = await api.get().url('/users').execute()\n * ```\n */\n get<TPath extends string>(\n url?: TPath,\n ): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'GET'>> {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('GET')\n if (url) builder._setUrl(url)\n return builder as any\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 * @param url Optional URL for the request. Can also be set via `.url()`.\n *\n * @example\n * ```ts\n * const result = await api.post('/users').body({ name: 'John' }).execute()\n * ```\n */\n post<TPath extends string>(\n url?: TPath,\n ): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'POST'>> {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('POST')\n if (url) builder._setUrl(url)\n return builder as any\n }\n\n /**\n * Creates a PUT request.\n *\n * When a URL is provided and matches a schema, the response type is automatically inferred.\n *\n * @param url Optional URL for the request. Can also be set via `.url()`.\n *\n * @example\n * ```ts\n * const result = await api.put('/users/1').body({ name: 'Jane' }).execute()\n * ```\n */\n put<TPath extends string>(\n url?: TPath,\n ): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'PUT'>> {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('PUT')\n if (url) builder._setUrl(url)\n return builder as any\n }\n\n /**\n * Creates a PATCH request.\n *\n * When a URL is provided and matches a schema, the response type is automatically inferred.\n *\n * @param url Optional URL for the request. Can also be set via `.url()`.\n *\n * @example\n * ```ts\n * const result = await api.patch('/users/1').body({ name: 'Jane' }).execute()\n * ```\n */\n patch<TPath extends string>(\n url?: TPath,\n ): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'PATCH'>> {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('PATCH')\n if (url) builder._setUrl(url)\n return builder as any\n }\n\n /**\n * Creates a DELETE request.\n *\n * When a URL is provided and matches a schema, the response type is automatically inferred.\n *\n * @param url Optional URL for the request. Can also be set via `.url()`.\n *\n * @example\n * ```ts\n * const result = await api.delete('/users/1').execute()\n * ```\n */\n delete<TPath extends string>(\n url?: TPath,\n ): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'DELETE'>> {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('DELETE')\n if (url) builder._setUrl(url)\n return builder as any\n }\n\n /**\n * Creates a HEAD request.\n *\n * When a URL is provided and matches a schema, the response type is automatically inferred.\n *\n * @param url Optional URL for the request. Can also be set via `.url()`.\n */\n head<TPath extends string>(\n url?: TPath,\n ): IgniterCallerTypedRequestBuilder<InferResponse<TSchemas, TPath, 'HEAD'>> {\n const builder = new IgniterCallerRequestBuilder(this.createBuilderParams())\n builder._setMethod('HEAD')\n if (url) builder._setUrl(url)\n return builder as any\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"]}
|
package/package.json
CHANGED