Socket
Socket
Sign inDemoInstall

glob

Package Overview
Dependencies
Maintainers
1
Versions
155
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

glob - npm Package Compare versions

Comparing version 10.3.16 to 10.4.0

45

dist/commonjs/glob.d.ts

@@ -250,2 +250,46 @@ /// <reference types="node" />

posix?: boolean;
/**
* Do not match any children of any matches. For example, the pattern
* `**\/foo` would match `a/foo`, but not `a/foo/b/foo` in this mode.
*
* This is especially useful for cases like "find all `node_modules`
* folders, but not the ones in `node_modules`".
*
* In order to support this, the `Ignore` implementation must support an
* `add(pattern: string)` method. If using the default `Ignore` class, then
* this is fine, but if this is set to `false`, and a custom `Ignore` is
* provided that does not have an `add()` method, then it will throw an
* error.
*
* **Caveat** It *only* ignores matches that would be a descendant of a
* previous match, and only if that descendant is matched *after* the
* ancestor is encountered. Since the file system walk happens in
* indeterminate order, it's possible that a match will already be added
* before its ancestor, if multiple or braced patterns are used.
*
* For example:
*
* ```ts
* const results = await glob([
* // likely to match first, since it's just a stat
* 'a/b/c/d/e/f',
*
* // this pattern is more complicated! It must to various readdir()
* // calls and test the results against a regular expression, and that
* // is certainly going to take a little bit longer.
* //
* // So, later on, it encounters a match at 'a/b/c/d/e', but it's too
* // late to ignore a/b/c/d/e/f, because it's already been emitted.
* 'a/[bdf]/?/[a-z]/*',
* ], { includeChildMatches: false })
* ```
*
* It's best to only set this to `false` if you can be reasonably sure that
* no components of the pattern will potentially match one another's file
* system descendants, or if the occasional included child entry will not
* cause problems.
*
* @default true
*/
includeChildMatches?: boolean;
}

@@ -295,2 +339,3 @@ export type GlobOptionsWithFileTypesTrue = GlobOptions & {

withFileTypes: FileTypes<Opts>;
includeChildMatches: boolean;
/**

@@ -297,0 +342,0 @@ * The options provided to the constructor.

11

dist/commonjs/glob.js

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

const minimatch_1 = require("minimatch");
const node_url_1 = require("node:url");
const path_scurry_1 = require("path-scurry");
const node_url_1 = require("node:url");
const pattern_js_1 = require("./pattern.js");

@@ -45,2 +45,3 @@ const walker_js_1 = require("./walker.js");

withFileTypes;
includeChildMatches;
/**

@@ -91,2 +92,3 @@ * The options provided to the constructor.

this.absolute = opts.absolute;
this.includeChildMatches = opts.includeChildMatches !== false;
this.noglobstar = !!opts.noglobstar;

@@ -106,3 +108,4 @@ this.matchBase = !!opts.matchBase;

!!opts.windowsPathsNoEscape ||
opts.allowWindowsEscape === false;
opts.allowWindowsEscape ===
false;
if (this.windowsPathsNoEscape) {

@@ -190,2 +193,3 @@ pattern = pattern.map(p => p.replace(/\\/g, '/'));

nocase: this.nocase,
includeChildMatches: this.includeChildMatches,
}).walk()),

@@ -203,2 +207,3 @@ ];

nocase: this.nocase,
includeChildMatches: this.includeChildMatches,
}).walkSync(),

@@ -215,2 +220,3 @@ ];

nocase: this.nocase,
includeChildMatches: this.includeChildMatches,
}).stream();

@@ -226,2 +232,3 @@ }

nocase: this.nocase,
includeChildMatches: this.includeChildMatches,
}).streamSync();

@@ -228,0 +235,0 @@ }

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

import { Minimatch } from 'minimatch';
/// <reference types="node" />
import { Minimatch, MinimatchOptions } from 'minimatch';
import { Path } from 'path-scurry';

@@ -7,2 +8,3 @@ import { GlobWalkerOpts } from './walker.js';

childrenIgnored?: (p: Path) => boolean;
add?: (ignore: string) => void;
}

@@ -17,3 +19,6 @@ /**

absoluteChildren: Minimatch[];
platform: NodeJS.Platform;
mmopts: MinimatchOptions;
constructor(ignored: string[], { nobrace, nocase, noext, noglobstar, platform, }: GlobWalkerOpts);
add(ign: string): void;
ignored(p: Path): boolean;

@@ -20,0 +25,0 @@ childrenIgnored(p: Path): boolean;

63

dist/commonjs/ignore.js

@@ -23,2 +23,4 @@ "use strict";

absoluteChildren;
platform;
mmopts;
constructor(ignored, { nobrace, nocase, noext, noglobstar, platform = defaultPlatform, }) {

@@ -29,3 +31,4 @@ this.relative = [];

this.absoluteChildren = [];
const mmopts = {
this.platform = platform;
this.mmopts = {
dot: true,

@@ -41,2 +44,6 @@ nobrace,

};
for (const ign of ignored)
this.add(ign);
}
add(ign) {
// this is a little weird, but it gives us a clean set of optimized

@@ -54,32 +61,30 @@ // minimatch matchers, without getting tripped up if one of them

// a cwd option, and do the right thing.
for (const ign of ignored) {
const mm = new minimatch_1.Minimatch(ign, mmopts);
for (let i = 0; i < mm.set.length; i++) {
const parsed = mm.set[i];
const globParts = mm.globParts[i];
/* c8 ignore start */
if (!parsed || !globParts) {
throw new Error('invalid pattern object');
}
// strip off leading ./ portions
// https://github.com/isaacs/node-glob/issues/570
while (parsed[0] === '.' && globParts[0] === '.') {
parsed.shift();
globParts.shift();
}
/* c8 ignore stop */
const p = new pattern_js_1.Pattern(parsed, globParts, 0, platform);
const m = new minimatch_1.Minimatch(p.globString(), mmopts);
const children = globParts[globParts.length - 1] === '**';
const absolute = p.isAbsolute();
const mm = new minimatch_1.Minimatch(ign, this.mmopts);
for (let i = 0; i < mm.set.length; i++) {
const parsed = mm.set[i];
const globParts = mm.globParts[i];
/* c8 ignore start */
if (!parsed || !globParts) {
throw new Error('invalid pattern object');
}
// strip off leading ./ portions
// https://github.com/isaacs/node-glob/issues/570
while (parsed[0] === '.' && globParts[0] === '.') {
parsed.shift();
globParts.shift();
}
/* c8 ignore stop */
const p = new pattern_js_1.Pattern(parsed, globParts, 0, this.platform);
const m = new minimatch_1.Minimatch(p.globString(), this.mmopts);
const children = globParts[globParts.length - 1] === '**';
const absolute = p.isAbsolute();
if (absolute)
this.absolute.push(m);
else
this.relative.push(m);
if (children) {
if (absolute)
this.absolute.push(m);
this.absoluteChildren.push(m);
else
this.relative.push(m);
if (children) {
if (absolute)
this.absoluteChildren.push(m);
else
this.relativeChildren.push(m);
}
this.relativeChildren.push(m);
}

@@ -86,0 +91,0 @@ }

@@ -37,2 +37,3 @@ /// <reference types="node" />

withFileTypes?: boolean;
includeChildMatches?: boolean;
}

@@ -50,3 +51,3 @@ export type GWOFileTypesTrue = GlobWalkerOpts & {

export type Matches<O extends GlobWalkerOpts> = O extends GWOFileTypesTrue ? Set<Path> : O extends GWOFileTypesFalse ? Set<string> : O extends GWOFileTypesUnset ? Set<string> : Set<Path | string>;
export type MatchStream<O extends GlobWalkerOpts> = O extends GWOFileTypesTrue ? Minipass<Path, Path> : O extends GWOFileTypesFalse ? Minipass<string, string> : O extends GWOFileTypesUnset ? Minipass<string, string> : Minipass<Path | string, Path | string>;
export type MatchStream<O extends GlobWalkerOpts> = Minipass<Result<O>, Result<O>>;
/**

@@ -65,2 +66,3 @@ * basic walking utilities that all the glob walker types use

maxDepth: number;
includeChildMatches: boolean;
constructor(patterns: Pattern[], path: Path, opts: O);

@@ -86,10 +88,10 @@ pause(): void;

export declare class GlobWalker<O extends GlobWalkerOpts = GlobWalkerOpts> extends GlobUtil<O> {
matches: O extends GWOFileTypesTrue ? Set<Path> : O extends GWOFileTypesFalse ? Set<string> : O extends GWOFileTypesUnset ? Set<string> : Set<Path | string>;
matches: Set<Result<O>>;
constructor(patterns: Pattern[], path: Path, opts: O);
matchEmit(e: Result<O>): void;
walk(): Promise<Matches<O>>;
walkSync(): Matches<O>;
walk(): Promise<Set<Result<O>>>;
walkSync(): Set<Result<O>>;
}
export declare class GlobStream<O extends GlobWalkerOpts = GlobWalkerOpts> extends GlobUtil<O> {
results: O extends GWOFileTypesTrue ? Minipass<Path, Path> : O extends GWOFileTypesFalse ? Minipass<string, string> : O extends GWOFileTypesUnset ? Minipass<string, string> : Minipass<Path | string, Path | string>;
results: Minipass<Result<O>, Result<O>>;
constructor(patterns: Pattern[], path: Path, opts: O);

@@ -96,0 +98,0 @@ matchEmit(e: Result<O>): void;

@@ -33,2 +33,3 @@ "use strict";

maxDepth;
includeChildMatches;
constructor(patterns, path, opts) {

@@ -39,4 +40,10 @@ this.patterns = patterns;

this.#sep = !opts.posix && opts.platform === 'win32' ? '\\' : '/';
if (opts.ignore) {
this.#ignore = makeIgnore(opts.ignore, opts);
this.includeChildMatches = opts.includeChildMatches !== false;
if (opts.ignore || !this.includeChildMatches) {
this.#ignore = makeIgnore(opts.ignore ?? [], opts);
if (!this.includeChildMatches &&
typeof this.#ignore.add !== 'function') {
const m = 'cannot ignore child matches, ignore lacks add() method.';
throw new Error(m);
}
}

@@ -148,2 +155,7 @@ // ignore, always set with maxDepth, but it's optional on the

return;
// we know we have an ignore if this is false, but TS doesn't
if (!this.includeChildMatches && this.#ignore?.add) {
const ign = `${e.relativePosix()}/**`;
this.#ignore.add(ign);
}
const abs = this.opts.absolute === undefined ? absolute : this.opts.absolute;

@@ -303,6 +315,5 @@ this.seen.add(e);

class GlobWalker extends GlobUtil {
matches;
matches = new Set();
constructor(patterns, path, opts) {
super(patterns, path, opts);
this.matches = new Set();
}

@@ -309,0 +320,0 @@ matchEmit(e) {

@@ -250,2 +250,46 @@ /// <reference types="node" resolution-mode="require"/>

posix?: boolean;
/**
* Do not match any children of any matches. For example, the pattern
* `**\/foo` would match `a/foo`, but not `a/foo/b/foo` in this mode.
*
* This is especially useful for cases like "find all `node_modules`
* folders, but not the ones in `node_modules`".
*
* In order to support this, the `Ignore` implementation must support an
* `add(pattern: string)` method. If using the default `Ignore` class, then
* this is fine, but if this is set to `false`, and a custom `Ignore` is
* provided that does not have an `add()` method, then it will throw an
* error.
*
* **Caveat** It *only* ignores matches that would be a descendant of a
* previous match, and only if that descendant is matched *after* the
* ancestor is encountered. Since the file system walk happens in
* indeterminate order, it's possible that a match will already be added
* before its ancestor, if multiple or braced patterns are used.
*
* For example:
*
* ```ts
* const results = await glob([
* // likely to match first, since it's just a stat
* 'a/b/c/d/e/f',
*
* // this pattern is more complicated! It must to various readdir()
* // calls and test the results against a regular expression, and that
* // is certainly going to take a little bit longer.
* //
* // So, later on, it encounters a match at 'a/b/c/d/e', but it's too
* // late to ignore a/b/c/d/e/f, because it's already been emitted.
* 'a/[bdf]/?/[a-z]/*',
* ], { includeChildMatches: false })
* ```
*
* It's best to only set this to `false` if you can be reasonably sure that
* no components of the pattern will potentially match one another's file
* system descendants, or if the occasional included child entry will not
* cause problems.
*
* @default true
*/
includeChildMatches?: boolean;
}

@@ -295,2 +339,3 @@ export type GlobOptionsWithFileTypesTrue = GlobOptions & {

withFileTypes: FileTypes<Opts>;
includeChildMatches: boolean;
/**

@@ -297,0 +342,0 @@ * The options provided to the constructor.

import { Minimatch } from 'minimatch';
import { fileURLToPath } from 'node:url';
import { PathScurry, PathScurryDarwin, PathScurryPosix, PathScurryWin32, } from 'path-scurry';
import { fileURLToPath } from 'node:url';
import { Pattern } from './pattern.js';

@@ -41,2 +41,3 @@ import { GlobStream, GlobWalker } from './walker.js';

withFileTypes;
includeChildMatches;
/**

@@ -87,2 +88,3 @@ * The options provided to the constructor.

this.absolute = opts.absolute;
this.includeChildMatches = opts.includeChildMatches !== false;
this.noglobstar = !!opts.noglobstar;

@@ -102,3 +104,4 @@ this.matchBase = !!opts.matchBase;

!!opts.windowsPathsNoEscape ||
opts.allowWindowsEscape === false;
opts.allowWindowsEscape ===
false;
if (this.windowsPathsNoEscape) {

@@ -186,2 +189,3 @@ pattern = pattern.map(p => p.replace(/\\/g, '/'));

nocase: this.nocase,
includeChildMatches: this.includeChildMatches,
}).walk()),

@@ -199,2 +203,3 @@ ];

nocase: this.nocase,
includeChildMatches: this.includeChildMatches,
}).walkSync(),

@@ -211,2 +216,3 @@ ];

nocase: this.nocase,
includeChildMatches: this.includeChildMatches,
}).stream();

@@ -222,2 +228,3 @@ }

nocase: this.nocase,
includeChildMatches: this.includeChildMatches,
}).streamSync();

@@ -224,0 +231,0 @@ }

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

import { Minimatch } from 'minimatch';
/// <reference types="node" resolution-mode="require"/>
import { Minimatch, MinimatchOptions } from 'minimatch';
import { Path } from 'path-scurry';

@@ -7,2 +8,3 @@ import { GlobWalkerOpts } from './walker.js';

childrenIgnored?: (p: Path) => boolean;
add?: (ignore: string) => void;
}

@@ -17,3 +19,6 @@ /**

absoluteChildren: Minimatch[];
platform: NodeJS.Platform;
mmopts: MinimatchOptions;
constructor(ignored: string[], { nobrace, nocase, noext, noglobstar, platform, }: GlobWalkerOpts);
add(ign: string): void;
ignored(p: Path): boolean;

@@ -20,0 +25,0 @@ childrenIgnored(p: Path): boolean;

@@ -20,2 +20,4 @@ // give it a pattern, and it'll be able to tell you if

absoluteChildren;
platform;
mmopts;
constructor(ignored, { nobrace, nocase, noext, noglobstar, platform = defaultPlatform, }) {

@@ -26,3 +28,4 @@ this.relative = [];

this.absoluteChildren = [];
const mmopts = {
this.platform = platform;
this.mmopts = {
dot: true,

@@ -38,2 +41,6 @@ nobrace,

};
for (const ign of ignored)
this.add(ign);
}
add(ign) {
// this is a little weird, but it gives us a clean set of optimized

@@ -51,32 +58,30 @@ // minimatch matchers, without getting tripped up if one of them

// a cwd option, and do the right thing.
for (const ign of ignored) {
const mm = new Minimatch(ign, mmopts);
for (let i = 0; i < mm.set.length; i++) {
const parsed = mm.set[i];
const globParts = mm.globParts[i];
/* c8 ignore start */
if (!parsed || !globParts) {
throw new Error('invalid pattern object');
}
// strip off leading ./ portions
// https://github.com/isaacs/node-glob/issues/570
while (parsed[0] === '.' && globParts[0] === '.') {
parsed.shift();
globParts.shift();
}
/* c8 ignore stop */
const p = new Pattern(parsed, globParts, 0, platform);
const m = new Minimatch(p.globString(), mmopts);
const children = globParts[globParts.length - 1] === '**';
const absolute = p.isAbsolute();
const mm = new Minimatch(ign, this.mmopts);
for (let i = 0; i < mm.set.length; i++) {
const parsed = mm.set[i];
const globParts = mm.globParts[i];
/* c8 ignore start */
if (!parsed || !globParts) {
throw new Error('invalid pattern object');
}
// strip off leading ./ portions
// https://github.com/isaacs/node-glob/issues/570
while (parsed[0] === '.' && globParts[0] === '.') {
parsed.shift();
globParts.shift();
}
/* c8 ignore stop */
const p = new Pattern(parsed, globParts, 0, this.platform);
const m = new Minimatch(p.globString(), this.mmopts);
const children = globParts[globParts.length - 1] === '**';
const absolute = p.isAbsolute();
if (absolute)
this.absolute.push(m);
else
this.relative.push(m);
if (children) {
if (absolute)
this.absolute.push(m);
this.absoluteChildren.push(m);
else
this.relative.push(m);
if (children) {
if (absolute)
this.absoluteChildren.push(m);
else
this.relativeChildren.push(m);
}
this.relativeChildren.push(m);
}

@@ -83,0 +88,0 @@ }

@@ -37,2 +37,3 @@ /// <reference types="node" resolution-mode="require"/>

withFileTypes?: boolean;
includeChildMatches?: boolean;
}

@@ -50,3 +51,3 @@ export type GWOFileTypesTrue = GlobWalkerOpts & {

export type Matches<O extends GlobWalkerOpts> = O extends GWOFileTypesTrue ? Set<Path> : O extends GWOFileTypesFalse ? Set<string> : O extends GWOFileTypesUnset ? Set<string> : Set<Path | string>;
export type MatchStream<O extends GlobWalkerOpts> = O extends GWOFileTypesTrue ? Minipass<Path, Path> : O extends GWOFileTypesFalse ? Minipass<string, string> : O extends GWOFileTypesUnset ? Minipass<string, string> : Minipass<Path | string, Path | string>;
export type MatchStream<O extends GlobWalkerOpts> = Minipass<Result<O>, Result<O>>;
/**

@@ -65,2 +66,3 @@ * basic walking utilities that all the glob walker types use

maxDepth: number;
includeChildMatches: boolean;
constructor(patterns: Pattern[], path: Path, opts: O);

@@ -86,10 +88,10 @@ pause(): void;

export declare class GlobWalker<O extends GlobWalkerOpts = GlobWalkerOpts> extends GlobUtil<O> {
matches: O extends GWOFileTypesTrue ? Set<Path> : O extends GWOFileTypesFalse ? Set<string> : O extends GWOFileTypesUnset ? Set<string> : Set<Path | string>;
matches: Set<Result<O>>;
constructor(patterns: Pattern[], path: Path, opts: O);
matchEmit(e: Result<O>): void;
walk(): Promise<Matches<O>>;
walkSync(): Matches<O>;
walk(): Promise<Set<Result<O>>>;
walkSync(): Set<Result<O>>;
}
export declare class GlobStream<O extends GlobWalkerOpts = GlobWalkerOpts> extends GlobUtil<O> {
results: O extends GWOFileTypesTrue ? Minipass<Path, Path> : O extends GWOFileTypesFalse ? Minipass<string, string> : O extends GWOFileTypesUnset ? Minipass<string, string> : Minipass<Path | string, Path | string>;
results: Minipass<Result<O>, Result<O>>;
constructor(patterns: Pattern[], path: Path, opts: O);

@@ -96,0 +98,0 @@ matchEmit(e: Result<O>): void;

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

maxDepth;
includeChildMatches;
constructor(patterns, path, opts) {

@@ -36,4 +37,10 @@ this.patterns = patterns;

this.#sep = !opts.posix && opts.platform === 'win32' ? '\\' : '/';
if (opts.ignore) {
this.#ignore = makeIgnore(opts.ignore, opts);
this.includeChildMatches = opts.includeChildMatches !== false;
if (opts.ignore || !this.includeChildMatches) {
this.#ignore = makeIgnore(opts.ignore ?? [], opts);
if (!this.includeChildMatches &&
typeof this.#ignore.add !== 'function') {
const m = 'cannot ignore child matches, ignore lacks add() method.';
throw new Error(m);
}
}

@@ -145,2 +152,7 @@ // ignore, always set with maxDepth, but it's optional on the

return;
// we know we have an ignore if this is false, but TS doesn't
if (!this.includeChildMatches && this.#ignore?.add) {
const ign = `${e.relativePosix()}/**`;
this.#ignore.add(ign);
}
const abs = this.opts.absolute === undefined ? absolute : this.opts.absolute;

@@ -299,6 +311,5 @@ this.seen.add(e);

export class GlobWalker extends GlobUtil {
matches;
matches = new Set();
constructor(patterns, path, opts) {
super(patterns, path, opts);
this.matches = new Set();
}

@@ -305,0 +316,0 @@ matchEmit(e) {

@@ -5,3 +5,3 @@ {

"description": "the most correct and second fastest glob implementation in JavaScript",
"version": "10.3.16",
"version": "10.4.0",
"type": "module",

@@ -72,5 +72,5 @@ "tshy": {

"jackspeak": "^3.1.2",
"minimatch": "^9.0.1",
"minipass": "^7.0.4",
"path-scurry": "^1.11.0"
"minimatch": "^9.0.4",
"minipass": "^7.1.2",
"path-scurry": "^1.11.1"
},

@@ -82,9 +82,7 @@ "devDependencies": {

"prettier": "^2.8.3",
"rimraf": "^5.0.1",
"rimraf": "^5.0.7",
"sync-content": "^1.0.2",
"tap": "^18.7.2",
"ts-node": "^10.9.2",
"tshy": "^1.12.0",
"typedoc": "^0.25.12",
"typescript": "^5.2.2"
"tap": "^19.0.0",
"tshy": "^1.14.0",
"typedoc": "^0.25.12"
},

@@ -91,0 +89,0 @@ "tap": {

@@ -596,2 +596,44 @@ # Glob

- `includeChildMatches` boolean, default `true`. Do not match any
children of any matches. For example, the pattern `**\/foo`
would match `a/foo`, but not `a/foo/b/foo` in this mode.
This is especially useful for cases like "find all
`node_modules` folders, but not the ones in `node_modules`".
In order to support this, the `Ignore` implementation must
support an `add(pattern: string)` method. If using the default
`Ignore` class, then this is fine, but if this is set to
`false`, and a custom `Ignore` is provided that does not have
an `add()` method, then it will throw an error.
**Caveat** It *only* ignores matches that would be a descendant
of a previous match, and only if that descendant is matched
*after* the ancestor is encountered. Since the file system walk
happens in indeterminate order, it's possible that a match will
already be added before its ancestor, if multiple or braced
patterns are used.
For example:
```js
const results = await glob([
// likely to match first, since it's just a stat
'a/b/c/d/e/f',
// this pattern is more complicated! It must to various readdir()
// calls and test the results against a regular expression, and that
// is certainly going to take a little bit longer.
//
// So, later on, it encounters a match at 'a/b/c/d/e', but it's too
// late to ignore a/b/c/d/e/f, because it's already been emitted.
'a/[bdf]/?/[a-z]/*',
], { includeChildMatches: false })
```
It's best to only set this to `false` if you can be reasonably
sure that no components of the pattern will potentially match
one another's file system descendants, or if the occasional
included child entry will not cause problems.
## Glob Primer

@@ -598,0 +640,0 @@

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