@cloudcome/utils-browser 1.2.16 → 1.2.17

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 (47) hide show
  1. package/README.md +1 -1
  2. package/dist/base64.cjs +21 -8
  3. package/dist/base64.cjs.map +1 -1
  4. package/dist/base64.mjs +22 -11
  5. package/dist/base64.mjs.map +1 -1
  6. package/dist/cache.cjs +91 -79
  7. package/dist/cache.cjs.map +1 -1
  8. package/dist/cache.d.ts +1 -1
  9. package/dist/cache.mjs +91 -82
  10. package/dist/cache.mjs.map +1 -1
  11. package/dist/canvas.cjs +64 -48
  12. package/dist/canvas.cjs.map +1 -1
  13. package/dist/canvas.mjs +64 -51
  14. package/dist/canvas.mjs.map +1 -1
  15. package/dist/clipboard.cjs +34 -15
  16. package/dist/clipboard.cjs.map +1 -1
  17. package/dist/clipboard.mjs +35 -17
  18. package/dist/clipboard.mjs.map +1 -1
  19. package/dist/cookie.cjs +42 -41
  20. package/dist/cookie.cjs.map +1 -1
  21. package/dist/cookie.mjs +42 -44
  22. package/dist/cookie.mjs.map +1 -1
  23. package/dist/dom.cjs +30 -11
  24. package/dist/dom.cjs.map +1 -1
  25. package/dist/dom.mjs +30 -13
  26. package/dist/dom.mjs.map +1 -1
  27. package/dist/download.cjs +24 -12
  28. package/dist/download.cjs.map +1 -1
  29. package/dist/download.mjs +25 -15
  30. package/dist/download.mjs.map +1 -1
  31. package/dist/image.cjs +44 -34
  32. package/dist/image.cjs.map +1 -1
  33. package/dist/image.mjs +44 -35
  34. package/dist/image.mjs.map +1 -1
  35. package/dist/index.cjs +8 -3
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.mjs +9 -5
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/timer.cjs +40 -37
  40. package/dist/timer.cjs.map +1 -1
  41. package/dist/timer.mjs +40 -38
  42. package/dist/timer.mjs.map +1 -1
  43. package/dist/video.cjs +24 -14
  44. package/dist/video.cjs.map +1 -1
  45. package/dist/video.mjs +25 -16
  46. package/dist/video.mjs.map +1 -1
  47. package/package.json +46 -47
package/README.md CHANGED
@@ -117,7 +117,7 @@ UniApp 工具库,依赖 `@cloudcome/utils-core`、`@cloudcome/utils-vue`:
117
117
 
118
118
  ## 开发
119
119
 
120
- 详见 [DEVELOPMENT.md](./DEVELOPMENT.md)。
120
+ 详见 [CONTRIBUTING.md](./CONTRIBUTING.md)。
121
121
 
122
122
  ## 许可
123
123
 
package/dist/base64.cjs CHANGED
@@ -1,15 +1,28 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/base64.ts
3
+ /**
4
+ * 【浏览器环境】将字符串编码为 Base64 格式
5
+ * @param input 要编码的字符串
6
+ * @returns 编码后的 Base64 字符串
7
+ * @remarks
8
+ * 在 Node.js 环境中使用 Buffer 实现,在浏览器环境中使用 TextEncoder 和 btoa 实现
9
+ */
3
10
  function encodeBase64(input) {
4
- const encoder = new TextEncoder();
5
- const unit8Array = encoder.encode(input);
6
- return btoa(String.fromCharCode(...unit8Array));
11
+ const unit8Array = new TextEncoder().encode(input);
12
+ return btoa(String.fromCharCode(...unit8Array));
7
13
  }
14
+ /**
15
+ * 【浏览器环境】 将 Base64 字符串解码为原始字符串
16
+ * @param input 要解码的 Base64 字符串
17
+ * @returns 解码后的原始字符串
18
+ */
8
19
  function decodeBase64(input) {
9
- const decoder = new TextDecoder();
10
- const unit8Array = Uint8Array.from(atob(input), (c) => c.charCodeAt(0));
11
- return decoder.decode(unit8Array);
20
+ const decoder = new TextDecoder();
21
+ const unit8Array = Uint8Array.from(atob(input), (c) => c.charCodeAt(0));
22
+ return decoder.decode(unit8Array);
12
23
  }
24
+ //#endregion
13
25
  exports.decodeBase64 = decodeBase64;
14
26
  exports.encodeBase64 = encodeBase64;
15
- //# sourceMappingURL=base64.cjs.map
27
+
28
+ //# sourceMappingURL=base64.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"base64.cjs","sources":["../src/base64.ts"],"sourcesContent":["// @ref https://blog.csdn.net/m0_72642319/article/details/139743196\n\n/**\n * 【浏览器环境】将字符串编码为 Base64 格式\n * @param input 要编码的字符串\n * @returns 编码后的 Base64 字符串\n * @remarks\n * 在 Node.js 环境中使用 Buffer 实现,在浏览器环境中使用 TextEncoder 和 btoa 实现\n */\nexport function encodeBase64(input: string) {\n const encoder = new TextEncoder();\n const unit8Array = encoder.encode(input);\n return btoa(String.fromCharCode(...unit8Array));\n}\n\n/**\n * 【浏览器环境】 将 Base64 字符串解码为原始字符串\n * @param input 要解码的 Base64 字符串\n * @returns 解码后的原始字符串\n */\nexport function decodeBase64(input: string) {\n const decoder = new TextDecoder();\n const unit8Array = Uint8Array.from(atob(input), (c) => c.charCodeAt(0));\n return decoder.decode(unit8Array);\n}\n"],"names":[],"mappings":";;AASO,SAAS,aAAa,OAAe;AACpC,QAAA,UAAU,IAAI,YAAY;AAC1B,QAAA,aAAa,QAAQ,OAAO,KAAK;AACvC,SAAO,KAAK,OAAO,aAAa,GAAG,UAAU,CAAC;AAChD;AAOO,SAAS,aAAa,OAAe;AACpC,QAAA,UAAU,IAAI,YAAY;AAC1B,QAAA,aAAa,WAAW,KAAK,KAAK,KAAK,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC/D,SAAA,QAAQ,OAAO,UAAU;AAClC;;;"}
1
+ {"version":3,"file":"base64.cjs","names":[],"sources":["../src/base64.ts"],"sourcesContent":["// @ref https://blog.csdn.net/m0_72642319/article/details/139743196\n\n/**\n * 【浏览器环境】将字符串编码为 Base64 格式\n * @param input 要编码的字符串\n * @returns 编码后的 Base64 字符串\n * @remarks\n * 在 Node.js 环境中使用 Buffer 实现,在浏览器环境中使用 TextEncoder 和 btoa 实现\n */\nexport function encodeBase64(input: string) {\n const encoder = new TextEncoder();\n const unit8Array = encoder.encode(input);\n return btoa(String.fromCharCode(...unit8Array));\n}\n\n/**\n * 【浏览器环境】 将 Base64 字符串解码为原始字符串\n * @param input 要解码的 Base64 字符串\n * @returns 解码后的原始字符串\n */\nexport function decodeBase64(input: string) {\n const decoder = new TextDecoder();\n const unit8Array = Uint8Array.from(atob(input), (c) => c.charCodeAt(0));\n return decoder.decode(unit8Array);\n}\n"],"mappings":";;;;;;;;;AASA,SAAgB,aAAa,OAAe;CAE1C,MAAM,aAAa,IADC,aACD,CAAQ,OAAO,MAAM;CACxC,OAAO,KAAK,OAAO,aAAa,GAAG,WAAW,CAAC;;;;;;;AAQjD,SAAgB,aAAa,OAAe;CAC1C,MAAM,UAAU,IAAI,aAAa;CACjC,MAAM,aAAa,WAAW,KAAK,KAAK,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,CAAC;CACvE,OAAO,QAAQ,OAAO,WAAW"}
package/dist/base64.mjs CHANGED
@@ -1,15 +1,26 @@
1
+ //#region src/base64.ts
2
+ /**
3
+ * 【浏览器环境】将字符串编码为 Base64 格式
4
+ * @param input 要编码的字符串
5
+ * @returns 编码后的 Base64 字符串
6
+ * @remarks
7
+ * 在 Node.js 环境中使用 Buffer 实现,在浏览器环境中使用 TextEncoder 和 btoa 实现
8
+ */
1
9
  function encodeBase64(input) {
2
- const encoder = new TextEncoder();
3
- const unit8Array = encoder.encode(input);
4
- return btoa(String.fromCharCode(...unit8Array));
10
+ const unit8Array = new TextEncoder().encode(input);
11
+ return btoa(String.fromCharCode(...unit8Array));
5
12
  }
13
+ /**
14
+ * 【浏览器环境】 将 Base64 字符串解码为原始字符串
15
+ * @param input 要解码的 Base64 字符串
16
+ * @returns 解码后的原始字符串
17
+ */
6
18
  function decodeBase64(input) {
7
- const decoder = new TextDecoder();
8
- const unit8Array = Uint8Array.from(atob(input), (c) => c.charCodeAt(0));
9
- return decoder.decode(unit8Array);
19
+ const decoder = new TextDecoder();
20
+ const unit8Array = Uint8Array.from(atob(input), (c) => c.charCodeAt(0));
21
+ return decoder.decode(unit8Array);
10
22
  }
11
- export {
12
- decodeBase64,
13
- encodeBase64
14
- };
15
- //# sourceMappingURL=base64.mjs.map
23
+ //#endregion
24
+ export { decodeBase64, encodeBase64 };
25
+
26
+ //# sourceMappingURL=base64.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"base64.mjs","sources":["../src/base64.ts"],"sourcesContent":["// @ref https://blog.csdn.net/m0_72642319/article/details/139743196\n\n/**\n * 【浏览器环境】将字符串编码为 Base64 格式\n * @param input 要编码的字符串\n * @returns 编码后的 Base64 字符串\n * @remarks\n * 在 Node.js 环境中使用 Buffer 实现,在浏览器环境中使用 TextEncoder 和 btoa 实现\n */\nexport function encodeBase64(input: string) {\n const encoder = new TextEncoder();\n const unit8Array = encoder.encode(input);\n return btoa(String.fromCharCode(...unit8Array));\n}\n\n/**\n * 【浏览器环境】 将 Base64 字符串解码为原始字符串\n * @param input 要解码的 Base64 字符串\n * @returns 解码后的原始字符串\n */\nexport function decodeBase64(input: string) {\n const decoder = new TextDecoder();\n const unit8Array = Uint8Array.from(atob(input), (c) => c.charCodeAt(0));\n return decoder.decode(unit8Array);\n}\n"],"names":[],"mappings":"AASO,SAAS,aAAa,OAAe;AACpC,QAAA,UAAU,IAAI,YAAY;AAC1B,QAAA,aAAa,QAAQ,OAAO,KAAK;AACvC,SAAO,KAAK,OAAO,aAAa,GAAG,UAAU,CAAC;AAChD;AAOO,SAAS,aAAa,OAAe;AACpC,QAAA,UAAU,IAAI,YAAY;AAC1B,QAAA,aAAa,WAAW,KAAK,KAAK,KAAK,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC/D,SAAA,QAAQ,OAAO,UAAU;AAClC;"}
1
+ {"version":3,"file":"base64.mjs","names":[],"sources":["../src/base64.ts"],"sourcesContent":["// @ref https://blog.csdn.net/m0_72642319/article/details/139743196\n\n/**\n * 【浏览器环境】将字符串编码为 Base64 格式\n * @param input 要编码的字符串\n * @returns 编码后的 Base64 字符串\n * @remarks\n * 在 Node.js 环境中使用 Buffer 实现,在浏览器环境中使用 TextEncoder 和 btoa 实现\n */\nexport function encodeBase64(input: string) {\n const encoder = new TextEncoder();\n const unit8Array = encoder.encode(input);\n return btoa(String.fromCharCode(...unit8Array));\n}\n\n/**\n * 【浏览器环境】 将 Base64 字符串解码为原始字符串\n * @param input 要解码的 Base64 字符串\n * @returns 解码后的原始字符串\n */\nexport function decodeBase64(input: string) {\n const decoder = new TextDecoder();\n const unit8Array = Uint8Array.from(atob(input), (c) => c.charCodeAt(0));\n return decoder.decode(unit8Array);\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,aAAa,OAAe;CAE1C,MAAM,aAAa,IADC,aACD,CAAQ,OAAO,MAAM;CACxC,OAAO,KAAK,OAAO,aAAa,GAAG,WAAW,CAAC;;;;;;;AAQjD,SAAgB,aAAa,OAAe;CAC1C,MAAM,UAAU,IAAI,aAAa;CACjC,MAAM,aAAa,WAAW,KAAK,KAAK,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,CAAC;CACvE,OAAO,QAAQ,OAAO,WAAW"}
package/dist/cache.cjs CHANGED
@@ -1,87 +1,99 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const cache = require("@cloudcome/utils-core/cache");
4
- class StorageCache extends cache.AbstractCache {
5
- /**
6
- * 创建一个新的 StorageCache 实例
7
- * @param storage - 使用的存储实现(localStorage 或 sessionStorage)
8
- * @param namespace - 可选,用于为缓存键添加前缀的命名空间
9
- */
10
- constructor(storage, namespace = "") {
11
- super();
12
- this.storage = storage;
13
- this.namespace = namespace;
14
- }
15
- /**
16
- * 通过ID获取缓存数据
17
- * @param id - 要获取的缓存键
18
- * @returns 如果找到且未过期则返回缓存数据,否则返回null
19
- */
20
- get(id) {
21
- const { storage, namespace } = this;
22
- const fullId = namespace ? `${namespace}:${id}` : id;
23
- try {
24
- const cachedString = storage.getItem(fullId);
25
- if (!cachedString) return null;
26
- const cached = JSON.parse(cachedString);
27
- if (cached.createdAt + cached.maxAge < Date.now()) {
28
- this.del(id);
29
- return null;
30
- }
31
- return cached;
32
- } catch (e) {
33
- return null;
34
- }
35
- }
36
- /**
37
- * 将数据存储到缓存中
38
- * @param id - 存储数据使用的缓存键
39
- * @param data - 要缓存的数据
40
- * @param options - 可选的缓存配置
41
- * @returns 成功返回true,存储失败返回false
42
- */
43
- set(id, data, options) {
44
- const { storage, namespace } = this;
45
- const fullId = namespace ? `${namespace}:${id}` : id;
46
- try {
47
- storage.setItem(
48
- fullId,
49
- JSON.stringify({
50
- id,
51
- data,
52
- createdAt: Date.now(),
53
- maxAge: options?.maxAge || 0
54
- })
55
- );
56
- } catch (cause) {
57
- }
58
- }
59
- /**
60
- * 通过ID删除缓存数据
61
- * @param id - 要删除的缓存键
62
- */
63
- del(id) {
64
- const { storage, namespace } = this;
65
- const fullId = namespace ? `${namespace}:${id}` : id;
66
- try {
67
- storage.removeItem(fullId);
68
- } catch (cause) {
69
- }
70
- }
71
- clear() {
72
- try {
73
- this.storage.clear();
74
- } catch (err) {
75
- }
76
- }
77
- }
2
+ let _cloudcome_utils_core_cache = require("@cloudcome/utils-core/cache");
3
+ //#region src/cache.ts
4
+ /**
5
+ * 使用浏览器存储(localStorage sessionStorage)实现的缓存类
6
+ * @template T - 缓存数据的类型
7
+ */
8
+ var StorageCache = class extends _cloudcome_utils_core_cache.AbstractCache {
9
+ /**
10
+ * 创建一个新的 StorageCache 实例
11
+ * @param storage - 使用的存储实现(localStorage 或 sessionStorage)
12
+ * @param namespace - 可选,用于为缓存键添加前缀的命名空间
13
+ */
14
+ constructor(storage, namespace = "") {
15
+ super();
16
+ this.storage = storage;
17
+ this.namespace = namespace;
18
+ }
19
+ /**
20
+ * 通过ID获取缓存数据
21
+ * @param id - 要获取的缓存键
22
+ * @returns 如果找到且未过期则返回缓存数据,否则返回null
23
+ */
24
+ get(id) {
25
+ const { storage, namespace } = this;
26
+ const fullId = namespace ? `${namespace}:${id}` : id;
27
+ try {
28
+ const cachedString = storage.getItem(fullId);
29
+ if (!cachedString) return null;
30
+ const cached = JSON.parse(cachedString);
31
+ if (cached.createdAt + cached.maxAge < Date.now()) {
32
+ this.del(id);
33
+ return null;
34
+ }
35
+ return cached;
36
+ } catch (_e) {
37
+ return null;
38
+ }
39
+ }
40
+ /**
41
+ * 将数据存储到缓存中
42
+ * @param id - 存储数据使用的缓存键
43
+ * @param data - 要缓存的数据
44
+ * @param options - 可选的缓存配置
45
+ * @returns 成功返回true,存储失败返回false
46
+ */
47
+ set(id, data, options) {
48
+ const { storage, namespace } = this;
49
+ const fullId = namespace ? `${namespace}:${id}` : id;
50
+ try {
51
+ storage.setItem(fullId, JSON.stringify({
52
+ id,
53
+ data,
54
+ createdAt: Date.now(),
55
+ maxAge: options?.maxAge || 0
56
+ }));
57
+ } catch (_cause) {}
58
+ }
59
+ /**
60
+ * 通过ID删除缓存数据
61
+ * @param id - 要删除的缓存键
62
+ */
63
+ del(id) {
64
+ const { storage, namespace } = this;
65
+ const fullId = namespace ? `${namespace}:${id}` : id;
66
+ try {
67
+ storage.removeItem(fullId);
68
+ } catch (_cause) {}
69
+ }
70
+ clear() {
71
+ try {
72
+ this.storage.clear();
73
+ } catch (_err) {}
74
+ }
75
+ };
76
+ /**
77
+ * 创建一个使用 localStorage 的缓存实例
78
+ * @template T - 缓存数据的类型
79
+ * @param namespace - 可选,用于为缓存键添加前缀的命名空间
80
+ * @returns 使用 localStorage 的新 StorageCache 实例
81
+ */
78
82
  function createLocalCache(namespace) {
79
- return new StorageCache(localStorage, namespace);
83
+ return new StorageCache(localStorage, namespace);
80
84
  }
85
+ /**
86
+ * 创建一个使用 sessionStorage 的缓存实例
87
+ * @template T - 缓存数据的类型
88
+ * @param namespace - 可选,用于为缓存键添加前缀的命名空间
89
+ * @returns 使用 sessionStorage 的新 StorageCache 实例
90
+ */
81
91
  function createSessionCache(namespace) {
82
- return new StorageCache(sessionStorage, namespace);
92
+ return new StorageCache(sessionStorage, namespace);
83
93
  }
94
+ //#endregion
84
95
  exports.StorageCache = StorageCache;
85
96
  exports.createLocalCache = createLocalCache;
86
97
  exports.createSessionCache = createSessionCache;
87
- //# sourceMappingURL=cache.cjs.map
98
+
99
+ //# sourceMappingURL=cache.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.cjs","sources":["../src/cache.ts"],"sourcesContent":["import { AbstractCache, type CacheOptions, type Cached } from '@cloudcome/utils-core/cache';\nimport type { MaybePromise } from '@cloudcome/utils-core/types';\n\n/**\n * 使用浏览器存储(localStorage 或 sessionStorage)实现的缓存类\n * @template T - 缓存数据的类型\n */\nexport class StorageCache<T> extends AbstractCache<T> {\n /**\n * 创建一个新的 StorageCache 实例\n * @param storage - 使用的存储实现(localStorage 或 sessionStorage)\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n */\n constructor(\n readonly storage: Storage,\n readonly namespace = '',\n ) {\n super();\n }\n\n /**\n * 通过ID获取缓存数据\n * @param id - 要获取的缓存键\n * @returns 如果找到且未过期则返回缓存数据,否则返回null\n */\n get(id: string): Cached<T> | null {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n const cachedString = storage.getItem(fullId);\n if (!cachedString) return null;\n\n const cached = JSON.parse(cachedString);\n\n if (cached.createdAt + cached.maxAge < Date.now()) {\n this.del(id);\n return null;\n }\n\n return cached;\n } catch (e) {\n return null;\n }\n }\n\n /**\n * 将数据存储到缓存中\n * @param id - 存储数据使用的缓存键\n * @param data - 要缓存的数据\n * @param options - 可选的缓存配置\n * @returns 成功返回true,存储失败返回false\n */\n set(id: string, data: T, options?: CacheOptions) {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n storage.setItem(\n fullId,\n JSON.stringify({\n id,\n data,\n createdAt: Date.now(),\n maxAge: options?.maxAge || 0,\n }),\n );\n } catch (cause) {\n //\n }\n }\n\n /**\n * 通过ID删除缓存数据\n * @param id - 要删除的缓存键\n */\n del(id: string) {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n storage.removeItem(fullId);\n } catch (cause) {\n //\n }\n }\n\n clear() {\n try {\n this.storage.clear();\n } catch (err) {\n //\n }\n }\n}\n\n/**\n * 创建一个使用 localStorage 的缓存实例\n * @template T - 缓存数据的类型\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n * @returns 使用 localStorage 的新 StorageCache 实例\n */\nexport function createLocalCache<T>(namespace?: string): AbstractCache<T> {\n return new StorageCache<T>(localStorage, namespace);\n}\n\n/**\n * 创建一个使用 sessionStorage 的缓存实例\n * @template T - 缓存数据的类型\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n * @returns 使用 sessionStorage 的新 StorageCache 实例\n */\nexport function createSessionCache<T>(namespace?: string): AbstractCache<T> {\n return new StorageCache<T>(sessionStorage, namespace);\n}\n"],"names":["AbstractCache"],"mappings":";;;AAOO,MAAM,qBAAwBA,MAAAA,cAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpD,YACW,SACA,YAAY,IACrB;AACM,UAAA;AAHG,SAAA,UAAA;AACA,SAAA,YAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUX,IAAI,IAA8B;AAC1B,UAAA,EAAE,SAAS,UAAA,IAAc;AAC/B,UAAM,SAAS,YAAY,GAAG,SAAS,IAAI,EAAE,KAAK;AAE9C,QAAA;AACI,YAAA,eAAe,QAAQ,QAAQ,MAAM;AACvC,UAAA,CAAC,aAAqB,QAAA;AAEpB,YAAA,SAAS,KAAK,MAAM,YAAY;AAEtC,UAAI,OAAO,YAAY,OAAO,SAAS,KAAK,OAAO;AACjD,aAAK,IAAI,EAAE;AACJ,eAAA;AAAA,MAAA;AAGF,aAAA;AAAA,aACA,GAAG;AACH,aAAA;AAAA,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUF,IAAI,IAAY,MAAS,SAAwB;AACzC,UAAA,EAAE,SAAS,UAAA,IAAc;AAC/B,UAAM,SAAS,YAAY,GAAG,SAAS,IAAI,EAAE,KAAK;AAE9C,QAAA;AACM,cAAA;AAAA,QACN;AAAA,QACA,KAAK,UAAU;AAAA,UACb;AAAA,UACA;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,UACpB,QAAQ,SAAS,UAAU;AAAA,QAC5B,CAAA;AAAA,MACH;AAAA,aACO,OAAO;AAAA,IAAA;AAAA,EAEhB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,IAAI,IAAY;AACR,UAAA,EAAE,SAAS,UAAA,IAAc;AAC/B,UAAM,SAAS,YAAY,GAAG,SAAS,IAAI,EAAE,KAAK;AAE9C,QAAA;AACF,cAAQ,WAAW,MAAM;AAAA,aAClB,OAAO;AAAA,IAAA;AAAA,EAEhB;AAAA,EAGF,QAAQ;AACF,QAAA;AACF,WAAK,QAAQ,MAAM;AAAA,aACZ,KAAK;AAAA,IAAA;AAAA,EAEd;AAEJ;AAQO,SAAS,iBAAoB,WAAsC;AACjE,SAAA,IAAI,aAAgB,cAAc,SAAS;AACpD;AAQO,SAAS,mBAAsB,WAAsC;AACnE,SAAA,IAAI,aAAgB,gBAAgB,SAAS;AACtD;;;;"}
1
+ {"version":3,"file":"cache.cjs","names":[],"sources":["../src/cache.ts"],"sourcesContent":["import {\n AbstractCache,\n type Cached,\n type CacheOptions,\n} from '@cloudcome/utils-core/cache';\n\n/**\n * 使用浏览器存储(localStorage 或 sessionStorage)实现的缓存类\n * @template T - 缓存数据的类型\n */\nexport class StorageCache<T> extends AbstractCache<T> {\n /**\n * 创建一个新的 StorageCache 实例\n * @param storage - 使用的存储实现(localStorage 或 sessionStorage)\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n */\n constructor(\n readonly storage: Storage,\n readonly namespace = '',\n ) {\n super();\n }\n\n /**\n * 通过ID获取缓存数据\n * @param id - 要获取的缓存键\n * @returns 如果找到且未过期则返回缓存数据,否则返回null\n */\n get(id: string): Cached<T> | null {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n const cachedString = storage.getItem(fullId);\n if (!cachedString) return null;\n\n const cached = JSON.parse(cachedString);\n\n if (cached.createdAt + cached.maxAge < Date.now()) {\n this.del(id);\n return null;\n }\n\n return cached;\n } catch (_e) {\n return null;\n }\n }\n\n /**\n * 将数据存储到缓存中\n * @param id - 存储数据使用的缓存键\n * @param data - 要缓存的数据\n * @param options - 可选的缓存配置\n * @returns 成功返回true,存储失败返回false\n */\n set(id: string, data: T, options?: CacheOptions) {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n storage.setItem(\n fullId,\n JSON.stringify({\n id,\n data,\n createdAt: Date.now(),\n maxAge: options?.maxAge || 0,\n }),\n );\n } catch (_cause) {\n //\n }\n }\n\n /**\n * 通过ID删除缓存数据\n * @param id - 要删除的缓存键\n */\n del(id: string) {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n storage.removeItem(fullId);\n } catch (_cause) {\n //\n }\n }\n\n clear() {\n try {\n this.storage.clear();\n } catch (_err) {\n //\n }\n }\n}\n\n/**\n * 创建一个使用 localStorage 的缓存实例\n * @template T - 缓存数据的类型\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n * @returns 使用 localStorage 的新 StorageCache 实例\n */\nexport function createLocalCache<T>(namespace?: string): AbstractCache<T> {\n return new StorageCache<T>(localStorage, namespace);\n}\n\n/**\n * 创建一个使用 sessionStorage 的缓存实例\n * @template T - 缓存数据的类型\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n * @returns 使用 sessionStorage 的新 StorageCache 实例\n */\nexport function createSessionCache<T>(namespace?: string): AbstractCache<T> {\n return new StorageCache<T>(sessionStorage, namespace);\n}\n"],"mappings":";;;;;;;AAUA,IAAa,eAAb,cAAqC,4BAAA,cAAiB;;;;;;CAMpD,YACE,SACA,YAAqB,IACrB;EACA,OAAO;EAHE,KAAA,UAAA;EACA,KAAA,YAAA;;;;;;;CAUX,IAAI,IAA8B;EAChC,MAAM,EAAE,SAAS,cAAc;EAC/B,MAAM,SAAS,YAAY,GAAG,UAAU,GAAG,OAAO;EAElD,IAAI;GACF,MAAM,eAAe,QAAQ,QAAQ,OAAO;GAC5C,IAAI,CAAC,cAAc,OAAO;GAE1B,MAAM,SAAS,KAAK,MAAM,aAAa;GAEvC,IAAI,OAAO,YAAY,OAAO,SAAS,KAAK,KAAK,EAAE;IACjD,KAAK,IAAI,GAAG;IACZ,OAAO;;GAGT,OAAO;WACA,IAAI;GACX,OAAO;;;;;;;;;;CAWX,IAAI,IAAY,MAAS,SAAwB;EAC/C,MAAM,EAAE,SAAS,cAAc;EAC/B,MAAM,SAAS,YAAY,GAAG,UAAU,GAAG,OAAO;EAElD,IAAI;GACF,QAAQ,QACN,QACA,KAAK,UAAU;IACb;IACA;IACA,WAAW,KAAK,KAAK;IACrB,QAAQ,SAAS,UAAU;IAC5B,CAAC,CACH;WACM,QAAQ;;;;;;CASnB,IAAI,IAAY;EACd,MAAM,EAAE,SAAS,cAAc;EAC/B,MAAM,SAAS,YAAY,GAAG,UAAU,GAAG,OAAO;EAElD,IAAI;GACF,QAAQ,WAAW,OAAO;WACnB,QAAQ;;CAKnB,QAAQ;EACN,IAAI;GACF,KAAK,QAAQ,OAAO;WACb,MAAM;;;;;;;;;AAYnB,SAAgB,iBAAoB,WAAsC;CACxE,OAAO,IAAI,aAAgB,cAAc,UAAU;;;;;;;;AASrD,SAAgB,mBAAsB,WAAsC;CAC1E,OAAO,IAAI,aAAgB,gBAAgB,UAAU"}
package/dist/cache.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { AbstractCache, CacheOptions, Cached } from '@cloudcome/utils-core/cache';
1
+ import { AbstractCache, Cached, CacheOptions } from '@cloudcome/utils-core/cache';
2
2
  /**
3
3
  * 使用浏览器存储(localStorage 或 sessionStorage)实现的缓存类
4
4
  * @template T - 缓存数据的类型
package/dist/cache.mjs CHANGED
@@ -1,87 +1,96 @@
1
1
  import { AbstractCache } from "@cloudcome/utils-core/cache";
2
- class StorageCache extends AbstractCache {
3
- /**
4
- * 创建一个新的 StorageCache 实例
5
- * @param storage - 使用的存储实现(localStorage 或 sessionStorage)
6
- * @param namespace - 可选,用于为缓存键添加前缀的命名空间
7
- */
8
- constructor(storage, namespace = "") {
9
- super();
10
- this.storage = storage;
11
- this.namespace = namespace;
12
- }
13
- /**
14
- * 通过ID获取缓存数据
15
- * @param id - 要获取的缓存键
16
- * @returns 如果找到且未过期则返回缓存数据,否则返回null
17
- */
18
- get(id) {
19
- const { storage, namespace } = this;
20
- const fullId = namespace ? `${namespace}:${id}` : id;
21
- try {
22
- const cachedString = storage.getItem(fullId);
23
- if (!cachedString) return null;
24
- const cached = JSON.parse(cachedString);
25
- if (cached.createdAt + cached.maxAge < Date.now()) {
26
- this.del(id);
27
- return null;
28
- }
29
- return cached;
30
- } catch (e) {
31
- return null;
32
- }
33
- }
34
- /**
35
- * 将数据存储到缓存中
36
- * @param id - 存储数据使用的缓存键
37
- * @param data - 要缓存的数据
38
- * @param options - 可选的缓存配置
39
- * @returns 成功返回true,存储失败返回false
40
- */
41
- set(id, data, options) {
42
- const { storage, namespace } = this;
43
- const fullId = namespace ? `${namespace}:${id}` : id;
44
- try {
45
- storage.setItem(
46
- fullId,
47
- JSON.stringify({
48
- id,
49
- data,
50
- createdAt: Date.now(),
51
- maxAge: options?.maxAge || 0
52
- })
53
- );
54
- } catch (cause) {
55
- }
56
- }
57
- /**
58
- * 通过ID删除缓存数据
59
- * @param id - 要删除的缓存键
60
- */
61
- del(id) {
62
- const { storage, namespace } = this;
63
- const fullId = namespace ? `${namespace}:${id}` : id;
64
- try {
65
- storage.removeItem(fullId);
66
- } catch (cause) {
67
- }
68
- }
69
- clear() {
70
- try {
71
- this.storage.clear();
72
- } catch (err) {
73
- }
74
- }
75
- }
2
+ //#region src/cache.ts
3
+ /**
4
+ * 使用浏览器存储(localStorage sessionStorage)实现的缓存类
5
+ * @template T - 缓存数据的类型
6
+ */
7
+ var StorageCache = class extends AbstractCache {
8
+ /**
9
+ * 创建一个新的 StorageCache 实例
10
+ * @param storage - 使用的存储实现(localStorage 或 sessionStorage)
11
+ * @param namespace - 可选,用于为缓存键添加前缀的命名空间
12
+ */
13
+ constructor(storage, namespace = "") {
14
+ super();
15
+ this.storage = storage;
16
+ this.namespace = namespace;
17
+ }
18
+ /**
19
+ * 通过ID获取缓存数据
20
+ * @param id - 要获取的缓存键
21
+ * @returns 如果找到且未过期则返回缓存数据,否则返回null
22
+ */
23
+ get(id) {
24
+ const { storage, namespace } = this;
25
+ const fullId = namespace ? `${namespace}:${id}` : id;
26
+ try {
27
+ const cachedString = storage.getItem(fullId);
28
+ if (!cachedString) return null;
29
+ const cached = JSON.parse(cachedString);
30
+ if (cached.createdAt + cached.maxAge < Date.now()) {
31
+ this.del(id);
32
+ return null;
33
+ }
34
+ return cached;
35
+ } catch (_e) {
36
+ return null;
37
+ }
38
+ }
39
+ /**
40
+ * 将数据存储到缓存中
41
+ * @param id - 存储数据使用的缓存键
42
+ * @param data - 要缓存的数据
43
+ * @param options - 可选的缓存配置
44
+ * @returns 成功返回true,存储失败返回false
45
+ */
46
+ set(id, data, options) {
47
+ const { storage, namespace } = this;
48
+ const fullId = namespace ? `${namespace}:${id}` : id;
49
+ try {
50
+ storage.setItem(fullId, JSON.stringify({
51
+ id,
52
+ data,
53
+ createdAt: Date.now(),
54
+ maxAge: options?.maxAge || 0
55
+ }));
56
+ } catch (_cause) {}
57
+ }
58
+ /**
59
+ * 通过ID删除缓存数据
60
+ * @param id - 要删除的缓存键
61
+ */
62
+ del(id) {
63
+ const { storage, namespace } = this;
64
+ const fullId = namespace ? `${namespace}:${id}` : id;
65
+ try {
66
+ storage.removeItem(fullId);
67
+ } catch (_cause) {}
68
+ }
69
+ clear() {
70
+ try {
71
+ this.storage.clear();
72
+ } catch (_err) {}
73
+ }
74
+ };
75
+ /**
76
+ * 创建一个使用 localStorage 的缓存实例
77
+ * @template T - 缓存数据的类型
78
+ * @param namespace - 可选,用于为缓存键添加前缀的命名空间
79
+ * @returns 使用 localStorage 的新 StorageCache 实例
80
+ */
76
81
  function createLocalCache(namespace) {
77
- return new StorageCache(localStorage, namespace);
82
+ return new StorageCache(localStorage, namespace);
78
83
  }
84
+ /**
85
+ * 创建一个使用 sessionStorage 的缓存实例
86
+ * @template T - 缓存数据的类型
87
+ * @param namespace - 可选,用于为缓存键添加前缀的命名空间
88
+ * @returns 使用 sessionStorage 的新 StorageCache 实例
89
+ */
79
90
  function createSessionCache(namespace) {
80
- return new StorageCache(sessionStorage, namespace);
91
+ return new StorageCache(sessionStorage, namespace);
81
92
  }
82
- export {
83
- StorageCache,
84
- createLocalCache,
85
- createSessionCache
86
- };
87
- //# sourceMappingURL=cache.mjs.map
93
+ //#endregion
94
+ export { StorageCache, createLocalCache, createSessionCache };
95
+
96
+ //# sourceMappingURL=cache.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.mjs","sources":["../src/cache.ts"],"sourcesContent":["import { AbstractCache, type CacheOptions, type Cached } from '@cloudcome/utils-core/cache';\nimport type { MaybePromise } from '@cloudcome/utils-core/types';\n\n/**\n * 使用浏览器存储(localStorage 或 sessionStorage)实现的缓存类\n * @template T - 缓存数据的类型\n */\nexport class StorageCache<T> extends AbstractCache<T> {\n /**\n * 创建一个新的 StorageCache 实例\n * @param storage - 使用的存储实现(localStorage 或 sessionStorage)\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n */\n constructor(\n readonly storage: Storage,\n readonly namespace = '',\n ) {\n super();\n }\n\n /**\n * 通过ID获取缓存数据\n * @param id - 要获取的缓存键\n * @returns 如果找到且未过期则返回缓存数据,否则返回null\n */\n get(id: string): Cached<T> | null {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n const cachedString = storage.getItem(fullId);\n if (!cachedString) return null;\n\n const cached = JSON.parse(cachedString);\n\n if (cached.createdAt + cached.maxAge < Date.now()) {\n this.del(id);\n return null;\n }\n\n return cached;\n } catch (e) {\n return null;\n }\n }\n\n /**\n * 将数据存储到缓存中\n * @param id - 存储数据使用的缓存键\n * @param data - 要缓存的数据\n * @param options - 可选的缓存配置\n * @returns 成功返回true,存储失败返回false\n */\n set(id: string, data: T, options?: CacheOptions) {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n storage.setItem(\n fullId,\n JSON.stringify({\n id,\n data,\n createdAt: Date.now(),\n maxAge: options?.maxAge || 0,\n }),\n );\n } catch (cause) {\n //\n }\n }\n\n /**\n * 通过ID删除缓存数据\n * @param id - 要删除的缓存键\n */\n del(id: string) {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n storage.removeItem(fullId);\n } catch (cause) {\n //\n }\n }\n\n clear() {\n try {\n this.storage.clear();\n } catch (err) {\n //\n }\n }\n}\n\n/**\n * 创建一个使用 localStorage 的缓存实例\n * @template T - 缓存数据的类型\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n * @returns 使用 localStorage 的新 StorageCache 实例\n */\nexport function createLocalCache<T>(namespace?: string): AbstractCache<T> {\n return new StorageCache<T>(localStorage, namespace);\n}\n\n/**\n * 创建一个使用 sessionStorage 的缓存实例\n * @template T - 缓存数据的类型\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n * @returns 使用 sessionStorage 的新 StorageCache 实例\n */\nexport function createSessionCache<T>(namespace?: string): AbstractCache<T> {\n return new StorageCache<T>(sessionStorage, namespace);\n}\n"],"names":[],"mappings":";AAOO,MAAM,qBAAwB,cAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpD,YACW,SACA,YAAY,IACrB;AACM,UAAA;AAHG,SAAA,UAAA;AACA,SAAA,YAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUX,IAAI,IAA8B;AAC1B,UAAA,EAAE,SAAS,UAAA,IAAc;AAC/B,UAAM,SAAS,YAAY,GAAG,SAAS,IAAI,EAAE,KAAK;AAE9C,QAAA;AACI,YAAA,eAAe,QAAQ,QAAQ,MAAM;AACvC,UAAA,CAAC,aAAqB,QAAA;AAEpB,YAAA,SAAS,KAAK,MAAM,YAAY;AAEtC,UAAI,OAAO,YAAY,OAAO,SAAS,KAAK,OAAO;AACjD,aAAK,IAAI,EAAE;AACJ,eAAA;AAAA,MAAA;AAGF,aAAA;AAAA,aACA,GAAG;AACH,aAAA;AAAA,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUF,IAAI,IAAY,MAAS,SAAwB;AACzC,UAAA,EAAE,SAAS,UAAA,IAAc;AAC/B,UAAM,SAAS,YAAY,GAAG,SAAS,IAAI,EAAE,KAAK;AAE9C,QAAA;AACM,cAAA;AAAA,QACN;AAAA,QACA,KAAK,UAAU;AAAA,UACb;AAAA,UACA;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,UACpB,QAAQ,SAAS,UAAU;AAAA,QAC5B,CAAA;AAAA,MACH;AAAA,aACO,OAAO;AAAA,IAAA;AAAA,EAEhB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,IAAI,IAAY;AACR,UAAA,EAAE,SAAS,UAAA,IAAc;AAC/B,UAAM,SAAS,YAAY,GAAG,SAAS,IAAI,EAAE,KAAK;AAE9C,QAAA;AACF,cAAQ,WAAW,MAAM;AAAA,aAClB,OAAO;AAAA,IAAA;AAAA,EAEhB;AAAA,EAGF,QAAQ;AACF,QAAA;AACF,WAAK,QAAQ,MAAM;AAAA,aACZ,KAAK;AAAA,IAAA;AAAA,EAEd;AAEJ;AAQO,SAAS,iBAAoB,WAAsC;AACjE,SAAA,IAAI,aAAgB,cAAc,SAAS;AACpD;AAQO,SAAS,mBAAsB,WAAsC;AACnE,SAAA,IAAI,aAAgB,gBAAgB,SAAS;AACtD;"}
1
+ {"version":3,"file":"cache.mjs","names":[],"sources":["../src/cache.ts"],"sourcesContent":["import {\n AbstractCache,\n type Cached,\n type CacheOptions,\n} from '@cloudcome/utils-core/cache';\n\n/**\n * 使用浏览器存储(localStorage 或 sessionStorage)实现的缓存类\n * @template T - 缓存数据的类型\n */\nexport class StorageCache<T> extends AbstractCache<T> {\n /**\n * 创建一个新的 StorageCache 实例\n * @param storage - 使用的存储实现(localStorage 或 sessionStorage)\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n */\n constructor(\n readonly storage: Storage,\n readonly namespace = '',\n ) {\n super();\n }\n\n /**\n * 通过ID获取缓存数据\n * @param id - 要获取的缓存键\n * @returns 如果找到且未过期则返回缓存数据,否则返回null\n */\n get(id: string): Cached<T> | null {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n const cachedString = storage.getItem(fullId);\n if (!cachedString) return null;\n\n const cached = JSON.parse(cachedString);\n\n if (cached.createdAt + cached.maxAge < Date.now()) {\n this.del(id);\n return null;\n }\n\n return cached;\n } catch (_e) {\n return null;\n }\n }\n\n /**\n * 将数据存储到缓存中\n * @param id - 存储数据使用的缓存键\n * @param data - 要缓存的数据\n * @param options - 可选的缓存配置\n * @returns 成功返回true,存储失败返回false\n */\n set(id: string, data: T, options?: CacheOptions) {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n storage.setItem(\n fullId,\n JSON.stringify({\n id,\n data,\n createdAt: Date.now(),\n maxAge: options?.maxAge || 0,\n }),\n );\n } catch (_cause) {\n //\n }\n }\n\n /**\n * 通过ID删除缓存数据\n * @param id - 要删除的缓存键\n */\n del(id: string) {\n const { storage, namespace } = this;\n const fullId = namespace ? `${namespace}:${id}` : id;\n\n try {\n storage.removeItem(fullId);\n } catch (_cause) {\n //\n }\n }\n\n clear() {\n try {\n this.storage.clear();\n } catch (_err) {\n //\n }\n }\n}\n\n/**\n * 创建一个使用 localStorage 的缓存实例\n * @template T - 缓存数据的类型\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n * @returns 使用 localStorage 的新 StorageCache 实例\n */\nexport function createLocalCache<T>(namespace?: string): AbstractCache<T> {\n return new StorageCache<T>(localStorage, namespace);\n}\n\n/**\n * 创建一个使用 sessionStorage 的缓存实例\n * @template T - 缓存数据的类型\n * @param namespace - 可选,用于为缓存键添加前缀的命名空间\n * @returns 使用 sessionStorage 的新 StorageCache 实例\n */\nexport function createSessionCache<T>(namespace?: string): AbstractCache<T> {\n return new StorageCache<T>(sessionStorage, namespace);\n}\n"],"mappings":";;;;;;AAUA,IAAa,eAAb,cAAqC,cAAiB;;;;;;CAMpD,YACE,SACA,YAAqB,IACrB;EACA,OAAO;EAHE,KAAA,UAAA;EACA,KAAA,YAAA;;;;;;;CAUX,IAAI,IAA8B;EAChC,MAAM,EAAE,SAAS,cAAc;EAC/B,MAAM,SAAS,YAAY,GAAG,UAAU,GAAG,OAAO;EAElD,IAAI;GACF,MAAM,eAAe,QAAQ,QAAQ,OAAO;GAC5C,IAAI,CAAC,cAAc,OAAO;GAE1B,MAAM,SAAS,KAAK,MAAM,aAAa;GAEvC,IAAI,OAAO,YAAY,OAAO,SAAS,KAAK,KAAK,EAAE;IACjD,KAAK,IAAI,GAAG;IACZ,OAAO;;GAGT,OAAO;WACA,IAAI;GACX,OAAO;;;;;;;;;;CAWX,IAAI,IAAY,MAAS,SAAwB;EAC/C,MAAM,EAAE,SAAS,cAAc;EAC/B,MAAM,SAAS,YAAY,GAAG,UAAU,GAAG,OAAO;EAElD,IAAI;GACF,QAAQ,QACN,QACA,KAAK,UAAU;IACb;IACA;IACA,WAAW,KAAK,KAAK;IACrB,QAAQ,SAAS,UAAU;IAC5B,CAAC,CACH;WACM,QAAQ;;;;;;CASnB,IAAI,IAAY;EACd,MAAM,EAAE,SAAS,cAAc;EAC/B,MAAM,SAAS,YAAY,GAAG,UAAU,GAAG,OAAO;EAElD,IAAI;GACF,QAAQ,WAAW,OAAO;WACnB,QAAQ;;CAKnB,QAAQ;EACN,IAAI;GACF,KAAK,QAAQ,OAAO;WACb,MAAM;;;;;;;;;AAYnB,SAAgB,iBAAoB,WAAsC;CACxE,OAAO,IAAI,aAAgB,cAAc,UAAU;;;;;;;;AASrD,SAAgB,mBAAsB,WAAsC;CAC1E,OAAO,IAAI,aAAgB,gBAAgB,UAAU"}