New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

format-validator

Package Overview
Dependencies
Maintainers
1
Versions
5
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

format-validator - npm Package Compare versions

Comparing version 0.8.1 to 0.8.2

610

distrib/format-validator.min.js

@@ -1,1 +0,609 @@

(function(global,factory){if(typeof define==="function"&&define.amd){define(["exports"],factory);}else if(typeof exports!=="undefined"){factory(exports);}else{var mod={exports:{}};factory(mod.exports);global.validators=mod.exports;}})(this,function(exports){"use strict";function areDigits(input){return /^\d+$/.test(input);}exports["areDigits"]=areDigits;function isCreditCard(str){return(str.length===15||str.length===16)&&isLuhn(str);}exports["isCreditCard"]=isCreditCard;function isEAN13(input){var sum=0;var tmp;var multiply=false;if(input.length!==13){return false;}for(var i=input.length-1;i>=0;i--){tmp=parseInt(input.charAt(i),10);if(multiply&&tmp!==0){tmp*=3;}multiply=!multiply;sum+=tmp;}return sum%10===0;}exports["isEAN13"]=isEAN13;function isEmail(input){return!/\s/.test(input)&&!/\.@/.test(input)&&!/\.\./.test(input)&&/^(([^<>()[]\.,;:s@]+(.[^<>()[]\.,;:s@]+)*)|(.+))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9]+.)+[a-zA-Z]{2,}))$/.test(input);}exports["isEmail"]=isEmail;function isIMEI(input){return input.length===15&&areDigits(input)&&isLuhn(input);}exports["isIMEI"]=isIMEI;function isLuhn(input){var modulo=arguments.length>1&&arguments[1]!==undefined?arguments[1]:10;var sum=0;var tmp;var multiply=false;for(var i=input.length-1;i>=0;i--){tmp=parseInt(input.charAt(i),10);if(multiply&&tmp!==0){tmp*=2;if(tmp>9){tmp-=9;}}multiply=!multiply;sum+=tmp;}return sum%modulo===0;}exports["isLuhn"]=isLuhn;function isMobilePhoneFr(input){return /^(0)[67]\d{8}$/.test(input);}exports["isMobilePhoneFr"]=isMobilePhoneFr;function handleSpecialCodes(nirpp){if(nirpp.indexOf('A')!==-1){return{withoutLetters:nirpp.replace("A","0"),offset:1000000};}if(nirpp.indexOf('B')!==-1){return{withoutLetters:nirpp.replace("B","0"),offset:2000000};}return{withoutLetters:nirpp,offset:0};}function parse(nirpp){var _handleSpecialCodes=handleSpecialCodes(nirpp);var withoutLetters=_handleSpecialCodes.withoutLetters;var offset=_handleSpecialCodes.offset;return parseInt(withoutLetters,10)-offset;}function generateControlKey(nirpp){return 97-parse(nirpp)%97;}function decompose(input){return{sexe:parseInt(input.slice(0,1),10),an:parseInt(input.slice(1,3),10),mois:parseInt(input.slice(3,5),10),dept:input.slice(5,7),ville:parseInt(input.slice(7,10),10),ordre:parseInt(input.slice(10,13),10),key:parseInt(input.slice(-2),10)};}function isNIR(input){if(input.length!=15){return false;}try{var dec=decompose(input);if(!(dec.sexe===1||dec.sexe===2||dec.sexe===8)){return false;}var computedKey=generateControlKey(input.slice(0,13));return computedKey===dec.key;}catch(e){return false;}}exports["isNIR"]=isNIR;function isSIREN(input){return input.length===9&&areDigits(input)&&isLuhn(input,10);}exports["isSIREN"]=isSIREN;function isSIRET(input){var precheck=input.length===14&&areDigits(input);var siren=input.slice(0,9);return precheck&&(isLuhn(siren,10)||siren==="356000000"&&isLuhn(input,5));}exports["isSIRET"]=isSIRET;});
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define(["exports"], factory);
} else if (typeof exports !== "undefined") {
factory(exports);
} else {
var mod = {
exports: {}
};
factory(mod.exports);
global.validators = mod.exports;
}
})(this, function (exports) {
"use strict";
function areDigits(input) {
return (/^\d+$/.test(input)
);
}
exports.areDigits = areDigits;
function areIn(input, acceptings) {
if (!acceptings) {
return false;
}
for (var i = 0, l = input.length - 1; i <= l; i++) {
var found = false;
for (var j = 0; j < acceptings.length; j++) {
if (input[i] === acceptings[j]) {
found = true;
break;
}
}
if (!found) {
return false;
}
}
return true;
}
exports.areIn = areIn;
function areLettersOnly(input) {
return (/^[a-z]+$/i.test(input)
);
}
exports.areLettersOnly = areLettersOnly;
function isBIC(input) {
return (/^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test(input)
);
}
exports.isBIC = isBIC;
var cardTypes = [{ type: "MasterCard", reg: /^(5[12345])/, minLength: 16, maxLength: 16 }, { type: "VISA", reg: /^(4)/, minLength: 13, maxLength: 16 }, { type: "Amex", reg: /^(3[47])/, minLength: 16, maxLength: 16 }, { type: "DinersClub", reg: /^(3(0[012345]|[68]))/, minLength: 16, maxLength: 16 }, { type: "enRoute", reg: /^(2(014|149))/, minLength: 16, maxLength: 16 }, { type: "Discover", reg: /^(6011)/, minLength: 16, maxLength: 16 }, { type: "JCB", reg: /^(3)|^(2131|1800)/, minLength: 15, maxLength: 16 }];
function isCreditCard(str, type) {
var l = str.length;
if (l < 13 || l > 16) {
return false;
}
if (!isLuhn(str)) {
return false;
}
if (type !== undefined) {
var found = cardTypes.filter(function (x) {
return x.type === type;
});
if (found != null && found.length === 1) {
found = found[0];
return l >= found.minLength && l <= found.maxLength && found.reg.test(str);
}
}
return true;
}
exports.isCreditCard = isCreditCard;
function decodeFormat(format) {
if (format === "DD/MM/YYYY") {
return { reg: /^\d{1,2}\/\d{1,2}\/\d{4}$/, d: 0, m: 1, y: 2, sp: "/" };
} else if (format === "DD-MM-YYYY") {
return { reg: /^\d{1,2}-\d{1,2}-\d{4}$/, d: 0, m: 1, y: 2, sp: "-" };
} else if (format === "MM/DD/YYYY") return { reg: /^\d{1,2}\/\d{1,2}\/\d{4}$/, d: 1, m: 0, y: 2, sp: "/" };else if (format === "MM-DD-YYYY") return { reg: /^\d{1,2}-\d{1,2}-\d{4}$/, d: 1, m: 0, y: 2, sp: "-" };else if (format === "YYYY-MM-DD") return { reg: /^\d{4}-\d{1,2}-\d{1,2}$/, d: 2, m: 1, y: 0, sp: "-" };
}
function isDate(input, formats) {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = formats[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var format = _step.value;
var exp = decodeFormat(format);
if (exp.reg.test(input)) {
var tokens = input.split(exp.sp);
var d = +tokens[exp.d];
var m = +tokens[exp.m];
var y = +tokens[exp.y];
var monthLength = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
if (y % 400 === 0 || y % 100 !== 0 && y % 4 === 0 && m === 2) {
monthLength[1] = 29;
}
if (d > 0 && d <= monthLength[m - 1] && m >= 1 && m <= 12 && y >= 0 && y <= 9999) {
return true;
}
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return false;
}
exports.isDate = isDate;
function isEAN13(input) {
var sum = 0;
var tmp;
var multiply = false;
if (input.length !== 13) {
return false;
}
for (var i = input.length - 1; i >= 0; i--) {
tmp = parseInt(input.charAt(i), 10);
if (multiply && tmp !== 0) {
tmp *= 3;
}
multiply = !multiply;
sum += tmp;
}
return sum % 10 === 0;
}
exports.isEAN13 = isEAN13;
function isEmail(input) {
return !/\s/.test(input) && !/\.@/.test(input) && !/\.\./.test(input) && /^(([^<>()[]\.,;:s@]+(.[^<>()[]\.,;:s@]+)*)|(.+))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9]+.)+[a-zA-Z]{2,}))$/.test(input);
}
exports.isEmail = isEmail;
function isEmpty(input, options) {
if (!options) {
options = { ignore_spaces: true };
}
if (options && options.ignore_spaces) {
input = input.trim();
}
return input.length === 0;
}
exports.isEmpty = isEmpty;
function isIBAN(str) {
var iban = str.replace(/ /g, "").toUpperCase();
var ibancheckdigits = "";
var leadingZeroes = true;
var cRest = "";
var cOperator = "";
var countrycode, ibancheck, charAt, cChar, bbanpattern, bbancountrypatterns, ibanregexp, i, p;
var minimalIBANlength = 5;
if (iban.length < minimalIBANlength) {
return false;
}
countrycode = iban.substring(0, 2);
bbancountrypatterns = {
"AL": "\\d{8}[\\dA-Z]{16}",
"AD": "\\d{8}[\\dA-Z]{12}",
"AT": "\\d{16}",
"AZ": "[\\dA-Z]{4}\\d{20}",
"BE": "\\d{12}",
"BH": "[A-Z]{4}[\\dA-Z]{14}",
"BA": "\\d{16}",
"BR": "\\d{23}[A-Z][\\dA-Z]",
"BG": "[A-Z]{4}\\d{6}[\\dA-Z]{8}",
"CR": "\\d{17}",
"HR": "\\d{17}",
"CY": "\\d{8}[\\dA-Z]{16}",
"CZ": "\\d{20}",
"DK": "\\d{14}",
"DO": "[A-Z]{4}\\d{20}",
"EE": "\\d{16}",
"FO": "\\d{14}",
"FI": "\\d{14}",
"FR": "\\d{10}[\\dA-Z]{11}\\d{2}",
"GE": "[\\dA-Z]{2}\\d{16}",
"DE": "\\d{18}",
"GI": "[A-Z]{4}[\\dA-Z]{15}",
"GR": "\\d{7}[\\dA-Z]{16}",
"GL": "\\d{14}",
"GT": "[\\dA-Z]{4}[\\dA-Z]{20}",
"HU": "\\d{24}",
"IS": "\\d{22}",
"IE": "[\\dA-Z]{4}\\d{14}",
"IL": "\\d{19}",
"IT": "[A-Z]\\d{10}[\\dA-Z]{12}",
"KZ": "\\d{3}[\\dA-Z]{13}",
"KW": "[A-Z]{4}[\\dA-Z]{22}",
"LV": "[A-Z]{4}[\\dA-Z]{13}",
"LB": "\\d{4}[\\dA-Z]{20}",
"LI": "\\d{5}[\\dA-Z]{12}",
"LT": "\\d{16}",
"LU": "\\d{3}[\\dA-Z]{13}",
"MK": "\\d{3}[\\dA-Z]{10}\\d{2}",
"MT": "[A-Z]{4}\\d{5}[\\dA-Z]{18}",
"MR": "\\d{23}",
"MU": "[A-Z]{4}\\d{19}[A-Z]{3}",
"MC": "\\d{10}[\\dA-Z]{11}\\d{2}",
"MD": "[\\dA-Z]{2}\\d{18}",
"ME": "\\d{18}",
"NL": "[A-Z]{4}\\d{10}",
"NO": "\\d{11}",
"PK": "[\\dA-Z]{4}\\d{16}",
"PS": "[\\dA-Z]{4}\\d{21}",
"PL": "\\d{24}",
"PT": "\\d{21}",
"RO": "[A-Z]{4}[\\dA-Z]{16}",
"SM": "[A-Z]\\d{10}[\\dA-Z]{12}",
"SA": "\\d{2}[\\dA-Z]{18}",
"RS": "\\d{18}",
"SK": "\\d{20}",
"SI": "\\d{15}",
"ES": "\\d{20}",
"SE": "\\d{20}",
"CH": "\\d{5}[\\dA-Z]{12}",
"TN": "\\d{20}",
"TR": "\\d{5}[\\dA-Z]{17}",
"AE": "\\d{3}\\d{16}",
"GB": "[A-Z]{4}\\d{14}",
"VG": "[\\dA-Z]{4}\\d{16}"
};
bbanpattern = bbancountrypatterns[countrycode];
if (typeof bbanpattern !== "undefined") {
ibanregexp = new RegExp("^[A-Z]{2}\\d{2}" + bbanpattern + "$", "");
if (!ibanregexp.test(iban)) {
return false;
}
}
ibancheck = iban.substring(4, iban.length) + iban.substring(0, 4);
for (i = 0; i < ibancheck.length; i++) {
charAt = ibancheck.charAt(i);
if (charAt !== "0") {
leadingZeroes = false;
}
if (!leadingZeroes) {
ibancheckdigits += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(charAt);
}
}
for (p = 0; p < ibancheckdigits.length; p++) {
cChar = ibancheckdigits.charAt(p);
cOperator = "" + cRest + "" + cChar;
cRest = cOperator % 97;
}
return cRest === 1;
}
exports.isIBAN = isIBAN;
function isFloat(input, options) {
options = options || {};
var check = input !== "" && input == +input && input !== (input | 0);
return check && (!options.hasOwnProperty("max") || +input <= options.max) && (!options.hasOwnProperty("min") || +input >= options.min);
}
exports.isFloat = isFloat;
function isIMEI(input) {
return input.length === 15 && areDigits(input) && isLuhn(input);
}
exports.isIMEI = isIMEI;
function isInteger(input, options) {
options = options || {};
var intWithoutZero = /^(?:[-+]?(?:0|[1-9][0-9]*))$/;
var intWithZero = /^[-+]?[0-9]+$/;
var regex = options.hasOwnProperty("allow_leading_zeroes") && !options.allow_leading_zeroes ? intWithoutZero : intWithZero;
if (!regex.test(input)) {
return false;
}
input = parseInt(input, 10);
return (!options.hasOwnProperty("min") || input >= options.min) && (!options.hasOwnProperty("max") || input <= options.max);
}
exports.isInteger = isInteger;
function isIPv4(input) {
if (!/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.test(input)) {
return false;
}
var tokens = input.split(".");
for (var i = 0; i < tokens.length; i++) {
if (parseInt(tokens[i], 10) > 255) {
return false;
}
}
return true;
}
exports.isIPv4 = isIPv4;
function isISBN10(input) {
var checksum = 0;
var i = void 0;
if (!/^(?:[0-9]{9}X|[0-9]{10})$/.test(input)) {
return false;
}
for (i = 0; i < 9; i++) {
checksum += (i + 1) * input.charAt(i);
}
if (input.charAt(9) === 'X') {
checksum += 10 * 10;
} else {
checksum += 10 * input.charAt(9);
}
if (checksum % 11 === 0) {
return !!input;
}
return false;
}
function isISBN13(input) {
var checksum = 0;
var i = void 0;
var factor = [1, 3];
if (!/^(?:[0-9]{13})$/.test(input)) {
return false;
}
for (i = 0; i < 12; i++) {
checksum += factor[i % 2] * input.charAt(i);
}
if (input.charAt(12) - (10 - checksum % 10) % 10 === 0) {
return !!input;
}
return false;
}
function isISBN(input) {
return isISBN10(input) || isISBN13(input);
}
exports.isISBN = isISBN;
function isISSN(input) {
var checksum = 0;
if (input.length === 8) {
input = "0" + input;
}
if (!/^\d{4}\-?\d{3}[\dX]$/.test(input)) {
return false;
}
input = input.replace("-", "");
for (var i = 0; i < input.length; i++) {
var digit = input[i];
checksum += (digit === 'X' ? 10 : +digit) * (8 - i);
}
return checksum % 11 === 0;
}
exports.isISSN = isISSN;
function isLuhn(input) {
var modulo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10;
var sum = 0;
var tmp;
var multiply = false;
for (var i = input.length - 1; i >= 0; i--) {
tmp = parseInt(input.charAt(i), 10);
if (multiply && tmp !== 0) {
tmp *= 2;
if (tmp > 9) {
tmp -= 9;
}
}
multiply = !multiply;
sum += tmp;
}
return sum % modulo === 0;
}
exports.isLuhn = isLuhn;
function isMobilePhoneFr(input) {
return (/^(0)[67]\d{8}$/.test(input)
);
}
exports.isMobilePhoneFr = isMobilePhoneFr;
function handleSpecialCodes(nirpp) {
if (nirpp.indexOf('A') !== -1) {
return {
withoutLetters: nirpp.replace("A", "0"),
offset: 1000000
};
}
if (nirpp.indexOf('B') !== -1) {
return {
withoutLetters: nirpp.replace("B", "0"),
offset: 2000000
};
}
return {
withoutLetters: nirpp,
offset: 0
};
}
function parse(nirpp) {
var _handleSpecialCodes = handleSpecialCodes(nirpp);
var withoutLetters = _handleSpecialCodes.withoutLetters;
var offset = _handleSpecialCodes.offset;
return parseInt(withoutLetters, 10) - offset;
}
function generateControlKey(nirpp) {
return 97 - parse(nirpp) % 97;
}
function decompose(input) {
return {
sexe: parseInt(input.slice(0, 1), 10),
an: parseInt(input.slice(1, 3), 10),
mois: parseInt(input.slice(3, 5), 10),
dept: input.slice(5, 7),
ville: parseInt(input.slice(7, 10), 10),
ordre: parseInt(input.slice(10, 13), 10),
key: parseInt(input.slice(-2), 10)
};
}
function isNIR(input) {
if (input.length != 15) {
return false;
}
try {
var dec = decompose(input);
if (!(dec.sexe === 1 || dec.sexe === 2 || dec.sexe === 8)) {
return false;
}
var computedKey = generateControlKey(input.slice(0, 13));
return computedKey === dec.key;
} catch (e) {
return false;
}
}
exports.isNIR = isNIR;
function isRIB(str) {
if (str.length !== 23) {
return false;
}
var compte = str.slice(10, 21);
compte = compte.replace(/[A|J]/g, "1").replace(/[B|K|S]/g, "2").replace(/[C|L|T]/g, "3").replace(/[D|M|U]/g, "4").replace(/[E|N|V]/g, "5").replace(/[F|O|W]/g, "6").replace(/[G|P|X]/g, "7").replace(/[H|Q|Y]/g, "8").replace(/[I|R|Z]/g, "9");
var key = str.slice(21, 23);
str = str.slice(0, 10) + compte + key;
if (!areDigits(str)) {
return false;
}
var k = parseInt(key, 10);
var banque = str.slice(0, 5);
var guichet = str.slice(5, 10);
var cp = parseInt(compte, 10);
var ki = banque % 97;
ki = ki * 100000 + parseInt(guichet, 10);
ki = ki % 97;
ki = ki * Math.pow(10, 11) + cp;
ki = ki % 97;
ki = ki * 100;
ki = ki % 97;
ki = 97 - ki;
return ki === k;
}
exports.isRIB = isRIB;
function isSEDOL(text) {
try {
var input = text.substr(0, 6);
var check_digit = checkKey(input);
return text === input + check_digit;
} catch (e) {
return false;
}
return false;
}
function checkKey(num) {
var weight = [1, 3, 1, 7, 3, 9];
if (num.search(/^[0-9BCDFGHJKLMNPQRSTVWXYZ]{6}$/) == -1) {
throw "Invalid SEDOL number '" + num + "'";
}
var sum = 0;
for (var i = 0; i < num.length; i++) {
sum += weight[i] * parseInt(num.charAt(i), 36);
}
var check = (10 - sum % 10) % 10;
return check.toString();
}
exports.isSEDOL = isSEDOL;
function isSIREN(input) {
return input.length === 9 && areDigits(input) && isLuhn(input, 10);
}
exports.isSIREN = isSIREN;
function isSIRET(input) {
var precheck = input.length === 14 && areDigits(input);
var siren = input.slice(0, 9);
return precheck && (isLuhn(siren, 10) || siren === "356000000" && isLuhn(input, 5));
}
exports.isSIRET = isSIRET;
function isStrongPassword(input, acceptings) {
var strength = 0;
if (input.length < 8) {
return 0;
}
if (acceptings && !areIn(input, acceptings)) {
return -1;
}
if (input.length > 8) strength += 1;
if (input.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) strength += 1;
if (input.match(/([a-zA-Z])/) && input.match(/([0-9])/)) strength += 1;
if (input.match(/([!,%,&,@,#,$,^,*,?,_,~])/)) strength += 1;
if (input.match(/(.*[!,%,&,@,#,$,^,*,?,_,~].*[!,%,&,@,#,$,^,*,?,_,~])/)) strength += 1;
return strength;
}
exports.isStrongPassword = isStrongPassword;
function isTime(input) {
return (/^([01][0-9]|2[0-3])(:[0-5][0-9]){1,2}$/.test(input)
);
}
exports.isTime = isTime;
function isURL(str) {
var pattern = new RegExp('^(https?:\\/\\/)?' + '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + '((\\d{1,3}\\.){3}\\d{1,3}))' + '(\\:\\d+)?' + '(\\/[-a-z\\d%@_.~+&:]*)*' + '(\\?[;&a-z\\d%@_.,~+&:=-]*)?' + '(\\#[-a-z\\d_]*)?$', 'i');
return pattern.test(str);
}
exports.isURL = isURL;
function sanitize(input, options) {
var safe = input;
if (options.keepChars) {
var i = 0;
var clean = "";
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = input[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var c = _step2.value;
if (options.keepChars.indexOf(c) >= 0) {
clean += c;
}
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
safe = clean;
}
return safe;
}
exports.sanitize = sanitize;
function validRegex(input, reg) {
return reg.test(input);
}
exports.validRegex = validRegex;
});

10

package.json

@@ -5,3 +5,3 @@ {

"groupId": "slongepee",
"version": "0.8.1",
"version": "0.8.2",
"main": "distrib/format-validator.min.js",

@@ -20,7 +20,8 @@ "name": "format-validator",

"format",
"email",
"integer",
"integer","float","IPv4","URL",
"date","time",
"email","password","regex",
"nir",
"MobilePhone",
"EAN13",
"EAN13","ISBN","ISSN",
"Luhn",

@@ -32,2 +33,3 @@ "numéro de sécurité sociale",

"IMEI",
"RIB","IBAN","SEDOL",
"front-end"

@@ -34,0 +36,0 @@ ],

@@ -46,2 +46,2 @@ # format-validator

See [Demo](https://sylvain59650.github.io/format-validator/)
See [API & Demo](https://sylvain59650.github.io/format-validator/)
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