{"version":3,"file":"index.mjs","sources":["../src/utils/env.ts","../src/base/client.ts","../src/base/setup.ts","../src/utils/logger.ts","../src/utils/errorHandler.ts","../src/utils/useFiles.ts","../src/services/auth.action.ts","../src/services/product.action.ts","../src/services/profile.action.ts","../src/services/user.action.ts","../src/index.ts"],"sourcesContent":["/**\n * 安全获取环境变量\n * @param key 环境变量键名\n * @param defaultValue 可选默认值\n * @returns 环境变量值或默认值\n * @throws 当没有默认值且变量未设置时抛出错误\n */\nexport function getEnvVar(key: string, defaultValue?: string): string {\n  // 浏览器环境 (Vite)\n  if (typeof import.meta !== \"undefined\" && import.meta.env?.[key]) {\n    return (import.meta.env[key] as string) || defaultValue!;\n  }\n\n  // Node.js 环境 (处理SSR场景)\n  if (typeof process !== \"undefined\" && process.env?.[key]) {\n    return process.env[key] || defaultValue!;\n  }\n\n  if (defaultValue !== undefined) return defaultValue;\n\n  throw new Error(`[Config Error] 必需环境变量未配置: ${key}`);\n}\n\n/**\n * 验证必需环境变量\n */\nexport function validateEnvVars(requiredVars: string[]) {\n  requiredVars.forEach(key => {\n    try {\n      getEnvVar(key);\n    } catch (err: any) {\n      console.warn(`[Env Warning] ${err.message}`);\n    }\n  });\n}\n","import PocketBase from \"pocketbase\";\nimport { getEnvVar } from \"../utils/env\";\n\n// 单例管理\nlet globalInstance: PocketBase | null = null;\nlet customInstance: PocketBase | null = null;\n\nfunction createPBClient(baseUrl: string): PocketBase {\n  return new PocketBase(baseUrl);\n}\n\nfunction initGlobalInstance(): PocketBase {\n  const baseUrl = getEnvVar(\"VITE_POCKETBASE_URL\", \"http://localhost:8090\");\n  globalInstance = createPBClient(baseUrl);\n  return globalInstance;\n}\n\n/**\n * 获取或创建 PocketBase 客户端\n * @param options 配置选项\n *   - url: 指定服务地址创建新实例\n *   - instance: 直接注入实例\n *   - override: 是否强制覆盖现有实例 (默认false)\n */\nexport function usePBClient(options?: {\n  url?: string;\n  instance?: PocketBase;\n  override?: boolean;\n}): PocketBase {\n  // 强制重置实例\n  if (options?.override) {\n    if (options.instance) {\n      customInstance = options.instance;\n      return customInstance;\n    }\n    if (options.url) {\n      customInstance = createPBClient(options.url);\n      return customInstance;\n    }\n    resetPBInstances();\n  }\n\n  // 1. 使用传入的实例\n  if (options?.instance) {\n    if (!customInstance || options.override !== false) {\n      customInstance = options.instance;\n    }\n    return customInstance;\n  }\n\n  // 2. 使用传入的URL\n  if (options?.url) {\n    if (!customInstance || options.override !== false) {\n      customInstance = createPBClient(options.url);\n    }\n    return customInstance;\n  }\n\n  // 3. 返回现有实例\n  if (customInstance) return customInstance;\n  if (globalInstance) return globalInstance;\n\n  // 4. 初始化默认实例\n  return initGlobalInstance();\n}\n\nexport function resetPBInstances() {\n  globalInstance = null;\n  customInstance = null;\n}\n","import { usePBClient } from \"./client\";\n\n// 导出动态集合获取函数\nconst getCollect = (name: string) => usePBClient().collection(name);\n\n// 预定义的集合实例\nconst filesCollect = getCollect(\"files\");\nconst productCollect = getCollect(\"products\");\nconst profileCollect = getCollect(\"profile\");\n\n// 内置\nconst userCollect = getCollect(\"users\");\nconst superusersCollect = getCollect(\"_superusers\");\n\nexport {\n  getCollect,\n  filesCollect,\n  productCollect,\n  profileCollect,\n  superusersCollect,\n  userCollect,\n};\n","// utils/logger.ts\nexport class Logger {\n  private enableConsole: boolean;\n\n  constructor(enableConsole?: boolean) {\n    // 默认: 非生产环境输出日志，生产环境不输出\n    this.enableConsole =\n      typeof enableConsole === \"boolean\"\n        ? enableConsole\n        : process.env.NODE_ENV !== \"production\";\n  }\n\n  success(message: string, data?: any) {\n    if (this.enableConsole) {\n      console.log(`✅ 成功: ${message}`, data ? JSON.stringify(data) : \"\");\n    }\n  }\n\n  error(message: string, error?: any) {\n    if (this.enableConsole) {\n      console.error(`❌ 错误: ${message}`, error ? JSON.stringify(error) : \"\");\n    }\n  }\n\n  warn(message: string, data?: any) {\n    if (this.enableConsole) {\n      console.warn(`⚠️ 警告: ${message}`, data ? JSON.stringify(data) : \"\");\n    }\n  }\n\n  info(message: string, data?: any) {\n    if (this.enableConsole) {\n      console.info(`ℹ️ 信息: ${message}`, data ? JSON.stringify(data) : \"\");\n    }\n  }\n}\n\n// 默认导出: 根据 NODE_ENV 自动判断\nexport const logger = new Logger();\n","import { logger } from \"./logger\";\n\nexport interface ApiError {\n  code: string;\n  message: string;\n  details?: Record<string, any>;\n}\n\nexport class ErrorHandler {\n  public handle(error: any): void {\n    const apiError: ApiError = this.parseError(error);\n    logger.error(apiError.message, apiError);\n  }\n\n  private parseError(error: any): ApiError {\n    if (error.response) {\n      return {\n        code: error.response.code || \"UNKNOWN_ERROR\",\n        message: error.response.message || \"未知错误\",\n        details: error.response.data,\n      };\n    }\n\n    return {\n      code: \"UNKNOWN_ERROR\",\n      message: error.message || \"发生未知错误\",\n      details: error,\n    };\n  }\n}\n\n/**\n * 封装错误处理逻辑\n * @param action 当前执行的动作描述，用于日志输出\n * @param callback 要执行的操作\n * @returns 成功返回结果，失败返回 null\n */\nexport const withErrorHandling = async <T>(\n  action: string,\n  callback: () => Promise<T>,\n): Promise<T | null> => {\n  try {\n    const result = await callback();\n    logger.success(action, result);\n    return result;\n  } catch (error: any) {\n    const message = error.response?.data?.message || error.message;\n    logger.error(action, message);\n    return null;\n  }\n};\n","import { RecordModel } from \"pocketbase\";\nimport { usePBClient } from \"../base/client\";\n\ninterface IFilesAPI {\n  /**\n   * 获取文件访问令牌\n   * @returns Promise<string> 返回文件访问令牌\n   */\n  getTokenPayload(): Promise<string>;\n  /**\n   * 获取指定 record 下文件的下载 URL\n   * @param record RecordModel 记录\n   * @param fileFiled 需要下载的文件字段\n   * @returns url 文件下载 URL\n   */\n  getAbsoluteURL(record: RecordModel, fileFiled: string): string;\n}\n\nconst getInstance = () => usePBClient();\n\nexport const useFiles: IFilesAPI = {\n  getTokenPayload: async (): Promise<string> => {\n    return await getInstance().files.getToken();\n  },\n  getAbsoluteURL: (record: RecordModel, fileFiled: string): string => {\n    return getInstance().files.getURL(record, fileFiled);\n  },\n};\n","import PocketBase, { RecordAuthResponse, RecordModel } from \"pocketbase\";\nimport { usePBClient } from \"../base/client\";\nimport { logger } from \"../utils\";\nimport { userCollect } from \"../base/setup\"; // Keep userCollect for verify function\n\nexport type Role = \"admin\" | \"user\";\n\ntype AuthType = RecordAuthResponse<RecordModel>;\ntype PromiseAuth = Promise<AuthType>;\n\nexport interface UserLogin {\n  email?: string;\n  username?: string;\n  password?: string;\n}\n\nexport interface AuthActions {\n  login: (\n    role: Role,\n    account: UserLogin,\n    clientOptions?: { url?: string; instance?: PocketBase },\n  ) => PromiseAuth;\n  logout: () => void;\n\n  refresh: (role: Role) => PromiseAuth;\n  verify: (email: string) => Promise<boolean>;\n}\n\n// 常量定义\nconst AUTH_SUCCESS = \"认证成功\";\nconst LOGOUT_SUCCESS = \"已登出\";\nconst REFRESH_SUCCESS = \"获取信息成功\";\nconst VERIFY_EMAIL = \"验证邮箱\";\n\n// 日志记录辅助函数\nconst logSuccess = (action: string, message: string, data?: any) =>\n  logger.success(`${action} ${message}`, data);\n\n// 获取 PocketBase 客户端实例\nconst getPBClient = (options?: { url?: string; instance?: PocketBase }) =>\n  usePBClient(options);\n\n// 获取正确的集合名称\nconst getCollectionName = (role: Role) =>\n  role === \"admin\" ? \"_superusers\" : \"users\";\n\n// 获取正确的标识符字段\nconst getIdentifierField = (role: Role) =>\n  role === \"admin\" ? \"email\" : \"username\";\n\n// 登录函数\nconst login = async (\n  role: Role,\n  account: UserLogin,\n  clientOptions?: { url?: string; instance?: PocketBase },\n): PromiseAuth => {\n  const { password } = account;\n  if (!password) throw new Error(\"缺少密码\");\n\n  const pb = getPBClient(clientOptions); // Use the provided client options\n  const collectionName = getCollectionName(role); // Get the collection name\n  const identifierField = getIdentifierField(role);\n  const identifier = account[identifierField];\n\n  if (!identifier)\n    throw new Error(`缺少${identifierField === \"email\" ? \"邮箱\" : \"用户名\"}`);\n\n  // Use the specific PocketBase instance for authentication\n  const authData = await pb\n    .collection(collectionName)\n    .authWithPassword(identifier, password);\n  logSuccess(role, AUTH_SUCCESS);\n  return authData;\n};\n\n// 登出函数\nconst logout = (): void => {\n  const pb = getPBClient();\n  if (pb.authStore.isValid) {\n    pb.authStore.clear();\n  }\n  logSuccess(\"\", LOGOUT_SUCCESS);\n};\n\n// 刷新认证信息函数\nconst refresh = async (\n  role: Role,\n  clientOptions?: { url?: string; instance?: PocketBase },\n): PromiseAuth => {\n  const pb = getPBClient(clientOptions);\n  const collectionName = getCollectionName(role);\n  const data = await pb.collection(collectionName).authRefresh();\n  logSuccess(role, REFRESH_SUCCESS, data);\n  return data;\n};\n\n// 邮箱验证函数\nconst verify = async (email: string): Promise<boolean> => {\n  const result = await userCollect.requestVerification(email);\n  logSuccess(email, VERIFY_EMAIL);\n  return result;\n};\n\n// 实现接口\nexport const useAuth: AuthActions = {\n  login,\n  logout,\n  refresh,\n  verify,\n};\n","import { productCollect } from \"../base/setup\";\nimport { Product } from \"../types\";\nimport { logger, withErrorHandling } from \"../utils\";\n\nfunction toProduct(record: any): Product {\n  return {\n    id: record.id,\n    title: record.title,\n    desc: record.desc,\n    img: record.img,\n    video: record.video,\n    addtime: record.addtime,\n    created: record.created,\n    updated: record.updated,\n  };\n}\n\n/**\n * 添加产品\n */\nexport async function addProduct(\n  titleOrProduct: string | Partial<Product>,\n  desc?: string,\n  img?: string,\n  video?: string,\n): Promise<Product | null> {\n  return withErrorHandling(\"添加产品\", async () => {\n    let productData: Partial<Product>;\n    if (typeof titleOrProduct === \"object\") {\n      productData = titleOrProduct;\n    } else {\n      productData = {\n        title: titleOrProduct,\n        desc: desc || \"\",\n        img: img || \"\",\n        video: video || \"\",\n        addtime: new Date().toISOString(),\n      };\n    }\n    const result = await productCollect.create(productData);\n    logger.success(\"添加产品成功\", result);\n    return toProduct(result);\n  });\n}\n\n/**\n * 更新产品\n */\nexport async function updateProduct(\n  id: string,\n  updatedFields: Partial<Product>,\n): Promise<Product | null> {\n  return withErrorHandling(`更新产品 (ID: ${id})`, async () => {\n    const updatedRecord = await productCollect.update(id, updatedFields);\n    logger.success(`产品更新成功: ${updatedRecord.title}`);\n    return toProduct(updatedRecord);\n  });\n}\n\n/**\n * 创建 products 表结构\n */\nexport async function createProductsCollection() {\n  return withErrorHandling(\"创建 products 表\", async () => {\n    const collection = await productCollect.client.collections.create({\n      name: \"products\",\n      type: \"base\",\n      listRule: null,\n      viewRule: null,\n      createRule: \"\",\n      updateRule: \"\",\n      deleteRule: \"\",\n      fields: [\n        {\n          name: \"title\",\n          type: \"text\",\n          required: true,\n        },\n        {\n          name: \"desc\",\n          type: \"text\",\n          required: false,\n        },\n        {\n          name: \"images\",\n          type: \"file\",\n          required: false,\n          maxSelect: 5,\n          maxSize: 5 * 1024 * 1024,\n          mimeTypes: [\n            \"image/png\",\n            \"image/jpeg\",\n            \"image/gif\",\n            \"image/webp\",\n            \"application/octet-stream\",\n          ],\n          protected: true,\n        },\n        {\n          name: \"video\",\n          type: \"file\",\n          required: false,\n          maxSelect: 1,\n          maxSize: 100 * 1024 * 1024,\n          mimeTypes: [\"video/mp4\", \"video/gif\"],\n          protected: true,\n        },\n        {\n          name: \"addtime\",\n          type: \"date\",\n          required: false,\n        },\n      ],\n    });\n    logger.success(\"products 表创建成功\", collection);\n    return collection;\n  });\n}\n\n/**\n * 删除产品\n */\nexport async function deleteProduct(id: string): Promise<boolean | null> {\n  return withErrorHandling(`删除产品 (ID: ${id})`, async () => {\n    await productCollect.delete(id);\n    logger.success(`产品删除成功: ${id}`);\n    return true;\n  });\n}\n\n/**\n * 获取所有产品\n */\nexport async function getAllProducts(options?: {\n  filter?: string;\n  sort?: string;\n  expand?: string[];\n}): Promise<Product[] | null> {\n  return withErrorHandling(\"获取所有产品列表\", async () => {\n    const records = await productCollect.getFullList({\n      filter: options?.filter,\n      sort: options?.sort || undefined,\n      expand: options?.expand?.join(\",\"),\n    });\n    logger.success(`成功获取到 ${records.length} 个产品`);\n    return records.map(toProduct);\n  });\n}\n\n/**\n * 获取单个产品 by ID\n */\nexport async function getProductById(id: string): Promise<Product | null> {\n  return withErrorHandling(`获取产品详情 (ID: ${id})`, async () => {\n    const record = await productCollect.getOne(id);\n    logger.success(`成功获取产品: ${record.title}`);\n    return toProduct(record);\n  });\n}\n","import { usePBClient } from \"../base/client\";\nimport { profileCollect } from \"../base/setup\";\nimport { ProfileCollection } from \"../types\";\nimport { withErrorHandling } from \"../utils\";\n\n// 获取所有公司资料\nexport async function listAllCompanyProfiles() {\n  return withErrorHandling(\"列出所有记录\", async () => {\n    return await profileCollect.getFullList();\n  });\n}\n\n// 检查 profile 表是否存在\nexport async function checkProfileCollectionExists() {\n  return withErrorHandling(\"检查 profile 表是否存在\", async () => {\n    const pb = usePBClient();\n    const collections = await pb.collections.getFullList();\n    return !!collections.find(collection => collection.name === \"profile\");\n  });\n}\n\n// 创建 profile 表结构\nexport async function createProfileCollection() {\n  return withErrorHandling(\"创建 profile 表结构\", async () => {\n    const pb = usePBClient();\n    return await pb.collections.create({\n      name: \"profile\",\n      type: \"base\",\n      listRule: '@request.auth.id != \"\"',\n      fields: [\n        { name: \"companyName\", type: \"text\", required: true },\n        { name: \"contactEmail\", type: \"text\", required: true },\n        { name: \"contactPhone\", type: \"text\", required: true },\n        { name: \"companyAddress\", type: \"text\", required: true },\n        { name: \"allowRegistration\", type: \"bool\", required: true },\n      ],\n    });\n  });\n}\n\n// 添加公司资料\nexport function addCompanyProfile(\n  companyNameOrProfile: string | ProfileCollection,\n  contactEmail?: string,\n  contactPhone?: string,\n  companyAddress?: string,\n  allowRegistration?: boolean,\n) {\n  return withErrorHandling(\"添加公司数据\", async () => {\n    let profile: ProfileCollection;\n    if (typeof companyNameOrProfile === \"object\") {\n      profile = companyNameOrProfile;\n    } else {\n      profile = {\n        companyName: companyNameOrProfile,\n        contactEmail: contactEmail!,\n        contactPhone: contactPhone!,\n        companyAddress: companyAddress!,\n        allowRegistration: allowRegistration!,\n      };\n    }\n    return await profileCollect.create(profile);\n  });\n}\n\n// 更新公司资料\nexport async function updateCompanyProfile(\n  recordId: string,\n  updatedFields: Partial<ProfileCollection>,\n) {\n  return withErrorHandling(\"更新记录\", async () => {\n    return await profileCollect.update(recordId, updatedFields);\n  });\n}\n\n// 删除公司资料\nexport async function deleteCompanyProfile(recordId: string) {\n  return withErrorHandling(\"删除记录\", async () => {\n    return await profileCollect.delete(recordId);\n  });\n}\n","import { usePBClient } from \"../base/client\";\nimport { User, UserCreate, UserUpdate } from \"../types\";\nimport { logger, withErrorHandling } from \"../utils\";\n\nfunction toUser(record: any): User {\n  // 自动映射所有 User 字段，防止遗漏，并为 undefined 字段提供默认值\n  return {\n    collectionId: record.collectionId ?? undefined,\n    collectionName: record.collectionName ?? undefined,\n    id: record.id ?? undefined,\n    email: record.email ?? \"\",\n    name: record.name ?? undefined,\n    emailVisibility: record.emailVisibility ?? undefined,\n    avatar: record.avatar ?? undefined,\n    verified: record.verified ?? undefined,\n    created: record.created ?? undefined,\n    updated: record.updated ?? undefined,\n  };\n}\n\n/**\n * 获取所有用户列表\n * @param options 可选过滤\n */\nexport async function getAllUsers(\n  options: {\n    filter?: string;\n    sort?: string;\n    expand?: string[];\n  } = {},\n): Promise<User[] | null> {\n  return withErrorHandling(\"获取所有用户列表\", async () => {\n    const pb = usePBClient();\n    const userCollect = pb.collection(\"users\");\n    const users = await userCollect.getFullList({\n      filter: options.filter,\n      sort: options.sort || \"-created\",\n      expand: options.expand?.join(\",\"),\n    });\n    logger.success(`成功获取用户列表`, {\n      total: users.length,\n      filter: options.filter,\n    });\n    return users.map(toUser);\n  });\n}\n\n/**\n * 添加用户\n */\nexport async function addUser(user: Partial<UserCreate>): Promise<User | null> {\n  return withErrorHandling(\"添加用户\", async () => {\n    const pb = usePBClient();\n    const userCollect = pb.collection(\"users\");\n    const result = await userCollect.create(user);\n    logger.success(\"添加用户成功\", result);\n    return toUser(result);\n  });\n}\n\n/**\n * 更新用户\n */\nexport async function updateUser(\n  id: string,\n  updatedFields: Partial<UserUpdate>,\n): Promise<User | null> {\n  return withErrorHandling(\"更新用户\", async () => {\n    const pb = usePBClient();\n    const userCollect = pb.collection(\"users\");\n    const updated = await userCollect.update(id, updatedFields);\n    logger.success(\"用户更新成功\", updated);\n    return toUser(updated);\n  });\n}\n\n/**\n * 删除用户\n */\nexport async function deleteUser(id: string): Promise<boolean | null> {\n  return withErrorHandling(\"删除用户\", async () => {\n    const pb = usePBClient();\n    const userCollect = pb.collection(\"users\");\n    const deleted = await userCollect.delete(id);\n    logger.success(\"用户删除成功\", deleted);\n    return !!deleted;\n  });\n}\n","import { usePBClient } from \"./base/client\";\n\n// 基础模块导出\nexport * from \"./base/client\";\nexport * from \"./base/setup\";\n\n// 类型定义导出\nexport * from \"./types\";\n\n// 工具函数导出\nexport * from \"./utils\";\n\n// 服务模块导出\nexport * from \"./services/auth.action\";\nexport * from \"./services/product.action\";\nexport * from \"./services/profile.action\";\nexport * from \"./services/user.action\";\n\n// const pb = usePBClient();\n\nexport default usePBClient();\n"],"names":["userCollect"],"mappings":"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"}