Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

short-unique-id

Package Overview
Dependencies
Maintainers
1
Versions
43
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

short-unique-id - npm Package Compare versions

Comparing version 2.0.7 to 3.0.0-alpha

.all-contributorsrc

3

dist/short-unique-id.min.js

@@ -1,2 +0,1 @@

!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("short-unique-id",[],e):"object"==typeof exports?exports["short-unique-id"]=e():t["short-unique-id"]=e()}(this,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}([function(t,e,n){t.exports=n(1)},function(t,e,n){"use strict";function r(t){return function(t){if(Array.isArray(t))return i(t)}(t)||function(t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t))return Array.from(t)}(t)||function(t,e){if(!t)return;if("string"==typeof t)return i(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return i(t,e)}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function i(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n<e;n++)r[n]=t[n];return r}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}function s(t,e,n){return e&&u(t.prototype,e),n&&u(t,n),t}n.r(e);var a=n(2).version,d={digits:[48,58],lowerCase:[97,123],upperCase:[65,91]},c=function(){function t(){var e=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};o(this,t),this.counter=0,this.debug=!1,this.dict=[],this.version=a;var r,i=n.dictionary,u=n.skipShuffle;i?this.dict=i:(this.dictIndex=r=0,Object.keys(d).forEach((function(t){for(e.dictRange=d[t],e.lowerBound=e.dictRange[0],e.upperBound=e.dictRange[1],e.dictIndex=r=e.lowerBound;e.lowerBound<=e.upperBound?r<e.upperBound:r>e.upperBound;e.dictIndex=e.lowerBound<=e.upperBound?r+=1:r-=1)e.dict.push(String.fromCharCode(e.dictIndex))})));u||(this.dict=this.dict.sort((function(){return Math.random()-.5}))),this.dictLength=this.dict.length,this.counter=0,this.debug=n.debug,this.log(this.dict),this.log("Generator instantiated with Dictionary Size ".concat(this.dictLength))}return s(t,[{key:"log",value:function(){for(var t=arguments.length,e=new Array(t),n=0;n<t;n++)e[n]=arguments[n];var i,o=[].concat(e);if((o[0]="[short-unique-id] ".concat(e[0]),!0===this.debug)&&("undefined"!=typeof console&&null!==console))return(i=console).log.apply(i,r(o))}}]),s(t,[{key:"getDict",value:function(){return this.dict}},{key:"sequentialUUID",value:function(){var t,e,n;for(n="",t=this.counter;e=t%this.dictLength,t=parseInt(t/this.dictLength,10),n+=this.dict[e],0!==t;);return this.counter+=1,n}},{key:"randomUUID",value:function(){var t,e,n,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:6;if(null==r||r<1)throw new Error("Invalid UUID Length Provided");for(t="",n=0;0<=r?n<r:n>r;0<=r?n+=1:n-=1)e=parseInt(Math.random()*this.dictLength)%this.dictLength,t+=this.dict[e];return t}},{key:"getVersion",value:function(){return this.version}}]),t}();e.default=c},function(t){t.exports=JSON.parse('{"name":"short-unique-id","version":"2.0.7","description":"Generate random or sequential UUID of any length","keywords":["short","random","uid","uuid","guid","unique id","tiny"],"main":"dist/short-unique-id.min.js","license":"MIT","module":"src/index.js","repository":{"type":"git","url":"https://github.com/jeanlescure/short-unique-id"},"runkitExampleFilename":"./test/runkit.js","scripts":{"build":"webpack --mode production","test":"jest && yarn link && yarn link short-unique-id && node ./test/runkit.js","lint":"eslint --format codeframe --ext mjs,js src test","dist:update":"rm -rf ./dist && cp -r ./build ./dist","dist:commit":"git add ./dist && git commit -m \\"dist updated\\"","predeploy":"yarn version && yarn build && yarn dist:update && yarn test && yarn dist:commit","deploy":"yarn publish","preinstall":"npx use-yarn"},"devDependencies":{"@neutrinojs/airbnb-base":"^9.1.0","@neutrinojs/jest":"^9.1.0","@neutrinojs/library":"^9.1.0","babel-jest":"^25.1.0","eslint":"^6","jest":"^25","neutrino":"^9.1.0","webpack":"^4","webpack-chain":"^6.4.0","webpack-cli":"^3"},"resolutions":{"minimist":"^1.2.5"}}')}])}));
//# sourceMappingURL=short-unique-id.min.js.map
var __suid_module=function t(e,i,n){function s(o,u){if(!i[o]){if(!e[o]){var h="function"==typeof require&&require;if(!u&&h)return h(o,!0);if(r)return r(o,!0);var d=new Error("Cannot find module '"+o+"'");throw d.code="MODULE_NOT_FOUND",d}var a=i[o]={exports:{}};e[o][0].call(a.exports,(function(t){return s(e[o][1][t]||t)}),a,a.exports,t,e,i,n)}return i[o].exports}for(var r="function"==typeof require&&require,o=0;o<n.length;o++)s(n[o]);return s}({1:[function(t,e,i){"use strict";let n,s,r;Object.defineProperty(i,"__esModule",{value:!0}),(()=>{const e=new Map;function i(i,n){return{id:i,import:n=>async function(i,n){let s=i.replace(/\.\w+$/i,"");if(s.includes("./")){const[t,...e]=s.split("/").reverse(),[,...i]=n.split("/").reverse(),r=[t];let o,u=0;for(;o=e.shift();)if(".."===o)u++;else{if("."===o)break;r.push(o)}u<i.length&&r.push(...i.slice(u)),s=r.reverse().join("/")}return e.has(s)?h(s):Promise.resolve().then(()=>t(i))}(n,i),meta:{url:i,main:n}}}function o(t){return(e,i)=>{i="string"==typeof e?{[e]:i}:e;for(const[e,n]of Object.entries(i))Object.defineProperty(t,e,{value:n,writable:!0,enumerable:!0})}}function u(t){for(const[n,s]of e.entries()){const{f:e,exp:r}=s,{execute:u,setters:h}=e(o(r),i(n,n===t));delete s.f,s.e=u,s.s=h}}async function h(t){if(!e.has(t))return;const i=e.get(t);if(i.s){const{d:t,e:e,s:n}=i;delete i.s,delete i.e;for(let e=0;e<n.length;e++)n[e](await h(t[e]));const s=e();s&&await s}return i.exp}n={register(t,i,n){e.set(t,{d:i,f:n,exp:{}})}},s=async t=>(n=s=r=void 0,u(t),h(t)),r=t=>(n=s=r=void 0,u(t),function t(i){if(!e.has(i))return;const n=e.get(i);if(n.s){const{d:e,e:i,s:s}=n;delete n.s,delete n.e;for(let i=0;i<s.length;i++)s[i](t(e[i]));i()}return n.exp}(t))})(),n.register("version",[],(function(t,e){e&&e.id;return{setters:[],execute:function(){t("default",{version:"3.0.0-alpha"}),t("version","3.0.0-alpha")}}})),n.register("mod",["version"],(function(t,e){var i,n,s;e&&e.id;return{setters:[function(t){i=t}],execute:function(){6,48,58,97,123,65,91,n={digits:[48,58],lowerCase:[97,123],upperCase:[65,91]},s={dictionary:[],shuffle:!0,debug:!1,length:6},t("default",class extends Function{constructor(t={}){super("...args","return this.randomUUID(...args)"),this.dictIndex=0,this.dictRange=[],this.lowerBound=0,this.upperBound=0,this.dictLength=0;const e={...s,...t};this.counter=0,this.debug=!1,this.dict=[],this.version=i.version;const{dictionary:r,shuffle:o,length:u}=e;if(this.uuidLength=u,r&&r.length>1)this.setDictionary(r);else{let t;this.dictIndex=t=0,Object.keys(n).forEach(e=>{const i=e;for(this.dictRange=n[i],this.lowerBound=this.dictRange[0],this.upperBound=this.dictRange[1],this.dictIndex=t=this.lowerBound;this.lowerBound<=this.upperBound?t<this.upperBound:t>this.upperBound;this.dictIndex=this.lowerBound<=this.upperBound?t+=1:t-=1)this.dict.push(String.fromCharCode(this.dictIndex))})}if(o){const t=.5;this.setDictionary(this.dict.sort(()=>Math.random()-t))}else this.setDictionary(this.dict);this.debug=e.debug,this.log(this.dict),this.log("Generator instantiated with Dictionary Size "+this.dictLength);const h=this.bind(this);return Object.getOwnPropertyNames(this).forEach(t=>{if(!/arguments|caller|callee|length|name|prototype/.test(t)){const e=t;h[t]=this[e]}}),h}log(...t){const e=[...t];if(e[0]="[short-unique-id] "+t[0],!0===this.debug&&"undefined"!=typeof console&&null!==console)return console.log(...e)}setDictionary(t){this.dict=t,this.dictLength=this.dict.length,this.counter=0}seq(){return this.sequentialUUID()}sequentialUUID(){let t,e,i="";for(t=this.counter;e=t%this.dictLength,t=Math.trunc(t/this.dictLength),i+=this.dict[e],0!==t;);return this.counter+=1,i}randomUUID(t=this.uuidLength||6){let e,i,n,s;if(null==t||t<1)throw new Error("Invalid UUID Length Provided");for(e="",s=n=0;0<=t?n<t:n>t;s=0<=t?n+=1:n-=1)i=parseInt((Math.random()*this.dictLength).toFixed(0),10)%this.dictLength,e+=this.dict[i];return e}availableUUIDs(t=this.uuidLength){return parseFloat(Math.pow([...new Set(this.dict)].length,t).toFixed(0))}approxMaxBeforeCollision(t=this.availableUUIDs(this.uuidLength)){return parseFloat(Math.sqrt(Math.PI/2*t).toFixed(20))}collisionProbability(t=this.availableUUIDs(this.uuidLength),e=this.uuidLength){return parseFloat((this.approxMaxBeforeCollision(t)/this.availableUUIDs(e)).toFixed(20))}uniqueness(t=this.availableUUIDs(this.uuidLength)){const e=parseFloat((1-this.approxMaxBeforeCollision(t)/t).toFixed(20));return e>1?1:e<0?0:e}getVersion(){return this.version}})}}}));const o=r("mod");i.default=o.default},{}]},{},[1]),ShortUniqueId=__suid_module(1).default;
{
"name": "short-unique-id",
"version": "2.0.7",
"version": "3.0.0-alpha",
"description": "Generate random or sequential UUID of any length",

@@ -14,5 +14,6 @@ "keywords": [

],
"main": "dist/short-unique-id.min.js",
"license": "MIT",
"module": "src/index.js",
"main": "lib/short-unique-id.js",
"license": "Apache-2.0",
"module": "lib/short-unique-id.js",
"homepage": "https://jeanlescure.github.io/short-unique-id/",
"repository": {

@@ -24,26 +25,19 @@ "type": "git",

"scripts": {
"build": "webpack --mode production",
"test": "jest && yarn link && yarn link short-unique-id && node ./test/runkit.js",
"lint": "eslint --format codeframe --ext mjs,js src test",
"dist:update": "rm -rf ./dist && cp -r ./build ./dist",
"dist:commit": "git add ./dist && git commit -m \"dist updated\"",
"predeploy": "yarn version && yarn build && yarn dist:update && yarn test && yarn dist:commit",
"deploy": "yarn publish",
"preinstall": "npx use-yarn"
"gen:version": "echo \"{\\\"version\\\": `jq .version package.json`}\" > short_uuid/version.json",
"gen:docs": "cd short_uuid && typedoc --readme ../README.md --theme ../node_modules/short_uuid_typedoc_template/bin/default --out ../docs . && cd .. && cp -r ./assets ./docs",
"lib:build": "yarn gen:version && rm ./lib/* ; mkdir -p tmp && cd short_uuid && deno bundle mod.ts ../tmp/mod.js && cd .. && sucrase ./tmp -d ./lib -t imports && mv ./lib/mod.js ./lib/short-unique-id.js && cp short_uuid/version.json ./lib && rm -rf ./tmp",
"dist:build": "yarn lib:build && rm ./dist/* ; echo 'var __suid_module = ' > ./dist/short-unique-id.js && browserify ./lib/short-unique-id.js >> ./dist/short-unique-id.js && echo 'var ShortUniqueId = __suid_module(1)[\"default\"];' >> ./dist/short-unique-id.js && minify ./dist/short-unique-id.js > ./dist/short-unique-id.min.js",
"test": "yarn gen:version && cd short_uuid && deno test && cd .. && yarn link && yarn link short-unique-id && node ./runkit.js",
"lint": "tslint ./short_uuid/*.ts"
},
"devDependencies": {
"@neutrinojs/airbnb-base": "^9.1.0",
"@neutrinojs/jest": "^9.1.0",
"@neutrinojs/library": "^9.1.0",
"babel-jest": "^25.1.0",
"eslint": "^6",
"jest": "^25",
"neutrino": "^9.1.0",
"webpack": "^4",
"webpack-chain": "^6.4.0",
"webpack-cli": "^3"
},
"resolutions": {
"minimist": "^1.2.5"
"browserify": "^16.5.1",
"minify": "^5.1.1",
"short_uuid_typedoc_template": "^1.0.3",
"sucrase": "^3.13.0",
"tslint": "^6.1.1",
"tslint-config-airbnb-base": "^0.3.0",
"typedoc": "^0.17.6",
"typescript": "^3.8.3"
}
}
# Short Unique ID (UUID) Generating Library
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
[![3 Contributors](https://img.shields.io/badge/all_contributors-3-purple.svg?style=flat-square)](#contributors)
<!-- ALL-CONTRIBUTORS-BADGE:END -->

@@ -6,93 +9,76 @@ [![Try short-unique-id on RunKit](https://badge.runkitcdn.com/short-unique-id.svg)](https://npm.runkit.com/short-unique-id)

(Try out the <a target="_blank" href="https://jeanlescure.github.io/short-unique-id/">online generator</a>)
## Documentation and Online Short UUID Generator
## With ES6 imports, Node.js, and browser support
You can find the docs and online generator at:
This started as a straight up manual transpilation to ES6 of the [short-uid](https://github.com/serendipious/nodejs-short-uid) npm package by [Ankit Kuwadekar](https://github.com/serendipious/).
<a target="_blank" href="https://shortunique.id">https://shortunique.id</a>
![image depicting over 5000 weekly npm downloads](https://raw.githubusercontent.com/jeanlescure/short-unique-id/master/assets/weekly-downloads.png)
## What is the probability of generating the same id again?
Since my package is now reporting between 4k and 5k+ npm weekly downloads, I've gone ahead and refactored the package using [Neutrino JS](https://neutrinojs.org/).
This largely depends on the given dictionary and the selected UUID length.
## V2.x
Out of the box this library provides a shuffled dictionary of digits from
0 to 9, as well as the alphabet from a to z both in UPPER and lower case,
with a default UUID length of 6. That gives you a total of 56,800,235,584
possible UUIDs.
Version 2.0 was mainly a refactor of the original branch, so functionality and naming conventions have been kept the same.
So, given the previous values, the probability of generating a duplicate
in 1,000,000 rounds is ~0.00000002, or about 1 in 50,000,000.
Even so, there are still **breaking changes**, mainly the removal of the `lib` build output, as well as changes on how to instantiate the library on the browser.
If you change the dictionary and/or the UUID length then we have provided
the function `collisionProbability()` function to calculate the probability
of hitting a duplicate in a given number of rounds (a collision) and the
function `uniqueness()` which provides a score (from 0 to 1) 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).
## Instantiation (Server-side)
Install:
To find out more about the math behind these functions please refer to the
<a target="_blank" href="https://shortunique.id/classes/shortuniqueid.html#collisionprobability">API Reference</a>.
```
yarn add short-unique-id
```
ES6:
## V3.x
```javascript
// Import
import ShortUniqueId from 'short-unique-id';
Version 3.0 is a re-write of this library aiming to use [Deno](https://deno.land/) as the driving
force of the development and distribution of Short Unique ID.
// Instantiate
const uid = new ShortUniqueId();
```
We did this by separating the Deno compatible typescript logic into a [git submodule](https://github.com/jeanlescure/short_uuid)
which gets bundled for the rest of the platforms by the scripts within the
`package.json` in this repo.
Node.js:
Another reason for the re-write was to define a new license for the source
code within this repo, the [Apache 2.0 license](http://www.apache.org/licenses/LICENSE-2.0.html).
```javascript
// Import
const ShortUniqueId = require('short-unique-id').default;
## "Deno" who? what?
// Instantiate
const uid = new ShortUniqueId();
```
Ryan Dahl, creator of Node.js, has spent the last couple of years working
on Deno, a new runtime for JavaScript that is supposed to fix all the inherent
problems of Node.
## Instantiation (Client-side)
We have tried it out and are convinced that Deno is stable enough and
delivers on all expectations we could have.
Browser:
For more info check out this [detailed look at Deno from LogRocket's blog](https://blog.logrocket.com/what-is-deno/).
```html
<!-- Import -->
<script src="https://unpkg.com/short-unique-id@latest/dist/short-unique-id.min.js"></script>
## Acknowledgement and platform support
<!-- Instantiate -->
<script>
var ShortUniqueId = window['short-unique-id'].default;
var uid = new ShortUniqueId({debug: true});
</script>
```
This repo and npm package started as a straight up manual transpilation to ES6 of the [short-uid](https://github.com/serendipious/nodejs-short-uid) npm package by [Ankit Kuwadekar](https://github.com/serendipious/).
## Options
![image depicting over 5000 weekly npm downloads](https://raw.githubusercontent.com/jeanlescure/short-unique-id/master/assets/weekly-downloads.png)
There are three options available on instantiation:
Since this package is now reporting between 4k and 5k+ npm weekly downloads, we've gone ahead and re-written the whole of it in TypeScript and made sure to package lib and dist modules compatible with Deno, Node.js and all major Browsers.
```javascript
const options = {
dictionary: ['Z', 'a', 'p', 'h', 'o', 'd' ...], // User-defined dictionary
skipShuffle: false, // If true, sequentialUUID will iterate over the dictionary in the given order
debug: false, // If true the instance will console.log useful info
};
```
## Development
## Usage
Clone this repo (including submodules):
Once instantiated you can use one of two functions:
```sh
# SSH
git clone --recurse-submodules git@github.com:jeanlescure/short-unique-id.git
# HTTPS
git clone --recurse-submodules https://github.com/jeanlescure/short-unique-id.git
```
// Generate Random Unique ID of a specific length
uid.randomUUID(6); // zUvMF8
uid.randomUUID(8); // 4308OPWZ
uid.randomUUID(13); // o0Sf6rfoPOrz5
// Generate Sequential Unique ID based on internal dictionary and counter
uid.sequentialUUID(); // v
uid.sequentialUUID(); // 0
uid.sequentialUUID(); // Y
```
Tests run using [Deno](https://deno.land/std/testing/):
## Development
Tests run using [Jest](https://jestjs.io/):
```

@@ -102,3 +88,3 @@ yarn test

Using [airbnb](https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb-base) rules for [eslint](https://github.com/eslint/eslint):
Using [airbnb](https://github.com/airbnb/javascript/tree/master/packages/eslint-config-airbnb-base) rules for [tslint](https://palantir.github.io/tslint/):

@@ -111,9 +97,42 @@ ```

In order to publish the latest changes you must build the distribution files:
In order to publish the latest changes you must build the library and distribution files:
```
yarn build
yarn dist:update
yarn lib:build
yarn dist:build
```
This will generate the `short-unique-id.min.js` file under the `./dist` directory.
**IMPORTANT**: The `dist:build` script depends on the files generated by `lib:build`.
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tr>
<td align="center"><a href="https://github.com/serendipious"><img src="assets/contributors/serendipious.svg" /></a><table><tbody><tr><td width="150" align="center"><a href="https://github.com/jeanlescure/short-unique-id/commits?author=serendipious" title="Code">💻</a></td></tr></tbody></table></td>
<td align="center"><a href="https://jeanlescure.cr"><img src="assets/contributors/jeanlescure.svg" /></a><table><tbody><tr><td width="150" align="center"><a href="#maintenance-jeanlescure" title="Maintenance">🚧</a> <a href="https://github.com/jeanlescure/short-unique-id/commits?author=jeanlescure" title="Code">💻</a> <a href="#content-jeanlescure" title="Content">🖋</a> <a href="https://github.com/jeanlescure/short-unique-id/commits?author=jeanlescure" title="Documentation">📖</a> <a href="https://github.com/jeanlescure/short-unique-id/commits?author=jeanlescure" title="Tests">⚠️</a></td></tr></tbody></table></td>
<td align="center"><a href="https://dianalu.design"><img src="assets/contributors/dilescure.svg" /></a><table><tbody><tr><td width="150" align="center"><a href="https://github.com/jeanlescure/short_uuid/commits?author=DiLescure" title="Code">💻</a></td></tr></tbody></table></td>
<td align="center"><a href="https://github.com/EmerLM"><img src="assets/contributors/emerlm.svg" /></a><table><tbody><tr><td width="150" align="center"><a href="https://github.com/jeanlescure/short_uuid/commits?author=EmerLM" title="Code">💻</a></td></tr></tbody></table></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/angelnath26"><img src="assets/contributors/angelnath26.svg" /></a><table><tbody><tr><td width="150" align="center"><a href="https://github.com/jeanlescure/short_uuid/commits?author=angelnath26" title="Code">💻</a> <a href="https://github.com/jeanlescure/short_uuid/pulls?q=is%3Apr+reviewed-by%3Aangelnath26" title="Reviewed Pull Requests">👀</a></td></tr></tbody></table></td>
<td align="center"><a href="https://twitter.com/jeffturcotte"><img src="assets/contributors/jeffturcotte.svg" /></a><table><tbody><tr><td width="150" align="center"><a href="https://github.com/jeanlescure/short-unique-id/commits?author=jeffturcotte" title="Code">💻</a></td></tr></tbody></table></td>
<td align="center"><a href="https://github.com/neversun"><img src="assets/contributors/neversun.svg" /></a><table><tbody><tr><td width="150" align="center"><a href="https://github.com/jeanlescure/short-unique-id/commits?author=neversun" title="Code">💻</a></td></tr></tbody></table></td>
<td align="center"><a href="https://github.com/ekelvin"><img src="assets/contributors/ekelvin.svg" /></a><table><tbody><tr><td width="150" align="center"><a href="https://github.com/jeanlescure/short-unique-id/issues/19" title="Ideas, Planning, & Feedback">🤔</a></td></tr></tbody></table></td>
</tr>
</table>
<!-- markdownlint-enable -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
## License
Copyright (c) 2018-2020 [Short Unique ID Contributors](https://github.com/jeanlescure/short-unique-id/graphs/contributors).<br/>
Licensed under the Apache License 2.0.
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc