short-unique-id
Advanced tools
Comparing version 2.0.7 to 3.0.0-alpha
@@ -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" | ||
} | ||
} |
155
README.md
# 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. |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
No tests
QualityPackage does not have any tests. This is a strong signal of a poorly maintained or low quality package.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Install scripts
Supply chain riskInstall scripts are run when the package is installed. The majority of malware in npm is hidden in install scripts.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
No website
QualityPackage does not have a website.
Found 1 instance in 1 package
420339
8
46
4113
135
0
4
6
2