@cloudcome/utils-core 1.19.1 → 1.20.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 (161) hide show
  1. package/README.md +1 -1
  2. package/dist/array.cjs +181 -125
  3. package/dist/array.cjs.map +1 -1
  4. package/dist/array.mjs +181 -133
  5. package/dist/array.mjs.map +1 -1
  6. package/dist/async.cjs +181 -171
  7. package/dist/async.cjs.map +1 -1
  8. package/dist/async.mjs +181 -174
  9. package/dist/async.mjs.map +1 -1
  10. package/dist/base64.cjs +16 -12
  11. package/dist/base64.cjs.map +1 -1
  12. package/dist/base64.mjs +17 -14
  13. package/dist/base64.mjs.map +1 -1
  14. package/dist/cache.cjs +79 -67
  15. package/dist/cache.cjs.map +1 -1
  16. package/dist/cache.d.ts +3 -3
  17. package/dist/cache.mjs +80 -71
  18. package/dist/cache.mjs.map +1 -1
  19. package/dist/color.cjs +478 -167
  20. package/dist/color.cjs.map +1 -1
  21. package/dist/color.d.ts +3 -3
  22. package/dist/color.mjs +480 -197
  23. package/dist/color.mjs.map +1 -1
  24. package/dist/crypto.cjs +474 -687
  25. package/dist/crypto.cjs.map +1 -1
  26. package/dist/crypto.mjs +476 -693
  27. package/dist/crypto.mjs.map +1 -1
  28. package/dist/date.cjs +972 -161
  29. package/dist/date.cjs.map +1 -1
  30. package/dist/date.d.ts +2 -2
  31. package/dist/date.mjs +962 -191
  32. package/dist/date.mjs.map +1 -1
  33. package/dist/dict.cjs +90 -52
  34. package/dist/dict.cjs.map +1 -1
  35. package/dist/dict.d.ts +1 -1
  36. package/dist/dict.mjs +91 -54
  37. package/dist/dict.mjs.map +1 -1
  38. package/dist/easing.cjs +105 -103
  39. package/dist/easing.cjs.map +1 -1
  40. package/dist/easing.mjs +106 -133
  41. package/dist/easing.mjs.map +1 -1
  42. package/dist/emitter.cjs +101 -96
  43. package/dist/emitter.cjs.map +1 -1
  44. package/dist/emitter.mjs +101 -97
  45. package/dist/emitter.mjs.map +1 -1
  46. package/dist/env.cjs +43 -9
  47. package/dist/env.cjs.map +1 -1
  48. package/dist/env.d.ts +1 -1
  49. package/dist/env.mjs +43 -15
  50. package/dist/env.mjs.map +1 -1
  51. package/dist/error.cjs +26 -5
  52. package/dist/error.cjs.map +1 -1
  53. package/dist/error.mjs +26 -7
  54. package/dist/error.mjs.map +1 -1
  55. package/dist/exception.cjs +38 -20
  56. package/dist/exception.cjs.map +1 -1
  57. package/dist/exception.d.ts +5 -5
  58. package/dist/exception.mjs +38 -21
  59. package/dist/exception.mjs.map +1 -1
  60. package/dist/function.cjs +128 -68
  61. package/dist/function.cjs.map +1 -1
  62. package/dist/function.mjs +128 -72
  63. package/dist/function.mjs.map +1 -1
  64. package/dist/index.cjs +8 -3
  65. package/dist/index.cjs.map +1 -1
  66. package/dist/index.mjs +9 -5
  67. package/dist/index.mjs.map +1 -1
  68. package/dist/number.cjs +10 -14
  69. package/dist/number.mjs +2 -15
  70. package/dist/object/get-set.d.ts +27 -3
  71. package/dist/object/merge.d.ts +2 -2
  72. package/dist/object.cjs +369 -106
  73. package/dist/object.cjs.map +1 -1
  74. package/dist/object.mjs +366 -115
  75. package/dist/object.mjs.map +1 -1
  76. package/dist/path.cjs +144 -55
  77. package/dist/path.cjs.map +1 -1
  78. package/dist/path.mjs +144 -62
  79. package/dist/path.mjs.map +1 -1
  80. package/dist/promise.cjs +84 -43
  81. package/dist/promise.cjs.map +1 -1
  82. package/dist/promise.mjs +85 -50
  83. package/dist/promise.mjs.map +1 -1
  84. package/dist/qs.cjs +63 -39
  85. package/dist/qs.cjs.map +1 -1
  86. package/dist/qs.mjs +64 -42
  87. package/dist/qs.mjs.map +1 -1
  88. package/dist/regexp.cjs +118 -35
  89. package/dist/regexp.cjs.map +1 -1
  90. package/dist/regexp.mjs +119 -46
  91. package/dist/regexp.mjs.map +1 -1
  92. package/dist/string.cjs +12 -15
  93. package/dist/string.mjs +2 -16
  94. package/dist/string2.cjs +378 -142
  95. package/dist/string2.cjs.map +1 -1
  96. package/dist/string2.mjs +259 -143
  97. package/dist/string2.mjs.map +1 -1
  98. package/dist/time.cjs +136 -59
  99. package/dist/time.cjs.map +1 -1
  100. package/dist/time.mjs +136 -65
  101. package/dist/time.mjs.map +1 -1
  102. package/dist/timer.cjs +122 -112
  103. package/dist/timer.cjs.map +1 -1
  104. package/dist/timer.mjs +123 -115
  105. package/dist/timer.mjs.map +1 -1
  106. package/dist/tree.cjs +207 -112
  107. package/dist/tree.cjs.map +1 -1
  108. package/dist/tree.mjs +207 -116
  109. package/dist/tree.mjs.map +1 -1
  110. package/dist/try/curry.d.ts +1 -1
  111. package/dist/try.cjs +36 -37
  112. package/dist/try.cjs.map +1 -1
  113. package/dist/try.mjs +35 -37
  114. package/dist/try.mjs.map +1 -1
  115. package/dist/type.cjs +126 -24
  116. package/dist/type.cjs.map +1 -1
  117. package/dist/type.d.ts +2 -2
  118. package/dist/type.mjs +128 -45
  119. package/dist/type.mjs.map +1 -1
  120. package/dist/types.cjs +0 -2
  121. package/dist/types.d.ts +2 -2
  122. package/dist/types.mjs +0 -2
  123. package/dist/unique.cjs +41 -38
  124. package/dist/unique.cjs.map +1 -1
  125. package/dist/unique.mjs +42 -41
  126. package/dist/unique.mjs.map +1 -1
  127. package/dist/url.cjs +39 -30
  128. package/dist/url.cjs.map +1 -1
  129. package/dist/url.mjs +40 -33
  130. package/dist/url.mjs.map +1 -1
  131. package/dist/version.cjs +51 -33
  132. package/dist/version.cjs.map +1 -1
  133. package/dist/version.mjs +51 -35
  134. package/dist/version.mjs.map +1 -1
  135. package/package.json +104 -105
  136. package/dist/const.cjs +0 -14
  137. package/dist/const.cjs.map +0 -1
  138. package/dist/const.mjs +0 -15
  139. package/dist/const.mjs.map +0 -1
  140. package/dist/core.cjs +0 -362
  141. package/dist/core.cjs.map +0 -1
  142. package/dist/core.mjs +0 -363
  143. package/dist/core.mjs.map +0 -1
  144. package/dist/crypto/md5.d.mts +0 -1
  145. package/dist/crypto/sha1.d.mts +0 -1
  146. package/dist/crypto/sha256.d.mts +0 -1
  147. package/dist/crypto/sha512.d.mts +0 -1
  148. package/dist/each.cjs +0 -18
  149. package/dist/each.cjs.map +0 -1
  150. package/dist/each.mjs +0 -19
  151. package/dist/each.mjs.map +0 -1
  152. package/dist/merge.cjs +0 -87
  153. package/dist/merge.cjs.map +0 -1
  154. package/dist/merge.mjs +0 -88
  155. package/dist/merge.mjs.map +0 -1
  156. package/dist/number.cjs.map +0 -1
  157. package/dist/number.mjs.map +0 -1
  158. package/dist/string.cjs.map +0 -1
  159. package/dist/string.mjs.map +0 -1
  160. package/dist/types.cjs.map +0 -1
  161. package/dist/types.mjs.map +0 -1
package/dist/promise.cjs CHANGED
@@ -1,62 +1,103 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const type = require("./type.cjs");
2
+ const require_type = require("./type.cjs");
3
+ //#region src/promise.ts
4
+ /**
5
+ * 检查给定的值是否为 Promise 类似对象。
6
+ * @param unknown - 要检查的值。
7
+ * @returns 如果值是 Promise 类似对象,则返回 `true`,否则返回 `false`。
8
+ */
4
9
  function isPromiseLike(unknown) {
5
- return type.isPromise(unknown) || type.isObject(unknown) && typeof unknown.then === "function";
10
+ return require_type.isPromise(unknown) || require_type.isObject(unknown) && typeof unknown.then === "function";
6
11
  }
12
+ /**
13
+ * 等待一定时间后解决 Promise
14
+ * @param ms - 等待的毫秒数,默认为 0
15
+ * @param ctrl - 可选的 AbortController,用于提前终止等待
16
+ * @returns 一个 Promise,等待指定时间后解决
17
+ */
7
18
  async function promiseDelay(ms = 0, ctrl) {
8
- return new Promise((resolve) => {
9
- const t = setTimeout(resolve, ms);
10
- if (ctrl) {
11
- ctrl.signal.addEventListener("abort", () => {
12
- clearTimeout(t);
13
- resolve();
14
- });
15
- }
16
- });
19
+ return new Promise((resolve) => {
20
+ const t = setTimeout(resolve, ms);
21
+ if (ctrl) ctrl.signal.addEventListener("abort", () => {
22
+ clearTimeout(t);
23
+ resolve();
24
+ });
25
+ });
17
26
  }
27
+ /**
28
+ * 使 Promise 在指定时间内执行,超时则拒绝
29
+ * @param promise - 要执行的 Promise
30
+ * @param ms - 超时的毫秒数
31
+ * @returns 如果 Promise 在指定时间内解决,则返回其结果;否则抛出 "timeout" 错误
32
+ * @throws {Error} 如果 Promise 超时,抛出 "timeout" 错误
33
+ */
18
34
  async function promiseTimeout(promise, ms) {
19
- const ctrl = new AbortController();
20
- const result = await Promise.race([
21
- promise,
22
- promiseDelay(ms, ctrl).then(() => {
23
- throw new Error("timeout");
24
- })
25
- ]);
26
- ctrl.abort();
27
- return result;
35
+ const ctrl = new AbortController();
36
+ const result = await Promise.race([promise, promiseDelay(ms, ctrl).then(() => {
37
+ throw new Error("timeout");
38
+ })]);
39
+ ctrl.abort();
40
+ return result;
28
41
  }
42
+ /**
43
+ * 在指定条件满足时解决 Promise
44
+ * @param condition - 一个返回布尔值的函数,用于检查条件是否满足
45
+ * @param ms - 检查条件的时间间隔(毫秒),默认为 10
46
+ * @returns 一个 Promise,在条件满足时解决
47
+ */
29
48
  function promiseWhen(condition, ms = 10) {
30
- return new Promise((resolve, reject) => {
31
- const check = () => {
32
- if (condition()) {
33
- resolve();
34
- } else {
35
- setTimeout(check, ms);
36
- }
37
- };
38
- check();
39
- });
49
+ return new Promise((resolve, _reject) => {
50
+ const check = () => {
51
+ if (condition()) resolve();
52
+ else setTimeout(check, ms);
53
+ };
54
+ check();
55
+ });
40
56
  }
57
+ /**
58
+ * 创建一个与给定 Promise 共享状态的新 Promise。
59
+ * 新的 Promise 不具备 resolve 或 reject 的能力,它仅反映原始 Promise 的状态。
60
+ * @param promise - 要共享状态的原始 Promise。
61
+ * @returns 一个新的 Promise,其状态与给定的 Promise 完全相同。
62
+ * @example
63
+ * const { promise: p1 } = Promise.withResolvers();
64
+ * const sp1 = sharedPromise(p1);
65
+ * const sp2 = sharedPromise(p1);
66
+ * // 此时 sp1、sp2 完全共享 p1 的状态,自身并不具备 resolve 或 reject 的能力
67
+ */
41
68
  function promiseShared(promise) {
42
- return new Promise((resolve, reject) => {
43
- promise.then(resolve, reject);
44
- });
69
+ return new Promise((resolve, reject) => {
70
+ promise.then(resolve, reject);
71
+ });
45
72
  }
73
+ /**
74
+ * 创建一个最小等待时间的函数
75
+ * @param {number} ms - 最小等待时间(毫秒)
76
+ * @returns {function} 返回一个异步函数,该函数会确保从 createMinDelayPromise 调用到其执行的时间至少为 ms 毫秒
77
+ * @example
78
+ * const end = createMinDelayPromise(1000);
79
+ * // 执行一些操作
80
+ * await end(); // 确保从 createMinDelayPromise 调用到这里的总时间至少为 1000 毫秒
81
+ */
46
82
  function createMinDelayPromise(ms) {
47
- const startTime = Date.now();
48
- return async function end() {
49
- const endTime = Date.now();
50
- const waitTime = ms - (endTime - startTime);
51
- if (waitTime > 0) {
52
- await promiseDelay(waitTime);
53
- }
54
- };
83
+ const startTime = Date.now();
84
+ /**
85
+ * 确保最小等待时间的结束函数
86
+ * @async
87
+ * @function end
88
+ * @returns {Promise<void>} 在达到最小等待时间后解决
89
+ */
90
+ return async function end() {
91
+ const waitTime = ms - (Date.now() - startTime);
92
+ if (waitTime > 0) await promiseDelay(waitTime);
93
+ };
55
94
  }
95
+ //#endregion
56
96
  exports.createMinDelayPromise = createMinDelayPromise;
57
97
  exports.isPromiseLike = isPromiseLike;
58
98
  exports.promiseDelay = promiseDelay;
59
99
  exports.promiseShared = promiseShared;
60
100
  exports.promiseTimeout = promiseTimeout;
61
101
  exports.promiseWhen = promiseWhen;
62
- //# sourceMappingURL=promise.cjs.map
102
+
103
+ //# sourceMappingURL=promise.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"promise.cjs","sources":["../src/promise.ts"],"sourcesContent":["import { isObject, isPromise } from './type';\n\n/**\n * 检查给定的值是否为 Promise 类似对象。\n * @param unknown - 要检查的值。\n * @returns 如果值是 Promise 类似对象,则返回 `true`,否则返回 `false`。\n */\nexport function isPromiseLike<T>(unknown: unknown): unknown is Promise<T> {\n return isPromise(unknown) || (isObject(unknown) && typeof (unknown as unknown as Promise<T>).then === 'function');\n}\n\n/**\n * 等待一定时间后解决 Promise\n * @param ms - 等待的毫秒数,默认为 0\n * @param ctrl - 可选的 AbortController,用于提前终止等待\n * @returns 一个 Promise,等待指定时间后解决\n */\nexport async function promiseDelay(ms = 0, ctrl?: AbortController) {\n return new Promise<void>((resolve) => {\n const t = setTimeout(resolve, ms);\n\n if (ctrl) {\n ctrl.signal.addEventListener('abort', () => {\n clearTimeout(t);\n resolve();\n });\n }\n });\n}\n\n/**\n * 使 Promise 在指定时间内执行,超时则拒绝\n * @param promise - 要执行的 Promise\n * @param ms - 超时的毫秒数\n * @returns 如果 Promise 在指定时间内解决,则返回其结果;否则抛出 \"timeout\" 错误\n * @throws {Error} 如果 Promise 超时,抛出 \"timeout\" 错误\n */\nexport async function promiseTimeout<T>(promise: Promise<T>, ms: number) {\n const ctrl = new AbortController();\n const result = await Promise.race([\n promise,\n promiseDelay(ms, ctrl).then(() => {\n throw new Error('timeout');\n }),\n ]);\n ctrl.abort();\n return result;\n}\n\n/**\n * 在指定条件满足时解决 Promise\n * @param condition - 一个返回布尔值的函数,用于检查条件是否满足\n * @param ms - 检查条件的时间间隔(毫秒),默认为 10\n * @returns 一个 Promise,在条件满足时解决\n */\nexport function promiseWhen(condition: () => boolean, ms = 10) {\n return new Promise<void>((resolve, reject) => {\n const check = () => {\n if (condition()) {\n resolve();\n } else {\n setTimeout(check, ms);\n }\n };\n\n check();\n });\n}\n\n/**\n * 创建一个与给定 Promise 共享状态的新 Promise。\n * 新的 Promise 不具备 resolve 或 reject 的能力,它仅反映原始 Promise 的状态。\n * @param promise - 要共享状态的原始 Promise。\n * @returns 一个新的 Promise,其状态与给定的 Promise 完全相同。\n * @example\n * const { promise: p1 } = Promise.withResolvers();\n * const sp1 = sharedPromise(p1);\n * const sp2 = sharedPromise(p1);\n * // 此时 sp1、sp2 完全共享 p1 的状态,自身并不具备 resolve 或 reject 的能力\n */\nexport function promiseShared<T>(promise: Promise<T>) {\n return new Promise<T>((resolve, reject) => {\n promise.then(resolve, reject);\n });\n}\n\n/**\n * 创建一个最小等待时间的函数\n * @param {number} ms - 最小等待时间(毫秒)\n * @returns {function} 返回一个异步函数,该函数会确保从 createMinDelayPromise 调用到其执行的时间至少为 ms 毫秒\n * @example\n * const end = createMinDelayPromise(1000);\n * // 执行一些操作\n * await end(); // 确保从 createMinDelayPromise 调用到这里的总时间至少为 1000 毫秒\n */\nexport function createMinDelayPromise(ms: number) {\n const startTime = Date.now();\n /**\n * 确保最小等待时间的结束函数\n * @async\n * @function end\n * @returns {Promise<void>} 在达到最小等待时间后解决\n */\n return async function end() {\n const endTime = Date.now();\n const waitTime = ms - (endTime - startTime);\n if (waitTime > 0) {\n await promiseDelay(waitTime);\n }\n };\n}\n"],"names":["isPromise","isObject"],"mappings":";;;AAOO,SAAS,cAAiB,SAAyC;AACjE,SAAAA,KAAA,UAAU,OAAO,KAAMC,KAAA,SAAS,OAAO,KAAK,OAAQ,QAAkC,SAAS;AACxG;AAQsB,eAAA,aAAa,KAAK,GAAG,MAAwB;AAC1D,SAAA,IAAI,QAAc,CAAC,YAAY;AAC9B,UAAA,IAAI,WAAW,SAAS,EAAE;AAEhC,QAAI,MAAM;AACH,WAAA,OAAO,iBAAiB,SAAS,MAAM;AAC1C,qBAAa,CAAC;AACN,gBAAA;AAAA,MAAA,CACT;AAAA,IAAA;AAAA,EACH,CACD;AACH;AASsB,eAAA,eAAkB,SAAqB,IAAY;AACjE,QAAA,OAAO,IAAI,gBAAgB;AAC3B,QAAA,SAAS,MAAM,QAAQ,KAAK;AAAA,IAChC;AAAA,IACA,aAAa,IAAI,IAAI,EAAE,KAAK,MAAM;AAC1B,YAAA,IAAI,MAAM,SAAS;AAAA,IAC1B,CAAA;AAAA,EAAA,CACF;AACD,OAAK,MAAM;AACJ,SAAA;AACT;AAQgB,SAAA,YAAY,WAA0B,KAAK,IAAI;AAC7D,SAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,UAAM,QAAQ,MAAM;AAClB,UAAI,aAAa;AACP,gBAAA;AAAA,MAAA,OACH;AACL,mBAAW,OAAO,EAAE;AAAA,MAAA;AAAA,IAExB;AAEM,UAAA;AAAA,EAAA,CACP;AACH;AAaO,SAAS,cAAiB,SAAqB;AACpD,SAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACjC,YAAA,KAAK,SAAS,MAAM;AAAA,EAAA,CAC7B;AACH;AAWO,SAAS,sBAAsB,IAAY;AAC1C,QAAA,YAAY,KAAK,IAAI;AAO3B,SAAO,eAAe,MAAM;AACpB,UAAA,UAAU,KAAK,IAAI;AACnB,UAAA,WAAW,MAAM,UAAU;AACjC,QAAI,WAAW,GAAG;AAChB,YAAM,aAAa,QAAQ;AAAA,IAAA;AAAA,EAE/B;AACF;;;;;;;"}
1
+ {"version":3,"file":"promise.cjs","names":[],"sources":["../src/promise.ts"],"sourcesContent":["import { isObject, isPromise } from './type';\n\n/**\n * 检查给定的值是否为 Promise 类似对象。\n * @param unknown - 要检查的值。\n * @returns 如果值是 Promise 类似对象,则返回 `true`,否则返回 `false`。\n */\nexport function isPromiseLike<T>(unknown: unknown): unknown is Promise<T> {\n return (\n isPromise(unknown) ||\n (isObject(unknown) &&\n typeof (unknown as unknown as Promise<T>).then === 'function')\n );\n}\n\n/**\n * 等待一定时间后解决 Promise\n * @param ms - 等待的毫秒数,默认为 0\n * @param ctrl - 可选的 AbortController,用于提前终止等待\n * @returns 一个 Promise,等待指定时间后解决\n */\nexport async function promiseDelay(ms = 0, ctrl?: AbortController) {\n return new Promise<void>((resolve) => {\n const t = setTimeout(resolve, ms);\n\n if (ctrl) {\n ctrl.signal.addEventListener('abort', () => {\n clearTimeout(t);\n resolve();\n });\n }\n });\n}\n\n/**\n * 使 Promise 在指定时间内执行,超时则拒绝\n * @param promise - 要执行的 Promise\n * @param ms - 超时的毫秒数\n * @returns 如果 Promise 在指定时间内解决,则返回其结果;否则抛出 \"timeout\" 错误\n * @throws {Error} 如果 Promise 超时,抛出 \"timeout\" 错误\n */\nexport async function promiseTimeout<T>(promise: Promise<T>, ms: number) {\n const ctrl = new AbortController();\n const result = await Promise.race([\n promise,\n promiseDelay(ms, ctrl).then(() => {\n throw new Error('timeout');\n }),\n ]);\n ctrl.abort();\n return result;\n}\n\n/**\n * 在指定条件满足时解决 Promise\n * @param condition - 一个返回布尔值的函数,用于检查条件是否满足\n * @param ms - 检查条件的时间间隔(毫秒),默认为 10\n * @returns 一个 Promise,在条件满足时解决\n */\nexport function promiseWhen(condition: () => boolean, ms = 10) {\n return new Promise<void>((resolve, _reject) => {\n const check = () => {\n if (condition()) {\n resolve();\n } else {\n setTimeout(check, ms);\n }\n };\n\n check();\n });\n}\n\n/**\n * 创建一个与给定 Promise 共享状态的新 Promise。\n * 新的 Promise 不具备 resolve 或 reject 的能力,它仅反映原始 Promise 的状态。\n * @param promise - 要共享状态的原始 Promise。\n * @returns 一个新的 Promise,其状态与给定的 Promise 完全相同。\n * @example\n * const { promise: p1 } = Promise.withResolvers();\n * const sp1 = sharedPromise(p1);\n * const sp2 = sharedPromise(p1);\n * // 此时 sp1、sp2 完全共享 p1 的状态,自身并不具备 resolve 或 reject 的能力\n */\nexport function promiseShared<T>(promise: Promise<T>) {\n return new Promise<T>((resolve, reject) => {\n promise.then(resolve, reject);\n });\n}\n\n/**\n * 创建一个最小等待时间的函数\n * @param {number} ms - 最小等待时间(毫秒)\n * @returns {function} 返回一个异步函数,该函数会确保从 createMinDelayPromise 调用到其执行的时间至少为 ms 毫秒\n * @example\n * const end = createMinDelayPromise(1000);\n * // 执行一些操作\n * await end(); // 确保从 createMinDelayPromise 调用到这里的总时间至少为 1000 毫秒\n */\nexport function createMinDelayPromise(ms: number) {\n const startTime = Date.now();\n /**\n * 确保最小等待时间的结束函数\n * @async\n * @function end\n * @returns {Promise<void>} 在达到最小等待时间后解决\n */\n return async function end() {\n const endTime = Date.now();\n const waitTime = ms - (endTime - startTime);\n if (waitTime > 0) {\n await promiseDelay(waitTime);\n }\n };\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,cAAiB,SAAyC;CACxE,OACE,aAAA,UAAU,QAAQ,IACjB,aAAA,SAAS,QAAQ,IAChB,OAAQ,QAAkC,SAAS;;;;;;;;AAUzD,eAAsB,aAAa,KAAK,GAAG,MAAwB;CACjE,OAAO,IAAI,SAAe,YAAY;EACpC,MAAM,IAAI,WAAW,SAAS,GAAG;EAEjC,IAAI,MACF,KAAK,OAAO,iBAAiB,eAAe;GAC1C,aAAa,EAAE;GACf,SAAS;IACT;GAEJ;;;;;;;;;AAUJ,eAAsB,eAAkB,SAAqB,IAAY;CACvE,MAAM,OAAO,IAAI,iBAAiB;CAClC,MAAM,SAAS,MAAM,QAAQ,KAAK,CAChC,SACA,aAAa,IAAI,KAAK,CAAC,WAAW;EAChC,MAAM,IAAI,MAAM,UAAU;GAC1B,CACH,CAAC;CACF,KAAK,OAAO;CACZ,OAAO;;;;;;;;AAST,SAAgB,YAAY,WAA0B,KAAK,IAAI;CAC7D,OAAO,IAAI,SAAe,SAAS,YAAY;EAC7C,MAAM,cAAc;GAClB,IAAI,WAAW,EACb,SAAS;QAET,WAAW,OAAO,GAAG;;EAIzB,OAAO;GACP;;;;;;;;;;;;;AAcJ,SAAgB,cAAiB,SAAqB;CACpD,OAAO,IAAI,SAAY,SAAS,WAAW;EACzC,QAAQ,KAAK,SAAS,OAAO;GAC7B;;;;;;;;;;;AAYJ,SAAgB,sBAAsB,IAAY;CAChD,MAAM,YAAY,KAAK,KAAK;;;;;;;CAO5B,OAAO,eAAe,MAAM;EAE1B,MAAM,WAAW,MADD,KAAK,KACE,GAAU;EACjC,IAAI,WAAW,GACb,MAAM,aAAa,SAAS"}
package/dist/promise.mjs CHANGED
@@ -1,62 +1,97 @@
1
- import { isPromise, isObject } from "./type.mjs";
1
+ import { isObject, isPromise } from "./type.mjs";
2
+ //#region src/promise.ts
3
+ /**
4
+ * 检查给定的值是否为 Promise 类似对象。
5
+ * @param unknown - 要检查的值。
6
+ * @returns 如果值是 Promise 类似对象,则返回 `true`,否则返回 `false`。
7
+ */
2
8
  function isPromiseLike(unknown) {
3
- return isPromise(unknown) || isObject(unknown) && typeof unknown.then === "function";
9
+ return isPromise(unknown) || isObject(unknown) && typeof unknown.then === "function";
4
10
  }
11
+ /**
12
+ * 等待一定时间后解决 Promise
13
+ * @param ms - 等待的毫秒数,默认为 0
14
+ * @param ctrl - 可选的 AbortController,用于提前终止等待
15
+ * @returns 一个 Promise,等待指定时间后解决
16
+ */
5
17
  async function promiseDelay(ms = 0, ctrl) {
6
- return new Promise((resolve) => {
7
- const t = setTimeout(resolve, ms);
8
- if (ctrl) {
9
- ctrl.signal.addEventListener("abort", () => {
10
- clearTimeout(t);
11
- resolve();
12
- });
13
- }
14
- });
18
+ return new Promise((resolve) => {
19
+ const t = setTimeout(resolve, ms);
20
+ if (ctrl) ctrl.signal.addEventListener("abort", () => {
21
+ clearTimeout(t);
22
+ resolve();
23
+ });
24
+ });
15
25
  }
26
+ /**
27
+ * 使 Promise 在指定时间内执行,超时则拒绝
28
+ * @param promise - 要执行的 Promise
29
+ * @param ms - 超时的毫秒数
30
+ * @returns 如果 Promise 在指定时间内解决,则返回其结果;否则抛出 "timeout" 错误
31
+ * @throws {Error} 如果 Promise 超时,抛出 "timeout" 错误
32
+ */
16
33
  async function promiseTimeout(promise, ms) {
17
- const ctrl = new AbortController();
18
- const result = await Promise.race([
19
- promise,
20
- promiseDelay(ms, ctrl).then(() => {
21
- throw new Error("timeout");
22
- })
23
- ]);
24
- ctrl.abort();
25
- return result;
34
+ const ctrl = new AbortController();
35
+ const result = await Promise.race([promise, promiseDelay(ms, ctrl).then(() => {
36
+ throw new Error("timeout");
37
+ })]);
38
+ ctrl.abort();
39
+ return result;
26
40
  }
41
+ /**
42
+ * 在指定条件满足时解决 Promise
43
+ * @param condition - 一个返回布尔值的函数,用于检查条件是否满足
44
+ * @param ms - 检查条件的时间间隔(毫秒),默认为 10
45
+ * @returns 一个 Promise,在条件满足时解决
46
+ */
27
47
  function promiseWhen(condition, ms = 10) {
28
- return new Promise((resolve, reject) => {
29
- const check = () => {
30
- if (condition()) {
31
- resolve();
32
- } else {
33
- setTimeout(check, ms);
34
- }
35
- };
36
- check();
37
- });
48
+ return new Promise((resolve, _reject) => {
49
+ const check = () => {
50
+ if (condition()) resolve();
51
+ else setTimeout(check, ms);
52
+ };
53
+ check();
54
+ });
38
55
  }
56
+ /**
57
+ * 创建一个与给定 Promise 共享状态的新 Promise。
58
+ * 新的 Promise 不具备 resolve 或 reject 的能力,它仅反映原始 Promise 的状态。
59
+ * @param promise - 要共享状态的原始 Promise。
60
+ * @returns 一个新的 Promise,其状态与给定的 Promise 完全相同。
61
+ * @example
62
+ * const { promise: p1 } = Promise.withResolvers();
63
+ * const sp1 = sharedPromise(p1);
64
+ * const sp2 = sharedPromise(p1);
65
+ * // 此时 sp1、sp2 完全共享 p1 的状态,自身并不具备 resolve 或 reject 的能力
66
+ */
39
67
  function promiseShared(promise) {
40
- return new Promise((resolve, reject) => {
41
- promise.then(resolve, reject);
42
- });
68
+ return new Promise((resolve, reject) => {
69
+ promise.then(resolve, reject);
70
+ });
43
71
  }
72
+ /**
73
+ * 创建一个最小等待时间的函数
74
+ * @param {number} ms - 最小等待时间(毫秒)
75
+ * @returns {function} 返回一个异步函数,该函数会确保从 createMinDelayPromise 调用到其执行的时间至少为 ms 毫秒
76
+ * @example
77
+ * const end = createMinDelayPromise(1000);
78
+ * // 执行一些操作
79
+ * await end(); // 确保从 createMinDelayPromise 调用到这里的总时间至少为 1000 毫秒
80
+ */
44
81
  function createMinDelayPromise(ms) {
45
- const startTime = Date.now();
46
- return async function end() {
47
- const endTime = Date.now();
48
- const waitTime = ms - (endTime - startTime);
49
- if (waitTime > 0) {
50
- await promiseDelay(waitTime);
51
- }
52
- };
82
+ const startTime = Date.now();
83
+ /**
84
+ * 确保最小等待时间的结束函数
85
+ * @async
86
+ * @function end
87
+ * @returns {Promise<void>} 在达到最小等待时间后解决
88
+ */
89
+ return async function end() {
90
+ const waitTime = ms - (Date.now() - startTime);
91
+ if (waitTime > 0) await promiseDelay(waitTime);
92
+ };
53
93
  }
54
- export {
55
- createMinDelayPromise,
56
- isPromiseLike,
57
- promiseDelay,
58
- promiseShared,
59
- promiseTimeout,
60
- promiseWhen
61
- };
62
- //# sourceMappingURL=promise.mjs.map
94
+ //#endregion
95
+ export { createMinDelayPromise, isPromiseLike, promiseDelay, promiseShared, promiseTimeout, promiseWhen };
96
+
97
+ //# sourceMappingURL=promise.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"promise.mjs","sources":["../src/promise.ts"],"sourcesContent":["import { isObject, isPromise } from './type';\n\n/**\n * 检查给定的值是否为 Promise 类似对象。\n * @param unknown - 要检查的值。\n * @returns 如果值是 Promise 类似对象,则返回 `true`,否则返回 `false`。\n */\nexport function isPromiseLike<T>(unknown: unknown): unknown is Promise<T> {\n return isPromise(unknown) || (isObject(unknown) && typeof (unknown as unknown as Promise<T>).then === 'function');\n}\n\n/**\n * 等待一定时间后解决 Promise\n * @param ms - 等待的毫秒数,默认为 0\n * @param ctrl - 可选的 AbortController,用于提前终止等待\n * @returns 一个 Promise,等待指定时间后解决\n */\nexport async function promiseDelay(ms = 0, ctrl?: AbortController) {\n return new Promise<void>((resolve) => {\n const t = setTimeout(resolve, ms);\n\n if (ctrl) {\n ctrl.signal.addEventListener('abort', () => {\n clearTimeout(t);\n resolve();\n });\n }\n });\n}\n\n/**\n * 使 Promise 在指定时间内执行,超时则拒绝\n * @param promise - 要执行的 Promise\n * @param ms - 超时的毫秒数\n * @returns 如果 Promise 在指定时间内解决,则返回其结果;否则抛出 \"timeout\" 错误\n * @throws {Error} 如果 Promise 超时,抛出 \"timeout\" 错误\n */\nexport async function promiseTimeout<T>(promise: Promise<T>, ms: number) {\n const ctrl = new AbortController();\n const result = await Promise.race([\n promise,\n promiseDelay(ms, ctrl).then(() => {\n throw new Error('timeout');\n }),\n ]);\n ctrl.abort();\n return result;\n}\n\n/**\n * 在指定条件满足时解决 Promise\n * @param condition - 一个返回布尔值的函数,用于检查条件是否满足\n * @param ms - 检查条件的时间间隔(毫秒),默认为 10\n * @returns 一个 Promise,在条件满足时解决\n */\nexport function promiseWhen(condition: () => boolean, ms = 10) {\n return new Promise<void>((resolve, reject) => {\n const check = () => {\n if (condition()) {\n resolve();\n } else {\n setTimeout(check, ms);\n }\n };\n\n check();\n });\n}\n\n/**\n * 创建一个与给定 Promise 共享状态的新 Promise。\n * 新的 Promise 不具备 resolve 或 reject 的能力,它仅反映原始 Promise 的状态。\n * @param promise - 要共享状态的原始 Promise。\n * @returns 一个新的 Promise,其状态与给定的 Promise 完全相同。\n * @example\n * const { promise: p1 } = Promise.withResolvers();\n * const sp1 = sharedPromise(p1);\n * const sp2 = sharedPromise(p1);\n * // 此时 sp1、sp2 完全共享 p1 的状态,自身并不具备 resolve 或 reject 的能力\n */\nexport function promiseShared<T>(promise: Promise<T>) {\n return new Promise<T>((resolve, reject) => {\n promise.then(resolve, reject);\n });\n}\n\n/**\n * 创建一个最小等待时间的函数\n * @param {number} ms - 最小等待时间(毫秒)\n * @returns {function} 返回一个异步函数,该函数会确保从 createMinDelayPromise 调用到其执行的时间至少为 ms 毫秒\n * @example\n * const end = createMinDelayPromise(1000);\n * // 执行一些操作\n * await end(); // 确保从 createMinDelayPromise 调用到这里的总时间至少为 1000 毫秒\n */\nexport function createMinDelayPromise(ms: number) {\n const startTime = Date.now();\n /**\n * 确保最小等待时间的结束函数\n * @async\n * @function end\n * @returns {Promise<void>} 在达到最小等待时间后解决\n */\n return async function end() {\n const endTime = Date.now();\n const waitTime = ms - (endTime - startTime);\n if (waitTime > 0) {\n await promiseDelay(waitTime);\n }\n };\n}\n"],"names":[],"mappings":";AAOO,SAAS,cAAiB,SAAyC;AACjE,SAAA,UAAU,OAAO,KAAM,SAAS,OAAO,KAAK,OAAQ,QAAkC,SAAS;AACxG;AAQsB,eAAA,aAAa,KAAK,GAAG,MAAwB;AAC1D,SAAA,IAAI,QAAc,CAAC,YAAY;AAC9B,UAAA,IAAI,WAAW,SAAS,EAAE;AAEhC,QAAI,MAAM;AACH,WAAA,OAAO,iBAAiB,SAAS,MAAM;AAC1C,qBAAa,CAAC;AACN,gBAAA;AAAA,MAAA,CACT;AAAA,IAAA;AAAA,EACH,CACD;AACH;AASsB,eAAA,eAAkB,SAAqB,IAAY;AACjE,QAAA,OAAO,IAAI,gBAAgB;AAC3B,QAAA,SAAS,MAAM,QAAQ,KAAK;AAAA,IAChC;AAAA,IACA,aAAa,IAAI,IAAI,EAAE,KAAK,MAAM;AAC1B,YAAA,IAAI,MAAM,SAAS;AAAA,IAC1B,CAAA;AAAA,EAAA,CACF;AACD,OAAK,MAAM;AACJ,SAAA;AACT;AAQgB,SAAA,YAAY,WAA0B,KAAK,IAAI;AAC7D,SAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,UAAM,QAAQ,MAAM;AAClB,UAAI,aAAa;AACP,gBAAA;AAAA,MAAA,OACH;AACL,mBAAW,OAAO,EAAE;AAAA,MAAA;AAAA,IAExB;AAEM,UAAA;AAAA,EAAA,CACP;AACH;AAaO,SAAS,cAAiB,SAAqB;AACpD,SAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACjC,YAAA,KAAK,SAAS,MAAM;AAAA,EAAA,CAC7B;AACH;AAWO,SAAS,sBAAsB,IAAY;AAC1C,QAAA,YAAY,KAAK,IAAI;AAO3B,SAAO,eAAe,MAAM;AACpB,UAAA,UAAU,KAAK,IAAI;AACnB,UAAA,WAAW,MAAM,UAAU;AACjC,QAAI,WAAW,GAAG;AAChB,YAAM,aAAa,QAAQ;AAAA,IAAA;AAAA,EAE/B;AACF;"}
1
+ {"version":3,"file":"promise.mjs","names":[],"sources":["../src/promise.ts"],"sourcesContent":["import { isObject, isPromise } from './type';\n\n/**\n * 检查给定的值是否为 Promise 类似对象。\n * @param unknown - 要检查的值。\n * @returns 如果值是 Promise 类似对象,则返回 `true`,否则返回 `false`。\n */\nexport function isPromiseLike<T>(unknown: unknown): unknown is Promise<T> {\n return (\n isPromise(unknown) ||\n (isObject(unknown) &&\n typeof (unknown as unknown as Promise<T>).then === 'function')\n );\n}\n\n/**\n * 等待一定时间后解决 Promise\n * @param ms - 等待的毫秒数,默认为 0\n * @param ctrl - 可选的 AbortController,用于提前终止等待\n * @returns 一个 Promise,等待指定时间后解决\n */\nexport async function promiseDelay(ms = 0, ctrl?: AbortController) {\n return new Promise<void>((resolve) => {\n const t = setTimeout(resolve, ms);\n\n if (ctrl) {\n ctrl.signal.addEventListener('abort', () => {\n clearTimeout(t);\n resolve();\n });\n }\n });\n}\n\n/**\n * 使 Promise 在指定时间内执行,超时则拒绝\n * @param promise - 要执行的 Promise\n * @param ms - 超时的毫秒数\n * @returns 如果 Promise 在指定时间内解决,则返回其结果;否则抛出 \"timeout\" 错误\n * @throws {Error} 如果 Promise 超时,抛出 \"timeout\" 错误\n */\nexport async function promiseTimeout<T>(promise: Promise<T>, ms: number) {\n const ctrl = new AbortController();\n const result = await Promise.race([\n promise,\n promiseDelay(ms, ctrl).then(() => {\n throw new Error('timeout');\n }),\n ]);\n ctrl.abort();\n return result;\n}\n\n/**\n * 在指定条件满足时解决 Promise\n * @param condition - 一个返回布尔值的函数,用于检查条件是否满足\n * @param ms - 检查条件的时间间隔(毫秒),默认为 10\n * @returns 一个 Promise,在条件满足时解决\n */\nexport function promiseWhen(condition: () => boolean, ms = 10) {\n return new Promise<void>((resolve, _reject) => {\n const check = () => {\n if (condition()) {\n resolve();\n } else {\n setTimeout(check, ms);\n }\n };\n\n check();\n });\n}\n\n/**\n * 创建一个与给定 Promise 共享状态的新 Promise。\n * 新的 Promise 不具备 resolve 或 reject 的能力,它仅反映原始 Promise 的状态。\n * @param promise - 要共享状态的原始 Promise。\n * @returns 一个新的 Promise,其状态与给定的 Promise 完全相同。\n * @example\n * const { promise: p1 } = Promise.withResolvers();\n * const sp1 = sharedPromise(p1);\n * const sp2 = sharedPromise(p1);\n * // 此时 sp1、sp2 完全共享 p1 的状态,自身并不具备 resolve 或 reject 的能力\n */\nexport function promiseShared<T>(promise: Promise<T>) {\n return new Promise<T>((resolve, reject) => {\n promise.then(resolve, reject);\n });\n}\n\n/**\n * 创建一个最小等待时间的函数\n * @param {number} ms - 最小等待时间(毫秒)\n * @returns {function} 返回一个异步函数,该函数会确保从 createMinDelayPromise 调用到其执行的时间至少为 ms 毫秒\n * @example\n * const end = createMinDelayPromise(1000);\n * // 执行一些操作\n * await end(); // 确保从 createMinDelayPromise 调用到这里的总时间至少为 1000 毫秒\n */\nexport function createMinDelayPromise(ms: number) {\n const startTime = Date.now();\n /**\n * 确保最小等待时间的结束函数\n * @async\n * @function end\n * @returns {Promise<void>} 在达到最小等待时间后解决\n */\n return async function end() {\n const endTime = Date.now();\n const waitTime = ms - (endTime - startTime);\n if (waitTime > 0) {\n await promiseDelay(waitTime);\n }\n };\n}\n"],"mappings":";;;;;;;AAOA,SAAgB,cAAiB,SAAyC;CACxE,OACE,UAAU,QAAQ,IACjB,SAAS,QAAQ,IAChB,OAAQ,QAAkC,SAAS;;;;;;;;AAUzD,eAAsB,aAAa,KAAK,GAAG,MAAwB;CACjE,OAAO,IAAI,SAAe,YAAY;EACpC,MAAM,IAAI,WAAW,SAAS,GAAG;EAEjC,IAAI,MACF,KAAK,OAAO,iBAAiB,eAAe;GAC1C,aAAa,EAAE;GACf,SAAS;IACT;GAEJ;;;;;;;;;AAUJ,eAAsB,eAAkB,SAAqB,IAAY;CACvE,MAAM,OAAO,IAAI,iBAAiB;CAClC,MAAM,SAAS,MAAM,QAAQ,KAAK,CAChC,SACA,aAAa,IAAI,KAAK,CAAC,WAAW;EAChC,MAAM,IAAI,MAAM,UAAU;GAC1B,CACH,CAAC;CACF,KAAK,OAAO;CACZ,OAAO;;;;;;;;AAST,SAAgB,YAAY,WAA0B,KAAK,IAAI;CAC7D,OAAO,IAAI,SAAe,SAAS,YAAY;EAC7C,MAAM,cAAc;GAClB,IAAI,WAAW,EACb,SAAS;QAET,WAAW,OAAO,GAAG;;EAIzB,OAAO;GACP;;;;;;;;;;;;;AAcJ,SAAgB,cAAiB,SAAqB;CACpD,OAAO,IAAI,SAAY,SAAS,WAAW;EACzC,QAAQ,KAAK,SAAS,OAAO;GAC7B;;;;;;;;;;;AAYJ,SAAgB,sBAAsB,IAAY;CAChD,MAAM,YAAY,KAAK,KAAK;;;;;;;CAO5B,OAAO,eAAe,MAAM;EAE1B,MAAM,WAAW,MADD,KAAK,KACE,GAAU;EACjC,IAAI,WAAW,GACb,MAAM,aAAa,SAAS"}
package/dist/qs.cjs CHANGED
@@ -1,47 +1,71 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const each = require("./each.cjs");
4
- const type = require("./type.cjs");
2
+ const require_type = require("./type.cjs");
3
+ const require_object = require("./object.cjs");
4
+ //#region src/qs.ts
5
+ /**
6
+ * 解析查询字符串为对象
7
+ * @template T - 返回的对象类型
8
+ * @param {string} queryString - 要解析的查询字符串
9
+ * @param {QSReader<T>} [parser] - 自定义解析函数
10
+ * @returns {T} 解析后的对象
11
+ * @example
12
+ * const obj = qsParse('name=John&age=30');
13
+ * // { name: 'John', age: '30' }
14
+ *
15
+ * const obj2 = qsParse('date=2023-01-01', (val, key) => {
16
+ * if (key === 'date') return new Date(val);
17
+ * return val;
18
+ * });
19
+ * // { date: Date('2023-01-01') }
20
+ */
5
21
  function qsParse(queryString, parser) {
6
- const sp = new globalThis.URLSearchParams(queryString.replace(/^.*\?/, ""));
7
- const qsObject = {};
8
- for (const [key, val] of sp.entries()) {
9
- const valFinal = parser ? parser(val, key, qsObject) : val;
10
- if (type.isNullish(valFinal)) continue;
11
- if (Object.hasOwn(qsObject, key)) {
12
- if (!type.isArray(qsObject[key])) qsObject[key] = [qsObject[key]];
13
- qsObject[key].push(val);
14
- } else {
15
- qsObject[key] = valFinal;
16
- }
17
- }
18
- return qsObject;
22
+ const sp = new globalThis.URLSearchParams(queryString.replace(/^.*\?/, ""));
23
+ const qsObject = {};
24
+ for (const [key, val] of sp.entries()) {
25
+ const valFinal = parser ? parser(val, key, qsObject) : val;
26
+ if (require_type.isNullish(valFinal)) continue;
27
+ if (Object.hasOwn(qsObject, key)) {
28
+ if (!require_type.isArray(qsObject[key])) qsObject[key] = [qsObject[key]];
29
+ qsObject[key].push(val);
30
+ } else qsObject[key] = valFinal;
31
+ }
32
+ return qsObject;
19
33
  }
20
- const defaultWriter = (val) => {
21
- if (type.isString(val)) return val;
22
- if (type.isNumber(val)) return String(val);
23
- if (type.isBoolean(val)) return val ? "true" : "false";
24
- if (type.isDate(val)) return val.toISOString();
25
- return null;
34
+ var defaultWriter = (val) => {
35
+ if (require_type.isString(val)) return val;
36
+ if (require_type.isNumber(val)) return String(val);
37
+ if (require_type.isBoolean(val)) return val ? "true" : "false";
38
+ if (require_type.isDate(val)) return val.toISOString();
39
+ return null;
26
40
  };
41
+ /**
42
+ * 将对象序列化为查询字符串
43
+ * @template T - 要序列化的对象类型
44
+ * @param {T} qsObject - 要序列化的对象
45
+ * @param {QSWriter<T>} [stringify=defaultWriter] - 自定义序列化函数
46
+ * @returns {string} 序列化后的查询字符串
47
+ * @example
48
+ * const str = qsStringify({ name: 'John', age: 30 });
49
+ * // 'name=John&age=30'
50
+ *
51
+ * const str2 = qsStringify({ date: new Date('2023-01-01') });
52
+ * // 'date=2023-01-01T00:00:00.000Z'
53
+ */
27
54
  function qsStringify(qsObject, stringify = defaultWriter) {
28
- const sp = new globalThis.URLSearchParams();
29
- const pushPairs = (val, key) => {
30
- const valFinal = stringify(val, String(key), qsObject);
31
- if (type.isNullish(valFinal)) return;
32
- sp.append(key, valFinal);
33
- };
34
- each.objectEach(qsObject, (val, key) => {
35
- if (type.isArray(val)) {
36
- for (const it of val) {
37
- pushPairs(it, key);
38
- }
39
- } else {
40
- pushPairs(val, key);
41
- }
42
- });
43
- return sp.toString();
55
+ const sp = new globalThis.URLSearchParams();
56
+ const pushPairs = (val, key) => {
57
+ const valFinal = stringify(val, String(key), qsObject);
58
+ if (require_type.isNullish(valFinal)) return;
59
+ sp.append(key, valFinal);
60
+ };
61
+ require_object.objectEach(qsObject, (val, key) => {
62
+ if (require_type.isArray(val)) for (const it of val) pushPairs(it, key);
63
+ else pushPairs(val, key);
64
+ });
65
+ return sp.toString();
44
66
  }
67
+ //#endregion
45
68
  exports.qsParse = qsParse;
46
69
  exports.qsStringify = qsStringify;
47
- //# sourceMappingURL=qs.cjs.map
70
+
71
+ //# sourceMappingURL=qs.cjs.map
package/dist/qs.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"qs.cjs","sources":["../src/qs.ts"],"sourcesContent":["import { objectEach } from './object';\nimport { isArray, isBoolean, isDate, isNull, isNullish, isNumber, isString, isUndefined } from './type';\nimport type { AnyObject } from './types';\n\n/**\n * 查询字符串解析函数\n * @template T - 解析后返回的对象类型\n * @callback QSReader\n * @param {string} value - 查询字符串的值\n * @param {string} key - 查询字符串的键\n * @param {T} qsObject - 当前解析的对象\n * @returns {unknown} 解析后的值,如果返回 undefined 或 null 则不会添加到对象中\n * @example\n * const parser: QSReader<MyObject> = (value, key, obj) => {\n * if (key === 'date') return new Date(value);\n * return value;\n * };\n */\nexport type QSReader<T extends AnyObject> = (value: string, key: string, qsObject: T) => unknown;\n\n/**\n * 解析查询字符串为对象\n * @template T - 返回的对象类型\n * @param {string} queryString - 要解析的查询字符串\n * @param {QSReader<T>} [parser] - 自定义解析函数\n * @returns {T} 解析后的对象\n * @example\n * const obj = qsParse('name=John&age=30');\n * // { name: 'John', age: '30' }\n *\n * const obj2 = qsParse('date=2023-01-01', (val, key) => {\n * if (key === 'date') return new Date(val);\n * return val;\n * });\n * // { date: Date('2023-01-01') }\n */\nexport function qsParse<T extends AnyObject>(queryString: string, parser?: QSReader<T>): T {\n // 添加 globalThis 是便于对接外部环境 URL 的自行实现\n // 例如在 uni-app、微信小程序等运行环境。\n const sp = new globalThis.URLSearchParams(queryString.replace(/^.*\\?/, ''));\n const qsObject = {} as T;\n\n for (const [key, val] of sp.entries()) {\n const valFinal = parser ? parser(val, key, qsObject) : val;\n\n if (isNullish(valFinal)) continue;\n\n if (Object.hasOwn(qsObject, key)) {\n // @ts-expect-error\n if (!isArray(qsObject[key])) qsObject[key] = [qsObject[key]];\n (qsObject[key] as unknown[]).push(val);\n } else {\n // @ts-expect-error\n qsObject[key] = valFinal;\n }\n }\n\n return qsObject;\n}\n\n/**\n * 查询字符串序列化函数\n * @template T - 要序列化的对象类型\n * @callback QSWriter\n * @param {unknown} value - 要序列化的值\n * @param {string} key - 对象的键\n * @param {T} query - 当前序列化的对象\n * @returns {string | null} 序列化后的字符串,如果返回 null 则忽略该键值对\n * @example\n * const writer: QSWriter<MyObject> = (val, key) => {\n * if (val instanceof Date) return val.toISOString();\n * return String(val);\n * };\n */\nexport type QSWriter<T extends AnyObject = AnyObject> = (value: unknown, key: string, query: T) => string | null;\nconst defaultWriter: QSWriter<AnyObject> = (val: unknown) => {\n if (isString(val)) return val;\n if (isNumber(val)) return String(val);\n if (isBoolean(val)) return val ? 'true' : 'false';\n if (isDate(val)) return val.toISOString();\n return null;\n};\n\n/**\n * 将对象序列化为查询字符串\n * @template T - 要序列化的对象类型\n * @param {T} qsObject - 要序列化的对象\n * @param {QSWriter<T>} [stringify=defaultWriter] - 自定义序列化函数\n * @returns {string} 序列化后的查询字符串\n * @example\n * const str = qsStringify({ name: 'John', age: 30 });\n * // 'name=John&age=30'\n *\n * const str2 = qsStringify({ date: new Date('2023-01-01') });\n * // 'date=2023-01-01T00:00:00.000Z'\n */\nexport function qsStringify<T extends AnyObject>(qsObject: T, stringify: QSWriter<T> = defaultWriter): string {\n // 添加 globalThis 是便于对接外部环境 URL 的自行实现\n // 例如在 uni-app、微信小程序等运行环境。\n const sp = new globalThis.URLSearchParams();\n const pushPairs = (val: unknown, key: string) => {\n const valFinal = stringify(val, String(key), qsObject);\n if (isNullish(valFinal)) return;\n\n sp.append(key, valFinal);\n };\n\n objectEach(qsObject, (val, key: string) => {\n if (isArray(val)) {\n for (const it of val) {\n pushPairs(it, key);\n }\n } else {\n pushPairs(val, key);\n }\n });\n\n return sp.toString();\n}\n"],"names":["isNullish","isArray","isString","isNumber","isBoolean","isDate","objectEach"],"mappings":";;;;AAoCgB,SAAA,QAA6B,aAAqB,QAAyB;AAGnF,QAAA,KAAK,IAAI,WAAW,gBAAgB,YAAY,QAAQ,SAAS,EAAE,CAAC;AAC1E,QAAM,WAAW,CAAC;AAElB,aAAW,CAAC,KAAK,GAAG,KAAK,GAAG,WAAW;AACrC,UAAM,WAAW,SAAS,OAAO,KAAK,KAAK,QAAQ,IAAI;AAEnD,QAAAA,KAAAA,UAAU,QAAQ,EAAG;AAEzB,QAAI,OAAO,OAAO,UAAU,GAAG,GAAG;AAEhC,UAAI,CAACC,KAAA,QAAQ,SAAS,GAAG,CAAC,EAAY,UAAA,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC;AAC1D,eAAS,GAAG,EAAgB,KAAK,GAAG;AAAA,IAAA,OAChC;AAEL,eAAS,GAAG,IAAI;AAAA,IAAA;AAAA,EAClB;AAGK,SAAA;AACT;AAiBA,MAAM,gBAAqC,CAAC,QAAiB;AACvD,MAAAC,KAAA,SAAS,GAAG,EAAU,QAAA;AAC1B,MAAIC,KAAS,SAAA,GAAG,EAAG,QAAO,OAAO,GAAG;AACpC,MAAIC,KAAU,UAAA,GAAG,EAAG,QAAO,MAAM,SAAS;AAC1C,MAAIC,KAAO,OAAA,GAAG,EAAG,QAAO,IAAI,YAAY;AACjC,SAAA;AACT;AAegB,SAAA,YAAiC,UAAa,YAAyB,eAAuB;AAGtG,QAAA,KAAK,IAAI,WAAW,gBAAgB;AACpC,QAAA,YAAY,CAAC,KAAc,QAAgB;AAC/C,UAAM,WAAW,UAAU,KAAK,OAAO,GAAG,GAAG,QAAQ;AACjD,QAAAL,KAAAA,UAAU,QAAQ,EAAG;AAEtB,OAAA,OAAO,KAAK,QAAQ;AAAA,EACzB;AAEWM,OAAAA,WAAA,UAAU,CAAC,KAAK,QAAgB;AACrC,QAAAL,KAAAA,QAAQ,GAAG,GAAG;AAChB,iBAAW,MAAM,KAAK;AACpB,kBAAU,IAAI,GAAG;AAAA,MAAA;AAAA,IACnB,OACK;AACL,gBAAU,KAAK,GAAG;AAAA,IAAA;AAAA,EACpB,CACD;AAED,SAAO,GAAG,SAAS;AACrB;;;"}
1
+ {"version":3,"file":"qs.cjs","names":[],"sources":["../src/qs.ts"],"sourcesContent":["import { objectEach } from './object';\nimport {\n isArray,\n isBoolean,\n isDate,\n isNullish,\n isNumber,\n isString,\n} from './type';\nimport type { AnyObject } from './types';\n\n/**\n * 查询字符串解析函数\n * @template T - 解析后返回的对象类型\n * @callback QSReader\n * @param {string} value - 查询字符串的值\n * @param {string} key - 查询字符串的键\n * @param {T} qsObject - 当前解析的对象\n * @returns {unknown} 解析后的值,如果返回 undefined 或 null 则不会添加到对象中\n * @example\n * const parser: QSReader<MyObject> = (value, key, obj) => {\n * if (key === 'date') return new Date(value);\n * return value;\n * };\n */\nexport type QSReader<T extends AnyObject> = (\n value: string,\n key: string,\n qsObject: T,\n) => unknown;\n\n/**\n * 解析查询字符串为对象\n * @template T - 返回的对象类型\n * @param {string} queryString - 要解析的查询字符串\n * @param {QSReader<T>} [parser] - 自定义解析函数\n * @returns {T} 解析后的对象\n * @example\n * const obj = qsParse('name=John&age=30');\n * // { name: 'John', age: '30' }\n *\n * const obj2 = qsParse('date=2023-01-01', (val, key) => {\n * if (key === 'date') return new Date(val);\n * return val;\n * });\n * // { date: Date('2023-01-01') }\n */\nexport function qsParse<T extends AnyObject>(\n queryString: string,\n parser?: QSReader<T>,\n): T {\n // 添加 globalThis 是便于对接外部环境 URL 的自行实现\n // 例如在 uni-app、微信小程序等运行环境。\n const sp = new globalThis.URLSearchParams(queryString.replace(/^.*\\?/, ''));\n const qsObject = {} as T;\n\n for (const [key, val] of sp.entries()) {\n const valFinal = parser ? parser(val, key, qsObject) : val;\n\n if (isNullish(valFinal)) continue;\n\n if (Object.hasOwn(qsObject, key)) {\n // @ts-expect-error\n if (!isArray(qsObject[key])) qsObject[key] = [qsObject[key]];\n (qsObject[key] as unknown[]).push(val);\n } else {\n // @ts-expect-error\n qsObject[key] = valFinal;\n }\n }\n\n return qsObject;\n}\n\n/**\n * 查询字符串序列化函数\n * @template T - 要序列化的对象类型\n * @callback QSWriter\n * @param {unknown} value - 要序列化的值\n * @param {string} key - 对象的键\n * @param {T} query - 当前序列化的对象\n * @returns {string | null} 序列化后的字符串,如果返回 null 则忽略该键值对\n * @example\n * const writer: QSWriter<MyObject> = (val, key) => {\n * if (val instanceof Date) return val.toISOString();\n * return String(val);\n * };\n */\nexport type QSWriter<T extends AnyObject = AnyObject> = (\n value: unknown,\n key: string,\n query: T,\n) => string | null;\nconst defaultWriter: QSWriter<AnyObject> = (val: unknown) => {\n if (isString(val)) return val;\n if (isNumber(val)) return String(val);\n if (isBoolean(val)) return val ? 'true' : 'false';\n if (isDate(val)) return val.toISOString();\n return null;\n};\n\n/**\n * 将对象序列化为查询字符串\n * @template T - 要序列化的对象类型\n * @param {T} qsObject - 要序列化的对象\n * @param {QSWriter<T>} [stringify=defaultWriter] - 自定义序列化函数\n * @returns {string} 序列化后的查询字符串\n * @example\n * const str = qsStringify({ name: 'John', age: 30 });\n * // 'name=John&age=30'\n *\n * const str2 = qsStringify({ date: new Date('2023-01-01') });\n * // 'date=2023-01-01T00:00:00.000Z'\n */\nexport function qsStringify<T extends AnyObject>(\n qsObject: T,\n stringify: QSWriter<T> = defaultWriter,\n): string {\n // 添加 globalThis 是便于对接外部环境 URL 的自行实现\n // 例如在 uni-app、微信小程序等运行环境。\n const sp = new globalThis.URLSearchParams();\n const pushPairs = (val: unknown, key: string) => {\n const valFinal = stringify(val, String(key), qsObject);\n if (isNullish(valFinal)) return;\n\n sp.append(key, valFinal);\n };\n\n objectEach(qsObject, (val, key: string) => {\n if (isArray(val)) {\n for (const it of val) {\n pushPairs(it, key);\n }\n } else {\n pushPairs(val, key);\n }\n });\n\n return sp.toString();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA+CA,SAAgB,QACd,aACA,QACG;CAGH,MAAM,KAAK,IAAI,WAAW,gBAAgB,YAAY,QAAQ,SAAS,GAAG,CAAC;CAC3E,MAAM,WAAW,EAAE;CAEnB,KAAK,MAAM,CAAC,KAAK,QAAQ,GAAG,SAAS,EAAE;EACrC,MAAM,WAAW,SAAS,OAAO,KAAK,KAAK,SAAS,GAAG;EAEvD,IAAI,aAAA,UAAU,SAAS,EAAE;EAEzB,IAAI,OAAO,OAAO,UAAU,IAAI,EAAE;GAEhC,IAAI,CAAC,aAAA,QAAQ,SAAS,KAAK,EAAE,SAAS,OAAO,CAAC,SAAS,KAAK;GAC5D,SAAU,KAAmB,KAAK,IAAI;SAGtC,SAAS,OAAO;;CAIpB,OAAO;;AAsBT,IAAM,iBAAsC,QAAiB;CAC3D,IAAI,aAAA,SAAS,IAAI,EAAE,OAAO;CAC1B,IAAI,aAAA,SAAS,IAAI,EAAE,OAAO,OAAO,IAAI;CACrC,IAAI,aAAA,UAAU,IAAI,EAAE,OAAO,MAAM,SAAS;CAC1C,IAAI,aAAA,OAAO,IAAI,EAAE,OAAO,IAAI,aAAa;CACzC,OAAO;;;;;;;;;;;;;;;AAgBT,SAAgB,YACd,UACA,YAAyB,eACjB;CAGR,MAAM,KAAK,IAAI,WAAW,iBAAiB;CAC3C,MAAM,aAAa,KAAc,QAAgB;EAC/C,MAAM,WAAW,UAAU,KAAK,OAAO,IAAI,EAAE,SAAS;EACtD,IAAI,aAAA,UAAU,SAAS,EAAE;EAEzB,GAAG,OAAO,KAAK,SAAS;;CAG1B,eAAA,WAAW,WAAW,KAAK,QAAgB;EACzC,IAAI,aAAA,QAAQ,IAAI,EACd,KAAK,MAAM,MAAM,KACf,UAAU,IAAI,IAAI;OAGpB,UAAU,KAAK,IAAI;GAErB;CAEF,OAAO,GAAG,UAAU"}
package/dist/qs.mjs CHANGED
@@ -1,47 +1,69 @@
1
- import { o as objectEach } from "./each.mjs";
2
- import { isNullish, isArray, isString, isNumber, isBoolean, isDate } from "./type.mjs";
1
+ import { isArray, isBoolean, isDate, isNullish, isNumber, isString } from "./type.mjs";
2
+ import { objectEach } from "./object.mjs";
3
+ //#region src/qs.ts
4
+ /**
5
+ * 解析查询字符串为对象
6
+ * @template T - 返回的对象类型
7
+ * @param {string} queryString - 要解析的查询字符串
8
+ * @param {QSReader<T>} [parser] - 自定义解析函数
9
+ * @returns {T} 解析后的对象
10
+ * @example
11
+ * const obj = qsParse('name=John&age=30');
12
+ * // { name: 'John', age: '30' }
13
+ *
14
+ * const obj2 = qsParse('date=2023-01-01', (val, key) => {
15
+ * if (key === 'date') return new Date(val);
16
+ * return val;
17
+ * });
18
+ * // { date: Date('2023-01-01') }
19
+ */
3
20
  function qsParse(queryString, parser) {
4
- const sp = new globalThis.URLSearchParams(queryString.replace(/^.*\?/, ""));
5
- const qsObject = {};
6
- for (const [key, val] of sp.entries()) {
7
- const valFinal = parser ? parser(val, key, qsObject) : val;
8
- if (isNullish(valFinal)) continue;
9
- if (Object.hasOwn(qsObject, key)) {
10
- if (!isArray(qsObject[key])) qsObject[key] = [qsObject[key]];
11
- qsObject[key].push(val);
12
- } else {
13
- qsObject[key] = valFinal;
14
- }
15
- }
16
- return qsObject;
21
+ const sp = new globalThis.URLSearchParams(queryString.replace(/^.*\?/, ""));
22
+ const qsObject = {};
23
+ for (const [key, val] of sp.entries()) {
24
+ const valFinal = parser ? parser(val, key, qsObject) : val;
25
+ if (isNullish(valFinal)) continue;
26
+ if (Object.hasOwn(qsObject, key)) {
27
+ if (!isArray(qsObject[key])) qsObject[key] = [qsObject[key]];
28
+ qsObject[key].push(val);
29
+ } else qsObject[key] = valFinal;
30
+ }
31
+ return qsObject;
17
32
  }
18
- const defaultWriter = (val) => {
19
- if (isString(val)) return val;
20
- if (isNumber(val)) return String(val);
21
- if (isBoolean(val)) return val ? "true" : "false";
22
- if (isDate(val)) return val.toISOString();
23
- return null;
33
+ var defaultWriter = (val) => {
34
+ if (isString(val)) return val;
35
+ if (isNumber(val)) return String(val);
36
+ if (isBoolean(val)) return val ? "true" : "false";
37
+ if (isDate(val)) return val.toISOString();
38
+ return null;
24
39
  };
40
+ /**
41
+ * 将对象序列化为查询字符串
42
+ * @template T - 要序列化的对象类型
43
+ * @param {T} qsObject - 要序列化的对象
44
+ * @param {QSWriter<T>} [stringify=defaultWriter] - 自定义序列化函数
45
+ * @returns {string} 序列化后的查询字符串
46
+ * @example
47
+ * const str = qsStringify({ name: 'John', age: 30 });
48
+ * // 'name=John&age=30'
49
+ *
50
+ * const str2 = qsStringify({ date: new Date('2023-01-01') });
51
+ * // 'date=2023-01-01T00:00:00.000Z'
52
+ */
25
53
  function qsStringify(qsObject, stringify = defaultWriter) {
26
- const sp = new globalThis.URLSearchParams();
27
- const pushPairs = (val, key) => {
28
- const valFinal = stringify(val, String(key), qsObject);
29
- if (isNullish(valFinal)) return;
30
- sp.append(key, valFinal);
31
- };
32
- objectEach(qsObject, (val, key) => {
33
- if (isArray(val)) {
34
- for (const it of val) {
35
- pushPairs(it, key);
36
- }
37
- } else {
38
- pushPairs(val, key);
39
- }
40
- });
41
- return sp.toString();
54
+ const sp = new globalThis.URLSearchParams();
55
+ const pushPairs = (val, key) => {
56
+ const valFinal = stringify(val, String(key), qsObject);
57
+ if (isNullish(valFinal)) return;
58
+ sp.append(key, valFinal);
59
+ };
60
+ objectEach(qsObject, (val, key) => {
61
+ if (isArray(val)) for (const it of val) pushPairs(it, key);
62
+ else pushPairs(val, key);
63
+ });
64
+ return sp.toString();
42
65
  }
43
- export {
44
- qsParse,
45
- qsStringify
46
- };
47
- //# sourceMappingURL=qs.mjs.map
66
+ //#endregion
67
+ export { qsParse, qsStringify };
68
+
69
+ //# sourceMappingURL=qs.mjs.map