devknife 1.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.
Files changed (52) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/LICENSE +21 -0
  3. package/README.md +217 -0
  4. package/dist/base64-CJAEMNK6.js +2 -0
  5. package/dist/base64-CJAEMNK6.js.map +1 -0
  6. package/dist/chunk-4LTWPAJW.js +2 -0
  7. package/dist/chunk-4LTWPAJW.js.map +1 -0
  8. package/dist/chunk-6UIJWUAN.js +2 -0
  9. package/dist/chunk-6UIJWUAN.js.map +1 -0
  10. package/dist/chunk-AYW5FKAL.js +2 -0
  11. package/dist/chunk-AYW5FKAL.js.map +1 -0
  12. package/dist/chunk-GTYGA6PU.js +2 -0
  13. package/dist/chunk-GTYGA6PU.js.map +1 -0
  14. package/dist/chunk-GZW2QEOC.js +2 -0
  15. package/dist/chunk-GZW2QEOC.js.map +1 -0
  16. package/dist/chunk-NW6U5UEX.js +2 -0
  17. package/dist/chunk-NW6U5UEX.js.map +1 -0
  18. package/dist/chunk-SDQ3PUQH.js +2 -0
  19. package/dist/chunk-SDQ3PUQH.js.map +1 -0
  20. package/dist/chunk-VPRHVS7Z.js +2 -0
  21. package/dist/chunk-VPRHVS7Z.js.map +1 -0
  22. package/dist/chunk-YBYCYSEC.js +2 -0
  23. package/dist/chunk-YBYCYSEC.js.map +1 -0
  24. package/dist/chunk-ZZLUWX3F.js +2 -0
  25. package/dist/chunk-ZZLUWX3F.js.map +1 -0
  26. package/dist/cli.cjs +1444 -0
  27. package/dist/cli.js +1421 -0
  28. package/dist/color-UNOPSQIT.js +2 -0
  29. package/dist/color-UNOPSQIT.js.map +1 -0
  30. package/dist/hash-52EWSWG4.js +2 -0
  31. package/dist/hash-52EWSWG4.js.map +1 -0
  32. package/dist/index.cjs +4 -0
  33. package/dist/index.cjs.map +1 -0
  34. package/dist/index.d.cts +285 -0
  35. package/dist/index.d.ts +285 -0
  36. package/dist/index.js +4 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/json-KEOS7PBI.js +2 -0
  39. package/dist/json-KEOS7PBI.js.map +1 -0
  40. package/dist/jwt-CKRHCFHP.js +2 -0
  41. package/dist/jwt-CKRHCFHP.js.map +1 -0
  42. package/dist/password-2Z5N7KS2.js +2 -0
  43. package/dist/password-2Z5N7KS2.js.map +1 -0
  44. package/dist/text-PAS3LRJD.js +2 -0
  45. package/dist/text-PAS3LRJD.js.map +1 -0
  46. package/dist/time-3XVRD5HD.js +2 -0
  47. package/dist/time-3XVRD5HD.js.map +1 -0
  48. package/dist/url-BRWDEVUS.js +2 -0
  49. package/dist/url-BRWDEVUS.js.map +1 -0
  50. package/dist/uuid-MZ4YSUFH.js +2 -0
  51. package/dist/uuid-MZ4YSUFH.js.map +1 -0
  52. package/package.json +86 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,23 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [1.0.0] - 2024-01-01
6
+
7
+ ### Added
8
+ - Initial release of devknife
9
+ - 50+ developer utilities in a single package
10
+ - Zero runtime dependencies
11
+ - CLI tool with interactive TUI mode
12
+ - Importable TypeScript library
13
+ - Dual ESM + CJS build output
14
+ - 100% test coverage
15
+ - Tools included:
16
+ - **Crypto**: MD5, SHA-1, SHA-256, SHA-512 hashing, password generation
17
+ - **Generators**: UUID v4, NanoID, Lorem Ipsum
18
+ - **Encoders**: Base64, URL, HTML entities, JWT decoder
19
+ - **Formatters**: JSON prettify/minify, text case conversion
20
+ - **Converters**: Color (HEX/RGB/HSL), timestamps, number bases
21
+ - **Network**: IP validation, MAC address generation
22
+ - CI/CD pipeline with GitHub Actions
23
+ - ESLint and Prettier configuration
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Avinashvelu03
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,217 @@
1
+ # 🔪 devknife
2
+
3
+ > The ultimate zero-dependency, 50-in-1 developer Swiss Army knife CLI and library.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/devknife.svg)](https://www.npmjs.com/package/devknife)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
7
+ [![TypeScript Strict](https://img.shields.io/badge/TypeScript-Strict-3178c6.svg)](https://www.typescriptlang.org/)
8
+ [![100% Coverage](https://img.shields.io/badge/Coverage-100%25-brightgreen.svg)](https://github.com/Avinashvelu03/devknife)
9
+ [![Zero Dependencies](https://img.shields.io/badge/Dependencies-0-green.svg)](https://github.com/Avinashvelu03/devknife)
10
+ [![Node >= 18](https://img.shields.io/badge/Node-%3E%3D%2018-339933.svg)](https://nodejs.org)
11
+
12
+ ```
13
+ ____ __. .__ ___________.__
14
+ | |/ _|____ | |__ ___.__._____ \__ ___/|__| _____ ____
15
+ | < / _ \| | < | |\__ \ ______ | | | |/ \/ ___\
16
+ | | ( <_> ) Y \___ | |/ __ \_/_____/ | | | | Y Y \ \___
17
+ |____|__ \____/|___| / ____| (____ / |____| |__|__|_| /\___ >
18
+ \/ \/\/ \/ \/ \/
19
+ ```
20
+
21
+ ## Why devknife?
22
+
23
+ Developers waste hours switching context to browser tabs to decode JWTs, format JSON, convert timestamps, or generate UUIDs. **devknife** brings all these utilities into the terminal with sub-millisecond execution times, zero bloated dependencies, and an interactive TUI.
24
+
25
+ ## Installation
26
+
27
+ ### Global (recommended)
28
+ ```bash
29
+ npm install -g devknife
30
+ ```
31
+
32
+ ### NPX (no install)
33
+ ```bash
34
+ npx devknife uuid
35
+ ```
36
+
37
+ ### Local Library
38
+ ```bash
39
+ npm install devknife
40
+ ```
41
+
42
+ ## Quick Start
43
+
44
+ ### CLI Usage
45
+
46
+ ```bash
47
+ # Generate a UUID
48
+ $ devknife uuid
49
+ > 8a7f9b84-4d2a-48a3-9f8a-92b1a134c8a2
50
+
51
+ # Hash a string
52
+ $ devknife hash sha256 "Hello World"
53
+ > a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
54
+
55
+ # Decode a JWT
56
+ $ devknife jwt decode eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkF2aW5hc2gifQ.abc
57
+ > Header: { "alg": "HS256" }
58
+ > Payload: { "sub": "1234567890", "name": "Avinash" }
59
+
60
+ # Format JSON from stdin
61
+ $ echo '{"a":1}' | devknife json format
62
+ > {
63
+ > "a": 1
64
+ > }
65
+
66
+ # Interactive mode (no arguments)
67
+ $ devknife
68
+ ```
69
+
70
+ ### Library Usage
71
+
72
+ ```typescript
73
+ import {
74
+ generateUUID, base64Encode, rgbToHex, epochToIso,
75
+ camelCase, generatePassword, jwtDecode
76
+ } from 'devknife';
77
+
78
+ // Generators
79
+ generateUUID() // "123e4567-e89b-12d3-a456-426614174000"
80
+ generatePassword({ length: 16, symbols: true })
81
+
82
+ // Encoders
83
+ base64Encode('hello') // "aGVsbG8="
84
+ jwtDecode('ey...') // { header: {...}, payload: {...} }
85
+
86
+ // Converters
87
+ rgbToHex(255, 0, 0) // "#ff0000"
88
+ epochToIso(1672531200) // "2023-01-01T00:00:00.000Z"
89
+
90
+ // Formatters
91
+ camelCase('hello world') // "helloWorld"
92
+ ```
93
+
94
+ ## CLI Commands
95
+
96
+ | Category | Command | Example | Description |
97
+ |----------|---------|---------|-------------|
98
+ | **Crypto** | `hash` | `devknife hash sha256 "text"` | MD5, SHA-1, SHA-256, SHA-512 |
99
+ | | `password` | `devknife password --length 32 --symbols` | Generate secure passwords |
100
+ | **Generators** | `uuid` | `devknife uuid --count 5` | Generate UUID v4 |
101
+ | | `nanoid` | `devknife nanoid --size 10` | Generate NanoID string |
102
+ | | `lorem` | `devknife lorem paragraphs 3` | Lorem Ipsum text |
103
+ | **Encoders** | `base64` | `devknife base64 encode "hello"` | Base64 encode/decode |
104
+ | | `url` | `devknife url encode "hello world"` | URL encode/decode |
105
+ | | `html` | `devknife html encode "<div>"` | HTML entity encode/decode |
106
+ | | `jwt` | `devknife jwt decode <token>` | Decode JWT tokens |
107
+ | **Formatters** | `json` | `devknife json format '{"a":1}'` | Format/minify/validate JSON |
108
+ | | `text` | `devknife text camel "hello world"` | String case conversion |
109
+ | **Converters** | `color` | `devknife color hex-to-rgb "#ff0000"` | HEX/RGB/HSL conversions |
110
+ | | `time` | `devknife time epoch-to-iso 1672531200` | Timestamp conversions |
111
+ | | `number` | `devknife number dec-to-bin 42` | Binary/Hex/Octal/Decimal |
112
+ | **Network** | `ip` | `devknife ip validate 192.168.1.1` | Validate/detect IP addresses |
113
+ | | `mac` | `devknife mac generate` | Generate/validate MAC addresses |
114
+
115
+ ## CLI Flags
116
+
117
+ | Flag | Short | Description |
118
+ |------|-------|-------------|
119
+ | `--help` | `-h` | Show help menu |
120
+ | `--version` | `-v` | Show version |
121
+ | `--interactive` | `-i` | Start interactive mode |
122
+ | `--stdin` | `-s` | Read input from stdin |
123
+
124
+ ## Library API
125
+
126
+ ### Grouped Imports
127
+
128
+ ```typescript
129
+ import {
130
+ hash, uuid, password, base64, url, jwt, json, text, color, time,
131
+ } from 'devknife';
132
+
133
+ // Hash functions (lazy-loaded)
134
+ await hash.md5('hello');
135
+ await hash.sha256('hello');
136
+
137
+ // UUID generator
138
+ await uuid.v4();
139
+
140
+ // Password generator
141
+ await password.generate({ length: 32, symbols: true });
142
+
143
+ // Encoders
144
+ await base64.encode('hello');
145
+ await url.decode('hello%20world');
146
+ await jwt.decode(token);
147
+
148
+ // Formatters
149
+ await json.format('{"a":1}');
150
+ await text.camelCase('hello world');
151
+
152
+ // Converters
153
+ await color.hexToRgb('#ff0000');
154
+ await time.epochToIso(1672531200);
155
+ ```
156
+
157
+ ### Direct Imports
158
+
159
+ ```typescript
160
+ import {
161
+ // Crypto
162
+ hash, md5, sha1, sha256, sha512, generatePassword,
163
+ // Generators
164
+ generateUUID, generateNanoID, loremWord, loremParagraph,
165
+ // Encoders
166
+ base64Encode, base64Decode, urlEncode, urlDecode,
167
+ htmlEncode, htmlDecode, jwtDecode, isValidJWT,
168
+ // Formatters
169
+ jsonFormat, jsonMinify, jsonValidate,
170
+ camelCase, snakeCase, kebabCase, pascalCase,
171
+ // Converters
172
+ hexToRgb, rgbToHex, rgbToHsl, hslToRgb,
173
+ epochToIso, isoToEpoch, timeAgo, formatDate,
174
+ decimalToBinary, binaryToDecimal, decimalToHex, hexToDecimal,
175
+ // Network
176
+ isValidIPv4, isValidIPv6, getLocalIPs, generateMAC,
177
+ } from 'devknife';
178
+ ```
179
+
180
+ ## Features
181
+
182
+ - **Zero Dependencies** — Only Node.js native modules
183
+ - **50+ Tools** — Everything a developer needs in one package
184
+ - **Blazing Fast** — Sub-millisecond execution times
185
+ - **Interactive TUI** — Built-in terminal menu using `node:readline`
186
+ - **Dual Usage** — CLI tool AND importable TypeScript library
187
+ - **STDIN Support** — Pipe data directly: `echo "hello" | devknife base64 encode`
188
+ - **100% Test Coverage** — Every function, every branch
189
+ - **TypeScript Strict** — Full type safety with `strict: true`
190
+ - **ESM + CJS** — Dual module format for maximum compatibility
191
+
192
+ ## Build
193
+
194
+ ```bash
195
+ npm run build # Build with tsup (ESM + CJS + types)
196
+ npm run lint # Lint with ESLint
197
+ npm run format # Format with Prettier
198
+ npm run test # Run tests
199
+ npm run test:coverage # Run tests with coverage
200
+ ```
201
+
202
+ ## Publishing
203
+
204
+ ```bash
205
+ # Dry run
206
+ npm pack
207
+
208
+ # Publish
209
+ npm publish
210
+
211
+ # With tag
212
+ npm publish --tag next
213
+ ```
214
+
215
+ ## License
216
+
217
+ MIT © [Avinashvelu03](https://github.com/Avinashvelu03)
@@ -0,0 +1,2 @@
1
+ import{a,b,c,d,e}from"./chunk-YBYCYSEC.js";export{b as decode,e as decodeURLSafe,a as encode,d as encodeURLSafe,c as isBase64};
2
+ //# sourceMappingURL=base64-CJAEMNK6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ import{createHash as n}from"crypto";var i=["md5","sha1","sha256","sha512"];function r(t,s="sha256"){return n(s).update(t).digest("hex")}function h(t){return r(t,"md5")}function o(t){return r(t,"sha1")}function a(t){return r(t,"sha256")}function g(t){return r(t,"sha512")}function u(t){return i.includes(t)}function p(){return i}function d(t,s="sha256"){return n(s).update(t).digest("hex")}export{r as a,h as b,o as c,a as d,g as e,u as f,p as g,d as h};
2
+ //# sourceMappingURL=chunk-4LTWPAJW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/crypto/hash.ts"],"sourcesContent":["/**\n * Hash generators: MD5, SHA-1, SHA-256, SHA-512\n * Zero-dependency, uses only node:crypto\n */\n\nimport { createHash } from 'node:crypto';\n\nexport type HashAlgorithm = 'md5' | 'sha1' | 'sha256' | 'sha512';\n\nconst SUPPORTED_ALGORITHMS: readonly HashAlgorithm[] = ['md5', 'sha1', 'sha256', 'sha512'] as const;\n\nexport function hash(input: string, algorithm: HashAlgorithm = 'sha256'): string {\n return createHash(algorithm).update(input).digest('hex');\n}\n\nexport function md5(input: string): string {\n return hash(input, 'md5');\n}\n\nexport function sha1(input: string): string {\n return hash(input, 'sha1');\n}\n\nexport function sha256(input: string): string {\n return hash(input, 'sha256');\n}\n\nexport function sha512(input: string): string {\n return hash(input, 'sha512');\n}\n\nexport function isSupportedAlgorithm(algo: string): algo is HashAlgorithm {\n return (SUPPORTED_ALGORITHMS as readonly string[]).includes(algo);\n}\n\nexport function getSupportedAlgorithms(): readonly HashAlgorithm[] {\n return SUPPORTED_ALGORITHMS;\n}\n\nexport function hashFile(content: string | Buffer, algorithm: HashAlgorithm = 'sha256'): string {\n return createHash(algorithm).update(content).digest('hex');\n}\n"],"mappings":"AAKA,OAAS,cAAAA,MAAkB,SAI3B,IAAMC,EAAiD,CAAC,MAAO,OAAQ,SAAU,QAAQ,EAElF,SAASC,EAAKC,EAAeC,EAA2B,SAAkB,CAC/E,OAAOJ,EAAWI,CAAS,EAAE,OAAOD,CAAK,EAAE,OAAO,KAAK,CACzD,CAEO,SAASE,EAAIF,EAAuB,CACzC,OAAOD,EAAKC,EAAO,KAAK,CAC1B,CAEO,SAASG,EAAKH,EAAuB,CAC1C,OAAOD,EAAKC,EAAO,MAAM,CAC3B,CAEO,SAASI,EAAOJ,EAAuB,CAC5C,OAAOD,EAAKC,EAAO,QAAQ,CAC7B,CAEO,SAASK,EAAOL,EAAuB,CAC5C,OAAOD,EAAKC,EAAO,QAAQ,CAC7B,CAEO,SAASM,EAAqBC,EAAqC,CACxE,OAAQT,EAA2C,SAASS,CAAI,CAClE,CAEO,SAASC,GAAmD,CACjE,OAAOV,CACT,CAEO,SAASW,EAASC,EAA0BT,EAA2B,SAAkB,CAC9F,OAAOJ,EAAWI,CAAS,EAAE,OAAOS,CAAO,EAAE,OAAO,KAAK,CAC3D","names":["createHash","SUPPORTED_ALGORITHMS","hash","input","algorithm","md5","sha1","sha256","sha512","isSupportedAlgorithm","algo","getSupportedAlgorithms","hashFile","content"]}
@@ -0,0 +1,2 @@
1
+ function s(t){return new Date(t*1e3).toISOString()}function u(t){let n=new Date(t).getTime();if(isNaN(n))throw new Error("Invalid ISO date string");return Math.floor(n/1e3)}function g(t,n){return new Date(t*1e3).toLocaleString("en-US",{timeZone:n,year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:"short"})}function c(){return Math.floor(Date.now()/1e3)}function m(){return new Date().toISOString()}function d(t){return Math.floor(t/1e3)}function f(t){return t*1e3}function l(t){let e=Math.floor(Date.now()/1e3)-t;if(e<0)return"in the future";let r=[["year",31536e3],["month",2592e3],["week",604800],["day",86400],["hour",3600],["minute",60],["second",1]];for(let[o,i]of r){let a=Math.floor(e/i);if(a>=1)return`${a} ${o}${a>1?"s":""} ago`}return"just now"}function p(t){let n=new Date(t);return!isNaN(n.getTime())}function w(t,n){let e=new Date(t).getTime(),r=new Date(n).getTime();if(isNaN(e)||isNaN(r))throw new Error("Invalid date string");return Math.abs(Math.floor((r-e)/(1e3*60*60*24)))}function h(t,n){let e=new Date(t);if(isNaN(e.getTime()))throw new Error("Invalid date string");return n.replace("YYYY",e.getFullYear().toString()).replace("MM",String(e.getMonth()+1).padStart(2,"0")).replace("DD",String(e.getDate()).padStart(2,"0")).replace("HH",String(e.getHours()).padStart(2,"0")).replace("mm",String(e.getMinutes()).padStart(2,"0")).replace("ss",String(e.getSeconds()).padStart(2,"0"))}function D(t){let n=new Date(t);if(isNaN(n.getTime()))throw new Error("Invalid date string");let e=new Date(Date.UTC(n.getFullYear(),n.getMonth(),n.getDate())),r=e.getUTCDay()||7;e.setUTCDate(e.getUTCDate()+4-r);let o=new Date(Date.UTC(e.getUTCFullYear(),0,1));return Math.ceil(((e.getTime()-o.getTime())/864e5+1)/7)}function S(t){return t%4===0&&t%100!==0||t%400===0}export{s as a,u as b,g as c,c as d,m as e,d as f,f as g,l as h,p as i,w as j,h as k,D as l,S as m};
2
+ //# sourceMappingURL=chunk-6UIJWUAN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/converters/time.ts"],"sourcesContent":["/**\n * Time conversions: Epoch <-> ISO <-> relative.\n * Zero-dependency.\n */\n\nexport function epochToIso(epoch: number): string {\n return new Date(epoch * 1000).toISOString();\n}\n\nexport function isoToEpoch(iso: string): number {\n const ms = new Date(iso).getTime();\n if (isNaN(ms)) {\n throw new Error('Invalid ISO date string');\n }\n return Math.floor(ms / 1000);\n}\n\nexport function epochToLocale(epoch: number, timezone?: string): string {\n const date = new Date(epoch * 1000);\n return date.toLocaleString('en-US', {\n timeZone: timezone,\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n timeZoneName: 'short',\n });\n}\n\nexport function nowEpoch(): number {\n return Math.floor(Date.now() / 1000);\n}\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n\nexport function msToSeconds(ms: number): number {\n return Math.floor(ms / 1000);\n}\n\nexport function secondsToMs(seconds: number): number {\n return seconds * 1000;\n}\n\nexport function timeAgo(epoch: number): string {\n const now = Math.floor(Date.now() / 1000);\n const diff = now - epoch;\n\n if (diff < 0) return 'in the future';\n\n const intervals: [string, number][] = [\n ['year', 31536000],\n ['month', 2592000],\n ['week', 604800],\n ['day', 86400],\n ['hour', 3600],\n ['minute', 60],\n ['second', 1],\n ];\n\n for (const [label, seconds] of intervals) {\n const count = Math.floor(diff / seconds);\n if (count >= 1) {\n return `${count} ${label}${count > 1 ? 's' : ''} ago`;\n }\n }\n\n return 'just now';\n}\n\nexport function isValidIsoDate(str: string): boolean {\n const date = new Date(str);\n return !isNaN(date.getTime());\n}\n\nexport function getDaysBetween(date1: string, date2: string): number {\n const d1 = new Date(date1).getTime();\n const d2 = new Date(date2).getTime();\n if (isNaN(d1) || isNaN(d2)) {\n throw new Error('Invalid date string');\n }\n return Math.abs(Math.floor((d2 - d1) / (1000 * 60 * 60 * 24)));\n}\n\nexport function formatDate(iso: string, format: string): string {\n const date = new Date(iso);\n if (isNaN(date.getTime())) throw new Error('Invalid date string');\n\n return format\n .replace('YYYY', date.getFullYear().toString())\n .replace('MM', String(date.getMonth() + 1).padStart(2, '0'))\n .replace('DD', String(date.getDate()).padStart(2, '0'))\n .replace('HH', String(date.getHours()).padStart(2, '0'))\n .replace('mm', String(date.getMinutes()).padStart(2, '0'))\n .replace('ss', String(date.getSeconds()).padStart(2, '0'));\n}\n\nexport function getWeekNumber(iso: string): number {\n const date = new Date(iso);\n if (isNaN(date.getTime())) throw new Error('Invalid date string');\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n}\n\nexport function isLeapYear(year: number): boolean {\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n"],"mappings":"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","names":["epochToIso","epoch","isoToEpoch","iso","ms","epochToLocale","timezone","nowEpoch","nowIso","msToSeconds","secondsToMs","seconds","timeAgo","diff","intervals","label","count","isValidIsoDate","str","date","getDaysBetween","date1","date2","d1","d2","formatDate","format","getWeekNumber","d","dayNum","yearStart","isLeapYear","year"]}
@@ -0,0 +1,2 @@
1
+ function h(e){let r=e.replace("#","");if(r.length!==3&&r.length!==6)throw new Error("Invalid HEX color: must be 3 or 6 characters");let o=r.length===3?r.split("").map(s=>s+s).join(""):r,t=parseInt(o.slice(0,2),16),n=parseInt(o.slice(2,4),16),u=parseInt(o.slice(4,6),16);if(isNaN(t)||isNaN(n)||isNaN(u))throw new Error("Invalid HEX color: contains non-hex characters");return{r:t,g:n,b:u}}function g(e,r,o){let t=u=>Math.max(0,Math.min(255,Math.round(u))),n=u=>t(u).toString(16).padStart(2,"0");return`#${n(e)}${n(r)}${n(o)}`}function f(e,r,o){let t=e/255,n=r/255,u=o/255,s=Math.max(t,n,u),b=Math.min(t,n,u),m=(s+b)/2,c=0,l=0;if(s!==b){let a=s-b;switch(l=m>.5?a/(2-s-b):a/(s+b),s){case t:c=((n-u)/a+(n<u?6:0))/6;break;case n:c=((u-t)/a+2)/6;break;case u:c=((t-n)/a+4)/6;break}}return{h:Math.round(c*360),s:Math.round(l*100),l:Math.round(m*100)}}function x(e,r,o){let t=r/100,n=o/100;if(t===0){let c=Math.round(n*255);return{r:c,g:c,b:c}}let u=(c,l,a)=>{let i=a;return i<0&&(i+=1),i>1&&(i-=1),i<1/6?c+(l-c)*6*i:i<1/2?l:i<2/3?c+(l-c)*(2/3-i)*6:c},s=n<.5?n*(1+t):n+t-n*t,b=2*n-s,m=e/360;return{r:Math.round(u(b,s,m+1/3)*255),g:Math.round(u(b,s,m)*255),b:Math.round(u(b,s,m-1/3)*255)}}function p(e){let{r,g:o,b:t}=h(e);return f(r,o,t)}function d(e,r,o){let{r:t,g:n,b:u}=x(e,r,o);return g(t,n,u)}function M(e){return/^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(e)}function H(e){let{r,g:o,b:t}=h(e);return(.299*r+.587*o+.114*t)/255>.5}function $(e,r,o){return`rgb(${e}, ${r}, ${o})`}function S(e,r,o){return`hsl(${e}, ${r}%, ${o}%)`}export{h as a,g as b,f as c,x as d,p as e,d as f,M as g,H as h,$ as i,S as j};
2
+ //# sourceMappingURL=chunk-AYW5FKAL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/converters/color.ts"],"sourcesContent":["/**\n * Color conversions: HEX <-> RGB <-> HSL.\n * Zero-dependency.\n */\n\nexport interface RGB {\n r: number;\n g: number;\n b: number;\n}\n\nexport interface HSL {\n h: number;\n s: number;\n l: number;\n}\n\nexport function hexToRgb(hex: string): RGB {\n const clean = hex.replace('#', '');\n if (clean.length !== 3 && clean.length !== 6) {\n throw new Error('Invalid HEX color: must be 3 or 6 characters');\n }\n const full = clean.length === 3\n ? clean.split('').map((c) => c + c).join('')\n : clean;\n const r = parseInt(full.slice(0, 2), 16);\n const g = parseInt(full.slice(2, 4), 16);\n const b = parseInt(full.slice(4, 6), 16);\n if (isNaN(r) || isNaN(g) || isNaN(b)) {\n throw new Error('Invalid HEX color: contains non-hex characters');\n }\n return { r, g, b };\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n const clamp = (n: number) => Math.max(0, Math.min(255, Math.round(n)));\n const toHex = (n: number) => clamp(n).toString(16).padStart(2, '0');\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nexport function rgbToHsl(r: number, g: number, b: number): HSL {\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const l = (max + min) / 2;\n let h = 0;\n let s = 0;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case rn:\n h = ((gn - bn) / d + (gn < bn ? 6 : 0)) / 6;\n break;\n case gn:\n h = ((bn - rn) / d + 2) / 6;\n break;\n case bn:\n h = ((rn - gn) / d + 4) / 6;\n break;\n }\n }\n\n return {\n h: Math.round(h * 360),\n s: Math.round(s * 100),\n l: Math.round(l * 100),\n };\n}\n\nexport function hslToRgb(h: number, s: number, l: number): RGB {\n const sn = s / 100;\n const ln = l / 100;\n\n if (sn === 0) {\n const val = Math.round(ln * 255);\n return { r: val, g: val, b: val };\n }\n\n const hue2rgb = (p: number, q: number, t: number): number => {\n let tn = t;\n if (tn < 0) tn += 1;\n if (tn > 1) tn -= 1;\n if (tn < 1 / 6) return p + (q - p) * 6 * tn;\n if (tn < 1 / 2) return q;\n if (tn < 2 / 3) return p + (q - p) * (2 / 3 - tn) * 6;\n return p;\n };\n\n const q = ln < 0.5 ? ln * (1 + sn) : ln + sn - ln * sn;\n const p = 2 * ln - q;\n const hNorm = h / 360;\n\n return {\n r: Math.round(hue2rgb(p, q, hNorm + 1 / 3) * 255),\n g: Math.round(hue2rgb(p, q, hNorm) * 255),\n b: Math.round(hue2rgb(p, q, hNorm - 1 / 3) * 255),\n };\n}\n\nexport function hexToHsl(hex: string): HSL {\n const { r, g, b } = hexToRgb(hex);\n return rgbToHsl(r, g, b);\n}\n\nexport function hslToHex(h: number, s: number, l: number): string {\n const { r, g, b } = hslToRgb(h, s, l);\n return rgbToHex(r, g, b);\n}\n\nexport function isValidHex(hex: string): boolean {\n return /^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(hex);\n}\n\nexport function isLightColor(hex: string): boolean {\n const { r, g, b } = hexToRgb(hex);\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n return luminance > 0.5;\n}\n\nexport function rgbToCSS(r: number, g: number, b: number): string {\n return `rgb(${r}, ${g}, ${b})`;\n}\n\nexport function hslToCSS(h: number, s: number, l: number): string {\n return `hsl(${h}, ${s}%, ${l}%)`;\n}\n"],"mappings":"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","names":["hexToRgb","hex","clean","full","c","r","g","b","rgbToHex","clamp","n","toHex","rgbToHsl","rn","gn","bn","max","min","l","h","s","d","hslToRgb","sn","ln","val","hue2rgb","p","q","t","tn","hNorm","hexToHsl","hslToHex","isValidHex","isLightColor","rgbToCSS","hslToCSS"]}
@@ -0,0 +1,2 @@
1
+ import{randomBytes as n}from"crypto";var o=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;function i(){let t=n(16);t[6]=t[6]&15|64,t[8]=t[8]&63|128;let r=Array.from(t,e=>e.toString(16).padStart(2,"0")).join("");return[r.slice(0,8),r.slice(8,12),r.slice(12,16),r.slice(16,20),r.slice(20,32)].join("-")}function a(t){return o.test(t)}function f(t){if(t<1)throw new Error("Count must be at least 1");return Array.from({length:t},()=>i())}export{n as a,i as b,a as c,f as d};
2
+ //# sourceMappingURL=chunk-GTYGA6PU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/generators/uuid.ts"],"sourcesContent":["/**\n * UUID v4 generator.\n * Zero-dependency, uses node:crypto for secure randomness.\n */\n\nimport { randomBytes } from 'node:crypto';\n\nconst UUID_V4_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;\n\nexport function generateUUID(): string {\n const bytes = randomBytes(16);\n bytes[6] = (bytes[6]! & 0x0f) | 0x40; // version 4\n bytes[8] = (bytes[8]! & 0x3f) | 0x80; // variant 1\n\n const hex = Array.from(bytes, (b) => b!.toString(16).padStart(2, '0')).join('');\n\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20, 32),\n ].join('-');\n}\n\nexport function isValidUUID(id: string): boolean {\n return UUID_V4_REGEX.test(id);\n}\n\nexport function generateUUIDs(count: number): string[] {\n if (count < 1) throw new Error('Count must be at least 1');\n return Array.from({ length: count }, () => generateUUID());\n}\n\nexport { randomBytes };\n"],"mappings":"AAKA,OAAS,eAAAA,MAAmB,SAE5B,IAAMC,EAAgB,wEAEf,SAASC,GAAuB,CACrC,IAAMC,EAAQH,EAAY,EAAE,EAC5BG,EAAM,CAAC,EAAKA,EAAM,CAAC,EAAK,GAAQ,GAChCA,EAAM,CAAC,EAAKA,EAAM,CAAC,EAAK,GAAQ,IAEhC,IAAMC,EAAM,MAAM,KAAKD,EAAQE,GAAMA,EAAG,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,EAE9E,MAAO,CACLD,EAAI,MAAM,EAAG,CAAC,EACdA,EAAI,MAAM,EAAG,EAAE,EACfA,EAAI,MAAM,GAAI,EAAE,EAChBA,EAAI,MAAM,GAAI,EAAE,EAChBA,EAAI,MAAM,GAAI,EAAE,CAClB,EAAE,KAAK,GAAG,CACZ,CAEO,SAASE,EAAYC,EAAqB,CAC/C,OAAON,EAAc,KAAKM,CAAE,CAC9B,CAEO,SAASC,EAAcC,EAAyB,CACrD,GAAIA,EAAQ,EAAG,MAAM,IAAI,MAAM,0BAA0B,EACzD,OAAO,MAAM,KAAK,CAAE,OAAQA,CAAM,EAAG,IAAMP,EAAa,CAAC,CAC3D","names":["randomBytes","UUID_V4_REGEX","generateUUID","bytes","hex","b","isValidUUID","id","generateUUIDs","count"]}
@@ -0,0 +1,2 @@
1
+ function l(r){let e=r.replace(/-/g,"+").replace(/_/g,"/");for(;e.length%4!==0;)e+="=";return Buffer.from(e,"base64").toString("utf-8")}function t(r){let e=r.split(".");if(e.length!==3)throw new Error("Invalid JWT: token must have 3 parts separated by dots");let[n,a,o]=e,s,i;try{s=JSON.parse(l(n))}catch{throw new Error("Invalid JWT: header is not valid JSON")}try{i=JSON.parse(l(a))}catch{throw new Error("Invalid JWT: payload is not valid JSON")}return{header:s,payload:i,signature:o}}function u(r){try{let{payload:e}=t(r);if(e.exp==null)return{expired:!1,expiresAt:null};let n=Math.floor(Date.now()/1e3);return{expired:e.exp<n,expiresAt:new Date(e.exp*1e3)}}catch{return{expired:!1,expiresAt:null}}}function p(r){if(r.split(".").length!==3)return!1;try{return t(r),!0}catch{return!1}}function d(r){try{let{payload:e}=t(r);return e.iss!=null?e.iss:null}catch{return null}}function c(r){try{let{payload:e}=t(r);return e.sub!=null?e.sub:null}catch{return null}}function g(r){try{let{payload:e}=t(r);return e.exp==null?null:new Date(e.exp*1e3)}catch{return null}}export{t as a,u as b,p as c,d,c as e,g as f};
2
+ //# sourceMappingURL=chunk-GZW2QEOC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/encoders/jwt.ts"],"sourcesContent":["/**\n * JWT decoder (header/payload parsing).\n * Zero-dependency, uses Node Buffer.\n */\n\nexport interface JWTHeader {\n alg?: string;\n typ?: string;\n [key: string]: unknown;\n}\n\nexport interface JWTPayload {\n sub?: string;\n iss?: string;\n aud?: string | string[];\n exp?: number;\n nbf?: number;\n iat?: number;\n jti?: string;\n [key: string]: unknown;\n}\n\nexport interface JWTDecodeResult {\n header: JWTHeader;\n payload: JWTPayload;\n signature: string;\n}\n\nexport interface JWTExpired {\n expired: boolean;\n expiresAt: Date | null;\n}\n\nfunction base64UrlDecode(str: string): string {\n let base64 = str.replace(/-/g, '+').replace(/_/g, '/');\n while (base64.length % 4 !== 0) {\n base64 += '=';\n }\n return Buffer.from(base64, 'base64').toString('utf-8');\n}\n\nexport function decode(token: string): JWTDecodeResult {\n const parts = token.split('.');\n if (parts.length !== 3) {\n throw new Error('Invalid JWT: token must have 3 parts separated by dots');\n }\n\n const [headerB64, payloadB64, signature] = parts;\n\n let header: JWTHeader;\n let payload: JWTPayload;\n\n try {\n header = JSON.parse(base64UrlDecode(headerB64!)) as JWTHeader;\n } catch {\n throw new Error('Invalid JWT: header is not valid JSON');\n }\n\n try {\n payload = JSON.parse(base64UrlDecode(payloadB64!)) as JWTPayload;\n } catch {\n throw new Error('Invalid JWT: payload is not valid JSON');\n }\n\n return {\n header,\n payload,\n signature: signature as string,\n };\n}\n\nexport function isExpired(token: string): JWTExpired {\n try {\n const { payload } = decode(token);\n if (payload.exp == null) {\n return { expired: false, expiresAt: null };\n }\n const now = Math.floor(Date.now() / 1000);\n const expired = payload.exp < now;\n return {\n expired,\n expiresAt: new Date(payload.exp * 1000),\n };\n } catch {\n return { expired: false, expiresAt: null };\n }\n}\n\nexport function isValidJWT(token: string): boolean {\n if (token.split('.').length !== 3) return false;\n try {\n decode(token);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getIssuer(token: string): string | null {\n try {\n const { payload } = decode(token);\n return payload.iss != null ? (payload.iss as string) : null;\n } catch {\n return null;\n }\n}\n\nexport function getSubject(token: string): string | null {\n try {\n const { payload } = decode(token);\n return payload.sub != null ? (payload.sub as string) : null;\n } catch {\n return null;\n }\n}\n\nexport function getExpiration(token: string): Date | null {\n try {\n const { payload } = decode(token);\n if (payload.exp == null) return null;\n return new Date(payload.exp * 1000);\n } catch {\n return null;\n }\n}\n"],"mappings":"AAiCA,SAASA,EAAgBC,EAAqB,CAC5C,IAAIC,EAASD,EAAI,QAAQ,KAAM,GAAG,EAAE,QAAQ,KAAM,GAAG,EACrD,KAAOC,EAAO,OAAS,IAAM,GAC3BA,GAAU,IAEZ,OAAO,OAAO,KAAKA,EAAQ,QAAQ,EAAE,SAAS,OAAO,CACvD,CAEO,SAASC,EAAOC,EAAgC,CACrD,IAAMC,EAAQD,EAAM,MAAM,GAAG,EAC7B,GAAIC,EAAM,SAAW,EACnB,MAAM,IAAI,MAAM,wDAAwD,EAG1E,GAAM,CAACC,EAAWC,EAAYC,CAAS,EAAIH,EAEvCI,EACAC,EAEJ,GAAI,CACFD,EAAS,KAAK,MAAMT,EAAgBM,CAAU,CAAC,CACjD,MAAQ,CACN,MAAM,IAAI,MAAM,uCAAuC,CACzD,CAEA,GAAI,CACFI,EAAU,KAAK,MAAMV,EAAgBO,CAAW,CAAC,CACnD,MAAQ,CACN,MAAM,IAAI,MAAM,wCAAwC,CAC1D,CAEA,MAAO,CACL,OAAAE,EACA,QAAAC,EACA,UAAWF,CACb,CACF,CAEO,SAASG,EAAUP,EAA2B,CACnD,GAAI,CACF,GAAM,CAAE,QAAAM,CAAQ,EAAIP,EAAOC,CAAK,EAChC,GAAIM,EAAQ,KAAO,KACjB,MAAO,CAAE,QAAS,GAAO,UAAW,IAAK,EAE3C,IAAME,EAAM,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EAExC,MAAO,CACL,QAFcF,EAAQ,IAAME,EAG5B,UAAW,IAAI,KAAKF,EAAQ,IAAM,GAAI,CACxC,CACF,MAAQ,CACN,MAAO,CAAE,QAAS,GAAO,UAAW,IAAK,CAC3C,CACF,CAEO,SAASG,EAAWT,EAAwB,CACjD,GAAIA,EAAM,MAAM,GAAG,EAAE,SAAW,EAAG,MAAO,GAC1C,GAAI,CACF,OAAAD,EAAOC,CAAK,EACL,EACT,MAAQ,CACN,MAAO,EACT,CACF,CAEO,SAASU,EAAUV,EAA8B,CACtD,GAAI,CACF,GAAM,CAAE,QAAAM,CAAQ,EAAIP,EAAOC,CAAK,EAChC,OAAOM,EAAQ,KAAO,KAAQA,EAAQ,IAAiB,IACzD,MAAQ,CACN,OAAO,IACT,CACF,CAEO,SAASK,EAAWX,EAA8B,CACvD,GAAI,CACF,GAAM,CAAE,QAAAM,CAAQ,EAAIP,EAAOC,CAAK,EAChC,OAAOM,EAAQ,KAAO,KAAQA,EAAQ,IAAiB,IACzD,MAAQ,CACN,OAAO,IACT,CACF,CAEO,SAASM,EAAcZ,EAA4B,CACxD,GAAI,CACF,GAAM,CAAE,QAAAM,CAAQ,EAAIP,EAAOC,CAAK,EAChC,OAAIM,EAAQ,KAAO,KAAa,KACzB,IAAI,KAAKA,EAAQ,IAAM,GAAI,CACpC,MAAQ,CACN,OAAO,IACT,CACF","names":["base64UrlDecode","str","base64","decode","token","parts","headerB64","payloadB64","signature","header","payload","isExpired","now","isValidJWT","getIssuer","getSubject","getExpiration"]}
@@ -0,0 +1,2 @@
1
+ import{randomBytes as A,webcrypto as m}from"crypto";var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ",l="abcdefghijklmnopqrstuvwxyz",g="0123456789",f="!@#$%^&*()_+-=[]{}|;:,.<>?",p="Il1O0",d={length:16,uppercase:!0,lowercase:!0,numbers:!0,symbols:!1,excludeAmbiguous:!1};function u(t,e){return e?t.split("").filter(o=>!p.includes(o)).join(""):t}function i(t){let e=new Uint32Array(1);return m.getRandomValues(e),e[0]%t}function w(t={}){let e={...d,...t},o="";e.uppercase&&(o+=u(a,e.excludeAmbiguous)),e.lowercase&&(o+=u(l,e.excludeAmbiguous)),e.numbers&&(o+=u(g,e.excludeAmbiguous)),e.symbols&&(o+=f),o.length===0&&(o=l);let r="";if(e.uppercase){let n=u(a,e.excludeAmbiguous);r+=n[i(n.length)]}if(e.lowercase){let n=u(l,e.excludeAmbiguous);r+=n[i(n.length)]}if(e.numbers){let n=u(g,e.excludeAmbiguous);r+=n[i(n.length)]}if(e.symbols){let n=f;r+=n[i(n.length)]}let b=e.length-r.length;for(let n=0;n<b;n++)r+=o[i(o.length)];let s=r.split("");for(let n=s.length-1;n>0;n--){let c=i(n+1);[s[n],s[c]]=[s[c],s[n]]}return s.join("")}function h(t){if(t.length===0)return 0;let e=new Set(t.split("")).size;return Math.floor(t.length*Math.log2(e))}function y(t){let e=h(t);return e<28?"weak":e<36?"fair":e<60?"strong":"very-strong"}export{A as a,w as b,h as c,y as d};
2
+ //# sourceMappingURL=chunk-NW6U5UEX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/crypto/password.ts"],"sourcesContent":["/**\n * Secure password generator.\n * Zero-dependency, uses only node:crypto for secure randomness.\n */\n\nimport { randomBytes, webcrypto } from 'node:crypto';\n\nexport interface PasswordOptions {\n length?: number;\n uppercase?: boolean;\n lowercase?: boolean;\n numbers?: boolean;\n symbols?: boolean;\n excludeAmbiguous?: boolean;\n}\n\nconst UPPERCASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nconst LOWERCASE = 'abcdefghijklmnopqrstuvwxyz';\nconst NUMBERS = '0123456789';\nconst SYMBOLS = '!@#$%^&*()_+-=[]{}|;:,.<>?';\nconst AMBIGUOUS = 'Il1O0';\n\nconst DEFAULT_OPTIONS: Required<PasswordOptions> = {\n length: 16,\n uppercase: true,\n lowercase: true,\n numbers: true,\n symbols: false,\n excludeAmbiguous: false,\n};\n\nfunction filterAmbiguous(chars: string, exclude: boolean): string {\n if (!exclude) return chars;\n return chars\n .split('')\n .filter((c) => !AMBIGUOUS.includes(c))\n .join('');\n}\n\nfunction secureRandomIndex(max: number): number {\n const array = new Uint32Array(1);\n webcrypto.getRandomValues(array);\n return array[0]! % max;\n}\n\nexport function generatePassword(options: PasswordOptions = {}): string {\n const opts: Required<PasswordOptions> = { ...DEFAULT_OPTIONS, ...options };\n\n let charset = '';\n\n if (opts.uppercase) charset += filterAmbiguous(UPPERCASE, opts.excludeAmbiguous);\n if (opts.lowercase) charset += filterAmbiguous(LOWERCASE, opts.excludeAmbiguous);\n if (opts.numbers) charset += filterAmbiguous(NUMBERS, opts.excludeAmbiguous);\n if (opts.symbols) charset += SYMBOLS;\n\n if (charset.length === 0) {\n charset = LOWERCASE;\n }\n\n let password = '';\n\n // Ensure at least one character from each required set\n if (opts.uppercase) {\n const pool = filterAmbiguous(UPPERCASE, opts.excludeAmbiguous);\n password += pool[secureRandomIndex(pool.length)]!;\n }\n if (opts.lowercase) {\n const pool = filterAmbiguous(LOWERCASE, opts.excludeAmbiguous);\n password += pool[secureRandomIndex(pool.length)]!;\n }\n if (opts.numbers) {\n const pool = filterAmbiguous(NUMBERS, opts.excludeAmbiguous);\n password += pool[secureRandomIndex(pool.length)]!;\n }\n if (opts.symbols) {\n const pool = SYMBOLS;\n password += pool[secureRandomIndex(pool.length)]!;\n }\n\n // Fill remaining length\n const remaining = opts.length - password.length;\n for (let i = 0; i < remaining; i++) {\n password += charset[secureRandomIndex(charset.length)]!;\n }\n\n // Shuffle the password\n const arr = password.split('');\n for (let i = arr.length - 1; i > 0; i--) {\n const j = secureRandomIndex(i + 1);\n [arr[i], arr[j]] = [arr[j]!, arr[i]!];\n }\n\n return arr.join('');\n}\n\nexport function calculateEntropy(password: string): number {\n if (password.length === 0) return 0;\n const uniqueChars = new Set(password.split('')).size;\n return Math.floor(password.length * Math.log2(uniqueChars));\n}\n\nexport function estimateStrength(password: string): 'weak' | 'fair' | 'strong' | 'very-strong' {\n const entropy = calculateEntropy(password);\n if (entropy < 28) return 'weak';\n if (entropy < 36) return 'fair';\n if (entropy < 60) return 'strong';\n return 'very-strong';\n}\n\n// Re-export randomBytes for testing\nexport { randomBytes };\n"],"mappings":"AAKA,OAAS,eAAAA,EAAa,aAAAC,MAAiB,SAWvC,IAAMC,EAAY,6BACZC,EAAY,6BACZC,EAAU,aACVC,EAAU,6BACVC,EAAY,QAEZC,EAA6C,CACjD,OAAQ,GACR,UAAW,GACX,UAAW,GACX,QAAS,GACT,QAAS,GACT,iBAAkB,EACpB,EAEA,SAASC,EAAgBC,EAAeC,EAA0B,CAChE,OAAKA,EACED,EACJ,MAAM,EAAE,EACR,OAAQE,GAAM,CAACL,EAAU,SAASK,CAAC,CAAC,EACpC,KAAK,EAAE,EAJWF,CAKvB,CAEA,SAASG,EAAkBC,EAAqB,CAC9C,IAAMC,EAAQ,IAAI,YAAY,CAAC,EAC/B,OAAAb,EAAU,gBAAgBa,CAAK,EACxBA,EAAM,CAAC,EAAKD,CACrB,CAEO,SAASE,EAAiBC,EAA2B,CAAC,EAAW,CACtE,IAAMC,EAAkC,CAAE,GAAGV,EAAiB,GAAGS,CAAQ,EAErEE,EAAU,GAEVD,EAAK,YAAWC,GAAWV,EAAgBN,EAAWe,EAAK,gBAAgB,GAC3EA,EAAK,YAAWC,GAAWV,EAAgBL,EAAWc,EAAK,gBAAgB,GAC3EA,EAAK,UAASC,GAAWV,EAAgBJ,EAASa,EAAK,gBAAgB,GACvEA,EAAK,UAASC,GAAWb,GAEzBa,EAAQ,SAAW,IACrBA,EAAUf,GAGZ,IAAIgB,EAAW,GAGf,GAAIF,EAAK,UAAW,CAClB,IAAMG,EAAOZ,EAAgBN,EAAWe,EAAK,gBAAgB,EAC7DE,GAAYC,EAAKR,EAAkBQ,EAAK,MAAM,CAAC,CACjD,CACA,GAAIH,EAAK,UAAW,CAClB,IAAMG,EAAOZ,EAAgBL,EAAWc,EAAK,gBAAgB,EAC7DE,GAAYC,EAAKR,EAAkBQ,EAAK,MAAM,CAAC,CACjD,CACA,GAAIH,EAAK,QAAS,CAChB,IAAMG,EAAOZ,EAAgBJ,EAASa,EAAK,gBAAgB,EAC3DE,GAAYC,EAAKR,EAAkBQ,EAAK,MAAM,CAAC,CACjD,CACA,GAAIH,EAAK,QAAS,CAChB,IAAMG,EAAOf,EACbc,GAAYC,EAAKR,EAAkBQ,EAAK,MAAM,CAAC,CACjD,CAGA,IAAMC,EAAYJ,EAAK,OAASE,EAAS,OACzC,QAASG,EAAI,EAAGA,EAAID,EAAWC,IAC7BH,GAAYD,EAAQN,EAAkBM,EAAQ,MAAM,CAAC,EAIvD,IAAMK,EAAMJ,EAAS,MAAM,EAAE,EAC7B,QAASG,EAAIC,EAAI,OAAS,EAAGD,EAAI,EAAGA,IAAK,CACvC,IAAME,EAAIZ,EAAkBU,EAAI,CAAC,EACjC,CAACC,EAAID,CAAC,EAAGC,EAAIC,CAAC,CAAC,EAAI,CAACD,EAAIC,CAAC,EAAID,EAAID,CAAC,CAAE,CACtC,CAEA,OAAOC,EAAI,KAAK,EAAE,CACpB,CAEO,SAASE,EAAiBN,EAA0B,CACzD,GAAIA,EAAS,SAAW,EAAG,MAAO,GAClC,IAAMO,EAAc,IAAI,IAAIP,EAAS,MAAM,EAAE,CAAC,EAAE,KAChD,OAAO,KAAK,MAAMA,EAAS,OAAS,KAAK,KAAKO,CAAW,CAAC,CAC5D,CAEO,SAASC,EAAiBR,EAA8D,CAC7F,IAAMS,EAAUH,EAAiBN,CAAQ,EACzC,OAAIS,EAAU,GAAW,OACrBA,EAAU,GAAW,OACrBA,EAAU,GAAW,SAClB,aACT","names":["randomBytes","webcrypto","UPPERCASE","LOWERCASE","NUMBERS","SYMBOLS","AMBIGUOUS","DEFAULT_OPTIONS","filterAmbiguous","chars","exclude","c","secureRandomIndex","max","array","generatePassword","options","opts","charset","password","pool","remaining","i","arr","j","calculateEntropy","uniqueChars","estimateStrength","entropy"]}
@@ -0,0 +1,2 @@
1
+ function i(n,r=2){let t=JSON.parse(n);return JSON.stringify(t,null,r)}function o(n){let r=JSON.parse(n);return JSON.stringify(r)}function a(n){try{return{valid:!0,data:JSON.parse(n)}}catch(r){return{valid:!1,error:r.message}}}function u(n,r=2){let t=JSON.parse(n),s={};for(let e of Object.keys(t).sort())s[e]=t[e];return JSON.stringify(s,null,r)}function g(n){let r=JSON.parse(n);return JSON.stringify(r)}function c(n,r=2){return JSON.stringify(n,null,r)}export{i as a,o as b,a as c,u as d,g as e,c as f};
2
+ //# sourceMappingURL=chunk-SDQ3PUQH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/formatters/json.ts"],"sourcesContent":["/**\n * JSON prettify / minify.\n * Zero-dependency.\n */\n\nexport function format(input: string, indent: number = 2): string {\n const parsed = JSON.parse(input);\n return JSON.stringify(parsed, null, indent);\n}\n\nexport function minify(input: string): string {\n const parsed = JSON.parse(input);\n return JSON.stringify(parsed);\n}\n\nexport function validate(input: string): { valid: boolean; error?: string; data?: unknown } {\n try {\n const data = JSON.parse(input);\n return { valid: true, data };\n } catch (err) {\n const message = (err as Error).message;\n return { valid: false, error: message };\n }\n}\n\nexport function sortByKeys(input: string, indent: number = 2): string {\n const parsed = JSON.parse(input) as Record<string, unknown>;\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(parsed).sort()) {\n sorted[key] = parsed[key];\n }\n return JSON.stringify(sorted, null, indent);\n}\n\nexport function flatten(input: string): string {\n const parsed = JSON.parse(input);\n return JSON.stringify(parsed);\n}\n\nexport function prettyStringify(obj: unknown, indent: number = 2): string {\n return JSON.stringify(obj, null, indent);\n}\n"],"mappings":"AAKO,SAASA,EAAOC,EAAeC,EAAiB,EAAW,CAChE,IAAMC,EAAS,KAAK,MAAMF,CAAK,EAC/B,OAAO,KAAK,UAAUE,EAAQ,KAAMD,CAAM,CAC5C,CAEO,SAASE,EAAOH,EAAuB,CAC5C,IAAME,EAAS,KAAK,MAAMF,CAAK,EAC/B,OAAO,KAAK,UAAUE,CAAM,CAC9B,CAEO,SAASE,EAASJ,EAAmE,CAC1F,GAAI,CAEF,MAAO,CAAE,MAAO,GAAM,KADT,KAAK,MAAMA,CAAK,CACF,CAC7B,OAASK,EAAK,CAEZ,MAAO,CAAE,MAAO,GAAO,MADNA,EAAc,OACO,CACxC,CACF,CAEO,SAASC,EAAWN,EAAeC,EAAiB,EAAW,CACpE,IAAMC,EAAS,KAAK,MAAMF,CAAK,EACzBO,EAAkC,CAAC,EACzC,QAAWC,KAAO,OAAO,KAAKN,CAAM,EAAE,KAAK,EACzCK,EAAOC,CAAG,EAAIN,EAAOM,CAAG,EAE1B,OAAO,KAAK,UAAUD,EAAQ,KAAMN,CAAM,CAC5C,CAEO,SAASQ,EAAQT,EAAuB,CAC7C,IAAME,EAAS,KAAK,MAAMF,CAAK,EAC/B,OAAO,KAAK,UAAUE,CAAM,CAC9B,CAEO,SAASQ,EAAgBC,EAAcV,EAAiB,EAAW,CACxE,OAAO,KAAK,UAAUU,EAAK,KAAMV,CAAM,CACzC","names":["format","input","indent","parsed","minify","validate","err","sortByKeys","sorted","key","flatten","prettyStringify","obj"]}
@@ -0,0 +1,2 @@
1
+ function e(n){return encodeURIComponent(n)}function o(n){return decodeURIComponent(n)}function t(n){return encodeURIComponent(n)}function r(n){return decodeURIComponent(n)}function c(n){try{return decodeURIComponent(n),!0}catch{return!1}}export{e as a,o as b,t as c,r as d,c as e};
2
+ //# sourceMappingURL=chunk-VPRHVS7Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/encoders/url.ts"],"sourcesContent":["/**\n * URL encode/decode.\n * Zero-dependency, uses Node built-in encodeURIComponent/decodeURIComponent.\n */\n\nexport function encode(input: string): string {\n return encodeURIComponent(input);\n}\n\nexport function decode(input: string): string {\n return decodeURIComponent(input);\n}\n\nexport function encodeComponent(input: string): string {\n return encodeURIComponent(input);\n}\n\nexport function decodeComponent(input: string): string {\n return decodeURIComponent(input);\n}\n\nexport function isValidEncoded(str: string): boolean {\n try {\n decodeURIComponent(str);\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":"AAKO,SAASA,EAAOC,EAAuB,CAC5C,OAAO,mBAAmBA,CAAK,CACjC,CAEO,SAASC,EAAOD,EAAuB,CAC5C,OAAO,mBAAmBA,CAAK,CACjC,CAEO,SAASE,EAAgBF,EAAuB,CACrD,OAAO,mBAAmBA,CAAK,CACjC,CAEO,SAASG,EAAgBH,EAAuB,CACrD,OAAO,mBAAmBA,CAAK,CACjC,CAEO,SAASI,EAAeC,EAAsB,CACnD,GAAI,CACF,0BAAmBA,CAAG,EACf,EACT,MAAQ,CACN,MAAO,EACT,CACF","names":["encode","input","decode","encodeComponent","decodeComponent","isValidEncoded","str"]}
@@ -0,0 +1,2 @@
1
+ function t(e){return Buffer.from(e,"utf-8").toString("base64")}function n(e){return Buffer.from(e,"base64").toString("utf-8")}function o(e){return e.length===0||!/^[A-Za-z0-9+/]*={0,2}$/.test(e)?!1:e.length%4===0}function g(e){return t(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function i(e){let r=e.replace(/-/g,"+").replace(/_/g,"/");for(;r.length%4!==0;)r+="=";return n(r)}export{t as a,n as b,o as c,g as d,i as e};
2
+ //# sourceMappingURL=chunk-YBYCYSEC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/encoders/base64.ts"],"sourcesContent":["/**\n * Base64 encode/decode.\n * Zero-dependency, uses Node Buffer.\n */\n\nexport function encode(input: string): string {\n return Buffer.from(input, 'utf-8').toString('base64');\n}\n\nexport function decode(input: string): string {\n return Buffer.from(input, 'base64').toString('utf-8');\n}\n\nexport function isBase64(str: string): boolean {\n if (str.length === 0) return false;\n const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/;\n if (!base64Regex.test(str)) return false;\n return str.length % 4 === 0;\n}\n\nexport function encodeURLSafe(input: string): string {\n return encode(input).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\nexport function decodeURLSafe(input: string): string {\n let base64 = input.replace(/-/g, '+').replace(/_/g, '/');\n while (base64.length % 4 !== 0) {\n base64 += '=';\n }\n return decode(base64);\n}\n"],"mappings":"AAKO,SAASA,EAAOC,EAAuB,CAC5C,OAAO,OAAO,KAAKA,EAAO,OAAO,EAAE,SAAS,QAAQ,CACtD,CAEO,SAASC,EAAOD,EAAuB,CAC5C,OAAO,OAAO,KAAKA,EAAO,QAAQ,EAAE,SAAS,OAAO,CACtD,CAEO,SAASE,EAASC,EAAsB,CAG7C,OAFIA,EAAI,SAAW,GAEf,CADgB,yBACH,KAAKA,CAAG,EAAU,GAC5BA,EAAI,OAAS,IAAM,CAC5B,CAEO,SAASC,EAAcJ,EAAuB,CACnD,OAAOD,EAAOC,CAAK,EAAE,QAAQ,MAAO,GAAG,EAAE,QAAQ,MAAO,GAAG,EAAE,QAAQ,MAAO,EAAE,CAChF,CAEO,SAASK,EAAcL,EAAuB,CACnD,IAAIM,EAASN,EAAM,QAAQ,KAAM,GAAG,EAAE,QAAQ,KAAM,GAAG,EACvD,KAAOM,EAAO,OAAS,IAAM,GAC3BA,GAAU,IAEZ,OAAOL,EAAOK,CAAM,CACtB","names":["encode","input","decode","isBase64","str","encodeURLSafe","decodeURLSafe","base64"]}
@@ -0,0 +1,2 @@
1
+ function s(e){return e.replace(/[-_\s]+(.)?/g,(r,t)=>t?t.toUpperCase():"").replace(/^[A-Z]/,r=>r.toLowerCase())}function n(e){return e.replace(/([A-Z])/g,"_$1").replace(/[-\s]+/g,"_").replace(/^_/,"").toLowerCase()}function o(e){return e.replace(/([A-Z])/g,"-$1").replace(/[_\s]+/g,"-").replace(/^-/,"").toLowerCase()}function a(e){let r=s(e);return r.charAt(0).toUpperCase()+r.slice(1)}function p(e){return n(e).toUpperCase()}function i(e){return e.replace(/([A-Z])/g,".$1").replace(/[-_\s]+/g,".").replace(/^\.|\.+$/g,"").toLowerCase()}function g(e){return e.split(/[-_\s]+/).map(r=>r.charAt(0).toUpperCase()+r.slice(1).toLowerCase()).join(" ")}function c(e){let r=e.replace(/[-_\s]+/g," ").trim();return r.charAt(0).toUpperCase()+r.slice(1).toLowerCase()}function C(e){return e.toUpperCase()}function l(e){return e.toLowerCase()}function u(e){return e.split("").map(r=>r===r.toUpperCase()?r.toLowerCase():r.toUpperCase()).join("")}function f(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[-_\s]+/g,"-").replace(/^-+|-+$/g,"")}export{s as a,n as b,o as c,a as d,p as e,i as f,g,c as h,C as i,l as j,u as k,f as l};
2
+ //# sourceMappingURL=chunk-ZZLUWX3F.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/formatters/text.ts"],"sourcesContent":["/**\n * String case converter.\n * Zero-dependency.\n */\n\nexport function camelCase(input: string): string {\n return input\n .replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : ''))\n .replace(/^[A-Z]/, (c) => c.toLowerCase());\n}\n\nexport function snakeCase(input: string): string {\n return input\n .replace(/([A-Z])/g, '_$1')\n .replace(/[-\\s]+/g, '_')\n .replace(/^_/, '')\n .toLowerCase();\n}\n\nexport function kebabCase(input: string): string {\n return input\n .replace(/([A-Z])/g, '-$1')\n .replace(/[_\\s]+/g, '-')\n .replace(/^-/, '')\n .toLowerCase();\n}\n\nexport function pascalCase(input: string): string {\n const camel = camelCase(input);\n return camel.charAt(0).toUpperCase() + camel.slice(1);\n}\n\nexport function constantCase(input: string): string {\n return snakeCase(input).toUpperCase();\n}\n\nexport function dotCase(input: string): string {\n return input\n .replace(/([A-Z])/g, '.$1')\n .replace(/[-_\\s]+/g, '.')\n .replace(/^\\.|\\.+$/g, '')\n .toLowerCase();\n}\n\nexport function titleCase(input: string): string {\n return input\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n}\n\nexport function sentenceCase(input: string): string {\n const result = input.replace(/[-_\\s]+/g, ' ').trim();\n return result.charAt(0).toUpperCase() + result.slice(1).toLowerCase();\n}\n\nexport function upperCase(input: string): string {\n return input.toUpperCase();\n}\n\nexport function lowerCase(input: string): string {\n return input.toLowerCase();\n}\n\nexport function reverseCase(input: string): string {\n return input\n .split('')\n .map((c) => (c === c.toUpperCase() ? c.toLowerCase() : c.toUpperCase()))\n .join('');\n}\n\nexport function slugify(input: string): string {\n return input\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/[-_\\s]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n"],"mappings":"AAKO,SAASA,EAAUC,EAAuB,CAC/C,OAAOA,EACJ,QAAQ,eAAgB,CAACC,EAAGC,IAAOA,EAAIA,EAAE,YAAY,EAAI,EAAG,EAC5D,QAAQ,SAAWA,GAAMA,EAAE,YAAY,CAAC,CAC7C,CAEO,SAASC,EAAUH,EAAuB,CAC/C,OAAOA,EACJ,QAAQ,WAAY,KAAK,EACzB,QAAQ,UAAW,GAAG,EACtB,QAAQ,KAAM,EAAE,EAChB,YAAY,CACjB,CAEO,SAASI,EAAUJ,EAAuB,CAC/C,OAAOA,EACJ,QAAQ,WAAY,KAAK,EACzB,QAAQ,UAAW,GAAG,EACtB,QAAQ,KAAM,EAAE,EAChB,YAAY,CACjB,CAEO,SAASK,EAAWL,EAAuB,CAChD,IAAMM,EAAQP,EAAUC,CAAK,EAC7B,OAAOM,EAAM,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAM,MAAM,CAAC,CACtD,CAEO,SAASC,EAAaP,EAAuB,CAClD,OAAOG,EAAUH,CAAK,EAAE,YAAY,CACtC,CAEO,SAASQ,EAAQR,EAAuB,CAC7C,OAAOA,EACJ,QAAQ,WAAY,KAAK,EACzB,QAAQ,WAAY,GAAG,EACvB,QAAQ,YAAa,EAAE,EACvB,YAAY,CACjB,CAEO,SAASS,EAAUT,EAAuB,CAC/C,OAAOA,EACJ,MAAM,SAAS,EACf,IAAKU,GAASA,EAAK,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAK,MAAM,CAAC,EAAE,YAAY,CAAC,EACxE,KAAK,GAAG,CACb,CAEO,SAASC,EAAaX,EAAuB,CAClD,IAAMY,EAASZ,EAAM,QAAQ,WAAY,GAAG,EAAE,KAAK,EACnD,OAAOY,EAAO,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAO,MAAM,CAAC,EAAE,YAAY,CACtE,CAEO,SAASC,EAAUb,EAAuB,CAC/C,OAAOA,EAAM,YAAY,CAC3B,CAEO,SAASc,EAAUd,EAAuB,CAC/C,OAAOA,EAAM,YAAY,CAC3B,CAEO,SAASe,EAAYf,EAAuB,CACjD,OAAOA,EACJ,MAAM,EAAE,EACR,IAAKE,GAAOA,IAAMA,EAAE,YAAY,EAAIA,EAAE,YAAY,EAAIA,EAAE,YAAY,CAAE,EACtE,KAAK,EAAE,CACZ,CAEO,SAASc,EAAQhB,EAAuB,CAC7C,OAAOA,EACJ,YAAY,EACZ,KAAK,EACL,QAAQ,YAAa,EAAE,EACvB,QAAQ,WAAY,GAAG,EACvB,QAAQ,WAAY,EAAE,CAC3B","names":["camelCase","input","_","c","snakeCase","kebabCase","pascalCase","camel","constantCase","dotCase","titleCase","word","sentenceCase","result","upperCase","lowerCase","reverseCase","slugify"]}