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

runtypes

Package Overview
Dependencies
Maintainers
1
Versions
77
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

runtypes - npm Package Compare versions

Comparing version 2.2.0 to 3.0.0

src/types/unknown.ts

2

lib/index.d.ts

@@ -6,3 +6,3 @@ export { Runtype, Static } from './runtype';

export * from './match';
export * from './types/always';
export * from './types/unknown';
export * from './types/never';

@@ -9,0 +9,0 @@ export * from './types/void';

@@ -8,3 +8,3 @@ "use strict";

__export(require("./match"));
__export(require("./types/always"));
__export(require("./types/unknown"));
__export(require("./types/never"));

@@ -11,0 +11,0 @@ __export(require("./types/void"));

import { Runtype } from './runtype';
import { always } from './types/always';
import { LiteralBase } from './types/literal';

@@ -7,4 +6,4 @@ import { ConstraintCheck } from './types/constraint';

export declare type Reflect = ({
tag: 'always';
} & Runtype<always>) | ({
tag: 'unknown';
} & Runtype) | ({
tag: 'never';

@@ -27,3 +26,3 @@ } & Runtype<never>) | ({

element: Reflect;
} & Runtype<always[]>) | ({
} & Runtype<unknown[]>) | ({
tag: 'record';

@@ -34,3 +33,3 @@ fields: {

} & Runtype<{
[_ in string]: always;
[_ in string]: unknown;
}>) | ({

@@ -42,3 +41,3 @@ tag: 'partial';

} & Runtype<{
[_ in string]?: always;
[_ in string]?: unknown;
}>) | ({

@@ -49,13 +48,13 @@ tag: 'dictionary';

} & Runtype<{
[_: string]: always;
[_: string]: unknown;
}>) | ({
tag: 'tuple';
components: Reflect[];
} & Runtype<always[]>) | ({
} & Runtype<unknown[]>) | ({
tag: 'union';
alternatives: Reflect[];
} & Runtype<always>) | ({
} & Runtype) | ({
tag: 'intersect';
intersectees: Reflect[];
} & Runtype<always>) | ({
} & Runtype) | ({
tag: 'function';

@@ -67,9 +66,9 @@ } & Runtype<(...args: any[]) => any>) | ({

args?: any;
} & Runtype<always>) | ({
} & Runtype) | ({
tag: 'instanceof';
ctor: Constructor<always>;
} & Runtype<always>) | ({
ctor: Constructor<unknown>;
} & Runtype) | ({
tag: 'brand';
brand: string;
entity: Reflect;
} & Runtype<always>);
} & Runtype);

@@ -6,3 +6,3 @@ import { Result, Union2, Intersect2, Constraint, ConstraintCheck, Brand } from './index';

*/
export interface Runtype<A = any> {
export interface Runtype<A = unknown> {
/**

@@ -12,3 +12,3 @@ * Verifies that a value conforms to this runtype. If so, returns the same value,

*/
check(x: any): A;
check(x: unknown): A;
/**

@@ -18,7 +18,7 @@ * Validates that a value conforms to this type, and returns a result indicating

*/
validate(x: any): Result<A>;
validate(x: unknown): Result<A>;
/**
* A type guard for this runtype.
*/
guard(x: any): x is A;
guard(x: unknown): x is A;
/**

@@ -25,0 +25,0 @@ * Union this Runtype with another.

@@ -7,3 +7,3 @@ "use strict";

// Primitive types
case 'always':
case 'unknown':
case 'never':

@@ -10,0 +10,0 @@ case 'void':

@@ -25,3 +25,3 @@ "use strict";

for (var k in x) {
// Object keys are always strings
// Object keys are unknown strings
if (key === 'number') {

@@ -28,0 +28,0 @@ if (isNaN(+k))

@@ -6,4 +6,4 @@ import { Runtype } from '../runtype';

/**
* Validates nothing (always fails).
* Validates nothing (unknown fails).
*/
export declare const Never: Never;

@@ -5,3 +5,3 @@ "use strict";

/**
* Validates nothing (always fails).
* Validates nothing (unknown fails).
*/

@@ -8,0 +8,0 @@ exports.Never = runtype_1.create(function (x) {

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var runtype_1 = require("../runtype");
var always_1 = require("./always");
var unknown_1 = require("./unknown");
var array_1 = require("./array");

@@ -14,3 +14,3 @@ function Tuple() {

try {
xs = array_1.Array(always_1.Always).check(x);
xs = array_1.Array(unknown_1.Unknown).check(x);
}

@@ -17,0 +17,0 @@ catch (_a) {

{
"name": "runtypes",
"version": "2.2.0",
"version": "3.0.0",
"description": "Runtime validation for static types",

@@ -5,0 +5,0 @@ "main": "./lib/index.js",

@@ -192,3 +192,3 @@ # Runtypes [![Build Status](https://travis-ci.org/pelotom/runtypes.svg?branch=master)](https://travis-ci.org/pelotom/runtypes) [![Coverage Status](https://coveralls.io/repos/pelotom/runtypes/badge.svg?branch=master)](https://coveralls.io/github/pelotom/runtypes?branch=master)

To allow the function to be applied to anything and then handle match failures, simply use an `Always` case at the end:
To allow the function to be applied to anything and then handle match failures, simply use an `Unknown` case at the end:

@@ -200,3 +200,3 @@ ```ts

[String, s => s.length],
[Always, () => 42]
[Unknown, () => 42]
);

@@ -203,0 +203,0 @@ ```

import {
Runtype,
Static,
Always,
always,
Unknown,
Never,

@@ -51,3 +50,3 @@ Undefined,

const runtypes = {
Always,
Unknown,
Never,

@@ -102,3 +101,3 @@ Undefined,

const testValues: { value: always; passes: RuntypeName[] }[] = [
const testValues: { value: unknown; passes: RuntypeName[] }[] = [
{ value: undefined, passes: ['Undefined', 'Void'] },

@@ -145,3 +144,3 @@ { value: null, passes: ['Null', 'Void'] },

shouldPass.Always = true;
shouldPass.Unknown = true;

@@ -365,4 +364,4 @@ if (value !== undefined && value !== null) shouldPass.Empty = true;

it('always', () => {
expectLiteralField(Always, 'tag', 'always');
it('unknown', () => {
expectLiteralField(Unknown, 'tag', 'unknown');
});

@@ -412,3 +411,3 @@

it('string dictionary', () => {
const Rec = Dictionary(Always);
const Rec = Dictionary(Unknown);
expectLiteralField(Rec, 'tag', 'dictionary');

@@ -419,3 +418,3 @@ expectLiteralField(Rec, 'key', 'string');

it('number dictionary', () => {
const Rec = Dictionary(Always, 'number');
const Rec = Dictionary(Unknown, 'number');
expectLiteralField(Rec, 'tag', 'dictionary');

@@ -487,3 +486,3 @@ expectLiteralField(Rec, 'key', 'number');

X:
| Always
| Unknown
| Never

@@ -509,4 +508,4 @@ | Void

switch (X.tag) {
case 'always':
check<always>(X);
case 'unknown':
check<unknown>(X);
break;

@@ -573,3 +572,3 @@ case 'never':

function assertAccepts<A>(value: always, runtype: Runtype<A>) {
function assertAccepts<A>(value: unknown, runtype: Runtype<A>) {
const result = runtype.validate(value);

@@ -579,3 +578,3 @@ if (result.success === false) fail(result.message);

function assertRejects<A>(value: always, runtype: Runtype<A>) {
function assertRejects<A>(value: unknown, runtype: Runtype<A>) {
const result = runtype.validate(value);

@@ -585,3 +584,3 @@ if (result.success === true) fail('value passed validation even though it was not expected to');

function assertThrows<A>(value: always, runtype: Runtype<A>, error: string, key?: string) {
function assertThrows<A>(value: unknown, runtype: Runtype<A>, error: string, key?: string) {
try {

@@ -588,0 +587,0 @@ runtype.check(value);

@@ -6,3 +6,3 @@ export { Runtype, Static } from './runtype';

export * from './match';
export * from './types/always';
export * from './types/unknown';
export * from './types/never';

@@ -9,0 +9,0 @@ export * from './types/void';

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

import { Literal, String, Number, match, Always } from '.';
import { Literal, String, Number, match, Unknown } from '.';

@@ -10,3 +10,3 @@ describe('match', () => {

[
Always,
Unknown,
() => {

@@ -13,0 +13,0 @@ throw new Error('woops');

import { Runtype } from './runtype';
import { always } from './types/always';
import { LiteralBase } from './types/literal';

@@ -8,3 +7,3 @@ import { ConstraintCheck } from './types/constraint';

export type Reflect =
| { tag: 'always' } & Runtype<always>
| { tag: 'unknown' } & Runtype
| { tag: 'never' } & Runtype<never>

@@ -17,11 +16,11 @@ | { tag: 'void' } & Runtype<void>

| { tag: 'literal'; value: LiteralBase } & Runtype<LiteralBase>
| { tag: 'array'; element: Reflect } & Runtype<always[]>
| { tag: 'record'; fields: { [_: string]: Reflect } } & Runtype<{ [_ in string]: always }>
| { tag: 'partial'; fields: { [_: string]: Reflect } } & Runtype<{ [_ in string]?: always }>
| { tag: 'array'; element: Reflect } & Runtype<unknown[]>
| { tag: 'record'; fields: { [_: string]: Reflect } } & Runtype<{ [_ in string]: unknown }>
| { tag: 'partial'; fields: { [_: string]: Reflect } } & Runtype<{ [_ in string]?: unknown }>
| { tag: 'dictionary'; key: 'string' | 'number'; value: Reflect } & Runtype<{
[_: string]: always;
[_: string]: unknown;
}>
| { tag: 'tuple'; components: Reflect[] } & Runtype<always[]>
| { tag: 'union'; alternatives: Reflect[] } & Runtype<always>
| { tag: 'intersect'; intersectees: Reflect[] } & Runtype<always>
| { tag: 'tuple'; components: Reflect[] } & Runtype<unknown[]>
| { tag: 'union'; alternatives: Reflect[] } & Runtype
| { tag: 'intersect'; intersectees: Reflect[] } & Runtype
| { tag: 'function' } & Runtype<(...args: any[]) => any>

@@ -33,4 +32,4 @@ | {

args?: any;
} & Runtype<always>
| { tag: 'instanceof'; ctor: Constructor<always> } & Runtype<always>
| { tag: 'brand'; brand: string; entity: Reflect } & Runtype<always>;
} & Runtype
| { tag: 'instanceof'; ctor: Constructor<unknown> } & Runtype
| { tag: 'brand'; brand: string; entity: Reflect } & Runtype;

@@ -17,3 +17,3 @@ import {

*/
export interface Runtype<A = any> {
export interface Runtype<A = unknown> {
/**

@@ -23,3 +23,3 @@ * Verifies that a value conforms to this runtype. If so, returns the same value,

*/
check(x: any): A;
check(x: unknown): A;

@@ -30,3 +30,3 @@ /**

*/
validate(x: any): Result<A>;
validate(x: unknown): Result<A>;

@@ -36,3 +36,3 @@ /**

*/
guard(x: any): x is A;
guard(x: unknown): x is A;

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

import {
Always,
Unknown,
Never,

@@ -29,3 +29,3 @@ Undefined,

const cases: [Reflect, string][] = [
[Always, 'always'],
[Unknown, 'unknown'],
[Never, 'never'],

@@ -32,0 +32,0 @@ [Undefined, 'undefined'],

@@ -8,3 +8,3 @@ import { Reflect } from './index';

// Primitive types
case 'always':
case 'unknown':
case 'never':

@@ -11,0 +11,0 @@ case 'void':

@@ -7,6 +7,6 @@ import { Runtype, Static, create } from '../runtype';

extends Runtype<
Static<A> & {
[RuntypeName]: B;
}
> {
Static<A> & {
[RuntypeName]: B;
}
> {
tag: 'brand';

@@ -13,0 +13,0 @@ brand: B;

@@ -42,3 +42,3 @@ import { Runtype, create, Static, validationError } from '../runtype';

for (const k in x) {
// Object keys are always strings
// Object keys are unknown strings
if (key === 'number') {

@@ -45,0 +45,0 @@ if (isNaN(+k))

@@ -62,4 +62,4 @@ import { Runtype, Static, create } from '../runtype';

extends Runtype<
Static<A> & Static<B> & Static<C> & Static<D> & Static<E> & Static<F> & Static<G>
> {
Static<A> & Static<B> & Static<C> & Static<D> & Static<E> & Static<F> & Static<G>
> {
tag: 'intersect';

@@ -80,4 +80,4 @@ intersectees: [A, B, C, D, E, F, G];

extends Runtype<
Static<A> & Static<B> & Static<C> & Static<D> & Static<E> & Static<F> & Static<G> & Static<H>
> {
Static<A> & Static<B> & Static<C> & Static<D> & Static<E> & Static<F> & Static<G> & Static<H>
> {
tag: 'intersect';

@@ -99,12 +99,12 @@ intersectees: [A, B, C, D, E, F, G, H];

extends Runtype<
Static<A> &
Static<B> &
Static<C> &
Static<D> &
Static<E> &
Static<F> &
Static<G> &
Static<H> &
Static<I>
> {
Static<A> &
Static<B> &
Static<C> &
Static<D> &
Static<E> &
Static<F> &
Static<G> &
Static<H> &
Static<I>
> {
tag: 'intersect';

@@ -127,13 +127,13 @@ intersectees: [A, B, C, D, E, F, G, H, I];

extends Runtype<
Static<A> &
Static<B> &
Static<C> &
Static<D> &
Static<E> &
Static<F> &
Static<G> &
Static<H> &
Static<I> &
Static<J>
> {
Static<A> &
Static<B> &
Static<C> &
Static<D> &
Static<E> &
Static<F> &
Static<G> &
Static<H> &
Static<I> &
Static<J>
> {
tag: 'intersect';

@@ -140,0 +140,0 @@ intersectees: [A, B, C, D, E, F, G, H, I, J];

@@ -8,3 +8,3 @@ import { Runtype, create, validationError } from '../runtype';

/**
* Validates nothing (always fails).
* Validates nothing (unknown fails).
*/

@@ -11,0 +11,0 @@ export const Never = create<Never>(

import { Runtype, Static, create, validationError } from '../runtype';
import { Always } from './always';
import { Unknown } from './unknown';
import { Array as Arr } from './array';

@@ -75,4 +75,4 @@

extends Runtype<
[Static<A>, Static<B>, Static<C>, Static<D>, Static<E>, Static<F>, Static<G>, Static<H>]
> {
[Static<A>, Static<B>, Static<C>, Static<D>, Static<E>, Static<F>, Static<G>, Static<H>]
> {
tag: 'tuple';

@@ -94,14 +94,14 @@ components: [A, B, C, D, E, F, G, H];

extends Runtype<
[
Static<A>,
Static<B>,
Static<C>,
Static<D>,
Static<E>,
Static<F>,
Static<G>,
Static<H>,
Static<I>
]
> {
[
Static<A>,
Static<B>,
Static<C>,
Static<D>,
Static<E>,
Static<F>,
Static<G>,
Static<H>,
Static<I>
]
> {
tag: 'tuple';

@@ -124,15 +124,15 @@ components: [A, B, C, D, E, F, G, H, I];

extends Runtype<
[
Static<A>,
Static<B>,
Static<C>,
Static<D>,
Static<E>,
Static<F>,
Static<G>,
Static<H>,
Static<I>,
Static<J>
]
> {
[
Static<A>,
Static<B>,
Static<C>,
Static<D>,
Static<E>,
Static<F>,
Static<G>,
Static<H>,
Static<I>,
Static<J>
]
> {
tag: 'tuple';

@@ -232,3 +232,3 @@ components: [A, B, C, D, E, F, G, H, I, J];

try {
xs = Arr(Always).check(x);
xs = Arr(Unknown).check(x);
} catch ({ key, message }) {

@@ -235,0 +235,0 @@ throw validationError(`Expected tuple to be an array: ${message}`, key);

@@ -74,4 +74,4 @@ import { Runtype as Rt, Static, create, validationError } from '../runtype';

extends Rt<
Static<A> | Static<B> | Static<C> | Static<D> | Static<E> | Static<F> | Static<G> | Static<H>
> {
Static<A> | Static<B> | Static<C> | Static<D> | Static<E> | Static<F> | Static<G> | Static<H>
> {
tag: 'union';

@@ -94,12 +94,12 @@ alternatives: [A, B, C, D, E, F, G, H];

extends Rt<
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
> {
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
> {
tag: 'union';

@@ -123,13 +123,13 @@ alternatives: [A, B, C, D, E, F, G, H, I];

extends Rt<
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
> {
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
> {
tag: 'union';

@@ -154,14 +154,14 @@ alternatives: [A, B, C, D, E, F, G, H, I, J];

extends Rt<
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
> {
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
> {
tag: 'union';

@@ -187,15 +187,15 @@ alternatives: [A, B, C, D, E, F, G, H, I, J, K];

extends Rt<
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
> {
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
> {
tag: 'union';

@@ -222,16 +222,16 @@ alternatives: [A, B, C, D, E, F, G, H, I, J, K, L];

extends Rt<
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
> {
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
> {
tag: 'union';

@@ -259,17 +259,17 @@ alternatives: [A, B, C, D, E, F, G, H, I, J, K, L, M];

extends Rt<
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
| Static<N>
> {
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
| Static<N>
> {
tag: 'union';

@@ -298,18 +298,18 @@ alternatives: [A, B, C, D, E, F, G, H, I, J, K, L, M, N];

extends Rt<
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
| Static<N>
| Static<O>
> {
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
| Static<N>
| Static<O>
> {
tag: 'union';

@@ -339,19 +339,19 @@ alternatives: [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O];

extends Rt<
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
| Static<N>
| Static<O>
| Static<P>
> {
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
| Static<N>
| Static<O>
| Static<P>
> {
tag: 'union';

@@ -382,20 +382,20 @@ alternatives: [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P];

extends Rt<
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
| Static<N>
| Static<O>
| Static<P>
| Static<Q>
> {
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
| Static<N>
| Static<O>
| Static<P>
| Static<Q>
> {
tag: 'union';

@@ -427,21 +427,21 @@ alternatives: [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q];

extends Rt<
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
| Static<N>
| Static<O>
| Static<P>
| Static<Q>
| Static<R>
> {
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
| Static<N>
| Static<O>
| Static<P>
| Static<Q>
| Static<R>
> {
tag: 'union';

@@ -474,22 +474,22 @@ alternatives: [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R];

extends Rt<
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
| Static<N>
| Static<O>
| Static<P>
| Static<Q>
| Static<R>
| Static<S>
> {
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
| Static<N>
| Static<O>
| Static<P>
| Static<Q>
| Static<R>
| Static<S>
> {
tag: 'union';

@@ -523,23 +523,23 @@ alternatives: [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S];

extends Rt<
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
| Static<N>
| Static<O>
| Static<P>
| Static<Q>
| Static<R>
| Static<S>
| Static<T>
> {
| Static<A>
| Static<B>
| Static<C>
| Static<D>
| Static<E>
| Static<F>
| Static<G>
| Static<H>
| Static<I>
| Static<J>
| Static<K>
| Static<L>
| Static<M>
| Static<N>
| Static<O>
| Static<P>
| Static<Q>
| Static<R>
| Static<S>
| Static<T>
> {
tag: 'union';

@@ -546,0 +546,0 @@ alternatives: [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T];

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