idmint 1.0.5 → 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 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.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. This environment is not supported.");
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
- if (!Number.isInteger(size) || size < 4 || size > 64) {
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 (!prefix) {
34
- throw new Error("prefix is required");
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 Error("size too small for time-based ID");
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "idmint",
3
- "version": "1.0.5",
3
+ "version": "1.1.0",
4
4
  "description": "Enterprise-grade, collision-resistant unique ID generator",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",