cipher-kit 1.0.1 β†’ 2.0.0-beta.1

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 (46) hide show
  1. package/README.md +123 -1
  2. package/dist/chunk-6HNTSQAP.js +139 -0
  3. package/dist/chunk-6HNTSQAP.js.map +1 -0
  4. package/dist/chunk-DZLEO2JD.cjs +511 -0
  5. package/dist/chunk-DZLEO2JD.cjs.map +1 -0
  6. package/dist/chunk-I25C3WUZ.js +382 -0
  7. package/dist/chunk-I25C3WUZ.js.map +1 -0
  8. package/dist/chunk-SRGSVNQ2.js +486 -0
  9. package/dist/chunk-SRGSVNQ2.js.map +1 -0
  10. package/dist/chunk-UR5HPMNF.cjs +411 -0
  11. package/dist/chunk-UR5HPMNF.cjs.map +1 -0
  12. package/dist/chunk-ZIVTPFKN.cjs +163 -0
  13. package/dist/chunk-ZIVTPFKN.cjs.map +1 -0
  14. package/dist/export-C2vQXrZa.d.cts +263 -0
  15. package/dist/export-DEWwhS-S.d.ts +264 -0
  16. package/dist/export-DzNR1ht3.d.ts +263 -0
  17. package/dist/export-oVEmcDLI.d.cts +264 -0
  18. package/dist/index.cjs +82 -38
  19. package/dist/index.d.cts +3 -22
  20. package/dist/index.d.ts +3 -22
  21. package/dist/index.js +3 -3
  22. package/dist/node.cjs +84 -28
  23. package/dist/node.d.cts +3 -22
  24. package/dist/node.d.ts +3 -22
  25. package/dist/node.js +2 -2
  26. package/dist/validate-TRx4DDtg.d.cts +123 -0
  27. package/dist/validate-TRx4DDtg.d.ts +123 -0
  28. package/dist/web-api.cjs +84 -28
  29. package/dist/web-api.d.cts +2 -21
  30. package/dist/web-api.d.ts +2 -21
  31. package/dist/web-api.js +2 -2
  32. package/package.json +6 -4
  33. package/dist/chunk-5MYBXP4A.cjs +0 -228
  34. package/dist/chunk-5MYBXP4A.cjs.map +0 -1
  35. package/dist/chunk-DC4WFPHL.js +0 -141
  36. package/dist/chunk-DC4WFPHL.js.map +0 -1
  37. package/dist/chunk-NGVIYM6K.js +0 -217
  38. package/dist/chunk-NGVIYM6K.js.map +0 -1
  39. package/dist/chunk-SBXDW4MY.cjs +0 -99
  40. package/dist/chunk-SBXDW4MY.cjs.map +0 -1
  41. package/dist/chunk-THMEBIZB.js +0 -79
  42. package/dist/chunk-THMEBIZB.js.map +0 -1
  43. package/dist/chunk-XTA6TKBQ.cjs +0 -156
  44. package/dist/chunk-XTA6TKBQ.cjs.map +0 -1
  45. package/dist/utils-Bryp07ny.d.cts +0 -48
  46. package/dist/utils-Bryp07ny.d.ts +0 -48
package/README.md CHANGED
@@ -5,7 +5,8 @@
5
5
 
6
6
  <p align="center">
7
7
  Secure, Lightweight, and Cross-Platform <br/>
8
- Encryption & Decryption for Web, Node.js, Deno, and Bun
8
+ Encryption, Decryption, and Hashing <br/>
9
+ for Web, Node.js, Deno, Bun, and Cloudflare Workers
9
10
  </p>
10
11
 
11
12
  <a href="https://opensource.org/licenses/MIT" rel="nofollow"><img src="https://img.shields.io/github/license/WolfieLeader/npm?color=DC343B" alt="License"></a>
@@ -36,6 +37,127 @@ npm install cipher-kit@latest
36
37
 
37
38
  > πŸ’‘ Works with `npm`, `pnpm`, `yarn`, `bun`, and `deno`. You can use it in dev dependencies since it's typically used only for local HTTPS.
38
39
 
40
+ ## Usage πŸͺ›
41
+
42
+ Pick the runtime you’re targeting, or import from the root:
43
+
44
+ ```typescript
45
+ // For Node.js
46
+ import { encrypt, decrypt } from 'cipher-kit/node';
47
+
48
+ // For Web API, Deno, Bun, Cloudflare Workers
49
+ import { encrypt, decrypt } from 'cipher-kit/web-api';
50
+
51
+ // Or import everything from the root
52
+ // Functions that, for example encrypt and decrypt will use Node.js implementation.
53
+ // You can also access web and node object kits directly.
54
+ import { encrypt, decrypt, nodeKit, webKit } from 'cipher-kit';
55
+ ```
56
+
57
+ Functions that throw error will show that in their JSDoc comments.
58
+
59
+ If you would like to avoid using `try/catch`, you can use the functions that prefixed with `try`, e.g., `tryEncrypt`, `tryDecrypt`, `tryEncryptObj`, `tryDecryptObj`. You need to check if the `error` is `undefined` or the `success` is `true` to ensure the operation was successful.
60
+
61
+ ### Node.js Example:
62
+
63
+ ```typescript
64
+ import {
65
+ generateUuid,
66
+ hash,
67
+ createSecretKey,
68
+ encrypt,
69
+ decrypt,
70
+ encryptObj,
71
+ decryptObj,
72
+ tryEncrypt,
73
+ tryDecrypt,
74
+ } from 'cipher-kit/node';
75
+
76
+ const str = 'The brown fox 🦊 jumps over the lazy dog 🐢.';
77
+
78
+ function nodeExample() {
79
+ console.log(`New UUID: ${generateUuid()}`);
80
+
81
+ console.log(`SHA-256 Hash (ABCDEFG): ${hash('ABCDEFG')}`);
82
+
83
+ const secretKey = createSecretKey('my secure passphrase');
84
+
85
+ const encrypted = encrypt(str, secretKey);
86
+ console.log(`Encrypted Data: ${encrypted}`);
87
+ console.log(`Decrypted Data: ${decrypt(encrypted, secretKey)}`);
88
+
89
+ const encryptedObj = encryptObj({ message: 'Hello, World! 🌍', count: 42 }, secretKey);
90
+ console.log(`Encrypted Object: ${encryptedObj}`);
91
+ console.log(`Decrypted Object: ${JSON.stringify(decryptObj(encryptedObj, secretKey))}`);
92
+
93
+ const { result: tryEncrypted, error: tryEncryptError } = tryEncrypt(str, secretKey);
94
+ if (tryEncryptError) {
95
+ console.error(`Encryption Try failed: ${tryEncryptError.message} - ${tryEncryptError.description}`);
96
+ return;
97
+ }
98
+ console.log(`Encrypted Try Data: ${tryEncrypted}`);
99
+
100
+ const decryptedTry = tryDecrypt(tryEncrypted, secretKey);
101
+ if (decryptedTry.success === false) {
102
+ console.error(`Decryption Try failed: ${decryptedTry.error.message} - ${decryptedTry.error.description}`);
103
+ return;
104
+ }
105
+ console.log(`Try Decrypted Data: ${decryptedTry.result}`);
106
+ }
107
+
108
+ nodeExample();
109
+ ```
110
+
111
+ ### Web API Example:
112
+
113
+ ```typescript
114
+ import {
115
+ generateUuid,
116
+ hash,
117
+ createSecretKey,
118
+ encrypt,
119
+ decrypt,
120
+ encryptObj,
121
+ decryptObj,
122
+ tryEncrypt,
123
+ tryDecrypt,
124
+ } from 'cipher-kit/web-api';
125
+
126
+ const str = 'The brown fox 🦊 jumps over the lazy dog 🐢.';
127
+
128
+ async function webApiExample() {
129
+ console.log(`New UUID: ${generateUuid()}`);
130
+
131
+ console.log(`SHA-256 Hash (ABCDEFG): ${await hash('ABCDEFG')}`);
132
+
133
+ const secretKey = await createSecretKey('my secure passphrase');
134
+
135
+ const encrypted = await encrypt(str, secretKey);
136
+ console.log(`Encrypted Data: ${encrypted}`);
137
+ console.log(`Decrypted Data: ${await decrypt(encrypted, secretKey)}`);
138
+
139
+ const encryptedObj = await encryptObj({ message: 'Hello, World! 🌍', count: 42 }, secretKey);
140
+ console.log(`Encrypted Object: ${encryptedObj}`);
141
+ console.log(`Decrypted Object: ${JSON.stringify(await decryptObj(encryptedObj, secretKey))}`);
142
+
143
+ const { result: tryEncrypted, error: tryEncryptError } = await tryEncrypt(str, secretKey);
144
+ if (tryEncryptError) {
145
+ console.error(`Encryption Try failed: ${tryEncryptError.message} - ${tryEncryptError.description}`);
146
+ return;
147
+ }
148
+ console.log(`Encrypted Try Data: ${tryEncrypted}`);
149
+
150
+ const decryptedTry = await tryDecrypt(tryEncrypted, secretKey);
151
+ if (decryptedTry.success === false) {
152
+ console.error(`Decryption Try failed: ${decryptedTry.error.message} - ${decryptedTry.error.description}`);
153
+ return;
154
+ }
155
+ console.log(`Try Decrypted Data: ${decryptedTry.result}`);
156
+ }
157
+
158
+ webApiExample();
159
+ ```
160
+
39
161
  ## Contributions 🀝
40
162
 
41
163
  Want to contribute or suggest a feature?
@@ -0,0 +1,139 @@
1
+ import nodeCrypto from 'crypto';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __export = (target, all) => {
5
+ for (var name in all)
6
+ __defProp(target, name, { get: all[name], enumerable: true });
7
+ };
8
+
9
+ // src/helpers/consts.ts
10
+ var ENCODING_FORMATS = Object.freeze(["base64", "base64url", "hex", "utf8", "latin1"]);
11
+ var DIGEST_ALGORITHMS = Object.freeze({
12
+ sha256: { node: "sha256", web: "SHA-256" },
13
+ sha384: { node: "sha384", web: "SHA-384" },
14
+ sha512: { node: "sha512", web: "SHA-512" }
15
+ });
16
+ var ENCRYPTION_ALGORITHMS = Object.freeze({
17
+ aes256gcm: { name: "aes256gcm", keyBytes: 32, ivLength: 12, node: "aes-256-gcm", web: "AES-GCM" },
18
+ aes192gcm: { name: "aes192gcm", keyBytes: 24, ivLength: 12, node: "aes-192-gcm", web: "AES-GCM" },
19
+ aes128gcm: { name: "aes128gcm", keyBytes: 16, ivLength: 12, node: "aes-128-gcm", web: "AES-GCM" }
20
+ });
21
+ var PASSWORD_HASHING = Object.freeze({
22
+ pbkdf2: { saltLength: 16, iterations: 32e4, keyLength: 64 }
23
+ });
24
+
25
+ // src/helpers/validate.ts
26
+ function $isStr(x, min = 1) {
27
+ return x !== null && x !== void 0 && typeof x === "string" && x.trim().length >= min;
28
+ }
29
+ function $isObj(x) {
30
+ if (typeof x !== "object" || x === null || x === void 0) return false;
31
+ const proto = Object.getPrototypeOf(x);
32
+ return proto === Object.prototype || proto === null;
33
+ }
34
+ function $isLooseObj(x) {
35
+ return typeof x === "object" && x !== null && x !== void 0;
36
+ }
37
+ var expectedKeys = /* @__PURE__ */ new Set(["platform", "digest", "algo", "key"]);
38
+ var expectedAlgoKeys = /* @__PURE__ */ new Set(["name", "keyBytes", "ivLength", "node", "web"]);
39
+ function isSecretKey(x, platform) {
40
+ if (!$isLooseObj(x) || platform !== "node" && platform !== "web" || x.platform !== platform) return false;
41
+ const keys = Object.keys(x);
42
+ if (keys.length !== expectedKeys.size) return false;
43
+ for (const key of keys) if (!expectedKeys.has(key)) return false;
44
+ for (const key of expectedKeys) if (!Object.hasOwn(x, key)) return false;
45
+ if (typeof x.digest !== "string" || !(x.digest in DIGEST_ALGORITHMS)) return false;
46
+ if (!$isLooseObj(x.algo) || typeof x.algo.name !== "string" || !(x.algo.name in ENCRYPTION_ALGORITHMS)) return false;
47
+ const algoKeys = Object.keys(x.algo);
48
+ if (algoKeys.length !== expectedAlgoKeys.size) return false;
49
+ for (const key of algoKeys) if (!expectedAlgoKeys.has(key)) return false;
50
+ for (const key of expectedAlgoKeys) if (!Object.hasOwn(x.algo, key)) return false;
51
+ const algo = ENCRYPTION_ALGORITHMS[x.algo.name];
52
+ if (x.algo.keyBytes !== algo.keyBytes || x.algo.ivLength !== algo.ivLength || x.algo.node !== algo.node || x.algo.web !== algo.web) {
53
+ return false;
54
+ }
55
+ if (!$isLooseObj(x.key) || x.key.type !== "secret") return false;
56
+ if (platform === "node") {
57
+ if (!(x.key instanceof nodeCrypto.KeyObject) || typeof x.key.symmetricKeySize === "number" && x.key.symmetricKeySize !== algo.keyBytes) {
58
+ return false;
59
+ }
60
+ return true;
61
+ }
62
+ if (!$isLooseObj(x.key.algorithm) || x.key.algorithm.name !== algo.web || typeof x.key.algorithm.length === "number" && x.key.algorithm.length !== algo.keyBytes * 8 || typeof x.key.extractable !== "boolean" || !Array.isArray(x.key.usages) || x.key.usages.length !== 2 || !(x.key.usages.includes("encrypt") && x.key.usages.includes("decrypt"))) {
63
+ return false;
64
+ }
65
+ return true;
66
+ }
67
+ var ENCRYPTED_REGEX = Object.freeze({
68
+ general: /^(?:[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)?\.)$/,
69
+ node: /^([A-Za-z0-9_-]+)\.([A-Za-z0-9_-]+)\.([A-Za-z0-9_-]+)\.$/,
70
+ web: /^([A-Za-z0-9_-]+)\.([A-Za-z0-9_-]+)\.$/
71
+ });
72
+ function matchPattern(data, format) {
73
+ if (typeof data !== "string") return false;
74
+ if (!(format in ENCRYPTED_REGEX)) throw new Error(`Unknown format: ${format}`);
75
+ return ENCRYPTED_REGEX[format].test(data);
76
+ }
77
+
78
+ // src/helpers/error.ts
79
+ function $ok(result) {
80
+ if ($isObj(result)) return { success: true, ...result };
81
+ return { success: true, result };
82
+ }
83
+ function $err(err) {
84
+ return {
85
+ success: false,
86
+ error: {
87
+ message: "msg" in err ? err.msg : err.message,
88
+ description: "desc" in err ? err.desc : err.description
89
+ }
90
+ };
91
+ }
92
+ function $fmtError(error) {
93
+ if (error instanceof Error) return error.message;
94
+ if (typeof error === "string") return error;
95
+ return String(error);
96
+ }
97
+ function $fmtResultErr(err) {
98
+ return `${err.message} - ${err.description}`;
99
+ }
100
+
101
+ // src/helpers/object.ts
102
+ function $stringifyObj(obj) {
103
+ try {
104
+ if (!$isObj(obj)) return $err({ msg: "Invalid object", desc: "Input is not a plain object" });
105
+ return $ok(JSON.stringify(obj));
106
+ } catch (error) {
107
+ return $err({ msg: "Utility: Stringify error", desc: $fmtError(error) });
108
+ }
109
+ }
110
+ function stringifyObj(obj) {
111
+ const { result, error } = $stringifyObj(obj);
112
+ if (error) throw new Error($fmtResultErr(error));
113
+ return result;
114
+ }
115
+ function tryStringifyObj(obj) {
116
+ return $stringifyObj(obj);
117
+ }
118
+ function $parseToObj(str) {
119
+ try {
120
+ if (!$isStr(str)) return $err({ msg: "Utility: Invalid input", desc: "Input is not a valid string" });
121
+ const obj = JSON.parse(str);
122
+ if (!$isObj(obj)) return $err({ msg: "Utility: Invalid object format", desc: "Parsed data is not a plain object" });
123
+ return $ok({ result: obj });
124
+ } catch (error) {
125
+ return $err({ msg: "Utility: Invalid format", desc: $fmtError(error) });
126
+ }
127
+ }
128
+ function tryParseToObj(str) {
129
+ return $parseToObj(str);
130
+ }
131
+ function parseToObj(str) {
132
+ const { result, error } = $parseToObj(str);
133
+ if (error) throw new Error($fmtResultErr(error));
134
+ return result;
135
+ }
136
+
137
+ export { $err, $fmtError, $fmtResultErr, $isStr, $ok, $parseToObj, $stringifyObj, DIGEST_ALGORITHMS, ENCODING_FORMATS, ENCRYPTED_REGEX, ENCRYPTION_ALGORITHMS, PASSWORD_HASHING, __export, isSecretKey, matchPattern, parseToObj, stringifyObj, tryParseToObj, tryStringifyObj };
138
+ //# sourceMappingURL=chunk-6HNTSQAP.js.map
139
+ //# sourceMappingURL=chunk-6HNTSQAP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/helpers/consts.ts","../src/helpers/validate.ts","../src/helpers/error.ts","../src/helpers/object.ts"],"names":[],"mappings":"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","file":"chunk-6HNTSQAP.js","sourcesContent":["export const ENCODING_FORMATS = Object.freeze(['base64', 'base64url', 'hex', 'utf8', 'latin1'] as const);\r\n\r\nexport const DIGEST_ALGORITHMS = Object.freeze({\r\n sha256: { node: 'sha256', web: 'SHA-256' },\r\n sha384: { node: 'sha384', web: 'SHA-384' },\r\n sha512: { node: 'sha512', web: 'SHA-512' },\r\n} as const);\r\n\r\nexport const ENCRYPTION_ALGORITHMS = Object.freeze({\r\n aes256gcm: { name: 'aes256gcm', keyBytes: 32, ivLength: 12, node: 'aes-256-gcm', web: 'AES-GCM' },\r\n aes192gcm: { name: 'aes192gcm', keyBytes: 24, ivLength: 12, node: 'aes-192-gcm', web: 'AES-GCM' },\r\n aes128gcm: { name: 'aes128gcm', keyBytes: 16, ivLength: 12, node: 'aes-128-gcm', web: 'AES-GCM' },\r\n} as const);\r\n\r\nexport const PASSWORD_HASHING = Object.freeze({\r\n pbkdf2: { saltLength: 16, iterations: 320_000, keyLength: 64 },\r\n} as const);\r\n","import nodeCrypto from 'node:crypto';\r\nimport type { SecretKey } from '~/helpers/types';\r\nimport { DIGEST_ALGORITHMS, ENCRYPTION_ALGORITHMS } from './consts';\r\n\r\nexport function $isStr(x: unknown, min = 1): x is string {\r\n return x !== null && x !== undefined && typeof x === 'string' && x.trim().length >= min;\r\n}\r\n\r\nexport function $isObj(x: unknown): x is Record<string, unknown> {\r\n if (typeof x !== 'object' || x === null || x === undefined) return false;\r\n const proto = Object.getPrototypeOf(x);\r\n return proto === Object.prototype || proto === null;\r\n}\r\n\r\nexport function $isLooseObj(x: unknown): x is Record<string, unknown> {\r\n return typeof x === 'object' && x !== null && x !== undefined;\r\n}\r\n\r\nconst expectedKeys = new Set(['platform', 'digest', 'algo', 'key']);\r\nconst expectedAlgoKeys = new Set(['name', 'keyBytes', 'ivLength', 'node', 'web']);\r\n\r\nexport function isSecretKey<Platform extends 'node' | 'web'>(x: unknown, platform: Platform): x is SecretKey<Platform> {\r\n if (!$isLooseObj(x) || (platform !== 'node' && platform !== 'web') || x.platform !== platform) return false;\r\n\r\n const keys = Object.keys(x);\r\n if (keys.length !== expectedKeys.size) return false;\r\n for (const key of keys) if (!expectedKeys.has(key)) return false;\r\n for (const key of expectedKeys) if (!Object.hasOwn(x, key)) return false;\r\n\r\n if (typeof x.digest !== 'string' || !(x.digest in DIGEST_ALGORITHMS)) return false;\r\n if (!$isLooseObj(x.algo) || typeof x.algo.name !== 'string' || !(x.algo.name in ENCRYPTION_ALGORITHMS)) return false;\r\n\r\n const algoKeys = Object.keys(x.algo);\r\n if (algoKeys.length !== expectedAlgoKeys.size) return false;\r\n for (const key of algoKeys) if (!expectedAlgoKeys.has(key)) return false;\r\n for (const key of expectedAlgoKeys) if (!Object.hasOwn(x.algo, key)) return false;\r\n\r\n const algo = ENCRYPTION_ALGORITHMS[x.algo.name as keyof typeof ENCRYPTION_ALGORITHMS];\r\n if (\r\n x.algo.keyBytes !== algo.keyBytes ||\r\n x.algo.ivLength !== algo.ivLength ||\r\n x.algo.node !== algo.node ||\r\n x.algo.web !== algo.web\r\n ) {\r\n return false;\r\n }\r\n\r\n if (!$isLooseObj(x.key) || x.key.type !== 'secret') return false;\r\n\r\n if (platform === 'node') {\r\n if (\r\n !(x.key instanceof nodeCrypto.KeyObject) ||\r\n (typeof x.key.symmetricKeySize === 'number' && x.key.symmetricKeySize !== algo.keyBytes)\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n if (\r\n !$isLooseObj(x.key.algorithm) ||\r\n x.key.algorithm.name !== algo.web ||\r\n (typeof x.key.algorithm.length === 'number' && x.key.algorithm.length !== algo.keyBytes * 8) ||\r\n typeof x.key.extractable !== 'boolean' ||\r\n !Array.isArray(x.key.usages) ||\r\n x.key.usages.length !== 2 ||\r\n !(x.key.usages.includes('encrypt') && x.key.usages.includes('decrypt'))\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\n/** Regular expressions for encrypted data patterns */\r\nexport const ENCRYPTED_REGEX = Object.freeze({\r\n general: /^(?:[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+(?:\\.[A-Za-z0-9_-]+)?\\.)$/,\r\n node: /^([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.$/,\r\n web: /^([A-Za-z0-9_-]+)\\.([A-Za-z0-9_-]+)\\.$/,\r\n});\r\n\r\n/** Checks if the input string matches the specified encrypted data pattern. */\r\nexport function matchPattern(data: string, format: 'general' | 'node' | 'web'): boolean {\r\n if (typeof data !== 'string') return false;\r\n if (!(format in ENCRYPTED_REGEX)) throw new Error(`Unknown format: ${format}`);\r\n return ENCRYPTED_REGEX[format].test(data);\r\n}\r\n","import { $isObj } from './validate';\r\n\r\nexport interface ResultErr {\r\n readonly message: string;\r\n readonly description: string;\r\n}\r\n\r\nexport type Result<T, E = ResultErr> = T extends object\r\n ?\r\n | ({ readonly [K in keyof T]: T[K] } & { readonly success: true; readonly error?: undefined })\r\n | ({ readonly [K in keyof T]?: undefined } & { readonly success: false; readonly error: E })\r\n :\r\n | { readonly success: true; readonly result: T; readonly error?: undefined }\r\n | { readonly success: false; readonly error: E; readonly result?: undefined };\r\n\r\nexport function $ok<T>(result?: T): Result<T> {\r\n if ($isObj(result)) return { success: true, ...(result as T & object) } as Result<T>;\r\n return { success: true, result } as Result<T>;\r\n}\r\n\r\nexport function $err(err: { msg: string; desc: string }): Result<never, ResultErr>;\r\nexport function $err(err: ResultErr): Result<never, ResultErr>;\r\nexport function $err(err: { msg: string; desc: string } | ResultErr): Result<never, ResultErr> {\r\n return {\r\n success: false,\r\n error: {\r\n message: 'msg' in err ? err.msg : err.message,\r\n description: 'desc' in err ? err.desc : err.description,\r\n },\r\n } as Result<never, ResultErr>;\r\n}\r\n\r\nexport function $fmtError(error: unknown): string {\r\n if (error instanceof Error) return error.message;\r\n if (typeof error === 'string') return error;\r\n return String(error);\r\n}\r\n\r\nexport function $fmtResultErr(err: ResultErr): string {\r\n return `${err.message} - ${err.description}`;\r\n}\r\n","import { $err, $fmtError, $fmtResultErr, $ok, type Result } from './error';\r\nimport { $isObj, $isStr } from './validate';\r\n\r\nexport function $stringifyObj<T extends object = Record<string, unknown>>(obj: T): Result<string> {\r\n try {\r\n if (!$isObj(obj)) return $err({ msg: 'Invalid object', desc: 'Input is not a plain object' });\r\n return $ok(JSON.stringify(obj));\r\n } catch (error) {\r\n return $err({ msg: 'Utility: Stringify error', desc: $fmtError(error) });\r\n }\r\n}\r\n\r\n/**\r\n * Stringify an object.\r\n *\r\n * @param obj - The object to stringify.\r\n * @returns An JSON string.\r\n * @throws {Error} If the object cannot be stringified.\r\n */\r\nexport function stringifyObj<T extends object = Record<string, unknown>>(obj: T): string {\r\n const { result, error } = $stringifyObj(obj);\r\n if (error) throw new Error($fmtResultErr(error));\r\n return result;\r\n}\r\n\r\n/**\r\n * Stringify an object.\r\n *\r\n * @param obj - The object to stringify.\r\n * @returns A Result containing the JSON string or an error.\r\n */\r\nexport function tryStringifyObj<T extends object = Record<string, unknown>>(obj: T): Result<string> {\r\n return $stringifyObj(obj);\r\n}\r\n\r\nexport function $parseToObj<T extends object = Record<string, unknown>>(str: string): Result<{ result: T }> {\r\n try {\r\n if (!$isStr(str)) return $err({ msg: 'Utility: Invalid input', desc: 'Input is not a valid string' });\r\n const obj = JSON.parse(str);\r\n\r\n if (!$isObj(obj)) return $err({ msg: 'Utility: Invalid object format', desc: 'Parsed data is not a plain object' });\r\n return $ok({ result: obj as T });\r\n } catch (error) {\r\n return $err({ msg: 'Utility: Invalid format', desc: $fmtError(error) });\r\n }\r\n}\r\n\r\n/**\r\n * Parse a string to an object.\r\n *\r\n * @param str - The JSON string to parse.\r\n * @returns A Result containing the parsed object or an error.\r\n */\r\nexport function tryParseToObj<T extends object = Record<string, unknown>>(str: string): Result<{ result: T }> {\r\n return $parseToObj<T>(str);\r\n}\r\n\r\n/**\r\n * Parse a string to an object.\r\n *\r\n * @param str - The JSON string to parse.\r\n * @returns A parsed object.\r\n * @throws {Error} If the string cannot be parsed or is not a valid object.\r\n */\r\nexport function parseToObj<T extends object = Record<string, unknown>>(str: string): T {\r\n const { result, error } = $parseToObj<T>(str);\r\n if (error) throw new Error($fmtResultErr(error));\r\n return result;\r\n}\r\n"]}