@fast-china/utils 1.0.37 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/CONTRIBUTING.md +87 -0
- package/README.md +111 -50
- package/README.zh.md +111 -50
- package/SECURITY.md +46 -0
- package/dist/array/index.d.mts +87 -0
- package/dist/array/index.d.mts.map +1 -0
- package/dist/array/index.mjs +161 -0
- package/dist/array/index.mjs.map +1 -0
- package/dist/async/index.d.mts +146 -0
- package/dist/async/index.d.mts.map +1 -0
- package/dist/async/index.mjs +336 -0
- package/dist/async/index.mjs.map +1 -0
- package/dist/base64/index.d.mts +105 -0
- package/dist/base64/index.d.mts.map +1 -0
- package/dist/base64/index.mjs +427 -0
- package/dist/base64/index.mjs.map +1 -0
- package/dist/color/index.d.mts +90 -0
- package/dist/color/index.d.mts.map +1 -0
- package/dist/color/index.mjs +178 -0
- package/dist/color/index.mjs.map +1 -0
- package/dist/crypto/index.d.mts +157 -0
- package/dist/crypto/index.d.mts.map +1 -0
- package/dist/crypto/index.mjs +541 -0
- package/dist/crypto/index.mjs.map +1 -0
- package/dist/date/index.d.mts +191 -0
- package/dist/date/index.d.mts.map +1 -0
- package/dist/date/index.mjs +383 -0
- package/dist/date/index.mjs.map +1 -0
- package/dist/dom/style.d.mts +30 -0
- package/dist/dom/style.d.mts.map +1 -0
- package/dist/dom/style.mjs +74 -0
- package/dist/dom/style.mjs.map +1 -0
- package/dist/env/index.d.mts +63 -0
- package/dist/env/index.d.mts.map +1 -0
- package/dist/env/index.mjs +97 -0
- package/dist/env/index.mjs.map +1 -0
- package/dist/identity/index.d.mts +78 -0
- package/dist/identity/index.d.mts.map +1 -0
- package/dist/identity/index.mjs +87 -0
- package/dist/identity/index.mjs.map +1 -0
- package/dist/index.d.mts +24 -0
- package/dist/index.mjs +23 -0
- package/dist/internal/text.mjs +36 -0
- package/dist/internal/text.mjs.map +1 -0
- package/dist/logger/index.d.mts +87 -0
- package/dist/logger/index.d.mts.map +1 -0
- package/dist/logger/index.mjs +124 -0
- package/dist/logger/index.mjs.map +1 -0
- package/dist/number/index.d.mts +89 -0
- package/dist/number/index.d.mts.map +1 -0
- package/dist/number/index.mjs +215 -0
- package/dist/number/index.mjs.map +1 -0
- package/dist/object/index.d.mts +76 -0
- package/dist/object/index.d.mts.map +1 -0
- package/dist/object/index.mjs +134 -0
- package/dist/object/index.mjs.map +1 -0
- package/dist/storage/index.d.mts +104 -0
- package/dist/storage/index.d.mts.map +1 -0
- package/dist/storage/index.mjs +324 -0
- package/dist/storage/index.mjs.map +1 -0
- package/dist/string/index.d.mts +130 -0
- package/dist/string/index.d.mts.map +1 -0
- package/dist/string/index.mjs +275 -0
- package/dist/string/index.mjs.map +1 -0
- package/dist/vue/emits.d.mts +24 -0
- package/dist/vue/emits.d.mts.map +1 -0
- package/dist/vue/emits.mjs +47 -0
- package/dist/vue/emits.mjs.map +1 -0
- package/dist/vue/expose.d.mts +12 -0
- package/dist/vue/expose.d.mts.map +1 -0
- package/dist/vue/expose.mjs +16 -0
- package/dist/vue/expose.mjs.map +1 -0
- package/dist/vue/func.d.mts +14 -0
- package/dist/vue/func.d.mts.map +1 -0
- package/dist/vue/func.mjs +16 -0
- package/dist/vue/func.mjs.map +1 -0
- package/dist/vue/index.d.mts +9 -0
- package/dist/vue/install.d.mts +69 -0
- package/dist/vue/install.d.mts.map +1 -0
- package/dist/vue/install.mjs +123 -0
- package/dist/vue/install.mjs.map +1 -0
- package/dist/vue/props.d.mts +23 -0
- package/dist/vue/props.d.mts.map +1 -0
- package/dist/vue/props.mjs +41 -0
- package/dist/vue/props.mjs.map +1 -0
- package/dist/vue/render.d.mts +13 -0
- package/dist/vue/render.d.mts.map +1 -0
- package/dist/vue/render.mjs +23 -0
- package/dist/vue/render.mjs.map +1 -0
- package/dist/vue/slots.d.mts +19 -0
- package/dist/vue/slots.d.mts.map +1 -0
- package/dist/vue/slots.mjs +13 -0
- package/dist/vue/slots.mjs.map +1 -0
- package/dist/vue/with.d.mts +12 -0
- package/dist/vue/with.d.mts.map +1 -0
- package/dist/vue/with.mjs +15 -0
- package/dist/vue/with.mjs.map +1 -0
- package/docs/API.md +96 -0
- package/docs/API.zh-CN.md +96 -0
- package/docs/DEVELOPMENT_RELEASE.zh-CN.md +65 -0
- package/docs/RUNTIME_CONTRACT.md +37 -0
- package/package.json +65 -73
- package/src/array/index.ts +173 -0
- package/src/async/index.ts +475 -0
- package/src/base64/index.ts +374 -0
- package/src/color/index.ts +208 -0
- package/src/crypto/index.ts +670 -0
- package/src/date/index.ts +451 -0
- package/src/dom/index.ts +6 -0
- package/src/dom/style.ts +92 -0
- package/src/env/index.ts +169 -0
- package/src/identity/index.ts +144 -0
- package/src/index.ts +20 -0
- package/src/internal/text.ts +46 -0
- package/src/logger/index.ts +219 -0
- package/src/number/index.ts +235 -0
- package/src/object/index.ts +160 -0
- package/src/storage/index.ts +524 -0
- package/src/string/index.ts +328 -0
- package/src/vue/emits.ts +71 -0
- package/src/vue/expose.ts +11 -0
- package/src/vue/func.ts +17 -0
- package/src/vue/index.ts +13 -0
- package/src/vue/install.ts +185 -0
- package/src/vue/props.ts +39 -0
- package/src/vue/render.ts +41 -0
- package/src/vue/slots.ts +23 -0
- package/src/vue/with.ts +10 -0
- package/Fast.png +0 -0
- package/dist/index.global.js +0 -14500
- package/dist/index.global.js.map +0 -1
- package/dist/index.global.min.js +0 -2
- package/dist/index.global.min.js.map +0 -1
- package/es/array/index.d.ts +0 -19
- package/es/array/index.mjs +0 -2
- package/es/array/index.mjs.map +0 -1
- package/es/base64/index.d.ts +0 -21
- package/es/base64/index.mjs +0 -2
- package/es/base64/index.mjs.map +0 -1
- package/es/click/index.d.ts +0 -33
- package/es/click/index.mjs +0 -2
- package/es/click/index.mjs.map +0 -1
- package/es/color/index.d.ts +0 -33
- package/es/color/index.mjs +0 -2
- package/es/color/index.mjs.map +0 -1
- package/es/console/index.d.ts +0 -31
- package/es/console/index.mjs +0 -2
- package/es/console/index.mjs.map +0 -1
- package/es/crypto/index.d.ts +0 -46
- package/es/crypto/index.mjs +0 -2
- package/es/crypto/index.mjs.map +0 -1
- package/es/date/index.d.ts +0 -44
- package/es/date/index.mjs +0 -2
- package/es/date/index.mjs.map +0 -1
- package/es/dom/index.d.ts +0 -1
- package/es/dom/index.mjs +0 -2
- package/es/dom/index.mjs.map +0 -1
- package/es/dom/style.d.ts +0 -12
- package/es/dom/style.mjs +0 -2
- package/es/dom/style.mjs.map +0 -1
- package/es/env/index.d.ts +0 -25
- package/es/env/index.mjs +0 -2
- package/es/env/index.mjs.map +0 -1
- package/es/error/index.d.ts +0 -3
- package/es/error/index.mjs +0 -2
- package/es/error/index.mjs.map +0 -1
- package/es/identity/index.d.ts +0 -14
- package/es/identity/index.mjs +0 -2
- package/es/identity/index.mjs.map +0 -1
- package/es/index.d.ts +0 -15
- package/es/index.es.d.ts +0 -2
- package/es/index.mjs +0 -2
- package/es/index.mjs.map +0 -1
- package/es/object/index.d.ts +0 -13
- package/es/object/index.mjs +0 -2
- package/es/object/index.mjs.map +0 -1
- package/es/storage/index.d.ts +0 -96
- package/es/storage/index.mjs +0 -2
- package/es/storage/index.mjs.map +0 -1
- package/es/string/index.d.ts +0 -114
- package/es/string/index.mjs +0 -2
- package/es/string/index.mjs.map +0 -1
- package/es/vue/emits.d.ts +0 -8
- package/es/vue/emits.mjs +0 -2
- package/es/vue/emits.mjs.map +0 -1
- package/es/vue/expose.d.ts +0 -4
- package/es/vue/expose.mjs +0 -2
- package/es/vue/expose.mjs.map +0 -1
- package/es/vue/func.d.ts +0 -6
- package/es/vue/func.mjs +0 -2
- package/es/vue/func.mjs.map +0 -1
- package/es/vue/index.d.ts +0 -8
- package/es/vue/index.mjs +0 -2
- package/es/vue/index.mjs.map +0 -1
- package/es/vue/install.d.ts +0 -5
- package/es/vue/install.mjs +0 -2
- package/es/vue/install.mjs.map +0 -1
- package/es/vue/props.d.ts +0 -9
- package/es/vue/props.mjs +0 -2
- package/es/vue/props.mjs.map +0 -1
- package/es/vue/slots.d.ts +0 -11
- package/es/vue/slots.mjs +0 -2
- package/es/vue/slots.mjs.map +0 -1
- package/es/vue/useRender.d.ts +0 -6
- package/es/vue/useRender.mjs +0 -2
- package/es/vue/useRender.mjs.map +0 -1
- package/es/vue/with.d.ts +0 -5
- package/es/vue/with.mjs +0 -2
- package/es/vue/with.mjs.map +0 -1
- package/lib/array/index.d.ts +0 -19
- package/lib/array/index.js +0 -2
- package/lib/array/index.js.map +0 -1
- package/lib/base64/index.d.ts +0 -21
- package/lib/base64/index.js +0 -2
- package/lib/base64/index.js.map +0 -1
- package/lib/click/index.d.ts +0 -33
- package/lib/click/index.js +0 -2
- package/lib/click/index.js.map +0 -1
- package/lib/color/index.d.ts +0 -33
- package/lib/color/index.js +0 -2
- package/lib/color/index.js.map +0 -1
- package/lib/console/index.d.ts +0 -31
- package/lib/console/index.js +0 -2
- package/lib/console/index.js.map +0 -1
- package/lib/crypto/index.d.ts +0 -46
- package/lib/crypto/index.js +0 -2
- package/lib/crypto/index.js.map +0 -1
- package/lib/date/index.d.ts +0 -44
- package/lib/date/index.js +0 -2
- package/lib/date/index.js.map +0 -1
- package/lib/dom/index.d.ts +0 -1
- package/lib/dom/index.js +0 -2
- package/lib/dom/index.js.map +0 -1
- package/lib/dom/style.d.ts +0 -12
- package/lib/dom/style.js +0 -2
- package/lib/dom/style.js.map +0 -1
- package/lib/env/index.d.ts +0 -25
- package/lib/env/index.js +0 -2
- package/lib/env/index.js.map +0 -1
- package/lib/error/index.d.ts +0 -3
- package/lib/error/index.js +0 -2
- package/lib/error/index.js.map +0 -1
- package/lib/identity/index.d.ts +0 -14
- package/lib/identity/index.js +0 -2
- package/lib/identity/index.js.map +0 -1
- package/lib/index.d.ts +0 -15
- package/lib/index.es.d.ts +0 -2
- package/lib/index.js +0 -2
- package/lib/index.js.map +0 -1
- package/lib/object/index.d.ts +0 -13
- package/lib/object/index.js +0 -2
- package/lib/object/index.js.map +0 -1
- package/lib/storage/index.d.ts +0 -96
- package/lib/storage/index.js +0 -2
- package/lib/storage/index.js.map +0 -1
- package/lib/string/index.d.ts +0 -114
- package/lib/string/index.js +0 -2
- package/lib/string/index.js.map +0 -1
- package/lib/vue/emits.d.ts +0 -8
- package/lib/vue/emits.js +0 -2
- package/lib/vue/emits.js.map +0 -1
- package/lib/vue/expose.d.ts +0 -4
- package/lib/vue/expose.js +0 -2
- package/lib/vue/expose.js.map +0 -1
- package/lib/vue/func.d.ts +0 -6
- package/lib/vue/func.js +0 -2
- package/lib/vue/func.js.map +0 -1
- package/lib/vue/index.d.ts +0 -8
- package/lib/vue/index.js +0 -2
- package/lib/vue/index.js.map +0 -1
- package/lib/vue/install.d.ts +0 -5
- package/lib/vue/install.js +0 -2
- package/lib/vue/install.js.map +0 -1
- package/lib/vue/props.d.ts +0 -9
- package/lib/vue/props.js +0 -2
- package/lib/vue/props.js.map +0 -1
- package/lib/vue/slots.d.ts +0 -11
- package/lib/vue/slots.js +0 -2
- package/lib/vue/slots.js.map +0 -1
- package/lib/vue/useRender.d.ts +0 -6
- package/lib/vue/useRender.js +0 -2
- package/lib/vue/useRender.js.map +0 -1
- package/lib/vue/with.d.ts +0 -5
- package/lib/vue/with.js +0 -2
- package/lib/vue/with.js.map +0 -1
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
//#region src/color/index.d.ts
|
|
2
|
+
/** 0 至 255 范围的 RGB 颜色。 */
|
|
3
|
+
interface RgbColor {
|
|
4
|
+
/** 蓝色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */
|
|
5
|
+
blue: number;
|
|
6
|
+
/** 绿色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */
|
|
7
|
+
green: number;
|
|
8
|
+
/** 红色通道;必须是闭区间 `[0, 255]` 内的有限数,格式化时舍入到整数。 */
|
|
9
|
+
red: number;
|
|
10
|
+
}
|
|
11
|
+
/** 带 0 至 1 Alpha 通道的 RGB 颜色。 */
|
|
12
|
+
interface RgbaColor extends RgbColor {
|
|
13
|
+
/** 不透明度;必须是闭区间 `[0, 1]` 内的有限数,`0` 完全透明,`1` 完全不透明。 */
|
|
14
|
+
alpha: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 解析可带可不带 `#` 的 `rgb`、`rgba`、`rrggbb` 或 `rrggbbaa`。
|
|
18
|
+
*
|
|
19
|
+
* @param value - 十六进制颜色文本。
|
|
20
|
+
* @returns 标准化的 RGBA 对象;省略 Alpha 时为 1。
|
|
21
|
+
* @throws 输入非法时抛出 `TypeError`。
|
|
22
|
+
*/
|
|
23
|
+
declare function parseHexColor(value: string): RgbaColor;
|
|
24
|
+
/**
|
|
25
|
+
* 把 RGB 或 RGBA 对象格式化为小写十六进制颜色。
|
|
26
|
+
*
|
|
27
|
+
* @param color - 颜色通道;RGB 会四舍五入到最近整数。
|
|
28
|
+
* @param includeAlpha - 是否输出 Alpha;默认只在传入 Alpha 且小于 1 时输出。
|
|
29
|
+
* @returns 小写 `#rrggbb` 或 `#rrggbbaa` 文本。
|
|
30
|
+
* @throws 通道或 Alpha 非法时抛出 `RangeError`。
|
|
31
|
+
*/
|
|
32
|
+
declare function formatHexColor(color: RgbColor | RgbaColor, includeAlpha?: boolean): string;
|
|
33
|
+
/**
|
|
34
|
+
* 线性混合两种十六进制颜色,包括 Alpha 通道。
|
|
35
|
+
*
|
|
36
|
+
* @param first - `amount = 0` 时的颜色。
|
|
37
|
+
* @param second - `amount = 1` 时的颜色。
|
|
38
|
+
* @param amount - 0 至 1 的混合比例。
|
|
39
|
+
* @returns 小写十六进制颜色;任一输入含透明度时保留 Alpha。
|
|
40
|
+
* @throws 颜色非法时抛出 `TypeError`;比例非法时抛出 `RangeError`。
|
|
41
|
+
*/
|
|
42
|
+
declare function mixHexColors(first: string, second: string, amount: number): string;
|
|
43
|
+
/**
|
|
44
|
+
* 按比例向黑色混合。
|
|
45
|
+
*
|
|
46
|
+
* @param color - 合法十六进制颜色。
|
|
47
|
+
* @param amount - 0 至 1 的混合比例。
|
|
48
|
+
* @returns 混入黑色后的十六进制颜色;参数与异常语义见 {@link mixHexColors}。
|
|
49
|
+
*/
|
|
50
|
+
declare function mixHexColorWithBlack(color: string, amount: number): string;
|
|
51
|
+
/**
|
|
52
|
+
* 按比例向白色混合。
|
|
53
|
+
*
|
|
54
|
+
* @param color - 合法十六进制颜色。
|
|
55
|
+
* @param amount - 0 至 1 的混合比例。
|
|
56
|
+
* @returns 混入白色后的十六进制颜色;参数与异常语义见 {@link mixHexColors}。
|
|
57
|
+
*/
|
|
58
|
+
declare function mixHexColorWithWhite(color: string, amount: number): string;
|
|
59
|
+
/**
|
|
60
|
+
* 计算 WCAG sRGB 相对亮度。
|
|
61
|
+
*
|
|
62
|
+
* @remarks Alpha 通道不会参与计算;半透明颜色应先与实际背景混合。
|
|
63
|
+
* @param color - 合法十六进制颜色。
|
|
64
|
+
* @returns 0 至 1 的相对亮度。
|
|
65
|
+
* @throws 输入非法时抛出 `TypeError`。
|
|
66
|
+
*/
|
|
67
|
+
declare function relativeLuminance(color: string): number;
|
|
68
|
+
/**
|
|
69
|
+
* 计算两种不透明颜色的 WCAG 对比度,范围 1 至 21。
|
|
70
|
+
*
|
|
71
|
+
* @remarks 返回比值本身,不代表特定字号或 WCAG 等级必然通过。
|
|
72
|
+
* @param first - 第一种十六进制颜色。
|
|
73
|
+
* @param second - 第二种十六进制颜色。
|
|
74
|
+
* @returns 较亮颜色与较暗颜色的对比度。
|
|
75
|
+
* @throws 输入非法时抛出 `TypeError`。
|
|
76
|
+
*/
|
|
77
|
+
declare function contrastRatio(first: string, second: string): number;
|
|
78
|
+
/**
|
|
79
|
+
* 从两个候选颜色中选择与背景对比度更高的一项。
|
|
80
|
+
*
|
|
81
|
+
* @param background - 实际不透明背景色。
|
|
82
|
+
* @param first - 第一候选,默认黑色。
|
|
83
|
+
* @param second - 第二候选,默认白色。
|
|
84
|
+
* @returns 对比度较高的原始候选字符串;相同时返回 `first`。
|
|
85
|
+
* @throws 任一颜色非法时抛出 `TypeError`。
|
|
86
|
+
*/
|
|
87
|
+
declare function pickHigherContrastColor(background: string, first?: string, second?: string): string;
|
|
88
|
+
//#endregion
|
|
89
|
+
export { RgbColor, RgbaColor, contrastRatio, formatHexColor, mixHexColorWithBlack, mixHexColorWithWhite, mixHexColors, parseHexColor, pickHigherContrastColor, relativeLuminance };
|
|
90
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/color/index.ts"],"mappings":";;UACiB;;EAEhB;;EAEA;;EAEA;;;UAIgB,kBAAkB;;EAElC;;;;;;;;;iBA0De,cAAc,gBAAgB;;;;;;;;;iBAkB9B,eAAe,OAAO,WAAW,WAAW;;;;;;;;;;iBAmB5C,aAAa,eAAe,gBAAgB;;;;;;;;iBAgC5C,qBAAqB,eAAe;;;;;;;;iBAWpC,qBAAqB,eAAe;;;;;;;;;iBAuBpC,kBAAkB;;;;;;;;;;iBAclB,cAAc,eAAe;;;;;;;;;;iBAiB7B,wBAAwB,oBAAoB,gBAAmB"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
//#region src/color/index.ts
|
|
2
|
+
/**
|
|
3
|
+
* 校验 RGB 颜色通道。
|
|
4
|
+
*
|
|
5
|
+
* @param value - 待校验通道值。
|
|
6
|
+
* @param channel - 用于错误消息的通道名称。
|
|
7
|
+
* @throws `RangeError` 当值非有限或超出 0 至 255。
|
|
8
|
+
*/
|
|
9
|
+
const assertRgbChannel = (value, channel) => {
|
|
10
|
+
if (!Number.isFinite(value) || value < 0 || value > 255) throw new RangeError(`${channel} must be a finite number from 0 through 255.`);
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* 校验透明度通道。
|
|
14
|
+
*
|
|
15
|
+
* @param value - 待校验 Alpha 值。
|
|
16
|
+
* @throws `RangeError` 当值非有限或超出闭区间 `[0, 1]`。
|
|
17
|
+
*/
|
|
18
|
+
const assertAlpha = (value) => {
|
|
19
|
+
if (!Number.isFinite(value) || value < 0 || value > 1) throw new RangeError("alpha must be a finite number from 0 through 1.");
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* 规范化十六进制颜色文本。
|
|
23
|
+
*
|
|
24
|
+
* @param value - 可带 `#` 的 3、4、6 或 8 位颜色文本。
|
|
25
|
+
* @returns 不带 `#` 的 6 或 8 位文本。
|
|
26
|
+
* @throws `TypeError` 当长度或字符不符合十六进制颜色格式。
|
|
27
|
+
*/
|
|
28
|
+
const normalizeHexColor = (value) => {
|
|
29
|
+
const normalized = value.startsWith("#") ? value.slice(1) : value;
|
|
30
|
+
if (![
|
|
31
|
+
3,
|
|
32
|
+
4,
|
|
33
|
+
6,
|
|
34
|
+
8
|
|
35
|
+
].includes(normalized.length) || !/^[\dA-F]+$/iu.test(normalized)) throw new TypeError("Expected a 3, 4, 6, or 8 digit hexadecimal color.");
|
|
36
|
+
return normalized.length <= 4 ? Array.from(normalized, (character) => `${character}${character}`).join("") : normalized;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* 格式化单个颜色通道。
|
|
40
|
+
*
|
|
41
|
+
* @param value - 已校验的 0 至 255 通道值。
|
|
42
|
+
* @returns 舍入后的两位小写十六进制文本。
|
|
43
|
+
*/
|
|
44
|
+
const formatHexChannel = (value) => Math.round(value).toString(16).padStart(2, "0");
|
|
45
|
+
/**
|
|
46
|
+
* 解析可带可不带 `#` 的 `rgb`、`rgba`、`rrggbb` 或 `rrggbbaa`。
|
|
47
|
+
*
|
|
48
|
+
* @param value - 十六进制颜色文本。
|
|
49
|
+
* @returns 标准化的 RGBA 对象;省略 Alpha 时为 1。
|
|
50
|
+
* @throws 输入非法时抛出 `TypeError`。
|
|
51
|
+
*/
|
|
52
|
+
function parseHexColor(value) {
|
|
53
|
+
const normalized = normalizeHexColor(value);
|
|
54
|
+
return {
|
|
55
|
+
red: Number.parseInt(normalized.slice(0, 2), 16),
|
|
56
|
+
green: Number.parseInt(normalized.slice(2, 4), 16),
|
|
57
|
+
blue: Number.parseInt(normalized.slice(4, 6), 16),
|
|
58
|
+
alpha: normalized.length === 8 ? Number.parseInt(normalized.slice(6, 8), 16) / 255 : 1
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 把 RGB 或 RGBA 对象格式化为小写十六进制颜色。
|
|
63
|
+
*
|
|
64
|
+
* @param color - 颜色通道;RGB 会四舍五入到最近整数。
|
|
65
|
+
* @param includeAlpha - 是否输出 Alpha;默认只在传入 Alpha 且小于 1 时输出。
|
|
66
|
+
* @returns 小写 `#rrggbb` 或 `#rrggbbaa` 文本。
|
|
67
|
+
* @throws 通道或 Alpha 非法时抛出 `RangeError`。
|
|
68
|
+
*/
|
|
69
|
+
function formatHexColor(color, includeAlpha = "alpha" in color && color.alpha < 1) {
|
|
70
|
+
assertRgbChannel(color.red, "red");
|
|
71
|
+
assertRgbChannel(color.green, "green");
|
|
72
|
+
assertRgbChannel(color.blue, "blue");
|
|
73
|
+
const alpha = "alpha" in color ? color.alpha : 1;
|
|
74
|
+
assertAlpha(alpha);
|
|
75
|
+
return `#${`${formatHexChannel(color.red)}${formatHexChannel(color.green)}${formatHexChannel(color.blue)}`}${includeAlpha ? formatHexChannel(alpha * 255) : ""}`;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 线性混合两种十六进制颜色,包括 Alpha 通道。
|
|
79
|
+
*
|
|
80
|
+
* @param first - `amount = 0` 时的颜色。
|
|
81
|
+
* @param second - `amount = 1` 时的颜色。
|
|
82
|
+
* @param amount - 0 至 1 的混合比例。
|
|
83
|
+
* @returns 小写十六进制颜色;任一输入含透明度时保留 Alpha。
|
|
84
|
+
* @throws 颜色非法时抛出 `TypeError`;比例非法时抛出 `RangeError`。
|
|
85
|
+
*/
|
|
86
|
+
function mixHexColors(first, second, amount) {
|
|
87
|
+
if (!Number.isFinite(amount) || amount < 0 || amount > 1) throw new RangeError("amount must be a finite number from 0 through 1.");
|
|
88
|
+
const left = parseHexColor(first);
|
|
89
|
+
const right = parseHexColor(second);
|
|
90
|
+
/**
|
|
91
|
+
* 在单个 RGBA 通道上执行与外层相同权重的线性混合。
|
|
92
|
+
*
|
|
93
|
+
* @param start - 第一个颜色的通道值。
|
|
94
|
+
* @param end - 第二个颜色的通道值。
|
|
95
|
+
* @returns 按外层 `amount` 线性混合后的通道值。
|
|
96
|
+
*/
|
|
97
|
+
const mix = (start, end) => start + (end - start) * amount;
|
|
98
|
+
return formatHexColor({
|
|
99
|
+
red: mix(left.red, right.red),
|
|
100
|
+
green: mix(left.green, right.green),
|
|
101
|
+
blue: mix(left.blue, right.blue),
|
|
102
|
+
alpha: mix(left.alpha, right.alpha)
|
|
103
|
+
}, left.alpha < 1 || right.alpha < 1);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 按比例向黑色混合。
|
|
107
|
+
*
|
|
108
|
+
* @param color - 合法十六进制颜色。
|
|
109
|
+
* @param amount - 0 至 1 的混合比例。
|
|
110
|
+
* @returns 混入黑色后的十六进制颜色;参数与异常语义见 {@link mixHexColors}。
|
|
111
|
+
*/
|
|
112
|
+
function mixHexColorWithBlack(color, amount) {
|
|
113
|
+
return mixHexColors(color, "#000000", amount);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 按比例向白色混合。
|
|
117
|
+
*
|
|
118
|
+
* @param color - 合法十六进制颜色。
|
|
119
|
+
* @param amount - 0 至 1 的混合比例。
|
|
120
|
+
* @returns 混入白色后的十六进制颜色;参数与异常语义见 {@link mixHexColors}。
|
|
121
|
+
*/
|
|
122
|
+
function mixHexColorWithWhite(color, amount) {
|
|
123
|
+
return mixHexColors(color, "#ffffff", amount);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 按 WCAG sRGB 转换曲线线性化颜色通道。
|
|
127
|
+
*
|
|
128
|
+
* @param channel - 已校验的 0 至 255 通道值。
|
|
129
|
+
* @returns 0 至 1 的线性光值。
|
|
130
|
+
*/
|
|
131
|
+
const linearizeSrgbChannel = (channel) => {
|
|
132
|
+
const value = channel / 255;
|
|
133
|
+
return value <= .04045 ? value / 12.92 : ((value + .055) / 1.055) ** 2.4;
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* 计算 WCAG sRGB 相对亮度。
|
|
137
|
+
*
|
|
138
|
+
* @remarks Alpha 通道不会参与计算;半透明颜色应先与实际背景混合。
|
|
139
|
+
* @param color - 合法十六进制颜色。
|
|
140
|
+
* @returns 0 至 1 的相对亮度。
|
|
141
|
+
* @throws 输入非法时抛出 `TypeError`。
|
|
142
|
+
*/
|
|
143
|
+
function relativeLuminance(color) {
|
|
144
|
+
const { red, green, blue } = parseHexColor(color);
|
|
145
|
+
return .2126 * linearizeSrgbChannel(red) + .7152 * linearizeSrgbChannel(green) + .0722 * linearizeSrgbChannel(blue);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* 计算两种不透明颜色的 WCAG 对比度,范围 1 至 21。
|
|
149
|
+
*
|
|
150
|
+
* @remarks 返回比值本身,不代表特定字号或 WCAG 等级必然通过。
|
|
151
|
+
* @param first - 第一种十六进制颜色。
|
|
152
|
+
* @param second - 第二种十六进制颜色。
|
|
153
|
+
* @returns 较亮颜色与较暗颜色的对比度。
|
|
154
|
+
* @throws 输入非法时抛出 `TypeError`。
|
|
155
|
+
*/
|
|
156
|
+
function contrastRatio(first, second) {
|
|
157
|
+
const firstLuminance = relativeLuminance(first);
|
|
158
|
+
const secondLuminance = relativeLuminance(second);
|
|
159
|
+
const lighter = Math.max(firstLuminance, secondLuminance);
|
|
160
|
+
const darker = Math.min(firstLuminance, secondLuminance);
|
|
161
|
+
return (lighter + .05) / (darker + .05);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* 从两个候选颜色中选择与背景对比度更高的一项。
|
|
165
|
+
*
|
|
166
|
+
* @param background - 实际不透明背景色。
|
|
167
|
+
* @param first - 第一候选,默认黑色。
|
|
168
|
+
* @param second - 第二候选,默认白色。
|
|
169
|
+
* @returns 对比度较高的原始候选字符串;相同时返回 `first`。
|
|
170
|
+
* @throws 任一颜色非法时抛出 `TypeError`。
|
|
171
|
+
*/
|
|
172
|
+
function pickHigherContrastColor(background, first = "#000000", second = "#ffffff") {
|
|
173
|
+
return contrastRatio(background, first) >= contrastRatio(background, second) ? first : second;
|
|
174
|
+
}
|
|
175
|
+
//#endregion
|
|
176
|
+
export { contrastRatio, formatHexColor, mixHexColorWithBlack, mixHexColorWithWhite, mixHexColors, parseHexColor, pickHigherContrastColor, relativeLuminance };
|
|
177
|
+
|
|
178
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +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} must be a finite number from 0 through 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 must be a finite number from 0 through 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(\"Expected a 3, 4, 6, or 8 digit hexadecimal color.\");\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 must be a finite number from 0 through 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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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
//#region src/crypto/index.d.ts
|
|
2
|
+
/** 可直接哈希或比较的二进制输入。 */
|
|
3
|
+
type TextOrBytes = string | Uint8Array;
|
|
4
|
+
/** {@link encryptTextWithPassword} 的密钥派生选项。 */
|
|
5
|
+
interface PasswordEncryptionOptions {
|
|
6
|
+
/**
|
|
7
|
+
* PBKDF2-HMAC-SHA-256 迭代次数,默认 `600_000`,允许 100,000 至 5,000,000。
|
|
8
|
+
* 低于默认值需要调用方基于目标硬件完成明确的安全与性能评估。
|
|
9
|
+
*/
|
|
10
|
+
iterations?: number;
|
|
11
|
+
}
|
|
12
|
+
/** CryptoJS 兼容 AES 模式。 */
|
|
13
|
+
type LegacyAesCipherMode = "CBC" | "ECB";
|
|
14
|
+
/** Web Crypto 导出的 PEM 公私钥对。 */
|
|
15
|
+
interface PemKeyPair {
|
|
16
|
+
/** 未加密的 PKCS#8 PEM 私钥,包含标准 `PRIVATE KEY` 头尾和 64 字符换行。 */
|
|
17
|
+
privateKey: string;
|
|
18
|
+
/** SubjectPublicKeyInfo PEM 公钥,包含标准 `PUBLIC KEY` 头尾和 64 字符换行。 */
|
|
19
|
+
publicKey: string;
|
|
20
|
+
}
|
|
21
|
+
/** RSA-OAEP 密钥生成选项。 */
|
|
22
|
+
interface RsaKeyPairOptions {
|
|
23
|
+
/** RSA 模数位数,默认 2048;必须是不小于 2048 的 256 倍数。 */
|
|
24
|
+
modulusLength?: number;
|
|
25
|
+
}
|
|
26
|
+
/** 本模块支持的 Web Crypto 椭圆曲线。 */
|
|
27
|
+
type EcNamedCurve = "P-256" | "P-384" | "P-521";
|
|
28
|
+
/**
|
|
29
|
+
* 生成安全随机字节。
|
|
30
|
+
*
|
|
31
|
+
* @param length - 0 至 65,536 的安全整数;上限来自 Web Crypto 单次请求限制。
|
|
32
|
+
* @returns 新建的 `Uint8Array`。
|
|
33
|
+
* @throws 参数非法时抛出 `RangeError`;缺少 Web Crypto 时抛出 `Error`。
|
|
34
|
+
*/
|
|
35
|
+
declare function generateRandomBytes(length: number): Uint8Array;
|
|
36
|
+
/**
|
|
37
|
+
* 计算 SHA-256 摘要。
|
|
38
|
+
*
|
|
39
|
+
* @remarks SHA-256 是快速摘要,不适合直接存储或校验密码。
|
|
40
|
+
* @param value - UTF-8 字符串或原始字节。
|
|
41
|
+
* @returns 32 字节摘要。
|
|
42
|
+
* @throws 缺少 Web Crypto 或 Encoding API 时抛出 `Error`。
|
|
43
|
+
*/
|
|
44
|
+
declare function sha256Bytes(value: TextOrBytes): Promise<Uint8Array>;
|
|
45
|
+
/**
|
|
46
|
+
* 计算 SHA-256 并格式化为十六进制。
|
|
47
|
+
*
|
|
48
|
+
* @param value - UTF-8 字符串或原始字节。
|
|
49
|
+
* @returns 64 字符小写十六进制文本。
|
|
50
|
+
* @throws 缺少 Web Crypto 或 Encoding API 时抛出 `Error`。
|
|
51
|
+
*/
|
|
52
|
+
declare function sha256Hex(value: TextOrBytes): Promise<string>;
|
|
53
|
+
/**
|
|
54
|
+
* 计算 MD5 摘要并返回小写十六进制文本。
|
|
55
|
+
*
|
|
56
|
+
* @remarks MD5 仅用于历史协议和非安全校验,不得用于密码、签名或抗碰撞场景。
|
|
57
|
+
* @param value - UTF-8 文本。
|
|
58
|
+
* @returns 32 字符小写十六进制摘要。
|
|
59
|
+
*/
|
|
60
|
+
declare function md5Hex(value: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* 计算 SHA-1 摘要并返回小写十六进制文本。
|
|
63
|
+
*
|
|
64
|
+
* @remarks SHA-1 仅用于旧系统互通;新用途应使用 {@link sha256Hex}。
|
|
65
|
+
* @param value - UTF-8 文本。
|
|
66
|
+
* @returns 40 字符小写十六进制摘要。
|
|
67
|
+
*/
|
|
68
|
+
declare function sha1Hex(value: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* 使用 AES-256-CBC 与 PKCS#7 填充加密文本。
|
|
71
|
+
*
|
|
72
|
+
* @remarks 密钥按 UTF-8 文本补齐或截断为 32 个字符,IV 补齐或截断为 16 个字符。
|
|
73
|
+
* 该格式不包含认证标签;新数据优先使用 {@link encryptTextWithPassword}。
|
|
74
|
+
* @param plaintext - UTF-8 明文。
|
|
75
|
+
* @param key - 兼容密钥文本。
|
|
76
|
+
* @param vector - 兼容初始化向量文本。
|
|
77
|
+
* @returns CryptoJS Base64 密文。
|
|
78
|
+
*/
|
|
79
|
+
declare function encryptLegacyAesCbc(plaintext: string, key: string, vector: string): string;
|
|
80
|
+
/** 解密 {@link encryptLegacyAesCbc} 生成的 CryptoJS Base64 密文。 */
|
|
81
|
+
declare function decryptLegacyAesCbc(ciphertext: string, key: string, vector: string): string;
|
|
82
|
+
/**
|
|
83
|
+
* 使用 AES-256-ECB 与 PKCS#7 填充加密文本。
|
|
84
|
+
*
|
|
85
|
+
* @remarks ECB 会暴露重复明文块结构,只能用于必须兼容的旧协议,不得用于新数据设计。
|
|
86
|
+
* @param plaintext - UTF-8 明文。
|
|
87
|
+
* @param key - 兼容密钥文本,补齐或截断为 32 个字符。
|
|
88
|
+
* @returns CryptoJS Base64 密文。
|
|
89
|
+
*/
|
|
90
|
+
declare function encryptLegacyAesEcb(plaintext: string, key: string): string;
|
|
91
|
+
/** 解密 {@link encryptLegacyAesEcb} 生成的 CryptoJS Base64 密文。 */
|
|
92
|
+
declare function decryptLegacyAesEcb(ciphertext: string, key: string): string;
|
|
93
|
+
/** 生成可导出的 RSA-OAEP/SHA-256 PEM 密钥对。 */
|
|
94
|
+
declare function generateRsaOaepKeyPair(options?: RsaKeyPairOptions): Promise<PemKeyPair>;
|
|
95
|
+
/** 使用 RSA-OAEP/SHA-256 公钥加密 UTF-8 文本,并返回 Base64 密文。 */
|
|
96
|
+
declare function encryptRsaOaep(plaintext: string, publicKeyPem: string): Promise<string>;
|
|
97
|
+
/** 使用 RSA-OAEP/SHA-256 私钥解密 Base64 密文。 */
|
|
98
|
+
declare function decryptRsaOaep(ciphertext: string, privateKeyPem: string): Promise<string>;
|
|
99
|
+
/** 生成 ECDSA PEM 签名密钥对。 */
|
|
100
|
+
declare function generateEcdsaKeyPair(namedCurve?: EcNamedCurve): Promise<PemKeyPair>;
|
|
101
|
+
/** 使用 ECDSA 私钥签名文本或字节,并返回 Base64 签名。 */
|
|
102
|
+
declare function signEcdsa(value: TextOrBytes, privateKeyPem: string, namedCurve?: EcNamedCurve): Promise<string>;
|
|
103
|
+
/** 使用 ECDSA 公钥验证 Base64 签名。 */
|
|
104
|
+
declare function verifyEcdsa(value: TextOrBytes, signature: string, publicKeyPem: string, namedCurve?: EcNamedCurve): Promise<boolean>;
|
|
105
|
+
/** 生成 ECDH PEM 密钥协商密钥对。 */
|
|
106
|
+
declare function generateEcdhKeyPair(namedCurve?: EcNamedCurve): Promise<PemKeyPair>;
|
|
107
|
+
/**
|
|
108
|
+
* 使用本方 ECDH 私钥与对方 ECDH 公钥派生共享秘密。
|
|
109
|
+
*
|
|
110
|
+
* @remarks 返回值仍需经过合适的 KDF 后才能作为对称密钥,不应直接长期存储。
|
|
111
|
+
*/
|
|
112
|
+
declare function deriveEcdhSecret(privateKeyPem: string, publicKeyPem: string, namedCurve?: EcNamedCurve): Promise<Uint8Array>;
|
|
113
|
+
/**
|
|
114
|
+
* 以不提前退出的方式比较两个字节数组。
|
|
115
|
+
*
|
|
116
|
+
* @remarks JavaScript 引擎不保证严格常量时间;该函数只避免显式短路,不能替代服务端
|
|
117
|
+
* 密码学库提供的 timing-safe primitive。长度是否相同仍属于可观察信息。
|
|
118
|
+
* @param left - 第一字节序列。
|
|
119
|
+
* @param right - 第二字节序列。
|
|
120
|
+
* @returns 长度和每个字节均相同时返回 `true`。
|
|
121
|
+
*/
|
|
122
|
+
declare function areBytesEqualWithoutEarlyExit(left: Uint8Array, right: Uint8Array): boolean;
|
|
123
|
+
/**
|
|
124
|
+
* 使用 PBKDF2-HMAC-SHA-256 派生密钥,再以 AES-256-GCM 认证加密 UTF-8 文本。
|
|
125
|
+
*
|
|
126
|
+
* @remarks 每次调用生成独立 16 字节盐与 12 字节 IV。输出是本库 v2 自描述载荷,
|
|
127
|
+
* 不应被拆分、修改或当作跨语言标准格式。密码加密不替代密钥管理;长期高价值数据
|
|
128
|
+
* 应使用平台 KMS 或专门的加密方案。
|
|
129
|
+
* @param plaintext - 原始文本,不进行 JSON 推断;UTF-8 编码后最大 8 MiB。
|
|
130
|
+
* @param password - 1 至 1024 UTF-8 字节的秘密口令。
|
|
131
|
+
* @param options - PBKDF2 工作因子。
|
|
132
|
+
* @returns 认证密文字符串;相同输入每次产生不同结果。
|
|
133
|
+
* @throws 口令非法时抛出 `TypeError` 或 `RangeError`;明文过大时抛出 `RangeError`;
|
|
134
|
+
* 运行时缺少 Web Crypto 或 Encoding API 时抛出 `Error`。
|
|
135
|
+
*/
|
|
136
|
+
declare function encryptTextWithPassword(plaintext: string, password: string, options?: PasswordEncryptionOptions): Promise<string>;
|
|
137
|
+
/**
|
|
138
|
+
* 解密 {@link encryptTextWithPassword} 生成的 v2 认证载荷。
|
|
139
|
+
*
|
|
140
|
+
* @param payload - 未修改的 v2 载荷,最大约 16 MiB 文本。
|
|
141
|
+
* @param password - 加密时使用的口令。
|
|
142
|
+
* @returns 原始 UTF-8 文本。
|
|
143
|
+
* @throws 格式或字段非法时抛出 `TypeError`,载荷过大时抛出 `RangeError`,认证或密码
|
|
144
|
+
* 失败及缺少平台能力时抛出 `Error`。
|
|
145
|
+
*/
|
|
146
|
+
declare function decryptTextWithPassword(payload: string, password: string): Promise<string>;
|
|
147
|
+
/** 解密历史 AES-CBC/ECB 字符串,并优先解析 JSON 结果。 */
|
|
148
|
+
declare function decryptLegacyAesValue<Result = string>(dataStr: string, key: string, vector: string, cipherMode?: LegacyAesCipherMode): Result | null;
|
|
149
|
+
/** 按指定 CBC/ECB 模式加密历史 AES 字符串。 */
|
|
150
|
+
declare function encryptLegacyAes(dataStr: string, key: string, vector: string, cipherMode?: LegacyAesCipherMode): string;
|
|
151
|
+
/** 返回历史兼容的大写 MD5 十六进制摘要。 */
|
|
152
|
+
declare function md5UpperHex(value: string): string;
|
|
153
|
+
/** 返回历史兼容的大写 SHA-1 十六进制摘要。 */
|
|
154
|
+
declare function sha1UpperHex(value: string): string;
|
|
155
|
+
//#endregion
|
|
156
|
+
export { EcNamedCurve, LegacyAesCipherMode, PasswordEncryptionOptions, PemKeyPair, RsaKeyPairOptions, TextOrBytes, areBytesEqualWithoutEarlyExit, decryptLegacyAesCbc, decryptLegacyAesEcb, decryptLegacyAesValue, decryptRsaOaep, decryptTextWithPassword, deriveEcdhSecret, encryptLegacyAes, encryptLegacyAesCbc, encryptLegacyAesEcb, encryptRsaOaep, encryptTextWithPassword, generateEcdhKeyPair, generateEcdsaKeyPair, generateRandomBytes, generateRsaOaepKeyPair, md5Hex, md5UpperHex, sha1Hex, sha1UpperHex, sha256Bytes, sha256Hex, signEcdsa, verifyEcdsa };
|
|
157
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/crypto/index.ts"],"mappings":";;KAyCY,uBAAuB;;UAGlB;;;;;EAKhB;;;KAIW;;UAGK;;EAEhB;;EAEA;;;UAIgB;;EAEhB;;;KAIW;;;;;;;;iBAqPI,oBAAoB,iBAAiB;;;;;;;;;iBAe/B,YAAY,OAAO,cAAc,QAAQ;;;;;;;;iBAYzC,UAAU,OAAO,cAAc;;;;;;;;iBAYrC,OAAO;;;;;;;;iBAWP,QAAQ;;;;;;;;;;;iBAcR,oBAAoB,mBAAmB,aAAa;;iBASpD,oBAAoB,oBAAoB,aAAa;;;;;;;;;iBAgBrD,oBAAoB,mBAAmB;;iBASvC,oBAAoB,oBAAoB;;iBASlC,uBAAuB,UAAS,oBAAyB,QAAQ;;iBAsBjE,eAAe,mBAAmB,uBAAuB;;iBAUzD,eAAe,oBAAoB,wBAAwB;;iBAU3D,qBAAqB,aAAY,eAAyB,QAAQ;;iBAOlE,UAAU,OAAO,aAAa,uBAAuB,aAAY,eAAyB;;iBAQ1F,YAAY,OAAO,aAAa,mBAAmB,sBAAsB,aAAY,eAAyB;;iBAY9G,oBAAoB,aAAY,eAAyB,QAAQ;;;;;;iBAWjE,iBAAiB,uBAAuB,sBAAsB,aAAY,eAAyB,QAAQ;;;;;;;;;;iBAmBjH,8BAA8B,MAAM,YAAY,OAAO;;;;;;;;;;;;;;iBAqBjD,wBAAwB,mBAAmB,kBAAkB,UAAS,4BAAiC;;;;;;;;;;iBAoCvG,wBAAwB,iBAAiB,mBAAmB;;iBAwDlE,sBAAsB,iBACrC,iBACA,aACA,gBACA,aAAa,sBACX;;iBAiBa,iBAAiB,iBAAiB,aAAa,gBAAgB,aAAa;;iBAM5E,YAAY;;iBAKZ,aAAa"}
|