ph-utils 0.3.1 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -1,11 +1,11 @@
1
- ## ph-utils
2
-
3
- 整理了 js 前后端开发(web + nodejs)时常用的一些工具;[详细文档](https://gitee.com/towardly/ph/wikis/Home?sort_id=4035190)
4
-
5
- ### 后端(node server)
6
-
7
- 包含了一些 node 后端开发(web server) 时常用的工具类,包括 `index` 基础工具类(这个类里面的函数同样也适用于前端)、`date` 跟日期相关的工具类、`file` 文件操作相关工具类、`server` 一些只适用于后端的工具(使用了后端的 API 列表)、`validator` 数据验证
8
-
9
- ### 前端(web)
10
-
11
- 包含了一些前端网站开发时常用的工具类,包括 `index` 基础工具类(这个类里面的函数同样也适用于前端)、`date` 跟日期相关的工具类、`dom` 浏览器节点操作相关、`web` 一些只适用于前端相关的工具、`validator` 数据验证
1
+ ## ph-utils
2
+
3
+ 整理了 js 前后端开发(web + nodejs)时常用的一些工具;[详细文档](https://gitee.com/towardly/ph/wikis/Home?sort_id=4035190)
4
+
5
+ ### 后端(node server)
6
+
7
+ 包含了一些 node 后端开发(web server) 时常用的工具类,包括 `index` 基础工具类(这个类里面的函数同样也适用于前端)、`date` 跟日期相关的工具类、`file` 文件操作相关工具类、`server` 一些只适用于后端的工具(使用了后端的 API 列表)、`validator` 数据验证
8
+
9
+ ### 前端(web)
10
+
11
+ 包含了一些前端网站开发时常用的工具类,包括 `index` 基础工具类(这个类里面的函数同样也适用于前端)、`date` 跟日期相关的工具类、`dom` 浏览器节点操作相关、`web` 一些只适用于前端相关的工具、`validator` 数据验证
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 将原始的二进制数据转换为 Hex String
3
+ * @param bf 待转换的原始数据
4
+ * @param upper 是否需要转换为大写
5
+ * @returns
6
+ */
7
+ export declare function bufferToHex(bf: ArrayBuffer | Uint8Array, upper?: boolean): string;
8
+ /**
9
+ * SHA 哈希算法
10
+ * @param message 待进行 hash 的数据
11
+ * @param upper 是否转换为大写, 默认为: false
12
+ * @param algorithm hash算法, 支持: SHA-1、SHA-256、SHA-384、SHA-512; 默认为: SHA-256
13
+ * @returns
14
+ */
15
+ export declare function sha(message: string, upper?: boolean, algorithm?: string): Promise<string>;
16
+ /** 返回结果类似 */
17
+ type AlgorithmResType = 'hex' | 'hexUpper' | 'base64' | 'raw';
18
+ /**
19
+ * AES 加密
20
+ * @param message 待加密的数据
21
+ * @param key 加解密密钥
22
+ * @param encode 加密后的数据转换的形式, hex - 转换为16进制字符串, hexUpper - 转换为16进制且大写, base64 - 转换为 base64 形式
23
+ * @param iv 加解密向量
24
+ * @returns [加密数据,向量]
25
+ */
26
+ export declare function aesEncrypt(message: string, key: string, encode?: AlgorithmResType, iv?: null | Uint8Array | string): Promise<{
27
+ ciphertext: string | ArrayBuffer;
28
+ iv: string;
29
+ key: string;
30
+ }>;
31
+ /**
32
+ * AES 解密
33
+ * @param message 加密后的数据
34
+ * @param key 解密密钥
35
+ * @param iv 向量
36
+ * @param encode 加密后数据的形式: hex | base64
37
+ * @returns
38
+ */
39
+ export declare function aesDecrypt(message: Uint8Array | string, key: string, iv: string, encode?: AlgorithmResType): Promise<string>;
40
+ /**
41
+ * RSA 加密
42
+ * @param key 公钥
43
+ * @param message 待加密数据
44
+ * @param encode 返回类型
45
+ * @returns
46
+ */
47
+ export declare function rsaEncrypt(message: string, publicKey: string, encode?: AlgorithmResType): Promise<string | ArrayBuffer>;
48
+ /**
49
+ * RSA 解密
50
+ * @param key 私钥, 根据私钥解密
51
+ * @param message 加密后的数据
52
+ * @param encode 加密后的数据形式
53
+ * @returns
54
+ */
55
+ export declare function rsaDecrypt(privateKey: string, message: Uint8Array | string, encode?: AlgorithmResType): Promise<string>;
56
+ export {};
package/lib/crypto.js ADDED
@@ -0,0 +1,232 @@
1
+ /* eslint-disable no-undef */
2
+ /**
3
+ * 将原始的二进制数据转换为 Hex String
4
+ * @param bf 待转换的原始数据
5
+ * @param upper 是否需要转换为大写
6
+ * @returns
7
+ */
8
+ export function bufferToHex(bf, upper = false) {
9
+ const u8Array = bf instanceof Uint8Array ? bf : new Uint8Array(bf);
10
+ const hashArray = Array.from(u8Array);
11
+ return hashArray
12
+ .map((b) => {
13
+ let hx = b.toString(16).padStart(2, '0');
14
+ return upper === true ? hx.toUpperCase() : hx;
15
+ })
16
+ .join('');
17
+ }
18
+ /**
19
+ * 将16进制的数据转换为 UInt8Array
20
+ * @param data 16进制的数据
21
+ * @returns
22
+ */
23
+ function hexToBuffer(data) {
24
+ const len = data.length / 2;
25
+ const uint8Array = new Uint8Array(len);
26
+ for (let i = 0; i < len; i++) {
27
+ const byteHex = data.substring(i * 2, i * 2 + 2);
28
+ const byte = parseInt(byteHex.toLocaleLowerCase(), 16);
29
+ uint8Array[i] = byte;
30
+ }
31
+ return uint8Array;
32
+ }
33
+ /**
34
+ * 将原始数据转换为 Base64 编码
35
+ * @param bf 待转换的原始数据
36
+ * @returns
37
+ */
38
+ function bufferToBase64(bf) {
39
+ const u8Array = bf instanceof Uint8Array ? bf : new Uint8Array(bf);
40
+ const hashArray = Array.from(u8Array);
41
+ return window.btoa(String.fromCharCode.apply(null, hashArray));
42
+ }
43
+ /**
44
+ * 将 Base64 转换为 UInt8Array 数据
45
+ * @param data
46
+ * @returns
47
+ */
48
+ function base64ToBuffer(data) {
49
+ return new Uint8Array(window
50
+ .atob(data)
51
+ .split('')
52
+ .map((char) => char.charCodeAt(0)));
53
+ }
54
+ /**
55
+ * SHA 哈希算法
56
+ * @param message 待进行 hash 的数据
57
+ * @param upper 是否转换为大写, 默认为: false
58
+ * @param algorithm hash算法, 支持: SHA-1、SHA-256、SHA-384、SHA-512; 默认为: SHA-256
59
+ * @returns
60
+ */
61
+ export async function sha(message, upper = false, algorithm = 'SHA-256') {
62
+ const msgUint8 = new TextEncoder().encode(message);
63
+ const hashBuffer = await window.crypto.subtle.digest(algorithm || 'SHA-256', msgUint8);
64
+ return bufferToHex(hashBuffer, upper);
65
+ }
66
+ function parseRsaKey(pem) {
67
+ const pemHeader = '-----BEGIN PUBLIC KEY-----';
68
+ const pemFooter = '-----END PUBLIC KEY-----';
69
+ if (pem.indexOf(pemHeader) !== -1 && pem.indexOf(pemFooter) !== -1) {
70
+ pem = pem.substring(pemHeader.length, pem.indexOf(pemFooter)).trim();
71
+ }
72
+ return pem;
73
+ }
74
+ /**
75
+ * 导入上下文密钥
76
+ * @param key 导入的密钥
77
+ * @param algorithmName 算法名称
78
+ * @param usages 该密钥可以用于哪些函数使用
79
+ * @returns
80
+ */
81
+ // eslint-disable-next-line no-undef
82
+ async function importKey(key, algorithmName, usages, encoding = 'hex') {
83
+ let name = 'AES-CBC';
84
+ if (algorithmName == null) {
85
+ name = 'AES-CBC';
86
+ }
87
+ else {
88
+ if (algorithmName.toUpperCase() === 'AES') {
89
+ name = 'AES-CBC';
90
+ }
91
+ else if (algorithmName.toUpperCase() === 'RSA') {
92
+ name = 'RSA-OAEP';
93
+ }
94
+ }
95
+ name = name.toUpperCase();
96
+ if (usages == null || usages.length === 0) {
97
+ usages = ['encrypt'];
98
+ }
99
+ let format = 'raw';
100
+ let algorithm = { name };
101
+ if (name.includes('RSA')) {
102
+ format = 'spki';
103
+ algorithm.hash = { name: 'SHA-256' };
104
+ key = parseRsaKey(key);
105
+ }
106
+ const keyBuf = encoding === 'base64' ? base64ToBuffer(key) : hexToBuffer(key);
107
+ // importKey时传 false 表明该密钥不能被导出
108
+ return Promise.all([
109
+ window.crypto.subtle.importKey(format, keyBuf, algorithm, false, usages),
110
+ Promise.resolve({ name }),
111
+ ]);
112
+ }
113
+ /**
114
+ * 加密
115
+ * @param algorithm 算法参数, 算法名称、向量等
116
+ * @param key 算法密钥
117
+ * @param message 待加密的数据
118
+ * @param encode 解密后返回数据格式
119
+ * @returns
120
+ */
121
+ async function encrypt(algorithm, key, message, encode = 'hex') {
122
+ if (typeof message === 'string') {
123
+ message = new TextEncoder().encode(message);
124
+ }
125
+ const encrypted = await window.crypto.subtle.encrypt(algorithm, key, message);
126
+ if (encode === 'hex') {
127
+ return bufferToHex(encrypted);
128
+ }
129
+ else if (encode === 'hexUpper') {
130
+ return bufferToHex(encrypted, true);
131
+ }
132
+ else if (encode === 'base64') {
133
+ return bufferToBase64(encrypted);
134
+ }
135
+ else {
136
+ return encrypted;
137
+ }
138
+ }
139
+ /**
140
+ * 数据解密
141
+ * @param algorithm 解密算法
142
+ * @param key 解密密钥
143
+ * @param message 加密后的数据
144
+ * @returns
145
+ */
146
+ async function decrypt(algorithm, key, message) {
147
+ const decrypted = await window.crypto.subtle.decrypt(algorithm, key, message);
148
+ return new TextDecoder('utf-8').decode(decrypted);
149
+ }
150
+ /**
151
+ * AES 加密
152
+ * @param message 待加密的数据
153
+ * @param key 加解密密钥
154
+ * @param encode 加密后的数据转换的形式, hex - 转换为16进制字符串, hexUpper - 转换为16进制且大写, base64 - 转换为 base64 形式
155
+ * @param iv 加解密向量
156
+ * @returns [加密数据,向量]
157
+ */
158
+ export async function aesEncrypt(message, key, encode = 'hex', iv = null) {
159
+ let ciphertext = '';
160
+ let resIv = '';
161
+ // 导入密钥
162
+ const [cryptoKey, algorithm] = await importKey(key, 'aes', ['encrypt']);
163
+ if (iv == null) {
164
+ iv = window.crypto.getRandomValues(new Uint8Array(16));
165
+ }
166
+ else if (typeof iv === 'string') {
167
+ iv = hexToBuffer(iv);
168
+ }
169
+ const encodeData = await encrypt({ ...algorithm, iv }, cryptoKey, message, encode);
170
+ ciphertext = encodeData;
171
+ resIv = bufferToHex(iv);
172
+ return { ciphertext, iv: resIv, key };
173
+ }
174
+ /**
175
+ * 根据加密后的数据类型使用对应函数最终转换为 UInt8Array
176
+ * @param message 原始加密后的数据
177
+ * @param type 类型: hex | base64
178
+ * @returns
179
+ */
180
+ function parseEncryptData(message, type) {
181
+ let input;
182
+ if (typeof message === 'string') {
183
+ if (type === 'hex' || type === 'hexUpper') {
184
+ input = hexToBuffer(message);
185
+ }
186
+ else {
187
+ input = base64ToBuffer(message);
188
+ }
189
+ }
190
+ else {
191
+ input = message;
192
+ }
193
+ return input;
194
+ }
195
+ /**
196
+ * AES 解密
197
+ * @param message 加密后的数据
198
+ * @param key 解密密钥
199
+ * @param iv 向量
200
+ * @param encode 加密后数据的形式: hex | base64
201
+ * @returns
202
+ */
203
+ export async function aesDecrypt(message, key, iv, encode = 'hex') {
204
+ // 导入密钥
205
+ const [cryptoKey, algorithm] = await importKey(key, 'aes', ['decrypt']);
206
+ const input = parseEncryptData(message, encode);
207
+ return await decrypt({ ...algorithm, iv: hexToBuffer(iv) }, cryptoKey, input);
208
+ }
209
+ /**
210
+ * RSA 加密
211
+ * @param key 公钥
212
+ * @param message 待加密数据
213
+ * @param encode 返回类型
214
+ * @returns
215
+ */
216
+ export async function rsaEncrypt(message, publicKey, encode = 'hex') {
217
+ // 导入密钥
218
+ const [cryptoKey, algorithm] = await importKey(publicKey, 'rsa', ['encrypt'], 'base64');
219
+ return await encrypt(algorithm, cryptoKey, message, encode);
220
+ }
221
+ /**
222
+ * RSA 解密
223
+ * @param key 私钥, 根据私钥解密
224
+ * @param message 加密后的数据
225
+ * @param encode 加密后的数据形式
226
+ * @returns
227
+ */
228
+ export async function rsaDecrypt(privateKey, message, encode = 'hex') {
229
+ // 导入密钥
230
+ const [cryptoKey, algorithm] = await importKey(privateKey, 'rsa', ['decrypt']);
231
+ return await decrypt({ ...algorithm }, cryptoKey, parseEncryptData(message, encode));
232
+ }
@@ -0,0 +1,44 @@
1
+ type HashAlgorithmName = 'md5' | 'sha1' | 'sha256';
2
+ /**
3
+ * 进行 md5|sha1|sha256 数据摘要签名
4
+ * @param d 待加密的数据
5
+ * @param algorithm 签名算法, md5、sha1. Defaults to "md5".
6
+ * @param upper 返回的结果是否需要大写. Defaults to False.
7
+ */
8
+ export declare function hashDigest(d: string, algorithm?: HashAlgorithmName, upper?: boolean): string;
9
+ /**
10
+ * 生成 RSA 签名密钥对
11
+ * @returns: [公钥, 私钥]
12
+ */
13
+ export declare function keyPair(): Promise<[string, string]>;
14
+ /**
15
+ * AES 加密
16
+ * @param key 加密密钥
17
+ * @param input 待加密的数据
18
+ * @param upper 是否转换为大写
19
+ * @returns [加密数据, 向量]
20
+ */
21
+ export declare function aesEncrypt(key: string, input: string, upper?: boolean): [string, string];
22
+ /**
23
+ * AES 解密
24
+ * @param input 加密后的数据
25
+ * @param key 密钥
26
+ * @param iv 向量
27
+ * @returns
28
+ */
29
+ export declare function aesDecrypt(input: string, key: string, iv: string): string;
30
+ /**
31
+ * RSA 公钥加密
32
+ * @param input 待加密字符串
33
+ * @param publicKey 公钥
34
+ * @returns
35
+ */
36
+ export declare function rsaEncrypt(input: string, publicKey: string): string;
37
+ /**
38
+ * RSA 解密
39
+ * @param encrtypData RSA加密后的数据
40
+ * @param privateKey 私钥
41
+ * @returns
42
+ */
43
+ export declare function rsaDecrypt(encrtypData: string, privateKey: string): string;
44
+ export {};
@@ -0,0 +1,88 @@
1
+ import { createHash, createCipheriv, randomBytes, generateKeyPair, createDecipheriv, privateDecrypt, publicEncrypt, } from 'node:crypto';
2
+ /**
3
+ * 进行 md5|sha1|sha256 数据摘要签名
4
+ * @param d 待加密的数据
5
+ * @param algorithm 签名算法, md5、sha1. Defaults to "md5".
6
+ * @param upper 返回的结果是否需要大写. Defaults to False.
7
+ */
8
+ export function hashDigest(d, algorithm = 'sha256', upper = false) {
9
+ const hashed = createHash(algorithm).update(d).digest('hex');
10
+ return upper ? hashed.toUpperCase() : hashed;
11
+ }
12
+ /**
13
+ * 生成 RSA 签名密钥对
14
+ * @returns: [公钥, 私钥]
15
+ */
16
+ export async function keyPair() {
17
+ return new Promise((resolve, reject) => {
18
+ generateKeyPair('rsa', {
19
+ modulusLength: 2048,
20
+ publicKeyEncoding: {
21
+ type: 'spki',
22
+ format: 'pem',
23
+ },
24
+ privateKeyEncoding: {
25
+ type: 'pkcs8',
26
+ format: 'pem',
27
+ },
28
+ }, (err, publicKey, privateKey) => {
29
+ if (err == null) {
30
+ resolve([publicKey, privateKey]);
31
+ }
32
+ else {
33
+ reject(err);
34
+ }
35
+ });
36
+ });
37
+ }
38
+ /**
39
+ * AES 加密
40
+ * @param key 加密密钥
41
+ * @param input 待加密的数据
42
+ * @param upper 是否转换为大写
43
+ * @returns [加密数据, 向量]
44
+ */
45
+ export function aesEncrypt(key, input, upper = false) {
46
+ const iv = randomBytes(16);
47
+ const cipher = createCipheriv('aes-256-cbc', Buffer.from(key, 'hex'), iv);
48
+ let encryptedData = cipher.update(input, 'utf-8', 'hex');
49
+ encryptedData += cipher.final('hex');
50
+ return [upper === true ? encryptedData.toUpperCase() : encryptedData, iv.toString('hex')];
51
+ }
52
+ /**
53
+ * AES 解密
54
+ * @param input 加密后的数据
55
+ * @param key 密钥
56
+ * @param iv 向量
57
+ * @returns
58
+ */
59
+ export function aesDecrypt(input, key, iv) {
60
+ const cipher = createDecipheriv('aes-256-cbc', Buffer.from(key, 'hex'), Buffer.from(iv, 'hex'));
61
+ let decryptedData = cipher.update(input, 'hex', 'utf-8');
62
+ decryptedData += cipher.final('utf-8');
63
+ return decryptedData;
64
+ }
65
+ /**
66
+ * RSA 公钥加密
67
+ * @param input 待加密字符串
68
+ * @param publicKey 公钥
69
+ * @returns
70
+ */
71
+ export function rsaEncrypt(input, publicKey) {
72
+ return publicEncrypt({
73
+ key: publicKey,
74
+ oaepHash: 'sha256',
75
+ }, Buffer.from(input)).toString('base64');
76
+ }
77
+ /**
78
+ * RSA 解密
79
+ * @param encrtypData RSA加密后的数据
80
+ * @param privateKey 私钥
81
+ * @returns
82
+ */
83
+ export function rsaDecrypt(encrtypData, privateKey) {
84
+ return privateDecrypt({
85
+ key: privateKey,
86
+ oaepHash: 'sha256',
87
+ }, Buffer.from(encrtypData, 'base64')).toString('utf-8');
88
+ }
package/lib/index.d.ts CHANGED
@@ -74,20 +74,6 @@ export declare class BaseError extends Error {
74
74
  */
75
75
  constructor(name: string, message: string);
76
76
  }
77
- /**
78
- * 函数节流 - 每隔单位时间,只执行一次
79
- * @param cb 待节流的函数
80
- * @param wait 间隔时间
81
- * @returns
82
- */
83
- export declare function throttle<R extends any[], T>(fn: (...args: R) => T, wait?: number): (...args: R) => void;
84
- /**
85
- * 函数防抖 - 当重复触发某一个行为(事件时),只执行最后一次触发
86
- * @param fn 防抖函数
87
- * @param interval 间隔时间段
88
- * @returns
89
- */
90
- export declare function debounce<R extends any[], T>(fn: (...args: R) => T, interval?: number): (...args: R) => void;
91
77
  /**
92
78
  * 将金额数字格式化为金额格式显示并且会保留两位小数[去除多余的位数,不是四舍五入,而是直接舍去] 1234523432.23 => 123,123,123.23
93
79
  * @param {number} number 待转换的金额数字
package/lib/index.js CHANGED
@@ -108,39 +108,6 @@ export class BaseError extends Error {
108
108
  }
109
109
  }
110
110
  }
111
- /**
112
- * 函数节流 - 每隔单位时间,只执行一次
113
- * @param cb 待节流的函数
114
- * @param wait 间隔时间
115
- * @returns
116
- */
117
- export function throttle(fn, wait = 500) {
118
- // 上一次的请求时间
119
- let last = 0;
120
- return (...args) => {
121
- // 当前时间戳
122
- const now = Date.now();
123
- if (now - last > wait) {
124
- fn(...args);
125
- last = now;
126
- }
127
- };
128
- }
129
- /**
130
- * 函数防抖 - 当重复触发某一个行为(事件时),只执行最后一次触发
131
- * @param fn 防抖函数
132
- * @param interval 间隔时间段
133
- * @returns
134
- */
135
- export function debounce(fn, interval = 500) {
136
- let _t = -1;
137
- return (...args) => {
138
- clearTimeout(_t);
139
- _t = setTimeout(() => {
140
- fn(...args);
141
- }, interval);
142
- };
143
- }
144
111
  /**
145
112
  * 将金额数字格式化为金额格式显示并且会保留两位小数[去除多余的位数,不是四舍五入,而是直接舍去] 1234523432.23 => 123,123,123.23
146
113
  * @param {number} number 待转换的金额数字
package/lib/web.d.ts CHANGED
@@ -11,3 +11,17 @@ export declare const formJson: <T>(form: HTMLFormElement) => T;
11
11
  export declare function query(search?: string): {
12
12
  [index: string]: string;
13
13
  };
14
+ /**
15
+ * 函数节流 - 每隔单位时间,只执行一次
16
+ * @param cb 待节流的函数
17
+ * @param wait 间隔时间
18
+ * @returns
19
+ */
20
+ export declare function throttle<R extends any[], T>(fn: (...args: R) => T, wait?: number): (...args: R) => void;
21
+ /**
22
+ * 函数防抖 - 当重复触发某一个行为(事件时),只执行最后一次触发
23
+ * @param fn 防抖函数
24
+ * @param interval 间隔时间段
25
+ * @returns
26
+ */
27
+ export declare function debounce<R extends any[], T>(fn: (...args: R) => T, interval?: number): (...args: R) => void;
package/lib/web.js CHANGED
@@ -55,3 +55,36 @@ export function query(search) {
55
55
  }
56
56
  return query;
57
57
  }
58
+ /**
59
+ * 函数节流 - 每隔单位时间,只执行一次
60
+ * @param cb 待节流的函数
61
+ * @param wait 间隔时间
62
+ * @returns
63
+ */
64
+ export function throttle(fn, wait = 500) {
65
+ // 上一次的请求时间
66
+ let last = 0;
67
+ return (...args) => {
68
+ // 当前时间戳
69
+ const now = Date.now();
70
+ if (now - last > wait) {
71
+ fn(...args);
72
+ last = now;
73
+ }
74
+ };
75
+ }
76
+ /**
77
+ * 函数防抖 - 当重复触发某一个行为(事件时),只执行最后一次触发
78
+ * @param fn 防抖函数
79
+ * @param interval 间隔时间段
80
+ * @returns
81
+ */
82
+ export function debounce(fn, interval = 500) {
83
+ let _t = -1;
84
+ return (...args) => {
85
+ clearTimeout(_t);
86
+ _t = setTimeout(() => {
87
+ fn(...args);
88
+ }, interval);
89
+ };
90
+ }
package/package.json CHANGED
@@ -5,7 +5,34 @@
5
5
  "module": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
7
7
  "browser": "lib/index.js",
8
- "version": "0.3.1",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./lib/index.d.ts",
11
+ "import": "./lib/index.js"
12
+ },
13
+ "./file": {
14
+ "types": "./lib/file.d.ts",
15
+ "import": "./lib/file.js"
16
+ },
17
+ "./date": {
18
+ "types": "./lib/date.d.ts",
19
+ "import": "./lib/date.js"
20
+ },
21
+ "./validator": {
22
+ "types": "./lib/validator.d.ts",
23
+ "import": "./lib/validator.js"
24
+ },
25
+ "./crypto": {
26
+ "types": "./lib/crypto.d.ts",
27
+ "import": "./lib/crypto.js"
28
+ },
29
+ "./crypto_node": {
30
+ "types": "./lib/crypto_node.d.ts",
31
+ "import": "./lib/crypto_node.js"
32
+ },
33
+ "./*": "./lib/*"
34
+ },
35
+ "version": "0.3.3",
9
36
  "type": "module",
10
37
  "repository": {
11
38
  "type": "git",