1 | "use strict";
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 | Object.defineProperty(exports, "__esModule", { value: true });
|
9 | exports.nanoid = exports.nanoIdCustomAlphabet = exports.ALPHABET_BASE64_URL = exports.ALPHABET_BASE64 = exports.ALPHABET_ALPHANUMERIC = exports.ALPHABET_ALPHANUMERIC_UPPERCASE = exports.ALPHABET_ALPHANUMERIC_LOWERCASE = exports.ALPHABET_UPPERCASE = exports.ALPHABET_LOWERCASE = exports.ALPHABET_NUMBER = void 0;
|
10 |
|
11 | const node_crypto_1 = require("node:crypto");
|
12 | exports.ALPHABET_NUMBER = '0123456789';
|
13 | exports.ALPHABET_LOWERCASE = 'abcdefghijklmnopqrstuvwxyz';
|
14 | exports.ALPHABET_UPPERCASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
15 | exports.ALPHABET_ALPHANUMERIC_LOWERCASE = [exports.ALPHABET_NUMBER, exports.ALPHABET_LOWERCASE].join('');
|
16 | exports.ALPHABET_ALPHANUMERIC_UPPERCASE = [exports.ALPHABET_NUMBER, exports.ALPHABET_UPPERCASE].join('');
|
17 | exports.ALPHABET_ALPHANUMERIC = [exports.ALPHABET_NUMBER, exports.ALPHABET_LOWERCASE, exports.ALPHABET_UPPERCASE].join('');
|
18 | exports.ALPHABET_BASE64 = [exports.ALPHABET_ALPHANUMERIC, '+/'].join('');
|
19 | exports.ALPHABET_BASE64_URL = [exports.ALPHABET_ALPHANUMERIC, '-_'].join('');
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 | const POOL_SIZE_MULTIPLIER = 128;
|
26 | let pool;
|
27 | let poolOffset;
|
28 | function fillPool(bytes) {
|
29 | if (!pool || pool.length < bytes) {
|
30 | pool = Buffer.allocUnsafe(bytes * POOL_SIZE_MULTIPLIER);
|
31 | (0, node_crypto_1.randomFillSync)(pool);
|
32 | poolOffset = 0;
|
33 | }
|
34 | else if (poolOffset + bytes > pool.length) {
|
35 | (0, node_crypto_1.randomFillSync)(pool);
|
36 | poolOffset = 0;
|
37 | }
|
38 | poolOffset += bytes;
|
39 | }
|
40 | function random(bytes) {
|
41 |
|
42 | fillPool((bytes -= 0));
|
43 | return pool.subarray(poolOffset - bytes, poolOffset);
|
44 | }
|
45 | function customRandom(alphabet, defaultSize, getRandom) {
|
46 |
|
47 |
|
48 |
|
49 |
|
50 | const mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1;
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 | const step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length);
|
62 | return (size = defaultSize) => {
|
63 | let id = '';
|
64 | while (true) {
|
65 | const bytes = getRandom(step);
|
66 |
|
67 | let i = step;
|
68 | while (i--) {
|
69 |
|
70 | id += alphabet[bytes[i] & mask] || '';
|
71 | if (id.length === size)
|
72 | return id;
|
73 | }
|
74 | }
|
75 | };
|
76 | }
|
77 | function nanoIdCustomAlphabet(alphabet, size = 21) {
|
78 | return customRandom(alphabet, size, random);
|
79 | }
|
80 | exports.nanoIdCustomAlphabet = nanoIdCustomAlphabet;
|
81 | function nanoid(size = 21) {
|
82 |
|
83 | fillPool((size -= 0));
|
84 | let id = '';
|
85 |
|
86 | for (let i = poolOffset - size; i < poolOffset; i++) {
|
87 |
|
88 |
|
89 |
|
90 |
|
91 |
|
92 | id += exports.ALPHABET_BASE64_URL[pool[i] & 63];
|
93 | }
|
94 | return id;
|
95 | }
|
96 | exports.nanoid = nanoid;
|