@cloudcome/utils-uni 1.3.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cloud.mjs CHANGED
@@ -1,25 +1,96 @@
1
- import { useRequest } from "@cloudcome/utils-vue/request";
2
- function createUseCloudObject(objectName, options) {
3
- const server = (options == null ? void 0 : options._mockServer) || uniCloud.importObject(objectName, options);
4
- const useCloudObject = (caller, options2) => {
5
- return useRequest(async (...inputs) => {
6
- const result = await caller(server, ...inputs);
7
- if (!result.errCode) return result.data;
8
- throw new Error(result.errMsg || "请求失败");
9
- }, options2);
1
+ import { errorAssign, errorNormalize } from "@cloudcome/utils-core/error";
2
+ import { p as parseCloudObjectOutput } from "./_helpers.mjs";
3
+ import { objectDefaults } from "@cloudcome/utils-core/object";
4
+ import { tryFlatten } from "@cloudcome/utils-core/try";
5
+ import { isFunction } from "@cloudcome/utils-core/type";
6
+ function createCloudObjectError(message, code) {
7
+ return errorAssign(new Error(message), {
8
+ errCode: code,
9
+ errMsg: message
10
+ });
11
+ }
12
+ async function respondCloudObject(fn, requestId) {
13
+ try {
14
+ const data = await fn();
15
+ return {
16
+ requestId,
17
+ data,
18
+ errCode: 0,
19
+ errMsg: ""
20
+ };
21
+ } catch (err) {
22
+ const err2 = errorNormalize(err);
23
+ return {
24
+ requestId,
25
+ // @ts-ignore
26
+ data: null,
27
+ errCode: err2.errCode || -1,
28
+ errMsg: err2.errMsg || err2.message || ""
29
+ };
30
+ }
31
+ }
32
+ function buildCloudObjectExposeCreator(options) {
33
+ const buildOptions = objectDefaults(options || {}, {
34
+ requiredUserErrCode: "uni-id-check-token-failed",
35
+ requiredUserErrMsg: "需要登录后才能进行此操作"
36
+ });
37
+ const createCloudObjectExpose = (arg0, arg1, arg2) => {
38
+ const optionsSource = isFunction(arg0) ? arg1 : arg2;
39
+ const createOptions = objectDefaults(optionsSource || {}, {
40
+ requiredUser: false
41
+ });
42
+ return async function(input) {
43
+ return await respondCloudObject(async () => {
44
+ var _a, _b;
45
+ const user = await parseAppendUser(this, options == null ? void 0 : options.uniIdCloudObject);
46
+ const append = {
47
+ options: createOptions,
48
+ user
49
+ };
50
+ const context = Object.assign(this, append);
51
+ if (createOptions.requiredUser && !user.id) {
52
+ throw createCloudObjectError(buildOptions.requiredUserErrMsg, buildOptions.requiredUserErrCode);
53
+ }
54
+ if (isFunction(arg0)) {
55
+ return await arg0(context);
56
+ }
57
+ const parsed = arg0.safeParse(input);
58
+ if (!parsed.success) {
59
+ console.log(parsed.error.issues);
60
+ const issue0 = (_b = (_a = parsed.error) == null ? void 0 : _a.issues) == null ? void 0 : _b[0];
61
+ if ((issue0 == null ? void 0 : issue0.code) === "custom") throw issue0.message;
62
+ throw new Error("请求数据不正确");
63
+ }
64
+ return await arg1(context, parsed.data);
65
+ }, this.getUniCloudRequestId());
66
+ };
10
67
  };
11
- return useCloudObject;
68
+ return createCloudObjectExpose;
12
69
  }
13
- function useCloudDatabase(caller, options) {
14
- const db = (options == null ? void 0 : options._mockDatabase) || uniCloud.database();
15
- return useRequest(async (...inputs) => {
16
- const { result } = await caller(db, ...inputs);
17
- if (!result.errCode) return result;
18
- throw new Error(result.errMsg || "请求失败");
19
- }, options);
70
+ async function parseAppendUser(objectThis, uniIdCloudObject) {
71
+ const appendUser = {
72
+ id: "",
73
+ role: [],
74
+ permission: [],
75
+ isAdmin: false
76
+ };
77
+ if (!uniIdCloudObject) return appendUser;
78
+ const uniId = uniIdCloudObject.createInstance({
79
+ clientInfo: objectThis.getClientInfo()
80
+ });
81
+ const [err1, user] = await tryFlatten(uniId.checkToken(objectThis.getUniIdToken() || ""));
82
+ if (!user) return appendUser;
83
+ const [err2, userData] = tryFlatten(() => parseCloudObjectOutput(user));
84
+ if (!userData) return appendUser;
85
+ appendUser.id = userData.uid || "";
86
+ appendUser.role = userData.role || [];
87
+ appendUser.permission = userData.permission || [];
88
+ appendUser.isAdmin = appendUser.role.includes("admin") && appendUser.permission.length === 0;
89
+ return appendUser;
20
90
  }
21
91
  export {
22
- createUseCloudObject,
23
- useCloudDatabase
92
+ buildCloudObjectExposeCreator,
93
+ createCloudObjectError,
94
+ respondCloudObject
24
95
  };
25
96
  //# sourceMappingURL=cloud.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud.mjs","sources":["../src/cloud.ts"],"sourcesContent":["import type { AnyArray } from '@cloudcome/utils-core/types';\nimport {\n type UseRequestOptions,\n type UseRequestOutput,\n type UseRequestOutputFilled,\n useRequest,\n} from '@cloudcome/utils-vue/request';\n\ntype ImportObject = UniCloudNamespace.UniCloud['importObject'];\ntype ImportObjectArgs = Parameters<ImportObject>;\n\nexport type UniCloudObjectOutput<T> = {\n errCode?: number | string;\n errMsg?: string;\n data: T;\n};\n\nexport type UniCloudObjectServer<O> = Record<string, (...inputs: unknown[]) => Promise<UniCloudObjectOutput<O>>>;\n\nexport type CreateUseCloudObjectOptions = ImportObjectArgs[1] & {\n /**\n * 模拟云对象,用于单元测试\n * @private\n */\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n _mockServer?: any;\n};\n\nexport type UseCloudObject = {\n <I extends AnyArray, O>(\n caller: (server: UniCloudObjectServer<O>, ...inputs: I) => Promise<UniCloudObjectOutput<O>>,\n options: Omit<UseRequestOptions<I, O>, 'placeholder'> & { placeholder: () => O },\n ): UseRequestOutputFilled<I, O>;\n <I extends AnyArray, O>(\n caller: (server: UniCloudObjectServer<O>, ...inputs: I) => Promise<UniCloudObjectOutput<O>>,\n options?: UseRequestOptions<I, O>,\n ): UseRequestOutput<I, O>;\n};\n\n/**\n * 创建一个用于调用云对象的hook工厂函数\n * @param objectName 云对象名称,用于导入对应的云对象\n * @param options 导入云对象时的可选配置参数\n * @returns 返回一个函数,该函数可以用于创建云对象调用hook\n */\nexport function createUseCloudObject(objectName: ImportObjectArgs[0], options?: CreateUseCloudObjectOptions) {\n const server = options?._mockServer || uniCloud.importObject(objectName, options);\n const useCloudObject: UseCloudObject = (caller, options) => {\n // 使用请求hook处理云对象调用\n return useRequest(async (...inputs) => {\n const result = await caller(server, ...inputs);\n if (!result.errCode) return result.data;\n throw new Error(result.errMsg || '请求失败');\n }, options);\n };\n\n return useCloudObject;\n}\n\nexport type UniCloudDatabaseOutput<T> = {\n result: T & {\n errCode?: number | string;\n errMsg?: string;\n };\n};\n\nexport type UseCloudDatabaseOptions<I extends AnyArray, O> = UseRequestOptions<I, O> & {\n /**\n * 模拟数据库,用于单元测试\n */\n // biome-ignore lint/suspicious/noExplicitAny: <explanation>\n _mockDatabase?: any;\n};\n\n/**\n * 创建一个用于调用云数据库的hook\n * @param caller 调用云数据库的函数,接收数据库实例和输入参数,返回Promise\n * @param options 配置选项\n * @returns 返回一个请求hook,用于处理云数据库调用\n */\nexport function useCloudDatabase<I extends AnyArray, O>(\n caller: (db: UniCloud.Database, ...inputs: I) => Promise<UniCloudDatabaseOutput<O>>,\n options: Omit<UseCloudDatabaseOptions<I, O>, 'placeholder'> & { placeholder: () => O },\n): UseRequestOutputFilled<I, O>;\nexport function useCloudDatabase<I extends AnyArray, O>(\n caller: (db: UniCloud.Database, ...inputs: I) => Promise<UniCloudDatabaseOutput<O>>,\n options?: UseCloudDatabaseOptions<I, O>,\n): UseRequestOutput<I, O>;\nexport function useCloudDatabase<I extends AnyArray, O>(\n caller: (db: UniCloud.Database, ...inputs: I) => Promise<UniCloudDatabaseOutput<O>>,\n options?: UseCloudDatabaseOptions<I, O>,\n): UseRequestOutput<I, O> {\n // 获取数据库实例,优先使用模拟数据库(用于测试),否则使用uniCloud数据库\n const db = options?._mockDatabase || uniCloud.database();\n return useRequest(async (...inputs: I) => {\n const { result } = await caller(db, ...inputs);\n if (!result.errCode) return result;\n throw new Error(result.errMsg || '请求失败');\n }, options);\n}\n"],"names":["options"],"mappings":";AA6CgB,SAAA,qBAAqB,YAAiC,SAAuC;AAC3G,QAAM,UAAS,mCAAS,gBAAe,SAAS,aAAa,YAAY,OAAO;AAC1E,QAAA,iBAAiC,CAAC,QAAQA,aAAY;AAEnD,WAAA,WAAW,UAAU,WAAW;AACrC,YAAM,SAAS,MAAM,OAAO,QAAQ,GAAG,MAAM;AAC7C,UAAI,CAAC,OAAO,QAAS,QAAO,OAAO;AACnC,YAAM,IAAI,MAAM,OAAO,UAAU,MAAM;AAAA,OACtCA,QAAO;AAAA,EACZ;AAEO,SAAA;AACT;AA+BgB,SAAA,iBACd,QACA,SACwB;AAExB,QAAM,MAAK,mCAAS,kBAAiB,SAAS,SAAS;AAChD,SAAA,WAAW,UAAU,WAAc;AACxC,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,IAAI,GAAG,MAAM;AACzC,QAAA,CAAC,OAAO,QAAgB,QAAA;AAC5B,UAAM,IAAI,MAAM,OAAO,UAAU,MAAM;AAAA,KACtC,OAAO;AACZ;"}
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 './object';\n\nexport async function respondCloudObject<O>(\n fn: () => MaybePromise<O>,\n requestId?: string,\n): Promise<UniCloudObjectOutput<O>> {\n try {\n const data = await fn();\n\n return {\n requestId,\n data,\n errCode: 0,\n errMsg: '',\n };\n } catch (err) {\n const err2 = errorNormalize(err as Error & { errCode?: number | string; errMsg?: string });\n\n return {\n requestId,\n // @ts-ignore\n data: null,\n errCode: err2.errCode || -1,\n errMsg: err2.errMsg || err2.message || '',\n };\n }\n}\n","import { parseCloudObjectOutput } from '@/_helpers';\nimport { 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 type z from 'zod';\nimport type { ZodObject } from 'zod';\nimport { createCloudObjectError } from './error';\nimport type { UniCloudObject, UniCloudObjectThis } from './object';\nimport { respondCloudObject } from './respond';\nimport type { UniIdCloudObject } 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 * 可选的UniIdCloudObject实例\n * 用于处理用户身份验证和权限管理相关功能\n */\n uniIdCloudObject?: UniIdCloudObject;\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\nexport type CreateCloudObjectOptions = {\n /**\n * 是否需要用户登录态\n * @default false\n */\n requiredUser?: 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 ): UniCloudObject<z.infer<S>, O>;\n <O>(\n fn: (context: UniCloudObjectContext) => MaybePromise<O>,\n options?: CreateCloudObjectOptions,\n ): UniCloudObject<void, O>;\n};\n\nexport function buildCloudObjectExposeCreator(options?: BuildCloudExposeCreatorOptions) {\n const buildOptions = objectDefaults(options || {}, {\n requiredUserErrCode: 'uni-id-check-token-failed',\n requiredUserErrMsg: '需要登录后才能进行此操作',\n }) as Required<BuildCloudExposeCreatorOptions>;\n\n // @ts-ignore\n const createCloudObjectExpose: CreateCloudObjectExpose = (arg0, arg1, arg2) => {\n // 选项来源\n const optionsSource = (isFunction(arg0) ? arg1 : arg2) as CreateCloudObjectOptions | undefined;\n // 设置默认选项值\n const createOptions = objectDefaults(optionsSource || {}, {\n requiredUser: false,\n }) as Required<CreateCloudObjectOptions>;\n\n return async function (input) {\n // 处理云函数响应逻辑\n return await respondCloudObject(async () => {\n // 构建附加的上下文信息\n const user = await parseAppendUser(this, options?.uniIdCloudObject);\n const append: UniCloudObjectThisAppend = {\n options: createOptions,\n user: user,\n };\n const context = Object.assign(this, append) as UniCloudObjectContext;\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 // 验证输入数据\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 // 处理验证错误\n if (issue0?.code === 'custom') throw issue0.message;\n throw new Error('请求数据不正确');\n }\n\n return await arg1(context, parsed.data);\n }, this.getUniCloudRequestId());\n };\n };\n\n return createCloudObjectExpose;\n}\n\nasync function parseAppendUser(\n objectThis: UniCloudObjectThis,\n uniIdCloudObject?: UniIdCloudObject,\n): Promise<UniCloudObjectThisAppendUser> {\n const appendUser: UniCloudObjectThisAppendUser = {\n id: '',\n role: [],\n permission: [],\n isAdmin: false,\n };\n\n if (!uniIdCloudObject) return appendUser;\n\n const uniId = uniIdCloudObject.createInstance({\n clientInfo: objectThis.getClientInfo(),\n });\n\n // 忽略错误1\n const [err1, user] = await tryFlatten(uniId.checkToken(objectThis.getUniIdToken() || ''));\n if (!user) return appendUser;\n\n // 忽略错误2\n const [err2, userData] = tryFlatten(() => parseCloudObjectOutput(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":";;;;;AAEgB,SAAA,uBAAuB,SAAiB,MAAwB;AAC9E,SAAO,YAAY,IAAI,MAAM,OAAO,GAAG;AAAA,IACrC,SAAS;AAAA,IACT,QAAQ;AAAA,EAAA,CACT;AACH;ACHsB,eAAA,mBACpB,IACA,WACkC;AAC9B,MAAA;AACI,UAAA,OAAO,MAAM,GAAG;AAEf,WAAA;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,WACO,KAAK;AACN,UAAA,OAAO,eAAe,GAA6D;AAElF,WAAA;AAAA,MACL;AAAA;AAAA,MAEA,MAAM;AAAA,MACN,SAAS,KAAK,WAAW;AAAA,MACzB,QAAQ,KAAK,UAAU,KAAK,WAAW;AAAA,IACzC;AAAA,EAAA;AAEJ;AC0CO,SAAS,8BAA8B,SAA0C;AACtF,QAAM,eAAe,eAAe,WAAW,IAAI;AAAA,IACjD,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,EAAA,CACrB;AAGD,QAAM,0BAAmD,CAAC,MAAM,MAAM,SAAS;AAE7E,UAAM,gBAAiB,WAAW,IAAI,IAAI,OAAO;AAEjD,UAAM,gBAAgB,eAAe,iBAAiB,IAAI;AAAA,MACxD,cAAc;AAAA,IAAA,CACf;AAED,WAAO,eAAgB,OAAO;AAErB,aAAA,MAAM,mBAAmB,YAAY;;AAE1C,cAAM,OAAO,MAAM,gBAAgB,MAAM,mCAAS,gBAAgB;AAClE,cAAM,SAAmC;AAAA,UACvC,SAAS;AAAA,UACT;AAAA,QACF;AACA,cAAM,UAAU,OAAO,OAAO,MAAM,MAAM;AAE1C,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;AAKrB,cAAA,SAAS,KAAK,UAAU,KAAK;AAE/B,YAAA,CAAC,OAAO,SAAS;AACX,kBAAA,IAAI,OAAO,MAAM,MAAM;AAE/B,gBAAM,UAAS,kBAAO,UAAP,mBAAc,WAAd,mBAAuB;AAGtC,eAAI,iCAAQ,UAAS,SAAU,OAAM,OAAO;AACtC,gBAAA,IAAI,MAAM,SAAS;AAAA,QAAA;AAG3B,eAAO,MAAM,KAAK,SAAS,OAAO,IAAI;AAAA,MAAA,GACrC,KAAK,sBAAsB;AAAA,IAChC;AAAA,EACF;AAEO,SAAA;AACT;AAEA,eAAe,gBACb,YACA,kBACuC;AACvC,QAAM,aAA2C;AAAA,IAC/C,IAAI;AAAA,IACJ,MAAM,CAAC;AAAA,IACP,YAAY,CAAC;AAAA,IACb,SAAS;AAAA,EACX;AAEI,MAAA,CAAC,iBAAyB,QAAA;AAExB,QAAA,QAAQ,iBAAiB,eAAe;AAAA,IAC5C,YAAY,WAAW,cAAc;AAAA,EAAA,CACtC;AAGD,QAAM,CAAC,MAAM,IAAI,IAAI,MAAM,WAAW,MAAM,WAAW,WAAW,cAAmB,KAAA,EAAE,CAAC;AACpF,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;"}