@fast-china/utils 2.1.2 → 2.1.4

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 (51) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +1 -1
  3. package/README.zh.md +1 -1
  4. package/dist/array/index.d.mts +11 -12
  5. package/dist/async/index.d.mts +13 -14
  6. package/dist/async/index.mjs +7 -5
  7. package/dist/async/index.mjs.map +1 -1
  8. package/dist/base64/index.d.mts +13 -13
  9. package/dist/color/index.d.mts +10 -11
  10. package/dist/crypto/index.d.mts +38 -39
  11. package/dist/crypto/index.mjs +9 -4
  12. package/dist/crypto/index.mjs.map +1 -1
  13. package/dist/date/index.d.mts +23 -24
  14. package/dist/dom/style.d.mts +5 -6
  15. package/dist/env/index.d.mts +9 -10
  16. package/dist/env/index.mjs +17 -10
  17. package/dist/env/index.mjs.map +1 -1
  18. package/dist/identity/index.d.mts +5 -6
  19. package/dist/index.global.min.js +2 -2
  20. package/dist/index.global.min.js.map +1 -1
  21. package/dist/internal/runtime.mjs +12 -0
  22. package/dist/internal/runtime.mjs.map +1 -0
  23. package/dist/internal/text.d.mts +2 -4
  24. package/dist/internal/text.mjs +4 -3
  25. package/dist/internal/text.mjs.map +1 -1
  26. package/dist/logger/index.d.mts +7 -8
  27. package/dist/logger/index.mjs +2 -1
  28. package/dist/logger/index.mjs.map +1 -1
  29. package/dist/number/index.d.mts +9 -10
  30. package/dist/number/index.mjs +4 -3
  31. package/dist/number/index.mjs.map +1 -1
  32. package/dist/object/index.d.mts +10 -11
  33. package/dist/storage/index.d.mts +10 -11
  34. package/dist/storage/index.mjs +4 -3
  35. package/dist/storage/index.mjs.map +1 -1
  36. package/dist/string/index.d.mts +18 -19
  37. package/dist/string/index.mjs +15 -13
  38. package/dist/string/index.mjs.map +1 -1
  39. package/dist/vue/emits.d.mts +2 -3
  40. package/dist/vue/expose.d.mts +1 -2
  41. package/dist/vue/func.d.mts +2 -3
  42. package/dist/vue/install.d.mts +6 -7
  43. package/dist/vue/install.mjs.map +1 -1
  44. package/dist/vue/props.d.mts +2 -3
  45. package/dist/vue/render.d.mts +1 -2
  46. package/dist/vue/slots.d.mts +3 -4
  47. package/dist/vue/with.d.mts +1 -2
  48. package/docs/API.md +1 -1
  49. package/docs/API.zh-CN.md +1 -1
  50. package/docs/RUNTIME_CONTRACT.md +2 -2
  51. package/package.json +11 -11
package/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  All notable changes to Fast.Utils are documented in this file.
4
4
 
5
+ ## [2.1.4] - 2026-09-11
6
+
7
+ ### Changed
8
+
9
+ - Removed broad repository-specific ESLint rule overrides and resolved all resulting errors and warnings with focused source and test updates.
10
+ - Centralized optional host capabilities behind a typed internal runtime view while keeping standard property and method calls, synchronous Promise argument validation, shared throttle Promise identity, public generic types, and the legacy clipboard fallback.
11
+
12
+ ## [2.1.3] - 2026-08-30
13
+
14
+ ### Changed
15
+
16
+ - Changed chainable `.parseJson<T = any>()` to return the original string when decoded Crypto/Base64 text is not valid JSON instead of throwing a syntax error.
17
+ - Kept Storage codecs strict so malformed persisted JSON continues to fail explicitly rather than using the text fallback.
18
+
5
19
  ## [2.1.2] - 2026-08-30
6
20
 
7
21
  ### Added
@@ -87,6 +101,8 @@ All notable changes to Fast.Utils are documented in this file.
87
101
 
88
102
  - Added authenticated ciphertext validation, bounded crypto parameters and payloads, unbiased Web Crypto randomness, prototype-safe query/object transforms, and namespace-scoped Storage cleanup.
89
103
 
104
+ [2.1.4]: https://github.com/China-xiaoFang/Fast.Utils/compare/v2.1.3...v2.1.4
105
+ [2.1.3]: https://github.com/China-xiaoFang/Fast.Utils/compare/v2.1.2...v2.1.3
90
106
  [2.1.2]: https://github.com/China-xiaoFang/Fast.Utils/compare/v2.1.1...v2.1.2
91
107
  [2.1.1]: https://github.com/China-xiaoFang/Fast.Utils/compare/v2.1.0...v2.1.1
92
108
  [2.1.0]: https://github.com/China-xiaoFang/Fast.Utils/compare/v2.0.3...v2.1.0
package/README.md CHANGED
@@ -129,7 +129,7 @@ const jsonPayload = await AESEncryptWithPassword('{"id":1}', "correct horse batt
129
129
  const result = (await AESDecryptWithPassword(jsonPayload, "correct horse battery staple")).parseJson<{ id: number }>();
130
130
  ```
131
131
 
132
- Base64 and Crypto text decoding/decryption functions return the primitive-string `DecodedText` type, which can be used directly as a `string`; JSON is parsed only by an explicit `.parseJson<T = any>()` call. The first text decode lazily installs a non-enumerable `String.prototype.parseJson`; a foreign method with the same name causes an explicit conflict error. The generic type does not validate the runtime structure of untrusted JSON.
132
+ Base64 and Crypto text decoding/decryption functions return the primitive-string `DecodedText` type, which can be used directly as a `string`; an explicit `.parseJson<T = any>()` call attempts JSON parsing and returns the original string when parsing fails. The first text decode lazily installs a non-enumerable `String.prototype.parseJson`; a foreign method with the same name causes an explicit conflict error. The generic type does not validate untrusted JSON or guarantee an object result at runtime.
133
133
 
134
134
  Store passwords with `HashPasswordPBKDF2SHA256` and `VerifyPasswordPBKDF2SHA256`. MD5, SHA-1, AES-CBC, and AES-ECB do not provide password-storage or authenticated-encryption guarantees. See the [API reference](./docs/API.md#crypto) for the complete method list and security boundaries.
135
135
 
package/README.zh.md CHANGED
@@ -129,7 +129,7 @@ const jsonPayload = await AESEncryptWithPassword('{"id":1}', "correct horse batt
129
129
  const result = (await AESDecryptWithPassword(jsonPayload, "correct horse battery staple")).parseJson<{ id: number }>();
130
130
  ```
131
131
 
132
- Base64 与 Crypto 的文本解码/解密入口返回原始字符串类型 `DecodedText`,可以直接作为 `string` 使用;只有显式调用 `.parseJson<T = any>()` 才解析 JSON。首次文本解码会按需安装不可枚举的 `String.prototype.parseJson`,若同名方法已被其他实现占用则明确抛错。泛型不会验证不可信 JSON 的实际结构。
132
+ Base64 与 Crypto 的文本解码/解密入口返回原始字符串类型 `DecodedText`,可以直接作为 `string` 使用;只有显式调用 `.parseJson<T = any>()` 才尝试解析 JSON,解析失败时直接返回原始字符串。首次文本解码会按需安装不可枚举的 `String.prototype.parseJson`,若同名方法已被其他实现占用则明确抛错。泛型不会验证不可信 JSON 的实际结构,也不保证运行时结果一定是对象。
133
133
 
134
134
  密码存储使用 `HashPasswordPBKDF2SHA256` 和 `VerifyPasswordPBKDF2SHA256`。MD5、SHA-1、AES-CBC 与 AES-ECB 不提供密码存储或认证加密保证。完整方法列表和安全边界见 [API 文档](./docs/API.zh-CN.md#crypto)。
135
135
 
@@ -1,6 +1,6 @@
1
1
  //#region src/array/index.d.ts
2
2
  /** 从数组项中提取可比较键的函数。 */
3
- type KeySelector<Item, Key> = (item: Item, index: number) => Key;
3
+ export type KeySelector<Item, Key> = (item: Item, index: number) => Key;
4
4
  /**
5
5
  * 将只读数组按固定大小分组。
6
6
  *
@@ -10,21 +10,21 @@ type KeySelector<Item, Key> = (item: Item, index: number) => Key;
10
10
  * @returns 新建的二维数组;最后一组可能小于 `size`。
11
11
  * @throws `RangeError` 当 `size` 不是正安全整数。
12
12
  */
13
- declare function chunk<Item>(items: readonly Item[], size: number): Item[][];
13
+ export declare function chunk<Item>(items: readonly Item[], size: number): Item[][];
14
14
  /**
15
15
  * 删除数组中的 `null` 与 `undefined`,保留 `false`、`0` 和空字符串。
16
16
  *
17
17
  * @param items - 可包含空值的只读数组。
18
18
  * @returns 保持原顺序的新数组。
19
19
  */
20
- declare function removeNullishValues<Item>(items: readonly (Item | null | undefined)[]): Item[];
20
+ export declare function removeNullishValues<Item>(items: readonly (Item | null | undefined)[]): Item[];
21
21
  /**
22
22
  * 使用 JavaScript `Set` 的 SameValueZero 语义去重。
23
23
  *
24
24
  * @param items - 不会被修改的输入数组。
25
25
  * @returns 保留每个值首次出现顺序的新数组;稀疏数组空位被忽略。
26
26
  */
27
- declare function unique<Item>(items: readonly Item[]): Item[];
27
+ export declare function unique<Item>(items: readonly Item[]): Item[];
28
28
  /**
29
29
  * 按选择器返回的键去重。
30
30
  *
@@ -32,7 +32,7 @@ declare function unique<Item>(items: readonly Item[]): Item[];
32
32
  * @param selectKey - 接收项目与索引并返回去重键的函数。
33
33
  * @returns 保留每个键首次出现项目的新数组;稀疏数组空位被忽略。
34
34
  */
35
- declare function uniqueBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): Item[];
35
+ export declare function uniqueBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): Item[];
36
36
  /**
37
37
  * 按选择器结果分组。
38
38
  *
@@ -40,7 +40,7 @@ declare function uniqueBy<Item, Key>(items: readonly Item[], selectKey: KeySelec
40
40
  * @param selectKey - 返回任意 `Map` 键的函数。
41
41
  * @returns 按键首次出现顺序排列的 `Map`;每个分组保持输入顺序,稀疏空位被忽略。
42
42
  */
43
- declare function groupBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): Map<Key, Item[]>;
43
+ export declare function groupBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): Map<Key, Item[]>;
44
44
  /**
45
45
  * 按谓词把数组拆分为匹配项和非匹配项。
46
46
  *
@@ -48,7 +48,7 @@ declare function groupBy<Item, Key>(items: readonly Item[], selectKey: KeySelect
48
48
  * @param predicate - 接收项目与索引的判断函数。
49
49
  * @returns 二元组:第一项匹配谓词,第二项不匹配;两组都保持原顺序并忽略稀疏空位。
50
50
  */
51
- declare function partition<Item>(items: readonly Item[], predicate: (item: Item, index: number) => boolean): [matched: Item[], unmatched: Item[]];
51
+ export declare function partition<Item>(items: readonly Item[], predicate: (item: Item, index: number) => boolean): [matched: Item[], unmatched: Item[]];
52
52
  /**
53
53
  * 返回只出现在左侧数组中的不同值。
54
54
  *
@@ -56,7 +56,7 @@ declare function partition<Item>(items: readonly Item[], predicate: (item: Item,
56
56
  * @param right - 需要排除的值。
57
57
  * @returns 保留左侧首次出现顺序的去重结果;两侧稀疏空位都被忽略。
58
58
  */
59
- declare function difference<Item>(left: readonly Item[], right: readonly Item[]): Item[];
59
+ export declare function difference<Item>(left: readonly Item[], right: readonly Item[]): Item[];
60
60
  /**
61
61
  * 返回两个数组共有的不同值。
62
62
  *
@@ -64,7 +64,7 @@ declare function difference<Item>(left: readonly Item[], right: readonly Item[])
64
64
  * @param right - 用于成员判断的数组。
65
65
  * @returns 保留左侧首次出现顺序的去重结果;两侧稀疏空位都被忽略。
66
66
  */
67
- declare function intersection<Item>(left: readonly Item[], right: readonly Item[]): Item[];
67
+ export declare function intersection<Item>(left: readonly Item[], right: readonly Item[]): Item[];
68
68
  /**
69
69
  * 判断选择器产生的键是否重复。
70
70
  *
@@ -72,7 +72,7 @@ declare function intersection<Item>(left: readonly Item[], right: readonly Item[
72
72
  * @param selectKey - 返回比较键的函数;键使用 SameValueZero 语义比较。
73
73
  * @returns 存在至少一个重复键时返回 `true`。
74
74
  */
75
- declare function hasDuplicatesBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): boolean;
75
+ export declare function hasDuplicatesBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): boolean;
76
76
  /**
77
77
  * 判断所有项目是否具有相同的选择器结果。
78
78
  *
@@ -81,7 +81,6 @@ declare function hasDuplicatesBy<Item, Key>(items: readonly Item[], selectKey: K
81
81
  * @param selectKey - 返回比较键的函数。
82
82
  * @returns 所有键都满足 SameValueZero 相等时返回 `true`。
83
83
  */
84
- declare function allEqualBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): boolean;
84
+ export declare function allEqualBy<Item, Key>(items: readonly Item[], selectKey: KeySelector<Item, Key>): boolean;
85
85
  //#endregion
86
- export { KeySelector, allEqualBy, chunk, difference, groupBy, hasDuplicatesBy, intersection, partition, removeNullishValues, unique, uniqueBy };
87
86
  //# sourceMappingURL=index.d.mts.map
@@ -2,24 +2,24 @@
2
2
  /** 统一同步返回值与 PromiseLike 返回值的内部回调签名。 */
3
3
  type AsyncCallback<Arguments extends unknown[], Result> = (...arguments_: Arguments) => Result | PromiseLike<Result>;
4
4
  /** 可接收取消信号的通用选项。 */
5
- interface AbortOptions {
5
+ export interface AbortOptions {
6
6
  /** 已取消时立即失败;运行期间取消时停止等待并拒绝 Promise。 */
7
7
  signal?: AbortSignal;
8
8
  }
9
9
  /** {@link withTimeout} 的行为选项。 */
10
- interface TimeoutOptions extends AbortOptions {
10
+ export interface TimeoutOptions extends AbortOptions {
11
11
  /** 超时时使用的开发者消息。 */
12
12
  message?: string;
13
13
  }
14
14
  /** 每次重试操作接收的上下文。 */
15
- interface RetryContext {
15
+ export interface RetryContext {
16
16
  /** 从 1 开始的当前尝试次数。 */
17
17
  attempt: number;
18
18
  /** 调用方提供的取消信号。 */
19
19
  signal?: AbortSignal;
20
20
  }
21
21
  /** {@link retry} 的策略选项。 */
22
- interface RetryOptions extends AbortOptions {
22
+ export interface RetryOptions extends AbortOptions {
23
23
  /** 最大尝试次数,包含首次调用;默认 `3`。 */
24
24
  attempts?: number;
25
25
  /** 首次重试前的等待毫秒数,最大 2,147,483,647;默认 `200`。 */
@@ -37,12 +37,12 @@ interface RetryOptions extends AbortOptions {
37
37
  shouldRetry?: (error: unknown, context: RetryContext) => boolean | PromiseLike<boolean>;
38
38
  }
39
39
  /** {@link mapConcurrent} 的执行选项。 */
40
- interface ConcurrentMapOptions {
40
+ export interface ConcurrentMapOptions {
41
41
  /** 已取消时停止调度新任务;已经开始的映射器需要自行响应同一信号。 */
42
42
  signal?: AbortSignal;
43
43
  }
44
44
  /** Promise 感知的防抖函数。 */
45
- interface DebouncedFunction<Arguments extends unknown[], Result> {
45
+ export interface DebouncedFunction<Arguments extends unknown[], Result> {
46
46
  /**
47
47
  * 调度一次调用;同一等待窗口内的调用共享最后一组参数对应的结果。
48
48
  * @param arguments_ - 传给原始回调的参数;后续调用会覆盖尚未执行批次保存的参数。
@@ -63,7 +63,7 @@ interface DebouncedFunction<Arguments extends unknown[], Result> {
63
63
  pending: () => boolean;
64
64
  }
65
65
  /** Promise 感知的前缘节流函数。 */
66
- interface ThrottledFunction<Arguments extends unknown[], Result> {
66
+ export interface ThrottledFunction<Arguments extends unknown[], Result> {
67
67
  /**
68
68
  * 在空闲时立即调用原始回调;执行期和冷却期内的调用共享首次调用的 Promise。
69
69
  * @param arguments_ - 仅窗口内首次调用的参数会传给原始回调。
@@ -83,7 +83,7 @@ interface ThrottledFunction<Arguments extends unknown[], Result> {
83
83
  * @returns 到期后完成的 Promise。
84
84
  * @throws 取消时抛出名称为 `AbortError` 的 `Error`;参数非法时抛出 `RangeError`。
85
85
  */
86
- declare function sleep(milliseconds: number, options?: AbortOptions): Promise<void>;
86
+ export declare function sleep(milliseconds: number, options?: AbortOptions): Promise<void>;
87
87
  /**
88
88
  * 为 Promise 增加等待上限。
89
89
  *
@@ -95,7 +95,7 @@ declare function sleep(milliseconds: number, options?: AbortOptions): Promise<vo
95
95
  * @returns 底层 Promise 的结果。
96
96
  * @throws 超时抛出 `Error`,取消时抛出名称为 `AbortError` 的 `Error`;等待时间非法时抛出 `RangeError`。
97
97
  */
98
- declare function withTimeout<Result>(promise: PromiseLike<Result>, timeoutMs: number, options?: TimeoutOptions): Promise<Result>;
98
+ export declare function withTimeout<Result>(promise: PromiseLike<Result>, timeoutMs: number, options?: TimeoutOptions): Promise<Result>;
99
99
  /**
100
100
  * 使用有上限的指数退避重试操作。
101
101
  *
@@ -105,7 +105,7 @@ declare function withTimeout<Result>(promise: PromiseLike<Result>, timeoutMs: nu
105
105
  * @returns 首次成功结果。
106
106
  * @throws 最后一次操作错误、`shouldRetry` 错误或名称为 `AbortError` 的取消错误;策略参数非法时抛出 `RangeError`。
107
107
  */
108
- declare function retry<Result>(operation: (context: RetryContext) => Result | PromiseLike<Result>, options?: RetryOptions): Promise<Awaited<Result>>;
108
+ export declare function retry<Result>(operation: (context: RetryContext) => Result | PromiseLike<Result>, options?: RetryOptions): Promise<Awaited<Result>>;
109
109
  /**
110
110
  * 以固定并发度映射数组,并保持结果顺序。
111
111
  *
@@ -118,7 +118,7 @@ declare function retry<Result>(operation: (context: RetryContext) => Result | Pr
118
118
  * @returns 与输入长度和顺序一致的结果数组;稀疏空位保持为空位且不会调用映射器。
119
119
  * @throws `RangeError` 当 `concurrency` 不是正安全整数;取消时抛出名称为 `AbortError` 的 `Error`。
120
120
  */
121
- declare function mapConcurrent<Item, Result>(items: readonly Item[], concurrency: number, mapper: (item: Item, index: number, signal: AbortSignal | undefined) => Result | PromiseLike<Result>, options?: ConcurrentMapOptions): Promise<Awaited<Result>[]>;
121
+ export declare function mapConcurrent<Item, Result>(items: readonly Item[], concurrency: number, mapper: (item: Item, index: number, signal: AbortSignal | undefined) => Result | PromiseLike<Result>, options?: ConcurrentMapOptions): Promise<Awaited<Result>[]>;
122
122
  /**
123
123
  * 创建 Promise 感知的防抖函数。
124
124
  *
@@ -129,7 +129,7 @@ declare function mapConcurrent<Item, Result>(items: readonly Item[], concurrency
129
129
  * @returns 具有取消、立即执行和状态方法的防抖函数。
130
130
  * @throws `RangeError` 当延迟不在平台计时器支持范围内。
131
131
  */
132
- declare function debounce<Arguments extends unknown[], Result>(callback: AsyncCallback<Arguments, Result>, delayMs?: number): DebouncedFunction<Arguments, Awaited<Result>>;
132
+ export declare function debounce<Arguments extends unknown[], Result>(callback: AsyncCallback<Arguments, Result>, delayMs?: number): DebouncedFunction<Arguments, Awaited<Result>>;
133
133
  /**
134
134
  * 创建 Promise 感知的前缘节流函数。
135
135
  *
@@ -140,7 +140,6 @@ declare function debounce<Arguments extends unknown[], Result>(callback: AsyncCa
140
140
  * @returns 具有取消和状态方法的前缘节流函数。
141
141
  * @throws `RangeError` 当延迟不在平台计时器支持范围内。
142
142
  */
143
- declare function throttle<Arguments extends unknown[], Result>(callback: AsyncCallback<Arguments, Result>, delayMs?: number): ThrottledFunction<Arguments, Awaited<Result>>;
143
+ export declare function throttle<Arguments extends unknown[], Result>(callback: AsyncCallback<Arguments, Result>, delayMs?: number): ThrottledFunction<Arguments, Awaited<Result>>;
144
144
  //#endregion
145
- export { AbortOptions, ConcurrentMapOptions, DebouncedFunction, RetryContext, RetryOptions, ThrottledFunction, TimeoutOptions, debounce, mapConcurrent, retry, sleep, throttle, withTimeout };
146
145
  //# sourceMappingURL=index.d.mts.map
@@ -189,7 +189,7 @@ async function mapConcurrent(items, concurrency, mapper, options = {}) {
189
189
  }
190
190
  };
191
191
  const workerCount = Math.min(concurrency, items.length);
192
- await Promise.all(Array.from({ length: workerCount }, () => worker()));
192
+ await Promise.all(Array.from({ length: workerCount }, worker));
193
193
  return results;
194
194
  }
195
195
  /**
@@ -245,10 +245,12 @@ function debounce(callback, delayMs = 300) {
245
245
  timer = setTimeout(() => {
246
246
  execute().catch(() => void 0);
247
247
  }, delay);
248
- return new Promise((resolve, reject) => waiters.push({
249
- reject,
250
- resolve
251
- }));
248
+ return new Promise((resolve, reject) => {
249
+ waiters.push({
250
+ reject,
251
+ resolve
252
+ });
253
+ });
252
254
  };
253
255
  debounced.cancel = (reason) => {
254
256
  if (timer !== void 0) clearTimeout(timer);
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/async/index.ts"],"sourcesContent":["/** 统一同步返回值与 PromiseLike 返回值的内部回调签名。 */\ntype AsyncCallback<Arguments extends unknown[], Result> = (...arguments_: Arguments) => Result | PromiseLike<Result>;\n\n/** 记录同一防抖批次中每个调用方独立的 Promise 结算函数。 */\ninterface PromiseWaiter<Result> {\n\t/**\n\t * 使用批次失败原因拒绝当前调用方。\n\t * @param reason - `cancel` 提供的原因或共享回调抛出的原始错误。\n\t */\n\treject: (reason?: unknown) => void;\n\t/**\n\t * 使用共享回调结果完成当前调用方,并采用传入 PromiseLike 的最终状态。\n\t * @param value - 当前防抖批次唯一一次回调执行产生的共享结果。\n\t */\n\tresolve: (value: Result | PromiseLike<Result>) => void;\n}\n\n// 浏览器和 Node.js 的计时器普遍以有符号 32 位整数保存延迟;更大的值可能被\n// 静默截断为约 1 ms,因此公共 API 在进入平台计时器前统一拒绝它。\nconst maximumTimerDelay = 2_147_483_647;\n\n/** 可接收取消信号的通用选项。 */\nexport interface AbortOptions {\n\t/** 已取消时立即失败;运行期间取消时停止等待并拒绝 Promise。 */\n\tsignal?: AbortSignal;\n}\n\n/** {@link withTimeout} 的行为选项。 */\nexport interface TimeoutOptions extends AbortOptions {\n\t/** 超时时使用的开发者消息。 */\n\tmessage?: string;\n}\n\n/** 每次重试操作接收的上下文。 */\nexport interface RetryContext {\n\t/** 从 1 开始的当前尝试次数。 */\n\tattempt: number;\n\t/** 调用方提供的取消信号。 */\n\tsignal?: AbortSignal;\n}\n\n/** {@link retry} 的策略选项。 */\nexport interface RetryOptions extends AbortOptions {\n\t/** 最大尝试次数,包含首次调用;默认 `3`。 */\n\tattempts?: number;\n\t/** 首次重试前的等待毫秒数,最大 2,147,483,647;默认 `200`。 */\n\tdelayMs?: number;\n\t/** 每次失败后的退避倍数,必须不小于 1;默认 `2`。 */\n\tfactor?: number;\n\t/** 单次等待上限,最大 2,147,483,647;默认 `30_000` 毫秒。 */\n\tmaxDelayMs?: number;\n\t/**\n\t * 决定当前失败后是否继续下一次尝试;默认重试所有尚未到达上限的错误。\n\t * @param error - 当前操作抛出或拒绝的原始值。\n\t * @param context - 当前尝试次数和调用方取消信号。\n\t * @returns `false` 时立即原样抛出当前错误;支持同步值或 PromiseLike。\n\t */\n\tshouldRetry?: (error: unknown, context: RetryContext) => boolean | PromiseLike<boolean>;\n}\n\n/** {@link mapConcurrent} 的执行选项。 */\nexport interface ConcurrentMapOptions {\n\t/** 已取消时停止调度新任务;已经开始的映射器需要自行响应同一信号。 */\n\tsignal?: AbortSignal;\n}\n\n/** Promise 感知的防抖函数。 */\nexport interface DebouncedFunction<Arguments extends unknown[], Result> {\n\t/**\n\t * 调度一次调用;同一等待窗口内的调用共享最后一组参数对应的结果。\n\t * @param arguments_ - 传给原始回调的参数;后续调用会覆盖尚未执行批次保存的参数。\n\t * @returns 当前批次的独立 Promise,最终与共享回调结果保持相同状态。\n\t */\n\t(...arguments_: Arguments): Promise<Result>;\n\t/**\n\t * 取消尚未执行的批次,并拒绝该批次的所有 Promise。\n\t * @param reason - 可选拒绝原因;省略时使用内部取消错误。\n\t */\n\tcancel: (reason?: unknown) => void;\n\t/**\n\t * 立即执行待处理批次,不创建第二次回调执行。\n\t * @returns 待处理批次的共享执行 Promise;没有批次时返回 `undefined`。\n\t */\n\tflush: () => Promise<Result> | undefined;\n\t/** @returns 当前存在尚未开始的批次时返回 `true`;正在执行但没有等待批次时返回 `false`。 */\n\tpending: () => boolean;\n}\n\n/** Promise 感知的前缘节流函数。 */\nexport interface ThrottledFunction<Arguments extends unknown[], Result> {\n\t/**\n\t * 在空闲时立即调用原始回调;执行期和冷却期内的调用共享首次调用的 Promise。\n\t * @param arguments_ - 仅窗口内首次调用的参数会传给原始回调。\n\t * @returns 当前执行窗口共享的 Promise。\n\t */\n\t(...arguments_: Arguments): Promise<Result>;\n\t/** 提前结束冷却期;已经开始的操作不会被取消,结束前仍禁止并发重入。 */\n\tcancel: () => void;\n\t/** @returns 原始回调正在执行或计时器仍处于冷却期时返回 `true`。 */\n\tpending: () => boolean;\n}\n\n/**\n * 创建符合 Web Platform 约定的取消错误。\n *\n * @param signal - 已进入取消状态的信号;其 `reason` 会保存在错误的 `cause` 中。\n * @returns 名称为 `AbortError` 的新错误实例。\n */\nconst createAbortError = (signal: AbortSignal): Error => {\n\tconst error = new Error(\"操作已取消。\", { cause: signal.reason });\n\terror.name = \"AbortError\";\n\treturn error;\n};\n\n/**\n * 在启动异步工作前同步拒绝已经取消的信号。\n *\n * @param signal - 可选取消信号;省略或尚未取消时不执行操作。\n * @throws `Error` 当信号已经取消,错误名称为 `AbortError`。\n */\nconst throwIfAborted = (signal: AbortSignal | undefined): void => {\n\tif (signal?.aborted) throw createAbortError(signal);\n};\n\n/**\n * 校验宿主计时器可以稳定表示的延迟。\n *\n * @param milliseconds - 待校验的毫秒数。\n * @param name - 用于错误消息的参数名称。\n * @returns 原始延迟值,便于调用方在校验后直接使用。\n * @throws `RangeError` 当值非有限、为负数或超过 32 位计时器上限。\n */\nconst assertDelay = (milliseconds: number, name = \"milliseconds\"): number => {\n\tif (!Number.isFinite(milliseconds) || milliseconds < 0 || milliseconds > maximumTimerDelay) {\n\t\tthrow new RangeError(`\\`${name}\\` 必须是 0 到 ${maximumTimerDelay} 之间的有限数。`);\n\t}\n\treturn milliseconds;\n};\n\n/**\n * 等待指定时间,并支持 `AbortSignal`。\n *\n * @param milliseconds - 0 至 2,147,483,647 的有限毫秒数。\n * @param options - 可选取消信号。\n * @returns 到期后完成的 Promise。\n * @throws 取消时抛出名称为 `AbortError` 的 `Error`;参数非法时抛出 `RangeError`。\n */\nexport function sleep(milliseconds: number, options: AbortOptions = {}): Promise<void> {\n\tconst delay = assertDelay(milliseconds);\n\tconst signal = options.signal;\n\tthrowIfAborted(signal);\n\n\treturn new Promise<void>((resolve, reject) => {\n\t\tlet timer: ReturnType<typeof setTimeout>;\n\t\t/** 取消计时器并使用标准取消错误拒绝等待。 */\n\t\tfunction onAbort(): void {\n\t\t\tif (signal === undefined) return;\n\t\t\tclearTimeout(timer);\n\t\t\treject(createAbortError(signal));\n\t\t}\n\t\ttimer = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, delay);\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\n/**\n * 为 Promise 增加等待上限。\n *\n * @remarks 超时或取消只停止等待,不能自动取消底层操作;需要真正取消时应同时把\n * 同一个 `AbortSignal` 传给底层 API。\n * @param promise - 需要等待的 Promise 或 PromiseLike。\n * @param timeoutMs - 0 至 2,147,483,647 的有限等待时间。\n * @param options - 取消信号与自定义消息。\n * @returns 底层 Promise 的结果。\n * @throws 超时抛出 `Error`,取消时抛出名称为 `AbortError` 的 `Error`;等待时间非法时抛出 `RangeError`。\n */\nexport function withTimeout<Result>(promise: PromiseLike<Result>, timeoutMs: number, options: TimeoutOptions = {}): Promise<Result> {\n\tconst delay = assertDelay(timeoutMs, \"timeoutMs\");\n\tconst signal = options.signal;\n\tthrowIfAborted(signal);\n\n\treturn new Promise<Result>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet timer: ReturnType<typeof setTimeout>;\n\t\t/** 清理竞争结束后不再需要的计时器和监听器。 */\n\t\tfunction cleanup(): void {\n\t\t\tclearTimeout(timer);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t\t/**\n\t\t * 只允许 Promise、超时和取消三个竞争来源中的首个结果生效。\n\t\t *\n\t\t * @param action - 首个完成来源的结算动作。\n\t\t */\n\t\tfunction settle(action: () => void): void {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\taction();\n\t\t}\n\t\t/** 使用调用方取消原因结束当前等待。 */\n\t\tfunction onAbort(): void {\n\t\t\tif (signal === undefined) return;\n\t\t\tsettle(() => {\n\t\t\t\treject(createAbortError(signal));\n\t\t\t});\n\t\t}\n\t\ttimer = setTimeout(() => {\n\t\t\tsettle(() => {\n\t\t\t\treject(new Error(options.message ?? `操作超过 ${delay} 毫秒仍未完成。`));\n\t\t\t});\n\t\t}, delay);\n\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tPromise.resolve(promise).then(\n\t\t\t(value) => {\n\t\t\t\tsettle(() => {\n\t\t\t\t\tresolve(value);\n\t\t\t\t});\n\t\t\t},\n\t\t\t(error: unknown) => {\n\t\t\t\tsettle(() => {\n\t\t\t\t\treject(error);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\t});\n}\n\n/**\n * 使用有上限的指数退避重试操作。\n *\n * @typeParam Result - 操作结果类型。\n * @param operation - 每次尝试都会调用的函数;`attempt` 从 1 开始。\n * @param options - 尝试次数、退避和取消策略。\n * @returns 首次成功结果。\n * @throws 最后一次操作错误、`shouldRetry` 错误或名称为 `AbortError` 的取消错误;策略参数非法时抛出 `RangeError`。\n */\nexport async function retry<Result>(\n\toperation: (context: RetryContext) => Result | PromiseLike<Result>,\n\toptions: RetryOptions = {}\n): Promise<Awaited<Result>> {\n\tconst attempts = options.attempts ?? 3;\n\tconst initialDelay = assertDelay(options.delayMs ?? 200, \"delayMs\");\n\tconst maximumDelay = assertDelay(options.maxDelayMs ?? 30_000, \"maxDelayMs\");\n\tconst factor = options.factor ?? 2;\n\tif (!Number.isSafeInteger(attempts) || attempts <= 0) throw new RangeError(\"`attempts` 必须是正安全整数。\");\n\tif (!Number.isFinite(factor) || factor < 1) throw new RangeError(\"`factor` 必须是大于或等于 1 的有限数。\");\n\n\tfor (let attempt = 1; attempt <= attempts; attempt += 1) {\n\t\tthrowIfAborted(options.signal);\n\t\tconst context: RetryContext = options.signal === undefined ? { attempt } : { attempt, signal: options.signal };\n\t\ttry {\n\t\t\treturn await operation(context);\n\t\t} catch (error) {\n\t\t\tif (attempt === attempts || (options.shouldRetry !== undefined && !(await options.shouldRetry(error, context)))) throw error;\n\t\t\t// `0 * Infinity` is `NaN`; a zero initial delay must remain zero even when\n\t\t\t// a very large factor overflows during a later attempt.\n\t\t\tconst delay = initialDelay === 0 ? 0 : Math.min(initialDelay * factor ** (attempt - 1), maximumDelay);\n\t\t\tawait sleep(delay, options.signal === undefined ? {} : { signal: options.signal });\n\t\t}\n\t}\n\n\tthrow new Error(\"重试结束但未获得结果。\");\n}\n\n/**\n * 以固定并发度映射数组,并保持结果顺序。\n *\n * @remarks 任一映射失败后不会再调度新项目,但已经开始的映射无法自动取消;映射器\n * 应使用传入的 `signal` 取消底层工作。\n * @param items - 不会被修改的输入数组。\n * @param concurrency - 同时运行的最大任务数,必须为正安全整数。\n * @param mapper - 接收项目、索引和取消信号的映射函数。\n * @param options - 可选取消信号。\n * @returns 与输入长度和顺序一致的结果数组;稀疏空位保持为空位且不会调用映射器。\n * @throws `RangeError` 当 `concurrency` 不是正安全整数;取消时抛出名称为 `AbortError` 的 `Error`。\n */\nexport async function mapConcurrent<Item, Result>(\n\titems: readonly Item[],\n\tconcurrency: number,\n\tmapper: (item: Item, index: number, signal: AbortSignal | undefined) => Result | PromiseLike<Result>,\n\toptions: ConcurrentMapOptions = {}\n): Promise<Awaited<Result>[]> {\n\tif (!Number.isSafeInteger(concurrency) || concurrency <= 0) {\n\t\tthrow new RangeError(\"`concurrency` 必须是正安全整数。\");\n\t}\n\tthrowIfAborted(options.signal);\n\n\tconst results = new Array<Awaited<Result>>(items.length);\n\tlet nextIndex = 0;\n\tlet failed = false;\n\t/**\n\t * 从共享游标持续领取映射任务。\n\t *\n\t * @remarks JavaScript 单线程执行保证“读取索引并递增”不会被另一个 Worker 插入,因此每个索引只会领取一次。\n\t * @returns 当前 Worker 没有剩余任务时完成。\n\t * @throws 原样传播取消错误或 Mapper 错误,并阻止其他 Worker 领取新任务。\n\t */\n\tconst worker = async (): Promise<void> => {\n\t\twhile (!failed) {\n\t\t\tthrowIfAborted(options.signal);\n\t\t\tconst index = nextIndex;\n\t\t\tif (index >= items.length) return;\n\t\t\tnextIndex += 1;\n\t\t\tif (!(index in items)) continue;\n\t\t\ttry {\n\t\t\t\tresults[index] = await mapper(items[index] as Item, index, options.signal);\n\t\t\t} catch (error) {\n\t\t\t\tfailed = true;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t};\n\n\tconst workerCount = Math.min(concurrency, items.length);\n\tawait Promise.all(Array.from({ length: workerCount }, () => worker()));\n\treturn results;\n}\n\n/**\n * 创建 Promise 感知的防抖函数。\n *\n * @remarks 同一窗口内的所有调用都会等待最后一组参数对应的执行结果;回调错误会原样\n * 拒绝该批次的全部调用,不会留下永久 pending 的 Promise。\n * @param callback - 同步或异步回调。\n * @param delayMs - 0 至 2,147,483,647 的有限等待时间,默认 300 毫秒。\n * @returns 具有取消、立即执行和状态方法的防抖函数。\n * @throws `RangeError` 当延迟不在平台计时器支持范围内。\n */\nexport function debounce<Arguments extends unknown[], Result>(\n\tcallback: AsyncCallback<Arguments, Result>,\n\tdelayMs = 300\n): DebouncedFunction<Arguments, Awaited<Result>> {\n\tconst delay = assertDelay(delayMs, \"delayMs\");\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet latestArguments: Arguments | undefined;\n\tlet waiters: PromiseWaiter<Awaited<Result>>[] = [];\n\n\t/**\n\t * 执行并结算当前防抖批次。\n\t *\n\t * @returns 最后一组参数对应的回调结果。\n\t * @throws 没有待处理批次时抛出 `Error`;回调错误会原样传播给批次中的全部调用方。\n\t */\n\tconst execute = async (): Promise<Awaited<Result>> => {\n\t\tconst arguments_ = latestArguments;\n\t\tif (arguments_ === undefined) {\n\t\t\tthrow new Error(\"当前没有待处理的防抖调用。\");\n\t\t}\n\t\tlatestArguments = undefined;\n\t\ttimer = undefined;\n\t\tconst currentWaiters = waiters;\n\t\twaiters = [];\n\t\ttry {\n\t\t\tconst result = await callback(...arguments_);\n\t\t\tcurrentWaiters.forEach((waiter) => {\n\t\t\t\twaiter.resolve(result);\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tcurrentWaiters.forEach((waiter) => {\n\t\t\t\twaiter.reject(error);\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\t/**\n\t * 更新批次参数并返回当前调用方专属的等待 Promise。\n\t *\n\t * @param arguments_ - 本次调用参数;同批次中只有最后一组参数会执行。\n\t * @returns 与当前批次共享结果、但可独立结算的 Promise。\n\t */\n\tconst debounced = (...arguments_: Arguments): Promise<Awaited<Result>> => {\n\t\tlatestArguments = arguments_;\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = setTimeout(() => {\n\t\t\tvoid execute().catch(() => undefined);\n\t\t}, delay);\n\t\treturn new Promise<Awaited<Result>>((resolve, reject) => waiters.push({ reject, resolve }));\n\t};\n\n\tdebounced.cancel = (reason?: unknown): void => {\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = undefined;\n\t\tlatestArguments = undefined;\n\t\tconst error = reason ?? new Error(\"防抖调用已取消。\");\n\t\twaiters.forEach((waiter) => {\n\t\t\twaiter.reject(error);\n\t\t});\n\t\twaiters = [];\n\t};\n\tdebounced.flush = (): Promise<Awaited<Result>> | undefined => {\n\t\tif (timer === undefined) return undefined;\n\t\tclearTimeout(timer);\n\t\treturn execute();\n\t};\n\tdebounced.pending = (): boolean => timer !== undefined;\n\treturn debounced;\n}\n\n/**\n * 创建 Promise 感知的前缘节流函数。\n *\n * @remarks 窗口内的调用共享首次调用结果。若回调执行时间超过窗口,后续调用仍会等待\n * 当前回调,避免异步操作重入;该函数不安排尾缘调用。\n * @param callback - 同步或异步回调。\n * @param delayMs - 0 至 2,147,483,647 的有限冷却时间,默认 300 毫秒。\n * @returns 具有取消和状态方法的前缘节流函数。\n * @throws `RangeError` 当延迟不在平台计时器支持范围内。\n */\nexport function throttle<Arguments extends unknown[], Result>(\n\tcallback: AsyncCallback<Arguments, Result>,\n\tdelayMs = 300\n): ThrottledFunction<Arguments, Awaited<Result>> {\n\tconst delay = assertDelay(delayMs, \"delayMs\");\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet current: Promise<Awaited<Result>> | undefined;\n\tlet cooling = false;\n\tlet settled = false;\n\n\t/**\n\t * 尝试释放当前节流窗口。\n\t *\n\t * @remarks 只有回调和冷却计时器都结束后才清空共享 Promise,避免长回调发生重入。\n\t */\n\tconst release = (): void => {\n\t\tif (!cooling && settled) current = undefined;\n\t};\n\t/**\n\t * 执行前缘调用或复用当前窗口的共享 Promise。\n\t *\n\t * @param arguments_ - 仅新窗口首个调用会使用的参数。\n\t * @returns 当前窗口首次调用的 Promise。\n\t */\n\tconst throttled = (...arguments_: Arguments): Promise<Awaited<Result>> => {\n\t\tif (current !== undefined) return current;\n\t\tcooling = true;\n\t\tsettled = false;\n\t\tlet invocation: Promise<Awaited<Result>>;\n\t\ttry {\n\t\t\tinvocation = Promise.resolve(callback(...arguments_));\n\t\t} catch (error) {\n\t\t\tinvocation = Promise.reject(error);\n\t\t}\n\t\tcurrent = invocation;\n\t\tinvocation.then(\n\t\t\t() => {\n\t\t\t\tsettled = true;\n\t\t\t\trelease();\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tsettled = true;\n\t\t\t\trelease();\n\t\t\t}\n\t\t);\n\t\ttimer = setTimeout(() => {\n\t\t\ttimer = undefined;\n\t\t\tcooling = false;\n\t\t\trelease();\n\t\t}, delay);\n\t\treturn invocation;\n\t};\n\n\tthrottled.cancel = (): void => {\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = undefined;\n\t\tcooling = false;\n\t\trelease();\n\t};\n\tthrottled.pending = (): boolean => current !== undefined;\n\treturn throttled;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/async/index.ts"],"sourcesContent":["/** 统一同步返回值与 PromiseLike 返回值的内部回调签名。 */\ntype AsyncCallback<Arguments extends unknown[], Result> = (...arguments_: Arguments) => Result | PromiseLike<Result>;\n\n/** 记录同一防抖批次中每个调用方独立的 Promise 结算函数。 */\ninterface PromiseWaiter<Result> {\n\t/**\n\t * 使用批次失败原因拒绝当前调用方。\n\t * @param reason - `cancel` 提供的原因或共享回调抛出的原始错误。\n\t */\n\treject: (reason?: unknown) => void;\n\t/**\n\t * 使用共享回调结果完成当前调用方,并采用传入 PromiseLike 的最终状态。\n\t * @param value - 当前防抖批次唯一一次回调执行产生的共享结果。\n\t */\n\tresolve: (value: Result | PromiseLike<Result>) => void;\n}\n\n// 浏览器和 Node.js 的计时器普遍以有符号 32 位整数保存延迟;更大的值可能被\n// 静默截断为约 1 ms,因此公共 API 在进入平台计时器前统一拒绝它。\nconst maximumTimerDelay = 2_147_483_647;\n\n/** 可接收取消信号的通用选项。 */\nexport interface AbortOptions {\n\t/** 已取消时立即失败;运行期间取消时停止等待并拒绝 Promise。 */\n\tsignal?: AbortSignal;\n}\n\n/** {@link withTimeout} 的行为选项。 */\nexport interface TimeoutOptions extends AbortOptions {\n\t/** 超时时使用的开发者消息。 */\n\tmessage?: string;\n}\n\n/** 每次重试操作接收的上下文。 */\nexport interface RetryContext {\n\t/** 从 1 开始的当前尝试次数。 */\n\tattempt: number;\n\t/** 调用方提供的取消信号。 */\n\tsignal?: AbortSignal;\n}\n\n/** {@link retry} 的策略选项。 */\nexport interface RetryOptions extends AbortOptions {\n\t/** 最大尝试次数,包含首次调用;默认 `3`。 */\n\tattempts?: number;\n\t/** 首次重试前的等待毫秒数,最大 2,147,483,647;默认 `200`。 */\n\tdelayMs?: number;\n\t/** 每次失败后的退避倍数,必须不小于 1;默认 `2`。 */\n\tfactor?: number;\n\t/** 单次等待上限,最大 2,147,483,647;默认 `30_000` 毫秒。 */\n\tmaxDelayMs?: number;\n\t/**\n\t * 决定当前失败后是否继续下一次尝试;默认重试所有尚未到达上限的错误。\n\t * @param error - 当前操作抛出或拒绝的原始值。\n\t * @param context - 当前尝试次数和调用方取消信号。\n\t * @returns `false` 时立即原样抛出当前错误;支持同步值或 PromiseLike。\n\t */\n\tshouldRetry?: (error: unknown, context: RetryContext) => boolean | PromiseLike<boolean>;\n}\n\n/** {@link mapConcurrent} 的执行选项。 */\nexport interface ConcurrentMapOptions {\n\t/** 已取消时停止调度新任务;已经开始的映射器需要自行响应同一信号。 */\n\tsignal?: AbortSignal;\n}\n\n/** Promise 感知的防抖函数。 */\nexport interface DebouncedFunction<Arguments extends unknown[], Result> {\n\t/**\n\t * 调度一次调用;同一等待窗口内的调用共享最后一组参数对应的结果。\n\t * @param arguments_ - 传给原始回调的参数;后续调用会覆盖尚未执行批次保存的参数。\n\t * @returns 当前批次的独立 Promise,最终与共享回调结果保持相同状态。\n\t */\n\t(...arguments_: Arguments): Promise<Result>;\n\t/**\n\t * 取消尚未执行的批次,并拒绝该批次的所有 Promise。\n\t * @param reason - 可选拒绝原因;省略时使用内部取消错误。\n\t */\n\tcancel: (reason?: unknown) => void;\n\t/**\n\t * 立即执行待处理批次,不创建第二次回调执行。\n\t * @returns 待处理批次的共享执行 Promise;没有批次时返回 `undefined`。\n\t */\n\tflush: () => Promise<Result> | undefined;\n\t/** @returns 当前存在尚未开始的批次时返回 `true`;正在执行但没有等待批次时返回 `false`。 */\n\tpending: () => boolean;\n}\n\n/** Promise 感知的前缘节流函数。 */\nexport interface ThrottledFunction<Arguments extends unknown[], Result> {\n\t/**\n\t * 在空闲时立即调用原始回调;执行期和冷却期内的调用共享首次调用的 Promise。\n\t * @param arguments_ - 仅窗口内首次调用的参数会传给原始回调。\n\t * @returns 当前执行窗口共享的 Promise。\n\t */\n\t(...arguments_: Arguments): Promise<Result>;\n\t/** 提前结束冷却期;已经开始的操作不会被取消,结束前仍禁止并发重入。 */\n\tcancel: () => void;\n\t/** @returns 原始回调正在执行或计时器仍处于冷却期时返回 `true`。 */\n\tpending: () => boolean;\n}\n\n/**\n * 创建符合 Web Platform 约定的取消错误。\n *\n * @param signal - 已进入取消状态的信号;其 `reason` 会保存在错误的 `cause` 中。\n * @returns 名称为 `AbortError` 的新错误实例。\n */\nconst createAbortError = (signal: AbortSignal): Error => {\n\tconst error = new Error(\"操作已取消。\", { cause: signal.reason });\n\terror.name = \"AbortError\";\n\treturn error;\n};\n\n/**\n * 在启动异步工作前同步拒绝已经取消的信号。\n *\n * @param signal - 可选取消信号;省略或尚未取消时不执行操作。\n * @throws `Error` 当信号已经取消,错误名称为 `AbortError`。\n */\nconst throwIfAborted = (signal: AbortSignal | undefined): void => {\n\tif (signal?.aborted) throw createAbortError(signal);\n};\n\n/**\n * 校验宿主计时器可以稳定表示的延迟。\n *\n * @param milliseconds - 待校验的毫秒数。\n * @param name - 用于错误消息的参数名称。\n * @returns 原始延迟值,便于调用方在校验后直接使用。\n * @throws `RangeError` 当值非有限、为负数或超过 32 位计时器上限。\n */\nconst assertDelay = (milliseconds: number, name = \"milliseconds\"): number => {\n\tif (!Number.isFinite(milliseconds) || milliseconds < 0 || milliseconds > maximumTimerDelay) {\n\t\tthrow new RangeError(`\\`${name}\\` 必须是 0 到 ${maximumTimerDelay} 之间的有限数。`);\n\t}\n\treturn milliseconds;\n};\n\n/**\n * 等待指定时间,并支持 `AbortSignal`。\n *\n * @param milliseconds - 0 至 2,147,483,647 的有限毫秒数。\n * @param options - 可选取消信号。\n * @returns 到期后完成的 Promise。\n * @throws 取消时抛出名称为 `AbortError` 的 `Error`;参数非法时抛出 `RangeError`。\n */\n// eslint-disable-next-line @typescript-eslint/promise-function-async -- 参数校验必须在调用时同步抛错,async 会把异常改成 rejected Promise。\nexport function sleep(milliseconds: number, options: AbortOptions = {}): Promise<void> {\n\tconst delay = assertDelay(milliseconds);\n\tconst signal = options.signal;\n\tthrowIfAborted(signal);\n\n\treturn new Promise<void>((resolve, reject) => {\n\t\tlet timer: ReturnType<typeof setTimeout>;\n\t\t/** 取消计时器并使用标准取消错误拒绝等待。 */\n\t\tfunction onAbort(): void {\n\t\t\tif (signal === undefined) return;\n\t\t\tclearTimeout(timer);\n\t\t\treject(createAbortError(signal));\n\t\t}\n\t\ttimer = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, delay);\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\n/**\n * 为 Promise 增加等待上限。\n *\n * @remarks 超时或取消只停止等待,不能自动取消底层操作;需要真正取消时应同时把\n * 同一个 `AbortSignal` 传给底层 API。\n * @param promise - 需要等待的 Promise 或 PromiseLike。\n * @param timeoutMs - 0 至 2,147,483,647 的有限等待时间。\n * @param options - 取消信号与自定义消息。\n * @returns 底层 Promise 的结果。\n * @throws 超时抛出 `Error`,取消时抛出名称为 `AbortError` 的 `Error`;等待时间非法时抛出 `RangeError`。\n */\n// eslint-disable-next-line @typescript-eslint/promise-function-async -- 参数校验必须同步抛错,且返回值直接代表本次竞争结果。\nexport function withTimeout<Result>(promise: PromiseLike<Result>, timeoutMs: number, options: TimeoutOptions = {}): Promise<Result> {\n\tconst delay = assertDelay(timeoutMs, \"timeoutMs\");\n\tconst signal = options.signal;\n\tthrowIfAborted(signal);\n\n\treturn new Promise<Result>((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet timer: ReturnType<typeof setTimeout>;\n\t\t/** 清理竞争结束后不再需要的计时器和监听器。 */\n\t\tfunction cleanup(): void {\n\t\t\tclearTimeout(timer);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t}\n\t\t/**\n\t\t * 只允许 Promise、超时和取消三个竞争来源中的首个结果生效。\n\t\t *\n\t\t * @param action - 首个完成来源的结算动作。\n\t\t */\n\t\tfunction settle(action: () => void): void {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\taction();\n\t\t}\n\t\t/** 使用调用方取消原因结束当前等待。 */\n\t\tfunction onAbort(): void {\n\t\t\tif (signal === undefined) return;\n\t\t\tsettle(() => {\n\t\t\t\treject(createAbortError(signal));\n\t\t\t});\n\t\t}\n\t\ttimer = setTimeout(() => {\n\t\t\tsettle(() => {\n\t\t\t\treject(new Error(options.message ?? `操作超过 ${delay} 毫秒仍未完成。`));\n\t\t\t});\n\t\t}, delay);\n\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tPromise.resolve(promise).then(\n\t\t\t(value) => {\n\t\t\t\tsettle(() => {\n\t\t\t\t\tresolve(value);\n\t\t\t\t});\n\t\t\t},\n\t\t\t(error: unknown) => {\n\t\t\t\tsettle(() => {\n\t\t\t\t\treject(error);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\t});\n}\n\n/**\n * 使用有上限的指数退避重试操作。\n *\n * @typeParam Result - 操作结果类型。\n * @param operation - 每次尝试都会调用的函数;`attempt` 从 1 开始。\n * @param options - 尝试次数、退避和取消策略。\n * @returns 首次成功结果。\n * @throws 最后一次操作错误、`shouldRetry` 错误或名称为 `AbortError` 的取消错误;策略参数非法时抛出 `RangeError`。\n */\nexport async function retry<Result>(\n\toperation: (context: RetryContext) => Result | PromiseLike<Result>,\n\toptions: RetryOptions = {}\n): Promise<Awaited<Result>> {\n\tconst attempts = options.attempts ?? 3;\n\tconst initialDelay = assertDelay(options.delayMs ?? 200, \"delayMs\");\n\tconst maximumDelay = assertDelay(options.maxDelayMs ?? 30_000, \"maxDelayMs\");\n\tconst factor = options.factor ?? 2;\n\tif (!Number.isSafeInteger(attempts) || attempts <= 0) throw new RangeError(\"`attempts` 必须是正安全整数。\");\n\tif (!Number.isFinite(factor) || factor < 1) throw new RangeError(\"`factor` 必须是大于或等于 1 的有限数。\");\n\n\tfor (let attempt = 1; attempt <= attempts; attempt += 1) {\n\t\tthrowIfAborted(options.signal);\n\t\tconst context: RetryContext = options.signal === undefined ? { attempt } : { attempt, signal: options.signal };\n\t\ttry {\n\t\t\treturn await operation(context);\n\t\t} catch (error) {\n\t\t\tif (attempt === attempts || (options.shouldRetry !== undefined && !(await options.shouldRetry(error, context)))) throw error;\n\t\t\t// `0 * Infinity` is `NaN`; a zero initial delay must remain zero even when\n\t\t\t// a very large factor overflows during a later attempt.\n\t\t\tconst delay = initialDelay === 0 ? 0 : Math.min(initialDelay * factor ** (attempt - 1), maximumDelay);\n\t\t\tawait sleep(delay, options.signal === undefined ? {} : { signal: options.signal });\n\t\t}\n\t}\n\n\tthrow new Error(\"重试结束但未获得结果。\");\n}\n\n/**\n * 以固定并发度映射数组,并保持结果顺序。\n *\n * @remarks 任一映射失败后不会再调度新项目,但已经开始的映射无法自动取消;映射器\n * 应使用传入的 `signal` 取消底层工作。\n * @param items - 不会被修改的输入数组。\n * @param concurrency - 同时运行的最大任务数,必须为正安全整数。\n * @param mapper - 接收项目、索引和取消信号的映射函数。\n * @param options - 可选取消信号。\n * @returns 与输入长度和顺序一致的结果数组;稀疏空位保持为空位且不会调用映射器。\n * @throws `RangeError` 当 `concurrency` 不是正安全整数;取消时抛出名称为 `AbortError` 的 `Error`。\n */\nexport async function mapConcurrent<Item, Result>(\n\titems: readonly Item[],\n\tconcurrency: number,\n\tmapper: (item: Item, index: number, signal: AbortSignal | undefined) => Result | PromiseLike<Result>,\n\toptions: ConcurrentMapOptions = {}\n): Promise<Awaited<Result>[]> {\n\tif (!Number.isSafeInteger(concurrency) || concurrency <= 0) {\n\t\tthrow new RangeError(\"`concurrency` 必须是正安全整数。\");\n\t}\n\tthrowIfAborted(options.signal);\n\n\tconst results = new Array<Awaited<Result>>(items.length);\n\tlet nextIndex = 0;\n\tlet failed = false;\n\t/**\n\t * 从共享游标持续领取映射任务。\n\t *\n\t * @remarks JavaScript 单线程执行保证“读取索引并递增”不会被另一个 Worker 插入,因此每个索引只会领取一次。\n\t * @returns 当前 Worker 没有剩余任务时完成。\n\t * @throws 原样传播取消错误或 Mapper 错误,并阻止其他 Worker 领取新任务。\n\t */\n\tconst worker = async (): Promise<void> => {\n\t\twhile (!failed) {\n\t\t\tthrowIfAborted(options.signal);\n\t\t\tconst index = nextIndex;\n\t\t\tif (index >= items.length) return;\n\t\t\tnextIndex += 1;\n\t\t\tif (!(index in items)) continue;\n\t\t\ttry {\n\t\t\t\tresults[index] = await mapper(items[index] as Item, index, options.signal);\n\t\t\t} catch (error) {\n\t\t\t\tfailed = true;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t};\n\n\tconst workerCount = Math.min(concurrency, items.length);\n\tawait Promise.all(Array.from({ length: workerCount }, worker));\n\treturn results;\n}\n\n/**\n * 创建 Promise 感知的防抖函数。\n *\n * @remarks 同一窗口内的所有调用都会等待最后一组参数对应的执行结果;回调错误会原样\n * 拒绝该批次的全部调用,不会留下永久 pending 的 Promise。\n * @param callback - 同步或异步回调。\n * @param delayMs - 0 至 2,147,483,647 的有限等待时间,默认 300 毫秒。\n * @returns 具有取消、立即执行和状态方法的防抖函数。\n * @throws `RangeError` 当延迟不在平台计时器支持范围内。\n */\nexport function debounce<Arguments extends unknown[], Result>(\n\tcallback: AsyncCallback<Arguments, Result>,\n\tdelayMs = 300\n): DebouncedFunction<Arguments, Awaited<Result>> {\n\tconst delay = assertDelay(delayMs, \"delayMs\");\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet latestArguments: Arguments | undefined;\n\tlet waiters: PromiseWaiter<Awaited<Result>>[] = [];\n\n\t/**\n\t * 执行并结算当前防抖批次。\n\t *\n\t * @returns 最后一组参数对应的回调结果。\n\t * @throws 没有待处理批次时抛出 `Error`;回调错误会原样传播给批次中的全部调用方。\n\t */\n\tconst execute = async (): Promise<Awaited<Result>> => {\n\t\tconst arguments_ = latestArguments;\n\t\tif (arguments_ === undefined) {\n\t\t\tthrow new Error(\"当前没有待处理的防抖调用。\");\n\t\t}\n\t\tlatestArguments = undefined;\n\t\ttimer = undefined;\n\t\tconst currentWaiters = waiters;\n\t\twaiters = [];\n\t\ttry {\n\t\t\tconst result = await callback(...arguments_);\n\t\t\tcurrentWaiters.forEach((waiter) => {\n\t\t\t\twaiter.resolve(result);\n\t\t\t});\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tcurrentWaiters.forEach((waiter) => {\n\t\t\t\twaiter.reject(error);\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\t/**\n\t * 更新批次参数并返回当前调用方专属的等待 Promise。\n\t *\n\t * @param arguments_ - 本次调用参数;同批次中只有最后一组参数会执行。\n\t * @returns 与当前批次共享结果、但可独立结算的 Promise。\n\t */\n\t// eslint-disable-next-line @typescript-eslint/promise-function-async -- 每次调用返回独立的可取消等待 Promise,不增加 async 包装层。\n\tconst debounced = (...arguments_: Arguments): Promise<Awaited<Result>> => {\n\t\tlatestArguments = arguments_;\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = setTimeout(() => {\n\t\t\texecute().catch(() => undefined);\n\t\t}, delay);\n\t\treturn new Promise<Awaited<Result>>((resolve, reject) => {\n\t\t\twaiters.push({ reject, resolve });\n\t\t});\n\t};\n\n\tdebounced.cancel = (reason?: unknown): void => {\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = undefined;\n\t\tlatestArguments = undefined;\n\t\tconst error = reason ?? new Error(\"防抖调用已取消。\");\n\t\twaiters.forEach((waiter) => {\n\t\t\twaiter.reject(error);\n\t\t});\n\t\twaiters = [];\n\t};\n\tdebounced.flush = (): Promise<Awaited<Result>> | undefined => {\n\t\tif (timer === undefined) return undefined;\n\t\tclearTimeout(timer);\n\t\treturn execute();\n\t};\n\tdebounced.pending = (): boolean => timer !== undefined;\n\treturn debounced;\n}\n\n/**\n * 创建 Promise 感知的前缘节流函数。\n *\n * @remarks 窗口内的调用共享首次调用结果。若回调执行时间超过窗口,后续调用仍会等待\n * 当前回调,避免异步操作重入;该函数不安排尾缘调用。\n * @param callback - 同步或异步回调。\n * @param delayMs - 0 至 2,147,483,647 的有限冷却时间,默认 300 毫秒。\n * @returns 具有取消和状态方法的前缘节流函数。\n * @throws `RangeError` 当延迟不在平台计时器支持范围内。\n */\nexport function throttle<Arguments extends unknown[], Result>(\n\tcallback: AsyncCallback<Arguments, Result>,\n\tdelayMs = 300\n): ThrottledFunction<Arguments, Awaited<Result>> {\n\tconst delay = assertDelay(delayMs, \"delayMs\");\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tlet current: Promise<Awaited<Result>> | undefined;\n\tlet cooling = false;\n\tlet settled = false;\n\n\t/**\n\t * 尝试释放当前节流窗口。\n\t *\n\t * @remarks 只有回调和冷却计时器都结束后才清空共享 Promise,避免长回调发生重入。\n\t */\n\tconst release = (): void => {\n\t\tif (!cooling && settled) current = undefined;\n\t};\n\t/**\n\t * 执行前缘调用或复用当前窗口的共享 Promise。\n\t *\n\t * @param arguments_ - 仅新窗口首个调用会使用的参数。\n\t * @returns 当前窗口首次调用的 Promise。\n\t */\n\t// eslint-disable-next-line @typescript-eslint/promise-function-async -- 同一节流窗口必须返回完全相同的 Promise 引用。\n\tconst throttled = (...arguments_: Arguments): Promise<Awaited<Result>> => {\n\t\tif (current !== undefined) return current;\n\t\tcooling = true;\n\t\tsettled = false;\n\t\tlet invocation: Promise<Awaited<Result>>;\n\t\ttry {\n\t\t\tinvocation = Promise.resolve(callback(...arguments_));\n\t\t} catch (error) {\n\t\t\tinvocation = Promise.reject(error);\n\t\t}\n\t\tcurrent = invocation;\n\t\tinvocation.then(\n\t\t\t() => {\n\t\t\t\tsettled = true;\n\t\t\t\trelease();\n\t\t\t},\n\t\t\t() => {\n\t\t\t\tsettled = true;\n\t\t\t\trelease();\n\t\t\t}\n\t\t);\n\t\ttimer = setTimeout(() => {\n\t\t\ttimer = undefined;\n\t\t\tcooling = false;\n\t\t\trelease();\n\t\t}, delay);\n\t\treturn invocation;\n\t};\n\n\tthrottled.cancel = (): void => {\n\t\tif (timer !== undefined) clearTimeout(timer);\n\t\ttimer = undefined;\n\t\tcooling = false;\n\t\trelease();\n\t};\n\tthrottled.pending = (): boolean => current !== undefined;\n\treturn throttled;\n}\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ import { DecodedText } from "../internal/text.mjs";
6
6
  * @param bytes - 不会被修改的字节序列。
7
7
  * @returns 带标准 `=` 填充的 Base64 文本。
8
8
  */
9
- declare function encodeBase64Bytes(bytes: Uint8Array): string;
9
+ export declare function encodeBase64Bytes(bytes: Uint8Array): string;
10
10
  /**
11
11
  * 解码标准 Base64。
12
12
  *
@@ -15,7 +15,7 @@ declare function encodeBase64Bytes(bytes: Uint8Array): string;
15
15
  * @returns 新建的字节数组。
16
16
  * @throws 输入非法时抛出 `TypeError`。
17
17
  */
18
- declare function decodeBase64Bytes(value: string): Uint8Array;
18
+ export declare function decodeBase64Bytes(value: string): Uint8Array;
19
19
  /**
20
20
  * 将 UTF-8 文本编码为标准 Base64。
21
21
  *
@@ -23,7 +23,7 @@ declare function decodeBase64Bytes(value: string): Uint8Array;
23
23
  * @returns 带标准填充的 Base64 文本。
24
24
  * @throws 缺少 Encoding API 时抛出 `Error`。
25
25
  */
26
- declare function encodeBase64(value: string): string;
26
+ export declare function encodeBase64(value: string): string;
27
27
  /**
28
28
  * 将标准 Base64 解码为 UTF-8 文本。
29
29
  *
@@ -31,14 +31,14 @@ declare function encodeBase64(value: string): string;
31
31
  * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 Unicode 字符串。
32
32
  * @throws Base64 或 UTF-8 非法时抛出 `TypeError`;缺少 Encoding API 时抛出 `Error`。
33
33
  */
34
- declare function decodeBase64(value: string): DecodedText;
34
+ export declare function decodeBase64(value: string): DecodedText;
35
35
  /**
36
36
  * 将任意字节编码为无填充 Base64URL。
37
37
  *
38
38
  * @param bytes - 不会被修改的字节序列。
39
39
  * @returns 仅使用 URL 安全字母表的文本。
40
40
  */
41
- declare function encodeBase64UrlBytes(bytes: Uint8Array): string;
41
+ export declare function encodeBase64UrlBytes(bytes: Uint8Array): string;
42
42
  /**
43
43
  * 解码 Base64URL 字节。
44
44
  *
@@ -47,7 +47,7 @@ declare function encodeBase64UrlBytes(bytes: Uint8Array): string;
47
47
  * @returns 新建的字节数组。
48
48
  * @throws 输入非法时抛出 `TypeError`。
49
49
  */
50
- declare function decodeBase64UrlBytes(value: string): Uint8Array;
50
+ export declare function decodeBase64UrlBytes(value: string): Uint8Array;
51
51
  /**
52
52
  * 将 UTF-8 文本编码为无填充 Base64URL。
53
53
  *
@@ -55,7 +55,7 @@ declare function decodeBase64UrlBytes(value: string): Uint8Array;
55
55
  * @returns 仅使用 URL 安全字母表的文本。
56
56
  * @throws 缺少 Encoding API 时抛出 `Error`。
57
57
  */
58
- declare function encodeBase64Url(value: string): string;
58
+ export declare function encodeBase64Url(value: string): string;
59
59
  /**
60
60
  * 将 Base64URL 解码为 UTF-8 文本。
61
61
  *
@@ -63,7 +63,7 @@ declare function encodeBase64Url(value: string): string;
63
63
  * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 Unicode 字符串。
64
64
  * @throws Base64URL 或 UTF-8 非法时抛出 `TypeError`;缺少 Encoding API 时抛出 `Error`。
65
65
  */
66
- declare function decodeBase64Url(value: string): DecodedText;
66
+ export declare function decodeBase64Url(value: string): DecodedText;
67
67
  /**
68
68
  * 把 Latin-1 文本编码为标准 Base64。
69
69
  *
@@ -71,7 +71,7 @@ declare function decodeBase64Url(value: string): DecodedText;
71
71
  * @returns 带标准填充的 Base64 文本。
72
72
  * @throws `TypeError` 当文本包含 Latin-1 范围外的码元。
73
73
  */
74
- declare function encodeLatin1Base64(value: string): string;
74
+ export declare function encodeLatin1Base64(value: string): string;
75
75
  /**
76
76
  * 把标准 Base64 解码为 Latin-1 文本。
77
77
  *
@@ -79,7 +79,7 @@ declare function encodeLatin1Base64(value: string): string;
79
79
  * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的 Latin-1 原始字符串。
80
80
  * @throws `TypeError` 当 Base64 格式或尾部位非法。
81
81
  */
82
- declare function decodeLatin1Base64(value: string): DecodedText;
82
+ export declare function decodeLatin1Base64(value: string): DecodedText;
83
83
  /**
84
84
  * 使用固定字典和随机前缀编码文本。
85
85
  *
@@ -91,7 +91,7 @@ declare function decodeLatin1Base64(value: string): DecodedText;
91
91
  * @returns 带随机前缀和兼容字典字符的 Base64 文本;空输入返回空字符串。
92
92
  * @throws `RangeError` 当前缀长度不是非负安全整数;输入包含孤立代理项时保留平台错误。
93
93
  */
94
- declare function encodeSecureBase64(value: string, prefixLength?: number): string;
94
+ export declare function encodeSecureBase64(value: string, prefixLength?: number): string;
95
95
  /**
96
96
  * 解码 {@link encodeSecureBase64} 生成的 SecureBase64 兼容格式。
97
97
  *
@@ -100,7 +100,7 @@ declare function encodeSecureBase64(value: string, prefixLength?: number): strin
100
100
  * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 Unicode 字符串;空输入返回空字符串。
101
101
  * @throws `RangeError` 当前缀长度不是非负安全整数;载荷、Base64 或 URI 编码非法时抛出 `TypeError` 或 `URIError`。
102
102
  */
103
- declare function decodeSecureBase64(value: string, prefixLength?: number): DecodedText;
103
+ export declare function decodeSecureBase64(value: string, prefixLength?: number): DecodedText;
104
104
  //#endregion
105
- export { type DecodedText, decodeBase64, decodeBase64Bytes, decodeBase64Url, decodeBase64UrlBytes, decodeLatin1Base64, decodeSecureBase64, encodeBase64, encodeBase64Bytes, encodeBase64Url, encodeBase64UrlBytes, encodeLatin1Base64, encodeSecureBase64 };
105
+ export type { DecodedText };
106
106
  //# sourceMappingURL=index.d.mts.map
@@ -1,6 +1,6 @@
1
1
  //#region src/color/index.d.ts
2
2
  /** 0 至 255 范围的 RGB 颜色。 */
3
- interface RgbColor {
3
+ export interface RgbColor {
4
4
  /** 蓝色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */
5
5
  blue: number;
6
6
  /** 绿色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */
@@ -9,7 +9,7 @@ interface RgbColor {
9
9
  red: number;
10
10
  }
11
11
  /** 带 0 至 1 Alpha 通道的 RGB 颜色。 */
12
- interface RgbaColor extends RgbColor {
12
+ export interface RgbaColor extends RgbColor {
13
13
  /** 不透明度;必须是闭区间 `[0, 1]` 内的有限数,`0` 完全透明,`1` 完全不透明。 */
14
14
  alpha: number;
15
15
  }
@@ -20,7 +20,7 @@ interface RgbaColor extends RgbColor {
20
20
  * @returns 标准化的 RGBA 对象;省略 Alpha 时为 1。
21
21
  * @throws 输入非法时抛出 `TypeError`。
22
22
  */
23
- declare function parseHexColor(value: string): RgbaColor;
23
+ export declare function parseHexColor(value: string): RgbaColor;
24
24
  /**
25
25
  * 把 RGB 或 RGBA 对象格式化为小写十六进制颜色。
26
26
  *
@@ -29,7 +29,7 @@ declare function parseHexColor(value: string): RgbaColor;
29
29
  * @returns 小写 `#rrggbb` 或 `#rrggbbaa` 文本。
30
30
  * @throws 通道或 Alpha 非法时抛出 `RangeError`。
31
31
  */
32
- declare function formatHexColor(color: RgbColor | RgbaColor, includeAlpha?: boolean): string;
32
+ export declare function formatHexColor(color: RgbColor | RgbaColor, includeAlpha?: boolean): string;
33
33
  /**
34
34
  * 线性混合两种十六进制颜色,包括 Alpha 通道。
35
35
  *
@@ -39,7 +39,7 @@ declare function formatHexColor(color: RgbColor | RgbaColor, includeAlpha?: bool
39
39
  * @returns 小写十六进制颜色;任一输入含透明度时保留 Alpha。
40
40
  * @throws 颜色非法时抛出 `TypeError`;比例非法时抛出 `RangeError`。
41
41
  */
42
- declare function mixHexColors(first: string, second: string, amount: number): string;
42
+ export declare function mixHexColors(first: string, second: string, amount: number): string;
43
43
  /**
44
44
  * 按比例向黑色混合。
45
45
  *
@@ -47,7 +47,7 @@ declare function mixHexColors(first: string, second: string, amount: number): st
47
47
  * @param amount - 0 至 1 的混合比例。
48
48
  * @returns 混入黑色后的十六进制颜色;参数与异常语义见 {@link mixHexColors}。
49
49
  */
50
- declare function mixHexColorWithBlack(color: string, amount: number): string;
50
+ export declare function mixHexColorWithBlack(color: string, amount: number): string;
51
51
  /**
52
52
  * 按比例向白色混合。
53
53
  *
@@ -55,7 +55,7 @@ declare function mixHexColorWithBlack(color: string, amount: number): string;
55
55
  * @param amount - 0 至 1 的混合比例。
56
56
  * @returns 混入白色后的十六进制颜色;参数与异常语义见 {@link mixHexColors}。
57
57
  */
58
- declare function mixHexColorWithWhite(color: string, amount: number): string;
58
+ export declare function mixHexColorWithWhite(color: string, amount: number): string;
59
59
  /**
60
60
  * 计算 WCAG sRGB 相对亮度。
61
61
  *
@@ -64,7 +64,7 @@ declare function mixHexColorWithWhite(color: string, amount: number): string;
64
64
  * @returns 0 至 1 的相对亮度。
65
65
  * @throws 输入非法时抛出 `TypeError`。
66
66
  */
67
- declare function relativeLuminance(color: string): number;
67
+ export declare function relativeLuminance(color: string): number;
68
68
  /**
69
69
  * 计算两种不透明颜色的 WCAG 对比度,范围 1 至 21。
70
70
  *
@@ -74,7 +74,7 @@ declare function relativeLuminance(color: string): number;
74
74
  * @returns 较亮颜色与较暗颜色的对比度。
75
75
  * @throws 输入非法时抛出 `TypeError`。
76
76
  */
77
- declare function contrastRatio(first: string, second: string): number;
77
+ export declare function contrastRatio(first: string, second: string): number;
78
78
  /**
79
79
  * 从两个候选颜色中选择与背景对比度更高的一项。
80
80
  *
@@ -84,7 +84,6 @@ declare function contrastRatio(first: string, second: string): number;
84
84
  * @returns 对比度较高的原始候选字符串;相同时返回 `first`。
85
85
  * @throws 任一颜色非法时抛出 `TypeError`。
86
86
  */
87
- declare function pickHigherContrastColor(background: string, first?: string, second?: string): string;
87
+ export declare function pickHigherContrastColor(background: string, first?: string, second?: string): string;
88
88
  //#endregion
89
- export { RgbColor, RgbaColor, contrastRatio, formatHexColor, mixHexColorWithBlack, mixHexColorWithWhite, mixHexColors, parseHexColor, pickHigherContrastColor, relativeLuminance };
90
89
  //# sourceMappingURL=index.d.mts.map