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

gesturx

Package Overview
Dependencies
Maintainers
1
Versions
23
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

gesturx - npm Package Compare versions

Comparing version 1.1.0 to 1.2.0

dist/index.d.ts

702

dist/index.js

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

var re = Object.defineProperty;
var pe = (e, t, n) => t in e ? re(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n;
var D = (e, t, n) => (pe(e, typeof t != "symbol" ? t + "" : t, n), n);
import { filter as d, NEVER as _, merge as $, BehaviorSubject as ae, scan as G, map as u, fromEvent as T, mergeMap as X, defer as ce, of as S, takeUntil as I, endWith as le, switchMap as b, exhaustMap as N, shareReplay as H, withLatestFrom as Y, first as O, share as A, skipUntil as ue, combineLatest as J, ignoreElements as he, timer as ge, buffer as de, debounceTime as $e } from "rxjs";
function ve(e, t) {
var ae = Object.defineProperty;
var ce = (e, n, t) => n in e ? ae(e, n, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[n] = t;
var w = (e, n, t) => (ce(e, typeof n != "symbol" ? n + "" : n, t), t);
import { filter as v, NEVER as K, merge as A, BehaviorSubject as le, scan as E, map as h, fromEvent as b, mergeMap as T, defer as ge, of as q, takeUntil as x, endWith as he, switchMap as R, exhaustMap as j, shareReplay as Q, withLatestFrom as Y, first as O, share as M, skipUntil as $e, combineLatest as S, ignoreElements as ue, timer as de, buffer as ve, debounceTime as fe, distinctUntilChanged as z } from "rxjs";
function Ae(e, n) {
return Math.sqrt(
Math.pow(t.x - e.x, 2) + Math.pow(t.y - e.y, 2)
Math.pow(n.x - e.x, 2) + Math.pow(n.y - e.y, 2)
);
}
function fe(e) {
const t = e.length;
if (t < 2)
function De(e) {
const n = e.length;
if (n < 2)
return 0;
const n = e.reduce((o, r, i) => o + e.slice(i + 1).reduce((p, a) => p + ve(r, a), 0), 0), s = t * (t - 1) / 2;
return n / s;
const t = e.reduce((o, r, p) => o + e.slice(p + 1).reduce((l, a) => l + Ae(r, a), 0), 0), s = n * (n - 1) / 2;
return t / s;
}
function z(e, t) {
const n = t.x - e.x, s = t.y - e.y;
return Math.atan2(s, n);
function _(e, n) {
const t = n.x - e.x, s = n.y - e.y;
return Math.atan2(s, t);
}
function me(e, t) {
return z(e, t) * (180 / Math.PI);
function ye(e, n) {
return _(e, n) * (180 / Math.PI);
}
function R(e) {
const t = e.reduce(
function C(e) {
const n = e.reduce(
(s, o) => (s.x += o.x, s.y += o.y, s),
{ x: 0, y: 0 }
), n = e.length || 1;
), t = e.length || 1;
return {
x: t.x / n,
y: t.y / n
x: n.x / t,
y: n.y / t
};
}
function ye(e, t) {
if (e.length !== t.length)
function me(e, n) {
if (e.length !== n.length)
throw new Error("Initial and new points arrays must have the same length.");
const n = R(e), s = R(t);
const t = C(e), s = C(n);
let o = 0;
for (let p = 0; p < e.length; p++) {
const a = z(
n,
e[p]
for (let l = 0; l < e.length; l++) {
const a = _(
t,
e[l]
);
let c = z(
let c = _(
s,
t[p]
n[l]
) - a;
c > Math.PI ? c -= 2 * Math.PI : c < -Math.PI && (c += 2 * Math.PI), o += c;
}
const r = o / e.length, i = r * (180 / Math.PI);
return { radianDelta: r, degreesDelta: i };
const r = o / e.length, p = r * (180 / Math.PI);
return { radianDelta: r, degreesDelta: p };
}

@@ -56,9 +56,9 @@ function we(e) {

}
const Pe = (e) => e.length > 0, De = (e) => e.pipe(d(Pe));
function K(e, t, n) {
const s = R([e]), o = R([t]);
return Math.abs(o.x - s.x) > n || Math.abs(o.y - s.y) > n;
const Pe = (e) => e.length > 0, Me = (e) => e.pipe(v(Pe));
function Z(e, n, t) {
const s = C([e]), o = C([n]);
return Math.abs(o.x - s.x) > t || Math.abs(o.y - s.y) > t;
}
const Me = (e) => e != null && e.length ? $(...(e == null ? void 0 : e.map(({ start$: t }) => t)) ?? []) : _, Ae = (e, t, n) => {
const s = e > 0 ? t / e : 0, o = e > 0 ? n / e : 0;
const Te = (e) => e != null && e.length ? A(...(e == null ? void 0 : e.map(({ start$: n }) => n)) ?? []) : K, xe = (e, n, t) => {
const s = e > 0 ? n / e : 0, o = e > 0 ? t / e : 0;
return {

@@ -69,30 +69,30 @@ velocityX: s,

};
class V {
constructor(t) {
D(this, "config$", new ae({}));
D(this, "validConfig$", this.config$.pipe(
d(
(t) => !!t.container
class F {
constructor(n) {
w(this, "config$", new le({}));
w(this, "validConfig$", this.config$.pipe(
v(
(n) => !!n.container
)
));
this.update(t);
this.update(n);
}
initialize(t) {
const n = this.config$.getValue();
initialize(n) {
const t = this.config$.getValue();
this.config$.next({
...t,
...n,
...t,
options: {
...n.options,
...t.options
...t.options,
...n.options
}
});
}
update(t) {
const n = this.config$.getValue();
update(n) {
const t = this.config$.getValue();
this.config$.next({
...n,
...t,
options: {
...n.options,
...t
...t.options,
...n
}

@@ -102,4 +102,4 @@ });

}
const B = (e, t, n, s) => {
const o = e.x - t.x + n, r = e.y - t.y + s;
const J = (e, n, t, s) => {
const o = e.x - n.x + t, r = e.y - n.y + s;
return {

@@ -109,11 +109,11 @@ deltaX: o,

};
}, Q = (e) => {
const t = (n) => R(
n.latestActivePointers.length ? n.latestActivePointers : [n.event]
}, W = (e) => {
const n = (t) => C(
t.latestActivePointers.length ? t.latestActivePointers : [t.event]
);
return e.pipe(
G(
(n, s) => {
var v, f;
const o = t(s), r = n.center, i = n.deltaX, p = n.deltaY, a = ((v = n.latestActivePointers) == null ? void 0 : v.length) ?? 0, h = ((f = s.latestActivePointers) == null ? void 0 : f.length) ?? 0, c = [
E(
(t, s) => {
var D, m;
const o = n(s), r = t.center, p = t.deltaX, l = t.deltaY, a = ((D = t.latestActivePointers) == null ? void 0 : D.length) ?? 0, $ = ((m = s.latestActivePointers) == null ? void 0 : m.length) ?? 0, c = [
"pointerdown",

@@ -123,4 +123,4 @@ "pointercancel",

"pointerup"
].includes(s.event.type) && a !== h, m = h > 0, { deltaX: y, deltaY: w } = c && m ? B(o, o, i, p) : B(o, r, i, p), { degreesDelta: M } = a === h && a >= 2 && h >= 2 ? ye(
n.latestActivePointers ?? [],
].includes(s.event.type) && a !== $, i = $ > 0, { deltaX: g, deltaY: d } = c && i ? J(o, o, p, l) : J(o, r, p, l), { degreesDelta: f } = a === $ && a >= 2 && $ >= 2 ? me(
t.latestActivePointers ?? [],
s.latestActivePointers ?? []

@@ -130,8 +130,8 @@ ) : { degreesDelta: 0 };

startTime: (/* @__PURE__ */ new Date()).getTime(),
...n,
...t,
...s,
center: o,
deltaX: y,
deltaY: w,
deltaPointersAngle: M
deltaX: g,
deltaY: d,
deltaPointersAngle: f
};

@@ -146,3 +146,3 @@ },

),
u((n) => {
h((t) => {
const {

@@ -152,19 +152,19 @@ deltaX: s,

latestActivePointers: r,
startTime: i,
center: p,
startTime: p,
center: l,
event: a,
deltaPointersAngle: h
} = n, c = r ?? [], y = Date.now() - i, { velocityX: w, velocityY: M } = Ae(y, s, o), v = fe(r);
deltaPointersAngle: $
} = t, c = r ?? [], g = Date.now() - p, { velocityX: d, velocityY: f } = xe(g, s, o), D = De(r);
return {
deltaX: s,
deltaY: o,
velocityX: w,
velocityY: M,
delay: y,
center: p,
velocityX: d,
velocityY: f,
delay: g,
center: l,
pointers: c,
startTime: i,
startTime: p,
event: a,
deltaPointersAngle: h,
pointersAverageDistance: v
deltaPointersAngle: $,
pointersAverageDistance: D
};

@@ -174,24 +174,24 @@ })

};
function F(e) {
return (t) => t.pipe(
d((n) => n.pointerId === e.pointerId)
function U(e) {
return (n) => n.pipe(
v((t) => t.pointerId === e.pointerId)
);
}
const L = ({
const N = ({
container: e,
afterEventReceived: t = (n) => n
afterEventReceived: n = (t) => t
}) => {
const n = Z({ afterEventReceived: t, container: e }), s = T(e, "pointerup").pipe(
u(t)
), o = T(e, "pointermove").pipe(
u(t)
), r = T(e, "pointerleave").pipe(
u(t)
), i = T(
const t = ee({ afterEventReceived: n, container: e }), s = b(e, "pointerup").pipe(
h(n)
), o = b(e, "pointermove").pipe(
h(n)
), r = b(e, "pointerleave").pipe(
h(n)
), p = b(
e,
"pointercancel"
).pipe(u(t));
).pipe(h(n));
return {
pointerDown$: n,
pointerCancel$: i,
pointerDown$: t,
pointerCancel$: p,
pointerLeave$: r,

@@ -201,39 +201,39 @@ pointerUp$: s,

};
}, Z = ({
}, ee = ({
container: e,
afterEventReceived: t = (n) => n
}) => T(e, "pointerdown").pipe(
u(t)
), U = ({
afterEventReceived: n = (t) => t
}) => b(e, "pointerdown").pipe(
h(n)
), V = ({
pointerCancel$: e,
pointerLeave$: t,
pointerUp$: n,
pointerLeave$: n,
pointerUp$: t,
pointerMove$: s,
trackMove: o
}) => (r) => r.pipe(
X((i) => {
const p = $(
T((p) => {
const l = A(
t,
n,
t,
e
).pipe(F(i)), a = ce(() => S(i));
return $(
).pipe(U(p)), a = ge(() => q(p));
return A(
a,
o ? s : _
o ? s : K
).pipe(
F(i),
u((c) => ({ id: c.pointerId, event: c })),
I(p),
le({ id: i.pointerId, event: void 0 })
U(p),
h((c) => ({ id: c.pointerId, event: c })),
x(l),
he({ id: p.pointerId, event: void 0 })
);
}),
G(
(i, { event: p, id: a }) => {
if (!p) {
const { [a]: h, ...c } = i;
E(
(p, { event: l, id: a }) => {
if (!l) {
const { [a]: $, ...c } = p;
return c;
}
return {
...i,
[a]: p
...p,
[a]: l
};

@@ -243,20 +243,20 @@ },

),
u((i) => Object.values(i).filter(we))
h((p) => Object.values(p).filter(we))
);
class xe extends V {
constructor(n = {}) {
super(n);
D(this, "events$");
D(this, "start$");
D(this, "end$");
D(this, "fingers$");
this.options = n, this.events$ = this.validConfig$.pipe(
b((s) => {
const { container: o, afterEventReceived: r } = s, { posThreshold: i = 15 } = s.options ?? {}, {
pointerCancel$: p,
class B extends F {
constructor(t = {}) {
super(t);
w(this, "events$");
w(this, "start$");
w(this, "end$");
w(this, "fingers$");
this.options = t, this.events$ = this.validConfig$.pipe(
R((s) => {
const { container: o, afterEventReceived: r } = s, { posThreshold: p = 15 } = s.options ?? {}, {
pointerCancel$: l,
pointerDown$: a,
pointerLeave$: h,
pointerLeave$: $,
pointerMove$: c,
pointerUp$: m
} = L({
pointerUp$: i
} = N({
container: o,

@@ -266,41 +266,41 @@ afterEventReceived: r

return a.pipe(
N((y) => {
const w = $(
S(y),
j((g) => {
const d = A(
q(g),
a
), M = $(
p,
), f = A(
l,
a,
h,
$,
c,
m
), v = w.pipe(
U({
pointerCancel$: p,
pointerLeave$: h,
pointerUp$: m,
i
), D = d.pipe(
V({
pointerCancel$: l,
pointerLeave$: $,
pointerUp$: i,
pointerMove$: c,
trackMove: !0
}),
H()
), f = $(
m,
h,
p
Q()
), m = A(
i,
$,
l
).pipe(
Y(v),
d(([l, g]) => !g.length),
u(([l]) => l),
Y(D),
v(([u, y]) => !y.length),
h(([u]) => u),
O(),
A()
), x = w.pipe(
X(
(l) => c.pipe(
F(l),
M()
), I = d.pipe(
T(
(u) => c.pipe(
U(u),
// we start pan only if the user started moving a certain distance
d(
(g) => K(
l,
g,
i
v(
(y) => Z(
u,
y,
p
)

@@ -312,39 +312,39 @@ )

).pipe(
u(() => ({
h(() => ({
type: "panStart",
event: y
event: g
})),
A(),
I(f)
), C = x.pipe(
X(
() => f.pipe(
u((l) => ({
M(),
x(m)
), k = I.pipe(
T(
() => m.pipe(
h((u) => ({
type: "panEnd",
event: l
event: u
}))
)
)
), k = M.pipe(
ue(x),
u((l) => ({
), L = f.pipe(
$e(I),
h((u) => ({
type: "panMove",
event: l
event: u
})),
I(f)
), E = $(x, k, C).pipe(
Y(v),
u(([l, g]) => ({
...l,
latestActivePointers: g
x(m)
), X = A(I, L, k).pipe(
Y(D),
h(([u, y]) => ({
...u,
latestActivePointers: y
})),
A()
M()
);
return J([
E.pipe(Q),
E
return S([
X.pipe(W),
X
]).pipe(
u(([l, { type: g }]) => ({
...l,
type: g
h(([u, { type: y }]) => ({
...u,
type: y
}))

@@ -355,8 +355,8 @@ );

}),
A()
M()
), this.start$ = this.events$.pipe(
d((s) => s.type === "panStart")
), this.end$ = this.events$.pipe(d((s) => s.type === "panEnd")), this.fingers$ = this.validConfig$.pipe(
b(({ container: s, afterEventReceived: o }) => {
const r = L({
v((s) => s.type === "panStart")
), this.end$ = this.events$.pipe(v((s) => s.type === "panEnd")), this.fingers$ = this.validConfig$.pipe(
R(({ container: s, afterEventReceived: o }) => {
const r = N({
container: s,

@@ -366,3 +366,3 @@ afterEventReceived: o

return r.pointerDown$.pipe(
U({
V({
...r,

@@ -373,27 +373,27 @@ trackMove: !1

}),
u((s) => s.length)
h((s) => s.length)
);
}
}
const Te = (e) => (t) => t.pipe(
d((n) => Math.abs(n.velocityX) >= e || Math.abs(n.velocityY) >= e)
const Re = (e) => (n) => n.pipe(
v((t) => Math.abs(t.velocityX) >= e || Math.abs(t.velocityY) >= e)
);
class Oe extends V {
constructor(n = {}) {
super(n);
D(this, "events$");
this.options = n, this.events$ = this.validConfig$.pipe(
b((s) => {
const { escapeVelocity: o = 0.9, posThreshold: r } = s.options ?? {}, i = new xe({ posThreshold: r });
i.initialize(s);
const p = i.events$.pipe(
d(({ pointers: a }) => a.length > 1)
class be extends F {
constructor(t = {}) {
super(t);
w(this, "events$");
this.options = t, this.events$ = this.validConfig$.pipe(
R((s) => {
const { escapeVelocity: o = 0.9, posThreshold: r } = s.options ?? {}, p = new B({ posThreshold: r });
p.initialize(s);
const l = p.events$.pipe(
v(({ pointers: a }) => a.length > 1)
);
return i.start$.pipe(
N((a) => i.end$.pipe(
return p.start$.pipe(
j((a) => p.end$.pipe(
O(),
Te(o),
u(({ type: h, ...c }) => ({
Re(o),
h(({ type: $, ...c }) => ({
type: "swipe",
angle: me(
angle: ye(
a.event,

@@ -404,5 +404,5 @@ c.event

})),
I(p)
x(l)
)),
A()
M()
);

@@ -413,11 +413,11 @@ })

}
class Re extends V {
constructor(n) {
super(n);
D(this, "events$");
this.options = n, this.events$ = this.validConfig$.pipe(
b((s) => {
class Ce extends F {
constructor(t) {
super(t);
w(this, "events$");
this.options = t, this.events$ = this.validConfig$.pipe(
R((s) => {
const { container: o, afterEventReceived: r } = s, {
multiTapThreshold: i = 200,
maximumPressTime: p = 250,
multiTapThreshold: p = 200,
maximumPressTime: l = 250,
maxTaps: a = 2,

@@ -427,58 +427,58 @@ // threshold should be high because of fingers size

// not fingers.
posThreshold: h = 10,
posThreshold: $ = 10,
failWith: c
} = s.options ?? {}, { pointerUp$: m, pointerLeave$: y, pointerCancel$: w, pointerMove$: M } = L({
} = s.options ?? {}, { pointerUp$: i, pointerLeave$: g, pointerCancel$: d, pointerMove$: f } = N({
container: o,
afterEventReceived: r
}), v = Z({ container: o, afterEventReceived: r }), f = v.pipe(
U({
pointerCancel$: w,
pointerLeave$: y,
pointerMove$: M,
pointerUp$: m,
}), D = ee({ container: o, afterEventReceived: r }), m = D.pipe(
V({
pointerCancel$: d,
pointerLeave$: g,
pointerMove$: f,
pointerUp$: i,
trackMove: !1
}),
H(1)
), q = f.pipe(
d((l) => l.length > 1)
), x = (l) => l.pipe(
Y(f),
d(([, g]) => g.length === 1),
u(([g]) => g)
), C = (l) => l.pipe(
de(m.pipe($e(i))),
Q(1)
), G = m.pipe(
v((u) => u.length > 1)
), I = (u) => u.pipe(
Y(m),
v(([, y]) => y.length === 1),
h(([y]) => y)
), k = (u) => u.pipe(
ve(i.pipe(fe(p))),
O()
), k = Me(c);
return $(
v,
f.pipe(he())
), L = Te(c);
return A(
D,
m.pipe(ue())
).pipe(
x,
N((l) => {
const g = $(S(l), v), W = $(
m,
y,
w,
M
), ee = g.pipe(C), te = W.pipe(
d(
(P) => K(
l,
I,
j((u) => {
const y = A(q(u), D), te = A(
i,
g,
d,
f
), ne = y.pipe(k), se = te.pipe(
v(
(P) => Z(
u,
P,
h
$
)
),
O()
), ne = f.pipe(
b(() => ge(p))
), se = $(
k,
w,
q,
te,
ne
), j = ee.pipe(
De,
d((P) => P.length <= a),
u((P) => ({
), oe = m.pipe(
R(() => de(l))
), ie = A(
L,
d,
G,
se,
oe
), H = ne.pipe(
Me,
v((P) => P.length <= a),
h((P) => ({
type: "tap",

@@ -490,12 +490,12 @@ taps: P.length,

);
return J([
j.pipe(Q),
j
return S([
H.pipe(W),
H
]).pipe(
u(([P, { type: oe, taps: ie }]) => ({
h(([P, { type: re, taps: pe }]) => ({
...P,
type: oe,
taps: ie
type: re,
taps: pe
})),
I(se)
x(ie)
);

@@ -505,22 +505,144 @@ })

}),
A()
M()
);
}
}
const Ce = ({
afterEventReceived: e = (n) => n,
recognizers: t
}) => ({ events$: $(
...t.map((o) => o.events$)
).pipe(A()), initialize: (o) => {
o.style.touchAction = "none", o.style.userSelect = "none", t.forEach((r) => {
class Fe extends F {
constructor(t = {}) {
super(t);
w(this, "events$");
this.options = t, this.events$ = this.config$.pipe(
R((s) => {
const { posThreshold: o } = s.options ?? {}, r = new B({ posThreshold: o });
r.initialize(s);
const p = r.events$.pipe(
v(({ pointers: i }) => i.length < 2),
z()
), a = r.events$.pipe(
h((i) => [i, i.pointers.length > 1]),
z(
([i, g], [d, f]) => g === f
),
v(([i, g]) => g)
).pipe(
h(([i]) => ({
...i,
type: "rotateStart",
angle: 0,
deltaAngle: 0
}))
), $ = a.pipe(
T(
() => r.events$.pipe(
E(
(i, g) => {
const d = i.angle + g.deltaPointersAngle;
return {
...i,
...g,
type: "rotate",
angle: d,
deltaAngle: g.deltaPointersAngle
};
},
{ angle: 0, deltaAngle: 0 }
),
x(p)
)
)
), c = a.pipe(
T(
() => S([$, p]).pipe(
O(),
h(([i]) => ({
...i,
type: "rotateEnd"
}))
)
)
);
return A(a, $, c);
})
);
}
}
class ze extends F {
constructor(t = {}) {
super(t);
w(this, "events$");
this.options = t, this.events$ = this.config$.pipe(
R((s) => {
const { posThreshold: o } = s.options ?? {}, r = new B({ posThreshold: o });
r.initialize(s);
const p = r.events$.pipe(
v(({ pointers: i }) => i.length < 2),
z()
), a = r.events$.pipe(
h((i) => [i, i.pointers.length > 1]),
z(
([i, g], [d, f]) => g === f
),
v(([i, g]) => g)
).pipe(
h(([i]) => ({
...i,
type: "pinchStart",
scale: 1,
distance: 0,
deltaDistance: 0,
deltaDistanceScale: 1
}))
), $ = a.pipe(
T((i) => r.events$.pipe(
E(
(g, d) => {
const f = g.pointersAverageDistance ?? d.pointersAverageDistance, D = d.pointersAverageDistance / i.pointersAverageDistance;
return {
...g,
...d,
scale: D,
distance: d.pointersAverageDistance - i.pointersAverageDistance,
deltaDistance: d.pointersAverageDistance - f,
deltaDistanceScale: d.pointersAverageDistance / f,
type: "pinchMove"
};
},
{ scale: 0 }
),
x(p)
))
), c = a.pipe(
T(
() => S([$, p]).pipe(
O(),
h(([i]) => ({
...i,
type: "pinchEnd"
}))
)
)
);
return A(a, $, c);
})
);
}
}
const Ee = ({
afterEventReceived: e = (t) => t,
recognizers: n
}) => ({ events$: A(
...n.map((o) => o.events$)
).pipe(M()), initialize: (o) => {
o.style.touchAction = "none", o.style.userSelect = "none", n.forEach((r) => {
r.initialize({ container: o, afterEventReceived: e });
});
}, recognizers: t });
}, recognizers: n });
export {
xe as PanRecognizer,
Oe as SwipeRecognizer,
Re as TapRecognizer,
Ce as createManager
B as PanRecognizer,
ze as PinchRecognizer,
Fe as RotateRecognizer,
be as SwipeRecognizer,
Ce as TapRecognizer,
Ee as createManager
};
//# sourceMappingURL=index.js.map
{
"name": "gesturx",
"private": false,
"version": "1.1.0",
"version": "1.2.0",
"type": "module",
"main": "./dist/index.umd.cjs",
"module": "./dist/index.js",
"exports": {
".": {
"import": "./dist/index.js",
"require": "./dist/index.umd.cjs"
}
},
"files": [
"dist"
],
"scripts": {

@@ -15,5 +26,2 @@ "dev": "vite",

},
"files": [
"dist"
],
"devDependencies": {

@@ -20,0 +28,0 @@ "@chakra-ui/icons": "^2.1.1",

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