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

@tdreyno/pretty-please

Package Overview
Dependencies
Maintainers
1
Versions
47
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@tdreyno/pretty-please - npm Package Compare versions

Comparing version 1.12.0 to 1.13.0

dist-src/Task/__tests__/validate.spec.js

34

dist-node/index.js

@@ -68,2 +68,11 @@ 'use strict';

const successfulValidation = value => ({
success: true,
value
});
const failedValidation = error => ({
success: false,
error
});
/* eslint-disable @typescript-eslint/no-misused-promises, @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-use-before-define */

@@ -480,2 +489,12 @@ /**

/**
* Run a function on a successful value which can fail the task or modify the type.
* @param fn A function will return a Validation on the value.
* @param task The task to tap on succcess.
*/
const validate = (fn, task) => chain(value => {
const result = fn(value);
return result.success ? of(result.value) : fail$1(result.error);
}, task);
/**
* Given a task, map the failure error to a Task.

@@ -685,2 +704,6 @@ * @alias recoverWith

validate(fn) {
return validate(fn, this);
}
mapError(fn) {

@@ -849,2 +872,10 @@ return mapError(fn, this);

/**
* Given a function that returns a task, return a new function that
* returns a promise instead.
* @param fn A function which returns a promise
*/
const wrapTaskCreator = fn => (...args) => fn(...args).toPromise();
exports.ExternalTask = ExternalTask;

@@ -857,2 +888,3 @@ exports.LoopBreak = LoopBreak;

exports.constant = constant;
exports.failedValidation = failedValidation;
exports.identity = identity;

@@ -862,4 +894,6 @@ exports.mapToIndexedObject = mapToIndexedObject;

exports.range = range;
exports.successfulValidation = successfulValidation;
exports.to = to;
exports.toIndexedObject = toIndexedObject;
exports.wrapTaskCreator = wrapTaskCreator;
//# sourceMappingURL=index.js.map

@@ -6,1 +6,7 @@ import RemoteData from "./RemoteData/index";

export { RemoteData, Task, ExternalTask, LoopContinue, LoopBreak, Subscription };
/**
* Given a function that returns a task, return a new function that
* returns a promise instead.
* @param fn A function which returns a promise
*/
export const wrapTaskCreator = (fn) => (...args) => fn(...args).toPromise();

@@ -370,2 +370,11 @@ /* eslint-disable @typescript-eslint/no-misused-promises, @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-use-before-define */

/**
* Run a function on a successful value which can fail the task or modify the type.
* @param fn A function will return a Validation on the value.
* @param task The task to tap on succcess.
*/
export const validate = (fn, task) => chain((value) => {
const result = fn(value);
return result.success ? of(result.value) : fail(result.error);
}, task);
/**
* Given a task, map the failure error to a Task.

@@ -540,2 +549,5 @@ * @alias recoverWith

}
validate(fn) {
return validate(fn, this);
}
mapError(fn) {

@@ -542,0 +554,0 @@ return mapError(fn, this);

@@ -24,1 +24,9 @@ export const range = (end, start = 0) => Array(end - start)

};
export const successfulValidation = (value) => ({
success: true,
value,
});
export const failedValidation = (error) => ({
success: false,
error,
});

@@ -6,2 +6,8 @@ import RemoteData from "./RemoteData/index";

export { RemoteData, Task, ExternalTask, LoopContinue, LoopBreak, Subscription };
/**
* Given a function that returns a task, return a new function that
* returns a promise instead.
* @param fn A function which returns a promise
*/
export declare const wrapTaskCreator: <S, Args extends unknown[]>(fn: (...args: Args) => Task<unknown, S>) => (...args: Args) => Promise<S>;
//# sourceMappingURL=index.d.ts.map

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

import { Validation } from "../util";
export declare type Reject<E> = (error: E) => void;

@@ -199,2 +200,8 @@ export declare type Resolve<S> = (result: S) => void;

/**
* Run a function on a successful value which can fail the task or modify the type.
* @param fn A function will return a Validation on the value.
* @param task The task to tap on succcess.
*/
export declare const validate: <E, S, E2, S2>(fn: (value: S) => Validation<E2, S2>, task: Task<E, S>) => Task<E | E2, S2>;
/**
* Given a task, map the failure error to a Task.

@@ -325,2 +332,3 @@ * @alias recoverWith

tapChain<S2>(fn: (result: S) => Task<E, S2>): Task<E, S>;
validate<E2, S2>(fn: (value: S) => Validation<E2, S2>): Task<E | E2, S2>;
mapError<E2>(fn: (error: E) => E2): Task<E2, S>;

@@ -327,0 +335,0 @@ validateError<E2 extends E>(fn: (err: E) => err is E2): Task<E2, S>;

@@ -19,2 +19,11 @@ export declare const range: (end: number, start?: number) => number[];

}
export declare type Validation<E, S> = {
success: true;
value: S;
} | {
success: false;
error: E;
};
export declare const successfulValidation: <S>(value: S) => Validation<never, S>;
export declare const failedValidation: <E>(error: E) => Validation<E, never>;
//# sourceMappingURL=util.d.ts.map

29

dist-web/index.js

@@ -58,2 +58,10 @@ const initialize = () => ({

};
const successfulValidation = (value) => ({
success: true,
value,
});
const failedValidation = (error) => ({
success: false,
error,
});

@@ -419,2 +427,11 @@ /* eslint-disable @typescript-eslint/no-misused-promises, @typescript-eslint/no-non-null-assertion, @typescript-eslint/no-use-before-define */

/**
* Run a function on a successful value which can fail the task or modify the type.
* @param fn A function will return a Validation on the value.
* @param task The task to tap on succcess.
*/
const validate = (fn, task) => chain((value) => {
const result = fn(value);
return result.success ? of(result.value) : fail$1(result.error);
}, task);
/**
* Given a task, map the failure error to a Task.

@@ -589,2 +606,5 @@ * @alias recoverWith

}
validate(fn) {
return validate(fn, this);
}
mapError(fn) {

@@ -725,3 +745,10 @@ return mapError(fn, this);

export { ExternalTask, LoopBreak, LoopContinue, RemoteData, Subscription, Task, constant, identity, mapToIndexedObject, pairsToIndexedObject, range, to, toIndexedObject };
/**
* Given a function that returns a task, return a new function that
* returns a promise instead.
* @param fn A function which returns a promise
*/
const wrapTaskCreator = (fn) => (...args) => fn(...args).toPromise();
export { ExternalTask, LoopBreak, LoopContinue, RemoteData, Subscription, Task, constant, failedValidation, identity, mapToIndexedObject, pairsToIndexedObject, range, successfulValidation, to, toIndexedObject, wrapTaskCreator };
//# sourceMappingURL=index.js.map

2

dist-web/index.min.js

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

var t=Object.freeze({__proto__:null,initialize:()=>({type:"Initialized"}),pending:()=>({type:"Pending"}),succeed:t=>({type:"Success",result:t}),fail:t=>({type:"Failure",error:t}),fold:(t,e,r,n,s)=>{switch(s.type){case"Initialized":return t();case"Pending":return e();case"Failure":return r(s.error);case"Success":return n(s.result)}}});const e=(t,e=0)=>Array(t-e).fill(void 0).map(((t,r)=>e+r)),r=t=>(e,r,n,s)=>n===s.length-1?t(s):e,n=t=>()=>t,s=t=>t,i=t=>(e,r,n)=>{const[s,i]=t(r,n);return e[s]=i,e},c=(t,e,r={})=>e.reduce(i(t),r),u=(t,[e,r])=>(t[e]=r,t);Array.prototype.chain_=function(t){return t(this)};const h=()=>new j,a=t=>new S(((e,r)=>r(t))),o=a,l=t=>new S(((e,r)=>{try{r(t())}catch(t){e(t)}})),w=t=>new S((e=>e(t))),d=(t,e)=>new S(((r,n)=>e.fork(r,(e=>t(e).fork(r,n))))),p=t=>t instanceof Promise?new S(((e,r)=>t.then(r,e))):o(t),f=t=>l(t).chain(p);class m{constructor(t){this.value=t}}class y{constructor(t){this.value=t}}const v=(t,e)=>new S(((r,n)=>{const s=e=>{t(e).fork((t=>{r(t)}),(t=>{t instanceof m&&n(t.value),t instanceof y&&s(t.value)}))};s(e)})),g=t=>0===t.length?o([]):new S(((e,r)=>{let n=!1,s=t.length;const i=[];return t.map(((t,c)=>t.fork((t=>{n||(n=!0,e(t))}),(t=>{n||(s-=1,i[c]=t,0===s&&r(i))}))))})),b=(t,e)=>new S(((r,n)=>e.fork(r,(e=>n(t(e)))))),I=(t,e,r)=>S.of(t).ap(e).ap(r),k=(t,e)=>new S(((r,n)=>e.fork((e=>r(t(e))),n))),E=(t,e)=>new S(((r,n)=>{let s,i,c=!1,u=!1;const h=t=>e=>{u||(t(e),i&&c&&n(i(s)))},a=t=>{u||(u=!0,r(t))};t.fork(a,h((t=>{i=t}))),e.fork(a,h((t=>{c=!0,s=t})))})),P=t=>t.chain(s);class S{constructor(t){this.computation=t,this.isCanceled=!1}fork(t,e){let r=this.isCanceled;const n={cancel:()=>r=!0};return r||this.computation((e=>{r||t(e)}),(t=>{r||e(t)})),n}cancel(){this.isCanceled=!0}then(t,e){return this.toPromise().then(t,e)}chain(t){return d(t,this)}succeedIf(t){return((t,e)=>new S(((r,n)=>{const s=t();s?n(s):e.fork(r,n)})))(t,this)}onlyOnce(){return(t=>{let e,r,n="initialized",s=0;const i={},c=(t,e)=>{const r=s++;i[r]={reject:t,resolve:e}},u=t=>{n="failure",r=t,Object.keys(i).forEach((e=>{i[e].reject(t),delete i[e]}))},h=t=>{n="success",e=t,Object.keys(i).forEach((e=>{i[e].resolve(t),delete i[e]}))};return new S(((s,i)=>{switch(n){case"success":i(e);break;case"failure":s(r);break;case"pending":c(s,i);break;case"initialized":n="pending",c(s,i),t.fork(u,h)}}))})(this)}toPromise(){return t=this,new Promise(((e,r)=>t.fork(r,e)));var t}swap(){return t=this,new S(((e,r)=>t.fork((t=>r(t)),(t=>e(t)))));var t}map(t){return b(t,this)}forward(t){return b(n(t),this)}append(...t){return b((e=>[e,...t]),this)}prepend(...t){return b((e=>[...t,e]),this)}tap(t){return((t,e)=>b((e=>(t(e),e)),this))(t)}tapChain(t){return((t,e)=>d((e=>t(e).forward(e)),this))(t)}mapError(t){return k(t,this)}validateError(t){return((t,e)=>k((e=>{if(!t(e))throw new Error("validateError failed");return e}),this))(t)}errorUnion(){return this}mapBoth(t,e){return((t,e,r)=>k(t,b(e,this)))(t,e)}fold(t,e){return((t,e,r)=>new S(((n,s)=>r.fork((e=>s(t(e))),(t=>s(e(t)))))))(t,e,this)}orElse(t){return((t,e)=>new S(((r,n)=>e.fork((e=>t(e).fork(r,n)),n))))(t,this)}ap(t){return E(this,t)}wait(t){return((t,e)=>new S(((r,n)=>{setTimeout((()=>e.fork(r,n)),t)})))(t,this)}retryIn(t){return((t,e)=>e.orElse((()=>e.wait(t))))(t,this)}retryWithExponentialBackoff(t,r){return((t,r,n)=>e(r).reduce(((e,r)=>e.retryIn(t*2**r)),n))(t,r,this)}flatten(){return P(this)}}S.fail=w,S.succeed=a,S.empty=()=>o(void 0),S.failIn=(t,e)=>new S((r=>setTimeout((()=>r(e)),t))),S.succeedIn=(t,e)=>new S(((r,n)=>setTimeout((()=>n(e)),t))),S.of=a,S.all=g,S.allSuccesses=t=>0===t.length?o([]):new S(((e,r)=>{let n=t.length;const s=[];return t.map((t=>t.fork((()=>{n-=1,0===n&&r(s)}),(t=>{n-=1,s.push(t),0===n&&r(s)}))))})),S.sequence=t=>t.reduce(((t,e)=>d((t=>b((e=>[...t,e]),e)),t)),a([])),S.firstSuccess=t=>0===t.length?w([]):new S(((e,r)=>{let n=!1,s=t.length;const i=[];return t.map((t=>t.fork((t=>{n||(s-=1,i.push(t),0===s&&e(i))}),(t=>{n||(n=!0,r(t))}))))})),S.never=()=>new S((()=>{})),S.fromPromise=p,S.fromPromises=t=>g(t.map(p)),S.fromLazyPromise=f,S.wrapPromiseCreator=t=>(...e)=>f((()=>t(...e))),S.race=t=>new S(((e,r)=>{let n=!1;return t.map((t=>t.fork((t=>{n||(n=!0,e(t))}),(t=>{n||(n=!0,r(t))}))))})),S.external=h,S.emitter=t=>{const e=h();return[e,(...r)=>{try{e.resolve(t(...r))}catch(t){e.reject(t)}}]},S.succeedBy=l,S.ap=E,S.map2=I,S.map3=(t,e,r,n)=>S.of(t).ap(e).ap(r).ap(n),S.map4=(t,e,r,n,s)=>S.of(t).ap(e).ap(r).ap(n).ap(s),S.loop=v,S.reduce=(t,e,r)=>v((({remainingItems:e,currentResult:n})=>{if(0===e.length)return o(new m(n));const[s,...i]=e,c=r.length-i.length-1;return t(n,s,c,r).map((t=>new y({remainingItems:i,currentResult:t})))}),{remainingItems:r,currentResult:e}),S.zip=(t,e)=>I((t=>e=>[t,e]),t,e),S.zipWith=(t,e,r)=>I((e=>r=>t(e,r)),e,r),S.flatten=P;class j extends S{constructor(){super(((t,e)=>{switch(this.t){case"error":t(this.i);case"success":e(this.u);case"pending":this.h=t,this.o=e}})),this.t="pending"}reject(t){this.i=t,this.t="error",this.h&&this.h(t)}resolve(t){this.u=t,this.t="success",this.o&&this.o(t)}}Promise.prototype.toTask=function(){return p(this)};class z{constructor(){this.l=new Set,this.p="inactive",this.m=new Set}emit(t){return S.all(Array.from(this.l).map((e=>e(t)||S.empty())))}subscribe(t){return this.l.add(t),this.v(),()=>{this.l.delete(t),this.v()}}clear(){this.l.clear(),this.v()}onStatusChange(t){return this.m.add(t),()=>this.m.delete(t)}v(){const t=this.l.size>0?"active":"inactive";t!==this.p&&(this.p=t,Array.from(this.m).map((e=>e(t))))}}export{j as ExternalTask,m as LoopBreak,y as LoopContinue,t as RemoteData,z as Subscription,S as Task,n as constant,s as identity,c as mapToIndexedObject,u as pairsToIndexedObject,e as range,r as to,i as toIndexedObject};
var t=Object.freeze({__proto__:null,initialize:()=>({type:"Initialized"}),pending:()=>({type:"Pending"}),succeed:t=>({type:"Success",result:t}),fail:t=>({type:"Failure",error:t}),fold:(t,e,r,s,n)=>{switch(n.type){case"Initialized":return t();case"Pending":return e();case"Failure":return r(n.error);case"Success":return s(n.result)}}});const e=(t,e=0)=>Array(t-e).fill(void 0).map(((t,r)=>e+r)),r=t=>(e,r,s,n)=>s===n.length-1?t(n):e,s=t=>()=>t,n=t=>t,i=t=>(e,r,s)=>{const[n,i]=t(r,s);return e[n]=i,e},c=(t,e,r={})=>e.reduce(i(t),r),u=(t,[e,r])=>(t[e]=r,t);Array.prototype.chain_=function(t){return t(this)};const a=t=>({success:!0,value:t}),h=t=>({success:!1,error:t}),o=()=>new _,l=t=>new z(((e,r)=>r(t))),w=l,d=t=>new z(((e,r)=>{try{r(t())}catch(t){e(t)}})),p=t=>new z((e=>e(t))),f=(t,e)=>new z(((r,s)=>e.fork(r,(e=>t(e).fork(r,s))))),m=t=>t instanceof Promise?new z(((e,r)=>t.then(r,e))):w(t),v=t=>d(t).chain(m);class y{constructor(t){this.value=t}}class g{constructor(t){this.value=t}}const b=(t,e)=>new z(((r,s)=>{const n=e=>{t(e).fork((t=>{r(t)}),(t=>{t instanceof y&&s(t.value),t instanceof g&&n(t.value)}))};n(e)})),I=t=>0===t.length?w([]):new z(((e,r)=>{let s=!1,n=t.length;const i=[];return t.map(((t,c)=>t.fork((t=>{s||(s=!0,e(t))}),(t=>{s||(n-=1,i[c]=t,0===n&&r(i))}))))})),k=(t,e)=>new z(((r,s)=>e.fork(r,(e=>s(t(e)))))),E=(t,e,r)=>z.of(t).ap(e).ap(r),P=(t,e)=>new z(((r,s)=>e.fork((e=>r(t(e))),s))),S=(t,e)=>new z(((r,s)=>{let n,i,c=!1,u=!1;const a=t=>e=>{u||(t(e),i&&c&&s(i(n)))},h=t=>{u||(u=!0,r(t))};t.fork(h,a((t=>{i=t}))),e.fork(h,a((t=>{c=!0,n=t})))})),j=t=>t.chain(n);class z{constructor(t){this.computation=t,this.isCanceled=!1}fork(t,e){let r=this.isCanceled;const s={cancel:()=>r=!0};return r||this.computation((e=>{r||t(e)}),(t=>{r||e(t)})),s}cancel(){this.isCanceled=!0}then(t,e){return this.toPromise().then(t,e)}chain(t){return f(t,this)}succeedIf(t){return((t,e)=>new z(((r,s)=>{const n=t();n?s(n):e.fork(r,s)})))(t,this)}onlyOnce(){return(t=>{let e,r,s="initialized",n=0;const i={},c=(t,e)=>{const r=n++;i[r]={reject:t,resolve:e}},u=t=>{s="failure",r=t,Object.keys(i).forEach((e=>{i[e].reject(t),delete i[e]}))},a=t=>{s="success",e=t,Object.keys(i).forEach((e=>{i[e].resolve(t),delete i[e]}))};return new z(((n,i)=>{switch(s){case"success":i(e);break;case"failure":n(r);break;case"pending":c(n,i);break;case"initialized":s="pending",c(n,i),t.fork(u,a)}}))})(this)}toPromise(){return t=this,new Promise(((e,r)=>t.fork(r,e)));var t}swap(){return t=this,new z(((e,r)=>t.fork((t=>r(t)),(t=>e(t)))));var t}map(t){return k(t,this)}forward(t){return k(s(t),this)}append(...t){return k((e=>[e,...t]),this)}prepend(...t){return k((e=>[...t,e]),this)}tap(t){return((t,e)=>k((e=>(t(e),e)),this))(t)}tapChain(t){return((t,e)=>f((e=>t(e).forward(e)),this))(t)}validate(t){return((t,e)=>f((e=>{const r=t(e);return r.success?w(r.value):p(r.error)}),this))(t)}mapError(t){return P(t,this)}validateError(t){return((t,e)=>P((e=>{if(!t(e))throw new Error("validateError failed");return e}),this))(t)}errorUnion(){return this}mapBoth(t,e){return((t,e,r)=>P(t,k(e,this)))(t,e)}fold(t,e){return((t,e,r)=>new z(((s,n)=>r.fork((e=>n(t(e))),(t=>n(e(t)))))))(t,e,this)}orElse(t){return((t,e)=>new z(((r,s)=>e.fork((e=>t(e).fork(r,s)),s))))(t,this)}ap(t){return S(this,t)}wait(t){return((t,e)=>new z(((r,s)=>{setTimeout((()=>e.fork(r,s)),t)})))(t,this)}retryIn(t){return((t,e)=>e.orElse((()=>e.wait(t))))(t,this)}retryWithExponentialBackoff(t,r){return((t,r,s)=>e(r).reduce(((e,r)=>e.retryIn(t*2**r)),s))(t,r,this)}flatten(){return j(this)}}z.fail=p,z.succeed=l,z.empty=()=>w(void 0),z.failIn=(t,e)=>new z((r=>setTimeout((()=>r(e)),t))),z.succeedIn=(t,e)=>new z(((r,s)=>setTimeout((()=>s(e)),t))),z.of=l,z.all=I,z.allSuccesses=t=>0===t.length?w([]):new z(((e,r)=>{let s=t.length;const n=[];return t.map((t=>t.fork((()=>{s-=1,0===s&&r(n)}),(t=>{s-=1,n.push(t),0===s&&r(n)}))))})),z.sequence=t=>t.reduce(((t,e)=>f((t=>k((e=>[...t,e]),e)),t)),l([])),z.firstSuccess=t=>0===t.length?p([]):new z(((e,r)=>{let s=!1,n=t.length;const i=[];return t.map((t=>t.fork((t=>{s||(n-=1,i.push(t),0===n&&e(i))}),(t=>{s||(s=!0,r(t))}))))})),z.never=()=>new z((()=>{})),z.fromPromise=m,z.fromPromises=t=>I(t.map(m)),z.fromLazyPromise=v,z.wrapPromiseCreator=t=>(...e)=>v((()=>t(...e))),z.race=t=>new z(((e,r)=>{let s=!1;return t.map((t=>t.fork((t=>{s||(s=!0,e(t))}),(t=>{s||(s=!0,r(t))}))))})),z.external=o,z.emitter=t=>{const e=o();return[e,(...r)=>{try{e.resolve(t(...r))}catch(t){e.reject(t)}}]},z.succeedBy=d,z.ap=S,z.map2=E,z.map3=(t,e,r,s)=>z.of(t).ap(e).ap(r).ap(s),z.map4=(t,e,r,s,n)=>z.of(t).ap(e).ap(r).ap(s).ap(n),z.loop=b,z.reduce=(t,e,r)=>b((({remainingItems:e,currentResult:s})=>{if(0===e.length)return w(new y(s));const[n,...i]=e,c=r.length-i.length-1;return t(s,n,c,r).map((t=>new g({remainingItems:i,currentResult:t})))}),{remainingItems:r,currentResult:e}),z.zip=(t,e)=>E((t=>e=>[t,e]),t,e),z.zipWith=(t,e,r)=>E((e=>r=>t(e,r)),e,r),z.flatten=j;class _ extends z{constructor(){super(((t,e)=>{switch(this.t){case"error":t(this.i);case"success":e(this.u);case"pending":this.h=t,this.o=e}})),this.t="pending"}reject(t){this.i=t,this.t="error",this.h&&this.h(t)}resolve(t){this.u=t,this.t="success",this.o&&this.o(t)}}Promise.prototype.toTask=function(){return m(this)};class A{constructor(){this.l=new Set,this.p="inactive",this.m=new Set}emit(t){return z.all(Array.from(this.l).map((e=>e(t)||z.empty())))}subscribe(t){return this.l.add(t),this.v(),()=>{this.l.delete(t),this.v()}}clear(){this.l.clear(),this.v()}onStatusChange(t){return this.m.add(t),()=>this.m.delete(t)}v(){const t=this.l.size>0?"active":"inactive";t!==this.p&&(this.p=t,Array.from(this.m).map((e=>e(t))))}}const O=t=>(...e)=>t(...e).toPromise();export{_ as ExternalTask,y as LoopBreak,g as LoopContinue,t as RemoteData,A as Subscription,z as Task,s as constant,h as failedValidation,n as identity,c as mapToIndexedObject,u as pairsToIndexedObject,e as range,a as successfulValidation,r as to,i as toIndexedObject,O as wrapTaskCreator};
{
"name": "@tdreyno/pretty-please",
"version": "1.12.0",
"version": "1.13.0",
"files": [

@@ -5,0 +5,0 @@ "dist-*/",

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