@fast-china/utils 2.1.3 → 2.1.5

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 (63) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +2 -0
  3. package/README.zh.md +2 -0
  4. package/dist/array/index.d.mts +19 -12
  5. package/dist/array/index.mjs +15 -1
  6. package/dist/array/index.mjs.map +1 -1
  7. package/dist/async/index.d.mts +13 -14
  8. package/dist/async/index.mjs +7 -5
  9. package/dist/async/index.mjs.map +1 -1
  10. package/dist/base64/index.d.mts +13 -13
  11. package/dist/color/index.d.mts +10 -11
  12. package/dist/color/index.mjs.map +1 -1
  13. package/dist/crypto/index.d.mts +38 -39
  14. package/dist/crypto/index.mjs +9 -4
  15. package/dist/crypto/index.mjs.map +1 -1
  16. package/dist/date/index.d.mts +23 -24
  17. package/dist/date/index.mjs.map +1 -1
  18. package/dist/dom/style.d.mts +5 -6
  19. package/dist/env/index.d.mts +9 -10
  20. package/dist/env/index.mjs +17 -10
  21. package/dist/env/index.mjs.map +1 -1
  22. package/dist/function/index.d.mts +13 -0
  23. package/dist/function/index.mjs +38 -0
  24. package/dist/function/index.mjs.map +1 -0
  25. package/dist/identity/index.d.mts +5 -6
  26. package/dist/index.d.mts +4 -3
  27. package/dist/index.global.min.js +2 -2
  28. package/dist/index.global.min.js.map +1 -1
  29. package/dist/index.mjs +4 -3
  30. package/dist/internal/runtime.mjs +12 -0
  31. package/dist/internal/runtime.mjs.map +1 -0
  32. package/dist/internal/text.d.mts +1 -2
  33. package/dist/internal/text.mjs +1 -1
  34. package/dist/internal/text.mjs.map +1 -1
  35. package/dist/logger/index.d.mts +7 -8
  36. package/dist/logger/index.mjs +6 -7
  37. package/dist/logger/index.mjs.map +1 -1
  38. package/dist/number/index.d.mts +9 -10
  39. package/dist/number/index.mjs +4 -3
  40. package/dist/number/index.mjs.map +1 -1
  41. package/dist/object/index.d.mts +49 -11
  42. package/dist/object/index.mjs +258 -14
  43. package/dist/object/index.mjs.map +1 -1
  44. package/dist/storage/index.d.mts +10 -11
  45. package/dist/storage/index.mjs +3 -2
  46. package/dist/storage/index.mjs.map +1 -1
  47. package/dist/string/index.d.mts +18 -19
  48. package/dist/string/index.mjs +15 -13
  49. package/dist/string/index.mjs.map +1 -1
  50. package/dist/vue/emits.d.mts +2 -3
  51. package/dist/vue/emits.mjs.map +1 -1
  52. package/dist/vue/expose.d.mts +1 -2
  53. package/dist/vue/func.d.mts +2 -3
  54. package/dist/vue/install.d.mts +6 -7
  55. package/dist/vue/install.mjs.map +1 -1
  56. package/dist/vue/props.d.mts +2 -3
  57. package/dist/vue/render.d.mts +1 -2
  58. package/dist/vue/render.mjs.map +1 -1
  59. package/dist/vue/slots.d.mts +3 -4
  60. package/dist/vue/with.d.mts +1 -2
  61. package/docs/API.md +3 -2
  62. package/docs/API.zh-CN.md +3 -2
  63. package/package.json +11 -11
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/color/index.ts"],"sourcesContent":["/** 0 至 255 范围的 RGB 颜色。 */\nexport interface RgbColor {\n\t/** 蓝色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */\n\tblue: number;\n\t/** 绿色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */\n\tgreen: number;\n\t/** 红色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */\n\tred: number;\n}\n\n/** 带 0 至 1 Alpha 通道的 RGB 颜色。 */\nexport interface RgbaColor extends RgbColor {\n\t/** 不透明度;必须是闭区间 `[0, 1]` 内的有限数,`0` 完全透明,`1` 完全不透明。 */\n\talpha: number;\n}\n\n/**\n * 校验 RGB 颜色通道。\n *\n * @param value - 待校验通道值。\n * @param channel - 用于错误消息的通道名称。\n * @throws `RangeError` 当值非有限或超出 0 至 255。\n */\nconst assertRgbChannel = (value: number, channel: string): void => {\n\tif (!Number.isFinite(value) || value < 0 || value > 255) {\n\t\tthrow new RangeError(`\\`${channel}\\` 必须是 0 到 255 之间的有限数。`);\n\t}\n};\n\n/**\n * 校验透明度通道。\n *\n * @param value - 待校验 Alpha 值。\n * @throws `RangeError` 当值非有限或超出闭区间 `[0, 1]`。\n */\nconst assertAlpha = (value: number): void => {\n\tif (!Number.isFinite(value) || value < 0 || value > 1) {\n\t\tthrow new RangeError(\"`alpha` 必须是 0 到 1 之间的有限数。\");\n\t}\n};\n\n/**\n * 规范化十六进制颜色文本。\n *\n * @param value - 可带 `#` 的 3、4、6 或 8 位颜色文本。\n * @returns 不带 `#` 的 6 或 8 位文本。\n * @throws `TypeError` 当长度或字符不符合十六进制颜色格式。\n */\nconst normalizeHexColor = (value: string): string => {\n\tconst normalized = value.startsWith(\"#\") ? value.slice(1) : value;\n\tif (![3, 4, 6, 8].includes(normalized.length) || !/^[\\dA-F]+$/iu.test(normalized)) {\n\t\tthrow new TypeError(\"十六进制颜色必须包含 3、4、6 或 8 个十六进制字符。\");\n\t}\n\treturn normalized.length <= 4 ? Array.from(normalized, (character) => `${character}${character}`).join(\"\") : normalized;\n};\n\n/**\n * 格式化单个颜色通道。\n *\n * @param value - 已校验的 0 至 255 通道值。\n * @returns 舍入后的两位小写十六进制文本。\n */\nconst formatHexChannel = (value: number): string => Math.round(value).toString(16).padStart(2, \"0\");\n\n/**\n * 解析可带可不带 `#` 的 `rgb`、`rgba`、`rrggbb` 或 `rrggbbaa`。\n *\n * @param value - 十六进制颜色文本。\n * @returns 标准化的 RGBA 对象;省略 Alpha 时为 1。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function parseHexColor(value: string): RgbaColor {\n\tconst normalized = normalizeHexColor(value);\n\treturn {\n\t\tred: Number.parseInt(normalized.slice(0, 2), 16),\n\t\tgreen: Number.parseInt(normalized.slice(2, 4), 16),\n\t\tblue: Number.parseInt(normalized.slice(4, 6), 16),\n\t\talpha: normalized.length === 8 ? Number.parseInt(normalized.slice(6, 8), 16) / 255 : 1,\n\t};\n}\n\n/**\n * 把 RGB 或 RGBA 对象格式化为小写十六进制颜色。\n *\n * @param color - 颜色通道;RGB 会四舍五入到最近整数。\n * @param includeAlpha - 是否输出 Alpha;默认只在传入 Alpha 且小于 1 时输出。\n * @returns 小写 `#rrggbb` 或 `#rrggbbaa` 文本。\n * @throws 通道或 Alpha 非法时抛出 `RangeError`。\n */\nexport function formatHexColor(color: RgbColor | RgbaColor, includeAlpha: boolean = \"alpha\" in color && color.alpha < 1): string {\n\tassertRgbChannel(color.red, \"red\");\n\tassertRgbChannel(color.green, \"green\");\n\tassertRgbChannel(color.blue, \"blue\");\n\tconst alpha = \"alpha\" in color ? color.alpha : 1;\n\tassertAlpha(alpha);\n\tconst rgb = `${formatHexChannel(color.red)}${formatHexChannel(color.green)}${formatHexChannel(color.blue)}`;\n\treturn `#${rgb}${includeAlpha ? formatHexChannel(alpha * 255) : \"\"}`;\n}\n\n/**\n * 线性混合两种十六进制颜色,包括 Alpha 通道。\n *\n * @param first - `amount = 0` 时的颜色。\n * @param second - `amount = 1` 时的颜色。\n * @param amount - 0 至 1 的混合比例。\n * @returns 小写十六进制颜色;任一输入含透明度时保留 Alpha。\n * @throws 颜色非法时抛出 `TypeError`;比例非法时抛出 `RangeError`。\n */\nexport function mixHexColors(first: string, second: string, amount: number): string {\n\tif (!Number.isFinite(amount) || amount < 0 || amount > 1) {\n\t\tthrow new RangeError(\"`amount` 必须是 0 到 1 之间的有限数。\");\n\t}\n\tconst left = parseHexColor(first);\n\tconst right = parseHexColor(second);\n\t/**\n\t * 在单个 RGBA 通道上执行与外层相同权重的线性混合。\n\t *\n\t * @param start - 第一个颜色的通道值。\n\t * @param end - 第二个颜色的通道值。\n\t * @returns 按外层 `amount` 线性混合后的通道值。\n\t */\n\tconst mix = (start: number, end: number): number => start + (end - start) * amount;\n\treturn formatHexColor(\n\t\t{\n\t\t\tred: mix(left.red, right.red),\n\t\t\tgreen: mix(left.green, right.green),\n\t\t\tblue: mix(left.blue, right.blue),\n\t\t\talpha: mix(left.alpha, right.alpha),\n\t\t},\n\t\tleft.alpha < 1 || right.alpha < 1\n\t);\n}\n\n/**\n * 按比例向黑色混合。\n *\n * @param color - 合法十六进制颜色。\n * @param amount - 0 至 1 的混合比例。\n * @returns 混入黑色后的十六进制颜色;参数与异常语义见 {@link mixHexColors}。\n */\nexport function mixHexColorWithBlack(color: string, amount: number): string {\n\treturn mixHexColors(color, \"#000000\", amount);\n}\n\n/**\n * 按比例向白色混合。\n *\n * @param color - 合法十六进制颜色。\n * @param amount - 0 至 1 的混合比例。\n * @returns 混入白色后的十六进制颜色;参数与异常语义见 {@link mixHexColors}。\n */\nexport function mixHexColorWithWhite(color: string, amount: number): string {\n\treturn mixHexColors(color, \"#ffffff\", amount);\n}\n\n/**\n * 按 WCAG sRGB 转换曲线线性化颜色通道。\n *\n * @param channel - 已校验的 0 至 255 通道值。\n * @returns 0 至 1 的线性光值。\n */\nconst linearizeSrgbChannel = (channel: number): number => {\n\tconst value = channel / 255;\n\treturn value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;\n};\n\n/**\n * 计算 WCAG sRGB 相对亮度。\n *\n * @remarks Alpha 通道不会参与计算;半透明颜色应先与实际背景混合。\n * @param color - 合法十六进制颜色。\n * @returns 0 至 1 的相对亮度。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function relativeLuminance(color: string): number {\n\tconst { red, green, blue } = parseHexColor(color);\n\treturn 0.2126 * linearizeSrgbChannel(red) + 0.7152 * linearizeSrgbChannel(green) + 0.0722 * linearizeSrgbChannel(blue);\n}\n\n/**\n * 计算两种不透明颜色的 WCAG 对比度,范围 1 至 21。\n *\n * @remarks 返回比值本身,不代表特定字号或 WCAG 等级必然通过。\n * @param first - 第一种十六进制颜色。\n * @param second - 第二种十六进制颜色。\n * @returns 较亮颜色与较暗颜色的对比度。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function contrastRatio(first: string, second: string): number {\n\tconst firstLuminance = relativeLuminance(first);\n\tconst secondLuminance = relativeLuminance(second);\n\tconst lighter = Math.max(firstLuminance, secondLuminance);\n\tconst darker = Math.min(firstLuminance, secondLuminance);\n\treturn (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * 从两个候选颜色中选择与背景对比度更高的一项。\n *\n * @param background - 实际不透明背景色。\n * @param first - 第一候选,默认黑色。\n * @param second - 第二候选,默认白色。\n * @returns 对比度较高的原始候选字符串;相同时返回 `first`。\n * @throws 任一颜色非法时抛出 `TypeError`。\n */\nexport function pickHigherContrastColor(background: string, first = \"#000000\", second = \"#ffffff\"): string {\n\treturn contrastRatio(background, first) >= contrastRatio(background, second) ? first : second;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/color/index.ts"],"sourcesContent":["/** 0 至 255 范围的 RGB 颜色。 */\nexport interface RgbColor {\n\t/** 蓝色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */\n\tblue: number;\n\t/** 绿色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */\n\tgreen: number;\n\t/** 红色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */\n\tred: number;\n}\n\n/** 带 0 至 1 Alpha 通道的 RGB 颜色。 */\nexport interface RgbaColor extends RgbColor {\n\t/** 不透明度;必须是闭区间 `[0, 1]` 内的有限数,`0` 完全透明,`1` 完全不透明。 */\n\talpha: number;\n}\n\n/**\n * 校验 RGB 颜色通道。\n *\n * @param value - 待校验通道值。\n * @param channel - 用于错误消息的通道名称。\n * @throws `RangeError` 当值非有限或超出 0 至 255。\n */\nconst assertRgbChannel = (value: number, channel: string): void => {\n\tif (!Number.isFinite(value) || value < 0 || value > 255) {\n\t\tthrow new RangeError(`\\`${channel}\\` 必须是 0 到 255 之间的有限数。`);\n\t}\n};\n\n/**\n * 校验透明度通道。\n *\n * @param value - 待校验 Alpha 值。\n * @throws `RangeError` 当值非有限或超出闭区间 `[0, 1]`。\n */\nconst assertAlpha = (value: number): void => {\n\tif (!Number.isFinite(value) || value < 0 || value > 1) {\n\t\tthrow new RangeError(\"`alpha` 必须是 0 到 1 之间的有限数。\");\n\t}\n};\n\n/**\n * 规范化十六进制颜色文本。\n *\n * @param value - 可带 `#` 的 3、4、6 或 8 位颜色文本。\n * @returns 不带 `#` 的 6 或 8 位文本。\n * @throws `TypeError` 当长度或字符不符合十六进制颜色格式。\n */\nconst normalizeHexColor = (value: string): string => {\n\tconst normalized = value.startsWith(\"#\") ? value.slice(1) : value;\n\tif (![3, 4, 6, 8].includes(normalized.length) || !/^[\\dA-F]+$/iu.test(normalized)) {\n\t\tthrow new TypeError(\"十六进制颜色必须包含 3、4、6 或 8 个十六进制字符。\");\n\t}\n\treturn normalized.length <= 4 ? Array.from(normalized, (character) => `${character}${character}`).join(\"\") : normalized;\n};\n\n/**\n * 格式化单个颜色通道。\n *\n * @param value - 已校验的 0 至 255 通道值。\n * @returns 舍入后的两位小写十六进制文本。\n */\nconst formatHexChannel = (value: number): string => Math.round(value).toString(16).padStart(2, \"0\");\n\n/**\n * 解析可带可不带 `#` 的 `rgb`、`rgba`、`rrggbb` 或 `rrggbbaa`。\n *\n * @param value - 十六进制颜色文本。\n * @returns 标准化的 RGBA 对象;省略 Alpha 时为 1。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function parseHexColor(value: string): RgbaColor {\n\tconst normalized = normalizeHexColor(value);\n\treturn {\n\t\tred: Number.parseInt(normalized.slice(0, 2), 16),\n\t\tgreen: Number.parseInt(normalized.slice(2, 4), 16),\n\t\tblue: Number.parseInt(normalized.slice(4, 6), 16),\n\t\talpha: normalized.length === 8 ? Number.parseInt(normalized.slice(6, 8), 16) / 255 : 1,\n\t};\n}\n\n/**\n * 把 RGB 或 RGBA 对象格式化为小写十六进制颜色。\n *\n * @param color - 颜色通道;RGB 会四舍五入到最近整数。\n * @param includeAlpha - 是否输出 Alpha;默认只在传入 Alpha 且小于 1 时输出。\n * @returns 小写 `#rrggbb` 或 `#rrggbbaa` 文本。\n * @throws 通道或 Alpha 非法时抛出 `RangeError`。\n */\nexport function formatHexColor(color: RgbColor | RgbaColor, includeAlpha: boolean = \"alpha\" in color && color.alpha < 1): string {\n\tassertRgbChannel(color.red, \"red\");\n\tassertRgbChannel(color.green, \"green\");\n\tassertRgbChannel(color.blue, \"blue\");\n\tconst alpha = \"alpha\" in color ? color.alpha : 1;\n\tassertAlpha(alpha);\n\tconst rgb = `${formatHexChannel(color.red)}${formatHexChannel(color.green)}${formatHexChannel(color.blue)}`;\n\treturn `#${rgb}${includeAlpha ? formatHexChannel(alpha * 255) : \"\"}`;\n}\n\n/**\n * 线性混合两种十六进制颜色,包括 Alpha 通道。\n *\n * @param first - `amount = 0` 时的颜色。\n * @param second - `amount = 1` 时的颜色。\n * @param amount - 0 至 1 的混合比例。\n * @returns 小写十六进制颜色;任一输入含透明度时保留 Alpha。\n * @throws 颜色非法时抛出 `TypeError`;比例非法时抛出 `RangeError`。\n */\nexport function mixHexColors(first: string, second: string, amount: number): string {\n\tif (!Number.isFinite(amount) || amount < 0 || amount > 1) {\n\t\tthrow new RangeError(\"`amount` 必须是 0 到 1 之间的有限数。\");\n\t}\n\tconst left = parseHexColor(first);\n\tconst right = parseHexColor(second);\n\t/**\n\t * 在单个 RGBA 通道上执行与外层相同权重的线性混合。\n\t *\n\t * @param start - 第一个颜色的通道值。\n\t * @param end - 第二个颜色的通道值。\n\t * @returns 按外层 `amount` 线性混合后的通道值。\n\t */\n\tconst mix = (start: number, end: number) => start + (end - start) * amount;\n\treturn formatHexColor(\n\t\t{\n\t\t\tred: mix(left.red, right.red),\n\t\t\tgreen: mix(left.green, right.green),\n\t\t\tblue: mix(left.blue, right.blue),\n\t\t\talpha: mix(left.alpha, right.alpha),\n\t\t},\n\t\tleft.alpha < 1 || right.alpha < 1\n\t);\n}\n\n/**\n * 按比例向黑色混合。\n *\n * @param color - 合法十六进制颜色。\n * @param amount - 0 至 1 的混合比例。\n * @returns 混入黑色后的十六进制颜色;参数与异常语义见 {@link mixHexColors}。\n */\nexport function mixHexColorWithBlack(color: string, amount: number): string {\n\treturn mixHexColors(color, \"#000000\", amount);\n}\n\n/**\n * 按比例向白色混合。\n *\n * @param color - 合法十六进制颜色。\n * @param amount - 0 至 1 的混合比例。\n * @returns 混入白色后的十六进制颜色;参数与异常语义见 {@link mixHexColors}。\n */\nexport function mixHexColorWithWhite(color: string, amount: number): string {\n\treturn mixHexColors(color, \"#ffffff\", amount);\n}\n\n/**\n * 按 WCAG sRGB 转换曲线线性化颜色通道。\n *\n * @param channel - 已校验的 0 至 255 通道值。\n * @returns 0 至 1 的线性光值。\n */\nconst linearizeSrgbChannel = (channel: number): number => {\n\tconst value = channel / 255;\n\treturn value <= 0.04045 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4;\n};\n\n/**\n * 计算 WCAG sRGB 相对亮度。\n *\n * @remarks Alpha 通道不会参与计算;半透明颜色应先与实际背景混合。\n * @param color - 合法十六进制颜色。\n * @returns 0 至 1 的相对亮度。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function relativeLuminance(color: string): number {\n\tconst { red, green, blue } = parseHexColor(color);\n\treturn 0.2126 * linearizeSrgbChannel(red) + 0.7152 * linearizeSrgbChannel(green) + 0.0722 * linearizeSrgbChannel(blue);\n}\n\n/**\n * 计算两种不透明颜色的 WCAG 对比度,范围 1 至 21。\n *\n * @remarks 返回比值本身,不代表特定字号或 WCAG 等级必然通过。\n * @param first - 第一种十六进制颜色。\n * @param second - 第二种十六进制颜色。\n * @returns 较亮颜色与较暗颜色的对比度。\n * @throws 输入非法时抛出 `TypeError`。\n */\nexport function contrastRatio(first: string, second: string): number {\n\tconst firstLuminance = relativeLuminance(first);\n\tconst secondLuminance = relativeLuminance(second);\n\tconst lighter = Math.max(firstLuminance, secondLuminance);\n\tconst darker = Math.min(firstLuminance, secondLuminance);\n\treturn (lighter + 0.05) / (darker + 0.05);\n}\n\n/**\n * 从两个候选颜色中选择与背景对比度更高的一项。\n *\n * @param background - 实际不透明背景色。\n * @param first - 第一候选,默认黑色。\n * @param second - 第二候选,默认白色。\n * @returns 对比度较高的原始候选字符串;相同时返回 `first`。\n * @throws 任一颜色非法时抛出 `TypeError`。\n */\nexport function pickHigherContrastColor(background: string, first = \"#000000\", second = \"#ffffff\"): string {\n\treturn contrastRatio(background, first) >= contrastRatio(background, second) ? first : second;\n}\n"],"mappings":"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"}
@@ -2,18 +2,18 @@ import { DecodedText } from "../internal/text.mjs";
2
2
  import "crypto-js/pad-ansix923.js";
3
3
  //#region src/crypto/index.d.ts
4
4
  /** AES 分组密码模式;与 .NET `CipherMode.CBC` 和 `CipherMode.ECB` 对应。 */
5
- type AesCipherMode = "CBC" | "ECB";
5
+ export type AesCipherMode = "CBC" | "ECB";
6
6
  /** AES 填充模式;与 .NET `PaddingMode` 中可由 CryptoJS 互操作的成员对应。 */
7
- type AesPaddingMode = "None" | "PKCS7" | "Zeros" | "ANSIX923" | "ISO10126";
7
+ export type AesPaddingMode = "None" | "PKCS7" | "Zeros" | "ANSIX923" | "ISO10126";
8
8
  /** Web Crypto 导出的 PEM 公私钥对。 */
9
- interface PemKeyPair {
9
+ export interface PemKeyPair {
10
10
  /** 未加密的 PKCS#8 PEM 私钥,包含标准 `PRIVATE KEY` 头尾和 64 字符换行。 */
11
11
  privateKey: string;
12
12
  /** SubjectPublicKeyInfo PEM 公钥,包含标准 `PUBLIC KEY` 头尾和 64 字符换行。 */
13
13
  publicKey: string;
14
14
  }
15
15
  /** 本模块支持的 Web Crypto 椭圆曲线。 */
16
- type EcNamedCurve = "P-256" | "P-384" | "P-521";
16
+ export type EcNamedCurve = "P-256" | "P-384" | "P-521";
17
17
  /**
18
18
  * 生成随机字节。
19
19
  *
@@ -22,7 +22,7 @@ type EcNamedCurve = "P-256" | "P-384" | "P-521";
22
22
  * @returns 新建的 `Uint8Array`。
23
23
  * @throws 参数非法时抛出 `RangeError`。
24
24
  */
25
- declare function GenerateRandomBytes(length: number): Uint8Array;
25
+ export declare function GenerateRandomBytes(length: number): Uint8Array;
26
26
  /**
27
27
  * 以不提前退出的方式比较两个字节数组。
28
28
  *
@@ -32,7 +32,7 @@ declare function GenerateRandomBytes(length: number): Uint8Array;
32
32
  * @param right - 第二字节序列。
33
33
  * @returns 长度和每个字节均相同时返回 `true`。
34
34
  */
35
- declare function FixedTimeEquals(left: Uint8Array, right: Uint8Array): boolean;
35
+ export declare function FixedTimeEquals(left: Uint8Array, right: Uint8Array): boolean;
36
36
  /**
37
37
  * 计算 MD5 摘要并返回小写十六进制文本。
38
38
  *
@@ -40,7 +40,7 @@ declare function FixedTimeEquals(left: Uint8Array, right: Uint8Array): boolean;
40
40
  * @param value - UTF-8 文本。
41
41
  * @returns 32 字符小写十六进制摘要。
42
42
  */
43
- declare function MD5Encrypt(value: string): string;
43
+ export declare function MD5Encrypt(value: string): string;
44
44
  /**
45
45
  * 计算 SHA-1 摘要并返回大写十六进制文本。
46
46
  *
@@ -48,7 +48,7 @@ declare function MD5Encrypt(value: string): string;
48
48
  * @param value - UTF-8 文本。
49
49
  * @returns 40 字符大写十六进制摘要。
50
50
  */
51
- declare function SHA1Encrypt(value: string): string;
51
+ export declare function SHA1Encrypt(value: string): string;
52
52
  /**
53
53
  * 计算 SHA-256 摘要。
54
54
  *
@@ -57,7 +57,7 @@ declare function SHA1Encrypt(value: string): string;
57
57
  * @returns 32 字节摘要。
58
58
  * @throws 缺少 Web Crypto 或 Encoding API 时抛出 `Error`。
59
59
  */
60
- declare function SHA256Bytes(value: string): Promise<Uint8Array>;
60
+ export declare function SHA256Bytes(value: string): Promise<Uint8Array>;
61
61
  /**
62
62
  * 计算 SHA-256 并格式化为十六进制。
63
63
  *
@@ -65,35 +65,35 @@ declare function SHA256Bytes(value: string): Promise<Uint8Array>;
65
65
  * @returns 64 字符大写十六进制文本。
66
66
  * @throws 缺少 Web Crypto 或 Encoding API 时抛出 `Error`。
67
67
  */
68
- declare function SHA256Encrypt(value: string): Promise<string>;
68
+ export declare function SHA256Encrypt(value: string): Promise<string>;
69
69
  /**
70
70
  * 计算 SHA-384 摘要。
71
71
  *
72
72
  * @param value - UTF-8 文本或原始字节。
73
73
  * @returns 48 字节摘要。
74
74
  */
75
- declare function SHA384Bytes(value: string): Promise<Uint8Array>;
75
+ export declare function SHA384Bytes(value: string): Promise<Uint8Array>;
76
76
  /**
77
77
  * 计算 SHA-384 并格式化为十六进制文本。
78
78
  *
79
79
  * @param value - UTF-8 文本或原始字节。
80
80
  * @returns 96 个大写十六进制字符组成的摘要。
81
81
  */
82
- declare function SHA384Encrypt(value: string): Promise<string>;
82
+ export declare function SHA384Encrypt(value: string): Promise<string>;
83
83
  /**
84
84
  * 计算 SHA-512 摘要。
85
85
  *
86
86
  * @param value - UTF-8 文本或原始字节。
87
87
  * @returns 64 字节摘要。
88
88
  */
89
- declare function SHA512Bytes(value: string): Promise<Uint8Array>;
89
+ export declare function SHA512Bytes(value: string): Promise<Uint8Array>;
90
90
  /**
91
91
  * 计算 SHA-512 并格式化为十六进制文本。
92
92
  *
93
93
  * @param value - UTF-8 文本或原始字节。
94
94
  * @returns 128 个大写十六进制字符组成的摘要。
95
95
  */
96
- declare function SHA512Encrypt(value: string): Promise<string>;
96
+ export declare function SHA512Encrypt(value: string): Promise<string>;
97
97
  /**
98
98
  * 使用 HMAC-SHA-256 认证文本,并返回十六进制标签。
99
99
  *
@@ -101,7 +101,7 @@ declare function SHA512Encrypt(value: string): Promise<string>;
101
101
  * @param key - 非空的 UTF-8 文本密钥或原始密钥字节。
102
102
  * @returns 64 个小写十六进制字符组成的认证标签。
103
103
  */
104
- declare function HMACSHA256Encrypt(value: string, key: string): Promise<string>;
104
+ export declare function HMACSHA256Encrypt(value: string, key: string): Promise<string>;
105
105
  /**
106
106
  * 使用 HMAC-SHA-384 认证文本或字节,并返回十六进制标签。
107
107
  *
@@ -109,7 +109,7 @@ declare function HMACSHA256Encrypt(value: string, key: string): Promise<string>;
109
109
  * @param key - 非空的 UTF-8 文本密钥或原始密钥字节。
110
110
  * @returns 96 个小写十六进制字符组成的认证标签。
111
111
  */
112
- declare function HMACSHA384Encrypt(value: string, key: string): Promise<string>;
112
+ export declare function HMACSHA384Encrypt(value: string, key: string): Promise<string>;
113
113
  /**
114
114
  * 使用 HMAC-SHA-512 认证文本或字节,并返回十六进制标签。
115
115
  *
@@ -117,7 +117,7 @@ declare function HMACSHA384Encrypt(value: string, key: string): Promise<string>;
117
117
  * @param key - 非空的 UTF-8 文本密钥或原始密钥字节。
118
118
  * @returns 128 个小写十六进制字符组成的认证标签。
119
119
  */
120
- declare function HMACSHA512Encrypt(value: string, key: string): Promise<string>;
120
+ export declare function HMACSHA512Encrypt(value: string, key: string): Promise<string>;
121
121
  /**
122
122
  * 使用 PBKDF2-HMAC-SHA-256 从密码派生密钥。
123
123
  *
@@ -128,7 +128,7 @@ declare function HMACSHA512Encrypt(value: string, key: string): Promise<string>;
128
128
  * @returns 指定长度的派生密钥。
129
129
  * @throws 参数超过协议边界时抛出 `TypeError` 或 `RangeError`。
130
130
  */
131
- declare function PBKDF2SHA256(password: string, salt: Uint8Array, iterations?: number, outputLength?: number): Promise<Uint8Array>;
131
+ export declare function PBKDF2SHA256(password: string, salt: Uint8Array, iterations?: number, outputLength?: number): Promise<Uint8Array>;
132
132
  /**
133
133
  * 生成可持久化的随机盐 PBKDF2-HMAC-SHA-256 密码哈希。
134
134
  *
@@ -136,7 +136,7 @@ declare function PBKDF2SHA256(password: string, salt: Uint8Array, iterations?: n
136
136
  * @param iterations - 迭代次数,范围为 100,000 至 5,000,000。
137
137
  * @returns 包含版本、迭代次数、16 字节随机盐和 32 字节派生密钥的自描述字符串。
138
138
  */
139
- declare function HashPasswordPBKDF2SHA256(password: string, iterations?: number): Promise<string>;
139
+ export declare function HashPasswordPBKDF2SHA256(password: string, iterations?: number): Promise<string>;
140
140
  /**
141
141
  * 验证 {@link HashPasswordPBKDF2SHA256} 生成的密码哈希。
142
142
  *
@@ -144,7 +144,7 @@ declare function HashPasswordPBKDF2SHA256(password: string, iterations?: number)
144
144
  * @param passwordHash - 自描述的 PBKDF2-HMAC-SHA-256 密码哈希。
145
145
  * @returns 格式有效且密码匹配时返回 `true`;格式无效或密码错误时返回 `false`。
146
146
  */
147
- declare function VerifyPasswordPBKDF2SHA256(password: string, passwordHash: string): Promise<boolean>;
147
+ export declare function VerifyPasswordPBKDF2SHA256(password: string, passwordHash: string): Promise<boolean>;
148
148
  /**
149
149
  * 使用 RFC 5869 HKDF-SHA-256 派生上下文隔离的密钥材料。
150
150
  *
@@ -154,7 +154,7 @@ declare function VerifyPasswordPBKDF2SHA256(password: string, passwordHash: stri
154
154
  * @param outputLength - 输出长度,范围为 1 至 8,160 字节。
155
155
  * @returns 与 `salt` 和 `info` 绑定的派生密钥。
156
156
  */
157
- declare function HKDFSHA256(inputKeyMaterial: Uint8Array, salt?: Uint8Array, info?: Uint8Array, outputLength?: number): Promise<Uint8Array>;
157
+ export declare function HKDFSHA256(inputKeyMaterial: Uint8Array, salt?: Uint8Array, info?: Uint8Array, outputLength?: number): Promise<Uint8Array>;
158
158
  /**
159
159
  * 使用 AES-256 对 UTF-8 文本进行分组加密。
160
160
  *
@@ -168,7 +168,7 @@ declare function HKDFSHA256(inputKeyMaterial: Uint8Array, salt?: Uint8Array, inf
168
168
  * @returns Base64 密文;输入、密钥或 IV 为空白时返回 `null`。
169
169
  * @throws 模式或填充不受支持时抛出 `RangeError`。
170
170
  */
171
- declare function AESEncrypt(dataStr: string, key: string, vector: string, cipherMode?: AesCipherMode, paddingMode?: AesPaddingMode): string | null;
171
+ export declare function AESEncrypt(dataStr: string, key: string, vector: string, cipherMode?: AesCipherMode, paddingMode?: AesPaddingMode): string | null;
172
172
  /**
173
173
  * 使用 AES-256 解密 Base64 分组密文。
174
174
  *
@@ -181,7 +181,7 @@ declare function AESEncrypt(dataStr: string, key: string, vector: string, cipher
181
181
  * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 UTF-8 字符串;输入、密钥或 IV 为空白时返回 `null`。
182
182
  * @throws 模式、填充、Base64、密钥或密文无效时抛出错误。
183
183
  */
184
- declare function AESDecrypt(dataStr: string, key: string, vector: string, cipherMode?: AesCipherMode, paddingMode?: AesPaddingMode): DecodedText | null;
184
+ export declare function AESDecrypt(dataStr: string, key: string, vector: string, cipherMode?: AesCipherMode, paddingMode?: AesPaddingMode): DecodedText | null;
185
185
  /**
186
186
  * 使用 SHA-256 归一化文本密钥,再以 AES-256-GCM 认证加密 UTF-8 文本。
187
187
  *
@@ -191,7 +191,7 @@ declare function AESDecrypt(dataStr: string, key: string, vector: string, cipher
191
191
  * @returns Base64 编码的 v1 AES-GCM 认证载荷。
192
192
  * @throws 密钥为空或运行时缺少 Web Crypto 时抛出错误。
193
193
  */
194
- declare function AESEncryptAuthenticated(plaintext: string, key: string): Promise<string>;
194
+ export declare function AESEncryptAuthenticated(plaintext: string, key: string): Promise<string>;
195
195
  /**
196
196
  * 解密并认证 .NET `AESEncryptAuthenticated` 或 {@link AESEncryptAuthenticated} 生成的载荷。
197
197
  *
@@ -200,7 +200,7 @@ declare function AESEncryptAuthenticated(plaintext: string, key: string): Promis
200
200
  * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 UTF-8 字符串。
201
201
  * @throws 载荷格式无效、密钥错误或认证失败时抛出错误。
202
202
  */
203
- declare function AESDecryptAuthenticated(payload: string, key: string): Promise<DecodedText>;
203
+ export declare function AESDecryptAuthenticated(payload: string, key: string): Promise<DecodedText>;
204
204
  /**
205
205
  * 使用 PBKDF2-HMAC-SHA-256 派生密钥,再以 AES-256-GCM 认证加密 UTF-8 文本。
206
206
  *
@@ -213,7 +213,7 @@ declare function AESDecryptAuthenticated(payload: string, key: string): Promise<
213
213
  * @throws 口令非法时抛出 `TypeError` 或 `RangeError`;明文过大时抛出 `RangeError`;
214
214
  * 运行时缺少 Web Crypto 或 Encoding API 时抛出 `Error`。
215
215
  */
216
- declare function AESEncryptWithPassword(plaintext: string, password: string, iterations?: number): Promise<string>;
216
+ export declare function AESEncryptWithPassword(plaintext: string, password: string, iterations?: number): Promise<string>;
217
217
  /**
218
218
  * 解密 {@link AESEncryptWithPassword} 生成的 v1 认证载荷。
219
219
  *
@@ -223,7 +223,7 @@ declare function AESEncryptWithPassword(plaintext: string, password: string, ite
223
223
  * @throws 格式或字段非法时抛出 `TypeError`,载荷过大时抛出 `RangeError`,认证或密码
224
224
  * 失败及缺少平台能力时抛出 `Error`。
225
225
  */
226
- declare function AESDecryptWithPassword(payload: string, password: string): Promise<DecodedText>;
226
+ export declare function AESDecryptWithPassword(payload: string, password: string): Promise<DecodedText>;
227
227
  /**
228
228
  * 生成可供 RSA-OAEP/SHA-256 与 RSA-PSS/SHA-256 共用的 PEM 密钥对。
229
229
  *
@@ -231,7 +231,7 @@ declare function AESDecryptWithPassword(payload: string, password: string): Prom
231
231
  * @returns 未加密 PKCS#8 私钥和 SubjectPublicKeyInfo 公钥组成的 PEM 密钥对。
232
232
  * @throws 模数小于 2,048 或不是 256 的倍数时抛出 `RangeError`。
233
233
  */
234
- declare function GenerateRSAKeyPair(modulusLength?: number): Promise<PemKeyPair>;
234
+ export declare function GenerateRSAKeyPair(modulusLength?: number): Promise<PemKeyPair>;
235
235
  /**
236
236
  * 使用 RSA-OAEP/SHA-256 公钥加密 UTF-8 文本。
237
237
  *
@@ -240,7 +240,7 @@ declare function GenerateRSAKeyPair(modulusLength?: number): Promise<PemKeyPair>
240
240
  * @returns Base64 编码的 RSA 密文。
241
241
  * @throws 公钥格式无效或明文超过 RSA-OAEP 容量时抛出错误。
242
242
  */
243
- declare function RSAEncryptOAEP(plaintext: string, publicKeyPem: string): Promise<string>;
243
+ export declare function RSAEncryptOAEP(plaintext: string, publicKeyPem: string): Promise<string>;
244
244
  /**
245
245
  * 使用 RSA-OAEP/SHA-256 私钥解密 Base64 密文。
246
246
  *
@@ -249,7 +249,7 @@ declare function RSAEncryptOAEP(plaintext: string, publicKeyPem: string): Promis
249
249
  * @returns 可直接使用或显式调用 `.parseJson<Value>()` 的原始 UTF-8 字符串。
250
250
  * @throws 私钥、Base64 或密文无效时抛出错误。
251
251
  */
252
- declare function RSADecryptOAEP(ciphertext: string, privateKeyPem: string): Promise<DecodedText>;
252
+ export declare function RSADecryptOAEP(ciphertext: string, privateKeyPem: string): Promise<DecodedText>;
253
253
  /**
254
254
  * 使用 RSA-PSS/SHA-256 私钥签名文本或字节。
255
255
  *
@@ -258,7 +258,7 @@ declare function RSADecryptOAEP(ciphertext: string, privateKeyPem: string): Prom
258
258
  * @returns Base64 编码的 RSA-PSS 签名;盐长度固定为 32 字节。
259
259
  * @throws 私钥格式无效或签名失败时抛出错误。
260
260
  */
261
- declare function RSASignPSS(value: string, privateKeyPem: string): Promise<string>;
261
+ export declare function RSASignPSS(value: string, privateKeyPem: string): Promise<string>;
262
262
  /**
263
263
  * 使用 RSA-PSS/SHA-256 公钥验证 Base64 签名。
264
264
  *
@@ -268,14 +268,14 @@ declare function RSASignPSS(value: string, privateKeyPem: string): Promise<strin
268
268
  * @returns 签名与内容、公钥匹配时返回 `true`。
269
269
  * @throws 公钥或 Base64 格式无效时抛出错误。
270
270
  */
271
- declare function RSAVerifyPSS(value: string, signature: string, publicKeyPem: string): Promise<boolean>;
271
+ export declare function RSAVerifyPSS(value: string, signature: string, publicKeyPem: string): Promise<boolean>;
272
272
  /**
273
273
  * 生成 ECDSA PEM 签名密钥对。
274
274
  *
275
275
  * @param namedCurve - NIST 曲线:P-256、P-384 或 P-521。
276
276
  * @returns 未加密 PKCS#8 私钥和 SubjectPublicKeyInfo 公钥组成的 PEM 密钥对。
277
277
  */
278
- declare function GenerateECDSAKeyPair(namedCurve?: EcNamedCurve): Promise<PemKeyPair>;
278
+ export declare function GenerateECDSAKeyPair(namedCurve?: EcNamedCurve): Promise<PemKeyPair>;
279
279
  /**
280
280
  * 使用 ECDSA 私钥签名文本或字节。
281
281
  *
@@ -285,7 +285,7 @@ declare function GenerateECDSAKeyPair(namedCurve?: EcNamedCurve): Promise<PemKey
285
285
  * @param namedCurve - 私钥使用的 NIST 曲线。
286
286
  * @returns Base64 编码的 IEEE P1363 ECDSA 签名。
287
287
  */
288
- declare function ECDSASign(value: string, privateKeyPem: string, namedCurve?: EcNamedCurve): Promise<string>;
288
+ export declare function ECDSASign(value: string, privateKeyPem: string, namedCurve?: EcNamedCurve): Promise<string>;
289
289
  /**
290
290
  * 使用 ECDSA 公钥验证 Base64 签名。
291
291
  *
@@ -295,14 +295,14 @@ declare function ECDSASign(value: string, privateKeyPem: string, namedCurve?: Ec
295
295
  * @param namedCurve - 公钥使用的 NIST 曲线。
296
296
  * @returns 签名与内容、公钥和曲线匹配时返回 `true`。
297
297
  */
298
- declare function ECDSAVerify(value: string, signature: string, publicKeyPem: string, namedCurve?: EcNamedCurve): Promise<boolean>;
298
+ export declare function ECDSAVerify(value: string, signature: string, publicKeyPem: string, namedCurve?: EcNamedCurve): Promise<boolean>;
299
299
  /**
300
300
  * 生成 ECDH PEM 密钥协商密钥对。
301
301
  *
302
302
  * @param namedCurve - NIST 曲线:P-256、P-384 或 P-521。
303
303
  * @returns 未加密 PKCS#8 私钥和 SubjectPublicKeyInfo 公钥组成的 PEM 密钥对。
304
304
  */
305
- declare function GenerateECDHKeyPair(namedCurve?: EcNamedCurve): Promise<PemKeyPair>;
305
+ export declare function GenerateECDHKeyPair(namedCurve?: EcNamedCurve): Promise<PemKeyPair>;
306
306
  /**
307
307
  * 使用本方 ECDH 私钥与对方 ECDH 公钥派生共享秘密。
308
308
  *
@@ -312,7 +312,7 @@ declare function GenerateECDHKeyPair(namedCurve?: EcNamedCurve): Promise<PemKeyP
312
312
  * @param namedCurve - 双方密钥使用的 NIST 曲线。
313
313
  * @returns 曲线字段长度的原始 ECDH 共享秘密。
314
314
  */
315
- declare function DeriveECDHSecret(privateKeyPem: string, publicKeyPem: string, namedCurve?: EcNamedCurve): Promise<Uint8Array>;
315
+ export declare function DeriveECDHSecret(privateKeyPem: string, publicKeyPem: string, namedCurve?: EcNamedCurve): Promise<Uint8Array>;
316
316
  /**
317
317
  * 使用 ECDH 后以 SHA-256 派生共享密钥。
318
318
  *
@@ -322,7 +322,6 @@ declare function DeriveECDHSecret(privateKeyPem: string, publicKeyPem: string, n
322
322
  * @param namedCurve - 双方密钥使用的 NIST 曲线。
323
323
  * @returns 32 字节共享密钥。
324
324
  */
325
- declare function DeriveECDHKeySHA256(privateKeyPem: string, publicKeyPem: string, namedCurve?: EcNamedCurve): Promise<Uint8Array>;
325
+ export declare function DeriveECDHKeySHA256(privateKeyPem: string, publicKeyPem: string, namedCurve?: EcNamedCurve): Promise<Uint8Array>;
326
326
  //#endregion
327
- export { AESDecrypt, AESDecryptAuthenticated, AESDecryptWithPassword, AESEncrypt, AESEncryptAuthenticated, AESEncryptWithPassword, AesCipherMode, AesPaddingMode, DeriveECDHKeySHA256, DeriveECDHSecret, ECDSASign, ECDSAVerify, EcNamedCurve, FixedTimeEquals, GenerateECDHKeyPair, GenerateECDSAKeyPair, GenerateRSAKeyPair, GenerateRandomBytes, HKDFSHA256, HMACSHA256Encrypt, HMACSHA384Encrypt, HMACSHA512Encrypt, HashPasswordPBKDF2SHA256, MD5Encrypt, PBKDF2SHA256, PemKeyPair, RSADecryptOAEP, RSAEncryptOAEP, RSASignPSS, RSAVerifyPSS, SHA1Encrypt, SHA256Bytes, SHA256Encrypt, SHA384Bytes, SHA384Encrypt, SHA512Bytes, SHA512Encrypt, VerifyPasswordPBKDF2SHA256 };
328
327
  //# sourceMappingURL=index.d.mts.map
@@ -1,4 +1,5 @@
1
1
  import { createDecodedText, encodeUtf8, getTextDecoder } from "../internal/text.mjs";
2
+ import { runtimeGlobals } from "../internal/runtime.mjs";
2
3
  import { decodeBase64Bytes, decodeBase64UrlBytes, encodeBase64Bytes, encodeBase64UrlBytes } from "../base64/index.mjs";
3
4
  import AES from "crypto-js/aes.js";
4
5
  import CryptoCore from "crypto-js/core.js";
@@ -31,6 +32,10 @@ const encryptedPayloadPrefix = "FAST-AES-256-GCM-V1";
31
32
  const passwordHashPrefix = "FAST-PBKDF2-SHA256-V1";
32
33
  /** 直接 AES-GCM 密钥加密载荷的协议版本。 */
33
34
  const authenticatedAesPayloadVersion = 1;
35
+ /** 校验 JavaScript 调用方传入的 AES 分组模式。 */
36
+ const assertAesCipherMode = (value) => {
37
+ if (value !== "CBC" && value !== "ECB") throw new RangeError("`cipherMode` 必须是 `CBC` 或 `ECB`。");
38
+ };
34
39
  /**
35
40
  * 获取本模块非随机 API 所需的完整 Web Crypto 能力。
36
41
  *
@@ -38,7 +43,7 @@ const authenticatedAesPayloadVersion = 1;
38
43
  * @throws `Error` 当任一必要 SubtleCrypto 方法缺失。
39
44
  */
40
45
  const requireWebCrypto = () => {
41
- const crypto = globalThis.crypto;
46
+ const crypto = runtimeGlobals.crypto;
42
47
  const subtle = crypto?.subtle;
43
48
  if (typeof subtle?.decrypt !== "function" || typeof subtle.deriveBits !== "function" || typeof subtle.deriveKey !== "function" || typeof subtle.digest !== "function" || typeof subtle.encrypt !== "function" || typeof subtle.exportKey !== "function" || typeof subtle.generateKey !== "function" || typeof subtle.importKey !== "function" || typeof subtle.sign !== "function" || typeof subtle.verify !== "function") throw new Error("当前运行环境不支持 Web Crypto SubtleCrypto。");
44
49
  return crypto;
@@ -173,7 +178,7 @@ const computeHmacBytes = async (value, key, hash) => {
173
178
  function GenerateRandomBytes(length) {
174
179
  if (!Number.isSafeInteger(length) || length < 0 || length > 65536) throw new RangeError("`length` 必须是 0 到 65,536 之间的安全整数。");
175
180
  const bytes = new Uint8Array(length);
176
- const crypto = globalThis.crypto;
181
+ const crypto = runtimeGlobals.crypto;
177
182
  if (typeof crypto?.getRandomValues === "function") return crypto.getRandomValues(bytes);
178
183
  for (let index = 0; index < bytes.length; index += 1) bytes[index] = Math.floor(Math.random() * 256);
179
184
  return bytes;
@@ -400,7 +405,7 @@ async function HKDFSHA256(inputKeyMaterial, salt = /* @__PURE__ */ new Uint8Arra
400
405
  */
401
406
  function AESEncrypt(dataStr, key, vector, cipherMode = "CBC", paddingMode = "PKCS7") {
402
407
  if (dataStr.trim().length === 0 || key.trim().length === 0 || vector.trim().length === 0) return null;
403
- if (cipherMode !== "CBC" && cipherMode !== "ECB") throw new RangeError("`cipherMode` 必须是 `CBC` 或 `ECB`。");
408
+ assertAesCipherMode(cipherMode);
404
409
  let padding = Pkcs7;
405
410
  switch (paddingMode) {
406
411
  case "None":
@@ -444,7 +449,7 @@ function AESEncrypt(dataStr, key, vector, cipherMode = "CBC", paddingMode = "PKC
444
449
  */
445
450
  function AESDecrypt(dataStr, key, vector, cipherMode = "CBC", paddingMode = "PKCS7") {
446
451
  if (dataStr.trim().length === 0 || key.trim().length === 0 || vector.trim().length === 0) return null;
447
- if (cipherMode !== "CBC" && cipherMode !== "ECB") throw new RangeError("`cipherMode` 必须是 `CBC` 或 `ECB`。");
452
+ assertAesCipherMode(cipherMode);
448
453
  let padding = Pkcs7;
449
454
  switch (paddingMode) {
450
455
  case "None":