idmint 1.0.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +21 -8
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -91,6 +91,11 @@ idmint.medium(); // 21 characters (default, recommended)
|
|
|
91
91
|
idmint.long(); // 32 characters
|
|
92
92
|
```
|
|
93
93
|
|
|
94
|
+
## Error handling
|
|
95
|
+
|
|
96
|
+
All public APIs validate input and throw descriptive errors.
|
|
97
|
+
This is intentional to avoid silent failures in production.
|
|
98
|
+
|
|
94
99
|
## 🔒 How uniqueness is ensured
|
|
95
100
|
|
|
96
101
|
idmint does not store IDs in any database.
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -8,17 +8,29 @@ const ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|
|
|
8
8
|
*/
|
|
9
9
|
function getRandomBytes(size) {
|
|
10
10
|
if (!globalThis.crypto || !globalThis.crypto.getRandomValues) {
|
|
11
|
-
throw new Error("Secure crypto API not available
|
|
11
|
+
throw new Error("[idmint] Secure crypto API not available in this environment");
|
|
12
12
|
}
|
|
13
13
|
return globalThis.crypto.getRandomValues(new Uint8Array(size));
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Validate ID size
|
|
17
|
+
*/
|
|
18
|
+
function validateSize(size) {
|
|
19
|
+
if (typeof size !== "number") {
|
|
20
|
+
throw new TypeError(`[idmint] size must be a number, received ${typeof size}`);
|
|
21
|
+
}
|
|
22
|
+
if (!Number.isInteger(size)) {
|
|
23
|
+
throw new RangeError("[idmint] size must be an integer");
|
|
24
|
+
}
|
|
25
|
+
if (size < 4 || size > 64) {
|
|
26
|
+
throw new RangeError("[idmint] size must be between 4 and 64");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
15
29
|
/**
|
|
16
30
|
* Generate a secure unique ID
|
|
17
31
|
*/
|
|
18
32
|
export function generateId(size = 21) {
|
|
19
|
-
|
|
20
|
-
throw new Error("size must be an integer between 4 and 64");
|
|
21
|
-
}
|
|
33
|
+
validateSize(size);
|
|
22
34
|
const bytes = getRandomBytes(size);
|
|
23
35
|
let id = "";
|
|
24
36
|
for (let i = 0; i < size; i++) {
|
|
@@ -30,8 +42,8 @@ export function generateId(size = 21) {
|
|
|
30
42
|
* Generate ID with prefix
|
|
31
43
|
*/
|
|
32
44
|
export function generateIdWithPrefix(prefix, size = 21) {
|
|
33
|
-
if (
|
|
34
|
-
throw new
|
|
45
|
+
if (typeof prefix !== "string" || prefix.trim() === "") {
|
|
46
|
+
throw new TypeError("[idmint] prefix must be a non-empty string");
|
|
35
47
|
}
|
|
36
48
|
return `${prefix}_${generateId(size)}`;
|
|
37
49
|
}
|
|
@@ -39,9 +51,10 @@ export function generateIdWithPrefix(prefix, size = 21) {
|
|
|
39
51
|
* Time-based sortable ID
|
|
40
52
|
*/
|
|
41
53
|
export function timeBasedId(size = 21) {
|
|
54
|
+
validateSize(size);
|
|
42
55
|
const time = Date.now().toString(36);
|
|
43
56
|
if (size <= time.length) {
|
|
44
|
-
throw new
|
|
57
|
+
throw new RangeError(`[idmint] size must be greater than ${time.length} for timeBasedId`);
|
|
45
58
|
}
|
|
46
59
|
const randomPart = generateId(size - time.length);
|
|
47
60
|
return time + randomPart;
|
|
@@ -49,7 +62,7 @@ export function timeBasedId(size = 21) {
|
|
|
49
62
|
/**
|
|
50
63
|
* Preset generators
|
|
51
64
|
*/
|
|
52
|
-
export const
|
|
65
|
+
export const idmint = {
|
|
53
66
|
short: () => generateId(8),
|
|
54
67
|
medium: () => generateId(21),
|
|
55
68
|
long: () => generateId(32),
|