idmint 1.0.1 → 1.0.3

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/dist/index.d.ts CHANGED
@@ -1,17 +1,17 @@
1
1
  /**
2
- * Generate a cryptographically secure unique ID
2
+ * Generate a secure unique ID
3
3
  */
4
4
  export declare function generateId(size?: number): string;
5
5
  /**
6
- * Generate ID with prefix (e.g. user_xxx)
6
+ * Generate ID with prefix
7
7
  */
8
8
  export declare function generateIdWithPrefix(prefix: string, size?: number): string;
9
9
  /**
10
- * Time-sortable ID
10
+ * Time-based sortable ID
11
11
  */
12
12
  export declare function timeBasedId(size?: number): string;
13
13
  /**
14
- * Presets
14
+ * Preset generators
15
15
  */
16
16
  export declare const trueid: {
17
17
  short: () => string;
package/dist/index.js CHANGED
@@ -1,17 +1,25 @@
1
- import { randomBytes } from "crypto";
2
1
  /**
3
2
  * URL-safe alphabet (64 chars)
4
3
  * Each character = 6 bits of entropy
5
4
  */
6
5
  const ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_";
7
6
  /**
8
- * Generate a cryptographically secure unique ID
7
+ * Secure random bytes (Browser + Node 16+)
8
+ */
9
+ function getRandomBytes(size) {
10
+ if (!globalThis.crypto || !globalThis.crypto.getRandomValues) {
11
+ throw new Error("Secure crypto API not available. This environment is not supported.");
12
+ }
13
+ return globalThis.crypto.getRandomValues(new Uint8Array(size));
14
+ }
15
+ /**
16
+ * Generate a secure unique ID
9
17
  */
10
18
  export function generateId(size = 21) {
11
19
  if (!Number.isInteger(size) || size < 4 || size > 64) {
12
20
  throw new Error("size must be an integer between 4 and 64");
13
21
  }
14
- const bytes = randomBytes(size);
22
+ const bytes = getRandomBytes(size);
15
23
  let id = "";
16
24
  for (let i = 0; i < size; i++) {
17
25
  id += ALPHABET[bytes[i] & 63];
@@ -19,21 +27,27 @@ export function generateId(size = 21) {
19
27
  return id;
20
28
  }
21
29
  /**
22
- * Generate ID with prefix (e.g. user_xxx)
30
+ * Generate ID with prefix
23
31
  */
24
32
  export function generateIdWithPrefix(prefix, size = 21) {
33
+ if (!prefix) {
34
+ throw new Error("prefix is required");
35
+ }
25
36
  return `${prefix}_${generateId(size)}`;
26
37
  }
27
38
  /**
28
- * Time-sortable ID
39
+ * Time-based sortable ID
29
40
  */
30
41
  export function timeBasedId(size = 21) {
31
42
  const time = Date.now().toString(36);
43
+ if (size <= time.length) {
44
+ throw new Error("size too small for time-based ID");
45
+ }
32
46
  const randomPart = generateId(size - time.length);
33
47
  return time + randomPart;
34
48
  }
35
49
  /**
36
- * Presets
50
+ * Preset generators
37
51
  */
38
52
  export const trueid = {
39
53
  short: () => generateId(8),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "idmint",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Enterprise-grade, collision-resistant unique ID generator",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -12,6 +12,12 @@
12
12
  "build": "tsc",
13
13
  "dev": "ts-node src/index.ts"
14
14
  },
15
+ "exports": {
16
+ ".": {
17
+ "import": "./dist/index.js",
18
+ "types": "./dist/index.d.ts"
19
+ }
20
+ },
15
21
  "keywords": [
16
22
  "unique-id",
17
23
  "uid",