@cloudcome/utils-uni 1.12.0 → 1.13.0

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/cloud.cjs CHANGED
@@ -11,7 +11,13 @@ function createCloudObjectError(message, code) {
11
11
  errMsg: message
12
12
  });
13
13
  }
14
- async function respondCloudObject(fn, append) {
14
+ function parseCloudModuleOutput(output, fallbackErrorMessage = "") {
15
+ if (output.errCode) {
16
+ throw createCloudObjectError(output.errMsg || fallbackErrorMessage, output.errCode);
17
+ }
18
+ return object.objectOmit(output, ["errCode", "errMsg"]);
19
+ }
20
+ async function respondCloudMethod(fn, append) {
15
21
  try {
16
22
  const data = await fn();
17
23
  return {
@@ -33,26 +39,26 @@ async function respondCloudObject(fn, append) {
33
39
  };
34
40
  }
35
41
  }
36
- function buildCloudObjectExposeCreator(options) {
42
+ function buildCloudMethodCreator(options) {
37
43
  const buildOptions = object.objectDefaults(options || {}, {
38
44
  requiredUserErrCode: "uni-id-check-token-failed",
39
45
  requiredUserErrMsg: "需要登录后才能进行此操作",
40
46
  onlyLocalEnvErrMsg: "运行环境不匹配",
41
47
  respondAppend: () => ({})
42
48
  });
43
- const createCloudObjectExpose = (arg0, arg1, arg2) => {
49
+ const createCloudMethod = (arg0, arg1, arg2) => {
44
50
  const optionsSource = type.isFunction(arg0) ? arg1 : arg2;
45
51
  const createOptions = object.objectDefaults(optionsSource || {}, {
46
52
  requiredUser: false,
47
53
  onlyLocalEnv: false
48
54
  });
49
55
  return async function(input) {
50
- return await respondCloudObject(async () => {
56
+ return await respondCloudMethod(async () => {
51
57
  const runtimeEnv = this.getCloudInfo().runtimeEnv;
52
58
  if (createOptions.onlyLocalEnv && runtimeEnv !== "local") {
53
59
  throw createCloudObjectError(buildOptions.onlyLocalEnvErrMsg);
54
60
  }
55
- const user = await parseAppendUser(this, options?.uniIdCommonModule);
61
+ const user = await _parseAppendUser(this, options?.uniIdCommonModule);
56
62
  const append = {
57
63
  options: createOptions,
58
64
  user
@@ -75,9 +81,9 @@ function buildCloudObjectExposeCreator(options) {
75
81
  }, buildOptions.respondAppend(this));
76
82
  };
77
83
  };
78
- return createCloudObjectExpose;
84
+ return createCloudMethod;
79
85
  }
80
- async function parseAppendUser(objectThis, uniIdCommonModule) {
86
+ async function _parseAppendUser(objectThis, uniIdCommonModule) {
81
87
  const appendUser = {
82
88
  id: "",
83
89
  role: [],
@@ -98,15 +104,9 @@ async function parseAppendUser(objectThis, uniIdCommonModule) {
98
104
  appendUser.isAdmin = appendUser.role.includes("admin") && appendUser.permission.length === 0;
99
105
  return appendUser;
100
106
  }
101
- function parseCloudModuleOutput(output, fallbackErrorMessage = "") {
102
- if (output.errCode) {
103
- throw createCloudObjectError(output.errMsg || fallbackErrorMessage, output.errCode);
104
- }
105
- return object.objectOmit(output, ["errCode", "errMsg"]);
106
- }
107
- exports.parseCloudObjectOutput = _helpers.parseCloudObjectOutput;
108
- exports.buildCloudObjectExposeCreator = buildCloudObjectExposeCreator;
107
+ exports.parseCloudMethodOutput = _helpers.parseCloudMethodOutput;
108
+ exports.buildCloudMethodCreator = buildCloudMethodCreator;
109
109
  exports.createCloudObjectError = createCloudObjectError;
110
110
  exports.parseCloudModuleOutput = parseCloudModuleOutput;
111
- exports.respondCloudObject = respondCloudObject;
111
+ exports.respondCloudMethod = respondCloudMethod;
112
112
  //# sourceMappingURL=cloud.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud.cjs","sources":["../src/cloud/error.ts","../src/cloud/respond.ts","../src/cloud/expose.ts"],"sourcesContent":["import { errorAssign } from '@cloudcome/utils-core/error';\n\nexport function createCloudObjectError(message: string, code?: number | string) {\n return errorAssign(new Error(message), {\n errCode: code,\n errMsg: message,\n });\n}\n","import { errorNormalize } from '@cloudcome/utils-core/error';\nimport type { MaybePromise } from '@cloudcome/utils-core/types';\nimport type { UniCloudObjectOutput } from './types';\n\n/**\n * 处理云函数响应结果,统一返回格式\n * @param fn - 执行函数,可以返回任意类型的值或Promise\n * @param append - 需要附加到响应结果中的额外字段\n * @returns 统一格式的云函数响应结果\n *\n * @example\n * ```typescript\n * // 成功情况\n * const result = await respondCloudObject(async () => {\n * return { name: 'test', value: 123 };\n * });\n * // 返回: { errCode: 0, errMsg: '', data: { name: 'test', value: 123 } }\n *\n * // 失败情况\n * const result = await respondCloudObject(() => {\n * throw new Error('操作失败');\n * });\n * // 返回: { errCode: -1, errMsg: '操作失败', data: null }\n * ```\n */\nexport async function respondCloudObject<O>(\n fn: () => MaybePromise<O>,\n append?: AnyObject,\n): Promise<UniCloudObjectOutput<O>> {\n try {\n const data = await fn();\n\n return {\n errCode: 0,\n errMsg: '',\n data,\n ...append,\n };\n } catch (err) {\n console.error('respondCloudObject error');\n console.error(err);\n\n const err2 = errorNormalize(err as Error & { errCode?: number | string; errMsg?: string });\n\n return {\n errCode: err2.errCode || -1,\n errMsg: err2.errMsg || err2.message || '',\n // @ts-ignore\n data: null,\n ...append,\n };\n }\n}\n","import { parseCloudObjectOutput } from '@/_helpers';\nimport { objectDefaults, objectOmit } from '@cloudcome/utils-core/object';\nimport { tryFlatten } from '@cloudcome/utils-core/try';\nimport { isFunction } from '@cloudcome/utils-core/type';\nimport type { MaybePromise } from '@cloudcome/utils-core/types';\nimport type z from 'zod';\nimport type { ZodObject } from 'zod';\nimport { createCloudObjectError } from './error';\nimport { respondCloudObject } from './respond';\nimport type { UniCloudModuleOutput, UniCloudObjectExpose, UniCloudObjectThis } from './types';\nimport type { UniIdCommonModule } from './uni-id';\n\nexport type UniCloudObjectThisAppendUser = {\n id: string;\n role: string[];\n permission: string[];\n isAdmin: boolean;\n};\n\nexport type UniCloudObjectThisAppend = {\n options: Required<CreateCloudObjectOptions>;\n user: UniCloudObjectThisAppendUser;\n};\n\nexport type UniCloudObjectContext = UniCloudObjectThis & UniCloudObjectThisAppend;\n\n/**\n * 构建云函数暴露创建器的选项配置\n * 用于配置云函数暴露创建器的行为,目前支持传入UniIdCloudObject实例\n */\nexport type BuildCloudExposeCreatorOptions = {\n /**\n * UniId 通用模块\n * 用于处理用户身份验证和权限管理\n * 如果提供,将在云对象执行前验证用户身份\n */\n uniIdCommonModule?: UniIdCommonModule;\n\n /**\n * 需要用户登录态的错误码\n * @default 'uni-id-check-token-failed'\n */\n requiredUserErrCode?: number | string;\n\n /**\n * 需要用户登录态的错误消息\n * @default '需要登录后才能进行此操作'\n */\n requiredUserErrMsg?: string;\n\n /**\n * 仅允许本地环境运行的错误消息\n * @default '运行环境不匹配'\n */\n onlyLocalEnvErrMsg?: string;\n\n /**\n * 响应附加数据函数\n * 用于在云对象响应中添加额外的上下文信息\n * @param objectThis 云对象上下文\n * @returns 返回要附加到响应中的数据对象\n */\n respondAppend?: (objectThis: UniCloudObjectThis) => AnyObject;\n};\n\nexport type CreateCloudObjectOptions = {\n /**\n * 是否需要用户登录态\n * @default false\n */\n requiredUser?: boolean;\n\n /**\n * 是否仅在本地环境运行\n * @default false\n */\n onlyLocalEnv?: boolean;\n};\n\nexport type CreateCloudObjectExpose = {\n <S extends ZodObject, O>(\n schema: S,\n fn: (context: UniCloudObjectContext, input: z.infer<S>) => MaybePromise<O>,\n options?: CreateCloudObjectOptions,\n ): UniCloudObjectExpose<z.infer<S>, O>;\n <O>(\n fn: (context: UniCloudObjectContext) => MaybePromise<O>,\n options?: CreateCloudObjectOptions,\n ): UniCloudObjectExpose<void, O>;\n};\n\n/**\n * 构建云对象暴露创建器\n *\n * 该函数用于创建一个云对象暴露函数,可以处理用户身份验证、输入验证和错误处理等通用逻辑\n *\n * @param options 构建选项配置\n * @param options.uniIdCloudObject 可选的UniIdCloudObject实例,用于处理用户身份验证和权限管理\n * @param options.requiredUserErrCode 需要用户登录态时的错误码,默认为 'uni-id-check-token-failed'\n * @param options.requiredUserErrMsg 需要用户登录态时的错误消息,默认为 '需要登录后才能进行此操作'\n *\n * @returns 返回一个云对象暴露创建函数,支持两种重载形式:\n * 1. 无输入参数的形式:(fn, options) => UniCloudObject\n * 2. 有输入验证的形式:(schema, fn, options) => UniCloudObject\n *\n * @example\n * // 无输入参数的使用方式\n * const expose = buildCloudObjectExposeCreator();\n * export default expose(async (context) => {\n * // 业务逻辑\n * });\n *\n * @example\n * // 有输入验证的使用方式\n * const expose = buildCloudObjectExposeCreator();\n * const schema = z.object({\n * name: z.string().min(1)\n * });\n *\n * export default expose(schema, async (context, input) => {\n * // 业务逻辑,input类型已自动推断\n * });\n */\nexport function buildCloudObjectExposeCreator(options?: BuildCloudExposeCreatorOptions) {\n const buildOptions = objectDefaults(options || {}, {\n requiredUserErrCode: 'uni-id-check-token-failed',\n requiredUserErrMsg: '需要登录后才能进行此操作',\n onlyLocalEnvErrMsg: '运行环境不匹配',\n respondAppend: () => ({}),\n }) as Required<BuildCloudExposeCreatorOptions>;\n\n // @ts-ignore\n const createCloudObjectExpose: CreateCloudObjectExpose = (arg0, arg1, arg2) => {\n // 确定选项来源:如果arg0是函数,则选项在arg1;否则在arg2\n const optionsSource = (isFunction(arg0) ? arg1 : arg2) as CreateCloudObjectOptions | undefined;\n\n // 设置默认选项值\n const createOptions = objectDefaults(optionsSource || {}, {\n requiredUser: false,\n onlyLocalEnv: false,\n }) as Required<CreateCloudObjectOptions>;\n\n return async function (input) {\n // 处理云函数响应逻辑,包括错误捕获和统一响应格式\n return await respondCloudObject(async () => {\n const runtimeEnv = this.getCloudInfo().runtimeEnv;\n\n if (createOptions.onlyLocalEnv && runtimeEnv !== 'local') {\n throw createCloudObjectError(buildOptions.onlyLocalEnvErrMsg);\n }\n\n // 构建附加的上下文信息,包括用户身份和权限信息\n const user = await parseAppendUser(this, options?.uniIdCommonModule);\n const append: UniCloudObjectThisAppend = {\n options: createOptions,\n user: user,\n };\n const context = Object.assign(this, append) as UniCloudObjectContext;\n\n // 如果需要用户登录态但用户未登录,则抛出错误\n if (createOptions.requiredUser && !user.id) {\n throw createCloudObjectError(buildOptions.requiredUserErrMsg, buildOptions.requiredUserErrCode);\n }\n\n // 无入参函数调用\n if (isFunction(arg0)) {\n return await arg0(context);\n }\n\n // 有入参函数调用 - 验证输入数据\n const parsed = arg0.safeParse(input);\n\n // 输入验证失败处理\n if (!parsed.success) {\n console.log(parsed.error.issues);\n\n const issue0 = parsed.error?.issues?.[0];\n\n // 处理自定义验证错误\n if (issue0?.code === 'custom') throw issue0.message;\n throw new Error('请求数据不正确');\n }\n\n // 执行业务逻辑函数,传入上下文和验证后的数据\n return await arg1(context, parsed.data);\n }, buildOptions.respondAppend(this));\n };\n };\n\n return createCloudObjectExpose;\n}\n\nasync function parseAppendUser(\n objectThis: UniCloudObjectThis,\n uniIdCommonModule?: UniIdCommonModule,\n): Promise<UniCloudObjectThisAppendUser> {\n const appendUser: UniCloudObjectThisAppendUser = {\n id: '',\n role: [],\n permission: [],\n isAdmin: false,\n };\n\n if (!uniIdCommonModule) return appendUser;\n\n const uic = uniIdCommonModule.createInstance({\n clientInfo: objectThis.getClientInfo(),\n });\n\n // 忽略错误1\n const [err1, user] = await tryFlatten(uic.checkToken(objectThis.getUniIdToken() || ''));\n if (!user) return appendUser;\n\n // 忽略错误2\n const [err2, userData] = tryFlatten(() => parseCloudModuleOutput(user));\n if (!userData) return appendUser;\n\n appendUser.id = userData.uid || '';\n appendUser.role = userData.role || [];\n appendUser.permission = userData.permission || [];\n appendUser.isAdmin = appendUser.role.includes('admin') && appendUser.permission.length === 0;\n\n return appendUser;\n}\n\n/**\n * 解析云函数模块输出结果\n *\n * 该函数用于处理云函数模块的输出,如果输出中包含错误码,则抛出相应的错误;\n * 否则返回去除错误码和错误信息后的数据部分。\n *\n * @template O - 输出数据的类型\n * @param output - 云函数模块的输出结果,包含errCode、errMsg和数据部分\n * @param fallbackErrorMessage - 当输出中没有错误信息时使用的默认错误消息\n * @returns 返回去除errCode和errMsg字段后的数据对象\n * @throws {CloudObjectError} 当output中存在errCode时抛出包含错误码和错误信息的异常\n *\n * @example\n * // 成功情况\n * const result = parseCloudModuleOutput({ value: 'success', errCode: 0, errMsg: '' });\n * // 返回: { value: 'success' }\n *\n * @example\n * // 错误情况\n * try {\n * parseCloudModuleOutput({ errCode: 404, errMsg: 'Not Found' });\n * } catch (error) {\n * // 抛出错误: CloudObjectError('Not Found', 404)\n * }\n */\nexport function parseCloudModuleOutput<O>(\n output: UniCloudModuleOutput<O>,\n fallbackErrorMessage = '',\n): Omit<O, 'errCode' | 'errMsg'> {\n if (output.errCode) {\n throw createCloudObjectError(output.errMsg || fallbackErrorMessage, output.errCode);\n }\n return objectOmit(output, ['errCode', 'errMsg']);\n}\n"],"names":["errorAssign","errorNormalize","objectDefaults","isFunction","tryFlatten","objectOmit"],"mappings":"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"}
1
+ {"version":3,"file":"cloud.cjs","sources":["../src/cloud/error.ts","../src/cloud/module.ts","../src/cloud/respond.ts","../src/cloud/method.ts"],"sourcesContent":["import { errorAssign } from '@cloudcome/utils-core/error';\n\nexport function createCloudObjectError(message: string, code?: number | string) {\n return errorAssign(new Error(message), {\n errCode: code,\n errMsg: message,\n });\n}\n","import { objectOmit } from '@cloudcome/utils-core/object';\nimport { createCloudObjectError } from './error';\nimport type { CloudModuleOutput } from './types';\n\n/**\n * 解析云模块输出结果\n *\n * 该函数用于处理云模块的输出,如果输出中包含错误码,则抛出相应的错误;\n * 否则返回去除错误码和错误信息后的数据部分。\n *\n * @template O - 输出数据的类型\n * @param output - 云模块的输出结果,包含errCode、errMsg和数据部分\n * @param fallbackErrorMessage - 当输出中没有错误信息时使用的默认错误消息\n * @returns 返回去除errCode和errMsg字段后的数据对象\n * @throws {CloudObjectError} 当output中存在errCode时抛出包含错误码和错误信息的异常\n *\n * @example\n * // 成功情况\n * const result = parseCloudModuleOutput({ value: 'success', errCode: 0, errMsg: '' });\n * // 返回: { value: 'success' }\n *\n * @example\n * // 错误情况\n * try {\n * parseCloudModuleOutput({ errCode: 404, errMsg: 'Not Found' });\n * } catch (error) {\n * // 抛出错误: CloudObjectError('Not Found', 404)\n * }\n */\nexport function parseCloudModuleOutput<O>(\n output: CloudModuleOutput<O>,\n fallbackErrorMessage = '',\n): Omit<O, 'errCode' | 'errMsg'> {\n if (output.errCode) {\n throw createCloudObjectError(output.errMsg || fallbackErrorMessage, output.errCode);\n }\n return objectOmit(output, ['errCode', 'errMsg']);\n}\n","import { errorNormalize } from '@cloudcome/utils-core/error';\nimport type { MaybePromise } from '@cloudcome/utils-core/types';\nimport type { CloudMethodOutput } from './types';\n\n/**\n * 执行云对象方法并标准化响应格式\n *\n * @template O - 函数返回值的类型\n * @param fn - 要执行的异步函数\n * @param append - 要附加到响应中的额外数据\n * @returns 标准化的云对象响应对象\n *\n * @example\n * ```typescript\n * const result = await respondCloudMethod(async () => {\n * return await getData();\n * }, { extra: 'data' });\n * ```\n */\nexport async function respondCloudMethod<O>(\n fn: () => MaybePromise<O>,\n append?: AnyObject,\n): Promise<CloudMethodOutput<O>> {\n try {\n const data = await fn();\n\n return {\n errCode: 0,\n errMsg: '',\n data,\n ...append,\n };\n } catch (err) {\n console.error('respondCloudObject error');\n console.error(err);\n\n const err2 = errorNormalize(err as Error & { errCode?: number | string; errMsg?: string });\n\n return {\n errCode: err2.errCode || -1,\n errMsg: err2.errMsg || err2.message || '',\n // @ts-ignore\n data: null,\n ...append,\n };\n }\n}\n","import { parseCloudMethodOutput } from '@/_helpers';\nimport { objectDefaults, objectOmit } from '@cloudcome/utils-core/object';\nimport { tryFlatten } from '@cloudcome/utils-core/try';\nimport { isFunction } from '@cloudcome/utils-core/type';\nimport type { MaybePromise } from '@cloudcome/utils-core/types';\nimport type z from 'zod';\nimport type { ZodObject } from 'zod';\nimport { createCloudObjectError } from './error';\nimport { parseCloudModuleOutput } from './module';\nimport { respondCloudMethod } from './respond';\nimport type { CloudMethod, CloudModuleOutput, CloudObjectThis } from './types';\nimport type { UniIdCommonModule } from './uni-id';\n\ntype _CloudObjectThisAppendUser = {\n id: string;\n role: string[];\n permission: string[];\n isAdmin: boolean;\n};\n\ntype _CloudObjectThisAppend = {\n options: Required<CreateCloudObjectOptions>;\n user: _CloudObjectThisAppendUser;\n};\n\nexport type CloudObjectContext = CloudObjectThis & _CloudObjectThisAppend;\n\nexport type BuildCloudMethodCreatorOptions = {\n /**\n * UniId 通用模块\n * 用于处理用户身份验证和权限管理\n * 如果提供,将在云对象执行前验证用户身份\n */\n uniIdCommonModule?: UniIdCommonModule;\n\n /**\n * 需要用户登录态的错误码\n * @default 'uni-id-check-token-failed'\n */\n requiredUserErrCode?: number | string;\n\n /**\n * 需要用户登录态的错误消息\n * @default '需要登录后才能进行此操作'\n */\n requiredUserErrMsg?: string;\n\n /**\n * 仅允许本地环境运行的错误消息\n * @default '运行环境不匹配'\n */\n onlyLocalEnvErrMsg?: string;\n\n /**\n * 响应附加数据函数\n * 用于在云对象响应中添加额外的上下文信息\n * @param objectThis 云对象上下文\n * @returns 返回要附加到响应中的数据对象\n */\n respondAppend?: (objectThis: CloudObjectThis) => AnyObject;\n};\n\nexport type CreateCloudObjectOptions = {\n /**\n * 是否需要用户登录态\n * @default false\n */\n requiredUser?: boolean;\n\n /**\n * 是否仅在本地环境运行\n * @default false\n */\n onlyLocalEnv?: boolean;\n};\n\n/**\n * 云对象方法创建器类型定义\n *\n * 用于定义云对象方法的创建函数类型,支持两种重载形式:\n * 1. 带输入验证的版本:接收schema、处理函数和选项\n * 2. 无输入参数的版本:仅接收处理函数和选项\n */\nexport type CreateCloudMethod = {\n /**\n * 带输入验证的云对象方法创建器\n * @template S - Zod验证模式类型\n * @template O - 返回值类型\n * @param schema - Zod验证模式,用于验证输入数据\n * @param fn - 业务逻辑处理函数,接收上下文和验证后的输入数据\n * @param options - 云对象创建选项\n * @returns 云对象方法函数\n */\n <S extends ZodObject, O>(\n schema: S,\n fn: (context: CloudObjectContext, input: z.infer<S>) => MaybePromise<O>,\n options?: CreateCloudObjectOptions,\n ): CloudMethod<z.infer<S>, O>;\n\n /**\n * 无输入参数的云对象方法创建器\n * @template O - 返回值类型\n * @param fn - 业务逻辑处理函数,仅接收上下文\n * @param options - 云对象创建选项\n * @returns 云对象方法函数\n */\n <O>(fn: (context: CloudObjectContext) => MaybePromise<O>, options?: CreateCloudObjectOptions): CloudMethod<void, O>;\n};\n\n/**\n * 构建云对象方法创建器\n *\n * 该函数用于创建云对象方法的工厂函数,支持输入验证、用户身份验证、环境检查等功能。\n * 返回的创建器函数可以根据不同的配置创建云对象方法。\n *\n * @param options 构建选项,用于配置云对象方法创建器的行为\n * @returns 返回一个云对象方法创建器函数\n *\n * @example\n * // 创建一个需要用户登录的云对象方法\n * const createMethod = buildCloudMethodCreator({ uniIdCommonModule });\n * const myMethod = createMethod(async (context) => {\n * return { message: 'Hello ' + context.user.id };\n * }, { requiredUser: true });\n */\nexport function buildCloudMethodCreator(options?: BuildCloudMethodCreatorOptions) {\n const buildOptions = objectDefaults(options || {}, {\n requiredUserErrCode: 'uni-id-check-token-failed',\n requiredUserErrMsg: '需要登录后才能进行此操作',\n onlyLocalEnvErrMsg: '运行环境不匹配',\n respondAppend: () => ({}),\n }) as Required<BuildCloudMethodCreatorOptions>;\n\n // @ts-ignore\n const createCloudMethod: CreateCloudMethod = (arg0, arg1, arg2) => {\n // 确定选项来源:如果arg0是函数,则选项在arg1;否则在arg2\n const optionsSource = (isFunction(arg0) ? arg1 : arg2) as CreateCloudObjectOptions | undefined;\n\n // 设置默认选项值\n const createOptions = objectDefaults(optionsSource || {}, {\n requiredUser: false,\n onlyLocalEnv: false,\n }) as Required<CreateCloudObjectOptions>;\n\n return async function (input) {\n // 处理云对象方法响应逻辑,包括错误捕获和统一响应格式\n return await respondCloudMethod(async () => {\n const runtimeEnv = this.getCloudInfo().runtimeEnv;\n\n if (createOptions.onlyLocalEnv && runtimeEnv !== 'local') {\n throw createCloudObjectError(buildOptions.onlyLocalEnvErrMsg);\n }\n\n // 构建附加的上下文信息,包括用户身份和权限信息\n const user = await _parseAppendUser(this, options?.uniIdCommonModule);\n const append: _CloudObjectThisAppend = {\n options: createOptions,\n user: user,\n };\n const context = Object.assign(this, append) as CloudObjectContext;\n\n // 如果需要用户登录态但用户未登录,则抛出错误\n if (createOptions.requiredUser && !user.id) {\n throw createCloudObjectError(buildOptions.requiredUserErrMsg, buildOptions.requiredUserErrCode);\n }\n\n // 无入参函数调用\n if (isFunction(arg0)) {\n return await arg0(context);\n }\n\n // 有入参函数调用 - 验证输入数据\n const parsed = arg0.safeParse(input);\n\n // 输入验证失败处理\n if (!parsed.success) {\n console.log(parsed.error.issues);\n\n const issue0 = parsed.error?.issues?.[0];\n\n // 处理自定义验证错误\n if (issue0?.code === 'custom') throw issue0.message;\n throw new Error('请求数据不正确');\n }\n\n // 执行业务逻辑函数,传入上下文和验证后的数据\n return await arg1(context, parsed.data);\n }, buildOptions.respondAppend(this));\n };\n };\n\n return createCloudMethod;\n}\n\n/**\n * 解析并附加用户信息到云对象上下文\n *\n * 该函数用于验证用户身份并获取用户权限信息,将结果附加到云对象上下文中的user字段\n * 如果未提供uniIdCommonModule或验证失败,则返回默认的空用户信息\n *\n * @param objectThis 云对象上下文,包含客户端信息和token等\n * @param uniIdCommonModule 可选的UniId通用模块实例,用于验证用户token\n * @returns 返回包含用户ID、角色、权限等信息的对象\n *\n * @example\n * // 成功验证用户身份\n * const user = await _parseAppendUser(this, uniIdModule);\n * // 返回: { id: 'user123', role: ['user'], permission: ['read'], isAdmin: false }\n *\n * @example\n * // 验证失败或未提供模块\n * const user = await _parseAppendUser(this);\n * // 返回: { id: '', role: [], permission: [], isAdmin: false }\n */\nasync function _parseAppendUser(\n objectThis: CloudObjectThis,\n uniIdCommonModule?: UniIdCommonModule,\n): Promise<_CloudObjectThisAppendUser> {\n const appendUser: _CloudObjectThisAppendUser = {\n id: '',\n role: [],\n permission: [],\n isAdmin: false,\n };\n\n if (!uniIdCommonModule) return appendUser;\n\n const uic = uniIdCommonModule.createInstance({\n clientInfo: objectThis.getClientInfo(),\n });\n\n // 验证用户token,忽略验证过程中的错误\n const [err1, user] = await tryFlatten(uic.checkToken(objectThis.getUniIdToken() || ''));\n if (!user) return appendUser;\n\n // 解析验证结果,忽略解析过程中的错误\n const [err2, userData] = tryFlatten(() => parseCloudModuleOutput(user));\n if (!userData) return appendUser;\n\n appendUser.id = userData.uid || '';\n appendUser.role = userData.role || [];\n appendUser.permission = userData.permission || [];\n appendUser.isAdmin = appendUser.role.includes('admin') && appendUser.permission.length === 0;\n\n return appendUser;\n}\n"],"names":["errorAssign","objectOmit","errorNormalize","objectDefaults","isFunction","tryFlatten"],"mappings":"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"}
package/dist/cloud.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- export { parseCloudObjectOutput } from './_helpers';
1
+ export { parseCloudMethodOutput } from './_helpers';
2
2
  export * from './cloud/error';
3
- export * from './cloud/expose';
3
+ export * from './cloud/method';
4
4
  export * from './cloud/types';
5
5
  export * from './cloud/respond';
6
6
  export * from './cloud/uni-id';
7
+ export * from './cloud/module';
package/dist/cloud.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { p } from "./_helpers.mjs";
2
2
  import { errorAssign, errorNormalize } from "@cloudcome/utils-core/error";
3
- import { objectDefaults, objectOmit } from "@cloudcome/utils-core/object";
3
+ import { objectOmit, objectDefaults } from "@cloudcome/utils-core/object";
4
4
  import { tryFlatten } from "@cloudcome/utils-core/try";
5
5
  import { isFunction } from "@cloudcome/utils-core/type";
6
6
  function createCloudObjectError(message, code) {
@@ -9,7 +9,13 @@ function createCloudObjectError(message, code) {
9
9
  errMsg: message
10
10
  });
11
11
  }
12
- async function respondCloudObject(fn, append) {
12
+ function parseCloudModuleOutput(output, fallbackErrorMessage = "") {
13
+ if (output.errCode) {
14
+ throw createCloudObjectError(output.errMsg || fallbackErrorMessage, output.errCode);
15
+ }
16
+ return objectOmit(output, ["errCode", "errMsg"]);
17
+ }
18
+ async function respondCloudMethod(fn, append) {
13
19
  try {
14
20
  const data = await fn();
15
21
  return {
@@ -31,26 +37,26 @@ async function respondCloudObject(fn, append) {
31
37
  };
32
38
  }
33
39
  }
34
- function buildCloudObjectExposeCreator(options) {
40
+ function buildCloudMethodCreator(options) {
35
41
  const buildOptions = objectDefaults(options || {}, {
36
42
  requiredUserErrCode: "uni-id-check-token-failed",
37
43
  requiredUserErrMsg: "需要登录后才能进行此操作",
38
44
  onlyLocalEnvErrMsg: "运行环境不匹配",
39
45
  respondAppend: () => ({})
40
46
  });
41
- const createCloudObjectExpose = (arg0, arg1, arg2) => {
47
+ const createCloudMethod = (arg0, arg1, arg2) => {
42
48
  const optionsSource = isFunction(arg0) ? arg1 : arg2;
43
49
  const createOptions = objectDefaults(optionsSource || {}, {
44
50
  requiredUser: false,
45
51
  onlyLocalEnv: false
46
52
  });
47
53
  return async function(input) {
48
- return await respondCloudObject(async () => {
54
+ return await respondCloudMethod(async () => {
49
55
  const runtimeEnv = this.getCloudInfo().runtimeEnv;
50
56
  if (createOptions.onlyLocalEnv && runtimeEnv !== "local") {
51
57
  throw createCloudObjectError(buildOptions.onlyLocalEnvErrMsg);
52
58
  }
53
- const user = await parseAppendUser(this, options?.uniIdCommonModule);
59
+ const user = await _parseAppendUser(this, options?.uniIdCommonModule);
54
60
  const append = {
55
61
  options: createOptions,
56
62
  user
@@ -73,9 +79,9 @@ function buildCloudObjectExposeCreator(options) {
73
79
  }, buildOptions.respondAppend(this));
74
80
  };
75
81
  };
76
- return createCloudObjectExpose;
82
+ return createCloudMethod;
77
83
  }
78
- async function parseAppendUser(objectThis, uniIdCommonModule) {
84
+ async function _parseAppendUser(objectThis, uniIdCommonModule) {
79
85
  const appendUser = {
80
86
  id: "",
81
87
  role: [],
@@ -96,17 +102,11 @@ async function parseAppendUser(objectThis, uniIdCommonModule) {
96
102
  appendUser.isAdmin = appendUser.role.includes("admin") && appendUser.permission.length === 0;
97
103
  return appendUser;
98
104
  }
99
- function parseCloudModuleOutput(output, fallbackErrorMessage = "") {
100
- if (output.errCode) {
101
- throw createCloudObjectError(output.errMsg || fallbackErrorMessage, output.errCode);
102
- }
103
- return objectOmit(output, ["errCode", "errMsg"]);
104
- }
105
105
  export {
106
- buildCloudObjectExposeCreator,
106
+ buildCloudMethodCreator,
107
107
  createCloudObjectError,
108
+ p as parseCloudMethodOutput,
108
109
  parseCloudModuleOutput,
109
- p as parseCloudObjectOutput,
110
- respondCloudObject
110
+ respondCloudMethod
111
111
  };
112
112
  //# sourceMappingURL=cloud.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud.mjs","sources":["../src/cloud/error.ts","../src/cloud/respond.ts","../src/cloud/expose.ts"],"sourcesContent":["import { errorAssign } from '@cloudcome/utils-core/error';\n\nexport function createCloudObjectError(message: string, code?: number | string) {\n return errorAssign(new Error(message), {\n errCode: code,\n errMsg: message,\n });\n}\n","import { errorNormalize } from '@cloudcome/utils-core/error';\nimport type { MaybePromise } from '@cloudcome/utils-core/types';\nimport type { UniCloudObjectOutput } from './types';\n\n/**\n * 处理云函数响应结果,统一返回格式\n * @param fn - 执行函数,可以返回任意类型的值或Promise\n * @param append - 需要附加到响应结果中的额外字段\n * @returns 统一格式的云函数响应结果\n *\n * @example\n * ```typescript\n * // 成功情况\n * const result = await respondCloudObject(async () => {\n * return { name: 'test', value: 123 };\n * });\n * // 返回: { errCode: 0, errMsg: '', data: { name: 'test', value: 123 } }\n *\n * // 失败情况\n * const result = await respondCloudObject(() => {\n * throw new Error('操作失败');\n * });\n * // 返回: { errCode: -1, errMsg: '操作失败', data: null }\n * ```\n */\nexport async function respondCloudObject<O>(\n fn: () => MaybePromise<O>,\n append?: AnyObject,\n): Promise<UniCloudObjectOutput<O>> {\n try {\n const data = await fn();\n\n return {\n errCode: 0,\n errMsg: '',\n data,\n ...append,\n };\n } catch (err) {\n console.error('respondCloudObject error');\n console.error(err);\n\n const err2 = errorNormalize(err as Error & { errCode?: number | string; errMsg?: string });\n\n return {\n errCode: err2.errCode || -1,\n errMsg: err2.errMsg || err2.message || '',\n // @ts-ignore\n data: null,\n ...append,\n };\n }\n}\n","import { parseCloudObjectOutput } from '@/_helpers';\nimport { objectDefaults, objectOmit } from '@cloudcome/utils-core/object';\nimport { tryFlatten } from '@cloudcome/utils-core/try';\nimport { isFunction } from '@cloudcome/utils-core/type';\nimport type { MaybePromise } from '@cloudcome/utils-core/types';\nimport type z from 'zod';\nimport type { ZodObject } from 'zod';\nimport { createCloudObjectError } from './error';\nimport { respondCloudObject } from './respond';\nimport type { UniCloudModuleOutput, UniCloudObjectExpose, UniCloudObjectThis } from './types';\nimport type { UniIdCommonModule } from './uni-id';\n\nexport type UniCloudObjectThisAppendUser = {\n id: string;\n role: string[];\n permission: string[];\n isAdmin: boolean;\n};\n\nexport type UniCloudObjectThisAppend = {\n options: Required<CreateCloudObjectOptions>;\n user: UniCloudObjectThisAppendUser;\n};\n\nexport type UniCloudObjectContext = UniCloudObjectThis & UniCloudObjectThisAppend;\n\n/**\n * 构建云函数暴露创建器的选项配置\n * 用于配置云函数暴露创建器的行为,目前支持传入UniIdCloudObject实例\n */\nexport type BuildCloudExposeCreatorOptions = {\n /**\n * UniId 通用模块\n * 用于处理用户身份验证和权限管理\n * 如果提供,将在云对象执行前验证用户身份\n */\n uniIdCommonModule?: UniIdCommonModule;\n\n /**\n * 需要用户登录态的错误码\n * @default 'uni-id-check-token-failed'\n */\n requiredUserErrCode?: number | string;\n\n /**\n * 需要用户登录态的错误消息\n * @default '需要登录后才能进行此操作'\n */\n requiredUserErrMsg?: string;\n\n /**\n * 仅允许本地环境运行的错误消息\n * @default '运行环境不匹配'\n */\n onlyLocalEnvErrMsg?: string;\n\n /**\n * 响应附加数据函数\n * 用于在云对象响应中添加额外的上下文信息\n * @param objectThis 云对象上下文\n * @returns 返回要附加到响应中的数据对象\n */\n respondAppend?: (objectThis: UniCloudObjectThis) => AnyObject;\n};\n\nexport type CreateCloudObjectOptions = {\n /**\n * 是否需要用户登录态\n * @default false\n */\n requiredUser?: boolean;\n\n /**\n * 是否仅在本地环境运行\n * @default false\n */\n onlyLocalEnv?: boolean;\n};\n\nexport type CreateCloudObjectExpose = {\n <S extends ZodObject, O>(\n schema: S,\n fn: (context: UniCloudObjectContext, input: z.infer<S>) => MaybePromise<O>,\n options?: CreateCloudObjectOptions,\n ): UniCloudObjectExpose<z.infer<S>, O>;\n <O>(\n fn: (context: UniCloudObjectContext) => MaybePromise<O>,\n options?: CreateCloudObjectOptions,\n ): UniCloudObjectExpose<void, O>;\n};\n\n/**\n * 构建云对象暴露创建器\n *\n * 该函数用于创建一个云对象暴露函数,可以处理用户身份验证、输入验证和错误处理等通用逻辑\n *\n * @param options 构建选项配置\n * @param options.uniIdCloudObject 可选的UniIdCloudObject实例,用于处理用户身份验证和权限管理\n * @param options.requiredUserErrCode 需要用户登录态时的错误码,默认为 'uni-id-check-token-failed'\n * @param options.requiredUserErrMsg 需要用户登录态时的错误消息,默认为 '需要登录后才能进行此操作'\n *\n * @returns 返回一个云对象暴露创建函数,支持两种重载形式:\n * 1. 无输入参数的形式:(fn, options) => UniCloudObject\n * 2. 有输入验证的形式:(schema, fn, options) => UniCloudObject\n *\n * @example\n * // 无输入参数的使用方式\n * const expose = buildCloudObjectExposeCreator();\n * export default expose(async (context) => {\n * // 业务逻辑\n * });\n *\n * @example\n * // 有输入验证的使用方式\n * const expose = buildCloudObjectExposeCreator();\n * const schema = z.object({\n * name: z.string().min(1)\n * });\n *\n * export default expose(schema, async (context, input) => {\n * // 业务逻辑,input类型已自动推断\n * });\n */\nexport function buildCloudObjectExposeCreator(options?: BuildCloudExposeCreatorOptions) {\n const buildOptions = objectDefaults(options || {}, {\n requiredUserErrCode: 'uni-id-check-token-failed',\n requiredUserErrMsg: '需要登录后才能进行此操作',\n onlyLocalEnvErrMsg: '运行环境不匹配',\n respondAppend: () => ({}),\n }) as Required<BuildCloudExposeCreatorOptions>;\n\n // @ts-ignore\n const createCloudObjectExpose: CreateCloudObjectExpose = (arg0, arg1, arg2) => {\n // 确定选项来源:如果arg0是函数,则选项在arg1;否则在arg2\n const optionsSource = (isFunction(arg0) ? arg1 : arg2) as CreateCloudObjectOptions | undefined;\n\n // 设置默认选项值\n const createOptions = objectDefaults(optionsSource || {}, {\n requiredUser: false,\n onlyLocalEnv: false,\n }) as Required<CreateCloudObjectOptions>;\n\n return async function (input) {\n // 处理云函数响应逻辑,包括错误捕获和统一响应格式\n return await respondCloudObject(async () => {\n const runtimeEnv = this.getCloudInfo().runtimeEnv;\n\n if (createOptions.onlyLocalEnv && runtimeEnv !== 'local') {\n throw createCloudObjectError(buildOptions.onlyLocalEnvErrMsg);\n }\n\n // 构建附加的上下文信息,包括用户身份和权限信息\n const user = await parseAppendUser(this, options?.uniIdCommonModule);\n const append: UniCloudObjectThisAppend = {\n options: createOptions,\n user: user,\n };\n const context = Object.assign(this, append) as UniCloudObjectContext;\n\n // 如果需要用户登录态但用户未登录,则抛出错误\n if (createOptions.requiredUser && !user.id) {\n throw createCloudObjectError(buildOptions.requiredUserErrMsg, buildOptions.requiredUserErrCode);\n }\n\n // 无入参函数调用\n if (isFunction(arg0)) {\n return await arg0(context);\n }\n\n // 有入参函数调用 - 验证输入数据\n const parsed = arg0.safeParse(input);\n\n // 输入验证失败处理\n if (!parsed.success) {\n console.log(parsed.error.issues);\n\n const issue0 = parsed.error?.issues?.[0];\n\n // 处理自定义验证错误\n if (issue0?.code === 'custom') throw issue0.message;\n throw new Error('请求数据不正确');\n }\n\n // 执行业务逻辑函数,传入上下文和验证后的数据\n return await arg1(context, parsed.data);\n }, buildOptions.respondAppend(this));\n };\n };\n\n return createCloudObjectExpose;\n}\n\nasync function parseAppendUser(\n objectThis: UniCloudObjectThis,\n uniIdCommonModule?: UniIdCommonModule,\n): Promise<UniCloudObjectThisAppendUser> {\n const appendUser: UniCloudObjectThisAppendUser = {\n id: '',\n role: [],\n permission: [],\n isAdmin: false,\n };\n\n if (!uniIdCommonModule) return appendUser;\n\n const uic = uniIdCommonModule.createInstance({\n clientInfo: objectThis.getClientInfo(),\n });\n\n // 忽略错误1\n const [err1, user] = await tryFlatten(uic.checkToken(objectThis.getUniIdToken() || ''));\n if (!user) return appendUser;\n\n // 忽略错误2\n const [err2, userData] = tryFlatten(() => parseCloudModuleOutput(user));\n if (!userData) return appendUser;\n\n appendUser.id = userData.uid || '';\n appendUser.role = userData.role || [];\n appendUser.permission = userData.permission || [];\n appendUser.isAdmin = appendUser.role.includes('admin') && appendUser.permission.length === 0;\n\n return appendUser;\n}\n\n/**\n * 解析云函数模块输出结果\n *\n * 该函数用于处理云函数模块的输出,如果输出中包含错误码,则抛出相应的错误;\n * 否则返回去除错误码和错误信息后的数据部分。\n *\n * @template O - 输出数据的类型\n * @param output - 云函数模块的输出结果,包含errCode、errMsg和数据部分\n * @param fallbackErrorMessage - 当输出中没有错误信息时使用的默认错误消息\n * @returns 返回去除errCode和errMsg字段后的数据对象\n * @throws {CloudObjectError} 当output中存在errCode时抛出包含错误码和错误信息的异常\n *\n * @example\n * // 成功情况\n * const result = parseCloudModuleOutput({ value: 'success', errCode: 0, errMsg: '' });\n * // 返回: { value: 'success' }\n *\n * @example\n * // 错误情况\n * try {\n * parseCloudModuleOutput({ errCode: 404, errMsg: 'Not Found' });\n * } catch (error) {\n * // 抛出错误: CloudObjectError('Not Found', 404)\n * }\n */\nexport function parseCloudModuleOutput<O>(\n output: UniCloudModuleOutput<O>,\n fallbackErrorMessage = '',\n): Omit<O, 'errCode' | 'errMsg'> {\n if (output.errCode) {\n throw createCloudObjectError(output.errMsg || fallbackErrorMessage, output.errCode);\n }\n return objectOmit(output, ['errCode', 'errMsg']);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cloud.mjs","sources":["../src/cloud/error.ts","../src/cloud/module.ts","../src/cloud/respond.ts","../src/cloud/method.ts"],"sourcesContent":["import { errorAssign } from '@cloudcome/utils-core/error';\n\nexport function createCloudObjectError(message: string, code?: number | string) {\n return errorAssign(new Error(message), {\n errCode: code,\n errMsg: message,\n });\n}\n","import { objectOmit } from '@cloudcome/utils-core/object';\nimport { createCloudObjectError } from './error';\nimport type { CloudModuleOutput } from './types';\n\n/**\n * 解析云模块输出结果\n *\n * 该函数用于处理云模块的输出,如果输出中包含错误码,则抛出相应的错误;\n * 否则返回去除错误码和错误信息后的数据部分。\n *\n * @template O - 输出数据的类型\n * @param output - 云模块的输出结果,包含errCode、errMsg和数据部分\n * @param fallbackErrorMessage - 当输出中没有错误信息时使用的默认错误消息\n * @returns 返回去除errCode和errMsg字段后的数据对象\n * @throws {CloudObjectError} 当output中存在errCode时抛出包含错误码和错误信息的异常\n *\n * @example\n * // 成功情况\n * const result = parseCloudModuleOutput({ value: 'success', errCode: 0, errMsg: '' });\n * // 返回: { value: 'success' }\n *\n * @example\n * // 错误情况\n * try {\n * parseCloudModuleOutput({ errCode: 404, errMsg: 'Not Found' });\n * } catch (error) {\n * // 抛出错误: CloudObjectError('Not Found', 404)\n * }\n */\nexport function parseCloudModuleOutput<O>(\n output: CloudModuleOutput<O>,\n fallbackErrorMessage = '',\n): Omit<O, 'errCode' | 'errMsg'> {\n if (output.errCode) {\n throw createCloudObjectError(output.errMsg || fallbackErrorMessage, output.errCode);\n }\n return objectOmit(output, ['errCode', 'errMsg']);\n}\n","import { errorNormalize } from '@cloudcome/utils-core/error';\nimport type { MaybePromise } from '@cloudcome/utils-core/types';\nimport type { CloudMethodOutput } from './types';\n\n/**\n * 执行云对象方法并标准化响应格式\n *\n * @template O - 函数返回值的类型\n * @param fn - 要执行的异步函数\n * @param append - 要附加到响应中的额外数据\n * @returns 标准化的云对象响应对象\n *\n * @example\n * ```typescript\n * const result = await respondCloudMethod(async () => {\n * return await getData();\n * }, { extra: 'data' });\n * ```\n */\nexport async function respondCloudMethod<O>(\n fn: () => MaybePromise<O>,\n append?: AnyObject,\n): Promise<CloudMethodOutput<O>> {\n try {\n const data = await fn();\n\n return {\n errCode: 0,\n errMsg: '',\n data,\n ...append,\n };\n } catch (err) {\n console.error('respondCloudObject error');\n console.error(err);\n\n const err2 = errorNormalize(err as Error & { errCode?: number | string; errMsg?: string });\n\n return {\n errCode: err2.errCode || -1,\n errMsg: err2.errMsg || err2.message || '',\n // @ts-ignore\n data: null,\n ...append,\n };\n }\n}\n","import { parseCloudMethodOutput } from '@/_helpers';\nimport { objectDefaults, objectOmit } from '@cloudcome/utils-core/object';\nimport { tryFlatten } from '@cloudcome/utils-core/try';\nimport { isFunction } from '@cloudcome/utils-core/type';\nimport type { MaybePromise } from '@cloudcome/utils-core/types';\nimport type z from 'zod';\nimport type { ZodObject } from 'zod';\nimport { createCloudObjectError } from './error';\nimport { parseCloudModuleOutput } from './module';\nimport { respondCloudMethod } from './respond';\nimport type { CloudMethod, CloudModuleOutput, CloudObjectThis } from './types';\nimport type { UniIdCommonModule } from './uni-id';\n\ntype _CloudObjectThisAppendUser = {\n id: string;\n role: string[];\n permission: string[];\n isAdmin: boolean;\n};\n\ntype _CloudObjectThisAppend = {\n options: Required<CreateCloudObjectOptions>;\n user: _CloudObjectThisAppendUser;\n};\n\nexport type CloudObjectContext = CloudObjectThis & _CloudObjectThisAppend;\n\nexport type BuildCloudMethodCreatorOptions = {\n /**\n * UniId 通用模块\n * 用于处理用户身份验证和权限管理\n * 如果提供,将在云对象执行前验证用户身份\n */\n uniIdCommonModule?: UniIdCommonModule;\n\n /**\n * 需要用户登录态的错误码\n * @default 'uni-id-check-token-failed'\n */\n requiredUserErrCode?: number | string;\n\n /**\n * 需要用户登录态的错误消息\n * @default '需要登录后才能进行此操作'\n */\n requiredUserErrMsg?: string;\n\n /**\n * 仅允许本地环境运行的错误消息\n * @default '运行环境不匹配'\n */\n onlyLocalEnvErrMsg?: string;\n\n /**\n * 响应附加数据函数\n * 用于在云对象响应中添加额外的上下文信息\n * @param objectThis 云对象上下文\n * @returns 返回要附加到响应中的数据对象\n */\n respondAppend?: (objectThis: CloudObjectThis) => AnyObject;\n};\n\nexport type CreateCloudObjectOptions = {\n /**\n * 是否需要用户登录态\n * @default false\n */\n requiredUser?: boolean;\n\n /**\n * 是否仅在本地环境运行\n * @default false\n */\n onlyLocalEnv?: boolean;\n};\n\n/**\n * 云对象方法创建器类型定义\n *\n * 用于定义云对象方法的创建函数类型,支持两种重载形式:\n * 1. 带输入验证的版本:接收schema、处理函数和选项\n * 2. 无输入参数的版本:仅接收处理函数和选项\n */\nexport type CreateCloudMethod = {\n /**\n * 带输入验证的云对象方法创建器\n * @template S - Zod验证模式类型\n * @template O - 返回值类型\n * @param schema - Zod验证模式,用于验证输入数据\n * @param fn - 业务逻辑处理函数,接收上下文和验证后的输入数据\n * @param options - 云对象创建选项\n * @returns 云对象方法函数\n */\n <S extends ZodObject, O>(\n schema: S,\n fn: (context: CloudObjectContext, input: z.infer<S>) => MaybePromise<O>,\n options?: CreateCloudObjectOptions,\n ): CloudMethod<z.infer<S>, O>;\n\n /**\n * 无输入参数的云对象方法创建器\n * @template O - 返回值类型\n * @param fn - 业务逻辑处理函数,仅接收上下文\n * @param options - 云对象创建选项\n * @returns 云对象方法函数\n */\n <O>(fn: (context: CloudObjectContext) => MaybePromise<O>, options?: CreateCloudObjectOptions): CloudMethod<void, O>;\n};\n\n/**\n * 构建云对象方法创建器\n *\n * 该函数用于创建云对象方法的工厂函数,支持输入验证、用户身份验证、环境检查等功能。\n * 返回的创建器函数可以根据不同的配置创建云对象方法。\n *\n * @param options 构建选项,用于配置云对象方法创建器的行为\n * @returns 返回一个云对象方法创建器函数\n *\n * @example\n * // 创建一个需要用户登录的云对象方法\n * const createMethod = buildCloudMethodCreator({ uniIdCommonModule });\n * const myMethod = createMethod(async (context) => {\n * return { message: 'Hello ' + context.user.id };\n * }, { requiredUser: true });\n */\nexport function buildCloudMethodCreator(options?: BuildCloudMethodCreatorOptions) {\n const buildOptions = objectDefaults(options || {}, {\n requiredUserErrCode: 'uni-id-check-token-failed',\n requiredUserErrMsg: '需要登录后才能进行此操作',\n onlyLocalEnvErrMsg: '运行环境不匹配',\n respondAppend: () => ({}),\n }) as Required<BuildCloudMethodCreatorOptions>;\n\n // @ts-ignore\n const createCloudMethod: CreateCloudMethod = (arg0, arg1, arg2) => {\n // 确定选项来源:如果arg0是函数,则选项在arg1;否则在arg2\n const optionsSource = (isFunction(arg0) ? arg1 : arg2) as CreateCloudObjectOptions | undefined;\n\n // 设置默认选项值\n const createOptions = objectDefaults(optionsSource || {}, {\n requiredUser: false,\n onlyLocalEnv: false,\n }) as Required<CreateCloudObjectOptions>;\n\n return async function (input) {\n // 处理云对象方法响应逻辑,包括错误捕获和统一响应格式\n return await respondCloudMethod(async () => {\n const runtimeEnv = this.getCloudInfo().runtimeEnv;\n\n if (createOptions.onlyLocalEnv && runtimeEnv !== 'local') {\n throw createCloudObjectError(buildOptions.onlyLocalEnvErrMsg);\n }\n\n // 构建附加的上下文信息,包括用户身份和权限信息\n const user = await _parseAppendUser(this, options?.uniIdCommonModule);\n const append: _CloudObjectThisAppend = {\n options: createOptions,\n user: user,\n };\n const context = Object.assign(this, append) as CloudObjectContext;\n\n // 如果需要用户登录态但用户未登录,则抛出错误\n if (createOptions.requiredUser && !user.id) {\n throw createCloudObjectError(buildOptions.requiredUserErrMsg, buildOptions.requiredUserErrCode);\n }\n\n // 无入参函数调用\n if (isFunction(arg0)) {\n return await arg0(context);\n }\n\n // 有入参函数调用 - 验证输入数据\n const parsed = arg0.safeParse(input);\n\n // 输入验证失败处理\n if (!parsed.success) {\n console.log(parsed.error.issues);\n\n const issue0 = parsed.error?.issues?.[0];\n\n // 处理自定义验证错误\n if (issue0?.code === 'custom') throw issue0.message;\n throw new Error('请求数据不正确');\n }\n\n // 执行业务逻辑函数,传入上下文和验证后的数据\n return await arg1(context, parsed.data);\n }, buildOptions.respondAppend(this));\n };\n };\n\n return createCloudMethod;\n}\n\n/**\n * 解析并附加用户信息到云对象上下文\n *\n * 该函数用于验证用户身份并获取用户权限信息,将结果附加到云对象上下文中的user字段\n * 如果未提供uniIdCommonModule或验证失败,则返回默认的空用户信息\n *\n * @param objectThis 云对象上下文,包含客户端信息和token等\n * @param uniIdCommonModule 可选的UniId通用模块实例,用于验证用户token\n * @returns 返回包含用户ID、角色、权限等信息的对象\n *\n * @example\n * // 成功验证用户身份\n * const user = await _parseAppendUser(this, uniIdModule);\n * // 返回: { id: 'user123', role: ['user'], permission: ['read'], isAdmin: false }\n *\n * @example\n * // 验证失败或未提供模块\n * const user = await _parseAppendUser(this);\n * // 返回: { id: '', role: [], permission: [], isAdmin: false }\n */\nasync function _parseAppendUser(\n objectThis: CloudObjectThis,\n uniIdCommonModule?: UniIdCommonModule,\n): Promise<_CloudObjectThisAppendUser> {\n const appendUser: _CloudObjectThisAppendUser = {\n id: '',\n role: [],\n permission: [],\n isAdmin: false,\n };\n\n if (!uniIdCommonModule) return appendUser;\n\n const uic = uniIdCommonModule.createInstance({\n clientInfo: objectThis.getClientInfo(),\n });\n\n // 验证用户token,忽略验证过程中的错误\n const [err1, user] = await tryFlatten(uic.checkToken(objectThis.getUniIdToken() || ''));\n if (!user) return appendUser;\n\n // 解析验证结果,忽略解析过程中的错误\n const [err2, userData] = tryFlatten(() => parseCloudModuleOutput(user));\n if (!userData) return appendUser;\n\n appendUser.id = userData.uid || '';\n appendUser.role = userData.role || [];\n appendUser.permission = userData.permission || [];\n appendUser.isAdmin = appendUser.role.includes('admin') && appendUser.permission.length === 0;\n\n return appendUser;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { DatabaseCommand } from './types';
2
+ /**
3
+ * 数据库操作符命令
4
+ */
5
+ export declare const dbCmd: DatabaseCommand;
6
+ /**
7
+ * 数据库聚合操作符命令
8
+ */
9
+ export declare const dbAgg: UniCloud.AggregateCommand & {
10
+ pipeline: () => UniCloud.AggregateReference & {
11
+ done: () => unknown;
12
+ };
13
+ };
@@ -1,7 +1,7 @@
1
1
  import { AnyObject, Exact, HasProperty, IsEmptyObject, IsOnlyProperty, MergeIntersection } from '@cloudcome/utils-core/types';
2
- import { UniClientDatabaseOutput, UniCloudDatabaseOutput, UniDatabaseCommand, UniDatabaseMutateCommand, UniDatabaseQueryCommand } from './types';
2
+ import { DatabaseMutateCommand, DatabaseQueryCommand } from './types';
3
3
  export type DbWhere<T> = {
4
- [K in keyof T]?: T[K] | UniDatabaseQueryCommand;
4
+ [K in keyof T]?: T[K] | DatabaseQueryCommand;
5
5
  };
6
6
  export type DbSelect<T> = {
7
7
  [K in keyof T]?: K extends '_id' ? boolean : true;
@@ -23,21 +23,9 @@ export type DbQuery<T, S extends DbSelect<T>, R> = _DbQuery<T, _DbFields<T, S>>
23
23
  export type DbForeign<T, S extends DbSelect<T>, R, J extends DbJoinType, A> = Record<A & string, J extends '1:1' ? DbQuery<T, S, R> : DbQuery<T, S, R>[]>;
24
24
  export type DbCreate<T> = Partial<T>;
25
25
  export type DbUpdate<T> = {
26
- [K in keyof T]?: T[K] | UniDatabaseMutateCommand;
26
+ [K in keyof T]?: T[K] | DatabaseMutateCommand;
27
27
  };
28
28
  export type DbOrder<T> = Record<keyof T, 'asc' | 'desc'>;
29
- /**
30
- * 数据库操作符命令
31
- */
32
- export declare const dbCmd: UniDatabaseCommand;
33
- /**
34
- * 数据库聚合操作符命令
35
- */
36
- export declare const dbAgg: UniCloud.AggregateCommand & {
37
- pipeline: () => UniCloud.AggregateReference & {
38
- done: () => unknown;
39
- };
40
- };
41
29
  export type DbOptions = {
42
30
  /**
43
31
  * 数据表名称
@@ -191,29 +179,4 @@ export declare class Db<T, S extends DbSelect<T> = {}, R extends AnyObject = {}>
191
179
  */
192
180
  remove(): Promise<number>;
193
181
  }
194
- export type DbProxy<T, S extends DbSelect<T> = {}, R extends AnyObject = {}> = Db<T, S, R> & {
195
- _isProxy: true;
196
- };
197
- /**
198
- * 数据库操作对象
199
- */
200
- export declare const db: {
201
- /**
202
- * 获取指定名称的数据库集合实例
203
- * @param name 数据表名称
204
- * @returns Db类实例,用于执行数据库操作
205
- */
206
- table<T, S extends DbSelect<T> = {}, R extends AnyObject = {}>(name: string): DbProxy<T>;
207
- };
208
- /**
209
- * 解析数据库执行结果
210
- * @param res 客户端、云端响应结果
211
- * @returns 处理后的结果
212
- */
213
- export declare function parseDatabaseOutput<T>(res: UniClientDatabaseOutput<T> | UniCloudDatabaseOutput<T>): T | Omit<T & {
214
- code?: number | string;
215
- errCode?: number | string;
216
- errMsg?: string;
217
- message?: string;
218
- }, "errCode" | "errMsg" | "code" | "message">;
219
182
  export {};
@@ -0,0 +1,20 @@
1
+ import { AnyObject } from '@cloudcome/utils-core/types';
2
+ import { Db, DbSelect } from './db.class';
3
+ /**
4
+ * DbProxy 类型定义,用于创建数据库代理对象
5
+ * @template T - 数据库表的类型
6
+ * @template S - 数据库选择器类型,默认为空对象
7
+ * @template R - 数据库返回结果类型,默认为空对象
8
+ */
9
+ export type DbProxy<T, S extends DbSelect<T> = {}, R extends AnyObject = {}> = Db<T, S, R> & {
10
+ _isProxy: true;
11
+ };
12
+ /**
13
+ * 创建一个数据库代理对象,用于延迟实例化数据库操作类
14
+ * @template T - 数据库表的类型
15
+ * @template S - 数据库选择器类型,默认为空对象
16
+ * @template R - 数据库返回结果类型,默认为空对象
17
+ * @param name - 数据库表名
18
+ * @returns 返回一个代理对象,该对象会将属性访问转发到实际的数据库操作实例
19
+ */
20
+ export declare function dbProxy<T, S extends DbSelect<T> = {}, R extends AnyObject = {}>(name: string): DbProxy<T>;
@@ -0,0 +1,24 @@
1
+ import { AnyObject } from '@cloudcome/utils-core/types';
2
+ import { Db, DbSelect } from './db.class';
3
+ import { DbProxy } from './proxy';
4
+ type _WithTransaction = <T, S extends DbSelect<T>, R extends AnyObject>(table: DbProxy<T, S, R>) => Db<T, S, R>;
5
+ /**
6
+ * 在数据库事务中执行操作
7
+ *
8
+ * @template T - 事务操作返回值类型
9
+ * @param transacting - 事务执行函数,接收事务数据库实例作为参数
10
+ * @param _mockDatabase - 用于测试的模拟数据库对象
11
+ * @param _mockDbInstance - 用于测试的模拟数据库实例
12
+ * @returns 事务操作的返回结果
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const result = await dbTransaction(async (withTransaction) => {
17
+ * const userId = await withTransaction(db.table('user')).create({ name: 'John' });
18
+ * const order = await withTransaction(db.table('orders')).create({ userId, amount: 100 });
19
+ * return { user, order };
20
+ * });
21
+ * ```
22
+ */
23
+ export declare function dbTransaction<K>(transacting: (withTransaction: _WithTransaction) => Promise<K>, _mockDatabase?: any, _mockDbInstance?: any): Promise<K>;
24
+ export {};
@@ -1,4 +1,4 @@
1
- export type UniClientDatabaseOutput<T> = {
1
+ export type ClientDatabaseOutput<T> = {
2
2
  result: T & {
3
3
  code?: number | string;
4
4
  errCode?: number | string;
@@ -6,145 +6,145 @@ export type UniClientDatabaseOutput<T> = {
6
6
  message?: string;
7
7
  };
8
8
  };
9
- export type UniCloudDatabaseOutput<T> = T;
10
- export type UniDatabaseQueryCommand = {
9
+ export type CloudDatabaseOutput<T> = T;
10
+ export type DatabaseQueryCommand = {
11
11
  _: never;
12
12
  };
13
- export type UniDatabaseMutateCommand = {
13
+ export type DatabaseMutateCommand = {
14
14
  _: never;
15
15
  };
16
16
  /**
17
- * UniDatabaseCommand 数据库操作命令类型定义
17
+ * DatabaseCommand 数据库操作命令类型定义
18
18
  */
19
- export type UniDatabaseCommand = {
19
+ export type DatabaseCommand = {
20
20
  /**
21
21
  * 聚合表达式操作符
22
22
  * @param expr 表达式参数
23
23
  * @returns 返回聚合表达式结果
24
24
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-expr expr 文档}
25
25
  */
26
- expr: (expr: unknown) => UniDatabaseQueryCommand;
26
+ expr: (expr: unknown) => DatabaseQueryCommand;
27
27
  /**
28
28
  * 等于操作符
29
29
  * @param value 比较值
30
30
  * @returns 返回查询条件
31
31
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-eq eq 文档}
32
32
  */
33
- eq: (value: unknown) => UniDatabaseQueryCommand;
33
+ eq: (value: unknown) => DatabaseQueryCommand;
34
34
  /**
35
35
  * 不等于操作符
36
36
  * @param value 比较值
37
37
  * @returns 返回查询条件
38
38
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-neq neq 文档}
39
39
  */
40
- neq: (value: unknown) => UniDatabaseQueryCommand;
40
+ neq: (value: unknown) => DatabaseQueryCommand;
41
41
  /**
42
42
  * 大于操作符
43
43
  * @param value 比较值
44
44
  * @returns 返回查询条件
45
45
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-gt gt 文档}
46
46
  */
47
- gt: (value: unknown) => UniDatabaseQueryCommand;
47
+ gt: (value: unknown) => DatabaseQueryCommand;
48
48
  /**
49
49
  * 大于等于操作符
50
50
  * @param value 比较值
51
51
  * @returns 返回查询条件
52
52
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-gte gte 文档}
53
53
  */
54
- gte: (value: unknown) => UniDatabaseQueryCommand;
54
+ gte: (value: unknown) => DatabaseQueryCommand;
55
55
  /**
56
56
  * 小于操作符
57
57
  * @param value 比较值
58
58
  * @returns 返回查询条件
59
59
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-lt lt 文档}
60
60
  */
61
- lt: (value: unknown) => UniDatabaseQueryCommand;
61
+ lt: (value: unknown) => DatabaseQueryCommand;
62
62
  /**
63
63
  * 小于等于操作符
64
64
  * @param value 比较值
65
65
  * @returns 返回查询条件
66
66
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-lte lte 文档}
67
67
  */
68
- lte: (value: unknown) => UniDatabaseQueryCommand;
68
+ lte: (value: unknown) => DatabaseQueryCommand;
69
69
  /**
70
70
  * 包含在数组内操作符
71
71
  * @param value 包含的值数组
72
72
  * @returns 返回查询条件
73
73
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-in in 文档}
74
74
  */
75
- in: (value: unknown[]) => UniDatabaseQueryCommand;
75
+ in: (value: unknown[]) => DatabaseQueryCommand;
76
76
  /**
77
77
  * 不包含在数组内操作符
78
78
  * @param value 不包含的值数组
79
79
  * @returns 返回查询条件
80
80
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-nin nin 文档}
81
81
  */
82
- nin: (value: unknown[]) => UniDatabaseQueryCommand;
82
+ nin: (value: unknown[]) => DatabaseQueryCommand;
83
83
  /**
84
84
  * 逻辑与操作符
85
85
  * @param args 多个查询条件
86
86
  * @returns 返回逻辑与查询条件
87
87
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-and and 文档}
88
88
  */
89
- and: (...args: unknown[]) => UniDatabaseQueryCommand;
89
+ and: (...args: unknown[]) => DatabaseQueryCommand;
90
90
  /**
91
91
  * 逻辑或操作符
92
92
  * @param args 多个查询条件
93
93
  * @returns 返回逻辑或查询条件
94
94
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-or or 文档}
95
95
  */
96
- or: (...args: unknown[]) => UniDatabaseQueryCommand;
96
+ or: (...args: unknown[]) => DatabaseQueryCommand;
97
97
  /**
98
98
  * 自增操作符
99
99
  * @param value 增加的数值
100
100
  * @returns 返回更新操作
101
101
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-inc inc 文档}
102
102
  */
103
- inc: (value: number) => UniDatabaseMutateCommand;
103
+ inc: (value: number) => DatabaseMutateCommand;
104
104
  /**
105
105
  * 自乘操作符
106
106
  * @param value 相乘的数值
107
107
  * @returns 返回更新操作
108
108
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-mul mul 文档}
109
109
  */
110
- mul: (value: number) => UniDatabaseMutateCommand;
110
+ mul: (value: number) => DatabaseMutateCommand;
111
111
  /**
112
112
  * 设置字段值操作符
113
113
  * @param value 设置的值
114
114
  * @returns 返回更新操作
115
115
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-set set 文档}
116
116
  */
117
- set: (value: unknown) => UniDatabaseMutateCommand;
117
+ set: (value: unknown) => DatabaseMutateCommand;
118
118
  /**
119
119
  * 数组末尾添加元素操作符
120
120
  * @param value 添加的值
121
121
  * @returns 返回更新操作
122
122
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-push push 文档}
123
123
  */
124
- push: (value: unknown) => UniDatabaseMutateCommand;
124
+ push: (value: unknown) => DatabaseMutateCommand;
125
125
  /**
126
126
  * 数组开头添加元素操作符
127
127
  * @param value 添加的值
128
128
  * @returns 返回更新操作
129
129
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-unshift unshift 文档}
130
130
  */
131
- unshift: (value: unknown) => UniDatabaseMutateCommand;
131
+ unshift: (value: unknown) => DatabaseMutateCommand;
132
132
  /**
133
133
  * 删除数组末尾元素操作符
134
134
  * @returns 返回更新操作
135
135
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-pop pop 文档}
136
136
  */
137
- pop: () => UniDatabaseMutateCommand;
137
+ pop: () => DatabaseMutateCommand;
138
138
  /**
139
139
  * 删除数组开头元素操作符
140
140
  * @returns 返回更新操作
141
141
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-shift shift 文档}
142
142
  */
143
- shift: () => UniDatabaseMutateCommand;
143
+ shift: () => DatabaseMutateCommand;
144
144
  /**
145
145
  * 删除字段操作符
146
146
  * @returns 返回更新操作
147
147
  * @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-remove remove 文档}
148
148
  */
149
- remove: () => UniDatabaseMutateCommand;
149
+ remove: () => DatabaseMutateCommand;
150
150
  };
@@ -0,0 +1,27 @@
1
+ import { DbCreate, DbSelect, DbUpdate, DbWhere } from './db.class';
2
+ import { DbProxy } from './proxy';
3
+ export type DbUniqueOptions<T, S extends DbSelect<T>, C extends DbCreate<T>, U extends DbUpdate<T>> = {
4
+ /** 查询条件 */
5
+ where: DbWhere<T>;
6
+ /** 创建数据 */
7
+ create: C;
8
+ /** 创建前回调函数 */
9
+ onBeforeCreate?: () => unknown;
10
+ /**
11
+ * 创建后回调函数
12
+ * @param id 创建的文档ID
13
+ */
14
+ onAfterCreate?: (id: string) => unknown;
15
+ /** 用于测试的模拟数据库实例 */
16
+ _mockDbInstance?: any;
17
+ };
18
+ /**
19
+ * 数据库 upsert 操作的返回结果类型
20
+ */
21
+ export type DbUniqueOutput = {
22
+ /** 操作的文档ID */
23
+ id: string;
24
+ /** 是否为创建操作 */
25
+ created: boolean;
26
+ };
27
+ export declare function dbUnique<T, S extends DbSelect<T>, C extends DbCreate<T>, U extends DbUpdate<T>>(dbProxy: DbProxy<T>, options: DbUniqueOptions<T, S, C, U>): Promise<DbUniqueOutput>;