UNPKG

@cloudcome/utils-uni

Version:
1 lines 9 kB
{"version":3,"file":"client.mjs","sources":["../src/client.ts"],"sourcesContent":["import type { CloudMethodOutput, UniError } from '@/cloud';\nimport type { ClientDatabaseOutput } from '@/database';\nimport { isFunction } from '@cloudcome/utils-core/type';\nimport type { AnyArray, AnyFunction } from '@cloudcome/utils-core/types';\nimport {\n type UseRequestOptions,\n type UseRequestOutput,\n type UseRequestOutputFilled,\n useRequest,\n} from '@cloudcome/utils-vue/request';\nimport { parseCloudMethodOutput } from './_helpers';\n\ntype _ImportObject = UniCloudNamespace.UniCloud['importObject'];\ntype _ImportObjectArgs = Parameters<_ImportObject>;\ntype _ImportObjectOptions = _ImportObjectArgs[1];\n\nexport type CreateUseCloudObjectOptions = _ImportObjectOptions & {\n /**\n * 模拟云对象,用于单元测试\n * @private\n */\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n _mockServer?: any;\n\n /**\n * 回退错误信息\n * @default '请求失败'\n */\n fallbackErrorMessage?: string;\n\n /**\n * 请求开始前的回调函数\n */\n onBefore?: () => unknown;\n\n /**\n * 请求成功后的回调函数\n */\n onSuccess?: () => unknown;\n\n /**\n * 请求失败时的回调函数\n * @param err 错误信息\n */\n onError?: (err: UniError) => unknown;\n\n /**\n * 请求完成后的回调函数(无论成功或失败都会执行)\n */\n onAfter?: () => unknown;\n};\n\n/**\n * 云对象请求函数类型定义\n * @template F 云对象方法函数类型\n * @param input 云对象方法的参数数组\n * @returns 返回云对象方法执行结果的Promise\n */\nexport type CloudObjectRequest = <F extends AnyFunction>(\n ...input: Parameters<F>\n) => Promise<CloudMethodOutput<ReturnType<F>>>;\n\n/**\n * 用于调用云对象方法的配置选项类型定义\n * @template I 输入参数类型数组\n * @template O 输出结果类型\n */\nexport type UseCloudMethodOptions<I extends AnyArray, O> = Omit<UseRequestOptions<I, O>, 'onError'> & {\n /**\n * 请求发生错误时的回调函数\n * @param err 错误信息\n * @param inputs 请求输入参数\n */\n onError?: (err: UniError, ...inputs: I) => unknown;\n\n /**\n * 是否显示加载状态\n * @default false\n */\n showLoading?: boolean;\n\n /**\n * 是否显示错误信息\n * @default false\n */\n showError?: boolean;\n};\n\n/**\n * 用于调用云对象方法的hook函数类型定义\n * @template I 输入参数类型数组\n * @template O 输出结果类型\n */\nexport type UseCloudMethod = {\n /**\n * 重载签名:当提供 placeholder 选项时,返回包含初始值的输出类型\n * @param method 云对象方法名\n * @param caller 调用云对象方法的函数\n * @param options 包含 placeholder 的请求配置选项\n * @returns 返回包含初始值的请求输出\n */\n <I extends AnyArray, O>(\n method: string | ((...inputs: I) => string),\n caller: (request: CloudObjectRequest, ...inputs: I) => Promise<CloudMethodOutput<O>>,\n options: Omit<UseCloudMethodOptions<I, O>, 'placeholder'> & { placeholder: () => O },\n ): UseRequestOutputFilled<I, O>;\n\n /**\n * 重载签名:当不提供 placeholder 选项时,返回普通输出类型\n * @param method 云对象方法名\n * @param caller 调用云对象方法的函数\n * @param options 可选的请求配置选项\n * @returns 返回普通的请求输出\n */\n <I extends AnyArray, O>(\n method: string | ((...inputs: I) => string),\n caller: (request: CloudObjectRequest, ...inputs: I) => Promise<CloudMethodOutput<O>>,\n options?: UseCloudMethodOptions<I, O>,\n ): UseRequestOutput<I, O>;\n};\n\n/**\n * 导入云对象并创建一个用于调用云对象的hook\n * @param objectName 云对象名称\n * @param importOptions 配置选项,包含模拟服务器、回退错误信息等\n * @returns 返回一个可用于调用云对象方法的hook函数\n */\nexport function importCloudObject(objectName: _ImportObjectArgs[0], importOptions?: CreateUseCloudObjectOptions) {\n const fallbackErrorMessage = importOptions?.fallbackErrorMessage || '请求失败';\n const server = importOptions?._mockServer || uniCloud.importObject(objectName, importOptions);\n\n /**\n * 用于调用云对象方法的hook函数\n * @template I 输入参数类型\n * @template O 输出结果类型\n * @param method 云对象方法名\n * @param caller 调用云对象的函数\n * @param options 配置选项,包含请求相关的配置\n * @returns 返回一个请求hook,用于处理云对象调用\n */\n const useCloudMethod: UseCloudMethod = (method, caller, options) => {\n // 使用请求hook处理云对象调用\n return useRequest(\n async (...inputs) => {\n const methodName = isFunction(method) ? method(...inputs) : method;\n const request = server[methodName];\n const output = await caller(request, ...inputs);\n return parseCloudMethodOutput(output, fallbackErrorMessage);\n },\n {\n ...options,\n onBefore(...inputs) {\n if (options?.showLoading) uni.showLoading({ title: '', mask: true });\n\n importOptions?.onBefore?.();\n options?.onBefore?.(...inputs);\n },\n onSuccess(data, ...inputs) {\n importOptions?.onSuccess?.();\n options?.onSuccess?.(data, ...inputs);\n },\n onError(err, ...inputs) {\n importOptions?.onError?.(err as UniError);\n options?.onError?.(err as UniError, ...inputs);\n\n if (options?.showError) {\n // 加延迟是尽量保证在 loading 隐藏后显示\n setTimeout(() => {\n uni.showToast({ title: (err as UniError).message, icon: 'none', duration: 3000, mask: false });\n });\n }\n },\n onAfter(...inputs) {\n if (options?.showLoading) uni.hideLoading();\n\n importOptions?.onAfter?.();\n options?.onAfter?.(...inputs);\n },\n },\n );\n };\n\n return useCloudMethod;\n}\n\nexport type UseDatabaseOptions<I extends AnyArray, O> = UseRequestOptions<I, O> & {\n /**\n * 模拟数据库,用于单元测试\n */\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n _mockDatabase?: any;\n};\n\n/**\n * 创建一个用于调用云数据库的hook\n * @param caller 调用云数据库的函数,接收数据库实例和输入参数,返回Promise\n * @param options 配置选项\n * @returns 返回一个请求hook,用于处理云数据库调用\n */\nexport function useDatabase<I extends AnyArray, O>(\n caller: (db: UniCloud.Database, ...inputs: I) => Promise<ClientDatabaseOutput<O>>,\n options: Omit<UseDatabaseOptions<I, O>, 'placeholder'> & { placeholder: () => O },\n): UseRequestOutputFilled<I, O>;\nexport function useDatabase<I extends AnyArray, O>(\n caller: (db: UniCloud.Database, ...inputs: I) => Promise<ClientDatabaseOutput<O>>,\n options?: UseDatabaseOptions<I, O>,\n): UseRequestOutput<I, O>;\nexport function useDatabase<I extends AnyArray, O>(\n caller: (db: UniCloud.Database, ...inputs: I) => Promise<ClientDatabaseOutput<O>>,\n options?: UseDatabaseOptions<I, O>,\n): UseRequestOutput<I, O> {\n // 获取数据库实例,优先使用模拟数据库(用于测试),否则使用uniCloud数据库\n const db = options?._mockDatabase || uniCloud.database();\n return useRequest(async (...inputs: I) => {\n const { result } = await caller(db, ...inputs);\n if (!result.errCode) return result;\n throw new Error(result.errMsg || '请求失败');\n }, options);\n}\n\nexport { parseCloudMethodOutput } from './_helpers';\nexport type { UniError } from './_types';\n"],"names":[],"mappings":";;;AA+HgB,SAAA,kBAAkB,YAAkC,eAA6C;AACzG,QAAA,uBAAuB,eAAe,wBAAwB;AACpE,QAAM,SAAS,eAAe,eAAe,SAAS,aAAa,YAAY,aAAa;AAW5F,QAAM,iBAAiC,CAAC,QAAQ,QAAQ,YAAY;AAE3D,WAAA;AAAA,MACL,UAAU,WAAW;AACnB,cAAM,aAAa,WAAW,MAAM,IAAI,OAAO,GAAG,MAAM,IAAI;AACtD,cAAA,UAAU,OAAO,UAAU;AACjC,cAAM,SAAS,MAAM,OAAO,SAAS,GAAG,MAAM;AACvC,eAAA,uBAAuB,QAAQ,oBAAoB;AAAA,MAC5D;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,YAAY,QAAQ;AACd,cAAA,SAAS,YAAiB,KAAA,YAAY,EAAE,OAAO,IAAI,MAAM,MAAM;AAEnE,yBAAe,WAAW;AACjB,mBAAA,WAAW,GAAG,MAAM;AAAA,QAC/B;AAAA,QACA,UAAU,SAAS,QAAQ;AACzB,yBAAe,YAAY;AAClB,mBAAA,YAAY,MAAM,GAAG,MAAM;AAAA,QACtC;AAAA,QACA,QAAQ,QAAQ,QAAQ;AACtB,yBAAe,UAAU,GAAe;AAC/B,mBAAA,UAAU,KAAiB,GAAG,MAAM;AAE7C,cAAI,SAAS,WAAW;AAEtB,uBAAW,MAAM;AACX,kBAAA,UAAU,EAAE,OAAQ,IAAiB,SAAS,MAAM,QAAQ,UAAU,KAAM,MAAM,MAAA,CAAO;AAAA,YAAA,CAC9F;AAAA,UAAA;AAAA,QAEL;AAAA,QACA,WAAW,QAAQ;AACb,cAAA,SAAS,YAAa,KAAI,YAAY;AAE1C,yBAAe,UAAU;AAChB,mBAAA,UAAU,GAAG,MAAM;AAAA,QAAA;AAAA,MAC9B;AAAA,IAEJ;AAAA,EACF;AAEO,SAAA;AACT;AAwBgB,SAAA,YACd,QACA,SACwB;AAExB,QAAM,KAAK,SAAS,iBAAiB,SAAS,SAAS;AAChD,SAAA,WAAW,UAAU,WAAc;AACxC,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,IAAI,GAAG,MAAM;AACzC,QAAA,CAAC,OAAO,QAAgB,QAAA;AAC5B,UAAM,IAAI,MAAM,OAAO,UAAU,MAAM;AAAA,KACtC,OAAO;AACZ;"}