idmint 1.0.1 → 1.0.2

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,32 @@
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
+ * Cross-platform secure random bytes
8
+ * - Browser: crypto.getRandomValues
9
+ * - Node.js: require("crypto").randomBytes
10
+ */
11
+ function getRandomBytes(size) {
12
+ // Browser & modern runtimes
13
+ if (typeof globalThis.crypto !== "undefined" &&
14
+ globalThis.crypto.getRandomValues) {
15
+ return globalThis.crypto.getRandomValues(new Uint8Array(size));
16
+ }
17
+ // Node.js fallback
18
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
19
+ const { randomBytes } = require("crypto");
20
+ return randomBytes(size);
21
+ }
22
+ /**
23
+ * Generate a secure unique ID
9
24
  */
10
25
  export function generateId(size = 21) {
11
26
  if (!Number.isInteger(size) || size < 4 || size > 64) {
12
27
  throw new Error("size must be an integer between 4 and 64");
13
28
  }
14
- const bytes = randomBytes(size);
29
+ const bytes = getRandomBytes(size);
15
30
  let id = "";
16
31
  for (let i = 0; i < size; i++) {
17
32
  id += ALPHABET[bytes[i] & 63];
@@ -19,21 +34,27 @@ export function generateId(size = 21) {
19
34
  return id;
20
35
  }
21
36
  /**
22
- * Generate ID with prefix (e.g. user_xxx)
37
+ * Generate ID with prefix
23
38
  */
24
39
  export function generateIdWithPrefix(prefix, size = 21) {
40
+ if (!prefix) {
41
+ throw new Error("prefix is required");
42
+ }
25
43
  return `${prefix}_${generateId(size)}`;
26
44
  }
27
45
  /**
28
- * Time-sortable ID
46
+ * Time-based sortable ID
29
47
  */
30
48
  export function timeBasedId(size = 21) {
31
49
  const time = Date.now().toString(36);
50
+ if (size <= time.length) {
51
+ throw new Error("size too small for time-based ID");
52
+ }
32
53
  const randomPart = generateId(size - time.length);
33
54
  return time + randomPart;
34
55
  }
35
56
  /**
36
- * Presets
57
+ * Preset generators
37
58
  */
38
59
  export const trueid = {
39
60
  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.2",
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",