@cloudcome/utils-uni 1.42.0 → 1.44.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 +18 -0
- package/dist/_helpers.cjs.map +1 -1
- package/dist/_helpers.d.ts +11 -0
- package/dist/_helpers.mjs +13 -1
- package/dist/_helpers.mjs.map +1 -1
- package/dist/client.cjs +1 -0
- package/dist/client.d.ts +1 -1
- package/dist/client.mjs +2 -2
- package/dist/cloud/method.d.ts +11 -3
- package/dist/cloud/respond.d.ts +17 -4
- package/dist/cloud.cjs +15 -11
- package/dist/cloud.cjs.map +1 -1
- package/dist/cloud.d.ts +1 -1
- package/dist/cloud.mjs +16 -13
- package/dist/cloud.mjs.map +1 -1
- package/dist/database/_db.class.d.ts +16 -4
- package/dist/database/error.d.ts +26 -0
- package/dist/database/proxy.d.ts +4 -4
- package/dist/database.cjs +70 -10
- package/dist/database.cjs.map +1 -1
- package/dist/database.d.ts +2 -1
- package/dist/database.mjs +68 -12
- 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/_helpers.cjs
CHANGED
|
@@ -28,7 +28,25 @@ function parseDatabaseOutput(res) {
|
|
|
28
28
|
}
|
|
29
29
|
return res;
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* 检查给定的未知值是否为 UniError 类型。
|
|
33
|
+
*
|
|
34
|
+
* 该函数作为 TypeScript 的类型守卫(Type Guard),在运行时验证传入的对象是否为 Error 的实例,
|
|
35
|
+
* 并在类型系统中将未知类型(unknown)收窄为 UniError 类型。
|
|
36
|
+
*
|
|
37
|
+
* @param {unknown} err - 需要检查的未知值。
|
|
38
|
+
* @returns {boolean} 如果传入的值是 Error 的实例,则返回 true,否则返回 false。
|
|
39
|
+
*/
|
|
40
|
+
function isUniError(err) {
|
|
41
|
+
return err instanceof Error;
|
|
42
|
+
}
|
|
31
43
|
//#endregion
|
|
44
|
+
Object.defineProperty(exports, "isUniError", {
|
|
45
|
+
enumerable: true,
|
|
46
|
+
get: function() {
|
|
47
|
+
return isUniError;
|
|
48
|
+
}
|
|
49
|
+
});
|
|
32
50
|
Object.defineProperty(exports, "parseCloudMethodOutput", {
|
|
33
51
|
enumerable: true,
|
|
34
52
|
get: function() {
|
package/dist/_helpers.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_helpers.cjs","names":[],"sources":["../src/_helpers.ts"],"sourcesContent":["import { errorAssign } from '@cloudcome/utils-core/error';\nimport { objectOmit } from '@cloudcome/utils-core/object';\nimport type { CloudMethodOutput } from './cloud';\nimport type { ClientDatabaseOutput, CloudDatabaseOutput } from './database';\n\n/**\n * 解析云对象方法调用的输出结果\n *\n * @template O - 云对象方法返回数据的类型\n * @param output - 云对象方法调用的输出结果\n * @param fallbackErrorMessage - 当输出中没有错误信息时使用的默认错误消息\n * @returns 云对象方法返回成功时的数据部分\n * @throws 当云对象方法调用失败时,抛出包含错误信息的异常\n */\nexport function parseCloudMethodOutput<O>(output: CloudMethodOutput<O>, fallbackErrorMessage = ''): O {\n if (output.errCode) {\n throw errorAssign(new Error(output.errMsg || fallbackErrorMessage), output);\n }\n\n return output.data;\n}\n\n/**\n * 解析数据库执行结果\n * @param res 客户端、云端响应结果\n * @returns 处理后的结果\n */\nexport function parseDatabaseOutput<T>(res: ClientDatabaseOutput<T> | CloudDatabaseOutput<T>) {\n const keys = Object.keys(res as AnyObject);\n // 客户端 { result: {errCode: 0, errMsg: 'ok'} & 数据 }\n const isClient = keys.length === 1 && keys[0] === 'result';\n\n if (isClient) {\n const { result } = res as ClientDatabaseOutput<T>;\n if (!result.errCode) return objectOmit(result, ['errCode', 'errMsg']);\n throw errorAssign(new Error(result.errMsg), result);\n }\n\n // 云端 数据\n return res as T;\n}\n"],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"_helpers.cjs","names":[],"sources":["../src/_helpers.ts"],"sourcesContent":["import { errorAssign } from '@cloudcome/utils-core/error';\nimport { objectOmit } from '@cloudcome/utils-core/object';\nimport type { CloudMethodOutput } from './cloud';\nimport type { ClientDatabaseOutput, CloudDatabaseOutput } from './database';\nimport type { UniError } from './_types';\n\n/**\n * 解析云对象方法调用的输出结果\n *\n * @template O - 云对象方法返回数据的类型\n * @param output - 云对象方法调用的输出结果\n * @param fallbackErrorMessage - 当输出中没有错误信息时使用的默认错误消息\n * @returns 云对象方法返回成功时的数据部分\n * @throws 当云对象方法调用失败时,抛出包含错误信息的异常\n */\nexport function parseCloudMethodOutput<O>(output: CloudMethodOutput<O>, fallbackErrorMessage = ''): O {\n if (output.errCode) {\n throw errorAssign(new Error(output.errMsg || fallbackErrorMessage), output);\n }\n\n return output.data;\n}\n\n/**\n * 解析数据库执行结果\n * @param res 客户端、云端响应结果\n * @returns 处理后的结果\n */\nexport function parseDatabaseOutput<T>(res: ClientDatabaseOutput<T> | CloudDatabaseOutput<T>) {\n const keys = Object.keys(res as AnyObject);\n // 客户端 { result: {errCode: 0, errMsg: 'ok'} & 数据 }\n const isClient = keys.length === 1 && keys[0] === 'result';\n\n if (isClient) {\n const { result } = res as ClientDatabaseOutput<T>;\n if (!result.errCode) return objectOmit(result, ['errCode', 'errMsg']);\n throw errorAssign(new Error(result.errMsg), result);\n }\n\n // 云端 数据\n return res as T;\n}\n\n/**\n * 检查给定的未知值是否为 UniError 类型。\n *\n * 该函数作为 TypeScript 的类型守卫(Type Guard),在运行时验证传入的对象是否为 Error 的实例,\n * 并在类型系统中将未知类型(unknown)收窄为 UniError 类型。\n *\n * @param {unknown} err - 需要检查的未知值。\n * @returns {boolean} 如果传入的值是 Error 的实例,则返回 true,否则返回 false。\n */\nexport function isUniError(err: unknown): err is UniError {\n return err instanceof Error;\n}\n"],"mappings":";;;;;;;;;;;;AAeA,SAAgB,uBAA0B,QAA8B,uBAAuB,IAAO;CACpG,IAAI,OAAO,SACT,OAAA,GAAA,4BAAA,aAAkB,IAAI,MAAM,OAAO,UAAU,oBAAoB,GAAG,MAAM;CAG5E,OAAO,OAAO;AAChB;;;;;;AAOA,SAAgB,oBAAuB,KAAuD;CAC5F,MAAM,OAAO,OAAO,KAAK,GAAgB;CAIzC,IAFiB,KAAK,WAAW,KAAK,KAAK,OAAO,UAEpC;EACZ,MAAM,EAAE,WAAW;EACnB,IAAI,CAAC,OAAO,SAAS,QAAA,GAAA,6BAAA,YAAkB,QAAQ,CAAC,WAAW,QAAQ,CAAC;EACpE,OAAA,GAAA,4BAAA,aAAkB,IAAI,MAAM,OAAO,MAAM,GAAG,MAAM;CACpD;CAGA,OAAO;AACT;;;;;;;;;;AAWA,SAAgB,WAAW,KAA+B;CACxD,OAAO,eAAe;AACxB"}
|
package/dist/_helpers.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { CloudMethodOutput } from './cloud';
|
|
2
2
|
import { ClientDatabaseOutput, CloudDatabaseOutput } from './database';
|
|
3
|
+
import { UniError } from './_types';
|
|
3
4
|
/**
|
|
4
5
|
* 解析云对象方法调用的输出结果
|
|
5
6
|
*
|
|
@@ -16,3 +17,13 @@ export declare function parseCloudMethodOutput<O>(output: CloudMethodOutput<O>,
|
|
|
16
17
|
* @returns 处理后的结果
|
|
17
18
|
*/
|
|
18
19
|
export declare function parseDatabaseOutput<T>(res: ClientDatabaseOutput<T> | CloudDatabaseOutput<T>): T | Omit<T & import('./_types').UniErrorData, "errCode" | "errMsg">;
|
|
20
|
+
/**
|
|
21
|
+
* 检查给定的未知值是否为 UniError 类型。
|
|
22
|
+
*
|
|
23
|
+
* 该函数作为 TypeScript 的类型守卫(Type Guard),在运行时验证传入的对象是否为 Error 的实例,
|
|
24
|
+
* 并在类型系统中将未知类型(unknown)收窄为 UniError 类型。
|
|
25
|
+
*
|
|
26
|
+
* @param {unknown} err - 需要检查的未知值。
|
|
27
|
+
* @returns {boolean} 如果传入的值是 Error 的实例,则返回 true,否则返回 false。
|
|
28
|
+
*/
|
|
29
|
+
export declare function isUniError(err: unknown): err is UniError;
|
package/dist/_helpers.mjs
CHANGED
|
@@ -28,7 +28,19 @@ function parseDatabaseOutput(res) {
|
|
|
28
28
|
}
|
|
29
29
|
return res;
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* 检查给定的未知值是否为 UniError 类型。
|
|
33
|
+
*
|
|
34
|
+
* 该函数作为 TypeScript 的类型守卫(Type Guard),在运行时验证传入的对象是否为 Error 的实例,
|
|
35
|
+
* 并在类型系统中将未知类型(unknown)收窄为 UniError 类型。
|
|
36
|
+
*
|
|
37
|
+
* @param {unknown} err - 需要检查的未知值。
|
|
38
|
+
* @returns {boolean} 如果传入的值是 Error 的实例,则返回 true,否则返回 false。
|
|
39
|
+
*/
|
|
40
|
+
function isUniError(err) {
|
|
41
|
+
return err instanceof Error;
|
|
42
|
+
}
|
|
31
43
|
//#endregion
|
|
32
|
-
export {
|
|
44
|
+
export { parseCloudMethodOutput as n, parseDatabaseOutput as r, isUniError as t };
|
|
33
45
|
|
|
34
46
|
//# sourceMappingURL=_helpers.mjs.map
|
package/dist/_helpers.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_helpers.mjs","names":[],"sources":["../src/_helpers.ts"],"sourcesContent":["import { errorAssign } from '@cloudcome/utils-core/error';\nimport { objectOmit } from '@cloudcome/utils-core/object';\nimport type { CloudMethodOutput } from './cloud';\nimport type { ClientDatabaseOutput, CloudDatabaseOutput } from './database';\n\n/**\n * 解析云对象方法调用的输出结果\n *\n * @template O - 云对象方法返回数据的类型\n * @param output - 云对象方法调用的输出结果\n * @param fallbackErrorMessage - 当输出中没有错误信息时使用的默认错误消息\n * @returns 云对象方法返回成功时的数据部分\n * @throws 当云对象方法调用失败时,抛出包含错误信息的异常\n */\nexport function parseCloudMethodOutput<O>(output: CloudMethodOutput<O>, fallbackErrorMessage = ''): O {\n if (output.errCode) {\n throw errorAssign(new Error(output.errMsg || fallbackErrorMessage), output);\n }\n\n return output.data;\n}\n\n/**\n * 解析数据库执行结果\n * @param res 客户端、云端响应结果\n * @returns 处理后的结果\n */\nexport function parseDatabaseOutput<T>(res: ClientDatabaseOutput<T> | CloudDatabaseOutput<T>) {\n const keys = Object.keys(res as AnyObject);\n // 客户端 { result: {errCode: 0, errMsg: 'ok'} & 数据 }\n const isClient = keys.length === 1 && keys[0] === 'result';\n\n if (isClient) {\n const { result } = res as ClientDatabaseOutput<T>;\n if (!result.errCode) return objectOmit(result, ['errCode', 'errMsg']);\n throw errorAssign(new Error(result.errMsg), result);\n }\n\n // 云端 数据\n return res as T;\n}\n"],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"_helpers.mjs","names":[],"sources":["../src/_helpers.ts"],"sourcesContent":["import { errorAssign } from '@cloudcome/utils-core/error';\nimport { objectOmit } from '@cloudcome/utils-core/object';\nimport type { CloudMethodOutput } from './cloud';\nimport type { ClientDatabaseOutput, CloudDatabaseOutput } from './database';\nimport type { UniError } from './_types';\n\n/**\n * 解析云对象方法调用的输出结果\n *\n * @template O - 云对象方法返回数据的类型\n * @param output - 云对象方法调用的输出结果\n * @param fallbackErrorMessage - 当输出中没有错误信息时使用的默认错误消息\n * @returns 云对象方法返回成功时的数据部分\n * @throws 当云对象方法调用失败时,抛出包含错误信息的异常\n */\nexport function parseCloudMethodOutput<O>(output: CloudMethodOutput<O>, fallbackErrorMessage = ''): O {\n if (output.errCode) {\n throw errorAssign(new Error(output.errMsg || fallbackErrorMessage), output);\n }\n\n return output.data;\n}\n\n/**\n * 解析数据库执行结果\n * @param res 客户端、云端响应结果\n * @returns 处理后的结果\n */\nexport function parseDatabaseOutput<T>(res: ClientDatabaseOutput<T> | CloudDatabaseOutput<T>) {\n const keys = Object.keys(res as AnyObject);\n // 客户端 { result: {errCode: 0, errMsg: 'ok'} & 数据 }\n const isClient = keys.length === 1 && keys[0] === 'result';\n\n if (isClient) {\n const { result } = res as ClientDatabaseOutput<T>;\n if (!result.errCode) return objectOmit(result, ['errCode', 'errMsg']);\n throw errorAssign(new Error(result.errMsg), result);\n }\n\n // 云端 数据\n return res as T;\n}\n\n/**\n * 检查给定的未知值是否为 UniError 类型。\n *\n * 该函数作为 TypeScript 的类型守卫(Type Guard),在运行时验证传入的对象是否为 Error 的实例,\n * 并在类型系统中将未知类型(unknown)收窄为 UniError 类型。\n *\n * @param {unknown} err - 需要检查的未知值。\n * @returns {boolean} 如果传入的值是 Error 的实例,则返回 true,否则返回 false。\n */\nexport function isUniError(err: unknown): err is UniError {\n return err instanceof Error;\n}\n"],"mappings":";;;;;;;;;;;;AAeA,SAAgB,uBAA0B,QAA8B,uBAAuB,IAAO;CACpG,IAAI,OAAO,SACT,MAAM,YAAY,IAAI,MAAM,OAAO,UAAU,oBAAoB,GAAG,MAAM;CAG5E,OAAO,OAAO;AAChB;;;;;;AAOA,SAAgB,oBAAuB,KAAuD;CAC5F,MAAM,OAAO,OAAO,KAAK,GAAgB;CAIzC,IAFiB,KAAK,WAAW,KAAK,KAAK,OAAO,UAEpC;EACZ,MAAM,EAAE,WAAW;EACnB,IAAI,CAAC,OAAO,SAAS,OAAO,WAAW,QAAQ,CAAC,WAAW,QAAQ,CAAC;EACpE,MAAM,YAAY,IAAI,MAAM,OAAO,MAAM,GAAG,MAAM;CACpD;CAGA,OAAO;AACT;;;;;;;;;;AAWA,SAAgB,WAAW,KAA+B;CACxD,OAAO,eAAe;AACxB"}
|
package/dist/client.cjs
CHANGED
|
@@ -426,6 +426,7 @@ async function querySelectorRects(instance, selector) {
|
|
|
426
426
|
}
|
|
427
427
|
//#endregion
|
|
428
428
|
exports.importCloudObject = importCloudObject;
|
|
429
|
+
exports.isUniError = require__helpers.isUniError;
|
|
429
430
|
exports.parseCloudMethodOutput = require__helpers.parseCloudMethodOutput;
|
|
430
431
|
exports.querySelectorRects = querySelectorRects;
|
|
431
432
|
exports.uniAlert = uniAlert;
|
package/dist/client.d.ts
CHANGED
package/dist/client.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as parseCloudMethodOutput, t as isUniError } from "./_helpers.mjs";
|
|
2
2
|
import { errorAssign } from "@cloudcome/utils-core/error";
|
|
3
3
|
import { _runLifeHook } from "@cloudcome/utils-vue/shared";
|
|
4
4
|
import { onHide, onLoad, onPageHide, onPageShow, onShow, onUnload } from "@dcloudio/uni-app";
|
|
@@ -424,6 +424,6 @@ async function querySelectorRects(instance, selector) {
|
|
|
424
424
|
});
|
|
425
425
|
}
|
|
426
426
|
//#endregion
|
|
427
|
-
export { importCloudObject, parseCloudMethodOutput, querySelectorRects, uniAlert, uniCallback, uniConfirm, uniLoading, uniPromise, uniPrompt, uniSubscribeNotice, uniToast, useAppShow, useAppUpdate, useDatabase, usePageLoad, usePageQuery, usePageShow };
|
|
427
|
+
export { importCloudObject, isUniError, parseCloudMethodOutput, querySelectorRects, uniAlert, uniCallback, uniConfirm, uniLoading, uniPromise, uniPrompt, uniSubscribeNotice, uniToast, useAppShow, useAppUpdate, useDatabase, usePageLoad, usePageQuery, usePageShow };
|
|
428
428
|
|
|
429
429
|
//# sourceMappingURL=client.mjs.map
|
package/dist/cloud/method.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { MaybePromise } from '@cloudcome/utils-core/types';
|
|
1
|
+
import { MaybePromise, AnyObject } from '@cloudcome/utils-core/types';
|
|
2
2
|
import { default as z, ZodObject } from 'zod';
|
|
3
|
+
import { UniError } from '../_types';
|
|
3
4
|
import { CloudMethod, CloudObjectThis } from './types';
|
|
4
5
|
import { UniIdCommonModule } from './uni-id';
|
|
5
6
|
type _CloudObjectThisAppendUser = {
|
|
@@ -72,6 +73,13 @@ export type BuildCloudMethodCreatorOptions<ExtraConfig extends AnyObject = {}> =
|
|
|
72
73
|
* @returns 返回要附加到响应中的数据对象
|
|
73
74
|
*/
|
|
74
75
|
respondAppend?: (objectThis: CloudObjectThis) => AnyObject;
|
|
76
|
+
/**
|
|
77
|
+
* 自定义错误处理函数
|
|
78
|
+
* 用于在云对象响应中处理错误信息,如脱敏、转换错误码等
|
|
79
|
+
* @param err 原始错误对象
|
|
80
|
+
* @returns 处理后的错误对象,其 errCode/errMsg 将被用于响应
|
|
81
|
+
*/
|
|
82
|
+
parseError?: (err: unknown) => UniError;
|
|
75
83
|
/**
|
|
76
84
|
* 所有云对象执行前钩子函数
|
|
77
85
|
* @param context 云对象上下文,包含用户信息、扩展配置选项等
|
|
@@ -79,7 +87,7 @@ export type BuildCloudMethodCreatorOptions<ExtraConfig extends AnyObject = {}> =
|
|
|
79
87
|
*/
|
|
80
88
|
onBefore?: (context: CloudObjectContext<ExtraConfig>, options: _ResolvedCreateCloudOptions<ExtraConfig>) => MaybePromise<unknown>;
|
|
81
89
|
};
|
|
82
|
-
export type CreateCloudObjectOptions<ExtraConfig extends
|
|
90
|
+
export type CreateCloudObjectOptions<ExtraConfig extends AnyObject = AnyObject> = ExtraConfig & {
|
|
83
91
|
/**
|
|
84
92
|
* 是否需要用户登录态
|
|
85
93
|
* @default false
|
|
@@ -104,7 +112,7 @@ export type CreateCloudObjectOptions<ExtraConfig extends object = object> = Extr
|
|
|
104
112
|
*/
|
|
105
113
|
noRespond?: boolean;
|
|
106
114
|
};
|
|
107
|
-
export type CreateCloudMethod<ExtraConfig extends
|
|
115
|
+
export type CreateCloudMethod<ExtraConfig extends AnyObject = AnyObject> = {
|
|
108
116
|
<S extends ZodObject, O>(schema: S, fn: (context: CloudObjectContext<ExtraConfig>, input: z.infer<S>) => MaybePromise<O>, options?: CreateCloudObjectOptions<ExtraConfig>): CloudMethod<z.infer<S>, O>;
|
|
109
117
|
<O>(fn: (context: CloudObjectContext<ExtraConfig>) => MaybePromise<O>, options?: CreateCloudObjectOptions<ExtraConfig>): CloudMethod<void, O>;
|
|
110
118
|
};
|
package/dist/cloud/respond.d.ts
CHANGED
|
@@ -1,18 +1,31 @@
|
|
|
1
|
-
import { MaybePromise } from '@cloudcome/utils-core/types';
|
|
1
|
+
import { MaybePromise, AnyObject } from '@cloudcome/utils-core/types';
|
|
2
|
+
import { UniError } from '../_types';
|
|
2
3
|
import { CloudMethodOutput } from './types';
|
|
4
|
+
export type RespondCloudMethodOptions = {
|
|
5
|
+
/** 要附加到响应中的额外数据 */
|
|
6
|
+
append?: AnyObject;
|
|
7
|
+
/**
|
|
8
|
+
* 自定义错误处理函数
|
|
9
|
+
* @param err {unknown} 错误
|
|
10
|
+
* @returns 处理后的错误对象,其 errCode/errMsg 将被用于响应
|
|
11
|
+
*/
|
|
12
|
+
parseError?: (err: unknown) => UniError;
|
|
13
|
+
};
|
|
3
14
|
/**
|
|
4
15
|
* 执行云对象方法并标准化响应格式
|
|
5
16
|
*
|
|
6
17
|
* @template O - 函数返回值的类型
|
|
7
18
|
* @param fn - 要执行的异步函数
|
|
8
|
-
* @param
|
|
19
|
+
* @param options - 可选配置
|
|
20
|
+
* @param options.append - 要附加到响应中的额外数据
|
|
21
|
+
* @param options.parseError - 自定义错误处理函数
|
|
9
22
|
* @returns 标准化的云对象响应对象
|
|
10
23
|
*
|
|
11
24
|
* @example
|
|
12
25
|
* ```typescript
|
|
13
26
|
* const result = await respondCloudMethod(async () => {
|
|
14
27
|
* return await getData();
|
|
15
|
-
* }, { extra: 'data' });
|
|
28
|
+
* }, { append: { extra: 'data' } });
|
|
16
29
|
* ```
|
|
17
30
|
*/
|
|
18
|
-
export declare function respondCloudMethod<O>(fn: () => MaybePromise<O>,
|
|
31
|
+
export declare function respondCloudMethod<O>(fn: () => MaybePromise<O>, options?: RespondCloudMethodOptions): Promise<CloudMethodOutput<O>>;
|
package/dist/cloud.cjs
CHANGED
|
@@ -51,33 +51,33 @@ function parseCloudModuleOutput(output, fallbackErrorMessage = "") {
|
|
|
51
51
|
*
|
|
52
52
|
* @template O - 函数返回值的类型
|
|
53
53
|
* @param fn - 要执行的异步函数
|
|
54
|
-
* @param
|
|
54
|
+
* @param options - 可选配置
|
|
55
|
+
* @param options.append - 要附加到响应中的额外数据
|
|
56
|
+
* @param options.parseError - 自定义错误处理函数
|
|
55
57
|
* @returns 标准化的云对象响应对象
|
|
56
58
|
*
|
|
57
59
|
* @example
|
|
58
60
|
* ```typescript
|
|
59
61
|
* const result = await respondCloudMethod(async () => {
|
|
60
62
|
* return await getData();
|
|
61
|
-
* }, { extra: 'data' });
|
|
63
|
+
* }, { append: { extra: 'data' } });
|
|
62
64
|
* ```
|
|
63
65
|
*/
|
|
64
|
-
async function respondCloudMethod(fn,
|
|
66
|
+
async function respondCloudMethod(fn, options) {
|
|
65
67
|
try {
|
|
66
68
|
return {
|
|
67
69
|
errCode: 0,
|
|
68
70
|
errMsg: "",
|
|
69
71
|
data: await fn(),
|
|
70
|
-
...append
|
|
72
|
+
...options?.append
|
|
71
73
|
};
|
|
72
74
|
} catch (err) {
|
|
73
|
-
|
|
74
|
-
console.error(err);
|
|
75
|
-
const err2 = (0, _cloudcome_utils_core_error.errorNormalize)(err);
|
|
75
|
+
const err3 = options?.parseError?.(err) || (0, _cloudcome_utils_core_error.errorNormalize)(err);
|
|
76
76
|
return {
|
|
77
|
-
errCode:
|
|
78
|
-
errMsg:
|
|
77
|
+
errCode: err3.errCode ?? -1,
|
|
78
|
+
errMsg: err3.errMsg || err3.message || "",
|
|
79
79
|
data: null,
|
|
80
|
-
...append
|
|
80
|
+
...options?.append
|
|
81
81
|
};
|
|
82
82
|
}
|
|
83
83
|
}
|
|
@@ -140,7 +140,10 @@ function buildCloudMethodCreator(options) {
|
|
|
140
140
|
return await arg1(context, parsed.data);
|
|
141
141
|
};
|
|
142
142
|
if (createOptions.noRespond) return await cloudMethod();
|
|
143
|
-
return await respondCloudMethod(cloudMethod,
|
|
143
|
+
return await respondCloudMethod(cloudMethod, {
|
|
144
|
+
append: buildOptions.respondAppend(this),
|
|
145
|
+
parseError: buildOptions.parseError
|
|
146
|
+
});
|
|
144
147
|
};
|
|
145
148
|
};
|
|
146
149
|
return createCloudMethod;
|
|
@@ -233,6 +236,7 @@ async function request(options) {
|
|
|
233
236
|
//#endregion
|
|
234
237
|
exports.buildCloudMethodCreator = buildCloudMethodCreator;
|
|
235
238
|
exports.createCloudObjectError = createCloudObjectError;
|
|
239
|
+
exports.isUniError = require__helpers.isUniError;
|
|
236
240
|
exports.parseCloudMethodOutput = require__helpers.parseCloudMethodOutput;
|
|
237
241
|
exports.parseCloudModuleOutput = parseCloudModuleOutput;
|
|
238
242
|
exports.request = request;
|
package/dist/cloud.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud.cjs","names":[],"sources":["../src/cloud/error.ts","../src/cloud/module.ts","../src/cloud/respond.ts","../src/cloud/method.ts","../src/cloud/request.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 { UniError } from '@/_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 UniError);\n\n return {\n errCode: err2.errCode || -1,\n errMsg: err2.errMsg || err2.message || '',\n // @ts-expect-error\n data: null,\n ...append,\n };\n }\n}\n","import { objectDefaults } 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 { versionCompare } from '@cloudcome/utils-core/version';\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, 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\n/**\n * 云对象创建选项的运行时解析类型。\n *\n * 将 `CreateCloudObjectOptions` 中的内置字段设为必填(已应用默认值),\n * 同时保留 `ExtraConfig` 扩展字段的原始可选性。\n *\n * @template ExtraConfig - 自定义扩展配置类型\n */\ntype _ResolvedCreateCloudOptions<ExtraConfig extends AnyObject = {}> = ExtraConfig & {\n /** 是否需要用户登录态 */\n requiredUser: boolean;\n /** 是否仅在本地环境运行 */\n onlyLocalEnv: boolean;\n /** 最小支持版本 */\n minVersion?: string;\n /** 最大支持版本 */\n maxVersion?: string;\n /** 非响应模式,常用于钩子函数中 */\n noRespond?: boolean;\n};\n\ntype _CloudObjectThisAppend<ExtraConfig extends AnyObject = {}> = {\n options: _ResolvedCreateCloudOptions<ExtraConfig>;\n user: _CloudObjectThisAppendUser;\n};\n\nexport type CloudObjectContext<ExtraConfig extends AnyObject = {}> = CloudObjectThis &\n _CloudObjectThisAppend<ExtraConfig>;\n\nexport type BuildCloudMethodCreatorOptions<ExtraConfig extends AnyObject = {}> = {\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 * @default '应用版本过低'\n */\n appVersionTooLowErrMsg?: string;\n\n /**\n * 应用版本过高错误消息\n * @default '应用版本过高'\n */\n appVersionTooHighErrMsg?: string;\n\n /**\n * 响应附加数据函数\n * 用于在云对象响应中添加额外的上下文信息\n * @param objectThis 云对象上下文\n * @returns 返回要附加到响应中的数据对象\n */\n respondAppend?: (objectThis: CloudObjectThis) => AnyObject;\n\n /**\n * 所有云对象执行前钩子函数\n * @param context 云对象上下文,包含用户信息、扩展配置选项等\n * @param options 云对象创建选项,包含 requiredUser、onlyLocalEnv 及自定义扩展配置\n */\n onBefore?: (\n context: CloudObjectContext<ExtraConfig>,\n options: _ResolvedCreateCloudOptions<ExtraConfig>,\n ) => MaybePromise<unknown>;\n};\n\nexport type CreateCloudObjectOptions<ExtraConfig extends object = object> = ExtraConfig & {\n /**\n * 是否需要用户登录态\n * @default false\n */\n requiredUser?: boolean;\n\n /**\n * 是否仅在本地环境运行\n * @default false\n */\n onlyLocalEnv?: boolean;\n\n /**\n * 最小支持版本\n */\n minVersion?: string;\n\n /**\n * 最大支持版本\n */\n maxVersion?: string;\n\n /**\n * 非响应模式,常用于钩子函数中,如 _before, _after 等,\n * 文档:https://doc.dcloud.net.cn/uniCloud/cloud-obj.html#before-and-after\n */\n noRespond?: boolean;\n};\n\nexport type CreateCloudMethod<ExtraConfig extends object = object> = {\n <S extends ZodObject, O>(\n schema: S,\n fn: (context: CloudObjectContext<ExtraConfig>, input: z.infer<S>) => MaybePromise<O>,\n options?: CreateCloudObjectOptions<ExtraConfig>,\n ): CloudMethod<z.infer<S>, O>;\n\n <O>(\n fn: (context: CloudObjectContext<ExtraConfig>) => MaybePromise<O>,\n options?: CreateCloudObjectOptions<ExtraConfig>,\n ): 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<ExtraConfig extends AnyObject = {}>(\n options?: BuildCloudMethodCreatorOptions<ExtraConfig>,\n) {\n const buildOptions = objectDefaults(options || {}, {\n requiredUserErrCode: 'uni-id-check-token-failed',\n requiredUserErrMsg: '需要登录后才能进行此操作',\n onlyLocalEnvErrMsg: '运行环境不匹配',\n appVersionTooLowErrMsg: '应用版本过低',\n appVersionTooHighErrMsg: '应用版本过高',\n respondAppend: () => ({}),\n onBefore: () => {},\n }) as Required<BuildCloudMethodCreatorOptions>;\n\n // @ts-expect-error\n const createCloudMethod: CreateCloudMethod<ExtraConfig> = (arg0, arg1, arg2) => {\n const optionsSource = (isFunction(arg0) ? arg1 : arg2) as CreateCloudObjectOptions<ExtraConfig> | undefined;\n const createOptions = objectDefaults(optionsSource || {}, {\n requiredUser: false,\n onlyLocalEnv: false,\n }) as _ResolvedCreateCloudOptions<ExtraConfig>;\n\n return async function (this: CloudObjectThis, input) {\n const cloudMethod = async () => {\n const { runtimeEnv } = this.getCloudInfo();\n\n if (createOptions.onlyLocalEnv && runtimeEnv !== 'local') {\n throw createCloudObjectError(buildOptions.onlyLocalEnvErrMsg);\n }\n\n const { appVersion } = this.getClientInfo();\n\n if (createOptions.minVersion && versionCompare(appVersion, createOptions.minVersion) < 0) {\n throw createCloudObjectError(buildOptions.appVersionTooLowErrMsg);\n }\n\n if (createOptions.maxVersion && versionCompare(appVersion, createOptions.maxVersion) > 0) {\n throw createCloudObjectError(buildOptions.appVersionTooHighErrMsg);\n }\n\n const user = await _parseAppendUser(this, options?.uniIdCommonModule);\n const append: _CloudObjectThisAppend<ExtraConfig> = {\n options: createOptions,\n user: user,\n };\n const context = Object.assign(this, append) as CloudObjectContext<ExtraConfig>;\n\n if (createOptions.requiredUser && !user.id) {\n throw createCloudObjectError(buildOptions.requiredUserErrMsg, buildOptions.requiredUserErrCode);\n }\n\n await buildOptions.onBefore(context, createOptions);\n\n if (isFunction(arg0)) {\n return await arg0(context);\n }\n\n const parsed = arg0.safeParse(input);\n\n if (!parsed.success) {\n console.log(parsed.error.issues);\n\n const issue0 = parsed.error?.issues?.[0];\n\n if (issue0?.code === 'custom') throw issue0.message;\n throw new Error('请求数据不正确');\n }\n\n return await arg1(context, parsed.data);\n };\n\n if (createOptions.noRespond) {\n return await cloudMethod();\n }\n\n return await respondCloudMethod(cloudMethod, 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 const [_err1, user] = await tryFlatten(uic.checkToken(objectThis.getUniIdToken() || ''));\n if (!user) return appendUser;\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","import { qsStringify } from '@cloudcome/utils-core/qs';\nimport type { AnyObject } from '@cloudcome/utils-core/types';\n\n/**\n * HTTP 请求配置选项\n */\nexport type RequestOptions = {\n /**\n * 请求 URL 地址\n */\n url: string;\n\n /**\n * URL 查询参数,会自动拼接到 url 后面\n */\n query?: Record<string, string>;\n\n /**\n * HTTP 请求方法\n * @default 'GET'\n */\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'OPTIONS';\n\n /**\n * 请求头\n */\n headers?: Record<string, string>;\n\n /**\n * 请求体数据\n */\n data?: AnyObject;\n\n /**\n * 返回数据格式\n * @default 'json'\n */\n dataType?: string;\n\n /**\n * 请求内容类型\n * - 'json': application/json\n * - 'form': application/x-www-form-urlencoded\n * @default 'json'\n */\n contentType?: string;\n\n /**\n * 请求超时时间,单位毫秒\n * @default 10000\n */\n timeout?: number;\n};\n\n/**\n * 发起 HTTP 请求\n *\n * 基于 uniCloud.httpclient 发起 HTTP 请求,支持 GET、POST、PUT、DELETE 等方法。\n * 查询参数会自动通过 qsStringify 拼接到 URL 上。\n *\n * @template T - 响应数据的类型\n * @param options 请求配置选项\n * @returns 包含 data、status、headers 的响应对象\n *\n * @example\n * ```ts\n * // GET 请求\n * const res = await request<{ name: string }>({\n * url: 'https://api.example.com/users/1',\n * })\n * console.log(res.data) // { name: 'Alice' }\n * console.log(res.status) // 200\n *\n * // POST 请求\n * const res = await request<{ id: string }>({\n * url: 'https://api.example.com/users',\n * method: 'POST',\n * data: { name: 'Alice', age: 25 },\n * })\n *\n * // 带查询参数\n * const res = await request<{ list: any[] }>({\n * url: 'https://api.example.com/users',\n * query: { page: '1', size: '10' },\n * })\n * ```\n */\nexport async function request<T>(options: RequestOptions) {\n const {\n url,\n query = {},\n method = 'GET',\n headers = {},\n data,\n dataType = 'json',\n contentType = 'json',\n timeout = 10000,\n } = options;\n\n const fullUrl = `${url}?${qsStringify(query)}`;\n\n // 使用uniCloud.httpclient发起请求\n // @ts-expect-error: uniCloud类型定义中可能缺少httpclient属性\n const res = await uniCloud.httpclient.request(fullUrl, {\n method,\n headers,\n data,\n dataType,\n contentType,\n timeout,\n });\n\n return res as { data: T; status: number; headers: Record<string, string> };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cloud.cjs","names":[],"sources":["../src/cloud/error.ts","../src/cloud/module.ts","../src/cloud/respond.ts","../src/cloud/method.ts","../src/cloud/request.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, AnyObject } from '@cloudcome/utils-core/types';\nimport type { UniError } from '@/_types';\nimport type { CloudMethodOutput } from './types';\n\nexport type RespondCloudMethodOptions = {\n /** 要附加到响应中的额外数据 */\n append?: AnyObject;\n /**\n * 自定义错误处理函数\n * @param err {unknown} 错误\n * @returns 处理后的错误对象,其 errCode/errMsg 将被用于响应\n */\n parseError?: (err: unknown) => UniError;\n};\n\n/**\n * 执行云对象方法并标准化响应格式\n *\n * @template O - 函数返回值的类型\n * @param fn - 要执行的异步函数\n * @param options - 可选配置\n * @param options.append - 要附加到响应中的额外数据\n * @param options.parseError - 自定义错误处理函数\n * @returns 标准化的云对象响应对象\n *\n * @example\n * ```typescript\n * const result = await respondCloudMethod(async () => {\n * return await getData();\n * }, { append: { extra: 'data' } });\n * ```\n */\nexport async function respondCloudMethod<O>(\n fn: () => MaybePromise<O>,\n options?: RespondCloudMethodOptions,\n): Promise<CloudMethodOutput<O>> {\n try {\n const data = await fn();\n\n return {\n errCode: 0,\n errMsg: '',\n data,\n ...options?.append,\n };\n } catch (err) {\n const err3 = options?.parseError?.(err) || (errorNormalize(err) as UniError);\n\n return {\n errCode: err3.errCode ?? -1,\n errMsg: err3.errMsg || err3.message || '',\n // @ts-expect-error\n data: null,\n ...options?.append,\n };\n }\n}\n","import { objectDefaults } from '@cloudcome/utils-core/object';\nimport { tryFlatten } from '@cloudcome/utils-core/try';\nimport { isFunction } from '@cloudcome/utils-core/type';\nimport type { MaybePromise, AnyObject } from '@cloudcome/utils-core/types';\nimport { versionCompare } from '@cloudcome/utils-core/version';\nimport type z from 'zod';\nimport type { ZodObject } from 'zod';\nimport type { UniError } from '@/_types';\nimport { createCloudObjectError } from './error';\nimport { parseCloudModuleOutput } from './module';\nimport { respondCloudMethod } from './respond';\nimport type { CloudMethod, 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\n/**\n * 云对象创建选项的运行时解析类型。\n *\n * 将 `CreateCloudObjectOptions` 中的内置字段设为必填(已应用默认值),\n * 同时保留 `ExtraConfig` 扩展字段的原始可选性。\n *\n * @template ExtraConfig - 自定义扩展配置类型\n */\ntype _ResolvedCreateCloudOptions<ExtraConfig extends AnyObject = {}> = ExtraConfig & {\n /** 是否需要用户登录态 */\n requiredUser: boolean;\n /** 是否仅在本地环境运行 */\n onlyLocalEnv: boolean;\n /** 最小支持版本 */\n minVersion?: string;\n /** 最大支持版本 */\n maxVersion?: string;\n /** 非响应模式,常用于钩子函数中 */\n noRespond?: boolean;\n};\n\ntype _CloudObjectThisAppend<ExtraConfig extends AnyObject = {}> = {\n options: _ResolvedCreateCloudOptions<ExtraConfig>;\n user: _CloudObjectThisAppendUser;\n};\n\nexport type CloudObjectContext<ExtraConfig extends AnyObject = {}> = CloudObjectThis &\n _CloudObjectThisAppend<ExtraConfig>;\n\nexport type BuildCloudMethodCreatorOptions<ExtraConfig extends AnyObject = {}> = {\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 * @default '应用版本过低'\n */\n appVersionTooLowErrMsg?: string;\n\n /**\n * 应用版本过高错误消息\n * @default '应用版本过高'\n */\n appVersionTooHighErrMsg?: string;\n\n /**\n * 响应附加数据函数\n * 用于在云对象响应中添加额外的上下文信息\n * @param objectThis 云对象上下文\n * @returns 返回要附加到响应中的数据对象\n */\n respondAppend?: (objectThis: CloudObjectThis) => AnyObject;\n\n /**\n * 自定义错误处理函数\n * 用于在云对象响应中处理错误信息,如脱敏、转换错误码等\n * @param err 原始错误对象\n * @returns 处理后的错误对象,其 errCode/errMsg 将被用于响应\n */\n parseError?: (err: unknown) => UniError;\n\n /**\n * 所有云对象执行前钩子函数\n * @param context 云对象上下文,包含用户信息、扩展配置选项等\n * @param options 云对象创建选项,包含 requiredUser、onlyLocalEnv 及自定义扩展配置\n */\n onBefore?: (\n context: CloudObjectContext<ExtraConfig>,\n options: _ResolvedCreateCloudOptions<ExtraConfig>,\n ) => MaybePromise<unknown>;\n};\n\nexport type CreateCloudObjectOptions<ExtraConfig extends AnyObject = AnyObject> = ExtraConfig & {\n /**\n * 是否需要用户登录态\n * @default false\n */\n requiredUser?: boolean;\n\n /**\n * 是否仅在本地环境运行\n * @default false\n */\n onlyLocalEnv?: boolean;\n\n /**\n * 最小支持版本\n */\n minVersion?: string;\n\n /**\n * 最大支持版本\n */\n maxVersion?: string;\n\n /**\n * 非响应模式,常用于钩子函数中,如 _before, _after 等,\n * 文档:https://doc.dcloud.net.cn/uniCloud/cloud-obj.html#before-and-after\n */\n noRespond?: boolean;\n};\n\nexport type CreateCloudMethod<ExtraConfig extends AnyObject = AnyObject> = {\n <S extends ZodObject, O>(\n schema: S,\n fn: (context: CloudObjectContext<ExtraConfig>, input: z.infer<S>) => MaybePromise<O>,\n options?: CreateCloudObjectOptions<ExtraConfig>,\n ): CloudMethod<z.infer<S>, O>;\n\n <O>(\n fn: (context: CloudObjectContext<ExtraConfig>) => MaybePromise<O>,\n options?: CreateCloudObjectOptions<ExtraConfig>,\n ): 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<ExtraConfig extends AnyObject = {}>(\n options?: BuildCloudMethodCreatorOptions<ExtraConfig>,\n) {\n const buildOptions = objectDefaults(options || {}, {\n requiredUserErrCode: 'uni-id-check-token-failed',\n requiredUserErrMsg: '需要登录后才能进行此操作',\n onlyLocalEnvErrMsg: '运行环境不匹配',\n appVersionTooLowErrMsg: '应用版本过低',\n appVersionTooHighErrMsg: '应用版本过高',\n respondAppend: () => ({}),\n onBefore: () => {},\n }) as Required<BuildCloudMethodCreatorOptions>;\n\n // @ts-expect-error\n const createCloudMethod: CreateCloudMethod<ExtraConfig> = (arg0, arg1, arg2) => {\n const optionsSource = (isFunction(arg0) ? arg1 : arg2) as CreateCloudObjectOptions<ExtraConfig> | undefined;\n const createOptions = objectDefaults(optionsSource || {}, {\n requiredUser: false,\n onlyLocalEnv: false,\n }) as _ResolvedCreateCloudOptions<ExtraConfig>;\n\n return async function (this: CloudObjectThis, input) {\n const cloudMethod = async () => {\n const { runtimeEnv } = this.getCloudInfo();\n\n if (createOptions.onlyLocalEnv && runtimeEnv !== 'local') {\n throw createCloudObjectError(buildOptions.onlyLocalEnvErrMsg);\n }\n\n const { appVersion } = this.getClientInfo();\n\n if (createOptions.minVersion && versionCompare(appVersion, createOptions.minVersion) < 0) {\n throw createCloudObjectError(buildOptions.appVersionTooLowErrMsg);\n }\n\n if (createOptions.maxVersion && versionCompare(appVersion, createOptions.maxVersion) > 0) {\n throw createCloudObjectError(buildOptions.appVersionTooHighErrMsg);\n }\n\n const user = await _parseAppendUser(this, options?.uniIdCommonModule);\n const append: _CloudObjectThisAppend<ExtraConfig> = {\n options: createOptions,\n user: user,\n };\n const context = Object.assign(this, append) as CloudObjectContext<ExtraConfig>;\n\n if (createOptions.requiredUser && !user.id) {\n throw createCloudObjectError(buildOptions.requiredUserErrMsg, buildOptions.requiredUserErrCode);\n }\n\n await buildOptions.onBefore(context, createOptions);\n\n if (isFunction(arg0)) {\n return await arg0(context);\n }\n\n const parsed = arg0.safeParse(input);\n\n if (!parsed.success) {\n console.log(parsed.error.issues);\n\n const issue0 = parsed.error?.issues?.[0];\n\n if (issue0?.code === 'custom') throw issue0.message;\n throw new Error('请求数据不正确');\n }\n\n return await arg1(context, parsed.data);\n };\n\n if (createOptions.noRespond) {\n return await cloudMethod();\n }\n\n return await respondCloudMethod(cloudMethod, {\n append: buildOptions.respondAppend(this),\n parseError: buildOptions.parseError,\n });\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 const [_err1, user] = await tryFlatten(uic.checkToken(objectThis.getUniIdToken() || ''));\n if (!user) return appendUser;\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","import { qsStringify } from '@cloudcome/utils-core/qs';\nimport type { AnyObject } from '@cloudcome/utils-core/types';\n\n/**\n * HTTP 请求配置选项\n */\nexport type RequestOptions = {\n /**\n * 请求 URL 地址\n */\n url: string;\n\n /**\n * URL 查询参数,会自动拼接到 url 后面\n */\n query?: Record<string, string>;\n\n /**\n * HTTP 请求方法\n * @default 'GET'\n */\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'OPTIONS';\n\n /**\n * 请求头\n */\n headers?: Record<string, string>;\n\n /**\n * 请求体数据\n */\n data?: AnyObject;\n\n /**\n * 返回数据格式\n * @default 'json'\n */\n dataType?: string;\n\n /**\n * 请求内容类型\n * - 'json': application/json\n * - 'form': application/x-www-form-urlencoded\n * @default 'json'\n */\n contentType?: string;\n\n /**\n * 请求超时时间,单位毫秒\n * @default 10000\n */\n timeout?: number;\n};\n\n/**\n * 发起 HTTP 请求\n *\n * 基于 uniCloud.httpclient 发起 HTTP 请求,支持 GET、POST、PUT、DELETE 等方法。\n * 查询参数会自动通过 qsStringify 拼接到 URL 上。\n *\n * @template T - 响应数据的类型\n * @param options 请求配置选项\n * @returns 包含 data、status、headers 的响应对象\n *\n * @example\n * ```ts\n * // GET 请求\n * const res = await request<{ name: string }>({\n * url: 'https://api.example.com/users/1',\n * })\n * console.log(res.data) // { name: 'Alice' }\n * console.log(res.status) // 200\n *\n * // POST 请求\n * const res = await request<{ id: string }>({\n * url: 'https://api.example.com/users',\n * method: 'POST',\n * data: { name: 'Alice', age: 25 },\n * })\n *\n * // 带查询参数\n * const res = await request<{ list: any[] }>({\n * url: 'https://api.example.com/users',\n * query: { page: '1', size: '10' },\n * })\n * ```\n */\nexport async function request<T>(options: RequestOptions) {\n const {\n url,\n query = {},\n method = 'GET',\n headers = {},\n data,\n dataType = 'json',\n contentType = 'json',\n timeout = 10000,\n } = options;\n\n const fullUrl = `${url}?${qsStringify(query)}`;\n\n // 使用uniCloud.httpclient发起请求\n // @ts-expect-error: uniCloud类型定义中可能缺少httpclient属性\n const res = await uniCloud.httpclient.request(fullUrl, {\n method,\n headers,\n data,\n dataType,\n contentType,\n timeout,\n });\n\n return res as { data: T; status: number; headers: Record<string, string> };\n}\n"],"mappings":"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"}
|
package/dist/cloud.d.ts
CHANGED
package/dist/cloud.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as parseCloudMethodOutput, t as isUniError } from "./_helpers.mjs";
|
|
2
2
|
import { errorAssign, errorNormalize } from "@cloudcome/utils-core/error";
|
|
3
3
|
import { objectDefaults, objectOmit } from "@cloudcome/utils-core/object";
|
|
4
4
|
import { isFunction } from "@cloudcome/utils-core/type";
|
|
@@ -50,33 +50,33 @@ function parseCloudModuleOutput(output, fallbackErrorMessage = "") {
|
|
|
50
50
|
*
|
|
51
51
|
* @template O - 函数返回值的类型
|
|
52
52
|
* @param fn - 要执行的异步函数
|
|
53
|
-
* @param
|
|
53
|
+
* @param options - 可选配置
|
|
54
|
+
* @param options.append - 要附加到响应中的额外数据
|
|
55
|
+
* @param options.parseError - 自定义错误处理函数
|
|
54
56
|
* @returns 标准化的云对象响应对象
|
|
55
57
|
*
|
|
56
58
|
* @example
|
|
57
59
|
* ```typescript
|
|
58
60
|
* const result = await respondCloudMethod(async () => {
|
|
59
61
|
* return await getData();
|
|
60
|
-
* }, { extra: 'data' });
|
|
62
|
+
* }, { append: { extra: 'data' } });
|
|
61
63
|
* ```
|
|
62
64
|
*/
|
|
63
|
-
async function respondCloudMethod(fn,
|
|
65
|
+
async function respondCloudMethod(fn, options) {
|
|
64
66
|
try {
|
|
65
67
|
return {
|
|
66
68
|
errCode: 0,
|
|
67
69
|
errMsg: "",
|
|
68
70
|
data: await fn(),
|
|
69
|
-
...append
|
|
71
|
+
...options?.append
|
|
70
72
|
};
|
|
71
73
|
} catch (err) {
|
|
72
|
-
|
|
73
|
-
console.error(err);
|
|
74
|
-
const err2 = errorNormalize(err);
|
|
74
|
+
const err3 = options?.parseError?.(err) || errorNormalize(err);
|
|
75
75
|
return {
|
|
76
|
-
errCode:
|
|
77
|
-
errMsg:
|
|
76
|
+
errCode: err3.errCode ?? -1,
|
|
77
|
+
errMsg: err3.errMsg || err3.message || "",
|
|
78
78
|
data: null,
|
|
79
|
-
...append
|
|
79
|
+
...options?.append
|
|
80
80
|
};
|
|
81
81
|
}
|
|
82
82
|
}
|
|
@@ -139,7 +139,10 @@ function buildCloudMethodCreator(options) {
|
|
|
139
139
|
return await arg1(context, parsed.data);
|
|
140
140
|
};
|
|
141
141
|
if (createOptions.noRespond) return await cloudMethod();
|
|
142
|
-
return await respondCloudMethod(cloudMethod,
|
|
142
|
+
return await respondCloudMethod(cloudMethod, {
|
|
143
|
+
append: buildOptions.respondAppend(this),
|
|
144
|
+
parseError: buildOptions.parseError
|
|
145
|
+
});
|
|
143
146
|
};
|
|
144
147
|
};
|
|
145
148
|
return createCloudMethod;
|
|
@@ -230,6 +233,6 @@ async function request(options) {
|
|
|
230
233
|
});
|
|
231
234
|
}
|
|
232
235
|
//#endregion
|
|
233
|
-
export { buildCloudMethodCreator, createCloudObjectError, parseCloudMethodOutput, parseCloudModuleOutput, request, respondCloudMethod };
|
|
236
|
+
export { buildCloudMethodCreator, createCloudObjectError, isUniError, parseCloudMethodOutput, parseCloudModuleOutput, request, respondCloudMethod };
|
|
234
237
|
|
|
235
238
|
//# sourceMappingURL=cloud.mjs.map
|
package/dist/cloud.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud.mjs","names":[],"sources":["../src/cloud/error.ts","../src/cloud/module.ts","../src/cloud/respond.ts","../src/cloud/method.ts","../src/cloud/request.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 { UniError } from '@/_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 UniError);\n\n return {\n errCode: err2.errCode || -1,\n errMsg: err2.errMsg || err2.message || '',\n // @ts-expect-error\n data: null,\n ...append,\n };\n }\n}\n","import { objectDefaults } 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 { versionCompare } from '@cloudcome/utils-core/version';\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, 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\n/**\n * 云对象创建选项的运行时解析类型。\n *\n * 将 `CreateCloudObjectOptions` 中的内置字段设为必填(已应用默认值),\n * 同时保留 `ExtraConfig` 扩展字段的原始可选性。\n *\n * @template ExtraConfig - 自定义扩展配置类型\n */\ntype _ResolvedCreateCloudOptions<ExtraConfig extends AnyObject = {}> = ExtraConfig & {\n /** 是否需要用户登录态 */\n requiredUser: boolean;\n /** 是否仅在本地环境运行 */\n onlyLocalEnv: boolean;\n /** 最小支持版本 */\n minVersion?: string;\n /** 最大支持版本 */\n maxVersion?: string;\n /** 非响应模式,常用于钩子函数中 */\n noRespond?: boolean;\n};\n\ntype _CloudObjectThisAppend<ExtraConfig extends AnyObject = {}> = {\n options: _ResolvedCreateCloudOptions<ExtraConfig>;\n user: _CloudObjectThisAppendUser;\n};\n\nexport type CloudObjectContext<ExtraConfig extends AnyObject = {}> = CloudObjectThis &\n _CloudObjectThisAppend<ExtraConfig>;\n\nexport type BuildCloudMethodCreatorOptions<ExtraConfig extends AnyObject = {}> = {\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 * @default '应用版本过低'\n */\n appVersionTooLowErrMsg?: string;\n\n /**\n * 应用版本过高错误消息\n * @default '应用版本过高'\n */\n appVersionTooHighErrMsg?: string;\n\n /**\n * 响应附加数据函数\n * 用于在云对象响应中添加额外的上下文信息\n * @param objectThis 云对象上下文\n * @returns 返回要附加到响应中的数据对象\n */\n respondAppend?: (objectThis: CloudObjectThis) => AnyObject;\n\n /**\n * 所有云对象执行前钩子函数\n * @param context 云对象上下文,包含用户信息、扩展配置选项等\n * @param options 云对象创建选项,包含 requiredUser、onlyLocalEnv 及自定义扩展配置\n */\n onBefore?: (\n context: CloudObjectContext<ExtraConfig>,\n options: _ResolvedCreateCloudOptions<ExtraConfig>,\n ) => MaybePromise<unknown>;\n};\n\nexport type CreateCloudObjectOptions<ExtraConfig extends object = object> = ExtraConfig & {\n /**\n * 是否需要用户登录态\n * @default false\n */\n requiredUser?: boolean;\n\n /**\n * 是否仅在本地环境运行\n * @default false\n */\n onlyLocalEnv?: boolean;\n\n /**\n * 最小支持版本\n */\n minVersion?: string;\n\n /**\n * 最大支持版本\n */\n maxVersion?: string;\n\n /**\n * 非响应模式,常用于钩子函数中,如 _before, _after 等,\n * 文档:https://doc.dcloud.net.cn/uniCloud/cloud-obj.html#before-and-after\n */\n noRespond?: boolean;\n};\n\nexport type CreateCloudMethod<ExtraConfig extends object = object> = {\n <S extends ZodObject, O>(\n schema: S,\n fn: (context: CloudObjectContext<ExtraConfig>, input: z.infer<S>) => MaybePromise<O>,\n options?: CreateCloudObjectOptions<ExtraConfig>,\n ): CloudMethod<z.infer<S>, O>;\n\n <O>(\n fn: (context: CloudObjectContext<ExtraConfig>) => MaybePromise<O>,\n options?: CreateCloudObjectOptions<ExtraConfig>,\n ): 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<ExtraConfig extends AnyObject = {}>(\n options?: BuildCloudMethodCreatorOptions<ExtraConfig>,\n) {\n const buildOptions = objectDefaults(options || {}, {\n requiredUserErrCode: 'uni-id-check-token-failed',\n requiredUserErrMsg: '需要登录后才能进行此操作',\n onlyLocalEnvErrMsg: '运行环境不匹配',\n appVersionTooLowErrMsg: '应用版本过低',\n appVersionTooHighErrMsg: '应用版本过高',\n respondAppend: () => ({}),\n onBefore: () => {},\n }) as Required<BuildCloudMethodCreatorOptions>;\n\n // @ts-expect-error\n const createCloudMethod: CreateCloudMethod<ExtraConfig> = (arg0, arg1, arg2) => {\n const optionsSource = (isFunction(arg0) ? arg1 : arg2) as CreateCloudObjectOptions<ExtraConfig> | undefined;\n const createOptions = objectDefaults(optionsSource || {}, {\n requiredUser: false,\n onlyLocalEnv: false,\n }) as _ResolvedCreateCloudOptions<ExtraConfig>;\n\n return async function (this: CloudObjectThis, input) {\n const cloudMethod = async () => {\n const { runtimeEnv } = this.getCloudInfo();\n\n if (createOptions.onlyLocalEnv && runtimeEnv !== 'local') {\n throw createCloudObjectError(buildOptions.onlyLocalEnvErrMsg);\n }\n\n const { appVersion } = this.getClientInfo();\n\n if (createOptions.minVersion && versionCompare(appVersion, createOptions.minVersion) < 0) {\n throw createCloudObjectError(buildOptions.appVersionTooLowErrMsg);\n }\n\n if (createOptions.maxVersion && versionCompare(appVersion, createOptions.maxVersion) > 0) {\n throw createCloudObjectError(buildOptions.appVersionTooHighErrMsg);\n }\n\n const user = await _parseAppendUser(this, options?.uniIdCommonModule);\n const append: _CloudObjectThisAppend<ExtraConfig> = {\n options: createOptions,\n user: user,\n };\n const context = Object.assign(this, append) as CloudObjectContext<ExtraConfig>;\n\n if (createOptions.requiredUser && !user.id) {\n throw createCloudObjectError(buildOptions.requiredUserErrMsg, buildOptions.requiredUserErrCode);\n }\n\n await buildOptions.onBefore(context, createOptions);\n\n if (isFunction(arg0)) {\n return await arg0(context);\n }\n\n const parsed = arg0.safeParse(input);\n\n if (!parsed.success) {\n console.log(parsed.error.issues);\n\n const issue0 = parsed.error?.issues?.[0];\n\n if (issue0?.code === 'custom') throw issue0.message;\n throw new Error('请求数据不正确');\n }\n\n return await arg1(context, parsed.data);\n };\n\n if (createOptions.noRespond) {\n return await cloudMethod();\n }\n\n return await respondCloudMethod(cloudMethod, 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 const [_err1, user] = await tryFlatten(uic.checkToken(objectThis.getUniIdToken() || ''));\n if (!user) return appendUser;\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","import { qsStringify } from '@cloudcome/utils-core/qs';\nimport type { AnyObject } from '@cloudcome/utils-core/types';\n\n/**\n * HTTP 请求配置选项\n */\nexport type RequestOptions = {\n /**\n * 请求 URL 地址\n */\n url: string;\n\n /**\n * URL 查询参数,会自动拼接到 url 后面\n */\n query?: Record<string, string>;\n\n /**\n * HTTP 请求方法\n * @default 'GET'\n */\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'OPTIONS';\n\n /**\n * 请求头\n */\n headers?: Record<string, string>;\n\n /**\n * 请求体数据\n */\n data?: AnyObject;\n\n /**\n * 返回数据格式\n * @default 'json'\n */\n dataType?: string;\n\n /**\n * 请求内容类型\n * - 'json': application/json\n * - 'form': application/x-www-form-urlencoded\n * @default 'json'\n */\n contentType?: string;\n\n /**\n * 请求超时时间,单位毫秒\n * @default 10000\n */\n timeout?: number;\n};\n\n/**\n * 发起 HTTP 请求\n *\n * 基于 uniCloud.httpclient 发起 HTTP 请求,支持 GET、POST、PUT、DELETE 等方法。\n * 查询参数会自动通过 qsStringify 拼接到 URL 上。\n *\n * @template T - 响应数据的类型\n * @param options 请求配置选项\n * @returns 包含 data、status、headers 的响应对象\n *\n * @example\n * ```ts\n * // GET 请求\n * const res = await request<{ name: string }>({\n * url: 'https://api.example.com/users/1',\n * })\n * console.log(res.data) // { name: 'Alice' }\n * console.log(res.status) // 200\n *\n * // POST 请求\n * const res = await request<{ id: string }>({\n * url: 'https://api.example.com/users',\n * method: 'POST',\n * data: { name: 'Alice', age: 25 },\n * })\n *\n * // 带查询参数\n * const res = await request<{ list: any[] }>({\n * url: 'https://api.example.com/users',\n * query: { page: '1', size: '10' },\n * })\n * ```\n */\nexport async function request<T>(options: RequestOptions) {\n const {\n url,\n query = {},\n method = 'GET',\n headers = {},\n data,\n dataType = 'json',\n contentType = 'json',\n timeout = 10000,\n } = options;\n\n const fullUrl = `${url}?${qsStringify(query)}`;\n\n // 使用uniCloud.httpclient发起请求\n // @ts-expect-error: uniCloud类型定义中可能缺少httpclient属性\n const res = await uniCloud.httpclient.request(fullUrl, {\n method,\n headers,\n data,\n dataType,\n contentType,\n timeout,\n });\n\n return res as { data: T; status: number; headers: Record<string, string> };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cloud.mjs","names":[],"sources":["../src/cloud/error.ts","../src/cloud/module.ts","../src/cloud/respond.ts","../src/cloud/method.ts","../src/cloud/request.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, AnyObject } from '@cloudcome/utils-core/types';\nimport type { UniError } from '@/_types';\nimport type { CloudMethodOutput } from './types';\n\nexport type RespondCloudMethodOptions = {\n /** 要附加到响应中的额外数据 */\n append?: AnyObject;\n /**\n * 自定义错误处理函数\n * @param err {unknown} 错误\n * @returns 处理后的错误对象,其 errCode/errMsg 将被用于响应\n */\n parseError?: (err: unknown) => UniError;\n};\n\n/**\n * 执行云对象方法并标准化响应格式\n *\n * @template O - 函数返回值的类型\n * @param fn - 要执行的异步函数\n * @param options - 可选配置\n * @param options.append - 要附加到响应中的额外数据\n * @param options.parseError - 自定义错误处理函数\n * @returns 标准化的云对象响应对象\n *\n * @example\n * ```typescript\n * const result = await respondCloudMethod(async () => {\n * return await getData();\n * }, { append: { extra: 'data' } });\n * ```\n */\nexport async function respondCloudMethod<O>(\n fn: () => MaybePromise<O>,\n options?: RespondCloudMethodOptions,\n): Promise<CloudMethodOutput<O>> {\n try {\n const data = await fn();\n\n return {\n errCode: 0,\n errMsg: '',\n data,\n ...options?.append,\n };\n } catch (err) {\n const err3 = options?.parseError?.(err) || (errorNormalize(err) as UniError);\n\n return {\n errCode: err3.errCode ?? -1,\n errMsg: err3.errMsg || err3.message || '',\n // @ts-expect-error\n data: null,\n ...options?.append,\n };\n }\n}\n","import { objectDefaults } from '@cloudcome/utils-core/object';\nimport { tryFlatten } from '@cloudcome/utils-core/try';\nimport { isFunction } from '@cloudcome/utils-core/type';\nimport type { MaybePromise, AnyObject } from '@cloudcome/utils-core/types';\nimport { versionCompare } from '@cloudcome/utils-core/version';\nimport type z from 'zod';\nimport type { ZodObject } from 'zod';\nimport type { UniError } from '@/_types';\nimport { createCloudObjectError } from './error';\nimport { parseCloudModuleOutput } from './module';\nimport { respondCloudMethod } from './respond';\nimport type { CloudMethod, 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\n/**\n * 云对象创建选项的运行时解析类型。\n *\n * 将 `CreateCloudObjectOptions` 中的内置字段设为必填(已应用默认值),\n * 同时保留 `ExtraConfig` 扩展字段的原始可选性。\n *\n * @template ExtraConfig - 自定义扩展配置类型\n */\ntype _ResolvedCreateCloudOptions<ExtraConfig extends AnyObject = {}> = ExtraConfig & {\n /** 是否需要用户登录态 */\n requiredUser: boolean;\n /** 是否仅在本地环境运行 */\n onlyLocalEnv: boolean;\n /** 最小支持版本 */\n minVersion?: string;\n /** 最大支持版本 */\n maxVersion?: string;\n /** 非响应模式,常用于钩子函数中 */\n noRespond?: boolean;\n};\n\ntype _CloudObjectThisAppend<ExtraConfig extends AnyObject = {}> = {\n options: _ResolvedCreateCloudOptions<ExtraConfig>;\n user: _CloudObjectThisAppendUser;\n};\n\nexport type CloudObjectContext<ExtraConfig extends AnyObject = {}> = CloudObjectThis &\n _CloudObjectThisAppend<ExtraConfig>;\n\nexport type BuildCloudMethodCreatorOptions<ExtraConfig extends AnyObject = {}> = {\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 * @default '应用版本过低'\n */\n appVersionTooLowErrMsg?: string;\n\n /**\n * 应用版本过高错误消息\n * @default '应用版本过高'\n */\n appVersionTooHighErrMsg?: string;\n\n /**\n * 响应附加数据函数\n * 用于在云对象响应中添加额外的上下文信息\n * @param objectThis 云对象上下文\n * @returns 返回要附加到响应中的数据对象\n */\n respondAppend?: (objectThis: CloudObjectThis) => AnyObject;\n\n /**\n * 自定义错误处理函数\n * 用于在云对象响应中处理错误信息,如脱敏、转换错误码等\n * @param err 原始错误对象\n * @returns 处理后的错误对象,其 errCode/errMsg 将被用于响应\n */\n parseError?: (err: unknown) => UniError;\n\n /**\n * 所有云对象执行前钩子函数\n * @param context 云对象上下文,包含用户信息、扩展配置选项等\n * @param options 云对象创建选项,包含 requiredUser、onlyLocalEnv 及自定义扩展配置\n */\n onBefore?: (\n context: CloudObjectContext<ExtraConfig>,\n options: _ResolvedCreateCloudOptions<ExtraConfig>,\n ) => MaybePromise<unknown>;\n};\n\nexport type CreateCloudObjectOptions<ExtraConfig extends AnyObject = AnyObject> = ExtraConfig & {\n /**\n * 是否需要用户登录态\n * @default false\n */\n requiredUser?: boolean;\n\n /**\n * 是否仅在本地环境运行\n * @default false\n */\n onlyLocalEnv?: boolean;\n\n /**\n * 最小支持版本\n */\n minVersion?: string;\n\n /**\n * 最大支持版本\n */\n maxVersion?: string;\n\n /**\n * 非响应模式,常用于钩子函数中,如 _before, _after 等,\n * 文档:https://doc.dcloud.net.cn/uniCloud/cloud-obj.html#before-and-after\n */\n noRespond?: boolean;\n};\n\nexport type CreateCloudMethod<ExtraConfig extends AnyObject = AnyObject> = {\n <S extends ZodObject, O>(\n schema: S,\n fn: (context: CloudObjectContext<ExtraConfig>, input: z.infer<S>) => MaybePromise<O>,\n options?: CreateCloudObjectOptions<ExtraConfig>,\n ): CloudMethod<z.infer<S>, O>;\n\n <O>(\n fn: (context: CloudObjectContext<ExtraConfig>) => MaybePromise<O>,\n options?: CreateCloudObjectOptions<ExtraConfig>,\n ): 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<ExtraConfig extends AnyObject = {}>(\n options?: BuildCloudMethodCreatorOptions<ExtraConfig>,\n) {\n const buildOptions = objectDefaults(options || {}, {\n requiredUserErrCode: 'uni-id-check-token-failed',\n requiredUserErrMsg: '需要登录后才能进行此操作',\n onlyLocalEnvErrMsg: '运行环境不匹配',\n appVersionTooLowErrMsg: '应用版本过低',\n appVersionTooHighErrMsg: '应用版本过高',\n respondAppend: () => ({}),\n onBefore: () => {},\n }) as Required<BuildCloudMethodCreatorOptions>;\n\n // @ts-expect-error\n const createCloudMethod: CreateCloudMethod<ExtraConfig> = (arg0, arg1, arg2) => {\n const optionsSource = (isFunction(arg0) ? arg1 : arg2) as CreateCloudObjectOptions<ExtraConfig> | undefined;\n const createOptions = objectDefaults(optionsSource || {}, {\n requiredUser: false,\n onlyLocalEnv: false,\n }) as _ResolvedCreateCloudOptions<ExtraConfig>;\n\n return async function (this: CloudObjectThis, input) {\n const cloudMethod = async () => {\n const { runtimeEnv } = this.getCloudInfo();\n\n if (createOptions.onlyLocalEnv && runtimeEnv !== 'local') {\n throw createCloudObjectError(buildOptions.onlyLocalEnvErrMsg);\n }\n\n const { appVersion } = this.getClientInfo();\n\n if (createOptions.minVersion && versionCompare(appVersion, createOptions.minVersion) < 0) {\n throw createCloudObjectError(buildOptions.appVersionTooLowErrMsg);\n }\n\n if (createOptions.maxVersion && versionCompare(appVersion, createOptions.maxVersion) > 0) {\n throw createCloudObjectError(buildOptions.appVersionTooHighErrMsg);\n }\n\n const user = await _parseAppendUser(this, options?.uniIdCommonModule);\n const append: _CloudObjectThisAppend<ExtraConfig> = {\n options: createOptions,\n user: user,\n };\n const context = Object.assign(this, append) as CloudObjectContext<ExtraConfig>;\n\n if (createOptions.requiredUser && !user.id) {\n throw createCloudObjectError(buildOptions.requiredUserErrMsg, buildOptions.requiredUserErrCode);\n }\n\n await buildOptions.onBefore(context, createOptions);\n\n if (isFunction(arg0)) {\n return await arg0(context);\n }\n\n const parsed = arg0.safeParse(input);\n\n if (!parsed.success) {\n console.log(parsed.error.issues);\n\n const issue0 = parsed.error?.issues?.[0];\n\n if (issue0?.code === 'custom') throw issue0.message;\n throw new Error('请求数据不正确');\n }\n\n return await arg1(context, parsed.data);\n };\n\n if (createOptions.noRespond) {\n return await cloudMethod();\n }\n\n return await respondCloudMethod(cloudMethod, {\n append: buildOptions.respondAppend(this),\n parseError: buildOptions.parseError,\n });\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 const [_err1, user] = await tryFlatten(uic.checkToken(objectThis.getUniIdToken() || ''));\n if (!user) return appendUser;\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","import { qsStringify } from '@cloudcome/utils-core/qs';\nimport type { AnyObject } from '@cloudcome/utils-core/types';\n\n/**\n * HTTP 请求配置选项\n */\nexport type RequestOptions = {\n /**\n * 请求 URL 地址\n */\n url: string;\n\n /**\n * URL 查询参数,会自动拼接到 url 后面\n */\n query?: Record<string, string>;\n\n /**\n * HTTP 请求方法\n * @default 'GET'\n */\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'OPTIONS';\n\n /**\n * 请求头\n */\n headers?: Record<string, string>;\n\n /**\n * 请求体数据\n */\n data?: AnyObject;\n\n /**\n * 返回数据格式\n * @default 'json'\n */\n dataType?: string;\n\n /**\n * 请求内容类型\n * - 'json': application/json\n * - 'form': application/x-www-form-urlencoded\n * @default 'json'\n */\n contentType?: string;\n\n /**\n * 请求超时时间,单位毫秒\n * @default 10000\n */\n timeout?: number;\n};\n\n/**\n * 发起 HTTP 请求\n *\n * 基于 uniCloud.httpclient 发起 HTTP 请求,支持 GET、POST、PUT、DELETE 等方法。\n * 查询参数会自动通过 qsStringify 拼接到 URL 上。\n *\n * @template T - 响应数据的类型\n * @param options 请求配置选项\n * @returns 包含 data、status、headers 的响应对象\n *\n * @example\n * ```ts\n * // GET 请求\n * const res = await request<{ name: string }>({\n * url: 'https://api.example.com/users/1',\n * })\n * console.log(res.data) // { name: 'Alice' }\n * console.log(res.status) // 200\n *\n * // POST 请求\n * const res = await request<{ id: string }>({\n * url: 'https://api.example.com/users',\n * method: 'POST',\n * data: { name: 'Alice', age: 25 },\n * })\n *\n * // 带查询参数\n * const res = await request<{ list: any[] }>({\n * url: 'https://api.example.com/users',\n * query: { page: '1', size: '10' },\n * })\n * ```\n */\nexport async function request<T>(options: RequestOptions) {\n const {\n url,\n query = {},\n method = 'GET',\n headers = {},\n data,\n dataType = 'json',\n contentType = 'json',\n timeout = 10000,\n } = options;\n\n const fullUrl = `${url}?${qsStringify(query)}`;\n\n // 使用uniCloud.httpclient发起请求\n // @ts-expect-error: uniCloud类型定义中可能缺少httpclient属性\n const res = await uniCloud.httpclient.request(fullUrl, {\n method,\n headers,\n data,\n dataType,\n contentType,\n timeout,\n });\n\n return res as { data: T; status: number; headers: Record<string, string> };\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AnyObject, MergeIntersection } from '@cloudcome/utils-core/types';
|
|
2
1
|
import { UniError } from '../_types';
|
|
2
|
+
import { AnyObject, MergeIntersection } from '@cloudcome/utils-core/types';
|
|
3
3
|
import { DbQueryCommand } from './_command.class';
|
|
4
4
|
import { DbCreate, DbForeign, DbOrder, DbQuery, DbRelation, DbSelect, DbUpdate, DbWhere } from './types';
|
|
5
5
|
export type DbOptions = {
|
|
@@ -17,10 +17,10 @@ export type DbOptions = {
|
|
|
17
17
|
_mockDatabase?: any;
|
|
18
18
|
/**
|
|
19
19
|
* 自定义错误处理函数
|
|
20
|
-
* @param error
|
|
21
|
-
* @returns
|
|
20
|
+
* @param error unknown 数据库异常对象
|
|
21
|
+
* @returns 自定义错误对象
|
|
22
22
|
*/
|
|
23
|
-
parseError?: (error:
|
|
23
|
+
parseError?: (error: unknown) => UniError;
|
|
24
24
|
};
|
|
25
25
|
export type DbLookupOptions<RL extends DbRelation, D1, FD1, AS, US extends boolean | undefined | void = undefined> = {
|
|
26
26
|
/**
|
|
@@ -156,6 +156,18 @@ export declare class Db<D1, S1 extends DbSelect<D1> = {}, D2 extends AnyObject =
|
|
|
156
156
|
private _lookupAs;
|
|
157
157
|
private _endAggregate;
|
|
158
158
|
private _endHost;
|
|
159
|
+
/**
|
|
160
|
+
* 将 uniCloud 数据库原始错误包装为 DbError
|
|
161
|
+
* @param err - 原始错误对象,来自 uniCloud DB 操作(Error 实例,含 errMsg、errCode 属性)
|
|
162
|
+
* @returns DbError 实例
|
|
163
|
+
*/
|
|
164
|
+
private _parseDbError;
|
|
165
|
+
/**
|
|
166
|
+
* 统一处理 DB 操作抛出的错误
|
|
167
|
+
* - uniCloud 数据库错误(含 errMsg)→ 包装为 DbError → 经 parseError 回调后抛出
|
|
168
|
+
* - 非数据库错误(如网络中断)→ 原样抛出
|
|
169
|
+
*/
|
|
170
|
+
private _handleDbError;
|
|
159
171
|
/**
|
|
160
172
|
* 执行查询操作
|
|
161
173
|
* @returns 查询结果
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 数据库底层异常类
|
|
3
|
+
* 当 uniCloud 数据库操作抛出错误时,统一包装为该异常
|
|
4
|
+
*/
|
|
5
|
+
export declare class DbError extends Error {
|
|
6
|
+
/** 原始错误码,如 'InternalServerError' */
|
|
7
|
+
errCode: string | number;
|
|
8
|
+
/** MongoDB 错误码,如 'E11000'。不匹配则为空字符串 */
|
|
9
|
+
dbCode: string;
|
|
10
|
+
constructor(message: string, extra: {
|
|
11
|
+
errCode: string | number;
|
|
12
|
+
dbCode: string;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 判断错误是否为数据库底层错误
|
|
17
|
+
* @param err - 任意错误对象
|
|
18
|
+
* @returns 是否为 DbError
|
|
19
|
+
*/
|
|
20
|
+
export declare function isDbError(err: unknown): err is DbError;
|
|
21
|
+
/**
|
|
22
|
+
* 从 MongoDB 错误消息中提取错误码
|
|
23
|
+
* @param errMsg - 错误消息字符串,如 'E11000 duplicate key error...'
|
|
24
|
+
* @returns MongoDB 错误码,如 'E11000'
|
|
25
|
+
*/
|
|
26
|
+
export declare function extractMongoCode(errMsg: string): string;
|