{"version":3,"sources":["../src/request/constants.ts","../src/request/error-handler.ts","../src/request/interceptors.ts","../src/request/create-request-config.ts","../src/request/crud-service.ts","../src/request/file-service.ts"],"names":["isExcludedPath","encryptRequestData","reqUrl","decryptResponseData"],"mappings":"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","file":"chunk-IFBW2BQX.cjs","sourcesContent":["/**\n * 请求相关常量\n */\n\n/** API 成功状态码 */\nexport const API_SUCCESS_CODE = '200';\n\n/** HTTP 状态码 */\nexport const HTTP_STATUS = {\n  OK: 200,\n  UNAUTHORIZED: 401,\n  FORBIDDEN: 403,\n  NOT_FOUND: 404,\n  INTERNAL_ERROR: 500,\n} as const;\n\n/** 默认请求超时时间 (毫秒) */\nexport const DEFAULT_TIMEOUT = 10000;\n\n/** 默认加密请求头名称 */\nexport const DEFAULT_ENCRYPT_HEADER = 'X-Encrypted';\nexport const DEFAULT_TIMESTAMP_HEADER = 'X-Timestamp';\nexport const DEFAULT_SIGNATURE_HEADER = 'X-Signature';\n\n/** 默认未授权状态码 */\nexport const DEFAULT_UNAUTHORIZED_CODES = [\n  HTTP_STATUS.UNAUTHORIZED,\n  HTTP_STATUS.FORBIDDEN,\n] as const;\n\n/** 未授权状态码字符串集合（预计算，避免每次调用时重复 String() 转换） */\nconst UNAUTHORIZED_CODES = new Set(\n  DEFAULT_UNAUTHORIZED_CODES.map((code) => String(code)),\n);\n\n/**\n * 判断业务状态码是否为未授权\n *\n * @param code - 业务状态码\n * @returns 是否为未授权状态码 (401 / 403)\n */\nexport function isUnauthorizedCode(code: string | number | undefined): boolean {\n  if (code === undefined) return false;\n  return UNAUTHORIZED_CODES.has(String(code));\n}\n\n/**\n * 创建未授权状态码检测器\n *\n * @param customCodes - 业务自定义未授权码\n * @param includeDefault - 是否包含默认 401/403\n */\nexport function createUnauthorizedCodeChecker(\n  customCodes: Array<string | number> = [],\n  includeDefault: boolean = true,\n): (code: string | number | undefined) => boolean {\n  const codeSet = new Set<string>();\n  if (includeDefault) {\n    for (const code of DEFAULT_UNAUTHORIZED_CODES) {\n      codeSet.add(String(code));\n    }\n  }\n  for (const code of customCodes) {\n    codeSet.add(String(code));\n  }\n\n  return (code: string | number | undefined): boolean => {\n    if (code === undefined) return false;\n    return codeSet.has(String(code));\n  };\n}\n","/**\n * 错误处理器工厂\n *\n */\n\nimport { createUnauthorizedCodeChecker } from './constants';\nimport type { ErrorHandlerConfig, RequestError } from './types';\nimport { ErrorShowType } from './types';\n\n/**\n * 创建错误抛出器 (errorThrower)\n *\n * 用于 UmiJS request 插件的 errorConfig.errorThrower。\n * 当 API 返回非成功状态码时，将响应转换为可识别的业务错误抛出。\n *\n * @param successCode - 成功状态码，默认 '200'\n * @returns errorThrower 函数\n */\nexport function createErrorThrower(successCode: string | number = '200') {\n  return (res: Record<string, unknown>) => {\n    const response = res as Record<string, unknown> & {\n      code?: string | number;\n      errorCode?: string | number;\n      data?: unknown;\n      msg?: string;\n      message?: string;\n      errorMessage?: string;\n    };\n\n    const codeStr = String(response?.code ?? response?.errorCode);\n    const isSuccess = codeStr === String(successCode);\n\n    if (!isSuccess) {\n      const errorMsg =\n        response?.msg ||\n        response?.errorMessage ||\n        response?.message ||\n        'Request failed';\n      const error = new Error(errorMsg) as RequestError;\n      error.name = 'BizError';\n      error.info = {\n        errorCode: response?.code ?? response?.errorCode,\n        errorMessage: errorMsg,\n        showType: ErrorShowType.ERROR_MESSAGE,\n        data: response?.data,\n      };\n      throw error;\n    }\n  };\n}\n\n/**\n * 创建错误处理器 (errorHandler)\n *\n * 用于 UmiJS request 插件的 errorConfig.errorHandler。\n *\n * @param config - 错误处理配置\n * @returns errorHandler 函数\n */\nexport function createErrorHandler(config: ErrorHandlerConfig) {\n  const {\n    onUnauthorized,\n    onError,\n    onBizError,\n    unauthorizedCodes = [],\n    includeDefaultUnauthorizedCodes = true,\n  } = config;\n  const isUnauthorized = createUnauthorizedCodeChecker(\n    unauthorizedCodes,\n    includeDefaultUnauthorizedCodes,\n  );\n\n  return (\n    error: RequestError & { _unauthorizedHandled?: boolean },\n    opts?: { skipErrorHandler?: boolean },\n  ) => {\n    // 跳过错误处理\n    if (opts?.skipErrorHandler) throw error;\n\n    // 已在响应拦截器中处理的未授权错误，跳过重复处理\n    if (error._unauthorizedHandled) return;\n\n    // 业务错误\n    if (error.name === 'BizError' && error.info) {\n      const errorInfo = error.info;\n      const { errorMessage, errorCode, showType } = errorInfo;\n\n      // 检查未授权\n      if (isUnauthorized(errorCode)) {\n        onUnauthorized();\n        return;\n      }\n\n      // 自定义业务错误处理\n      if (onBizError) {\n        onBizError(errorInfo);\n        return;\n      }\n\n      // 默认: 按 showType 显示错误\n      if (onError && errorMessage) {\n        onError(errorMessage, showType as ErrorShowType);\n      }\n      return;\n    }\n\n    // HTTP 响应错误\n    if (error.response) {\n      const status = error.response.status;\n\n      if (isUnauthorized(status)) {\n        onUnauthorized();\n        return;\n      }\n\n      onError?.(`Request failed (${status})`);\n      return;\n    }\n\n    // 请求已发送但无响应\n    if (error.request) {\n      onError?.('No response from server');\n      return;\n    }\n\n    // 其他错误\n    onError?.(error.message || 'Request failed');\n  };\n}\n","/**\n * 请求/响应拦截器工厂\n */\n\nimport { decryptResponseData, encryptRequestData } from '../crypto/factory';\nimport { isExcludedPath } from '../crypto/path-matcher';\nimport {\n  DEFAULT_ENCRYPT_HEADER,\n  DEFAULT_SIGNATURE_HEADER,\n  DEFAULT_TIMESTAMP_HEADER,\n} from './constants';\nimport type { AuthInterceptorConfig, EncryptInterceptorConfig } from './types';\n\nfunction isBinaryPayload(data: unknown): boolean {\n  return (\n    (typeof FormData !== 'undefined' && data instanceof FormData) ||\n    (typeof Blob !== 'undefined' && data instanceof Blob) ||\n    (typeof File !== 'undefined' && data instanceof File)\n  );\n}\n\n/**\n * 创建认证请求拦截器\n *\n * 自动为请求添加认证 token 和额外的 headers。\n *\n * @param config - 认证配置\n * @returns UmiJS 请求拦截器函数\n */\nexport function createAuthInterceptor(config: AuthInterceptorConfig) {\n  const {\n    tokenKey,\n    headerName,\n    headerPrefix = '',\n    excludePaths = [],\n    extraHeaders = {},\n  } = config;\n\n  return (url: string, options: Record<string, unknown>) => {\n    const headers: Record<string, string> = {\n      ...((options.headers as Record<string, string>) || {}),\n    };\n\n    // 添加 token（try-catch 防止 SSR/隐私模式下 localStorage 不可用）\n    let token: string | null = null;\n    try {\n      token = localStorage.getItem(tokenKey);\n    } catch {\n      // localStorage 不可用（SSR、隐私模式等），跳过 token 注入\n    }\n    if (token) {\n      const isExcluded =\n        excludePaths.length > 0 && isExcludedPath(url, excludePaths);\n\n      if (!isExcluded) {\n        headers[headerName] = `${headerPrefix}${token}`;\n      }\n    }\n\n    // 添加额外请求头\n    for (const [key, value] of Object.entries(extraHeaders)) {\n      if (value !== undefined && value !== null) {\n        headers[key] = String(value);\n      }\n    }\n\n    return {\n      url,\n      options: { ...options, headers },\n    };\n  };\n}\n\n/**\n * 创建加密请求拦截器\n *\n * 自动加密请求体，添加加密标识、时间戳和 HMAC 签名请求头。\n *\n * @param config - 加密配置\n * @returns UmiJS 请求拦截器函数（异步）\n */\nexport function createEncryptRequestInterceptor(\n  config: EncryptInterceptorConfig,\n) {\n  const {\n    enabled,\n    strategy,\n    excludePaths = [],\n    methods = ['POST', 'PUT'],\n    overridableMethods = ['GET', 'DELETE'],\n    encryptHeader = DEFAULT_ENCRYPT_HEADER,\n    timestampHeader = DEFAULT_TIMESTAMP_HEADER,\n    signatureHeader = DEFAULT_SIGNATURE_HEADER,\n  } = config;\n\n  const METHOD_OVERRIDE_HEADER = 'X-HTTP-Method-Override';\n\n  return async (url: string, options: Record<string, unknown>) => {\n    if (!enabled) return { url, options };\n\n    const nextOptions: Record<string, unknown> = { ...options };\n    const headers: Record<string, string> = {\n      ...((nextOptions.headers as Record<string, string>) || {}),\n    };\n\n    // 检查路径排除\n    if (excludePaths.length > 0 && isExcludedPath(url, excludePaths)) {\n      return { url, options };\n    }\n\n    // 跳过文件上传类型\n    if (isBinaryPayload(nextOptions.data)) {\n      return { url, options: { ...nextOptions, headers } };\n    }\n\n    let method = ((nextOptions.method as string) || '').toUpperCase();\n\n    // 可覆盖方法（如 GET/DELETE）携带 params 时，转为 POST+data 以便加密\n    if (\n      overridableMethods.includes(method) &&\n      nextOptions.params &&\n      typeof nextOptions.params === 'object' &&\n      Object.keys(nextOptions.params as Record<string, unknown>).length > 0\n    ) {\n      headers[METHOD_OVERRIDE_HEADER] = method;\n      nextOptions.method = 'POST';\n      nextOptions.data = nextOptions.params;\n      nextOptions.params = undefined;\n      method = 'POST';\n    }\n\n    const shouldEncryptBody = methods.includes(method);\n\n    if (shouldEncryptBody) {\n      // 无 body 时补充空对象，确保后端 ApiEncryptFilter 能正确解密\n      const payload = nextOptions.data || {};\n      const { encrypted, timestamp, signature } = await encryptRequestData(\n        strategy,\n        payload,\n      );\n\n      nextOptions.data = config.wrapEncryptedBody\n        ? config.wrapEncryptedBody(encrypted)\n        : encrypted;\n      headers[encryptHeader] = 'true';\n      headers[timestampHeader] = String(timestamp);\n      if (signature) headers[signatureHeader] = signature;\n      headers['Content-Type'] = 'text/plain;charset=UTF-8';\n    }\n\n    return { url, options: { ...nextOptions, headers } };\n  };\n}\n\n/**\n * 创建解密响应拦截器\n *\n * 加密启用时 responseType:'text'，所有响应均为字符串：\n * - X-Encrypted: true → 解密\n * - 其他 → JSON.parse 还原\n */\nexport function createDecryptResponseInterceptor(\n  config: EncryptInterceptorConfig,\n) {\n  const {\n    enabled,\n    strategy,\n    excludePaths = [],\n    encryptHeader = DEFAULT_ENCRYPT_HEADER,\n    timestampHeader = DEFAULT_TIMESTAMP_HEADER,\n    signatureHeader = DEFAULT_SIGNATURE_HEADER,\n  } = config;\n\n  return async (response: Record<string, unknown>) => {\n    const getHeader = (name: string): string | null => {\n      const headers = response.headers as Record<string, string> | undefined;\n      if (!headers) return null;\n      return headers[name.toLowerCase()] ?? headers[name] ?? null;\n    };\n\n    const isResponseEncrypted = getHeader(encryptHeader) === 'true';\n\n    if (!enabled) {\n      if (isResponseEncrypted) {\n        const reqUrl =\n          ((response.config as Record<string, unknown>)?.url as string) || '';\n        console.error(\n          `[加密配置] 服务端返回了加密响应（${encryptHeader}: true），但前端加密未启用。` +\n            `请检查加密配置是否正确。URL: ${reqUrl}`,\n        );\n      }\n      return response;\n    }\n\n    const reqUrl =\n      ((response.config as Record<string, unknown>)?.url as string) || '';\n\n    if (\n      isResponseEncrypted &&\n      !(excludePaths.length > 0 && isExcludedPath(reqUrl, excludePaths))\n    ) {\n      // 加密响应：解密 Base64 字符串（responseType:'text' 确保 data 为原始字符串）\n      const encryptedString = config.unwrapEncryptedResponse\n        ? config.unwrapEncryptedResponse(response.data)\n        : String(response.data || '');\n\n      if (encryptedString) {\n        const timestamp = Number.parseInt(\n          getHeader(timestampHeader) || '0',\n          10,\n        );\n        const signature = getHeader(signatureHeader) || undefined;\n\n        response.data = await decryptResponseData(\n          strategy,\n          encryptedString,\n          timestamp || undefined,\n          { signature },\n        );\n      }\n    } else if (typeof response.data === 'string') {\n      // 非加密响应（排除路径等）：responseType:'text' 导致为字符串，手动解析为 JSON\n      try {\n        response.data = JSON.parse(response.data);\n      } catch {\n        // 非 JSON 响应，保持原样\n      }\n    }\n\n    return response;\n  };\n}\n","/**\n * 一站式请求配置工厂\n *\n * 将 auth、encrypt、error handling 整合为一个配置对象，\n * 直接用于 UmiJS request 插件。\n */\n\nimport { createUnauthorizedCodeChecker, DEFAULT_TIMEOUT } from './constants';\nimport { createErrorHandler, createErrorThrower } from './error-handler';\nimport {\n  createAuthInterceptor,\n  createDecryptResponseInterceptor,\n  createEncryptRequestInterceptor,\n} from './interceptors';\nimport type { RequestConfigOptions } from './types';\n\ntype RequestInterceptor = import('./types').RequestInterceptor;\ntype ResponseInterceptor = import('./types').ResponseInterceptor;\n\n/** 已处理的未授权错误标记接口 */\ninterface UnauthorizedError extends Error {\n  _unauthorizedHandled?: boolean;\n}\n\n/**\n * 创建完整的 UmiJS RequestConfig\n *\n * 一站式配置认证、加密、错误处理，直接导出给 UmiJS 使用。\n *\n * @param options - 配置选项\n * @returns UmiJS RequestConfig 对象\n *\n * @example\n * ```ts\n * // keel-cloud-web (无加密)\n * export const request = createRequestConfig({\n *   timeout: 10000,\n *   auth: {\n *     tokenKey: 'kc_auth_token',\n *     headerName: 'Authorization',\n *     headerPrefix: 'Bearer ',\n *   },\n *   errorConfig: {\n *     onUnauthorized: () => history.push('/login'),\n *     onError: (msg) => message.error(msg),\n *   },\n * });\n * ```\n */\nexport function createRequestConfig(options: RequestConfigOptions) {\n  const {\n    baseURL,\n    timeout = DEFAULT_TIMEOUT,\n    responseType,\n    auth,\n    encryption,\n    requestInterceptors: customRequestInterceptors = [],\n    responseInterceptors: customResponseInterceptors = [],\n    errorConfig: errorCfg,\n  } = options;\n  const isUnauthorized = createUnauthorizedCodeChecker(\n    errorCfg.unauthorizedCodes || [],\n    errorCfg.includeDefaultUnauthorizedCodes ?? true,\n  );\n\n  // 构建请求拦截器\n  const requestInterceptors: RequestInterceptor[] = [\n    createAuthInterceptor(auth),\n  ];\n\n  if (encryption?.enabled && encryption.strategy) {\n    requestInterceptors.push(createEncryptRequestInterceptor(encryption));\n  }\n\n  requestInterceptors.push(...customRequestInterceptors);\n\n  // 响应拦截器\n  const responseInterceptors: ResponseInterceptor[] = [];\n\n  // 解密响应拦截器\n  if (encryption?.enabled && encryption.strategy) {\n    responseInterceptors.push(createDecryptResponseInterceptor(encryption));\n  }\n  responseInterceptors.push(...customResponseInterceptors);\n\n  // 业务响应拦截器: 检查未授权状态码（提前拦截，避免进入 errorThrower 再处理）\n  responseInterceptors.push((response: Record<string, unknown>) => {\n    const data = response?.data as\n      | {\n          code?: string | number;\n          errorCode?: string | number;\n        }\n      | undefined;\n\n    if (data && typeof data === 'object') {\n      const respCode = data.code ?? data.errorCode;\n      if (respCode !== undefined && isUnauthorized(respCode)) {\n        errorCfg.onUnauthorized();\n        // 添加标记，防止 errorHandler 再次调用 onUnauthorized\n        const error: UnauthorizedError = new Error(\n          `Unauthorized (${respCode})`,\n        );\n        error._unauthorizedHandled = true;\n        throw error;\n      }\n    }\n\n    return response;\n  });\n\n  // 构建配置\n  const config: Record<string, unknown> = {\n    timeout,\n    requestInterceptors,\n    responseInterceptors,\n    errorConfig: {\n      errorThrower: createErrorThrower(errorCfg.successCode),\n      errorHandler: createErrorHandler(errorCfg),\n    },\n  };\n\n  if (baseURL !== undefined) {\n    config.baseURL = baseURL;\n  }\n\n  // 加密启用时强制 responseType:'text'，阻止 axios 自动 JSON.parse，\n  // 由解密拦截器统一处理解密和 JSON 解析\n  if (encryption?.enabled && encryption.strategy) {\n    config.responseType = 'text';\n  } else if (responseType !== undefined) {\n    config.responseType = responseType;\n  }\n\n  return config;\n}\n","/**\n * CRUD Service 工厂\n *\n * 基于 @umijs/max 的 request 函数，为业务实体生成标准的\n * list / detail / create / update / delete / toggleStatus 请求方法，\n * 消除大量手写重复 service 的问题。\n */\n\nimport type { ApiResponse, PaginatedData } from '../types/api';\n\n// ===== 类型定义 =====\n\n/**\n * 请求方法\n */\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\n/**\n * 单个操作的自定义配置\n */\nexport interface OperationConfig {\n  /** HTTP 方法 */\n  method?: HttpMethod;\n  /** 路径后缀 (支持 :id 占位符) */\n  path?: string;\n  /** 额外请求配置 (如 skipEncrypt) */\n  requestOptions?: Record<string, unknown>;\n}\n\n/**\n * CRUD Service 工厂配置\n */\nexport interface CrudServiceConfig {\n  /** 分页列表 — 默认 POST /page + { pageNo, pageSize, ... } */\n  list?: OperationConfig | false;\n  /** 查询详情 — 默认 GET /:id */\n  detail?: OperationConfig | false;\n  /** 创建 — 默认 POST / */\n  create?: OperationConfig | false;\n  /** 更新 — 默认 PUT / */\n  update?: OperationConfig | false;\n  /** 删除 — 默认 DELETE /:id */\n  delete?: OperationConfig | false;\n  /** 切换状态 — 默认 PUT /:id/status */\n  toggleStatus?: OperationConfig | false;\n  /** id 字段名，默认 'id' */\n  idField?: string;\n  /**\n   * request 函数，来自 @umijs/max 的 request。\n   * 不在此包中直接 import，由调用方注入以保持零依赖。\n   */\n  request: <R>(url: string, options?: Record<string, unknown>) => Promise<R>;\n}\n\n/**\n * CRUD Service 返回类型 — 按配置动态生成\n */\nexport interface CrudServiceMethods<\n  T = Record<string, unknown>,\n  CreateDTO = Partial<T>,\n  UpdateDTO = Partial<T>,\n  ListParams = Record<string, unknown>,\n> {\n  /** 分页列表 */\n  list: (params: ListParams) => Promise<ApiResponse<PaginatedData<T>>>;\n  /** 查询详情 */\n  detail: (id: string | number) => Promise<ApiResponse<T>>;\n  /** 创建 */\n  create: (data: CreateDTO) => Promise<ApiResponse<T>>;\n  /** 更新 */\n  update: (data: UpdateDTO) => Promise<ApiResponse<T>>;\n  /** 删除 */\n  remove: (id: string | number) => Promise<ApiResponse<unknown>>;\n  /** 切换状态 */\n  toggleStatus: (\n    id: string | number,\n    status: string | number | boolean,\n  ) => Promise<ApiResponse<unknown>>;\n  /** 保存 (create if no id, update if has id; 可通过 isNew 显式指定) */\n  save: (\n    data: CreateDTO | UpdateDTO,\n    isNew?: boolean,\n  ) => Promise<ApiResponse<T>>;\n}\n\n// ===== 内部工具 =====\n\n/**\n * 替换路径中的 :id 占位符\n */\nfunction resolvePath(\n  base: string,\n  pathSuffix: string,\n  id?: string | number,\n): string {\n  const fullPath = pathSuffix ? `${base}${pathSuffix}` : base;\n  if (id !== undefined) {\n    return fullPath.replace(':id', String(id));\n  }\n  return fullPath;\n}\n\n/**\n * 根据 HTTP 方法决定参数放在 params 还是 data\n */\nfunction buildRequestOptions(\n  method: HttpMethod,\n  payload?: unknown,\n  extra?: Record<string, unknown>,\n): Record<string, unknown> {\n  const options: Record<string, unknown> = { method, ...extra };\n  if (payload === undefined || payload === null) return options;\n\n  if (method === 'GET' || method === 'DELETE') {\n    options.params = payload;\n  } else {\n    options.data = payload;\n  }\n  return options;\n}\n\n// ===== 默认配置 =====\n\nconst DEFAULT_OPS: Record<string, { method: HttpMethod; path: string }> = {\n  list: { method: 'POST', path: '/page' },\n  detail: { method: 'GET', path: '/:id' },\n  create: { method: 'POST', path: '' },\n  update: { method: 'PUT', path: '' },\n  delete: { method: 'DELETE', path: '/:id' },\n  toggleStatus: { method: 'PUT', path: '/:id/status' },\n};\n\n// ===== 工厂函数 =====\n\n/**\n * 创建 CRUD Service\n *\n * @param basePath - API 基础路径，如 '/kc-api/users'\n * @param config - 配置项\n * @returns CRUD 方法集合\n *\n * @example\n * ```ts\n * import { request } from '@umijs/max';\n *\n * const userService = createCrudService<User>('/kc-api/users', {\n *   request,\n *   list: { method: 'POST', path: '/page' },\n *   detail: { method: 'GET', path: '/:id' },\n *   create: { method: 'POST' },\n *   update: { method: 'PUT' },\n *   delete: { method: 'DELETE', path: '/:id' },\n * });\n *\n * // 使用\n * const res = await userService.list({ pageNo: 1, pageSize: 10 });\n * const user = await userService.detail(1);\n * await userService.create({ name: 'test' });\n * await userService.save({ id: 1, name: 'updated' }); // 自动选择 update\n * await userService.remove(1);\n * ```\n *\n * @example\n * ```ts\n * // 禁用不需要的操作\n * const readonlyService = createCrudService<Article>('/api/articles', {\n *   request,\n *   create: false,\n *   update: false,\n *   delete: false,\n *   toggleStatus: false,\n * });\n * ```\n */\nexport function createCrudService<\n  T = Record<string, unknown>,\n  CreateDTO = Partial<T>,\n  UpdateDTO = Partial<T>,\n  ListParams = Record<string, unknown>,\n>(\n  basePath: string,\n  config: CrudServiceConfig,\n): CrudServiceMethods<T, CreateDTO, UpdateDTO, ListParams> {\n  const { request: requestFn, idField = 'id' } = config;\n\n  // 获取某个操作的配置 (合并默认 + 自定义)\n  function getOpConfig(opName: string): {\n    method: HttpMethod;\n    path: string;\n    requestOptions?: Record<string, unknown>;\n  } | null {\n    const userCfg = config[opName as keyof typeof config];\n    if (userCfg === false) return null;\n\n    const defaultCfg = DEFAULT_OPS[opName];\n    if (!defaultCfg) return null;\n\n    if (\n      typeof userCfg === 'object' &&\n      userCfg !== null &&\n      !Array.isArray(userCfg)\n    ) {\n      const opCfg = userCfg as OperationConfig;\n      return {\n        method: opCfg.method ?? defaultCfg.method,\n        path: opCfg.path ?? defaultCfg.path,\n        requestOptions: opCfg.requestOptions,\n      };\n    }\n\n    return { ...defaultCfg };\n  }\n\n  // --- list ---\n  const listOp = getOpConfig('list');\n  const list = async (params: ListParams) => {\n    if (!listOp) throw new Error('list operation is disabled');\n    const url = resolvePath(basePath, listOp.path);\n    return requestFn<ApiResponse<PaginatedData<T>>>(\n      url,\n      buildRequestOptions(listOp.method, params, listOp.requestOptions),\n    );\n  };\n\n  // --- detail ---\n  const detailOp = getOpConfig('detail');\n  const detail = async (id: string | number) => {\n    if (!detailOp) throw new Error('detail operation is disabled');\n    const url = resolvePath(basePath, detailOp.path, id);\n    return requestFn<ApiResponse<T>>(\n      url,\n      buildRequestOptions(detailOp.method, undefined, detailOp.requestOptions),\n    );\n  };\n\n  // --- create ---\n  const createOp = getOpConfig('create');\n  const create = async (data: CreateDTO) => {\n    if (!createOp) throw new Error('create operation is disabled');\n    const url = resolvePath(basePath, createOp.path);\n    return requestFn<ApiResponse<T>>(\n      url,\n      buildRequestOptions(createOp.method, data, createOp.requestOptions),\n    );\n  };\n\n  // --- update ---\n  const updateOp = getOpConfig('update');\n  const update = async (data: UpdateDTO) => {\n    if (!updateOp) throw new Error('update operation is disabled');\n\n    let payload: unknown = data;\n    let id: string | number | undefined;\n\n    // 当路径包含 :id 时，从 data 中提取 id 并从 payload 中移除\n    if (updateOp.path.includes(':id')) {\n      const record = data as Record<string, unknown>;\n      id = record[idField] as string | number;\n      const { [idField]: _, ...rest } = record;\n      payload = rest;\n    }\n\n    const url = resolvePath(basePath, updateOp.path, id);\n    return requestFn<ApiResponse<T>>(\n      url,\n      buildRequestOptions(updateOp.method, payload, updateOp.requestOptions),\n    );\n  };\n\n  // --- delete ---\n  const deleteOp = getOpConfig('delete');\n  const remove = async (id: string | number) => {\n    if (!deleteOp) throw new Error('delete operation is disabled');\n    const url = resolvePath(basePath, deleteOp.path, id);\n    return requestFn<ApiResponse<unknown>>(\n      url,\n      buildRequestOptions(deleteOp.method, undefined, deleteOp.requestOptions),\n    );\n  };\n\n  // --- toggleStatus ---\n  const toggleStatusOp = getOpConfig('toggleStatus');\n  const toggleStatus = async (\n    id: string | number,\n    status: string | number | boolean,\n  ) => {\n    if (!toggleStatusOp) throw new Error('toggleStatus operation is disabled');\n    const url = resolvePath(basePath, toggleStatusOp.path, id);\n    return requestFn<ApiResponse<unknown>>(\n      url,\n      buildRequestOptions(\n        toggleStatusOp.method,\n        { status },\n        toggleStatusOp.requestOptions,\n      ),\n    );\n  };\n\n  // --- save (auto create/update) ---\n  const save = async (data: CreateDTO | UpdateDTO, isNew?: boolean) => {\n    // 显式指定时直接使用，无需推断\n    if (isNew === true) return create(data as CreateDTO);\n    if (isNew === false) return update(data as UpdateDTO);\n\n    // 自动推断：检查 idField 是否有有效值（注意 0 是合法 id）\n    const record = data as Record<string, unknown>;\n    const idValue = record[idField];\n    const hasId = idValue !== undefined && idValue !== null && idValue !== '';\n    if (hasId) {\n      return update(data as UpdateDTO);\n    }\n    return create(data as CreateDTO);\n  };\n\n  return {\n    list,\n    detail,\n    create,\n    update,\n    remove,\n    toggleStatus,\n    save,\n  };\n}\n\n/**\n * 快速创建标准 CRUD Service 的简化版本\n *\n * 适用于完全遵循标准 RESTful 约定的场景。\n *\n * @example\n * ```ts\n * const userService = createStandardCrudService<User>(request, '/kc-api/users');\n * const articleService = createStandardCrudService<Article>(request, '/api/articles', {\n *   list: { path: '/page' },\n * });\n * ```\n */\nexport function createStandardCrudService<T = Record<string, unknown>>(\n  requestFn: <R>(url: string, options?: Record<string, unknown>) => Promise<R>,\n  basePath: string,\n  overrides?: Partial<\n    Pick<\n      CrudServiceConfig,\n      | 'list'\n      | 'detail'\n      | 'create'\n      | 'update'\n      | 'delete'\n      | 'toggleStatus'\n      | 'idField'\n    >\n  >,\n): CrudServiceMethods<T, Partial<T>, Partial<T>, Record<string, unknown>> {\n  return createCrudService<T>(basePath, {\n    request: requestFn,\n    ...overrides,\n  });\n}\n","/**\n * 文件服务工厂\n *\n * 为文件上传/下载/删除生成标准化的服务方法。\n *\n */\n\nimport type { ApiResponse } from '../types/api';\n\n// ===== 类型定义 =====\n\n/**\n * 上传参数\n */\nexport interface UploadParams {\n  /** 文件 */\n  file: File;\n  /** 文件模块/业务类型 */\n  moduleType?: string;\n  /** 业务 ID */\n  businessId?: string | number;\n  /** 文件类型标识 */\n  fileType?: string;\n  /** 自定义路径 */\n  customPath?: string;\n  /** 额外参数 */\n  extra?: Record<string, string | number>;\n}\n\n/**\n * 上传结果\n */\nexport interface UploadResult {\n  /** 文件访问 URL */\n  url: string;\n  /** 文件名 */\n  name?: string;\n  /** 文件大小 (bytes) */\n  size?: number;\n  /** 文件类型 */\n  type?: string;\n  /** 服务器返回的文件 ID */\n  fileId?: string | number;\n  /** 原始响应数据 */\n  [key: string]: unknown;\n}\n\n/**\n * 文件服务配置\n */\nexport interface FileServiceConfig {\n  /**\n   * request 函数，来自 @umijs/max\n   */\n  request: <R>(url: string, options?: Record<string, unknown>) => Promise<R>;\n\n  /** 上传配置 */\n  upload?: {\n    /** 上传路径, 默认 '/upload' */\n    path?: string;\n    /** HTTP 方法, 默认 'POST' */\n    method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n    /** 额外请求配置 (如 skipEncrypt: true) */\n    requestOptions?: Record<string, unknown>;\n  };\n\n  /** 删除配置 */\n  delete?: {\n    /** 删除路径, 默认 '/' */\n    path?: string;\n    /** HTTP 方法, 默认 'DELETE' */\n    method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n    /** 删除参数名 (放在 query 中), 默认 'fileUrl' */\n    paramName?: string;\n    /** 额外请求配置 (如 skipEncrypt: true) */\n    requestOptions?: Record<string, unknown>;\n  };\n\n  /** 下载配置 */\n  download?: {\n    /** 下载路径 (支持 :id 占位符), 默认 '/download/:id' */\n    path?: string;\n    /** HTTP 方法, 默认 'GET' */\n    method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n    /** 额外请求配置 (如 headers) */\n    requestOptions?: Record<string, unknown>;\n  };\n}\n\n/**\n * 文件服务方法\n */\nexport interface FileServiceMethods {\n  /** 上传文件 */\n  upload: (params: UploadParams) => Promise<ApiResponse<UploadResult>>;\n  /** 删除文件 */\n  remove: (fileUrl: string) => Promise<ApiResponse<unknown>>;\n  /** 下载文件 (返回 Blob) */\n  download: (fileId: string | number) => Promise<Blob>;\n}\n\n// ===== 工厂函数 =====\n\n/**\n * 创建文件服务\n *\n * @param basePath - 文件 API 基础路径, 如 '/api/files'\n * @param config - 配置项\n * @returns 文件服务方法\n *\n * @example\n * ```ts\n * import { request } from '@umijs/max';\n *\n * const fileService = createFileService('/api/files', {\n *   request,\n *   upload: { path: '/upload', requestOptions: { skipEncrypt: true } },\n *   delete: { path: '/', paramName: 'fileUrl' },\n *   download: { path: '/download/:id' },\n * });\n *\n * // 上传\n * const res = await fileService.upload({\n *   file: selectedFile,\n *   moduleType: 'avatar',\n *   businessId: userId,\n * });\n *\n * // 删除\n * await fileService.remove('https://cdn.example.com/files/abc.jpg');\n *\n * // 下载\n * const blob = await fileService.download('file-123');\n * ```\n */\nexport function createFileService(\n  basePath: string,\n  config: FileServiceConfig,\n): FileServiceMethods {\n  const { request: requestFn } = config;\n\n  // --- upload ---\n  const uploadCfg = config.upload ?? {};\n  const upload = async (\n    params: UploadParams,\n  ): Promise<ApiResponse<UploadResult>> => {\n    const formData = new FormData();\n    formData.append('file', params.file);\n\n    if (params.moduleType) formData.append('moduleType', params.moduleType);\n    if (params.businessId != null)\n      formData.append('businessId', String(params.businessId));\n    if (params.fileType) formData.append('fileType', params.fileType);\n    if (params.customPath) formData.append('customPath', params.customPath);\n\n    if (params.extra) {\n      for (const [key, val] of Object.entries(params.extra)) {\n        formData.append(key, String(val));\n      }\n    }\n\n    const url = `${basePath}${uploadCfg.path ?? '/upload'}`;\n    return requestFn<ApiResponse<UploadResult>>(url, {\n      method: uploadCfg.method ?? 'POST',\n      requestType: 'form',\n      data: formData,\n      ...uploadCfg.requestOptions,\n    });\n  };\n\n  // --- delete ---\n  const deleteCfg = config.delete ?? {};\n  const remove = async (fileUrl: string): Promise<ApiResponse<unknown>> => {\n    const url = `${basePath}${deleteCfg.path ?? '/'}`;\n    const paramName = deleteCfg.paramName ?? 'fileUrl';\n    return requestFn<ApiResponse<unknown>>(url, {\n      method: deleteCfg.method ?? 'DELETE',\n      params: { [paramName]: fileUrl },\n      ...deleteCfg.requestOptions,\n    });\n  };\n\n  // --- download ---\n  const downloadCfg = config.download ?? {};\n  const download = async (fileId: string | number): Promise<Blob> => {\n    const pathTemplate = downloadCfg.path ?? '/download/:id';\n    const url = `${basePath}${pathTemplate.replace(':id', String(fileId))}`;\n    return requestFn<Blob>(url, {\n      method: downloadCfg.method ?? 'GET',\n      responseType: 'blob',\n      ...downloadCfg.requestOptions,\n    });\n  };\n\n  return { upload, remove, download };\n}\n"]}