{"version":3,"file":"request-builder.mjs","sources":["../../../src/lib/api/request-builder.ts"],"sourcesContent":["/**\n * @file Request Builder\n * @description Fluent, type-safe request builder for constructing API requests with\n * comprehensive support for URL parameters, query strings, multipart forms,\n * request timeout management, and header configuration.\n *\n * This module provides a builder pattern implementation that enables:\n * - Type-safe request construction with full IDE autocomplete\n * - Fluent API for chaining configuration methods\n * - Automatic URL parameter substitution and encoding\n * - Complex query string serialization including arrays and nested objects\n * - Multipart form data construction with file upload support\n * - Request timeout and cancellation management\n * - Header manipulation with type safety\n *\n * @example\n * ```typescript\n * import { RequestBuilder } from '@/lib/api';\n *\n * // Build a complex request fluently\n * const request = new RequestBuilder<UserResponse>()\n *   .get('/users/:userId/posts')\n *   .pathParam('userId', '123')\n *   .query({ page: 1, limit: 20, tags: ['featured', 'recent'] })\n *   .header('X-Custom-Header', 'value')\n *   .timeout(5000)\n *   .build();\n *\n * // Build a multipart form request\n * const uploadRequest = new RequestBuilder<UploadResponse>()\n *   .post('/files/upload')\n *   .formData()\n *   .field('title', 'My Document')\n *   .file('document', myFile)\n *   .build();\n * ```\n */\n\nimport type {\n  HttpMethod,\n  RequestConfig,\n  RequestHeaders,\n  QueryParams,\n  QueryParamValue,\n  ContentType,\n  ResponseType,\n  RetryConfig,\n  RequestPriority,\n  RequestMeta,\n} from './types';\nimport { API_CONFIG } from '@/config';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Builder state for tracking configured options\n */\ninterface BuilderState<TBody = unknown> {\n  method: HttpMethod;\n  url: string;\n  body?: TBody;\n  pathParams: Record<string, string | number>;\n  queryParams: QueryParams;\n  headers: RequestHeaders;\n  timeout?: number;\n  responseType: ResponseType;\n  contentType?: ContentType;\n  signal?: AbortSignal;\n  credentials?: RequestCredentials;\n  cache?: RequestCache;\n  retry?: Partial<RetryConfig>;\n  priority: RequestPriority;\n  meta: RequestMeta;\n  formData?: FormData;\n  isFormData: boolean;\n}\n\n/**\n * Query parameter serialization options\n */\nexport interface QuerySerializationOptions {\n  /** Array serialization format */\n  arrayFormat: 'brackets' | 'indices' | 'repeat' | 'comma';\n  /** Encode keys */\n  encodeKeys: boolean;\n  /** Encode values */\n  encodeValues: boolean;\n  /** Skip null values */\n  skipNull: boolean;\n  /** Skip undefined values */\n  skipUndefined: boolean;\n  /** Allow dots in keys for nested objects */\n  allowDots: boolean;\n  /** Custom serializer for complex types */\n  serialize?: (key: string, value: unknown) => string | null;\n}\n\n/**\n * Default serialization options\n */\nconst DEFAULT_SERIALIZATION_OPTIONS: QuerySerializationOptions = {\n  arrayFormat: 'brackets',\n  encodeKeys: true,\n  encodeValues: true,\n  skipNull: true,\n  skipUndefined: true,\n  allowDots: false,\n};\n\n// =============================================================================\n// REQUEST BUILDER CLASS\n// =============================================================================\n\n/**\n * Fluent request builder for constructing type-safe API requests\n *\n * @typeParam TResponse - Expected response type\n * @typeParam TBody - Request body type\n *\n * @example\n * ```typescript\n * // Simple GET request\n * const config = new RequestBuilder<User>()\n *   .get('/users/123')\n *   .timeout(5000)\n *   .build();\n *\n * // POST with JSON body\n * const config = new RequestBuilder<User, CreateUserDto>()\n *   .post('/users')\n *   .json({ name: 'John', email: 'john@example.com' })\n *   .build();\n *\n * // Complex query parameters\n * const config = new RequestBuilder<SearchResults>()\n *   .get('/search')\n *   .query({\n *     q: 'search term',\n *     filters: { status: 'active', type: ['a', 'b'] },\n *     page: 1,\n *   })\n *   .build();\n * ```\n */\nexport class RequestBuilder<TResponse = unknown, TBody = unknown> {\n  private readonly state: BuilderState<TBody>;\n  private serializationOptions: QuerySerializationOptions;\n\n  constructor() {\n    this.state = {\n      method: 'GET',\n      url: '',\n      pathParams: {},\n      queryParams: {},\n      headers: {},\n      responseType: 'json',\n      priority: 'normal',\n      meta: {},\n      isFormData: false,\n    };\n    this.serializationOptions = { ...DEFAULT_SERIALIZATION_OPTIONS };\n  }\n\n  // ===========================================================================\n  // HTTP METHOD SETTERS\n  // ===========================================================================\n\n  /**\n   * Set HTTP method to GET\n   */\n  get(url: string): this {\n    this.state.method = 'GET';\n    this.state.url = url;\n    return this;\n  }\n\n  /**\n   * Set HTTP method to POST\n   */\n  post(url: string): this {\n    this.state.method = 'POST';\n    this.state.url = url;\n    return this;\n  }\n\n  /**\n   * Set HTTP method to PUT\n   */\n  put(url: string): this {\n    this.state.method = 'PUT';\n    this.state.url = url;\n    return this;\n  }\n\n  /**\n   * Set HTTP method to PATCH\n   */\n  patch(url: string): this {\n    this.state.method = 'PATCH';\n    this.state.url = url;\n    return this;\n  }\n\n  /**\n   * Set HTTP method to DELETE\n   */\n  delete(url: string): this {\n    this.state.method = 'DELETE';\n    this.state.url = url;\n    return this;\n  }\n\n  /**\n   * Set HTTP method to HEAD\n   */\n  head(url: string): this {\n    this.state.method = 'HEAD';\n    this.state.url = url;\n    return this;\n  }\n\n  /**\n   * Set HTTP method to OPTIONS\n   */\n  options(url: string): this {\n    this.state.method = 'OPTIONS';\n    this.state.url = url;\n    return this;\n  }\n\n  /**\n   * Set custom HTTP method and URL\n   */\n  method(method: HttpMethod, url: string): this {\n    this.state.method = method;\n    this.state.url = url;\n    return this;\n  }\n\n  // ===========================================================================\n  // PATH PARAMETERS\n  // ===========================================================================\n\n  /**\n   * Set a single path parameter\n   *\n   * @example\n   * ```typescript\n   * builder.get('/users/:userId/posts/:postId')\n   *   .pathParam('userId', '123')\n   *   .pathParam('postId', '456')\n   * ```\n   */\n  pathParam(key: string, value: string | number): this {\n    this.state.pathParams[key] = value;\n    return this;\n  }\n\n  /**\n   * Set multiple path parameters at once\n   *\n   * @example\n   * ```typescript\n   * builder.get('/users/:userId/posts/:postId')\n   *   .pathParams({ userId: '123', postId: '456' })\n   * ```\n   */\n  pathParams(params: Record<string, string | number>): this {\n    this.state.pathParams = { ...this.state.pathParams, ...params };\n    return this;\n  }\n\n  // ===========================================================================\n  // QUERY PARAMETERS\n  // ===========================================================================\n\n  /**\n   * Set a single query parameter\n   *\n   * @example\n   * ```typescript\n   * builder.get('/users')\n   *   .queryParam('page', 1)\n   *   .queryParam('limit', 20)\n   * ```\n   */\n  queryParam(key: string, value: QueryParamValue): this {\n    this.state.queryParams[key] = value;\n    return this;\n  }\n\n  /**\n   * Set multiple query parameters at once\n   *\n   * @example\n   * ```typescript\n   * builder.get('/users')\n   *   .query({ page: 1, limit: 20, status: 'active' })\n   * ```\n   */\n  query(params: QueryParams): this {\n    this.state.queryParams = { ...this.state.queryParams, ...params };\n    return this;\n  }\n\n  /**\n   * Configure query string serialization options\n   *\n   * @example\n   * ```typescript\n   * builder.get('/search')\n   *   .queryOptions({ arrayFormat: 'comma' })\n   *   .query({ tags: ['a', 'b', 'c'] })\n   *   // Results in: /search?tags=a,b,c\n   * ```\n   */\n  queryOptions(options: Partial<QuerySerializationOptions>): this {\n    this.serializationOptions = { ...this.serializationOptions, ...options };\n    return this;\n  }\n\n  // ===========================================================================\n  // REQUEST BODY\n  // ===========================================================================\n\n  /**\n   * Set JSON request body\n   *\n   * @example\n   * ```typescript\n   * builder.post('/users')\n   *   .json({ name: 'John', email: 'john@example.com' })\n   * ```\n   */\n  json(data: TBody): this {\n    this.state.body = data;\n    this.state.contentType = 'application/json';\n    this.state.isFormData = false;\n    return this;\n  }\n\n  /**\n   * Set raw body with custom content type\n   */\n  body(data: TBody, contentType?: ContentType): this {\n    this.state.body = data;\n    if (contentType) {\n      this.state.contentType = contentType;\n    }\n    this.state.isFormData = false;\n    return this;\n  }\n\n  /**\n   * Set text body\n   *\n   * @remarks\n   * Text body is stored as the generic TBody type. When using text(),\n   * ensure TBody is compatible with string or use RequestBuilder<Response, string>.\n   */\n  text(data: string): RequestBuilder<TResponse, string> {\n    const builder = this as unknown as RequestBuilder<TResponse, string>;\n    builder.state.body = data;\n    builder.state.contentType = 'text/plain';\n    builder.state.isFormData = false;\n    return builder;\n  }\n\n  /**\n   * Initialize multipart form data mode\n   *\n   * @example\n   * ```typescript\n   * builder.post('/upload')\n   *   .formData()\n   *   .field('title', 'My File')\n   *   .file('document', fileBlob)\n   * ```\n   */\n  formData(): this {\n    this.state.formData = new FormData();\n    this.state.contentType = 'multipart/form-data';\n    this.state.isFormData = true;\n    return this;\n  }\n\n  /**\n   * Add a field to form data\n   */\n  field(name: string, value: string | Blob): this {\n    if (this.state.formData === undefined) {\n      this.formData();\n    }\n    if (this.state.formData !== undefined) {\n      this.state.formData.append(name, value);\n    }\n    return this;\n  }\n\n  /**\n   * Add a file to form data\n   *\n   * @example\n   * ```typescript\n   * builder.post('/upload')\n   *   .formData()\n   *   .file('avatar', imageFile, 'profile.jpg')\n   * ```\n   */\n  file(name: string, file: Blob, filename?: string): this {\n    if (this.state.formData === undefined) {\n      this.formData();\n    }\n    if (this.state.formData !== undefined) {\n      if (filename !== undefined && filename !== null && filename !== '') {\n        this.state.formData.append(name, file, filename);\n      } else {\n        this.state.formData.append(name, file);\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Add multiple files to form data\n   *\n   * @example\n   * ```typescript\n   * builder.post('/upload')\n   *   .formData()\n   *   .files('attachments', fileList)\n   * ```\n   */\n  files(name: string, files: File[] | FileList): this {\n    if (this.state.formData === undefined) {\n      this.formData();\n    }\n    if (this.state.formData !== undefined) {\n      const fileArray = Array.from(files);\n      for (const file of fileArray) {\n        this.state.formData.append(name, file, file.name);\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Set URL-encoded form body\n   *\n   * @remarks\n   * URL-encoded data is stored as a Record<string, string>. This method\n   * returns a builder typed with the appropriate body type.\n   *\n   * @example\n   * ```typescript\n   * builder.post('/form')\n   *   .urlEncoded({ username: 'john', password: 'secret' })\n   * ```\n   */\n  urlEncoded(data: Record<string, string>): RequestBuilder<TResponse, Record<string, string>> {\n    const builder = this as unknown as RequestBuilder<TResponse, Record<string, string>>;\n    builder.state.body = data;\n    builder.state.contentType = 'application/x-www-form-urlencoded';\n    builder.state.isFormData = false;\n    return builder;\n  }\n\n  // ===========================================================================\n  // HEADERS\n  // ===========================================================================\n\n  /**\n   * Set a single header\n   *\n   * @example\n   * ```typescript\n   * builder.get('/api')\n   *   .header('X-Custom-Header', 'value')\n   *   .header('Accept-Language', 'en-US')\n   * ```\n   */\n  header(key: string, value: string): this {\n    this.state.headers[key] = value;\n    return this;\n  }\n\n  /**\n   * Set multiple headers at once\n   *\n   * @example\n   * ```typescript\n   * builder.get('/api')\n   *   .headers({\n   *     'X-Custom-Header': 'value',\n   *     'Accept-Language': 'en-US',\n   *   })\n   * ```\n   */\n  headers(headers: RequestHeaders): this {\n    this.state.headers = { ...this.state.headers, ...headers };\n    return this;\n  }\n\n  /**\n   * Set Accept header\n   */\n  accept(mimeType: string): this {\n    this.state.headers['Accept'] = mimeType;\n    return this;\n  }\n\n  /**\n   * Set Content-Type header\n   */\n  contentType(type: ContentType): this {\n    this.state.contentType = type;\n    this.state.headers['Content-Type'] = type;\n    return this;\n  }\n\n  /**\n   * Set Authorization header with Bearer token\n   *\n   * @example\n   * ```typescript\n   * builder.get('/api')\n   *   .bearer('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...')\n   * ```\n   */\n  bearer(token: string): this {\n    this.state.headers['Authorization'] = `Bearer ${token}`;\n    return this;\n  }\n\n  /**\n   * Set Authorization header with Basic auth\n   *\n   * @example\n   * ```typescript\n   * builder.get('/api')\n   *   .basicAuth('username', 'password')\n   * ```\n   */\n  basicAuth(username: string, password: string): this {\n    const credentials = btoa(`${username}:${password}`);\n    this.state.headers['Authorization'] = `Basic ${credentials}`;\n    return this;\n  }\n\n  /**\n   * Set API key header\n   *\n   * @example\n   * ```typescript\n   * builder.get('/api')\n   *   .apiKey('X-API-Key', 'your-api-key')\n   * ```\n   */\n  apiKey(headerName: string, key: string): this {\n    this.state.headers[headerName] = key;\n    return this;\n  }\n\n  // ===========================================================================\n  // RESPONSE CONFIGURATION\n  // ===========================================================================\n\n  /**\n   * Set expected response type\n   *\n   * @example\n   * ```typescript\n   * builder.get('/file')\n   *   .responseAs('blob')\n   * ```\n   */\n  responseAs(type: ResponseType): this {\n    this.state.responseType = type;\n    return this;\n  }\n\n  /**\n   * Expect JSON response (default)\n   */\n  expectJson(): this {\n    this.state.responseType = 'json';\n    return this;\n  }\n\n  /**\n   * Expect text response\n   */\n  expectText(): this {\n    this.state.responseType = 'text';\n    return this;\n  }\n\n  /**\n   * Expect blob response\n   */\n  expectBlob(): this {\n    this.state.responseType = 'blob';\n    return this;\n  }\n\n  /**\n   * Expect array buffer response\n   */\n  expectArrayBuffer(): this {\n    this.state.responseType = 'arraybuffer';\n    return this;\n  }\n\n  /**\n   * Expect streaming response\n   */\n  expectStream(): this {\n    this.state.responseType = 'stream';\n    return this;\n  }\n\n  // ===========================================================================\n  // TIMEOUT & CANCELLATION\n  // ===========================================================================\n\n  /**\n   * Set request timeout in milliseconds\n   *\n   * @example\n   * ```typescript\n   * builder.get('/slow-endpoint')\n   *   .timeout(60000) // 60 seconds\n   * ```\n   */\n  timeout(ms: number): this {\n    this.state.timeout = ms;\n    return this;\n  }\n\n  /**\n   * Use short timeout (10s)\n   */\n  shortTimeout(): this {\n    this.state.timeout = API_CONFIG.TIMEOUT.SHORT;\n    return this;\n  }\n\n  /**\n   * Use long timeout (2min)\n   */\n  longTimeout(): this {\n    this.state.timeout = API_CONFIG.TIMEOUT.LONG;\n    return this;\n  }\n\n  /**\n   * Set AbortController signal for cancellation\n   *\n   * @example\n   * ```typescript\n   * const controller = new AbortController();\n   * builder.get('/api')\n   *   .signal(controller.signal)\n   *\n   * // Later: controller.abort()\n   * ```\n   */\n  signal(signal: AbortSignal): this {\n    this.state.signal = signal;\n    return this;\n  }\n\n  /**\n   * Create and return a new AbortController, attaching its signal\n   *\n   * @example\n   * ```typescript\n   * const controller = builder.get('/api')\n   *   .abortable()\n   *   .build();\n   * // Later: builder.getAbortController()?.abort()\n   * ```\n   */\n  abortable(): this & { getAbortController: () => AbortController } {\n    const controller = new AbortController();\n    this.state.signal = controller.signal;\n    (this as this & { getAbortController: () => AbortController }).getAbortController = () => controller;\n    return this as this & { getAbortController: () => AbortController };\n  }\n\n  // ===========================================================================\n  // CREDENTIALS & CACHE\n  // ===========================================================================\n\n  /**\n   * Set credentials mode\n   *\n   * @example\n   * ```typescript\n   * builder.get('/api')\n   *   .credentials('include') // Send cookies cross-origin\n   * ```\n   */\n  credentials(mode: RequestCredentials): this {\n    this.state.credentials = mode;\n    return this;\n  }\n\n  /**\n   * Include credentials (cookies)\n   */\n  withCredentials(): this {\n    this.state.credentials = 'include';\n    return this;\n  }\n\n  /**\n   * Omit credentials\n   */\n  withoutCredentials(): this {\n    this.state.credentials = 'omit';\n    return this;\n  }\n\n  /**\n   * Set cache mode\n   *\n   * @example\n   * ```typescript\n   * builder.get('/api')\n   *   .cache('no-store') // Never cache\n   * ```\n   */\n  cache(mode: RequestCache): this {\n    this.state.cache = mode;\n    return this;\n  }\n\n  /**\n   * Disable caching\n   */\n  noCache(): this {\n    this.state.cache = 'no-store';\n    this.state.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate';\n    return this;\n  }\n\n  /**\n   * Force fresh response (bypass cache)\n   */\n  forceRefresh(): this {\n    this.state.cache = 'reload';\n    return this;\n  }\n\n  // ===========================================================================\n  // RETRY CONFIGURATION\n  // ===========================================================================\n\n  /**\n   * Configure retry behavior\n   *\n   * @example\n   * ```typescript\n   * builder.get('/unreliable')\n   *   .retry({\n   *     maxAttempts: 5,\n   *     baseDelay: 2000,\n   *   })\n   * ```\n   */\n  retry(config: Partial<RetryConfig>): this {\n    this.state.retry = config;\n    return this;\n  }\n\n  /**\n   * Set maximum retry attempts\n   */\n  maxRetries(count: number): this {\n    this.state.retry = { ...this.state.retry, maxAttempts: count };\n    return this;\n  }\n\n  /**\n   * Disable retries for this request\n   */\n  noRetry(): this {\n    this.state.meta.skipRetry = true;\n    return this;\n  }\n\n  // ===========================================================================\n  // REQUEST METADATA\n  // ===========================================================================\n\n  /**\n   * Set request priority\n   *\n   * @example\n   * ```typescript\n   * builder.get('/critical-data')\n   *   .priority('high')\n   * ```\n   */\n  priority(level: RequestPriority): this {\n    this.state.priority = level;\n    return this;\n  }\n\n  /**\n   * Mark request as critical priority\n   */\n  critical(): this {\n    this.state.priority = 'critical';\n    return this;\n  }\n\n  /**\n   * Mark request as background priority\n   */\n  background(): this {\n    this.state.priority = 'background';\n    return this;\n  }\n\n  /**\n   * Set custom metadata\n   *\n   * @example\n   * ```typescript\n   * builder.get('/api')\n   *   .meta({ feature: 'user-profile', version: 2 })\n   * ```\n   */\n  meta(metadata: Partial<RequestMeta>): this {\n    this.state.meta = { ...this.state.meta, ...metadata };\n    return this;\n  }\n\n  /**\n   * Set request tags for categorization\n   *\n   * @example\n   * ```typescript\n   * builder.get('/api')\n   *   .tags(['analytics', 'dashboard'])\n   * ```\n   */\n  tags(tags: string[]): this {\n    this.state.meta.tags = tags;\n    return this;\n  }\n\n  /**\n   * Set idempotency key for safe retries\n   *\n   * @example\n   * ```typescript\n   * builder.post('/orders')\n   *   .idempotencyKey('order-123-create')\n   *   .json(orderData)\n   * ```\n   */\n  idempotencyKey(key: string): this {\n    this.state.meta.idempotencyKey = key;\n    return this;\n  }\n\n  /**\n   * Set correlation ID for distributed tracing\n   */\n  correlationId(id: string): this {\n    this.state.meta.correlationId = id;\n    return this;\n  }\n\n  /**\n   * Skip authentication for this request\n   */\n  skipAuth(): this {\n    this.state.meta.skipAuth = true;\n    return this;\n  }\n\n  /**\n   * Enable request deduplication\n   */\n  deduplicate(enabled = true): this {\n    this.state.meta.deduplicate = enabled;\n    return this;\n  }\n\n  /**\n   * Set cache key for response caching\n   */\n  cacheKey(key: string): this {\n    this.state.meta.cacheKey = key;\n    return this;\n  }\n\n  /**\n   * Set cache TTL for response caching\n   */\n  cacheTtl(ttl: number): this {\n    this.state.meta.cacheTtl = ttl;\n    return this;\n  }\n\n  // ===========================================================================\n  // BUILD\n  // ===========================================================================\n\n  /**\n   * Build the final request configuration\n   *\n   * @returns Complete RequestConfig object ready for execution\n   *\n   * @example\n   * ```typescript\n   * const config = new RequestBuilder<User>()\n   *   .get('/users/:id')\n   *   .pathParam('id', '123')\n   *   .header('Accept-Language', 'en')\n   *   .timeout(5000)\n   *   .build();\n   *\n   * // Use with API client\n   * const response = await apiClient.request<User>(config);\n   * ```\n   */\n  build(): RequestConfig<TBody> {\n    const url = this.buildUrl();\n\n    const config: RequestConfig<TBody> = {\n      method: this.state.method,\n      url,\n      headers: this.state.headers,\n      responseType: this.state.responseType,\n      priority: this.state.priority,\n      meta: this.state.meta,\n    };\n\n    // Add body (FormData or regular body)\n    if (this.state.isFormData && this.state.formData) {\n      // FormData is a special body type that overrides the generic TBody.\n      // The RequestConfig type accepts FormData as a valid body via the type union.\n      // This cast is safe because RequestConfig.body accepts FormData | TBody.\n      config.body = this.state.formData as TBody;\n      // Don't set Content-Type for FormData - browser will set it with boundary\n      if (config.headers) {\n        delete config.headers['Content-Type'];\n      }\n    } else if (this.state.body !== undefined) {\n      config.body = this.state.body;\n      if (this.state.contentType) {\n        config.contentType = this.state.contentType;\n      }\n    }\n\n    // Add query params to config (will be serialized by client)\n    if (Object.keys(this.state.queryParams).length > 0) {\n      config.params = this.state.queryParams;\n    }\n\n    // Add path params for substitution\n    if (Object.keys(this.state.pathParams).length > 0) {\n      config.pathParams = this.state.pathParams;\n    }\n\n    // Add optional configurations\n    if (this.state.timeout !== undefined) {\n      config.timeout = this.state.timeout;\n    }\n\n    if (this.state.signal) {\n      config.signal = this.state.signal;\n    }\n\n    if (this.state.credentials) {\n      config.credentials = this.state.credentials;\n    }\n\n    if (this.state.cache) {\n      config.cache = this.state.cache;\n    }\n\n    if (this.state.retry) {\n      config.retry = this.state.retry as RetryConfig;\n    }\n\n    return config;\n  }\n\n  /**\n   * Clone the builder with current state\n   */\n  clone(): RequestBuilder<TResponse, TBody> {\n    const cloned = new RequestBuilder<TResponse, TBody>();\n    Object.assign(cloned.state, JSON.parse(JSON.stringify(this.state)) as BuilderState<TBody>);\n    cloned.serializationOptions = { ...this.serializationOptions };\n\n    // Clone FormData if present\n    if (this.state.formData !== undefined) {\n      cloned.state.formData = new FormData();\n      this.state.formData.forEach((value, key) => {\n        if (cloned.state.formData !== undefined) {\n          cloned.state.formData.append(key, value);\n        }\n      });\n    }\n\n    return cloned;\n  }\n\n  /**\n   * Build URL with path parameter substitution\n   */\n  private buildUrl(): string {\n    const { url: initialUrl, pathParams } = this.state;\n    let url = initialUrl;\n\n    // Substitute path parameters\n    for (const [key, value] of Object.entries(pathParams)) {\n      url = url.replace(`:${key}`, encodeURIComponent(String(value)));\n    }\n\n    return url;\n  }\n}\n\n// =============================================================================\n// FACTORY FUNCTIONS\n// =============================================================================\n\n/**\n * Create a new request builder\n *\n * @typeParam TResponse - Expected response type\n * @typeParam TBody - Request body type\n *\n * @example\n * ```typescript\n * const config = createRequest<User>()\n *   .get('/users/123')\n *   .build();\n * ```\n */\nexport function createRequest<TResponse = unknown, TBody = unknown>(): RequestBuilder<\n  TResponse,\n  TBody\n> {\n  return new RequestBuilder<TResponse, TBody>();\n}\n\n/**\n * Create a GET request builder\n *\n * @example\n * ```typescript\n * const config = get<User>('/users/123')\n *   .query({ include: 'posts' })\n *   .build();\n * ```\n */\nexport function get<TResponse = unknown>(\n  url: string\n): RequestBuilder<TResponse, never> {\n  return new RequestBuilder<TResponse, never>().get(url);\n}\n\n/**\n * Create a POST request builder\n *\n * @example\n * ```typescript\n * const config = post<User, CreateUserDto>('/users')\n *   .json({ name: 'John' })\n *   .build();\n * ```\n */\nexport function post<TResponse = unknown, TBody = unknown>(\n  url: string\n): RequestBuilder<TResponse, TBody> {\n  return new RequestBuilder<TResponse, TBody>().post(url);\n}\n\n/**\n * Create a PUT request builder\n */\nexport function put<TResponse = unknown, TBody = unknown>(\n  url: string\n): RequestBuilder<TResponse, TBody> {\n  return new RequestBuilder<TResponse, TBody>().put(url);\n}\n\n/**\n * Create a PATCH request builder\n */\nexport function patch<TResponse = unknown, TBody = unknown>(\n  url: string\n): RequestBuilder<TResponse, TBody> {\n  return new RequestBuilder<TResponse, TBody>().patch(url);\n}\n\n/**\n * Create a DELETE request builder\n */\nexport function del<TResponse = unknown>(\n  url: string\n): RequestBuilder<TResponse, never> {\n  return new RequestBuilder<TResponse, never>().delete(url);\n}\n\n// =============================================================================\n// QUERY STRING UTILITIES\n// =============================================================================\n\n/**\n * Serialize query parameters to URL search string\n *\n * @example\n * ```typescript\n * serializeQueryParams({ page: 1, tags: ['a', 'b'] })\n * // Returns: 'page=1&tags[]=a&tags[]=b'\n *\n * serializeQueryParams({ page: 1, tags: ['a', 'b'] }, { arrayFormat: 'comma' })\n * // Returns: 'page=1&tags=a,b'\n * ```\n */\nexport function serializeQueryParams(\n  params: QueryParams,\n  options: Partial<QuerySerializationOptions> = {}\n): string {\n  const opts = { ...DEFAULT_SERIALIZATION_OPTIONS, ...options };\n  const parts: string[] = [];\n\n  for (const [key, value] of Object.entries(params)) {\n    if (value === null && opts.skipNull) continue;\n    if (value === undefined && opts.skipUndefined) continue;\n\n    const serializedParts = serializeValue(key, value, opts);\n    parts.push(...serializedParts);\n  }\n\n  return parts.join('&');\n}\n\n/**\n * Serialize a single value (handles arrays and objects)\n */\nfunction serializeValue(\n  key: string,\n  value: QueryParamValue,\n  options: QuerySerializationOptions\n): string[] {\n  // Custom serializer\n  if (options.serialize) {\n    const result = options.serialize(key, value);\n    if (result !== null) {\n      return [result];\n    }\n  }\n\n  // Handle null/undefined\n  if (value === null || value === undefined) {\n    return [];\n  }\n\n  // Handle arrays\n  if (Array.isArray(value)) {\n    return serializeArray(key, value, options);\n  }\n\n  // Handle primitives\n  const encodedKey = options.encodeKeys ? encodeURIComponent(key) : key;\n  const encodedValue = options.encodeValues ? encodeURIComponent(String(value)) : String(value);\n\n  return [`${encodedKey}=${encodedValue}`];\n}\n\n/**\n * Serialize an array value based on format option\n */\nfunction serializeArray(\n  key: string,\n  values: (string | number)[],\n  options: QuerySerializationOptions\n): string[] {\n  const encodedKey = options.encodeKeys ? encodeURIComponent(key) : key;\n\n  switch (options.arrayFormat) {\n    case 'brackets':\n      return values.map((v) => {\n        const encodedValue = options.encodeValues ? encodeURIComponent(String(v)) : String(v);\n        return `${encodedKey}[]=${encodedValue}`;\n      });\n\n    case 'indices':\n      return values.map((v, i) => {\n        const encodedValue = options.encodeValues ? encodeURIComponent(String(v)) : String(v);\n        return `${encodedKey}[${i}]=${encodedValue}`;\n      });\n\n    case 'repeat':\n      return values.map((v) => {\n        const encodedValue = options.encodeValues ? encodeURIComponent(String(v)) : String(v);\n        return `${encodedKey}=${encodedValue}`;\n      });\n\n    case 'comma': {\n      const encodedValues = values.map((v) =>\n        options.encodeValues ? encodeURIComponent(String(v)) : String(v)\n      );\n      return [`${encodedKey}=${encodedValues.join(',')}`];\n    }\n\n    default:\n      return [];\n  }\n}\n\n/**\n * Parse query string to parameters object\n *\n * @example\n * ```typescript\n * parseQueryParams('page=1&tags[]=a&tags[]=b')\n * // Returns: { page: '1', tags: ['a', 'b'] }\n * ```\n */\nexport function parseQueryParams(queryString: string): QueryParams {\n  const params: QueryParams = {};\n  const searchParams = new URLSearchParams(queryString);\n\n  for (const [key, value] of searchParams.entries()) {\n    // Handle array notation\n    if (key.endsWith('[]')) {\n      const arrayKey = key.slice(0, -2);\n      params[arrayKey] ??= [];\n      (params[arrayKey] as string[]).push(value);\n    }\n    // Handle indexed notation\n    else if (/\\[\\d+\\]$/.test(key)) {\n      const arrayKey = key.replace(/\\[\\d+\\]$/, '');\n      params[arrayKey] ??= [];\n      (params[arrayKey] as string[]).push(value);\n    }\n    // Handle comma-separated values (if only key exists)\n    else if (value.includes(',') && params[key] === undefined) {\n      params[key] = value.split(',');\n    }\n    // Handle repeated keys\n    else if (params[key] !== undefined) {\n      if (!Array.isArray(params[key])) {\n        params[key] = [params[key] as string];\n      }\n      (params[key] as string[]).push(value);\n    }\n    // Simple key-value\n    else {\n      params[key] = value;\n    }\n  }\n\n  return params;\n}\n\n// =============================================================================\n// URL UTILITIES\n// =============================================================================\n\n/**\n * Build a complete URL with path parameters and query string\n *\n * @example\n * ```typescript\n * buildUrl('/users/:id/posts', { id: '123' }, { page: 1 })\n * // Returns: '/users/123/posts?page=1'\n * ```\n */\nexport function buildUrl(\n  path: string,\n  pathParams?: Record<string, string | number>,\n  queryParams?: QueryParams,\n  options?: Partial<QuerySerializationOptions>\n): string {\n  let url = path;\n\n  // Substitute path parameters\n  if (pathParams) {\n    for (const [key, value] of Object.entries(pathParams)) {\n      url = url.replace(`:${key}`, encodeURIComponent(String(value)));\n    }\n  }\n\n  // Add query string\n  if (queryParams && Object.keys(queryParams).length > 0) {\n    const queryString = serializeQueryParams(queryParams, options);\n    if (queryString) {\n      url = `${url}?${queryString}`;\n    }\n  }\n\n  return url;\n}\n\n/**\n * Join URL segments safely\n *\n * @example\n * ```typescript\n * joinUrl('https://api.example.com/', '/v1/', 'users')\n * // Returns: 'https://api.example.com/v1/users'\n * ```\n */\nexport function joinUrl(...segments: string[]): string {\n  return segments\n    .map((segment, index) => {\n      // Remove trailing slashes except for first segment\n      if (index > 0) {\n        segment = segment.replace(/^\\/+/, '');\n      }\n      // Remove leading slashes except for last segment\n      if (index < segments.length - 1) {\n        segment = segment.replace(/\\/+$/, '');\n      }\n      return segment;\n    })\n    .filter(Boolean)\n    .join('/');\n}\n"],"names":["DEFAULT_SERIALIZATION_OPTIONS","RequestBuilder","url","method","key","value","params","options","data","contentType","builder","name","file","filename","files","fileArray","headers","mimeType","type","token","username","password","credentials","headerName","ms","API_CONFIG","signal","controller","mode","config","count","level","metadata","tags","id","enabled","ttl","cloned","initialUrl","pathParams","createRequest","get","post","put","patch","del","serializeQueryParams","opts","parts","serializedParts","serializeValue","result","serializeArray","encodedKey","encodedValue","values","v","i","encodedValues","parseQueryParams","queryString","searchParams","arrayKey","buildUrl","path","queryParams","joinUrl","segments","segment","index"],"mappings":"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"}