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

@sentry/serverless

Package Overview
Dependencies
Maintainers
13
Versions
307
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@sentry/serverless - npm Package Compare versions

Comparing version 5.27.0-beta.0 to 5.27.0-beta.1

dist/google-cloud-grpc.d.ts

59

dist/awslambda.js

@@ -5,3 +5,2 @@ Object.defineProperty(exports, "__esModule", { value: true });

const Sentry = require("@sentry/node");
const utils_1 = require("@sentry/utils");
const os_1 = require("os");

@@ -11,2 +10,3 @@ const perf_hooks_1 = require("perf_hooks");

const awsservices_1 = require("./awsservices");
const utils_1 = require("./utils");
tslib_1.__exportStar(require("@sentry/node"), exports);

@@ -22,33 +22,7 @@ const { isPromise } = util_1.types;

}
return Sentry.init(options);
Sentry.init(options);
Sentry.addGlobalEventProcessor(utils_1.serverlessEventProcessor('AWSLambda'));
}
exports.init = init;
/**
* Add event processor that will override SDK details to point to the serverless SDK instead of Node,
* as well as set correct mechanism type, which should be set to `handled: false`.
* We do it like this, so that we don't introduce any side-effects in this module, which makes it tree-shakeable.
* @param scope Scope that processor should be added to
*/
function addServerlessEventProcessor(scope) {
scope.addEventProcessor(event => {
event.sdk = {
...event.sdk,
name: 'sentry.javascript.serverless',
integrations: [...((event.sdk && event.sdk.integrations) || []), 'AWSLambda'],
packages: [
...((event.sdk && event.sdk.packages) || []),
{
name: 'npm:@sentry/serverless',
version: node_1.SDK_VERSION,
},
],
version: node_1.SDK_VERSION,
};
utils_1.addExceptionMechanism(event, {
handled: false,
});
return event;
});
}
/**
* Adds additional information from the environment and AWS Context to the Sentry Scope.

@@ -83,15 +57,2 @@ *

/**
* Capture exception with a a context.
*
* @param e exception to be captured
* @param context Context
*/
function captureExceptionWithContext(e, context) {
node_1.withScope(scope => {
addServerlessEventProcessor(scope);
enhanceScopeWithEnvironmentData(scope, context);
node_1.captureException(e);
});
}
/**
* Wraps a lambda handler adding it error capture and tracing capabilities.

@@ -150,4 +111,2 @@ *

node_1.withScope(scope => {
addServerlessEventProcessor(scope);
enhanceScopeWithEnvironmentData(scope, context);
scope.setTag('timeout', humanReadableTimeout);

@@ -162,12 +121,13 @@ node_1.captureMessage(`Possible function timeout: ${context.functionName}`, node_1.Severity.Warning);

});
// We put the transaction on the scope so users can attach children to it
node_1.getCurrentHub().configureScope(scope => {
scope.setSpan(transaction);
});
const hub = node_1.getCurrentHub();
const scope = hub.pushScope();
let rv;
try {
enhanceScopeWithEnvironmentData(scope, context);
// We put the transaction on the scope so users can attach children to it
scope.setSpan(transaction);
rv = await asyncHandler(event, context);
}
catch (e) {
captureExceptionWithContext(e, context);
node_1.captureException(e);
if (options.rethrowAfterCapture) {

@@ -180,2 +140,3 @@ throw e;

transaction.finish();
hub.popScope();
await node_1.flush(options.flushTimeout);

@@ -182,0 +143,0 @@ }

@@ -29,3 +29,3 @@ Object.defineProperty(exports, "__esModule", { value: true });

description: describe(this, operation, params),
op: 'request',
op: 'aws.request',
});

@@ -32,0 +32,0 @@ }

@@ -22,13 +22,15 @@ Object.defineProperty(exports, "__esModule", { value: true });

});
// We put the transaction on the scope so users can attach children to it
// getCurrentHub() is expected to use current active domain as a carrier
// since functions-framework creates a domain for each incoming request.
// So adding of event processors every time should not lead to memory bloat.
node_1.getCurrentHub().configureScope(scope => {
general_1.configureScopeWithContext(scope, context);
// We put the transaction on the scope so users can attach children to it
scope.setSpan(transaction);
});
const activeDomain = general_1.getActiveDomain();
activeDomain.on('error', err => {
general_1.captureEventError(err, context);
});
activeDomain.on('error', node_1.captureException);
const newCallback = activeDomain.bind((...args) => {
if (args[0] !== null && args[0] !== undefined) {
general_1.captureEventError(args[0], context);
node_1.captureException(args[0]);
}

@@ -35,0 +37,0 @@ transaction.finish();

@@ -22,13 +22,15 @@ Object.defineProperty(exports, "__esModule", { value: true });

});
// We put the transaction on the scope so users can attach children to it
// getCurrentHub() is expected to use current active domain as a carrier
// since functions-framework creates a domain for each incoming request.
// So adding of event processors every time should not lead to memory bloat.
node_1.getCurrentHub().configureScope(scope => {
general_1.configureScopeWithContext(scope, context);
// We put the transaction on the scope so users can attach children to it
scope.setSpan(transaction);
});
const activeDomain = general_1.getActiveDomain();
activeDomain.on('error', err => {
general_1.captureEventError(err, context);
});
activeDomain.on('error', node_1.captureException);
const newCallback = activeDomain.bind((...args) => {
if (args[0] !== null && args[0] !== undefined) {
general_1.captureEventError(args[0], context);
node_1.captureException(args[0]);
}

@@ -35,0 +37,0 @@ transaction.finish();

@@ -9,16 +9,9 @@ /// <reference types="node" />

/**
* Capture exception with additional event information.
* Enhances the scope with additional event information.
*
* @param e exception to be captured
* @param scope scope
* @param context event context
*/
export declare function captureEventError(e: unknown, context: Context): void;
export declare function configureScopeWithContext(scope: Scope, context: Context): void;
/**
* Add event processor that will override SDK details to point to the serverless SDK instead of Node,
* as well as set correct mechanism type, which should be set to `handled: false`.
* We do it like this, so that we don't introduce any side-effects in this module, which makes it tree-shakeable.
* @param scope Scope that processor should be added to
*/
export declare function addServerlessEventProcessor(scope: Scope): void;
/**
* @returns Current active domain with a correct type.

@@ -25,0 +18,0 @@ */

Object.defineProperty(exports, "__esModule", { value: true });
const node_1 = require("@sentry/node");
const utils_1 = require("@sentry/utils");
const domain = require("domain");
const os_1 = require("os");
/**
* Capture exception with additional event information.
* Enhances the scope with additional event information.
*
* @param e exception to be captured
* @param scope scope
* @param context event context
*/
function captureEventError(e, context) {
node_1.withScope(scope => {
addServerlessEventProcessor(scope);
scope.setContext('runtime', {
name: 'node',
version: global.process.version,
});
scope.setTag('server_name', process.env.SENTRY_NAME || os_1.hostname());
scope.setContext('gcp.function.context', { ...context });
node_1.captureException(e);
function configureScopeWithContext(scope, context) {
scope.setContext('runtime', {
name: 'node',
version: global.process.version,
});
scope.setTag('server_name', process.env.SENTRY_NAME || os_1.hostname());
scope.setContext('gcp.function.context', { ...context });
}
exports.captureEventError = captureEventError;
exports.configureScopeWithContext = configureScopeWithContext;
/**
* Add event processor that will override SDK details to point to the serverless SDK instead of Node,
* as well as set correct mechanism type, which should be set to `handled: false`.
* We do it like this, so that we don't introduce any side-effects in this module, which makes it tree-shakeable.
* @param scope Scope that processor should be added to
*/
function addServerlessEventProcessor(scope) {
scope.addEventProcessor(event => {
event.sdk = {
...event.sdk,
name: 'sentry.javascript.serverless',
integrations: [...((event.sdk && event.sdk.integrations) || []), 'GCPFunction'],
packages: [
...((event.sdk && event.sdk.packages) || []),
{
name: 'npm:@sentry/serverless',
version: node_1.SDK_VERSION,
},
],
version: node_1.SDK_VERSION,
};
utils_1.addExceptionMechanism(event, {
handled: false,
});
return event;
});
}
exports.addServerlessEventProcessor = addServerlessEventProcessor;
/**
* @returns Current active domain with a correct type.

@@ -55,0 +21,0 @@ */

@@ -7,16 +7,2 @@ Object.defineProperty(exports, "__esModule", { value: true });

/**
* Capture exception with additional request information.
*
* @param e exception to be captured
* @param req incoming request
* @param options request capture options
*/
function captureRequestError(e, req, options) {
node_1.withScope(scope => {
general_1.addServerlessEventProcessor(scope);
scope.addEventProcessor(event => parseRequest(event, req, options));
node_1.captureException(e);
});
}
/**
* Wraps an HTTP function handler adding it error capture and tracing capabilities.

@@ -41,4 +27,8 @@ *

});
// We put the transaction on the scope so users can attach children to it
// getCurrentHub() is expected to use current active domain as a carrier
// since functions-framework creates a domain for each incoming request.
// So adding of event processors every time should not lead to memory bloat.
node_1.getCurrentHub().configureScope(scope => {
scope.addEventProcessor(event => parseRequest(event, req, options.parseRequestOptions));
// We put the transaction on the scope so users can attach children to it
scope.setSpan(transaction);

@@ -53,3 +43,3 @@ });

general_1.getActiveDomain().on('error', err => {
captureRequestError(err, req, options.parseRequestOptions);
node_1.captureException(err);
});

@@ -56,0 +46,0 @@ // eslint-disable-next-line @typescript-eslint/unbound-method

@@ -0,5 +1,11 @@

import * as Sentry from '@sentry/node';
import { Integration } from '@sentry/types';
export * from './http';
export * from './events';
export * from './cloud_events';
export { init } from '@sentry/node';
export declare const defaultIntegrations: Integration[];
/**
* @see {@link Sentry.init}
*/
export declare function init(options?: Sentry.NodeOptions): void;
//# sourceMappingURL=index.d.ts.map
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const Sentry = require("@sentry/node");
const google_cloud_grpc_1 = require("../google-cloud-grpc");
const google_cloud_http_1 = require("../google-cloud-http");
const utils_1 = require("../utils");
tslib_1.__exportStar(require("./http"), exports);
tslib_1.__exportStar(require("./events"), exports);
tslib_1.__exportStar(require("./cloud_events"), exports);
var node_1 = require("@sentry/node");
exports.init = node_1.init;
exports.defaultIntegrations = [
...Sentry.defaultIntegrations,
new google_cloud_http_1.GoogleCloudHttp({ optional: true }),
new google_cloud_grpc_1.GoogleCloudGrpc({ optional: true }),
];
/**
* @see {@link Sentry.init}
*/
function init(options = {}) {
if (options.defaultIntegrations === undefined) {
options.defaultIntegrations = exports.defaultIntegrations;
}
Sentry.init(options);
Sentry.addGlobalEventProcessor(utils_1.serverlessEventProcessor('GCPFunction'));
}
exports.init = init;
//# sourceMappingURL=index.js.map

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

import { captureException, captureMessage, flush, getCurrentHub, SDK_VERSION, Severity, startTransaction, withScope, } from '@sentry/node';
import { captureException, captureMessage, flush, getCurrentHub, Severity, startTransaction, withScope, } from '@sentry/node';
import * as Sentry from '@sentry/node';
import { addExceptionMechanism } from '@sentry/utils';
import { hostname } from 'os';

@@ -8,2 +7,3 @@ import { performance } from 'perf_hooks';

import { AWSServices } from './awsservices';
import { serverlessEventProcessor } from './utils';
export * from '@sentry/node';

@@ -19,32 +19,6 @@ const { isPromise } = types;

}
return Sentry.init(options);
Sentry.init(options);
Sentry.addGlobalEventProcessor(serverlessEventProcessor('AWSLambda'));
}
/**
* Add event processor that will override SDK details to point to the serverless SDK instead of Node,
* as well as set correct mechanism type, which should be set to `handled: false`.
* We do it like this, so that we don't introduce any side-effects in this module, which makes it tree-shakeable.
* @param scope Scope that processor should be added to
*/
function addServerlessEventProcessor(scope) {
scope.addEventProcessor(event => {
event.sdk = {
...event.sdk,
name: 'sentry.javascript.serverless',
integrations: [...((event.sdk && event.sdk.integrations) || []), 'AWSLambda'],
packages: [
...((event.sdk && event.sdk.packages) || []),
{
name: 'npm:@sentry/serverless',
version: SDK_VERSION,
},
],
version: SDK_VERSION,
};
addExceptionMechanism(event, {
handled: false,
});
return event;
});
}
/**
* Adds additional information from the environment and AWS Context to the Sentry Scope.

@@ -79,15 +53,2 @@ *

/**
* Capture exception with a a context.
*
* @param e exception to be captured
* @param context Context
*/
function captureExceptionWithContext(e, context) {
withScope(scope => {
addServerlessEventProcessor(scope);
enhanceScopeWithEnvironmentData(scope, context);
captureException(e);
});
}
/**
* Wraps a lambda handler adding it error capture and tracing capabilities.

@@ -146,4 +107,2 @@ *

withScope(scope => {
addServerlessEventProcessor(scope);
enhanceScopeWithEnvironmentData(scope, context);
scope.setTag('timeout', humanReadableTimeout);

@@ -158,12 +117,13 @@ captureMessage(`Possible function timeout: ${context.functionName}`, Severity.Warning);

});
// We put the transaction on the scope so users can attach children to it
getCurrentHub().configureScope(scope => {
scope.setSpan(transaction);
});
const hub = getCurrentHub();
const scope = hub.pushScope();
let rv;
try {
enhanceScopeWithEnvironmentData(scope, context);
// We put the transaction on the scope so users can attach children to it
scope.setSpan(transaction);
rv = await asyncHandler(event, context);
}
catch (e) {
captureExceptionWithContext(e, context);
captureException(e);
if (options.rethrowAfterCapture) {

@@ -176,2 +136,3 @@ throw e;

transaction.finish();
hub.popScope();
await flush(options.flushTimeout);

@@ -178,0 +139,0 @@ }

@@ -28,3 +28,3 @@ import { getCurrentHub } from '@sentry/node';

description: describe(this, operation, params),
op: 'request',
op: 'aws.request',
});

@@ -31,0 +31,0 @@ }

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

import { flush, getCurrentHub, startTransaction } from '@sentry/node';
import { captureException, flush, getCurrentHub, startTransaction } from '@sentry/node';
import { logger } from '@sentry/utils';
import { captureEventError, getActiveDomain } from './general';
import { configureScopeWithContext, getActiveDomain } from './general';
/**

@@ -21,13 +21,15 @@ * Wraps an event function handler adding it error capture and tracing capabilities.

});
// We put the transaction on the scope so users can attach children to it
// getCurrentHub() is expected to use current active domain as a carrier
// since functions-framework creates a domain for each incoming request.
// So adding of event processors every time should not lead to memory bloat.
getCurrentHub().configureScope(scope => {
configureScopeWithContext(scope, context);
// We put the transaction on the scope so users can attach children to it
scope.setSpan(transaction);
});
const activeDomain = getActiveDomain();
activeDomain.on('error', err => {
captureEventError(err, context);
});
activeDomain.on('error', captureException);
const newCallback = activeDomain.bind((...args) => {
if (args[0] !== null && args[0] !== undefined) {
captureEventError(args[0], context);
captureException(args[0]);
}

@@ -34,0 +36,0 @@ transaction.finish();

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

import { flush, getCurrentHub, startTransaction } from '@sentry/node';
import { captureException, flush, getCurrentHub, startTransaction } from '@sentry/node';
import { logger } from '@sentry/utils';
import { captureEventError, getActiveDomain } from './general';
import { configureScopeWithContext, getActiveDomain } from './general';
/**

@@ -21,13 +21,15 @@ * Wraps an event function handler adding it error capture and tracing capabilities.

});
// We put the transaction on the scope so users can attach children to it
// getCurrentHub() is expected to use current active domain as a carrier
// since functions-framework creates a domain for each incoming request.
// So adding of event processors every time should not lead to memory bloat.
getCurrentHub().configureScope(scope => {
configureScopeWithContext(scope, context);
// We put the transaction on the scope so users can attach children to it
scope.setSpan(transaction);
});
const activeDomain = getActiveDomain();
activeDomain.on('error', err => {
captureEventError(err, context);
});
activeDomain.on('error', captureException);
const newCallback = activeDomain.bind((...args) => {
if (args[0] !== null && args[0] !== undefined) {
captureEventError(args[0], context);
captureException(args[0]);
}

@@ -34,0 +36,0 @@ transaction.finish();

@@ -9,16 +9,9 @@ /// <reference types="node" />

/**
* Capture exception with additional event information.
* Enhances the scope with additional event information.
*
* @param e exception to be captured
* @param scope scope
* @param context event context
*/
export declare function captureEventError(e: unknown, context: Context): void;
export declare function configureScopeWithContext(scope: Scope, context: Context): void;
/**
* Add event processor that will override SDK details to point to the serverless SDK instead of Node,
* as well as set correct mechanism type, which should be set to `handled: false`.
* We do it like this, so that we don't introduce any side-effects in this module, which makes it tree-shakeable.
* @param scope Scope that processor should be added to
*/
export declare function addServerlessEventProcessor(scope: Scope): void;
/**
* @returns Current active domain with a correct type.

@@ -25,0 +18,0 @@ */

@@ -1,51 +0,18 @@

import { captureException, SDK_VERSION, withScope } from '@sentry/node';
import { addExceptionMechanism } from '@sentry/utils';
import * as domain from 'domain';
import { hostname } from 'os';
/**
* Capture exception with additional event information.
* Enhances the scope with additional event information.
*
* @param e exception to be captured
* @param scope scope
* @param context event context
*/
export function captureEventError(e, context) {
withScope(scope => {
addServerlessEventProcessor(scope);
scope.setContext('runtime', {
name: 'node',
version: global.process.version,
});
scope.setTag('server_name', process.env.SENTRY_NAME || hostname());
scope.setContext('gcp.function.context', { ...context });
captureException(e);
export function configureScopeWithContext(scope, context) {
scope.setContext('runtime', {
name: 'node',
version: global.process.version,
});
scope.setTag('server_name', process.env.SENTRY_NAME || hostname());
scope.setContext('gcp.function.context', { ...context });
}
/**
* Add event processor that will override SDK details to point to the serverless SDK instead of Node,
* as well as set correct mechanism type, which should be set to `handled: false`.
* We do it like this, so that we don't introduce any side-effects in this module, which makes it tree-shakeable.
* @param scope Scope that processor should be added to
*/
export function addServerlessEventProcessor(scope) {
scope.addEventProcessor(event => {
event.sdk = {
...event.sdk,
name: 'sentry.javascript.serverless',
integrations: [...((event.sdk && event.sdk.integrations) || []), 'GCPFunction'],
packages: [
...((event.sdk && event.sdk.packages) || []),
{
name: 'npm:@sentry/serverless',
version: SDK_VERSION,
},
],
version: SDK_VERSION,
};
addExceptionMechanism(event, {
handled: false,
});
return event;
});
}
/**
* @returns Current active domain with a correct type.

@@ -52,0 +19,0 @@ */

@@ -1,20 +0,6 @@

import { captureException, flush, getCurrentHub, Handlers, startTransaction, withScope } from '@sentry/node';
import { captureException, flush, getCurrentHub, Handlers, startTransaction } from '@sentry/node';
import { logger, stripUrlQueryAndFragment } from '@sentry/utils';
import { addServerlessEventProcessor, getActiveDomain } from './general';
import { getActiveDomain } from './general';
const { parseRequest } = Handlers;
/**
* Capture exception with additional request information.
*
* @param e exception to be captured
* @param req incoming request
* @param options request capture options
*/
function captureRequestError(e, req, options) {
withScope(scope => {
addServerlessEventProcessor(scope);
scope.addEventProcessor(event => parseRequest(event, req, options));
captureException(e);
});
}
/**
* Wraps an HTTP function handler adding it error capture and tracing capabilities.

@@ -39,4 +25,8 @@ *

});
// We put the transaction on the scope so users can attach children to it
// getCurrentHub() is expected to use current active domain as a carrier
// since functions-framework creates a domain for each incoming request.
// So adding of event processors every time should not lead to memory bloat.
getCurrentHub().configureScope(scope => {
scope.addEventProcessor(event => parseRequest(event, req, options.parseRequestOptions));
// We put the transaction on the scope so users can attach children to it
scope.setSpan(transaction);

@@ -51,3 +41,3 @@ });

getActiveDomain().on('error', err => {
captureRequestError(err, req, options.parseRequestOptions);
captureException(err);
});

@@ -54,0 +44,0 @@ // eslint-disable-next-line @typescript-eslint/unbound-method

@@ -0,5 +1,11 @@

import * as Sentry from '@sentry/node';
import { Integration } from '@sentry/types';
export * from './http';
export * from './events';
export * from './cloud_events';
export { init } from '@sentry/node';
export declare const defaultIntegrations: Integration[];
/**
* @see {@link Sentry.init}
*/
export declare function init(options?: Sentry.NodeOptions): void;
//# sourceMappingURL=index.d.ts.map

@@ -0,5 +1,23 @@

import * as Sentry from '@sentry/node';
import { GoogleCloudGrpc } from '../google-cloud-grpc';
import { GoogleCloudHttp } from '../google-cloud-http';
import { serverlessEventProcessor } from '../utils';
export * from './http';
export * from './events';
export * from './cloud_events';
export { init } from '@sentry/node';
export const defaultIntegrations = [
...Sentry.defaultIntegrations,
new GoogleCloudHttp({ optional: true }),
new GoogleCloudGrpc({ optional: true }),
];
/**
* @see {@link Sentry.init}
*/
export function init(options = {}) {
if (options.defaultIntegrations === undefined) {
options.defaultIntegrations = defaultIntegrations;
}
Sentry.init(options);
Sentry.addGlobalEventProcessor(serverlessEventProcessor('GCPFunction'));
}
//# sourceMappingURL=index.js.map
{
"name": "@sentry/serverless",
"version": "5.27.0-beta.0",
"version": "5.27.0-beta.1",
"description": "Offical Sentry SDK for various serverless solutions",

@@ -19,10 +19,13 @@ "repository": "git://github.com/getsentry/sentry-javascript.git",

"dependencies": {
"@sentry/minimal": "5.27.0-beta.0",
"@sentry/node": "5.27.0-beta.0",
"@sentry/types": "5.27.0-beta.0",
"@sentry/utils": "5.27.0-beta.0",
"@sentry/minimal": "5.27.0-beta.1",
"@sentry/node": "5.27.0-beta.1",
"@sentry/types": "5.27.0-beta.1",
"@sentry/utils": "5.27.0-beta.1",
"tslib": "^1.9.3"
},
"devDependencies": {
"@google-cloud/bigquery": "^5.3.0",
"@google-cloud/common": "^3.4.1",
"@google-cloud/functions-framework": "^1.7.1",
"@google-cloud/pubsub": "^2.5.0",
"@sentry-internal/eslint-config-sdk": "5.26.0",

@@ -33,2 +36,3 @@ "@types/aws-lambda": "^8.10.62",

"eslint": "7.6.0",
"google-gax": "^2.9.0",
"jest": "^24.7.1",

@@ -35,0 +39,0 @@ "nock": "^13.0.4",

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

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