diff --git a/dist/short-unique-id.js b/dist/short-unique-id.js
index e3bf50a..2fa4a86 100644
--- a/dist/short-unique-id.js
+++ b/dist/short-unique-id.js
@@ -45,7 +45,7 @@ var ShortUniqueId = (() => {
});
// package.json
- var version = "5.1.1";
+ var version = "5.2.0";
// src/index.ts
var DEFAULT_UUID_LENGTH = 6;
diff --git a/dist/short-unique-id.js.map b/dist/short-unique-id.js.map
index 84bd9ec..42d184e 100644
--- a/dist/short-unique-id.js.map
+++ b/dist/short-unique-id.js.map
@@ -1,7 +1,7 @@
{
"version": 3,
"sources": ["../src/index.ts", "../package.json"],
- "sourcesContent": ["/**\n * @packageDocumentation\n **/\n\n// Copyright 2017-2022 the Short Unique ID authors. All rights reserved. Apache 2.0 license.\n\n// @ts-ignore\nimport {version} from '../package.json';\n\nexport interface ShortUniqueIdRanges {\n [k: string]: [number, number];\n};\n\nexport interface ShortUniqueIdRangesMap {\n [k: string]: ShortUniqueIdRanges;\n};\n\nexport type ShortUniqueIdDefaultDictionaries = 'number' | 'alpha' | 'alpha_lower' | 'alpha_upper' | 'alphanum' | 'alphanum_lower' | 'alphanum_upper' | 'hex';\n\n/**\n * ```js\n * {\n * dictionary: ['z', 'a', 'p', 'h', 'o', 'd', ...],\n * shuffle: false,\n * debug: false,\n * length: 6,\n * }\n * ```\n * \n * @see {@link DEFAULT_OPTIONS}\n */\nexport interface ShortUniqueIdOptions {\n /** User-defined character dictionary */\n dictionary: string[] | ShortUniqueIdDefaultDictionaries;\n\n /** If true, sequentialUUID use the dictionary in the given order */\n shuffle: boolean;\n\n /** If true the instance will console.log useful info */\n debug: boolean;\n\n /** From 1 to infinity, the length you wish your UUID to be */\n length: number;\n\n /** From 0 to infinity, the current value for the sequential UUID counter */\n counter: number;\n};\n\n/**\n * 6 was chosen as the default UUID length since for most cases\n * it will be more than aptly suitable to provide millions of UUIDs\n * with a very low probability of producing a duplicate UUID.\n *\n * For example, with a dictionary including digits from 0 to 9,\n * as well as the alphabet from a to z both in UPPER and lower case,\n * the probability of generating a duplicate in 1,000,000 rounds\n * is ~0.00000002, or about 1 in 50,000,000.\n */\nexport const DEFAULT_UUID_LENGTH: number = 6;\n\nexport const DEFAULT_OPTIONS: ShortUniqueIdOptions = {\n dictionary: 'alphanum',\n shuffle: true,\n debug: false,\n length: DEFAULT_UUID_LENGTH,\n counter: 0,\n};\n\n/**\n * Generate random or sequential UUID of any length.\n *\n * ### Use as module\n *\n * ```js\n * // Deno (web module) Import\n * import ShortUniqueId from 'https://cdn.jsdelivr.net/npm/short-unique-id@latest/src/index.ts';\n *\n * // ES6 / TypeScript Import\n * import ShortUniqueId from 'short-unique-id';\n *\n * // or Node.js require\n * const ShortUniqueId = require('short-unique-id');\n *\n * // Instantiate\n * const uid = new ShortUniqueId();\n *\n * // Random UUID\n * console.log(uid.rnd());\n *\n * // Sequential UUID\n * console.log(uid.seq());\n * ```\n *\n * ### Use in browser\n *\n * ```html\n * \n * \n *\n * \n * \n * ```\n *\n * ### Options\n *\n * Options can be passed when instantiating `uid`:\n *\n * ```js\n * const options = { ... };\n *\n * const uid = new ShortUniqueId(options);\n * ```\n *\n * For more information take a look at the [ShortUniqueIdOptions type definition](/interfaces/shortuniqueidoptions.html).\n */\nexport default class ShortUniqueId {\n /** @hidden */\n static default: typeof ShortUniqueId = ShortUniqueId;\n\n public counter: number;\n public debug: boolean;\n public dict: string[];\n public version: string;\n public dictIndex: number = 0;\n public dictRange: number[] =[];\n public lowerBound: number = 0;\n public upperBound: number = 0;\n public dictLength: number = 0;\n public uuidLength: number;\n\n protected _digit_first_ascii: number = 48;\n protected _digit_last_ascii: number = 58;\n protected _alpha_lower_first_ascii: number = 97;\n protected _alpha_lower_last_ascii: number = 123;\n protected _hex_last_ascii: number = 103;\n protected _alpha_upper_first_ascii: number = 65;\n protected _alpha_upper_last_ascii: number = 91;\n\n protected _number_dict_ranges: ShortUniqueIdRanges = {\n digits: [this._digit_first_ascii, this._digit_last_ascii],\n };\n\n protected _alpha_dict_ranges: ShortUniqueIdRanges = {\n lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii],\n upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii],\n };\n\n protected _alpha_lower_dict_ranges: ShortUniqueIdRanges = {\n lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii],\n };\n\n protected _alpha_upper_dict_ranges: ShortUniqueIdRanges = {\n upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii],\n };\n\n protected _alphanum_dict_ranges: ShortUniqueIdRanges = {\n digits: [this._digit_first_ascii, this._digit_last_ascii],\n lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii],\n upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii],\n };\n\n protected _alphanum_lower_dict_ranges: ShortUniqueIdRanges = {\n digits: [this._digit_first_ascii, this._digit_last_ascii],\n lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii],\n };\n\n protected _alphanum_upper_dict_ranges: ShortUniqueIdRanges = {\n digits: [this._digit_first_ascii, this._digit_last_ascii],\n upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii],\n };\n\n protected _hex_dict_ranges: ShortUniqueIdRanges = {\n decDigits: [this._digit_first_ascii, this._digit_last_ascii],\n alphaDigits: [this._alpha_lower_first_ascii, this._hex_last_ascii],\n };\n\n protected _dict_ranges: ShortUniqueIdRangesMap = {\n _number_dict_ranges: this._number_dict_ranges,\n _alpha_dict_ranges: this._alpha_dict_ranges,\n _alpha_lower_dict_ranges: this._alpha_lower_dict_ranges,\n _alpha_upper_dict_ranges: this._alpha_upper_dict_ranges,\n _alphanum_dict_ranges: this._alphanum_dict_ranges,\n _alphanum_lower_dict_ranges: this._alphanum_lower_dict_ranges,\n _alphanum_upper_dict_ranges: this._alphanum_upper_dict_ranges,\n _hex_dict_ranges: this._hex_dict_ranges,\n };\n\n /* tslint:disable consistent-return */\n protected log = (...args: any[]): void => {\n const finalArgs = [...args];\n finalArgs[0] = `[short-unique-id] ${args[0]}`;\n /* tslint:disable no-console */\n if (this.debug === true) {\n if (typeof console !== 'undefined' && console !== null) {\n return console.log(...finalArgs);\n }\n }\n /* tslint:enable no-console */\n };\n /* tslint:enable consistent-return */\n\n protected _normalizeDictionary = (dictionary: string[] | ShortUniqueIdDefaultDictionaries, shuffle?: boolean): string[] => {\n let finalDict: string[];\n\n if (dictionary && Array.isArray(dictionary) && dictionary.length > 1) {\n finalDict = dictionary as string[];\n } else {\n finalDict = [];\n\n let i;\n\n this.dictIndex = i = 0;\n\n const rangesName = `_${dictionary as ShortUniqueIdDefaultDictionaries}_dict_ranges`;\n const ranges = this._dict_ranges[rangesName];\n\n Object.keys(ranges).forEach((rangeType) => {\n const rangeTypeKey = rangeType;\n\n this.dictRange = ranges[rangeTypeKey];\n\n this.lowerBound = this.dictRange[0];\n this.upperBound = this.dictRange[1];\n\n for (\n this.dictIndex = i = this.lowerBound;\n this.lowerBound <= this.upperBound ? i < this.upperBound : i > this.upperBound;\n this.dictIndex = this.lowerBound <= this.upperBound ? i += 1 : i -= 1\n ) {\n finalDict.push(String.fromCharCode(this.dictIndex));\n }\n });\n }\n\n if (shuffle) {\n // Shuffle Dictionary to remove selection bias.\n const PROBABILITY = 0.5;\n finalDict = finalDict.sort(() => Math.random() - PROBABILITY);\n }\n\n return finalDict;\n }\n\n /** Change the dictionary after initialization. */\n setDictionary = (dictionary: string[] | ShortUniqueIdDefaultDictionaries, shuffle?: boolean): void => {\n this.dict = this._normalizeDictionary(dictionary, shuffle);\n\n // Cache Dictionary Length for future usage.\n this.dictLength = this.dict.length;\n\n // Reset internal counter.\n this.setCounter(0);\n };\n\n seq = (): string => {\n return this.sequentialUUID();\n };\n\n /**\n * Generates UUID based on internal counter that's incremented after each ID generation.\n * @alias `const uid = new ShortUniqueId(); uid.seq();`\n */\n sequentialUUID = (): string => {\n let counterDiv: number;\n let counterRem: number;\n let id: string = '';\n\n counterDiv = this.counter;\n\n do {\n counterRem = counterDiv % this.dictLength;\n counterDiv = Math.trunc(counterDiv / this.dictLength);\n id += this.dict[counterRem];\n } while (counterDiv !== 0);\n\n this.counter += 1;\n\n return id;\n };\n\n rnd = (uuidLength: number = this.uuidLength || DEFAULT_UUID_LENGTH): string => {\n return this.randomUUID(uuidLength);\n };\n\n /**\n * Generates UUID by creating each part randomly.\n * @alias `const uid = new ShortUniqueId(); uid.rnd(uuidLength: number);`\n */\n randomUUID = (uuidLength: number = this.uuidLength || DEFAULT_UUID_LENGTH): string => {\n let id: string;\n let randomPartIdx: number;\n let j: number;\n\n if ((uuidLength === null || typeof uuidLength === 'undefined') || uuidLength < 1) {\n throw new Error('Invalid UUID Length Provided');\n }\n\n const isPositive = uuidLength >= 0;\n\n // Generate random ID parts from Dictionary.\n id = '';\n for (\n j = 0;\n j < uuidLength;\n j += 1\n ) {\n randomPartIdx = parseInt(\n (Math.random() * this.dictLength).toFixed(0),\n 10,\n ) % this.dictLength;\n id += this.dict[randomPartIdx];\n }\n\n // Return random generated ID.\n return id;\n };\n\n fmt = (format: string, date?: Date): string => {\n return this.formattedUUID(format, date);\n };\n\n /**\n * Generates custom UUID with the provided format string.\n * @alias `const uid = new ShortUniqueId(); uid.fmt(format: string);`\n */\n formattedUUID = (format: string, date?: Date): string => {\n const fnMap = {\n '$r': this.randomUUID,\n '$s': this.sequentialUUID,\n '$t': this.stamp,\n };\n\n const result = format.replace(\n /\\$[rs]\\d{0,}|\\$t0|\\$t[1-9]\\d{1,}/g,\n (m) => {\n const fn = m.slice(0, 2);\n const len = parseInt(m.slice(2), 10);\n\n if (fn === '$s') {\n return fnMap[fn]().padStart(len, '0');\n }\n\n if (fn === '$t' && date) {\n return fnMap[fn](len, date);\n }\n\n return fnMap[fn as keyof typeof fnMap](len);\n },\n );\n\n return result;\n };\n\n /**\n * Calculates total number of possible UUIDs.\n *\n * Given that:\n *\n * - `H` is the total number of possible UUIDs\n * - `n` is the number of unique characters in the dictionary\n * - `l` is the UUID length\n *\n * Then `H` is defined as `n` to the power of `l`:\n *\n *
\n * \n *
\n *\n * This function returns `H`.\n */\n availableUUIDs = (uuidLength: number = this.uuidLength): number => {\n return parseFloat(\n Math.pow([...new Set(this.dict)].length, uuidLength).toFixed(0),\n );\n };\n\n /**\n * Calculates approximate number of hashes before first collision.\n *\n * Given that:\n *\n * - `H` is the total number of possible UUIDs, or in terms of this library,\n * the result of running `availableUUIDs()`\n * - the expected number of values we have to choose before finding the\n * first collision can be expressed as the quantity `Q(H)`\n *\n * Then `Q(H)` can be approximated as the square root of the product of half\n * of pi times `H`:\n *\n *
\n * \n *
\n *\n * This function returns `Q(H)`.\n * \n * (see [Poisson distribution](https://en.wikipedia.org/wiki/Poisson_distribution))\n */\n approxMaxBeforeCollision = (rounds: number = this.availableUUIDs(this.uuidLength)): number => {\n return parseFloat(\n Math.sqrt((Math.PI / 2) * rounds).toFixed(20),\n );\n };\n\n /**\n * Calculates probability of generating duplicate UUIDs (a collision) in a\n * given number of UUID generation rounds.\n *\n * Given that:\n *\n * - `r` is the maximum number of times that `randomUUID()` will be called,\n * or better said the number of _rounds_\n * - `H` is the total number of possible UUIDs, or in terms of this library,\n * the result of running `availableUUIDs()`\n *\n * Then the probability of collision `p(r; H)` can be approximated as the result\n * of dividing the square root of the product of half of pi times `r` by `H`:\n *\n *
\n * \n *
\n *\n * This function returns `p(r; H)`.\n * \n * (see [Poisson distribution](https://en.wikipedia.org/wiki/Poisson_distribution))\n *\n * (Useful if you are wondering _\"If I use this lib and expect to perform at most\n * `r` rounds of UUID generations, what is the probability that I will hit a duplicate UUID?\"_.)\n */\n collisionProbability = (\n rounds: number = this.availableUUIDs(this.uuidLength),\n uuidLength: number = this.uuidLength,\n ): number => {\n return parseFloat(\n (\n this.approxMaxBeforeCollision(rounds) / this.availableUUIDs(uuidLength)\n ).toFixed(20),\n );\n };\n\n /**\n * Calculate a \"uniqueness\" score (from 0 to 1) of UUIDs based on size of\n * dictionary and chosen UUID length.\n *\n * Given that:\n *\n * - `H` is the total number of possible UUIDs, or in terms of this library,\n * the result of running `availableUUIDs()`\n * - `Q(H)` is the approximate number of hashes before first collision,\n * or in terms of this library, the result of running `approxMaxBeforeCollision()`\n *\n * Then `uniqueness` can be expressed as the additive inverse of the probability of\n * generating a \"word\" I had previously generated (a duplicate) at any given iteration\n * up to the the total number of possible UUIDs expressed as the quotiend of `Q(H)` and `H`:\n *\n *
\n * \n *
\n *\n * (Useful if you need a value to rate the \"quality\" of the combination of given dictionary\n * and UUID length. The closer to 1, higher the uniqueness and thus better the quality.)\n */\n uniqueness = (rounds: number = this.availableUUIDs(this.uuidLength)): number => {\n const score = parseFloat(\n (1 - (\n this.approxMaxBeforeCollision(rounds) / rounds\n )).toFixed(20),\n );\n return (\n score > 1\n ) ? (\n 1\n ) : (\n (score < 0) ? 0 : score\n );\n };\n\n /**\n * Return the version of this module.\n */\n getVersion = (): string => {\n return this.version;\n };\n\n /**\n * Generates a UUID with a timestamp that can be extracted using `uid.parseStamp(stampString);`.\n * \n * ```js\n * const uidWithTimestamp = uid.stamp(32);\n * console.log(uidWithTimestamp);\n * // GDa608f973aRCHLXQYPTbKDbjDeVsSb3\n * \n * console.log(uid.parseStamp(uidWithTimestamp));\n * // 2021-05-03T06:24:58.000Z\n * ```\n */\n stamp = (finalLength: number, date?: Date): string => {\n const hexStamp = Math.floor(+(date || new Date()) / 1000).toString(16);\n\n if (typeof finalLength === 'number' && finalLength === 0) {\n return hexStamp;\n }\n\n if (typeof finalLength !== 'number' || finalLength < 10) {\n throw new Error(\n [\n 'Param finalLength must be a number greater than or equal to 10,',\n 'or 0 if you want the raw hexadecimal timestamp',\n ].join('\\n')\n );\n }\n\n const idLength = finalLength - 9;\n\n const rndIdx = Math.round(Math.random() * ((idLength > 15) ? 15 : idLength));\n\n const id = this.randomUUID(idLength);\n\n return `${id.substring(0, rndIdx)}${hexStamp}${id.substring(rndIdx)}${rndIdx.toString(16)}`;\n };\n\n /**\n * Extracts the date embeded in a UUID generated using the `uid.stamp(finalLength);` method.\n * \n * ```js\n * const uidWithTimestamp = uid.stamp(32);\n * console.log(uidWithTimestamp);\n * // GDa608f973aRCHLXQYPTbKDbjDeVsSb3\n * \n * console.log(uid.parseStamp(uidWithTimestamp));\n * // 2021-05-03T06:24:58.000Z\n * ```\n */\n parseStamp = (suid: string, format?: string): Date => {\n if (format && !(/t0|t[1-9]\\d{1,}/).test(format)) {\n throw new Error('Cannot extract date from a formated UUID with no timestamp in the format');\n }\n\n const stamp = (\n format\n ) ? (\n format.replace(\n /\\$[rs]\\d{0,}|\\$t0|\\$t[1-9]\\d{1,}/g,\n (m) => {\n const fnMap = {\n '$r': (len: number) => [...Array(len)].map(() => 'r').join(''),\n '$s': (len: number) => [...Array(len)].map(() => 's').join(''),\n '$t': (len: number) => [...Array(len)].map(() => 't').join(''),\n };\n\n const fn = m.slice(0, 2);\n const len = parseInt(m.slice(2), 10);\n\n return fnMap[fn as keyof typeof fnMap](len);\n },\n ).replace(\n /^(.*?)(t{8,})(.*)$/g,\n (_m, p1, p2) => {\n return suid.substring(p1.length, p1.length + p2.length);\n },\n )\n ) : (\n suid\n );\n\n if (stamp.length === 8) {\n return new Date(parseInt(stamp, 16) * 1000);\n }\n\n if (stamp.length < 10) {\n throw new Error('Stamp length invalid');\n }\n\n const rndIdx = parseInt(stamp.substring(stamp.length - 1), 16);\n\n return new Date(parseInt(stamp.substring(rndIdx, rndIdx + 8), 16) * 1000);\n };\n\n /**\n * Set the counter to a specific value.\n */\n setCounter = (counter: number): void => {\n this.counter = counter;\n };\n\n /**\n * Validate given UID contains only characters from the instanced dictionary or optionally provided dictionary.\n */\n validate = (uid: string, dictionary?: string[] | ShortUniqueIdDefaultDictionaries): boolean => {\n const finalDictionary = dictionary ? this._normalizeDictionary(dictionary) : this.dict;\n\n return uid.split('').every((c) => finalDictionary.includes(c));\n };\n\n constructor(argOptions: Partial = {}) {\n const options: ShortUniqueIdOptions = {\n ...DEFAULT_OPTIONS,\n ...argOptions as Partial,\n };\n\n this.counter = 0;\n this.debug = false;\n this.dict = [];\n this.version = version;\n\n const {\n dictionary,\n shuffle,\n length,\n counter,\n } = options;\n\n this.uuidLength = length;\n\n this.setDictionary(dictionary, shuffle);\n this.setCounter(counter);\n\n this.debug = options.debug;\n this.log(this.dict);\n this.log(\n `Generator instantiated with Dictionary Size ${this.dictLength} and counter set to ${this.counter}`\n );\n\n this.log = this.log.bind(this);\n this.setDictionary = this.setDictionary.bind(this);\n this.setCounter = this.setCounter.bind(this);\n this.seq = this.seq.bind(this);\n this.sequentialUUID = this.sequentialUUID.bind(this);\n this.rnd = this.rnd.bind(this);\n this.randomUUID = this.randomUUID.bind(this);\n this.fmt = this.fmt.bind(this);\n this.formattedUUID = this.formattedUUID.bind(this);\n this.availableUUIDs = this.availableUUIDs.bind(this);\n this.approxMaxBeforeCollision = this.approxMaxBeforeCollision.bind(this);\n this.collisionProbability = this.collisionProbability.bind(this);\n this.uniqueness = this.uniqueness.bind(this);\n this.getVersion = this.getVersion.bind(this);\n this.stamp = this.stamp.bind(this);\n this.parseStamp = this.parseStamp.bind(this);\n\n return this;\n }\n}\n", "{\n \"name\": \"short-unique-id\",\n \"version\": \"5.1.1\",\n \"description\": \"Generate random or sequential UUID of any length\",\n \"keywords\": [\n \"short\",\n \"random\",\n \"uid\",\n \"uuid\",\n \"guid\",\n \"node\",\n \"unique id\",\n \"generator\",\n \"tiny\"\n ],\n \"bin\": {\n \"short-unique-id\": \"bin/short-unique-id\",\n \"suid\": \"bin/short-unique-id\"\n },\n \"main\": \"dist/short-unique-id.js\",\n \"types\": \"dist/short-unique-id.d.ts\",\n \"homepage\": \"https://shortunique.id\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jeanlescure/short-unique-id\"\n },\n \"license\": \"Apache-2.0\",\n \"runkitExampleFilename\": \"./runkit.js\",\n \"scripts\": {\n \"test\": \"tsx ./src/test.ts\",\n \"test:local\": \"tsx ./src/test.ts && tsx --tsconfig ./specs/esm/tsconfig.json ./specs/esm/import.spec.ts && ./scripts/cjs-test\",\n \"build\": \"./scripts/build\",\n \"docs\": \"./scripts/docs\",\n \"release\": \"release-it\"\n },\n \"release-it\": {\n \"git\": {\n \"changelog\": \"auto-changelog --stdout -l false -u -t ./assets/changelog-compact.hbs\"\n },\n \"hooks\": {\n \"after:bump\": \"./scripts/release\"\n },\n \"npm\": {\n \"publish\": false\n }\n },\n \"files\": [\n \"bin\",\n \"dist\",\n \"runkit.js\",\n \"package.json\"\n ],\n \"devDependencies\": {\n \"@types/node\": \"^20.12.7\",\n \"auto-changelog\": \"^2.4.0\",\n \"esbuild\": \"^0.18.10\",\n \"refup\": \"^1.1.0\",\n \"release-it\": \"^15.11.0\",\n \"tslib\": \"^2.6.2\",\n \"tsx\": \"^4.7.3\",\n \"typedoc\": \"^0.25.13\",\n \"typedoc-plugin-extras\": \"^3.0.0\",\n \"typedoc-plugin-rename-defaults\": \"^0.7.0\",\n \"typedoc-plugin-script-inject\": \"^2.0.0\",\n \"typescript\": \"^5.4.5\"\n },\n \"overrides\": {\n \"vm2\": \"npm:vm2-fixed@0.0.1\"\n }\n}\n"],
+ "sourcesContent": ["/**\n * @packageDocumentation\n **/\n\n// Copyright 2017-2022 the Short Unique ID authors. All rights reserved. Apache 2.0 license.\n\n// @ts-ignore\nimport {version} from '../package.json';\n\nexport interface ShortUniqueIdRanges {\n [k: string]: [number, number];\n};\n\nexport interface ShortUniqueIdRangesMap {\n [k: string]: ShortUniqueIdRanges;\n};\n\nexport type ShortUniqueIdDefaultDictionaries = 'number' | 'alpha' | 'alpha_lower' | 'alpha_upper' | 'alphanum' | 'alphanum_lower' | 'alphanum_upper' | 'hex';\n\n/**\n * ```js\n * {\n * dictionary: ['z', 'a', 'p', 'h', 'o', 'd', ...],\n * shuffle: false,\n * debug: false,\n * length: 6,\n * }\n * ```\n * \n * @see {@link DEFAULT_OPTIONS}\n */\nexport interface ShortUniqueIdOptions {\n /** User-defined character dictionary */\n dictionary: string[] | ShortUniqueIdDefaultDictionaries;\n\n /** If true, sequentialUUID use the dictionary in the given order */\n shuffle: boolean;\n\n /** If true the instance will console.log useful info */\n debug: boolean;\n\n /** From 1 to infinity, the length you wish your UUID to be */\n length: number;\n\n /** From 0 to infinity, the current value for the sequential UUID counter */\n counter: number;\n};\n\n/**\n * 6 was chosen as the default UUID length since for most cases\n * it will be more than aptly suitable to provide millions of UUIDs\n * with a very low probability of producing a duplicate UUID.\n *\n * For example, with a dictionary including digits from 0 to 9,\n * as well as the alphabet from a to z both in UPPER and lower case,\n * the probability of generating a duplicate in 1,000,000 rounds\n * is ~0.00000002, or about 1 in 50,000,000.\n */\nexport const DEFAULT_UUID_LENGTH: number = 6;\n\nexport const DEFAULT_OPTIONS: ShortUniqueIdOptions = {\n dictionary: 'alphanum',\n shuffle: true,\n debug: false,\n length: DEFAULT_UUID_LENGTH,\n counter: 0,\n};\n\n/**\n * Generate random or sequential UUID of any length.\n *\n * ### Use as module\n *\n * ```js\n * // Deno (web module) Import\n * import ShortUniqueId from 'https://cdn.jsdelivr.net/npm/short-unique-id@latest/src/index.ts';\n *\n * // ES6 / TypeScript Import\n * import ShortUniqueId from 'short-unique-id';\n *\n * // or Node.js require\n * const ShortUniqueId = require('short-unique-id');\n *\n * // Instantiate\n * const uid = new ShortUniqueId();\n *\n * // Random UUID\n * console.log(uid.rnd());\n *\n * // Sequential UUID\n * console.log(uid.seq());\n * ```\n *\n * ### Use in browser\n *\n * ```html\n * \n * \n *\n * \n * \n * ```\n *\n * ### Options\n *\n * Options can be passed when instantiating `uid`:\n *\n * ```js\n * const options = { ... };\n *\n * const uid = new ShortUniqueId(options);\n * ```\n *\n * For more information take a look at the [ShortUniqueIdOptions type definition](/interfaces/shortuniqueidoptions.html).\n */\nexport default class ShortUniqueId {\n /** @hidden */\n static default: typeof ShortUniqueId = ShortUniqueId;\n\n public counter: number;\n public debug: boolean;\n public dict: string[];\n public version: string;\n public dictIndex: number = 0;\n public dictRange: number[] =[];\n public lowerBound: number = 0;\n public upperBound: number = 0;\n public dictLength: number = 0;\n public uuidLength: number;\n\n protected _digit_first_ascii: number = 48;\n protected _digit_last_ascii: number = 58;\n protected _alpha_lower_first_ascii: number = 97;\n protected _alpha_lower_last_ascii: number = 123;\n protected _hex_last_ascii: number = 103;\n protected _alpha_upper_first_ascii: number = 65;\n protected _alpha_upper_last_ascii: number = 91;\n\n protected _number_dict_ranges: ShortUniqueIdRanges = {\n digits: [this._digit_first_ascii, this._digit_last_ascii],\n };\n\n protected _alpha_dict_ranges: ShortUniqueIdRanges = {\n lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii],\n upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii],\n };\n\n protected _alpha_lower_dict_ranges: ShortUniqueIdRanges = {\n lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii],\n };\n\n protected _alpha_upper_dict_ranges: ShortUniqueIdRanges = {\n upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii],\n };\n\n protected _alphanum_dict_ranges: ShortUniqueIdRanges = {\n digits: [this._digit_first_ascii, this._digit_last_ascii],\n lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii],\n upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii],\n };\n\n protected _alphanum_lower_dict_ranges: ShortUniqueIdRanges = {\n digits: [this._digit_first_ascii, this._digit_last_ascii],\n lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii],\n };\n\n protected _alphanum_upper_dict_ranges: ShortUniqueIdRanges = {\n digits: [this._digit_first_ascii, this._digit_last_ascii],\n upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii],\n };\n\n protected _hex_dict_ranges: ShortUniqueIdRanges = {\n decDigits: [this._digit_first_ascii, this._digit_last_ascii],\n alphaDigits: [this._alpha_lower_first_ascii, this._hex_last_ascii],\n };\n\n protected _dict_ranges: ShortUniqueIdRangesMap = {\n _number_dict_ranges: this._number_dict_ranges,\n _alpha_dict_ranges: this._alpha_dict_ranges,\n _alpha_lower_dict_ranges: this._alpha_lower_dict_ranges,\n _alpha_upper_dict_ranges: this._alpha_upper_dict_ranges,\n _alphanum_dict_ranges: this._alphanum_dict_ranges,\n _alphanum_lower_dict_ranges: this._alphanum_lower_dict_ranges,\n _alphanum_upper_dict_ranges: this._alphanum_upper_dict_ranges,\n _hex_dict_ranges: this._hex_dict_ranges,\n };\n\n /* tslint:disable consistent-return */\n protected log = (...args: any[]): void => {\n const finalArgs = [...args];\n finalArgs[0] = `[short-unique-id] ${args[0]}`;\n /* tslint:disable no-console */\n if (this.debug === true) {\n if (typeof console !== 'undefined' && console !== null) {\n return console.log(...finalArgs);\n }\n }\n /* tslint:enable no-console */\n };\n /* tslint:enable consistent-return */\n\n protected _normalizeDictionary = (dictionary: string[] | ShortUniqueIdDefaultDictionaries, shuffle?: boolean): string[] => {\n let finalDict: string[];\n\n if (dictionary && Array.isArray(dictionary) && dictionary.length > 1) {\n finalDict = dictionary as string[];\n } else {\n finalDict = [];\n\n let i;\n\n this.dictIndex = i = 0;\n\n const rangesName = `_${dictionary as ShortUniqueIdDefaultDictionaries}_dict_ranges`;\n const ranges = this._dict_ranges[rangesName];\n\n Object.keys(ranges).forEach((rangeType) => {\n const rangeTypeKey = rangeType;\n\n this.dictRange = ranges[rangeTypeKey];\n\n this.lowerBound = this.dictRange[0];\n this.upperBound = this.dictRange[1];\n\n for (\n this.dictIndex = i = this.lowerBound;\n this.lowerBound <= this.upperBound ? i < this.upperBound : i > this.upperBound;\n this.dictIndex = this.lowerBound <= this.upperBound ? i += 1 : i -= 1\n ) {\n finalDict.push(String.fromCharCode(this.dictIndex));\n }\n });\n }\n\n if (shuffle) {\n // Shuffle Dictionary to remove selection bias.\n const PROBABILITY = 0.5;\n finalDict = finalDict.sort(() => Math.random() - PROBABILITY);\n }\n\n return finalDict;\n }\n\n /** Change the dictionary after initialization. */\n setDictionary = (dictionary: string[] | ShortUniqueIdDefaultDictionaries, shuffle?: boolean): void => {\n this.dict = this._normalizeDictionary(dictionary, shuffle);\n\n // Cache Dictionary Length for future usage.\n this.dictLength = this.dict.length;\n\n // Reset internal counter.\n this.setCounter(0);\n };\n\n seq = (): string => {\n return this.sequentialUUID();\n };\n\n /**\n * Generates UUID based on internal counter that's incremented after each ID generation.\n * @alias `const uid = new ShortUniqueId(); uid.seq();`\n */\n sequentialUUID = (): string => {\n let counterDiv: number;\n let counterRem: number;\n let id: string = '';\n\n counterDiv = this.counter;\n\n do {\n counterRem = counterDiv % this.dictLength;\n counterDiv = Math.trunc(counterDiv / this.dictLength);\n id += this.dict[counterRem];\n } while (counterDiv !== 0);\n\n this.counter += 1;\n\n return id;\n };\n\n rnd = (uuidLength: number = this.uuidLength || DEFAULT_UUID_LENGTH): string => {\n return this.randomUUID(uuidLength);\n };\n\n /**\n * Generates UUID by creating each part randomly.\n * @alias `const uid = new ShortUniqueId(); uid.rnd(uuidLength: number);`\n */\n randomUUID = (uuidLength: number = this.uuidLength || DEFAULT_UUID_LENGTH): string => {\n let id: string;\n let randomPartIdx: number;\n let j: number;\n\n if ((uuidLength === null || typeof uuidLength === 'undefined') || uuidLength < 1) {\n throw new Error('Invalid UUID Length Provided');\n }\n\n const isPositive = uuidLength >= 0;\n\n // Generate random ID parts from Dictionary.\n id = '';\n for (\n j = 0;\n j < uuidLength;\n j += 1\n ) {\n randomPartIdx = parseInt(\n (Math.random() * this.dictLength).toFixed(0),\n 10,\n ) % this.dictLength;\n id += this.dict[randomPartIdx];\n }\n\n // Return random generated ID.\n return id;\n };\n\n fmt = (format: string, date?: Date): string => {\n return this.formattedUUID(format, date);\n };\n\n /**\n * Generates custom UUID with the provided format string.\n * @alias `const uid = new ShortUniqueId(); uid.fmt(format: string);`\n */\n formattedUUID = (format: string, date?: Date): string => {\n const fnMap = {\n '$r': this.randomUUID,\n '$s': this.sequentialUUID,\n '$t': this.stamp,\n };\n\n const result = format.replace(\n /\\$[rs]\\d{0,}|\\$t0|\\$t[1-9]\\d{1,}/g,\n (m) => {\n const fn = m.slice(0, 2);\n const len = parseInt(m.slice(2), 10);\n\n if (fn === '$s') {\n return fnMap[fn]().padStart(len, '0');\n }\n\n if (fn === '$t' && date) {\n return fnMap[fn](len, date);\n }\n\n return fnMap[fn as keyof typeof fnMap](len);\n },\n );\n\n return result;\n };\n\n /**\n * Calculates total number of possible UUIDs.\n *\n * Given that:\n *\n * - `H` is the total number of possible UUIDs\n * - `n` is the number of unique characters in the dictionary\n * - `l` is the UUID length\n *\n * Then `H` is defined as `n` to the power of `l`:\n *\n *
\n * \n *
\n *\n * This function returns `H`.\n */\n availableUUIDs = (uuidLength: number = this.uuidLength): number => {\n return parseFloat(\n Math.pow([...new Set(this.dict)].length, uuidLength).toFixed(0),\n );\n };\n\n /**\n * Calculates approximate number of hashes before first collision.\n *\n * Given that:\n *\n * - `H` is the total number of possible UUIDs, or in terms of this library,\n * the result of running `availableUUIDs()`\n * - the expected number of values we have to choose before finding the\n * first collision can be expressed as the quantity `Q(H)`\n *\n * Then `Q(H)` can be approximated as the square root of the product of half\n * of pi times `H`:\n *\n *
\n * \n *
\n *\n * This function returns `Q(H)`.\n * \n * (see [Poisson distribution](https://en.wikipedia.org/wiki/Poisson_distribution))\n */\n approxMaxBeforeCollision = (rounds: number = this.availableUUIDs(this.uuidLength)): number => {\n return parseFloat(\n Math.sqrt((Math.PI / 2) * rounds).toFixed(20),\n );\n };\n\n /**\n * Calculates probability of generating duplicate UUIDs (a collision) in a\n * given number of UUID generation rounds.\n *\n * Given that:\n *\n * - `r` is the maximum number of times that `randomUUID()` will be called,\n * or better said the number of _rounds_\n * - `H` is the total number of possible UUIDs, or in terms of this library,\n * the result of running `availableUUIDs()`\n *\n * Then the probability of collision `p(r; H)` can be approximated as the result\n * of dividing the square root of the product of half of pi times `r` by `H`:\n *\n *
\n * \n *
\n *\n * This function returns `p(r; H)`.\n * \n * (see [Poisson distribution](https://en.wikipedia.org/wiki/Poisson_distribution))\n *\n * (Useful if you are wondering _\"If I use this lib and expect to perform at most\n * `r` rounds of UUID generations, what is the probability that I will hit a duplicate UUID?\"_.)\n */\n collisionProbability = (\n rounds: number = this.availableUUIDs(this.uuidLength),\n uuidLength: number = this.uuidLength,\n ): number => {\n return parseFloat(\n (\n this.approxMaxBeforeCollision(rounds) / this.availableUUIDs(uuidLength)\n ).toFixed(20),\n );\n };\n\n /**\n * Calculate a \"uniqueness\" score (from 0 to 1) of UUIDs based on size of\n * dictionary and chosen UUID length.\n *\n * Given that:\n *\n * - `H` is the total number of possible UUIDs, or in terms of this library,\n * the result of running `availableUUIDs()`\n * - `Q(H)` is the approximate number of hashes before first collision,\n * or in terms of this library, the result of running `approxMaxBeforeCollision()`\n *\n * Then `uniqueness` can be expressed as the additive inverse of the probability of\n * generating a \"word\" I had previously generated (a duplicate) at any given iteration\n * up to the the total number of possible UUIDs expressed as the quotiend of `Q(H)` and `H`:\n *\n *
\n * \n *
\n *\n * (Useful if you need a value to rate the \"quality\" of the combination of given dictionary\n * and UUID length. The closer to 1, higher the uniqueness and thus better the quality.)\n */\n uniqueness = (rounds: number = this.availableUUIDs(this.uuidLength)): number => {\n const score = parseFloat(\n (1 - (\n this.approxMaxBeforeCollision(rounds) / rounds\n )).toFixed(20),\n );\n return (\n score > 1\n ) ? (\n 1\n ) : (\n (score < 0) ? 0 : score\n );\n };\n\n /**\n * Return the version of this module.\n */\n getVersion = (): string => {\n return this.version;\n };\n\n /**\n * Generates a UUID with a timestamp that can be extracted using `uid.parseStamp(stampString);`.\n * \n * ```js\n * const uidWithTimestamp = uid.stamp(32);\n * console.log(uidWithTimestamp);\n * // GDa608f973aRCHLXQYPTbKDbjDeVsSb3\n * \n * console.log(uid.parseStamp(uidWithTimestamp));\n * // 2021-05-03T06:24:58.000Z\n * ```\n */\n stamp = (finalLength: number, date?: Date): string => {\n const hexStamp = Math.floor(+(date || new Date()) / 1000).toString(16);\n\n if (typeof finalLength === 'number' && finalLength === 0) {\n return hexStamp;\n }\n\n if (typeof finalLength !== 'number' || finalLength < 10) {\n throw new Error(\n [\n 'Param finalLength must be a number greater than or equal to 10,',\n 'or 0 if you want the raw hexadecimal timestamp',\n ].join('\\n')\n );\n }\n\n const idLength = finalLength - 9;\n\n const rndIdx = Math.round(Math.random() * ((idLength > 15) ? 15 : idLength));\n\n const id = this.randomUUID(idLength);\n\n return `${id.substring(0, rndIdx)}${hexStamp}${id.substring(rndIdx)}${rndIdx.toString(16)}`;\n };\n\n /**\n * Extracts the date embeded in a UUID generated using the `uid.stamp(finalLength);` method.\n * \n * ```js\n * const uidWithTimestamp = uid.stamp(32);\n * console.log(uidWithTimestamp);\n * // GDa608f973aRCHLXQYPTbKDbjDeVsSb3\n * \n * console.log(uid.parseStamp(uidWithTimestamp));\n * // 2021-05-03T06:24:58.000Z\n * ```\n */\n parseStamp = (suid: string, format?: string): Date => {\n if (format && !(/t0|t[1-9]\\d{1,}/).test(format)) {\n throw new Error('Cannot extract date from a formated UUID with no timestamp in the format');\n }\n\n const stamp = (\n format\n ) ? (\n format.replace(\n /\\$[rs]\\d{0,}|\\$t0|\\$t[1-9]\\d{1,}/g,\n (m) => {\n const fnMap = {\n '$r': (len: number) => [...Array(len)].map(() => 'r').join(''),\n '$s': (len: number) => [...Array(len)].map(() => 's').join(''),\n '$t': (len: number) => [...Array(len)].map(() => 't').join(''),\n };\n\n const fn = m.slice(0, 2);\n const len = parseInt(m.slice(2), 10);\n\n return fnMap[fn as keyof typeof fnMap](len);\n },\n ).replace(\n /^(.*?)(t{8,})(.*)$/g,\n (_m, p1, p2) => {\n return suid.substring(p1.length, p1.length + p2.length);\n },\n )\n ) : (\n suid\n );\n\n if (stamp.length === 8) {\n return new Date(parseInt(stamp, 16) * 1000);\n }\n\n if (stamp.length < 10) {\n throw new Error('Stamp length invalid');\n }\n\n const rndIdx = parseInt(stamp.substring(stamp.length - 1), 16);\n\n return new Date(parseInt(stamp.substring(rndIdx, rndIdx + 8), 16) * 1000);\n };\n\n /**\n * Set the counter to a specific value.\n */\n setCounter = (counter: number): void => {\n this.counter = counter;\n };\n\n /**\n * Validate given UID contains only characters from the instanced dictionary or optionally provided dictionary.\n */\n validate = (uid: string, dictionary?: string[] | ShortUniqueIdDefaultDictionaries): boolean => {\n const finalDictionary = dictionary ? this._normalizeDictionary(dictionary) : this.dict;\n\n return uid.split('').every((c) => finalDictionary.includes(c));\n };\n\n constructor(argOptions: Partial = {}) {\n const options: ShortUniqueIdOptions = {\n ...DEFAULT_OPTIONS,\n ...argOptions as Partial,\n };\n\n this.counter = 0;\n this.debug = false;\n this.dict = [];\n this.version = version;\n\n const {\n dictionary,\n shuffle,\n length,\n counter,\n } = options;\n\n this.uuidLength = length;\n\n this.setDictionary(dictionary, shuffle);\n this.setCounter(counter);\n\n this.debug = options.debug;\n this.log(this.dict);\n this.log(\n `Generator instantiated with Dictionary Size ${this.dictLength} and counter set to ${this.counter}`\n );\n\n this.log = this.log.bind(this);\n this.setDictionary = this.setDictionary.bind(this);\n this.setCounter = this.setCounter.bind(this);\n this.seq = this.seq.bind(this);\n this.sequentialUUID = this.sequentialUUID.bind(this);\n this.rnd = this.rnd.bind(this);\n this.randomUUID = this.randomUUID.bind(this);\n this.fmt = this.fmt.bind(this);\n this.formattedUUID = this.formattedUUID.bind(this);\n this.availableUUIDs = this.availableUUIDs.bind(this);\n this.approxMaxBeforeCollision = this.approxMaxBeforeCollision.bind(this);\n this.collisionProbability = this.collisionProbability.bind(this);\n this.uniqueness = this.uniqueness.bind(this);\n this.getVersion = this.getVersion.bind(this);\n this.stamp = this.stamp.bind(this);\n this.parseStamp = this.parseStamp.bind(this);\n\n return this;\n }\n}\n", "{\n \"name\": \"short-unique-id\",\n \"version\": \"5.2.0\",\n \"description\": \"Generate random or sequential UUID of any length\",\n \"keywords\": [\n \"short\",\n \"random\",\n \"uid\",\n \"uuid\",\n \"guid\",\n \"node\",\n \"unique id\",\n \"generator\",\n \"tiny\"\n ],\n \"bin\": {\n \"short-unique-id\": \"bin/short-unique-id\",\n \"suid\": \"bin/short-unique-id\"\n },\n \"main\": \"dist/short-unique-id.js\",\n \"types\": \"dist/short-unique-id.d.ts\",\n \"homepage\": \"https://shortunique.id\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jeanlescure/short-unique-id\"\n },\n \"license\": \"Apache-2.0\",\n \"runkitExampleFilename\": \"./runkit.js\",\n \"scripts\": {\n \"test\": \"tsx ./src/test.ts\",\n \"test:local\": \"tsx ./src/test.ts && tsx --tsconfig ./specs/esm/tsconfig.json ./specs/esm/import.spec.ts && ./scripts/cjs-test\",\n \"build\": \"./scripts/build\",\n \"docs\": \"./scripts/docs\",\n \"release\": \"release-it\"\n },\n \"release-it\": {\n \"git\": {\n \"changelog\": \"auto-changelog --stdout -l false -u -t ./assets/changelog-compact.hbs\"\n },\n \"hooks\": {\n \"after:bump\": \"./scripts/release\"\n },\n \"npm\": {\n \"publish\": false\n }\n },\n \"files\": [\n \"bin\",\n \"dist\",\n \"runkit.js\",\n \"package.json\"\n ],\n \"devDependencies\": {\n \"@types/node\": \"^20.12.7\",\n \"auto-changelog\": \"^2.4.0\",\n \"esbuild\": \"^0.18.10\",\n \"refup\": \"^1.1.0\",\n \"release-it\": \"^15.11.0\",\n \"tslib\": \"^2.6.2\",\n \"tsx\": \"^4.7.3\",\n \"typedoc\": \"^0.25.13\",\n \"typedoc-plugin-extras\": \"^3.0.0\",\n \"typedoc-plugin-rename-defaults\": \"^0.7.0\",\n \"typedoc-plugin-script-inject\": \"^2.0.0\",\n \"typescript\": \"^5.4.5\"\n },\n \"overrides\": {\n \"vm2\": \"npm:vm2-fixed@0.0.1\"\n }\n}\n"],
"mappings": "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",
"names": ["len"]
}
diff --git a/dist/short-unique-id.min.js b/dist/short-unique-id.min.js
index 938cf76..82e4354 100644
--- a/dist/short-unique-id.min.js
+++ b/dist/short-unique-id.min.js
@@ -1,3 +1,3 @@
-"use strict";var ShortUniqueId=(()=>{var l=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols;var f=Object.prototype.hasOwnProperty,q=Object.prototype.propertyIsEnumerable;var g=(a,t,i)=>t in a?l(a,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):a[t]=i,m=(a,t)=>{for(var i in t||(t={}))f.call(t,i)&&g(a,i,t[i]);if(b)for(var i of b(t))q.call(t,i)&&g(a,i,t[i]);return a};var x=(a,t)=>{for(var i in t)l(a,i,{get:t[i],enumerable:!0})},y=(a,t,i,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of w(t))!f.call(a,r)&&r!==i&&l(a,r,{get:()=>t[r],enumerable:!(s=D(t,r))||s.enumerable});return a};var S=a=>y(l({},"__esModule",{value:!0}),a);var e=(a,t,i)=>(g(a,typeof t!="symbol"?t+"":t,i),i);var $={};x($,{DEFAULT_OPTIONS:()=>I,DEFAULT_UUID_LENGTH:()=>d,default:()=>p});var U="5.1.1";var d=6,I={dictionary:"alphanum",shuffle:!0,debug:!1,length:d,counter:0},c=class c{constructor(t={}){e(this,"counter");e(this,"debug");e(this,"dict");e(this,"version");e(this,"dictIndex",0);e(this,"dictRange",[]);e(this,"lowerBound",0);e(this,"upperBound",0);e(this,"dictLength",0);e(this,"uuidLength");e(this,"_digit_first_ascii",48);e(this,"_digit_last_ascii",58);e(this,"_alpha_lower_first_ascii",97);e(this,"_alpha_lower_last_ascii",123);e(this,"_hex_last_ascii",103);e(this,"_alpha_upper_first_ascii",65);e(this,"_alpha_upper_last_ascii",91);e(this,"_number_dict_ranges",{digits:[this._digit_first_ascii,this._digit_last_ascii]});e(this,"_alpha_dict_ranges",{lowerCase:[this._alpha_lower_first_ascii,this._alpha_lower_last_ascii],upperCase:[this._alpha_upper_first_ascii,this._alpha_upper_last_ascii]});e(this,"_alpha_lower_dict_ranges",{lowerCase:[this._alpha_lower_first_ascii,this._alpha_lower_last_ascii]});e(this,"_alpha_upper_dict_ranges",{upperCase:[this._alpha_upper_first_ascii,this._alpha_upper_last_ascii]});e(this,"_alphanum_dict_ranges",{digits:[this._digit_first_ascii,this._digit_last_ascii],lowerCase:[this._alpha_lower_first_ascii,this._alpha_lower_last_ascii],upperCase:[this._alpha_upper_first_ascii,this._alpha_upper_last_ascii]});e(this,"_alphanum_lower_dict_ranges",{digits:[this._digit_first_ascii,this._digit_last_ascii],lowerCase:[this._alpha_lower_first_ascii,this._alpha_lower_last_ascii]});e(this,"_alphanum_upper_dict_ranges",{digits:[this._digit_first_ascii,this._digit_last_ascii],upperCase:[this._alpha_upper_first_ascii,this._alpha_upper_last_ascii]});e(this,"_hex_dict_ranges",{decDigits:[this._digit_first_ascii,this._digit_last_ascii],alphaDigits:[this._alpha_lower_first_ascii,this._hex_last_ascii]});e(this,"_dict_ranges",{_number_dict_ranges:this._number_dict_ranges,_alpha_dict_ranges:this._alpha_dict_ranges,_alpha_lower_dict_ranges:this._alpha_lower_dict_ranges,_alpha_upper_dict_ranges:this._alpha_upper_dict_ranges,_alphanum_dict_ranges:this._alphanum_dict_ranges,_alphanum_lower_dict_ranges:this._alphanum_lower_dict_ranges,_alphanum_upper_dict_ranges:this._alphanum_upper_dict_ranges,_hex_dict_ranges:this._hex_dict_ranges});e(this,"log",(...t)=>{let i=[...t];if(i[0]=`[short-unique-id] ${t[0]}`,this.debug===!0&&typeof console<"u"&&console!==null)return console.log(...i)});e(this,"_normalizeDictionary",(t,i)=>{let s;if(t&&Array.isArray(t)&&t.length>1)s=t;else{s=[];let r;this.dictIndex=r=0;let o=`_${t}_dict_ranges`,n=this._dict_ranges[o];Object.keys(n).forEach(h=>{let _=h;for(this.dictRange=n[_],this.lowerBound=this.dictRange[0],this.upperBound=this.dictRange[1],this.dictIndex=r=this.lowerBound;this.lowerBound<=this.upperBound?rthis.upperBound;this.dictIndex=this.lowerBound<=this.upperBound?r+=1:r-=1)s.push(String.fromCharCode(this.dictIndex))})}return i&&(s=s.sort(()=>Math.random()-.5)),s});e(this,"setDictionary",(t,i)=>{this.dict=this._normalizeDictionary(t,i),this.dictLength=this.dict.length,this.setCounter(0)});e(this,"seq",()=>this.sequentialUUID());e(this,"sequentialUUID",()=>{let t,i,s="";t=this.counter;do i=t%this.dictLength,t=Math.trunc(t/this.dictLength),s+=this.dict[i];while(t!==0);return this.counter+=1,s});e(this,"rnd",(t=this.uuidLength||d)=>this.randomUUID(t));e(this,"randomUUID",(t=this.uuidLength||d)=>{let i,s,r;if(t===null||typeof t>"u"||t<1)throw new Error("Invalid UUID Length Provided");let o=t>=0;for(i="",r=0;rthis.formattedUUID(t,i));e(this,"formattedUUID",(t,i)=>{let s={$r:this.randomUUID,$s:this.sequentialUUID,$t:this.stamp};return t.replace(/\$[rs]\d{0,}|\$t0|\$t[1-9]\d{1,}/g,o=>{let n=o.slice(0,2),h=parseInt(o.slice(2),10);return n==="$s"?s[n]().padStart(h,"0"):n==="$t"&&i?s[n](h,i):s[n](h)})});e(this,"availableUUIDs",(t=this.uuidLength)=>parseFloat(Math.pow([...new Set(this.dict)].length,t).toFixed(0)));e(this,"approxMaxBeforeCollision",(t=this.availableUUIDs(this.uuidLength))=>parseFloat(Math.sqrt(Math.PI/2*t).toFixed(20)));e(this,"collisionProbability",(t=this.availableUUIDs(this.uuidLength),i=this.uuidLength)=>parseFloat((this.approxMaxBeforeCollision(t)/this.availableUUIDs(i)).toFixed(20)));e(this,"uniqueness",(t=this.availableUUIDs(this.uuidLength))=>{let i=parseFloat((1-this.approxMaxBeforeCollision(t)/t).toFixed(20));return i>1?1:i<0?0:i});e(this,"getVersion",()=>this.version);e(this,"stamp",(t,i)=>{let s=Math.floor(+(i||new Date)/1e3).toString(16);if(typeof t=="number"&&t===0)return s;if(typeof t!="number"||t<10)throw new Error(["Param finalLength must be a number greater than or equal to 10,","or 0 if you want the raw hexadecimal timestamp"].join(`
+"use strict";var ShortUniqueId=(()=>{var l=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols;var f=Object.prototype.hasOwnProperty,q=Object.prototype.propertyIsEnumerable;var g=(a,t,i)=>t in a?l(a,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):a[t]=i,m=(a,t)=>{for(var i in t||(t={}))f.call(t,i)&&g(a,i,t[i]);if(b)for(var i of b(t))q.call(t,i)&&g(a,i,t[i]);return a};var x=(a,t)=>{for(var i in t)l(a,i,{get:t[i],enumerable:!0})},y=(a,t,i,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of w(t))!f.call(a,r)&&r!==i&&l(a,r,{get:()=>t[r],enumerable:!(s=D(t,r))||s.enumerable});return a};var S=a=>y(l({},"__esModule",{value:!0}),a);var e=(a,t,i)=>(g(a,typeof t!="symbol"?t+"":t,i),i);var $={};x($,{DEFAULT_OPTIONS:()=>I,DEFAULT_UUID_LENGTH:()=>d,default:()=>p});var U="5.2.0";var d=6,I={dictionary:"alphanum",shuffle:!0,debug:!1,length:d,counter:0},c=class c{constructor(t={}){e(this,"counter");e(this,"debug");e(this,"dict");e(this,"version");e(this,"dictIndex",0);e(this,"dictRange",[]);e(this,"lowerBound",0);e(this,"upperBound",0);e(this,"dictLength",0);e(this,"uuidLength");e(this,"_digit_first_ascii",48);e(this,"_digit_last_ascii",58);e(this,"_alpha_lower_first_ascii",97);e(this,"_alpha_lower_last_ascii",123);e(this,"_hex_last_ascii",103);e(this,"_alpha_upper_first_ascii",65);e(this,"_alpha_upper_last_ascii",91);e(this,"_number_dict_ranges",{digits:[this._digit_first_ascii,this._digit_last_ascii]});e(this,"_alpha_dict_ranges",{lowerCase:[this._alpha_lower_first_ascii,this._alpha_lower_last_ascii],upperCase:[this._alpha_upper_first_ascii,this._alpha_upper_last_ascii]});e(this,"_alpha_lower_dict_ranges",{lowerCase:[this._alpha_lower_first_ascii,this._alpha_lower_last_ascii]});e(this,"_alpha_upper_dict_ranges",{upperCase:[this._alpha_upper_first_ascii,this._alpha_upper_last_ascii]});e(this,"_alphanum_dict_ranges",{digits:[this._digit_first_ascii,this._digit_last_ascii],lowerCase:[this._alpha_lower_first_ascii,this._alpha_lower_last_ascii],upperCase:[this._alpha_upper_first_ascii,this._alpha_upper_last_ascii]});e(this,"_alphanum_lower_dict_ranges",{digits:[this._digit_first_ascii,this._digit_last_ascii],lowerCase:[this._alpha_lower_first_ascii,this._alpha_lower_last_ascii]});e(this,"_alphanum_upper_dict_ranges",{digits:[this._digit_first_ascii,this._digit_last_ascii],upperCase:[this._alpha_upper_first_ascii,this._alpha_upper_last_ascii]});e(this,"_hex_dict_ranges",{decDigits:[this._digit_first_ascii,this._digit_last_ascii],alphaDigits:[this._alpha_lower_first_ascii,this._hex_last_ascii]});e(this,"_dict_ranges",{_number_dict_ranges:this._number_dict_ranges,_alpha_dict_ranges:this._alpha_dict_ranges,_alpha_lower_dict_ranges:this._alpha_lower_dict_ranges,_alpha_upper_dict_ranges:this._alpha_upper_dict_ranges,_alphanum_dict_ranges:this._alphanum_dict_ranges,_alphanum_lower_dict_ranges:this._alphanum_lower_dict_ranges,_alphanum_upper_dict_ranges:this._alphanum_upper_dict_ranges,_hex_dict_ranges:this._hex_dict_ranges});e(this,"log",(...t)=>{let i=[...t];if(i[0]=`[short-unique-id] ${t[0]}`,this.debug===!0&&typeof console<"u"&&console!==null)return console.log(...i)});e(this,"_normalizeDictionary",(t,i)=>{let s;if(t&&Array.isArray(t)&&t.length>1)s=t;else{s=[];let r;this.dictIndex=r=0;let o=`_${t}_dict_ranges`,n=this._dict_ranges[o];Object.keys(n).forEach(h=>{let _=h;for(this.dictRange=n[_],this.lowerBound=this.dictRange[0],this.upperBound=this.dictRange[1],this.dictIndex=r=this.lowerBound;this.lowerBound<=this.upperBound?rthis.upperBound;this.dictIndex=this.lowerBound<=this.upperBound?r+=1:r-=1)s.push(String.fromCharCode(this.dictIndex))})}return i&&(s=s.sort(()=>Math.random()-.5)),s});e(this,"setDictionary",(t,i)=>{this.dict=this._normalizeDictionary(t,i),this.dictLength=this.dict.length,this.setCounter(0)});e(this,"seq",()=>this.sequentialUUID());e(this,"sequentialUUID",()=>{let t,i,s="";t=this.counter;do i=t%this.dictLength,t=Math.trunc(t/this.dictLength),s+=this.dict[i];while(t!==0);return this.counter+=1,s});e(this,"rnd",(t=this.uuidLength||d)=>this.randomUUID(t));e(this,"randomUUID",(t=this.uuidLength||d)=>{let i,s,r;if(t===null||typeof t>"u"||t<1)throw new Error("Invalid UUID Length Provided");let o=t>=0;for(i="",r=0;rthis.formattedUUID(t,i));e(this,"formattedUUID",(t,i)=>{let s={$r:this.randomUUID,$s:this.sequentialUUID,$t:this.stamp};return t.replace(/\$[rs]\d{0,}|\$t0|\$t[1-9]\d{1,}/g,o=>{let n=o.slice(0,2),h=parseInt(o.slice(2),10);return n==="$s"?s[n]().padStart(h,"0"):n==="$t"&&i?s[n](h,i):s[n](h)})});e(this,"availableUUIDs",(t=this.uuidLength)=>parseFloat(Math.pow([...new Set(this.dict)].length,t).toFixed(0)));e(this,"approxMaxBeforeCollision",(t=this.availableUUIDs(this.uuidLength))=>parseFloat(Math.sqrt(Math.PI/2*t).toFixed(20)));e(this,"collisionProbability",(t=this.availableUUIDs(this.uuidLength),i=this.uuidLength)=>parseFloat((this.approxMaxBeforeCollision(t)/this.availableUUIDs(i)).toFixed(20)));e(this,"uniqueness",(t=this.availableUUIDs(this.uuidLength))=>{let i=parseFloat((1-this.approxMaxBeforeCollision(t)/t).toFixed(20));return i>1?1:i<0?0:i});e(this,"getVersion",()=>this.version);e(this,"stamp",(t,i)=>{let s=Math.floor(+(i||new Date)/1e3).toString(16);if(typeof t=="number"&&t===0)return s;if(typeof t!="number"||t<10)throw new Error(["Param finalLength must be a number greater than or equal to 10,","or 0 if you want the raw hexadecimal timestamp"].join(`
`));let r=t-9,o=Math.round(Math.random()*(r>15?15:r)),n=this.randomUUID(r);return`${n.substring(0,o)}${s}${n.substring(o)}${o.toString(16)}`});e(this,"parseStamp",(t,i)=>{if(i&&!/t0|t[1-9]\d{1,}/.test(i))throw new Error("Cannot extract date from a formated UUID with no timestamp in the format");let s=i?i.replace(/\$[rs]\d{0,}|\$t0|\$t[1-9]\d{1,}/g,o=>{let n={$r:u=>[...Array(u)].map(()=>"r").join(""),$s:u=>[...Array(u)].map(()=>"s").join(""),$t:u=>[...Array(u)].map(()=>"t").join("")},h=o.slice(0,2),_=parseInt(o.slice(2),10);return n[h](_)}).replace(/^(.*?)(t{8,})(.*)$/g,(o,n,h)=>t.substring(n.length,n.length+h.length)):t;if(s.length===8)return new Date(parseInt(s,16)*1e3);if(s.length<10)throw new Error("Stamp length invalid");let r=parseInt(s.substring(s.length-1),16);return new Date(parseInt(s.substring(r,r+8),16)*1e3)});e(this,"setCounter",t=>{this.counter=t});e(this,"validate",(t,i)=>{let s=i?this._normalizeDictionary(i):this.dict;return t.split("").every(r=>s.includes(r))});let i=m(m({},I),t);this.counter=0,this.debug=!1,this.dict=[],this.version=U;let{dictionary:s,shuffle:r,length:o,counter:n}=i;return this.uuidLength=o,this.setDictionary(s,r),this.setCounter(n),this.debug=i.debug,this.log(this.dict),this.log(`Generator instantiated with Dictionary Size ${this.dictLength} and counter set to ${this.counter}`),this.log=this.log.bind(this),this.setDictionary=this.setDictionary.bind(this),this.setCounter=this.setCounter.bind(this),this.seq=this.seq.bind(this),this.sequentialUUID=this.sequentialUUID.bind(this),this.rnd=this.rnd.bind(this),this.randomUUID=this.randomUUID.bind(this),this.fmt=this.fmt.bind(this),this.formattedUUID=this.formattedUUID.bind(this),this.availableUUIDs=this.availableUUIDs.bind(this),this.approxMaxBeforeCollision=this.approxMaxBeforeCollision.bind(this),this.collisionProbability=this.collisionProbability.bind(this),this.uniqueness=this.uniqueness.bind(this),this.getVersion=this.getVersion.bind(this),this.stamp=this.stamp.bind(this),this.parseStamp=this.parseStamp.bind(this),this}};e(c,"default",c);var p=c;return S($);})();
'undefined'!=typeof module&&(module.exports=ShortUniqueId.default),'undefined'!=typeof window&&(ShortUniqueId=ShortUniqueId.default);
\ No newline at end of file
diff --git a/docs/classes/ShortUniqueId.html b/docs/classes/ShortUniqueId.html
index a404a2a..7c5b051 100644
--- a/docs/classes/ShortUniqueId.html
+++ b/docs/classes/ShortUniqueId.html
@@ -1,4 +1,4 @@
-ShortUniqueId | short-unique-id - v5.1.1
(Useful if you are wondering "If I use this lib and expect to perform at most
r rounds of UUID generations, what is the probability that I will hit a duplicate UUID?".)
-
Parameters
rounds: number = ...
uuidLength: number = ...
Returns number
fmt
fmt(format, date?): string
Parameters
format: string
Optionaldate: Date
Returns string
formattedUUID
formattedUUID(format, date?): string
Generates custom UUID with the provided format string.
+
Parameters
rounds: number = ...
uuidLength: number = ...
Returns number
fmt
fmt(format, date?): string
Parameters
format: string
Optionaldate: Date
Returns string
formattedUUID
formattedUUID(format, date?): string
Generates custom UUID with the provided format string.
Parameters
format: string
Optionaldate: Date
Returns string
Alias
const uid = new ShortUniqueId(); uid.fmt(format: string);
-
getVersion
getVersion(): string
Return the version of this module.
-
Returns string
parseStamp
parseStamp(suid, format?): Date
Extracts the date embeded in a UUID generated using the uid.stamp(finalLength); method.
+
getVersion
getVersion(): string
Return the version of this module.
+
Returns string
parseStamp
parseStamp(suid, format?): Date
Extracts the date embeded in a UUID generated using the uid.stamp(finalLength); method.
Calculate a "uniqueness" score (from 0 to 1) of UUIDs based on size of
+
Parameters
finalLength: number
Optionaldate: Date
Returns string
uniqueness
uniqueness(rounds?): number
Calculate a "uniqueness" score (from 0 to 1) of UUIDs based on size of
dictionary and chosen UUID length.
Given that:
@@ -115,8 +115,8 @@
(Useful if you need a value to rate the "quality" of the combination of given dictionary
and UUID length. The closer to 1, higher the uniqueness and thus better the quality.)
-
Parameters
rounds: number = ...
Returns number
validate
validate(uid, dictionary?): boolean
Validate given UID contains only characters from the instanced dictionary or optionally provided dictionary.
\ No newline at end of file
diff --git a/docs/index.html b/docs/index.html
index 064af9a..f352d7f 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -1,4 +1,4 @@
-short-unique-id - v5.1.1
# Usage: # node short-unique-id [OPTION] # # Options: # -l, --length=ARG character length of the uid to generate. # -s, --stamp include timestamp in uid (must be used with --length (-l) of 10 or more). # -t, --timestamp=ARG custom timestamp to parse (must be used along with -s, --stamp, -f, or --format). # -f, --format=ARG string representing custom format to generate id with. # -p, --parse=ARG extract timestamp from stamped uid (ARG). # -d, --dictionaryJson=ARG json file with dictionary array. # -h, --help display this help
\ No newline at end of file
diff --git a/docs/modules.html b/docs/modules.html
index 265f2ce..dcf2a9a 100644
--- a/docs/modules.html
+++ b/docs/modules.html
@@ -1,11 +1,11 @@
-short-unique-id - v5.1.1
6 was chosen as the default UUID length since for most cases
it will be more than aptly suitable to provide millions of UUIDs
with a very low probability of producing a duplicate UUID.
For example, with a dictionary including digits from 0 to 9,
as well as the alphabet from a to z both in UPPER and lower case,
the probability of generating a duplicate in 1,000,000 rounds
is ~0.00000002, or about 1 in 50,000,000.
Generate random or sequential UUID of any length.
+- Preparing search index...
- The search index is not available
ShortUniqueId - v5.2.0Class ShortUniqueId
Generate random or sequential UUID of any length.
Use as module
Use in browser
Index
Constructors
Index
Constructors
Properties
Constructors
constructor
Parameters
Returns ShortUniqueId
Properties
counter
debug
dict
dict Index
dict Length
dict Range
lower Bound
upper Bound
uuid Length
version
Methods
approx Max Before Collision
Calculates approximate number of hashes before first collision.
+Constructors
constructor
Parameters
Returns ShortUniqueId
Properties
counter
debug
dict
dict Index
dict Length
dict Range
lower Bound
upper Bound
uuid Length
version
Methods
approx Max Before Collision
Calculates approximate number of hashes before first collision.
Given that:
H
is the total number of possible UUIDs, or in terms of this library, @@ -50,7 +50,7 @@This function returns
Q(H)
.(see Poisson distribution)
-Parameters
Returns number
availableUUIDs
Calculates total number of possible UUIDs.
+Parameters
Returns number
availableUUIDs
Calculates total number of possible UUIDs.
Given that:
H
is the total number of possible UUIDsThis function returns
-H
.Parameters
Returns number
collision Probability
Calculates probability of generating duplicate UUIDs (a collision) in a +
Parameters
Returns number
collision Probability
Calculates probability of generating duplicate UUIDs (a collision) in a given number of UUID generation rounds.
Given that:
@@ -82,22 +82,22 @@
(see Poisson distribution)
(Useful if you are wondering "If I use this lib and expect to perform at most
-r
rounds of UUID generations, what is the probability that I will hit a duplicate UUID?".)Parameters
Returns number
fmt
Parameters
Optional
date: DateReturns string
formattedUUID
Generates custom UUID with the provided format string.
+Parameters
Returns number
fmt
Parameters
Optional
date: DateReturns string
formattedUUID
Generates custom UUID with the provided format string.
Parameters
Optional
date: DateReturns string
Alias
-const uid = new ShortUniqueId(); uid.fmt(format: string);
get Version
Return the version of this module.
-Returns string
parse Stamp
Extracts the date embeded in a UUID generated using the
+uid.stamp(finalLength);
method.get Version
Return the version of this module.
+Returns string
parse Stamp
Extracts the date embeded in a UUID generated using the
-uid.stamp(finalLength);
method.Parameters
Optional
format: stringReturns Date
randomUUID
Generates UUID by creating each part randomly.
+Parameters
Optional
format: stringReturns Date
randomUUID
Generates UUID by creating each part randomly.
Parameters
Returns string
Alias
-const uid = new ShortUniqueId(); uid.rnd(uuidLength: number);
rnd
Parameters
Returns string
seq
Returns string
sequentialUUID
Generates UUID based on internal counter that's incremented after each ID generation.
+rnd
Parameters
Returns string
seq
Returns string
sequentialUUID
Generates UUID based on internal counter that's incremented after each ID generation.
Returns string
Alias
-const uid = new ShortUniqueId(); uid.seq();
set Counter
Set the counter to a specific value.
-Parameters
Returns void
set Dictionary
Change the dictionary after initialization.
-Parameters
Optional
shuffle: booleanReturns void
stamp
Generates a UUID with a timestamp that can be extracted using
+uid.parseStamp(stampString);
.set Counter
Set the counter to a specific value.
+Parameters
Returns void
set Dictionary
Change the dictionary after initialization.
+Parameters
Optional
shuffle: booleanReturns void
stamp
Generates a UUID with a timestamp that can be extracted using
-uid.parseStamp(stampString);
.Parameters
Optional
date: DateReturns string
uniqueness
Calculate a "uniqueness" score (from 0 to 1) of UUIDs based on size of +
Parameters
Optional
date: DateReturns string
uniqueness
Calculate a "uniqueness" score (from 0 to 1) of UUIDs based on size of dictionary and chosen UUID length.
Given that:
@@ -115,8 +115,8 @@
(Useful if you need a value to rate the "quality" of the combination of given dictionary and UUID length. The closer to 1, higher the uniqueness and thus better the quality.)
-Parameters
Returns number
validate
Validate given UID contains only characters from the instanced dictionary or optionally provided dictionary.
-Parameters
Optional
dictionary: string[] | ShortUniqueIdDefaultDictionariesReturns boolean
Settings
Member Visibility
Theme
On This Page
- Use as module
- Use in browser
- Options
constructorcounterdebugdictdict- Preparing search index...
- The search index is not available
ShortUniqueId - v5.1.1short-unique-id - v5.1.1
Short Unique ID (UUID) Generating Library
- Preparing search index...
- The search index is not available
ShortUniqueId - v5.2.0short-unique-id - v5.2.0
Short Unique ID (UUID) Generating Library
![JsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/short-unique-id/badge?style=rounded)
@@ -139,7 +139,7 @@Random Color generator
Ability to validate UUIDs against the instance dictionary or a provided dictionary
Example of using .validate() method:
-Settings
Member Visibility
Theme
On This Page
- Preparing search index...
- The search index is not available
ShortUniqueId - v5.1.1Interface ShortUniqueIdOptions