@cloudcome/utils-uni 1.33.0 → 1.35.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.
Files changed (43) hide show
  1. package/README.md +71 -72
  2. package/dist/_helpers.cjs.map +1 -1
  3. package/dist/_helpers.mjs.map +1 -1
  4. package/dist/{app.d.ts → client/app.d.ts} +13 -0
  5. package/dist/client/async.d.ts +25 -0
  6. package/dist/client/message.d.ts +35 -0
  7. package/dist/client/request.d.ts +128 -0
  8. package/dist/client/ui.d.ts +26 -0
  9. package/dist/client.cjs +376 -1
  10. package/dist/client.cjs.map +1 -1
  11. package/dist/client.d.ts +6 -127
  12. package/dist/client.mjs +363 -2
  13. package/dist/client.mjs.map +1 -1
  14. package/dist/cloud/types.d.ts +2 -2
  15. package/dist/cloud.cjs +1 -1
  16. package/dist/cloud.cjs.map +1 -1
  17. package/dist/cloud.mjs +1 -1
  18. package/dist/cloud.mjs.map +1 -1
  19. package/dist/database/_db.class.d.ts +5 -4
  20. package/dist/database/types.d.ts +1 -1
  21. package/dist/database.cjs +41 -31
  22. package/dist/database.cjs.map +1 -1
  23. package/dist/database.mjs +41 -31
  24. package/dist/database.mjs.map +1 -1
  25. package/dist/index.cjs +1 -1
  26. package/dist/index.mjs +1 -1
  27. package/dist/weixin/notice.d.ts +79 -0
  28. package/dist/weixin/token.d.ts +49 -0
  29. package/dist/weixin.cjs +132 -0
  30. package/dist/weixin.cjs.map +1 -0
  31. package/dist/weixin.d.ts +2 -0
  32. package/dist/weixin.mjs +130 -0
  33. package/dist/weixin.mjs.map +1 -0
  34. package/package.json +14 -22
  35. package/dist/app.cjs +0 -44
  36. package/dist/app.cjs.map +0 -1
  37. package/dist/app.mjs +0 -43
  38. package/dist/app.mjs.map +0 -1
  39. package/dist/page.cjs +0 -108
  40. package/dist/page.cjs.map +0 -1
  41. package/dist/page.mjs +0 -105
  42. package/dist/page.mjs.map +0 -1
  43. /package/dist/{page.d.ts → client/page.d.ts} +0 -0
@@ -0,0 +1,132 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_cloud = require("./cloud.cjs");
3
+ let _cloudcome_utils_core_object = require("@cloudcome/utils-core/object");
4
+ let _cloudcome_utils_core_try = require("@cloudcome/utils-core/try");
5
+ //#region src/weixin/token.ts
6
+ /**
7
+ * 构建微信 access_token 获取服务。
8
+ *
9
+ * 自动处理缓存逻辑:优先从临时数据中获取,不存在时调用微信 API 获取并缓存。
10
+ *
11
+ * @param options - 构造选项
12
+ * @returns 获取 access_token 的异步函数
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const getAccessToken = await buildWeixinAccessTokenService({
17
+ * appId: 'wx123',
18
+ * appSecret: 'secret',
19
+ * getTempDataService: () => kv.get('token'),
20
+ * setTempDataService: (token, ttl) => kv.set('token', token, ttl),
21
+ * })
22
+ * const token = await getAccessToken()
23
+ * ```
24
+ */
25
+ async function buildWeixinAccessTokenService(options) {
26
+ const { appId, appSecret, _mockRequest, getTempDataService, setTempDataService } = options;
27
+ return async function getWeixinAccessTokenService() {
28
+ let accessToken = await getTempDataService();
29
+ if (accessToken) return accessToken;
30
+ const { data: accessInfo } = await (_mockRequest || require_cloud.request)({
31
+ url: "https://api.weixin.qq.com/cgi-bin/token",
32
+ method: "GET",
33
+ query: {
34
+ grant_type: "client_credential",
35
+ appid: appId,
36
+ secret: appSecret
37
+ }
38
+ });
39
+ if (!accessInfo.access_token) throw new Error(accessInfo.errmsg || "获取 access_token 失败");
40
+ accessToken = accessInfo.access_token;
41
+ const [err] = await (0, _cloudcome_utils_core_try.tryFlatten)(setTempDataService(accessToken, accessInfo.expires_in * 1e3));
42
+ if (err) console.error("设置临时数据失败", err);
43
+ return accessToken;
44
+ };
45
+ }
46
+ //#endregion
47
+ //#region src/weixin/notice.ts
48
+ /**
49
+ * 构建微信订阅消息发送服务。
50
+ *
51
+ * 封装微信订阅消息发送逻辑,自动处理 access_token 获取、openId 查找、
52
+ * 字段长度截断(thing 类型 20 字符,character_string 类型 32 字符)等。
53
+ *
54
+ * @template T - payload 字段类型
55
+ * @param options - 构造选项
56
+ * @returns 发送订阅消息的函数
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * const sendNotice = buildSendWeixinNoticeService({
61
+ * templateId: 'tmpl_abc123',
62
+ * getWeixinAccessTokenService: getAccessToken,
63
+ * getUserWeixinOpenId: async (userId) => {
64
+ * const user = await db.collection('users').doc(userId).get()
65
+ * return user.data?.openId
66
+ * },
67
+ * })
68
+ *
69
+ * await sendNotice({
70
+ * userId: 'user-123',
71
+ * clientEnv: 'release',
72
+ * payload: { thing1: '订单已发货', number1: 12345 },
73
+ * page: '/pages/order/detail?id=12345',
74
+ * })
75
+ * ```
76
+ */
77
+ function buildSendWeixinNoticeService(options) {
78
+ const { templateId, getWeixinAccessTokenService, getUserWeixinOpenId, _mockRequest } = options;
79
+ return async function sendWeixinNoticeService(sendData) {
80
+ const { userId, page, payload } = sendData;
81
+ const wxOpenId = await getUserWeixinOpenId(userId);
82
+ if (!wxOpenId) throw new Error("用户未绑定微信");
83
+ const accessToken = await getWeixinAccessTokenService();
84
+ const { data } = await (_mockRequest || require_cloud.request)({
85
+ url: `https://api.weixin.qq.com/cgi-bin/message/subscribe/send`,
86
+ method: "POST",
87
+ query: { access_token: accessToken },
88
+ data: {
89
+ touser: wxOpenId,
90
+ template_id: templateId,
91
+ page: page.replace(/^\//, ""),
92
+ miniprogram_state: sendData.clientEnv === "trial" ? "trial" : "formal",
93
+ lang: "zh_CN",
94
+ data: (0, _cloudcome_utils_core_object.objectMap)(payload, (val, key) => ({ value: _fixPayloadValue(key, val) }))
95
+ }
96
+ });
97
+ if (data.errcode === 43101) return;
98
+ if (data.errcode !== 0) throw new Error(data.errmsg || "发送失败,未知错误");
99
+ };
100
+ }
101
+ /**
102
+ * 修复通知 payload 字段值,根据微信模板字段类型自动截断。
103
+ *
104
+ * 截断规则:
105
+ * - thing 类型:20 字符以内
106
+ * - character_string 类型:32 字符以内
107
+ * - 其他类型:不处理
108
+ *
109
+ * @param key - 模板字段 key(如 thing1, number1)
110
+ * @param val - 字段值
111
+ * @returns 修复后的值
112
+ */
113
+ function _fixPayloadValue(key, val) {
114
+ if (key.startsWith("thing")) return _autoEllipsis(val.toString(), 20);
115
+ if (key.startsWith("character_string")) return _autoEllipsis(val.toString(), 32);
116
+ return val;
117
+ }
118
+ /**
119
+ * 字符串超长时自动截断并添加省略号。
120
+ *
121
+ * @param val - 原始字符串
122
+ * @param len - 最大长度
123
+ * @returns 截断后的字符串
124
+ */
125
+ function _autoEllipsis(val, len) {
126
+ return val.length > len ? `${val.slice(0, len - 3)}...` : val;
127
+ }
128
+ //#endregion
129
+ exports.buildSendWeixinNoticeService = buildSendWeixinNoticeService;
130
+ exports.buildWeixinAccessTokenService = buildWeixinAccessTokenService;
131
+
132
+ //# sourceMappingURL=weixin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weixin.cjs","names":[],"sources":["../src/weixin/token.ts","../src/weixin/notice.ts"],"sourcesContent":["import { tryFlatten } from '@cloudcome/utils-core/try';\nimport { request } from '../cloud';\n\n/**\n * 构建微信 access_token 获取服务的选项\n */\nexport type BuildWeixinAccessTokenServiceOptions = {\n /**\n * 微信小程序应用ID\n */\n appId: string;\n\n /**\n * 微信小程序应用密钥\n */\n appSecret: string;\n\n /**\n * 获取临时数据(用于缓存 access_token)\n * @returns 缓存的 access_token,无缓存时返回空字符串\n */\n getTempDataService: () => Promise<string>;\n\n /**\n * 设置临时数据(用于缓存 access_token)\n * @param accessToken access_token 值\n * @param expiresIn 过期时间,单位毫秒\n */\n setTempDataService: (accessToken: string, expiresIn: number) => Promise<void>;\n\n /**\n * 模拟请求函数,用于单元测试注入\n */\n _mockRequest?: typeof request;\n};\n\n/**\n * 构建微信 access_token 获取服务。\n *\n * 自动处理缓存逻辑:优先从临时数据中获取,不存在时调用微信 API 获取并缓存。\n *\n * @param options - 构造选项\n * @returns 获取 access_token 的异步函数\n *\n * @example\n * ```ts\n * const getAccessToken = await buildWeixinAccessTokenService({\n * appId: 'wx123',\n * appSecret: 'secret',\n * getTempDataService: () => kv.get('token'),\n * setTempDataService: (token, ttl) => kv.set('token', token, ttl),\n * })\n * const token = await getAccessToken()\n * ```\n */\nexport async function buildWeixinAccessTokenService(options: BuildWeixinAccessTokenServiceOptions) {\n const { appId, appSecret, _mockRequest, getTempDataService, setTempDataService } = options;\n\n return async function getWeixinAccessTokenService() {\n let accessToken = await getTempDataService();\n if (accessToken) return accessToken;\n\n const { data: accessInfo } = await (_mockRequest || request)<{\n access_token: string;\n expires_in: number;\n errmsg: string;\n errcode: number;\n }>({\n url: 'https://api.weixin.qq.com/cgi-bin/token',\n method: 'GET',\n query: {\n grant_type: 'client_credential',\n appid: appId,\n secret: appSecret,\n },\n });\n\n if (!accessInfo.access_token) throw new Error(accessInfo.errmsg || '获取 access_token 失败');\n accessToken = accessInfo.access_token;\n\n const [err] = await tryFlatten(setTempDataService(accessToken, accessInfo.expires_in * 1000));\n if (err) console.error('设置临时数据失败', err);\n\n return accessToken;\n };\n}\n","import { request } from '@/cloud';\nimport { objectMap } from '@cloudcome/utils-core/object';\n\n/**\n * 发送微信订阅消息的数据结构\n * @template T - payload 字段类型,key 为模板字段名,value 为 string | number\n */\nexport type SendData<T> = {\n /**\n * 用户ID,用于查找对应的微信 openId\n */\n userId: string;\n\n /**\n * 小程序环境\n * - `develop`: 开发版\n * - `trial`: 体验版\n * - `release`: 正式版\n */\n clientEnv: 'develop' | 'trial' | 'release';\n\n /**\n * 通知数据,key 对应模板字段(如 thing1, number1)\n */\n payload: T;\n\n /**\n * 点击消息后跳转的页面路径,开头 `/` 会被自动移除\n */\n page: string;\n};\n\n/**\n * 构建微信订阅消息发送服务的选项\n */\nexport type BuildSendWeixinNoticeServiceOptions = {\n /**\n * 订阅消息模板ID\n */\n templateId: string;\n\n /**\n * 获取微信 access_token 的服务函数\n */\n getWeixinAccessTokenService: () => Promise<string>;\n\n /**\n * 根据用户ID获取微信 openId\n * @param userId - 用户ID\n * @returns 微信 openId,未绑定时返回空字符串\n */\n getUserWeixinOpenId: (userId: string) => Promise<string>;\n\n /**\n * 模拟请求函数,用于单元测试注入\n */\n _mockRequest?: typeof request;\n};\n\n/**\n * 构建微信订阅消息发送服务。\n *\n * 封装微信订阅消息发送逻辑,自动处理 access_token 获取、openId 查找、\n * 字段长度截断(thing 类型 20 字符,character_string 类型 32 字符)等。\n *\n * @template T - payload 字段类型\n * @param options - 构造选项\n * @returns 发送订阅消息的函数\n *\n * @example\n * ```ts\n * const sendNotice = buildSendWeixinNoticeService({\n * templateId: 'tmpl_abc123',\n * getWeixinAccessTokenService: getAccessToken,\n * getUserWeixinOpenId: async (userId) => {\n * const user = await db.collection('users').doc(userId).get()\n * return user.data?.openId\n * },\n * })\n *\n * await sendNotice({\n * userId: 'user-123',\n * clientEnv: 'release',\n * payload: { thing1: '订单已发货', number1: 12345 },\n * page: '/pages/order/detail?id=12345',\n * })\n * ```\n */\nexport function buildSendWeixinNoticeService<T extends Record<string, number | string>>(\n options: BuildSendWeixinNoticeServiceOptions,\n) {\n const { templateId, getWeixinAccessTokenService, getUserWeixinOpenId, _mockRequest } = options;\n\n return async function sendWeixinNoticeService(sendData: SendData<T>) {\n const { userId, page, payload } = sendData;\n const wxOpenId = await getUserWeixinOpenId(userId);\n if (!wxOpenId) throw new Error('用户未绑定微信');\n\n const accessToken = await getWeixinAccessTokenService();\n const { data } = await (_mockRequest || request)<{\n errcode: number;\n errmsg: string;\n }>({\n url: `https://api.weixin.qq.com/cgi-bin/message/subscribe/send`,\n method: 'POST',\n query: {\n access_token: accessToken,\n },\n data: {\n touser: wxOpenId,\n template_id: templateId,\n page: page.replace(/^\\//, ''),\n miniprogram_state: sendData.clientEnv === 'trial' ? 'trial' : 'formal',\n lang: 'zh_CN',\n data: objectMap(payload, (val, key) => ({\n value: _fixPayloadValue(key as string, val),\n })),\n },\n });\n\n if (data.errcode === 43101) return;\n\n if (data.errcode !== 0) throw new Error(data.errmsg || '发送失败,未知错误');\n };\n}\n\n/**\n * 修复通知 payload 字段值,根据微信模板字段类型自动截断。\n *\n * 截断规则:\n * - thing 类型:20 字符以内\n * - character_string 类型:32 字符以内\n * - 其他类型:不处理\n *\n * @param key - 模板字段 key(如 thing1, number1)\n * @param val - 字段值\n * @returns 修复后的值\n */\nfunction _fixPayloadValue(key: string, val: number | string) {\n if (key.startsWith('thing')) return _autoEllipsis(val.toString(), 20);\n if (key.startsWith('character_string')) return _autoEllipsis(val.toString(), 32);\n return val;\n}\n\n/**\n * 字符串超长时自动截断并添加省略号。\n *\n * @param val - 原始字符串\n * @param len - 最大长度\n * @returns 截断后的字符串\n */\nfunction _autoEllipsis(val: string, len: number) {\n return val.length > len ? `${val.slice(0, len - 3)}...` : val;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAuDA,eAAsB,8BAA8B,SAA+C;CACjG,MAAM,EAAE,OAAO,WAAW,cAAc,oBAAoB,uBAAuB;CAEnF,OAAO,eAAe,8BAA8B;EAClD,IAAI,cAAc,MAAM,oBAAoB;EAC5C,IAAI,aAAa,OAAO;EAExB,MAAM,EAAE,MAAM,eAAe,OAAO,gBAAgB,cAAA,SAKjD;GACD,KAAK;GACL,QAAQ;GACR,OAAO;IACL,YAAY;IACZ,OAAO;IACP,QAAQ;IACT;GACF,CAAC;EAEF,IAAI,CAAC,WAAW,cAAc,MAAM,IAAI,MAAM,WAAW,UAAU,qBAAqB;EACxF,cAAc,WAAW;EAEzB,MAAM,CAAC,OAAO,OAAA,GAAA,0BAAA,YAAiB,mBAAmB,aAAa,WAAW,aAAa,IAAK,CAAC;EAC7F,IAAI,KAAK,QAAQ,MAAM,YAAY,IAAI;EAEvC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACKX,SAAgB,6BACd,SACA;CACA,MAAM,EAAE,YAAY,6BAA6B,qBAAqB,iBAAiB;CAEvF,OAAO,eAAe,wBAAwB,UAAuB;EACnE,MAAM,EAAE,QAAQ,MAAM,YAAY;EAClC,MAAM,WAAW,MAAM,oBAAoB,OAAO;EAClD,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,UAAU;EAEzC,MAAM,cAAc,MAAM,6BAA6B;EACvD,MAAM,EAAE,SAAS,OAAO,gBAAgB,cAAA,SAGrC;GACD,KAAK;GACL,QAAQ;GACR,OAAO,EACL,cAAc,aACf;GACD,MAAM;IACJ,QAAQ;IACR,aAAa;IACb,MAAM,KAAK,QAAQ,OAAO,GAAG;IAC7B,mBAAmB,SAAS,cAAc,UAAU,UAAU;IAC9D,MAAM;IACN,OAAA,GAAA,6BAAA,WAAgB,UAAU,KAAK,SAAS,EACtC,OAAO,iBAAiB,KAAe,IAAI,EAC5C,EAAE;IACJ;GACF,CAAC;EAEF,IAAI,KAAK,YAAY,OAAO;EAE5B,IAAI,KAAK,YAAY,GAAG,MAAM,IAAI,MAAM,KAAK,UAAU,YAAY;;;;;;;;;;;;;;;AAgBvE,SAAS,iBAAiB,KAAa,KAAsB;CAC3D,IAAI,IAAI,WAAW,QAAQ,EAAE,OAAO,cAAc,IAAI,UAAU,EAAE,GAAG;CACrE,IAAI,IAAI,WAAW,mBAAmB,EAAE,OAAO,cAAc,IAAI,UAAU,EAAE,GAAG;CAChF,OAAO;;;;;;;;;AAUT,SAAS,cAAc,KAAa,KAAa;CAC/C,OAAO,IAAI,SAAS,MAAM,GAAG,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO"}
@@ -0,0 +1,2 @@
1
+ export * from './weixin/token';
2
+ export * from './weixin/notice';
@@ -0,0 +1,130 @@
1
+ import { request } from "./cloud.mjs";
2
+ import { objectMap } from "@cloudcome/utils-core/object";
3
+ import { tryFlatten } from "@cloudcome/utils-core/try";
4
+ //#region src/weixin/token.ts
5
+ /**
6
+ * 构建微信 access_token 获取服务。
7
+ *
8
+ * 自动处理缓存逻辑:优先从临时数据中获取,不存在时调用微信 API 获取并缓存。
9
+ *
10
+ * @param options - 构造选项
11
+ * @returns 获取 access_token 的异步函数
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const getAccessToken = await buildWeixinAccessTokenService({
16
+ * appId: 'wx123',
17
+ * appSecret: 'secret',
18
+ * getTempDataService: () => kv.get('token'),
19
+ * setTempDataService: (token, ttl) => kv.set('token', token, ttl),
20
+ * })
21
+ * const token = await getAccessToken()
22
+ * ```
23
+ */
24
+ async function buildWeixinAccessTokenService(options) {
25
+ const { appId, appSecret, _mockRequest, getTempDataService, setTempDataService } = options;
26
+ return async function getWeixinAccessTokenService() {
27
+ let accessToken = await getTempDataService();
28
+ if (accessToken) return accessToken;
29
+ const { data: accessInfo } = await (_mockRequest || request)({
30
+ url: "https://api.weixin.qq.com/cgi-bin/token",
31
+ method: "GET",
32
+ query: {
33
+ grant_type: "client_credential",
34
+ appid: appId,
35
+ secret: appSecret
36
+ }
37
+ });
38
+ if (!accessInfo.access_token) throw new Error(accessInfo.errmsg || "获取 access_token 失败");
39
+ accessToken = accessInfo.access_token;
40
+ const [err] = await tryFlatten(setTempDataService(accessToken, accessInfo.expires_in * 1e3));
41
+ if (err) console.error("设置临时数据失败", err);
42
+ return accessToken;
43
+ };
44
+ }
45
+ //#endregion
46
+ //#region src/weixin/notice.ts
47
+ /**
48
+ * 构建微信订阅消息发送服务。
49
+ *
50
+ * 封装微信订阅消息发送逻辑,自动处理 access_token 获取、openId 查找、
51
+ * 字段长度截断(thing 类型 20 字符,character_string 类型 32 字符)等。
52
+ *
53
+ * @template T - payload 字段类型
54
+ * @param options - 构造选项
55
+ * @returns 发送订阅消息的函数
56
+ *
57
+ * @example
58
+ * ```ts
59
+ * const sendNotice = buildSendWeixinNoticeService({
60
+ * templateId: 'tmpl_abc123',
61
+ * getWeixinAccessTokenService: getAccessToken,
62
+ * getUserWeixinOpenId: async (userId) => {
63
+ * const user = await db.collection('users').doc(userId).get()
64
+ * return user.data?.openId
65
+ * },
66
+ * })
67
+ *
68
+ * await sendNotice({
69
+ * userId: 'user-123',
70
+ * clientEnv: 'release',
71
+ * payload: { thing1: '订单已发货', number1: 12345 },
72
+ * page: '/pages/order/detail?id=12345',
73
+ * })
74
+ * ```
75
+ */
76
+ function buildSendWeixinNoticeService(options) {
77
+ const { templateId, getWeixinAccessTokenService, getUserWeixinOpenId, _mockRequest } = options;
78
+ return async function sendWeixinNoticeService(sendData) {
79
+ const { userId, page, payload } = sendData;
80
+ const wxOpenId = await getUserWeixinOpenId(userId);
81
+ if (!wxOpenId) throw new Error("用户未绑定微信");
82
+ const accessToken = await getWeixinAccessTokenService();
83
+ const { data } = await (_mockRequest || request)({
84
+ url: `https://api.weixin.qq.com/cgi-bin/message/subscribe/send`,
85
+ method: "POST",
86
+ query: { access_token: accessToken },
87
+ data: {
88
+ touser: wxOpenId,
89
+ template_id: templateId,
90
+ page: page.replace(/^\//, ""),
91
+ miniprogram_state: sendData.clientEnv === "trial" ? "trial" : "formal",
92
+ lang: "zh_CN",
93
+ data: objectMap(payload, (val, key) => ({ value: _fixPayloadValue(key, val) }))
94
+ }
95
+ });
96
+ if (data.errcode === 43101) return;
97
+ if (data.errcode !== 0) throw new Error(data.errmsg || "发送失败,未知错误");
98
+ };
99
+ }
100
+ /**
101
+ * 修复通知 payload 字段值,根据微信模板字段类型自动截断。
102
+ *
103
+ * 截断规则:
104
+ * - thing 类型:20 字符以内
105
+ * - character_string 类型:32 字符以内
106
+ * - 其他类型:不处理
107
+ *
108
+ * @param key - 模板字段 key(如 thing1, number1)
109
+ * @param val - 字段值
110
+ * @returns 修复后的值
111
+ */
112
+ function _fixPayloadValue(key, val) {
113
+ if (key.startsWith("thing")) return _autoEllipsis(val.toString(), 20);
114
+ if (key.startsWith("character_string")) return _autoEllipsis(val.toString(), 32);
115
+ return val;
116
+ }
117
+ /**
118
+ * 字符串超长时自动截断并添加省略号。
119
+ *
120
+ * @param val - 原始字符串
121
+ * @param len - 最大长度
122
+ * @returns 截断后的字符串
123
+ */
124
+ function _autoEllipsis(val, len) {
125
+ return val.length > len ? `${val.slice(0, len - 3)}...` : val;
126
+ }
127
+ //#endregion
128
+ export { buildSendWeixinNoticeService, buildWeixinAccessTokenService };
129
+
130
+ //# sourceMappingURL=weixin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weixin.mjs","names":[],"sources":["../src/weixin/token.ts","../src/weixin/notice.ts"],"sourcesContent":["import { tryFlatten } from '@cloudcome/utils-core/try';\nimport { request } from '../cloud';\n\n/**\n * 构建微信 access_token 获取服务的选项\n */\nexport type BuildWeixinAccessTokenServiceOptions = {\n /**\n * 微信小程序应用ID\n */\n appId: string;\n\n /**\n * 微信小程序应用密钥\n */\n appSecret: string;\n\n /**\n * 获取临时数据(用于缓存 access_token)\n * @returns 缓存的 access_token,无缓存时返回空字符串\n */\n getTempDataService: () => Promise<string>;\n\n /**\n * 设置临时数据(用于缓存 access_token)\n * @param accessToken access_token 值\n * @param expiresIn 过期时间,单位毫秒\n */\n setTempDataService: (accessToken: string, expiresIn: number) => Promise<void>;\n\n /**\n * 模拟请求函数,用于单元测试注入\n */\n _mockRequest?: typeof request;\n};\n\n/**\n * 构建微信 access_token 获取服务。\n *\n * 自动处理缓存逻辑:优先从临时数据中获取,不存在时调用微信 API 获取并缓存。\n *\n * @param options - 构造选项\n * @returns 获取 access_token 的异步函数\n *\n * @example\n * ```ts\n * const getAccessToken = await buildWeixinAccessTokenService({\n * appId: 'wx123',\n * appSecret: 'secret',\n * getTempDataService: () => kv.get('token'),\n * setTempDataService: (token, ttl) => kv.set('token', token, ttl),\n * })\n * const token = await getAccessToken()\n * ```\n */\nexport async function buildWeixinAccessTokenService(options: BuildWeixinAccessTokenServiceOptions) {\n const { appId, appSecret, _mockRequest, getTempDataService, setTempDataService } = options;\n\n return async function getWeixinAccessTokenService() {\n let accessToken = await getTempDataService();\n if (accessToken) return accessToken;\n\n const { data: accessInfo } = await (_mockRequest || request)<{\n access_token: string;\n expires_in: number;\n errmsg: string;\n errcode: number;\n }>({\n url: 'https://api.weixin.qq.com/cgi-bin/token',\n method: 'GET',\n query: {\n grant_type: 'client_credential',\n appid: appId,\n secret: appSecret,\n },\n });\n\n if (!accessInfo.access_token) throw new Error(accessInfo.errmsg || '获取 access_token 失败');\n accessToken = accessInfo.access_token;\n\n const [err] = await tryFlatten(setTempDataService(accessToken, accessInfo.expires_in * 1000));\n if (err) console.error('设置临时数据失败', err);\n\n return accessToken;\n };\n}\n","import { request } from '@/cloud';\nimport { objectMap } from '@cloudcome/utils-core/object';\n\n/**\n * 发送微信订阅消息的数据结构\n * @template T - payload 字段类型,key 为模板字段名,value 为 string | number\n */\nexport type SendData<T> = {\n /**\n * 用户ID,用于查找对应的微信 openId\n */\n userId: string;\n\n /**\n * 小程序环境\n * - `develop`: 开发版\n * - `trial`: 体验版\n * - `release`: 正式版\n */\n clientEnv: 'develop' | 'trial' | 'release';\n\n /**\n * 通知数据,key 对应模板字段(如 thing1, number1)\n */\n payload: T;\n\n /**\n * 点击消息后跳转的页面路径,开头 `/` 会被自动移除\n */\n page: string;\n};\n\n/**\n * 构建微信订阅消息发送服务的选项\n */\nexport type BuildSendWeixinNoticeServiceOptions = {\n /**\n * 订阅消息模板ID\n */\n templateId: string;\n\n /**\n * 获取微信 access_token 的服务函数\n */\n getWeixinAccessTokenService: () => Promise<string>;\n\n /**\n * 根据用户ID获取微信 openId\n * @param userId - 用户ID\n * @returns 微信 openId,未绑定时返回空字符串\n */\n getUserWeixinOpenId: (userId: string) => Promise<string>;\n\n /**\n * 模拟请求函数,用于单元测试注入\n */\n _mockRequest?: typeof request;\n};\n\n/**\n * 构建微信订阅消息发送服务。\n *\n * 封装微信订阅消息发送逻辑,自动处理 access_token 获取、openId 查找、\n * 字段长度截断(thing 类型 20 字符,character_string 类型 32 字符)等。\n *\n * @template T - payload 字段类型\n * @param options - 构造选项\n * @returns 发送订阅消息的函数\n *\n * @example\n * ```ts\n * const sendNotice = buildSendWeixinNoticeService({\n * templateId: 'tmpl_abc123',\n * getWeixinAccessTokenService: getAccessToken,\n * getUserWeixinOpenId: async (userId) => {\n * const user = await db.collection('users').doc(userId).get()\n * return user.data?.openId\n * },\n * })\n *\n * await sendNotice({\n * userId: 'user-123',\n * clientEnv: 'release',\n * payload: { thing1: '订单已发货', number1: 12345 },\n * page: '/pages/order/detail?id=12345',\n * })\n * ```\n */\nexport function buildSendWeixinNoticeService<T extends Record<string, number | string>>(\n options: BuildSendWeixinNoticeServiceOptions,\n) {\n const { templateId, getWeixinAccessTokenService, getUserWeixinOpenId, _mockRequest } = options;\n\n return async function sendWeixinNoticeService(sendData: SendData<T>) {\n const { userId, page, payload } = sendData;\n const wxOpenId = await getUserWeixinOpenId(userId);\n if (!wxOpenId) throw new Error('用户未绑定微信');\n\n const accessToken = await getWeixinAccessTokenService();\n const { data } = await (_mockRequest || request)<{\n errcode: number;\n errmsg: string;\n }>({\n url: `https://api.weixin.qq.com/cgi-bin/message/subscribe/send`,\n method: 'POST',\n query: {\n access_token: accessToken,\n },\n data: {\n touser: wxOpenId,\n template_id: templateId,\n page: page.replace(/^\\//, ''),\n miniprogram_state: sendData.clientEnv === 'trial' ? 'trial' : 'formal',\n lang: 'zh_CN',\n data: objectMap(payload, (val, key) => ({\n value: _fixPayloadValue(key as string, val),\n })),\n },\n });\n\n if (data.errcode === 43101) return;\n\n if (data.errcode !== 0) throw new Error(data.errmsg || '发送失败,未知错误');\n };\n}\n\n/**\n * 修复通知 payload 字段值,根据微信模板字段类型自动截断。\n *\n * 截断规则:\n * - thing 类型:20 字符以内\n * - character_string 类型:32 字符以内\n * - 其他类型:不处理\n *\n * @param key - 模板字段 key(如 thing1, number1)\n * @param val - 字段值\n * @returns 修复后的值\n */\nfunction _fixPayloadValue(key: string, val: number | string) {\n if (key.startsWith('thing')) return _autoEllipsis(val.toString(), 20);\n if (key.startsWith('character_string')) return _autoEllipsis(val.toString(), 32);\n return val;\n}\n\n/**\n * 字符串超长时自动截断并添加省略号。\n *\n * @param val - 原始字符串\n * @param len - 最大长度\n * @returns 截断后的字符串\n */\nfunction _autoEllipsis(val: string, len: number) {\n return val.length > len ? `${val.slice(0, len - 3)}...` : val;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAuDA,eAAsB,8BAA8B,SAA+C;CACjG,MAAM,EAAE,OAAO,WAAW,cAAc,oBAAoB,uBAAuB;CAEnF,OAAO,eAAe,8BAA8B;EAClD,IAAI,cAAc,MAAM,oBAAoB;EAC5C,IAAI,aAAa,OAAO;EAExB,MAAM,EAAE,MAAM,eAAe,OAAO,gBAAgB,SAKjD;GACD,KAAK;GACL,QAAQ;GACR,OAAO;IACL,YAAY;IACZ,OAAO;IACP,QAAQ;IACT;GACF,CAAC;EAEF,IAAI,CAAC,WAAW,cAAc,MAAM,IAAI,MAAM,WAAW,UAAU,qBAAqB;EACxF,cAAc,WAAW;EAEzB,MAAM,CAAC,OAAO,MAAM,WAAW,mBAAmB,aAAa,WAAW,aAAa,IAAK,CAAC;EAC7F,IAAI,KAAK,QAAQ,MAAM,YAAY,IAAI;EAEvC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACKX,SAAgB,6BACd,SACA;CACA,MAAM,EAAE,YAAY,6BAA6B,qBAAqB,iBAAiB;CAEvF,OAAO,eAAe,wBAAwB,UAAuB;EACnE,MAAM,EAAE,QAAQ,MAAM,YAAY;EAClC,MAAM,WAAW,MAAM,oBAAoB,OAAO;EAClD,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,UAAU;EAEzC,MAAM,cAAc,MAAM,6BAA6B;EACvD,MAAM,EAAE,SAAS,OAAO,gBAAgB,SAGrC;GACD,KAAK;GACL,QAAQ;GACR,OAAO,EACL,cAAc,aACf;GACD,MAAM;IACJ,QAAQ;IACR,aAAa;IACb,MAAM,KAAK,QAAQ,OAAO,GAAG;IAC7B,mBAAmB,SAAS,cAAc,UAAU,UAAU;IAC9D,MAAM;IACN,MAAM,UAAU,UAAU,KAAK,SAAS,EACtC,OAAO,iBAAiB,KAAe,IAAI,EAC5C,EAAE;IACJ;GACF,CAAC;EAEF,IAAI,KAAK,YAAY,OAAO;EAE5B,IAAI,KAAK,YAAY,GAAG,MAAM,IAAI,MAAM,KAAK,UAAU,YAAY;;;;;;;;;;;;;;;AAgBvE,SAAS,iBAAiB,KAAa,KAAsB;CAC3D,IAAI,IAAI,WAAW,QAAQ,EAAE,OAAO,cAAc,IAAI,UAAU,EAAE,GAAG;CACrE,IAAI,IAAI,WAAW,mBAAmB,EAAE,OAAO,cAAc,IAAI,UAAU,EAAE,GAAG;CAChF,OAAO;;;;;;;;;AAUT,SAAS,cAAc,KAAa,KAAa;CAC/C,OAAO,IAAI,SAAS,MAAM,GAAG,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO"}
package/package.json CHANGED
@@ -1,15 +1,12 @@
1
1
  {
2
2
  "name": "@cloudcome/utils-uni",
3
- "version": "1.33.0",
3
+ "version": "1.35.0",
4
4
  "description": "cloudcome utils for uni-app",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
8
8
  "typesVersions": {
9
9
  "*": {
10
- "app": [
11
- "./dist/app.d.ts"
12
- ],
13
10
  "client": [
14
11
  "./dist/client.d.ts"
15
12
  ],
@@ -19,8 +16,8 @@
19
16
  "database": [
20
17
  "./dist/database.d.ts"
21
18
  ],
22
- "page": [
23
- "./dist/page.d.ts"
19
+ "weixin": [
20
+ "./dist/weixin.d.ts"
24
21
  ]
25
22
  }
26
23
  },
@@ -32,11 +29,6 @@
32
29
  "require": "./dist/index.cjs"
33
30
  },
34
31
  "./package.json": "./package.json",
35
- "./app": {
36
- "types": "./dist/app.d.ts",
37
- "import": "./dist/app.mjs",
38
- "require": "./dist/app.cjs"
39
- },
40
32
  "./client": {
41
33
  "types": "./dist/client.d.ts",
42
34
  "import": "./dist/client.mjs",
@@ -52,10 +44,10 @@
52
44
  "import": "./dist/database.mjs",
53
45
  "require": "./dist/database.cjs"
54
46
  },
55
- "./page": {
56
- "types": "./dist/page.d.ts",
57
- "import": "./dist/page.mjs",
58
- "require": "./dist/page.cjs"
47
+ "./weixin": {
48
+ "types": "./dist/weixin.d.ts",
49
+ "import": "./dist/weixin.mjs",
50
+ "require": "./dist/weixin.cjs"
59
51
  }
60
52
  },
61
53
  "files": [
@@ -65,24 +57,24 @@
65
57
  "node": ">=22"
66
58
  },
67
59
  "dependencies": {
68
- "@cloudcome/utils-core": "~1.20.0",
69
- "@cloudcome/utils-vue": "~1.13.3",
60
+ "@cloudcome/utils-core": "~1.20.1",
61
+ "@cloudcome/utils-vue": "~1.14.0",
70
62
  "@dcloudio/types": "^3.4.31",
71
63
  "@dcloudio/uni-app": "3.0.0-alpha-5000820260430001",
72
64
  "vue": "^3.5.34",
73
65
  "zod": "^4.4.3"
74
66
  },
75
67
  "keywords": [
76
- "utils",
77
68
  "cloudcome",
69
+ "utils",
70
+ "utils-browser",
78
71
  "utils-core",
79
- "utils-vue",
72
+ "utils-node",
80
73
  "utils-react",
81
74
  "utils-uni",
82
- "utils-node",
83
- "utils-browser"
75
+ "utils-vue"
84
76
  ],
85
- "homepage": "https://github.com/cloudcome/utils",
77
+ "homepage": "https://cloudcome.github.io/utils/",
86
78
  "license": "MIT",
87
79
  "author": "云淡然 <hi@ydr.me> (https://ydr.me/)",
88
80
  "repository": {
package/dist/app.cjs DELETED
@@ -1,44 +0,0 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- let _cloudcome_utils_vue_shared = require("@cloudcome/utils-vue/shared");
3
- let _dcloudio_uni_app = require("@dcloudio/uni-app");
4
- //#region src/app.ts
5
- /**
6
- * 应用显示状态生命周期钩子函数
7
- *
8
- * 该函数用于监听应用从后台进入前台的生命周期事件。
9
- * 当应用从后台切换到前台时触发 onShow 回调,
10
- * 当应用从前台切换到后台时触发 onHide 回调。
11
- *
12
- * @param appShow - 应用显示状态变化时的回调函数,可以返回一个清理函数
13
- *
14
- * @example
15
- * // 基本用法
16
- * useAppShow(() => {
17
- * console.log('应用进入前台');
18
- *
19
- * // 可选:返回一个清理函数,在应用进入后台时执行
20
- * return () => {
21
- * console.log('应用进入后台');
22
- * };
23
- * });
24
- *
25
- * @example
26
- * // 带有异步操作的用法
27
- * useAppShow(async () => {
28
- * // 应用进入前台时刷新数据
29
- * await refreshUserData();
30
- *
31
- * // 返回清理函数
32
- * return () => {
33
- * // 应用进入后台时保存数据
34
- * saveUserData();
35
- * };
36
- * });
37
- */
38
- function useAppShow(appShow) {
39
- (0, _cloudcome_utils_vue_shared._runLifeHook)(_dcloudio_uni_app.onShow, _dcloudio_uni_app.onHide, appShow);
40
- }
41
- //#endregion
42
- exports.useAppShow = useAppShow;
43
-
44
- //# sourceMappingURL=app.cjs.map
package/dist/app.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"app.cjs","names":[],"sources":["../src/app.ts"],"sourcesContent":["import type { HookListenerWithDispose } from '@cloudcome/utils-vue/component';\nimport { _runLifeHook } from '@cloudcome/utils-vue/shared';\nimport { onHide, onShow } from '@dcloudio/uni-app';\n\n/**\n * 应用显示状态生命周期钩子函数\n *\n * 该函数用于监听应用从后台进入前台的生命周期事件。\n * 当应用从后台切换到前台时触发 onShow 回调,\n * 当应用从前台切换到后台时触发 onHide 回调。\n *\n * @param appShow - 应用显示状态变化时的回调函数,可以返回一个清理函数\n *\n * @example\n * // 基本用法\n * useAppShow(() => {\n * console.log('应用进入前台');\n *\n * // 可选:返回一个清理函数,在应用进入后台时执行\n * return () => {\n * console.log('应用进入后台');\n * };\n * });\n *\n * @example\n * // 带有异步操作的用法\n * useAppShow(async () => {\n * // 应用进入前台时刷新数据\n * await refreshUserData();\n *\n * // 返回清理函数\n * return () => {\n * // 应用进入后台时保存数据\n * saveUserData();\n * };\n * });\n */\nexport function useAppShow(appShow: HookListenerWithDispose) {\n _runLifeHook(onShow, onHide, appShow);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,SAAgB,WAAW,SAAkC;CAC3D,CAAA,GAAA,4BAAA,cAAa,kBAAA,QAAQ,kBAAA,QAAQ,QAAQ"}
package/dist/app.mjs DELETED
@@ -1,43 +0,0 @@
1
- import { _runLifeHook } from "@cloudcome/utils-vue/shared";
2
- import { onHide, onShow } from "@dcloudio/uni-app";
3
- //#region src/app.ts
4
- /**
5
- * 应用显示状态生命周期钩子函数
6
- *
7
- * 该函数用于监听应用从后台进入前台的生命周期事件。
8
- * 当应用从后台切换到前台时触发 onShow 回调,
9
- * 当应用从前台切换到后台时触发 onHide 回调。
10
- *
11
- * @param appShow - 应用显示状态变化时的回调函数,可以返回一个清理函数
12
- *
13
- * @example
14
- * // 基本用法
15
- * useAppShow(() => {
16
- * console.log('应用进入前台');
17
- *
18
- * // 可选:返回一个清理函数,在应用进入后台时执行
19
- * return () => {
20
- * console.log('应用进入后台');
21
- * };
22
- * });
23
- *
24
- * @example
25
- * // 带有异步操作的用法
26
- * useAppShow(async () => {
27
- * // 应用进入前台时刷新数据
28
- * await refreshUserData();
29
- *
30
- * // 返回清理函数
31
- * return () => {
32
- * // 应用进入后台时保存数据
33
- * saveUserData();
34
- * };
35
- * });
36
- */
37
- function useAppShow(appShow) {
38
- _runLifeHook(onShow, onHide, appShow);
39
- }
40
- //#endregion
41
- export { useAppShow };
42
-
43
- //# sourceMappingURL=app.mjs.map
package/dist/app.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"app.mjs","names":[],"sources":["../src/app.ts"],"sourcesContent":["import type { HookListenerWithDispose } from '@cloudcome/utils-vue/component';\nimport { _runLifeHook } from '@cloudcome/utils-vue/shared';\nimport { onHide, onShow } from '@dcloudio/uni-app';\n\n/**\n * 应用显示状态生命周期钩子函数\n *\n * 该函数用于监听应用从后台进入前台的生命周期事件。\n * 当应用从后台切换到前台时触发 onShow 回调,\n * 当应用从前台切换到后台时触发 onHide 回调。\n *\n * @param appShow - 应用显示状态变化时的回调函数,可以返回一个清理函数\n *\n * @example\n * // 基本用法\n * useAppShow(() => {\n * console.log('应用进入前台');\n *\n * // 可选:返回一个清理函数,在应用进入后台时执行\n * return () => {\n * console.log('应用进入后台');\n * };\n * });\n *\n * @example\n * // 带有异步操作的用法\n * useAppShow(async () => {\n * // 应用进入前台时刷新数据\n * await refreshUserData();\n *\n * // 返回清理函数\n * return () => {\n * // 应用进入后台时保存数据\n * saveUserData();\n * };\n * });\n */\nexport function useAppShow(appShow: HookListenerWithDispose) {\n _runLifeHook(onShow, onHide, appShow);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,SAAgB,WAAW,SAAkC;CAC3D,aAAa,QAAQ,QAAQ,QAAQ"}
package/dist/page.cjs DELETED
@@ -1,108 +0,0 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- let _cloudcome_utils_vue_shared = require("@cloudcome/utils-vue/shared");
3
- let _dcloudio_uni_app = require("@dcloudio/uni-app");
4
- let vue = require("vue");
5
- //#region src/page.ts
6
- /**
7
- * 用于获取页面参数的 hook 函数
8
- * @template T - 页面参数对象的类型,继承自 AnyObject
9
- * @param {function} [onPageLoad] - 页面加载时的回调函数
10
- * @param {T} onLoad.query - 页面参数对象
11
- * @returns {T} 响应式的页面参数对象
12
- * @example
13
- * // 基本用法
14
- * const query = usePageQuery();
15
- *
16
- * // 带回调的用法
17
- * const query = usePageQuery((query) => {
18
- * console.log('页面参数:', query);
19
- * });
20
- *
21
- * // 指定参数类型
22
- * interface PageParams {
23
- * id: string;
24
- * name?: string;
25
- * }
26
- * const query = usePageQuery<PageParams>();
27
- */
28
- function usePageQuery(onPageLoad) {
29
- const query = (0, vue.reactive)({});
30
- (0, _dcloudio_uni_app.onLoad)((_query) => {
31
- Object.assign(query, _query);
32
- onPageLoad?.(query);
33
- });
34
- return query;
35
- }
36
- /**
37
- * 用于处理页面加载生命周期的 hook 函数
38
- *
39
- * 该函数会在页面加载时执行传入的回调函数,并在页面卸载时执行清理操作(如果提供了清理函数)。
40
- * 它是 uni-app 中 onLoad 和 onUnload 生命周期的封装。
41
- *
42
- * @param {HookListenerWithDispose} load - 页面加载时的回调函数,可以返回一个清理函数
43
- *
44
- * @example
45
- * // 基本用法
46
- * usePageLoad(() => {
47
- * console.log('页面已加载');
48
- * });
49
- *
50
- * @example
51
- * // 带清理函数的用法
52
- * usePageLoad(() => {
53
- * console.log('页面已加载');
54
- *
55
- * // 返回一个清理函数,在页面卸载时执行
56
- * return () => {
57
- * console.log('页面将要卸载');
58
- * };
59
- * });
60
- *
61
- * @example
62
- * // 异步用法
63
- * usePageLoad(async () => {
64
- * const data = await fetchData();
65
- * console.log('获取到数据:', data);
66
- *
67
- * return () => {
68
- * console.log('清理资源');
69
- * };
70
- * });
71
- */
72
- function usePageLoad(load) {
73
- (0, _cloudcome_utils_vue_shared._runLifeHook)(_dcloudio_uni_app.onLoad, _dcloudio_uni_app.onUnload, load);
74
- }
75
- /**
76
- * 用于处理页面显示生命周期的 hook 函数
77
- *
78
- * 该函数会在页面显示时执行传入的回调函数,并在页面隐藏时执行清理操作(如果提供了清理函数)。
79
- * 它是 uni-app 中 onPageShow 和 onPageHide 生命周期的封装。
80
- *
81
- * @param {HookListenerWithDispose} pageShow - 页面显示时的回调函数,可以返回一个清理函数
82
- *
83
- * @example
84
- * // 基本用法
85
- * usePageShow(() => {
86
- * console.log('页面已显示');
87
- * });
88
- *
89
- * @example
90
- * // 带清理函数的用法
91
- * usePageShow(() => {
92
- * console.log('页面已显示');
93
- *
94
- * // 返回一个清理函数,在页面隐藏时执行
95
- * return () => {
96
- * console.log('页面将要隐藏');
97
- * };
98
- * });
99
- */
100
- function usePageShow(pageShow) {
101
- (0, _cloudcome_utils_vue_shared._runLifeHook)(_dcloudio_uni_app.onPageShow, _dcloudio_uni_app.onPageHide, pageShow);
102
- }
103
- //#endregion
104
- exports.usePageLoad = usePageLoad;
105
- exports.usePageQuery = usePageQuery;
106
- exports.usePageShow = usePageShow;
107
-
108
- //# sourceMappingURL=page.cjs.map
package/dist/page.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"page.cjs","names":[],"sources":["../src/page.ts"],"sourcesContent":["import type { AnyObject } from '@cloudcome/utils-core/types';\nimport type { HookListenerWithDispose } from '@cloudcome/utils-vue/component';\nimport { _runLifeHook } from '@cloudcome/utils-vue/shared';\nimport { onLoad, onPageHide, onPageShow, onUnload } from '@dcloudio/uni-app';\nimport { type Reactive, reactive } from 'vue';\n\n/**\n * 用于获取页面参数的 hook 函数\n * @template T - 页面参数对象的类型,继承自 AnyObject\n * @param {function} [onPageLoad] - 页面加载时的回调函数\n * @param {T} onLoad.query - 页面参数对象\n * @returns {T} 响应式的页面参数对象\n * @example\n * // 基本用法\n * const query = usePageQuery();\n *\n * // 带回调的用法\n * const query = usePageQuery((query) => {\n * console.log('页面参数:', query);\n * });\n *\n * // 指定参数类型\n * interface PageParams {\n * id: string;\n * name?: string;\n * }\n * const query = usePageQuery<PageParams>();\n */\nexport function usePageQuery<T extends AnyObject>(\n onPageLoad?: (query: Reactive<T>) => void,\n) {\n const query = reactive<T>({} as T);\n\n onLoad((_query) => {\n Object.assign(query, _query);\n onPageLoad?.(query);\n });\n\n return query;\n}\n\n/**\n * 用于处理页面加载生命周期的 hook 函数\n *\n * 该函数会在页面加载时执行传入的回调函数,并在页面卸载时执行清理操作(如果提供了清理函数)。\n * 它是 uni-app 中 onLoad 和 onUnload 生命周期的封装。\n *\n * @param {HookListenerWithDispose} load - 页面加载时的回调函数,可以返回一个清理函数\n *\n * @example\n * // 基本用法\n * usePageLoad(() => {\n * console.log('页面已加载');\n * });\n *\n * @example\n * // 带清理函数的用法\n * usePageLoad(() => {\n * console.log('页面已加载');\n *\n * // 返回一个清理函数,在页面卸载时执行\n * return () => {\n * console.log('页面将要卸载');\n * };\n * });\n *\n * @example\n * // 异步用法\n * usePageLoad(async () => {\n * const data = await fetchData();\n * console.log('获取到数据:', data);\n *\n * return () => {\n * console.log('清理资源');\n * };\n * });\n */\nexport function usePageLoad(load: HookListenerWithDispose) {\n _runLifeHook(onLoad, onUnload, load);\n}\n\n/**\n * 用于处理页面显示生命周期的 hook 函数\n *\n * 该函数会在页面显示时执行传入的回调函数,并在页面隐藏时执行清理操作(如果提供了清理函数)。\n * 它是 uni-app 中 onPageShow 和 onPageHide 生命周期的封装。\n *\n * @param {HookListenerWithDispose} pageShow - 页面显示时的回调函数,可以返回一个清理函数\n *\n * @example\n * // 基本用法\n * usePageShow(() => {\n * console.log('页面已显示');\n * });\n *\n * @example\n * // 带清理函数的用法\n * usePageShow(() => {\n * console.log('页面已显示');\n *\n * // 返回一个清理函数,在页面隐藏时执行\n * return () => {\n * console.log('页面将要隐藏');\n * };\n * });\n */\nexport function usePageShow(pageShow: HookListenerWithDispose) {\n _runLifeHook(onPageShow, onPageHide, pageShow);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,SAAgB,aACd,YACA;CACA,MAAM,SAAA,GAAA,IAAA,UAAoB,EAAE,CAAM;CAElC,CAAA,GAAA,kBAAA,SAAQ,WAAW;EACjB,OAAO,OAAO,OAAO,OAAO;EAC5B,aAAa,MAAM;GACnB;CAEF,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCT,SAAgB,YAAY,MAA+B;CACzD,CAAA,GAAA,4BAAA,cAAa,kBAAA,QAAQ,kBAAA,UAAU,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BtC,SAAgB,YAAY,UAAmC;CAC7D,CAAA,GAAA,4BAAA,cAAa,kBAAA,YAAY,kBAAA,YAAY,SAAS"}