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 +4 -4
- package/dist/index.js +20 -6
- package/package.json +7 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generate a
|
|
2
|
+
* Generate a secure unique ID
|
|
3
3
|
*/
|
|
4
4
|
export declare function generateId(size?: number): string;
|
|
5
5
|
/**
|
|
6
|
-
* Generate ID with prefix
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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 =
|
|
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
|
|
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
|
-
*
|
|
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.
|
|
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",
|