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

vkontakte-api

Package Overview
Dependencies
Maintainers
1
Versions
69
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

vkontakte-api - npm Package Compare versions

Comparing version 1.4.1 to 1.5.0

dist/repositories/DatabaseRepository/DatabaseRepository.d.ts

12

CHANGELOG.md

@@ -5,2 +5,14 @@ # Changelog

## [1.5.0](https://github.com/wolframdeus/vk-api/compare/v1.4.1...v1.5.0) (2020-06-17)
### Features
* **database:** add database repository ([519bfdc](https://github.com/wolframdeus/vk-api/commit/519bfdc60561ff184561cf560caff6e0cfd6321b))
### Bug Fixes
* **users.get:** use defined function instead of custom code for userIds ([ed59b42](https://github.com/wolframdeus/vk-api/commit/ed59b4246d33a52ff118f1132f21a8f65ff1cbe5))
### [1.4.1](https://github.com/wolframdeus/vk-api/compare/v1.4.0...v1.4.1) (2020-06-17)

@@ -7,0 +19,0 @@

3

dist/multithreading/VKAPISlave/VKAPISlave.d.ts
import { VKAPIInterface } from '../../VKAPI';
import { UsersRepository, MessagesRepository, NotificationsRepository } from '../../repositories';
import { UsersRepository, MessagesRepository, NotificationsRepository, DatabaseRepository } from '../../repositories';
import { SendRequest } from '../../types';

@@ -10,2 +10,3 @@ import { VKAPISlaveConstructorProps } from './types';

export declare class VKAPISlave implements VKAPIInterface {
database: DatabaseRepository;
users: UsersRepository;

@@ -12,0 +13,0 @@ messages: MessagesRepository;

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

"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var utils_1=require("./utils"),repositories_1=require("../../repositories"),VKAPISlave=function(){return function(e){var s=this;if(void 0===e&&(e={}),this.requestId="0",this.addRequestToQueue=function(e){if(!process.send)throw new Error('Unable to process VKAPI request from slave due to there is no "process.send" method available. It looks like it was created in main thread, but not in fork');var t=(parseInt(s.requestId)+1).toString(16),r=process.pid,o={tunnelName:s.tunnelName,processId:r,requestId:t,isVKAPIMessage:!0,type:"process-request",config:e};return process.send(o),s.requestId=t,new Promise(function(e,o){var i=function(n){if(utils_1.isVKAPIRequestProcessedMessage(n)&&n.tunnelName===s.tunnelName&&n.requestId===t&&n.processId===r){if(process.off("message",i),n.error)return o(n.error);e(n.data)}};process.on("message",i)})},!process.send)throw new Error('Unable to create VKAPISlave due to there is no "process.send" method available. It looks like it was created in main thread, but not in fork');var t=e.tunnelName,r=void 0===t?"":t;this.tunnelName=r,this.users=new repositories_1.UsersRepository(this.addRequestToQueue),this.messages=new repositories_1.MessagesRepository(this.addRequestToQueue),this.notifications=new repositories_1.NotificationsRepository(this.addRequestToQueue)}}();exports.VKAPISlave=VKAPISlave;
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var utils_1=require("./utils"),repositories_1=require("../../repositories"),VKAPISlave=function(){return function(e){var s=this;if(void 0===e&&(e={}),this.requestId="0",this.addRequestToQueue=function(e){if(!process.send)throw new Error('Unable to process VKAPI request from slave due to there is no "process.send" method available. It looks like it was created in main thread, but not in fork');var t=(parseInt(s.requestId)+1).toString(16),r=process.pid,o={tunnelName:s.tunnelName,processId:r,requestId:t,isVKAPIMessage:!0,type:"process-request",config:e};return process.send(o),s.requestId=t,new Promise(function(e,o){var i=function(n){if(utils_1.isVKAPIRequestProcessedMessage(n)&&n.tunnelName===s.tunnelName&&n.requestId===t&&n.processId===r){if(process.off("message",i),n.error)return o(n.error);e(n.data)}};process.on("message",i)})},!process.send)throw new Error('Unable to create VKAPISlave due to there is no "process.send" method available. It looks like it was created in main thread, but not in fork');var t=e.tunnelName,r=void 0===t?"":t;this.tunnelName=r,this.database=new repositories_1.DatabaseRepository(this.addRequestToQueue),this.users=new repositories_1.UsersRepository(this.addRequestToQueue),this.messages=new repositories_1.MessagesRepository(this.addRequestToQueue),this.notifications=new repositories_1.NotificationsRepository(this.addRequestToQueue)}}();exports.VKAPISlave=VKAPISlave;

@@ -0,3 +1,4 @@

export * from './DatabaseRepository';
export * from './MessagesRepository';
export * from './NotificationsRepository';
export * from './UsersRepository';

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

"use strict";function __export(e){for(var r in e)exports.hasOwnProperty(r)||(exports[r]=e[r])}Object.defineProperty(exports,"__esModule",{value:!0}),__export(require("./MessagesRepository")),__export(require("./NotificationsRepository")),__export(require("./UsersRepository"));
"use strict";function __export(e){for(var r in e)exports.hasOwnProperty(r)||(exports[r]=e[r])}Object.defineProperty(exports,"__esModule",{value:!0}),__export(require("./DatabaseRepository")),__export(require("./MessagesRepository")),__export(require("./NotificationsRepository")),__export(require("./UsersRepository"));

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

"use strict";var __extends=this&&this.__extends||function(){var t=function(e,r){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])})(e,r)};return function(e,r){function o(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(o.prototype=r.prototype,new o)}}(),__assign=this&&this.__assign||function(){return(__assign=Object.assign||function(t){for(var e,r=1,o=arguments.length;r<o;r++)for(var s in e=arguments[r])Object.prototype.hasOwnProperty.call(e,s)&&(t[s]=e[s]);return t}).apply(this,arguments)},__rest=this&&this.__rest||function(t,e){var r={};for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&e.indexOf(o)<0&&(r[o]=t[o]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(o=Object.getOwnPropertySymbols(t);s<o.length;s++)e.indexOf(o[s])<0&&Object.prototype.propertyIsEnumerable.call(t,o[s])&&(r[o[s]]=t[o[s]])}return r};Object.defineProperty(exports,"__esModule",{value:!0});var Repository_1=require("../Repository"),UsersRepository=function(t){function e(e){var r=t.call(this,"users",e)||this;return r.get=function(t){var e=t.userIds,o=__rest(t,["userIds"]);return r.sendRequest({method:"get",params:__assign(__assign({},o),{userIds:e.join(",")})})},r}return __extends(e,t),e}(Repository_1.Repository);exports.UsersRepository=UsersRepository;
"use strict";var __extends=this&&this.__extends||function(){var t=function(r,e){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,r){t.__proto__=r}||function(t,r){for(var e in r)r.hasOwnProperty(e)&&(t[e]=r[e])})(r,e)};return function(r,e){function s(){this.constructor=r}t(r,e),r.prototype=null===e?Object.create(e):(s.prototype=e.prototype,new s)}}(),__assign=this&&this.__assign||function(){return(__assign=Object.assign||function(t){for(var r,e=1,s=arguments.length;e<s;e++)for(var o in r=arguments[e])Object.prototype.hasOwnProperty.call(r,o)&&(t[o]=r[o]);return t}).apply(this,arguments)},__rest=this&&this.__rest||function(t,r){var e={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&r.indexOf(s)<0&&(e[s]=t[s]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(s=Object.getOwnPropertySymbols(t);o<s.length;o++)r.indexOf(s[o])<0&&Object.prototype.propertyIsEnumerable.call(t,s[o])&&(e[s[o]]=t[s[o]])}return e};Object.defineProperty(exports,"__esModule",{value:!0});var Repository_1=require("../Repository"),utils_1=require("../../utils"),UsersRepository=function(t){function r(r){var e=t.call(this,"users",r)||this;return e.get=function(t){var r=t.userIds,s=__rest(t,["userIds"]);return e.sendRequest({method:"get",params:__assign(__assign({},s),{userIds:utils_1.arrayToString(r)})})},e}return __extends(r,t),r}(Repository_1.Repository);exports.UsersRepository=UsersRepository;

@@ -24,2 +24,15 @@ /**

/**
* Object with fields id and title
*/
export interface IdTitlePair {
/**
* Unique identifier
*/
id: number;
/**
* Short name
*/
title: string;
}
/**
* Shared optional request parameters.

@@ -26,0 +39,0 @@ */

/**
* Function that formats string to some format
*/
import { PseudoBooleanType } from './types';
/**
* Converts text to snake case

@@ -15,1 +19,13 @@ * @param {string} text

export declare const recursiveToCamelCase: (value: any) => any;
/**
* Converts boolean to pseudo boolean type
* @param {boolean} value
* @returns {PseudoBooleanType}
*/
export declare function toBoolean(value: boolean): PseudoBooleanType;
/**
* Converts array of simple values to compatible string format
* @param {Array<string | number>} arr
* @returns {string}
*/
export declare function arrayToString(arr: Array<string | number>): string;

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

"use strict";function createRecursiveKeysFormatter(e){var r=function(t){return null===t?null:Array.isArray(t)?t.map(r):"object"==typeof t?Object.keys(t).reduce(function(a,o){return a[e(o)]=r(t[o]),a},{}):t};return r}function toSnakeCase(e){return e.replace(/[A-Z]/g,function(e){return"_"+e.toLowerCase()})}function toCamelCase(e){return e.replace(/_./g,function(e){return e.slice(1).toUpperCase()})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.toSnakeCase=toSnakeCase,exports.recursiveToSnakeCase=createRecursiveKeysFormatter(toSnakeCase),exports.toCamelCase=toCamelCase,exports.recursiveToCamelCase=createRecursiveKeysFormatter(toCamelCase);
"use strict";function createRecursiveKeysFormatter(e){var r=function(t){return null===t?null:Array.isArray(t)?t.map(r):"object"==typeof t?Object.keys(t).reduce(function(o,a){return o[e(a)]=r(t[a]),o},{}):t};return r}function toSnakeCase(e){return e.replace(/[A-Z]/g,function(e){return"_"+e.toLowerCase()})}function toCamelCase(e){return e.replace(/_./g,function(e){return e.slice(1).toUpperCase()})}function toBoolean(e){return e?1:0}function arrayToString(e){return e.join(",")}Object.defineProperty(exports,"__esModule",{value:!0}),exports.toSnakeCase=toSnakeCase,exports.recursiveToSnakeCase=createRecursiveKeysFormatter(toSnakeCase),exports.toCamelCase=toCamelCase,exports.recursiveToCamelCase=createRecursiveKeysFormatter(toCamelCase),exports.toBoolean=toBoolean,exports.arrayToString=arrayToString;

@@ -5,2 +5,3 @@ import { RequestConfig, RequestOptionalParams, SendRequest } from '../types';

import { NotificationsRepository } from '../repositories/NotificationsRepository';
import { DatabaseRepository } from '../repositories/DatabaseRepository';
export interface QueueRequest {

@@ -25,2 +26,3 @@ /**

export interface VKAPIInterface {
database: DatabaseRepository;
users: UsersRepository;

@@ -27,0 +29,0 @@ messages: MessagesRepository;

import { SendRequest } from '../types';
import { VKAPIInterface, VKAPIConstructorProps } from './types';
import { UsersRepository, MessagesRepository, NotificationsRepository } from '../repositories';
import { UsersRepository, MessagesRepository, NotificationsRepository, DatabaseRepository } from '../repositories';
/**

@@ -8,2 +8,3 @@ * Class to perform request to VKontakte API

export declare class VKAPI implements VKAPIInterface {
database: DatabaseRepository;
users: UsersRepository;

@@ -14,3 +15,3 @@ messages: MessagesRepository;

* Queue of requests
* @type {any[]}
* @type {QueueRequest[]}
*/

@@ -17,0 +18,0 @@ private readonly queue;

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

"use strict";var __assign=this&&this.__assign||function(){return(__assign=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var i in t=arguments[r])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)},__awaiter=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))(function(i,s){function o(e){try{a(n.next(e))}catch(e){s(e)}}function u(e){try{a(n.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(o,u)}a((n=n.apply(e,t||[])).next())})},__generator=this&&this.__generator||function(e,t){var r,n,i,s,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return s={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function u(s){return function(u){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;o;)try{if(r=1,n&&(i=2&s[0]?n.return:s[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,s[1])).done)return i;switch(n=0,i&&(s=[2&s[0],i.value]),s[0]){case 0:case 1:i=s;break;case 4:return o.label++,{value:s[1],done:!1};case 5:o.label++,n=s[1],s=[0];continue;case 7:s=o.ops.pop(),o.trys.pop();continue;default:if(!(i=(i=o.trys).length>0&&i[i.length-1])&&(6===s[0]||2===s[0])){o=0;continue}if(3===s[0]&&(!i||s[1]>i[0]&&s[1]<i[3])){o.label=s[1];break}if(6===s[0]&&o.label<i[1]){o.label=i[1],i=s;break}if(i&&o.label<i[2]){o.label=i[2],o.ops.push(s);break}i[2]&&o.ops.pop(),o.trys.pop();continue}s=t.call(e,o)}catch(e){s=[6,e],n=0}finally{r=i=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,u])}}},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});var isomorphic_fetch_1=__importDefault(require("isomorphic-fetch")),VKError_1=require("../VKError"),EventEmitter_1=require("../EventEmitter"),utils_1=require("../utils"),repositories_1=require("../repositories"),VKAPI=function(){function e(e){var t=this;void 0===e&&(e={}),this.queue=[],this.isQueueProcessing=!1,this.eventEmitter=new EventEmitter_1.EventEmitter,this.accessToken=null,this.sendRequest=function(e){return __awaiter(t,void 0,void 0,function(){var t,r,n,i,s;return __generator(this,function(o){switch(o.label){case 0:return t=e.method,r=e.params,n=utils_1.recursiveToSnakeCase(__assign({v:this.v,accessToken:this.accessToken,lang:this.lang},r)),i=Object.entries(n).map(function(e){var t=e[0],r=e[1],n="object"==typeof r?JSON.stringify(r):String(r);return encodeURIComponent(t)+"="+encodeURIComponent(n)}).join("&"),[4,isomorphic_fetch_1.default("https://api.vk.com/method/"+t,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8"},body:i})];case 1:return[4,o.sent().json()];case 2:if((s=o.sent()).error)throw new VKError_1.VKError(utils_1.recursiveToCamelCase(s.error));return[2,utils_1.recursiveToCamelCase(s.response)]}})})},this.addRequestToQueue=function(e){var r=Symbol();t.queue.push({config:e,ref:r});var n=new Promise(function(e,n){var i=function(s,o,u){if(r===s){if(t.eventEmitter.off("request-performed",i),o)return n(o);e(u)}};t.eventEmitter.on("request-performed",i)});return t.processQueue(),n};var r=e.rps,n=void 0===r?3:r,i=e.accessToken,s=e.v,o=void 0===s?"5.110":s,u=e.lang,a=void 0===u?"ru":u;this.accessToken=i||null,this.v=o,this.lang=a,this.timeout=Math.ceil(1e3/n),this.users=new repositories_1.UsersRepository(this.addRequestToQueue),this.messages=new repositories_1.MessagesRepository(this.addRequestToQueue),this.notifications=new repositories_1.NotificationsRepository(this.addRequestToQueue)}return e.prototype.processQueue=function(){return __awaiter(this,void 0,void 0,function(){var e,t=this;return __generator(this,function(r){switch(r.label){case 0:return this.isQueueProcessing||0===this.queue.length?[2]:(this.isQueueProcessing=!0,(e=this.queue.map(function(e,r){return new Promise(function(n){setTimeout(function(){return __awaiter(t,void 0,void 0,function(){var t,r,i,s,o;return __generator(this,function(u){switch(u.label){case 0:t=e.config,r=e.ref,i=null,s=null,u.label=1;case 1:return u.trys.push([1,3,,4]),[4,this.sendRequest(t)];case 2:return s=u.sent(),[3,4];case 3:return o=u.sent(),i=o,[3,4];case 4:return this.eventEmitter.emit("request-performed",r,i,s),this.queue.splice(this.queue.indexOf(e),1),n(),[2]}})})},r*t.timeout)})})).push(new Promise(function(e){setTimeout(e,t.queue.length*t.timeout)})),[4,Promise.all(e)]);case 1:return r.sent(),this.isQueueProcessing=!1,this.processQueue(),[2]}})})},e}();exports.VKAPI=VKAPI;
"use strict";var __assign=this&&this.__assign||function(){return(__assign=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}).apply(this,arguments)},__awaiter=this&&this.__awaiter||function(e,t,r,i){return new(r||(r=Promise))(function(n,s){function o(e){try{a(i.next(e))}catch(e){s(e)}}function u(e){try{a(i.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(o,u)}a((i=i.apply(e,t||[])).next())})},__generator=this&&this.__generator||function(e,t){var r,i,n,s,o={label:0,sent:function(){if(1&n[0])throw n[1];return n[1]},trys:[],ops:[]};return s={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function u(s){return function(u){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;o;)try{if(r=1,i&&(n=2&s[0]?i.return:s[0]?i.throw||((n=i.return)&&n.call(i),0):i.next)&&!(n=n.call(i,s[1])).done)return n;switch(i=0,n&&(s=[2&s[0],n.value]),s[0]){case 0:case 1:n=s;break;case 4:return o.label++,{value:s[1],done:!1};case 5:o.label++,i=s[1],s=[0];continue;case 7:s=o.ops.pop(),o.trys.pop();continue;default:if(!(n=(n=o.trys).length>0&&n[n.length-1])&&(6===s[0]||2===s[0])){o=0;continue}if(3===s[0]&&(!n||s[1]>n[0]&&s[1]<n[3])){o.label=s[1];break}if(6===s[0]&&o.label<n[1]){o.label=n[1],n=s;break}if(n&&o.label<n[2]){o.label=n[2],o.ops.push(s);break}n[2]&&o.ops.pop(),o.trys.pop();continue}s=t.call(e,o)}catch(e){s=[6,e],i=0}finally{r=n=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,u])}}},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});var isomorphic_fetch_1=__importDefault(require("isomorphic-fetch")),VKError_1=require("../VKError"),EventEmitter_1=require("../EventEmitter"),utils_1=require("../utils"),repositories_1=require("../repositories"),VKAPI=function(){function e(e){var t=this;void 0===e&&(e={}),this.queue=[],this.isQueueProcessing=!1,this.eventEmitter=new EventEmitter_1.EventEmitter,this.accessToken=null,this.sendRequest=function(e){return __awaiter(t,void 0,void 0,function(){var t,r,i,n,s;return __generator(this,function(o){switch(o.label){case 0:return t=e.method,r=e.params,i=utils_1.recursiveToSnakeCase(__assign({v:this.v,accessToken:this.accessToken,lang:this.lang},r)),n=Object.entries(i).map(function(e){var t=e[0],r=e[1],i="object"==typeof r?JSON.stringify(r):String(r);return encodeURIComponent(t)+"="+encodeURIComponent(i)}).join("&"),[4,isomorphic_fetch_1.default("https://api.vk.com/method/"+t,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8"},body:n})];case 1:return[4,o.sent().json()];case 2:if((s=o.sent()).error)throw new VKError_1.VKError(utils_1.recursiveToCamelCase(s.error));return[2,utils_1.recursiveToCamelCase(s.response)]}})})},this.addRequestToQueue=function(e){var r=Symbol();t.queue.push({config:e,ref:r});var i=new Promise(function(e,i){var n=function(s,o,u){if(r===s){if(t.eventEmitter.off("request-performed",n),o)return i(o);e(u)}};t.eventEmitter.on("request-performed",n)});return t.processQueue(),i};var r=e.rps,i=void 0===r?3:r,n=e.accessToken,s=e.v,o=void 0===s?"5.110":s,u=e.lang,a=void 0===u?"ru":u;this.accessToken=n||null,this.v=o,this.lang=a,this.timeout=Math.ceil(1e3/i),this.database=new repositories_1.DatabaseRepository(this.addRequestToQueue),this.users=new repositories_1.UsersRepository(this.addRequestToQueue),this.messages=new repositories_1.MessagesRepository(this.addRequestToQueue),this.notifications=new repositories_1.NotificationsRepository(this.addRequestToQueue)}return e.prototype.processQueue=function(){return __awaiter(this,void 0,void 0,function(){var e,t=this;return __generator(this,function(r){switch(r.label){case 0:return this.isQueueProcessing||0===this.queue.length?[2]:(this.isQueueProcessing=!0,(e=this.queue.map(function(e,r){return new Promise(function(i){setTimeout(function(){return __awaiter(t,void 0,void 0,function(){var t,r,n,s,o;return __generator(this,function(u){switch(u.label){case 0:t=e.config,r=e.ref,n=null,s=null,u.label=1;case 1:return u.trys.push([1,3,,4]),[4,this.sendRequest(t)];case 2:return s=u.sent(),[3,4];case 3:return o=u.sent(),n=o,[3,4];case 4:return this.eventEmitter.emit("request-performed",r,n,s),this.queue.splice(this.queue.indexOf(e),1),i(),[2]}})})},r*t.timeout)})})).push(new Promise(function(e){setTimeout(e,t.queue.length*t.timeout)})),[4,Promise.all(e)]);case 1:return r.sent(),this.isQueueProcessing=!1,this.processQueue(),[2]}})})},e}();exports.VKAPI=VKAPI;
{
"name": "vkontakte-api",
"version": "1.4.1",
"version": "1.5.0",
"main": "dist/index.js",

@@ -5,0 +5,0 @@ "types": "dist/index.d.ts",

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