@cloudcome/utils-uni 1.11.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/_helpers.cjs +14 -2
- package/dist/_helpers.cjs.map +1 -1
- package/dist/_helpers.d.ts +21 -6
- package/dist/_helpers.mjs +14 -2
- package/dist/_helpers.mjs.map +1 -1
- package/dist/client.cjs +8 -7
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.ts +43 -18
- package/dist/client.mjs +9 -8
- package/dist/client.mjs.map +1 -1
- package/dist/cloud/method.d.ts +102 -0
- package/dist/cloud/module.d.ts +27 -0
- package/dist/cloud/respond.d.ts +11 -17
- package/dist/cloud/types.d.ts +27 -12
- package/dist/cloud/uni-id.d.ts +2 -2
- package/dist/cloud.cjs +16 -16
- package/dist/cloud.cjs.map +1 -1
- package/dist/cloud.d.ts +3 -2
- package/dist/cloud.mjs +17 -17
- package/dist/cloud.mjs.map +1 -1
- package/dist/database/command.d.ts +13 -0
- package/dist/database/{db.d.ts → db.class.d.ts} +12 -44
- package/dist/database/proxy.d.ts +20 -0
- package/dist/database/transaction.d.ts +24 -0
- package/dist/database/types.d.ts +29 -23
- package/dist/database/unique.d.ts +27 -0
- package/dist/database/{fns.d.ts → upsert.d.ts} +4 -24
- package/dist/database.cjs +38 -48
- package/dist/database.cjs.map +1 -1
- package/dist/database.d.ts +6 -2
- package/dist/database.mjs +32 -42
- package/dist/database.mjs.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +3 -3
- package/dist/cloud/expose.d.ts +0 -124
package/dist/cloud.cjs
CHANGED
|
@@ -11,7 +11,13 @@ function createCloudObjectError(message, code) {
|
|
|
11
11
|
errMsg: message
|
|
12
12
|
});
|
|
13
13
|
}
|
|
14
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
84
|
+
return createCloudMethod;
|
|
79
85
|
}
|
|
80
|
-
async function
|
|
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
|
-
|
|
102
|
-
|
|
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.
|
|
111
|
+
exports.respondCloudMethod = respondCloudMethod;
|
|
112
112
|
//# sourceMappingURL=cloud.cjs.map
|
package/dist/cloud.cjs.map
CHANGED
|
@@ -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 {
|
|
1
|
+
export { parseCloudMethodOutput } from './_helpers';
|
|
2
2
|
export * from './cloud/error';
|
|
3
|
-
export * from './cloud/
|
|
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 {
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
82
|
+
return createCloudMethod;
|
|
77
83
|
}
|
|
78
|
-
async function
|
|
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
|
-
|
|
106
|
+
buildCloudMethodCreator,
|
|
107
107
|
createCloudObjectError,
|
|
108
|
+
p as parseCloudMethodOutput,
|
|
108
109
|
parseCloudModuleOutput,
|
|
109
|
-
|
|
110
|
-
respondCloudObject
|
|
110
|
+
respondCloudMethod
|
|
111
111
|
};
|
|
112
112
|
//# sourceMappingURL=cloud.mjs.map
|
package/dist/cloud.mjs.map
CHANGED
|
@@ -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":";;;;;AAEgB,SAAA,uBAAuB,SAAiB,MAAwB;AAC9E,SAAO,YAAY,IAAI,MAAM,OAAO,GAAG;AAAA,IACrC,SAAS;AAAA,IACT,QAAQ;AAAA,EAAA,CACT;AACH;ACkBsB,eAAA,mBACpB,IACA,QACkC;AAC9B,MAAA;AACI,UAAA,OAAO,MAAM,GAAG;AAEf,WAAA;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR;AAAA,MACA,GAAG;AAAA,IACL;AAAA,WACO,KAAK;AACZ,YAAQ,MAAM,0BAA0B;AACxC,YAAQ,MAAM,GAAG;AAEX,UAAA,OAAO,eAAe,GAA6D;AAElF,WAAA;AAAA,MACL,SAAS,KAAK,WAAW;AAAA,MACzB,QAAQ,KAAK,UAAU,KAAK,WAAW;AAAA;AAAA,MAEvC,MAAM;AAAA,MACN,GAAG;AAAA,IACL;AAAA,EAAA;AAEJ;ACuEO,SAAS,8BAA8B,SAA0C;AACtF,QAAM,eAAe,eAAe,WAAW,IAAI;AAAA,IACjD,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,eAAe,OAAO,CAAC;AAAA,EAAA,CACxB;AAGD,QAAM,0BAAmD,CAAC,MAAM,MAAM,SAAS;AAE7E,UAAM,gBAAiB,WAAW,IAAI,IAAI,OAAO;AAGjD,UAAM,gBAAgB,eAAe,iBAAiB,IAAI;AAAA,MACxD,cAAc;AAAA,MACd,cAAc;AAAA,IAAA,CACf;AAED,WAAO,eAAgB,OAAO;AAErB,aAAA,MAAM,mBAAmB,YAAY;AACpC,cAAA,aAAa,KAAK,aAAA,EAAe;AAEnC,YAAA,cAAc,gBAAgB,eAAe,SAAS;AAClD,gBAAA,uBAAuB,aAAa,kBAAkB;AAAA,QAAA;AAI9D,cAAM,OAAO,MAAM,gBAAgB,MAAM,SAAS,iBAAiB;AACnE,cAAM,SAAmC;AAAA,UACvC,SAAS;AAAA,UACT;AAAA,QACF;AACA,cAAM,UAAU,OAAO,OAAO,MAAM,MAAM;AAG1C,YAAI,cAAc,gBAAgB,CAAC,KAAK,IAAI;AAC1C,gBAAM,uBAAuB,aAAa,oBAAoB,aAAa,mBAAmB;AAAA,QAAA;AAI5F,YAAA,WAAW,IAAI,GAAG;AACb,iBAAA,MAAM,KAAK,OAAO;AAAA,QAAA;AAIrB,cAAA,SAAS,KAAK,UAAU,KAAK;AAG/B,YAAA,CAAC,OAAO,SAAS;AACX,kBAAA,IAAI,OAAO,MAAM,MAAM;AAE/B,gBAAM,SAAS,OAAO,OAAO,SAAS,CAAC;AAGvC,cAAI,QAAQ,SAAS,SAAU,OAAM,OAAO;AACtC,gBAAA,IAAI,MAAM,SAAS;AAAA,QAAA;AAI3B,eAAO,MAAM,KAAK,SAAS,OAAO,IAAI;AAAA,MAAA,GACrC,aAAa,cAAc,IAAI,CAAC;AAAA,IACrC;AAAA,EACF;AAEO,SAAA;AACT;AAEA,eAAe,gBACb,YACA,mBACuC;AACvC,QAAM,aAA2C;AAAA,IAC/C,IAAI;AAAA,IACJ,MAAM,CAAC;AAAA,IACP,YAAY,CAAC;AAAA,IACb,SAAS;AAAA,EACX;AAEI,MAAA,CAAC,kBAA0B,QAAA;AAEzB,QAAA,MAAM,kBAAkB,eAAe;AAAA,IAC3C,YAAY,WAAW,cAAc;AAAA,EAAA,CACtC;AAGD,QAAM,CAAC,MAAM,IAAI,IAAI,MAAM,WAAW,IAAI,WAAW,WAAW,cAAmB,KAAA,EAAE,CAAC;AAClF,MAAA,CAAC,KAAa,QAAA;AAGZ,QAAA,CAAC,MAAM,QAAQ,IAAI,WAAW,MAAM,uBAAuB,IAAI,CAAC;AAClE,MAAA,CAAC,SAAiB,QAAA;AAEX,aAAA,KAAK,SAAS,OAAO;AACrB,aAAA,OAAO,SAAS,QAAQ,CAAC;AACzB,aAAA,aAAa,SAAS,cAAc,CAAC;AACrC,aAAA,UAAU,WAAW,KAAK,SAAS,OAAO,KAAK,WAAW,WAAW,WAAW;AAEpF,SAAA;AACT;AA2BgB,SAAA,uBACd,QACA,uBAAuB,IACQ;AAC/B,MAAI,OAAO,SAAS;AAClB,UAAM,uBAAuB,OAAO,UAAU,sBAAsB,OAAO,OAAO;AAAA,EAAA;AAEpF,SAAO,WAAW,QAAQ,CAAC,WAAW,QAAQ,CAAC;AACjD;"}
|
|
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,15 +1,18 @@
|
|
|
1
|
-
import { AnyObject, HasProperty, IsEmptyObject, IsOnlyProperty, MergeIntersection } from '@cloudcome/utils-core/types';
|
|
2
|
-
import {
|
|
1
|
+
import { AnyObject, Exact, HasProperty, IsEmptyObject, IsOnlyProperty, MergeIntersection } from '@cloudcome/utils-core/types';
|
|
2
|
+
import { DatabaseMutateCommand, DatabaseQueryCommand } from './types';
|
|
3
3
|
export type DbWhere<T> = {
|
|
4
|
-
[K in keyof T]?:
|
|
4
|
+
[K in keyof T]?: T[K] | DatabaseQueryCommand;
|
|
5
5
|
};
|
|
6
6
|
export type DbSelect<T> = {
|
|
7
|
-
[K in keyof T]?: K extends '_id' ?
|
|
7
|
+
[K in keyof T]?: K extends '_id' ? boolean : true;
|
|
8
8
|
};
|
|
9
9
|
export type DbFieldsDefault<T> = {
|
|
10
10
|
[K in keyof T]: true;
|
|
11
11
|
};
|
|
12
|
-
type
|
|
12
|
+
type _OnlyFieldId<T, V> = IsOnlyProperty<T, '_id'> extends true ? '_id' extends keyof T ? T['_id'] extends V ? true : false : false : false;
|
|
13
|
+
type _DbFields<T, S extends DbSelect<T>> = IsEmptyObject<S> extends true ? DbFieldsDefault<T> : _OnlyFieldId<S, false> extends true ? Omit<DbFieldsDefault<T>, '_id'> : _OnlyFieldId<S, true> extends true ? {
|
|
14
|
+
_id: true;
|
|
15
|
+
} : HasProperty<S, '_id'> extends true ? S : // 没有的话补上 {_id, ...}
|
|
13
16
|
S & {
|
|
14
17
|
_id: true;
|
|
15
18
|
};
|
|
@@ -19,20 +22,10 @@ type _DbQuery<T, S extends Record<keyof T, boolean>> = {
|
|
|
19
22
|
export type DbQuery<T, S extends DbSelect<T>, R> = _DbQuery<T, _DbFields<T, S>> & R;
|
|
20
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>[]>;
|
|
21
24
|
export type DbCreate<T> = Partial<T>;
|
|
22
|
-
export type DbUpdate<T> =
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* 数据库操作符命令
|
|
26
|
-
*/
|
|
27
|
-
export declare const dbCmd: UniDatabaseCommand;
|
|
28
|
-
/**
|
|
29
|
-
* 数据库聚合操作符命令
|
|
30
|
-
*/
|
|
31
|
-
export declare const dbAgg: UniCloud.AggregateCommand & {
|
|
32
|
-
pipeline: () => UniCloud.AggregateReference & {
|
|
33
|
-
done: () => unknown;
|
|
34
|
-
};
|
|
25
|
+
export type DbUpdate<T> = {
|
|
26
|
+
[K in keyof T]?: T[K] | DatabaseMutateCommand;
|
|
35
27
|
};
|
|
28
|
+
export type DbOrder<T> = Record<keyof T, 'asc' | 'desc'>;
|
|
36
29
|
export type DbOptions = {
|
|
37
30
|
/**
|
|
38
31
|
* 数据表名称
|
|
@@ -129,7 +122,7 @@ export declare class Db<T, S extends DbSelect<T> = {}, R extends AnyObject = {}>
|
|
|
129
122
|
* @param fields 要返回的字段对象,true表示返回,false表示不返回
|
|
130
123
|
* @returns 当前Db实例,支持链式调用
|
|
131
124
|
*/
|
|
132
|
-
select<U extends DbSelect<T>>(fields: U): Db<T, S & U, R>;
|
|
125
|
+
select<U extends DbSelect<T>>(fields: Exact<U, DbSelect<T>>): Db<T, S & U, R>;
|
|
133
126
|
/**
|
|
134
127
|
* 设置排序规则
|
|
135
128
|
* @param order 排序规则对象,key为字段名,value为"asc"或"desc"
|
|
@@ -186,29 +179,4 @@ export declare class Db<T, S extends DbSelect<T> = {}, R extends AnyObject = {}>
|
|
|
186
179
|
*/
|
|
187
180
|
remove(): Promise<number>;
|
|
188
181
|
}
|
|
189
|
-
export type DbProxy<T, S extends DbSelect<T> = {}, R extends AnyObject = {}> = Db<T, S, R> & {
|
|
190
|
-
_isProxy: true;
|
|
191
|
-
};
|
|
192
|
-
/**
|
|
193
|
-
* 数据库操作对象
|
|
194
|
-
*/
|
|
195
|
-
export declare const db: {
|
|
196
|
-
/**
|
|
197
|
-
* 获取指定名称的数据库集合实例
|
|
198
|
-
* @param name 数据表名称
|
|
199
|
-
* @returns Db类实例,用于执行数据库操作
|
|
200
|
-
*/
|
|
201
|
-
table<T, S extends DbSelect<T> = {}, R extends AnyObject = {}>(name: string): DbProxy<T>;
|
|
202
|
-
};
|
|
203
|
-
/**
|
|
204
|
-
* 解析数据库执行结果
|
|
205
|
-
* @param res 客户端、云端响应结果
|
|
206
|
-
* @returns 处理后的结果
|
|
207
|
-
*/
|
|
208
|
-
export declare function parseDatabaseOutput<T>(res: UniClientDatabaseOutput<T> | UniCloudDatabaseOutput<T>): T | Omit<T & {
|
|
209
|
-
code?: number | string;
|
|
210
|
-
errCode?: number | string;
|
|
211
|
-
errMsg?: string;
|
|
212
|
-
message?: string;
|
|
213
|
-
}, "errCode" | "errMsg" | "code" | "message">;
|
|
214
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 {};
|
package/dist/database/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type ClientDatabaseOutput<T> = {
|
|
2
2
|
result: T & {
|
|
3
3
|
code?: number | string;
|
|
4
4
|
errCode?: number | string;
|
|
@@ -6,139 +6,145 @@ export type UniClientDatabaseOutput<T> = {
|
|
|
6
6
|
message?: string;
|
|
7
7
|
};
|
|
8
8
|
};
|
|
9
|
-
export type
|
|
9
|
+
export type CloudDatabaseOutput<T> = T;
|
|
10
|
+
export type DatabaseQueryCommand = {
|
|
11
|
+
_: never;
|
|
12
|
+
};
|
|
13
|
+
export type DatabaseMutateCommand = {
|
|
14
|
+
_: never;
|
|
15
|
+
};
|
|
10
16
|
/**
|
|
11
|
-
*
|
|
17
|
+
* DatabaseCommand 数据库操作命令类型定义
|
|
12
18
|
*/
|
|
13
|
-
export type
|
|
19
|
+
export type DatabaseCommand = {
|
|
14
20
|
/**
|
|
15
21
|
* 聚合表达式操作符
|
|
16
22
|
* @param expr 表达式参数
|
|
17
23
|
* @returns 返回聚合表达式结果
|
|
18
24
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-expr expr 文档}
|
|
19
25
|
*/
|
|
20
|
-
expr: (expr: unknown) =>
|
|
26
|
+
expr: (expr: unknown) => DatabaseQueryCommand;
|
|
21
27
|
/**
|
|
22
28
|
* 等于操作符
|
|
23
29
|
* @param value 比较值
|
|
24
30
|
* @returns 返回查询条件
|
|
25
31
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-eq eq 文档}
|
|
26
32
|
*/
|
|
27
|
-
eq: (value: unknown) =>
|
|
33
|
+
eq: (value: unknown) => DatabaseQueryCommand;
|
|
28
34
|
/**
|
|
29
35
|
* 不等于操作符
|
|
30
36
|
* @param value 比较值
|
|
31
37
|
* @returns 返回查询条件
|
|
32
38
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-neq neq 文档}
|
|
33
39
|
*/
|
|
34
|
-
neq: (value: unknown) =>
|
|
40
|
+
neq: (value: unknown) => DatabaseQueryCommand;
|
|
35
41
|
/**
|
|
36
42
|
* 大于操作符
|
|
37
43
|
* @param value 比较值
|
|
38
44
|
* @returns 返回查询条件
|
|
39
45
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-gt gt 文档}
|
|
40
46
|
*/
|
|
41
|
-
gt: (value: unknown) =>
|
|
47
|
+
gt: (value: unknown) => DatabaseQueryCommand;
|
|
42
48
|
/**
|
|
43
49
|
* 大于等于操作符
|
|
44
50
|
* @param value 比较值
|
|
45
51
|
* @returns 返回查询条件
|
|
46
52
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-gte gte 文档}
|
|
47
53
|
*/
|
|
48
|
-
gte: (value: unknown) =>
|
|
54
|
+
gte: (value: unknown) => DatabaseQueryCommand;
|
|
49
55
|
/**
|
|
50
56
|
* 小于操作符
|
|
51
57
|
* @param value 比较值
|
|
52
58
|
* @returns 返回查询条件
|
|
53
59
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-lt lt 文档}
|
|
54
60
|
*/
|
|
55
|
-
lt: (value: unknown) =>
|
|
61
|
+
lt: (value: unknown) => DatabaseQueryCommand;
|
|
56
62
|
/**
|
|
57
63
|
* 小于等于操作符
|
|
58
64
|
* @param value 比较值
|
|
59
65
|
* @returns 返回查询条件
|
|
60
66
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-lte lte 文档}
|
|
61
67
|
*/
|
|
62
|
-
lte: (value: unknown) =>
|
|
68
|
+
lte: (value: unknown) => DatabaseQueryCommand;
|
|
63
69
|
/**
|
|
64
70
|
* 包含在数组内操作符
|
|
65
71
|
* @param value 包含的值数组
|
|
66
72
|
* @returns 返回查询条件
|
|
67
73
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-in in 文档}
|
|
68
74
|
*/
|
|
69
|
-
in: (value: unknown[]) =>
|
|
75
|
+
in: (value: unknown[]) => DatabaseQueryCommand;
|
|
70
76
|
/**
|
|
71
77
|
* 不包含在数组内操作符
|
|
72
78
|
* @param value 不包含的值数组
|
|
73
79
|
* @returns 返回查询条件
|
|
74
80
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-nin nin 文档}
|
|
75
81
|
*/
|
|
76
|
-
nin: (value: unknown[]) =>
|
|
82
|
+
nin: (value: unknown[]) => DatabaseQueryCommand;
|
|
77
83
|
/**
|
|
78
84
|
* 逻辑与操作符
|
|
79
85
|
* @param args 多个查询条件
|
|
80
86
|
* @returns 返回逻辑与查询条件
|
|
81
87
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-and and 文档}
|
|
82
88
|
*/
|
|
83
|
-
and: (...args: unknown[]) =>
|
|
89
|
+
and: (...args: unknown[]) => DatabaseQueryCommand;
|
|
84
90
|
/**
|
|
85
91
|
* 逻辑或操作符
|
|
86
92
|
* @param args 多个查询条件
|
|
87
93
|
* @returns 返回逻辑或查询条件
|
|
88
94
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#dbcmd-or or 文档}
|
|
89
95
|
*/
|
|
90
|
-
or: (...args: unknown[]) =>
|
|
96
|
+
or: (...args: unknown[]) => DatabaseQueryCommand;
|
|
91
97
|
/**
|
|
92
98
|
* 自增操作符
|
|
93
99
|
* @param value 增加的数值
|
|
94
100
|
* @returns 返回更新操作
|
|
95
101
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-inc inc 文档}
|
|
96
102
|
*/
|
|
97
|
-
inc: (value: number) =>
|
|
103
|
+
inc: (value: number) => DatabaseMutateCommand;
|
|
98
104
|
/**
|
|
99
105
|
* 自乘操作符
|
|
100
106
|
* @param value 相乘的数值
|
|
101
107
|
* @returns 返回更新操作
|
|
102
108
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-mul mul 文档}
|
|
103
109
|
*/
|
|
104
|
-
mul: (value: number) =>
|
|
110
|
+
mul: (value: number) => DatabaseMutateCommand;
|
|
105
111
|
/**
|
|
106
112
|
* 设置字段值操作符
|
|
107
113
|
* @param value 设置的值
|
|
108
114
|
* @returns 返回更新操作
|
|
109
115
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-set set 文档}
|
|
110
116
|
*/
|
|
111
|
-
set: (value: unknown) =>
|
|
117
|
+
set: (value: unknown) => DatabaseMutateCommand;
|
|
112
118
|
/**
|
|
113
119
|
* 数组末尾添加元素操作符
|
|
114
120
|
* @param value 添加的值
|
|
115
121
|
* @returns 返回更新操作
|
|
116
122
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-push push 文档}
|
|
117
123
|
*/
|
|
118
|
-
push: (value: unknown) =>
|
|
124
|
+
push: (value: unknown) => DatabaseMutateCommand;
|
|
119
125
|
/**
|
|
120
126
|
* 数组开头添加元素操作符
|
|
121
127
|
* @param value 添加的值
|
|
122
128
|
* @returns 返回更新操作
|
|
123
129
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-unshift unshift 文档}
|
|
124
130
|
*/
|
|
125
|
-
unshift: (value: unknown) =>
|
|
131
|
+
unshift: (value: unknown) => DatabaseMutateCommand;
|
|
126
132
|
/**
|
|
127
133
|
* 删除数组末尾元素操作符
|
|
128
134
|
* @returns 返回更新操作
|
|
129
135
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-pop pop 文档}
|
|
130
136
|
*/
|
|
131
|
-
pop: () =>
|
|
137
|
+
pop: () => DatabaseMutateCommand;
|
|
132
138
|
/**
|
|
133
139
|
* 删除数组开头元素操作符
|
|
134
140
|
* @returns 返回更新操作
|
|
135
141
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-shift shift 文档}
|
|
136
142
|
*/
|
|
137
|
-
shift: () =>
|
|
143
|
+
shift: () => DatabaseMutateCommand;
|
|
138
144
|
/**
|
|
139
145
|
* 删除字段操作符
|
|
140
146
|
* @returns 返回更新操作
|
|
141
147
|
* @see {@link https://doc.dcloud.net.cn/uniCloud/cf-database.html#operator-remove remove 文档}
|
|
142
148
|
*/
|
|
143
|
-
remove: () =>
|
|
149
|
+
remove: () => DatabaseMutateCommand;
|
|
144
150
|
};
|