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

eslint-plugin-userscripts

Package Overview
Dependencies
Maintainers
1
Versions
29
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

eslint-plugin-userscripts - npm Package Compare versions

Comparing version 0.5.0 to 0.5.1

1254

dist/index.d.ts

@@ -1,1255 +0,5 @@

import * as estree from 'estree';
import * as eslint from 'eslint';
import * as json_schema from 'json-schema';
import { Rule } from 'eslint';
declare const rules: {
[k: string]: {
meta: {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: {
type: "integer";
minimum: number;
default: number;
}[];
messages: {
spaceMetadata: string;
};
fixable: "code";
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: json_schema.JSONSchema4 | json_schema.JSONSchema4[] | undefined;
messages: {
missingAttribute: string;
};
fixable: "code" | undefined;
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: {
enum: string[];
}[];
messages: {
filenameExtension: string;
};
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
fixable: "whitespace";
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
messages: {
metadataRequired: string;
moveMetadataToTop: string;
noClosingMetadata: string;
noCodeBetween: string;
attributeNotStartsWithAtTheRate: string;
};
schema: {
type: "object";
properties: {
top: {
enum: string[];
default: string;
};
};
additionalProperties: false;
}[];
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
messages: {
attributeNotPrefixedBySpace: string;
};
schema: never[];
};
create: (context: eslint.Rule.RuleContext) => {};
} | {
meta: {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: {
type: "integer";
minimum: number;
default: number;
}[];
messages: {
spaceMetadata: string;
};
fixable: "code";
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: json_schema.JSONSchema4 | json_schema.JSONSchema4[] | undefined;
messages: {
missingAttribute: string;
};
fixable: "code" | undefined;
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: {
enum: string[];
}[];
messages: {
filenameExtension: string;
};
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
fixable: "whitespace";
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
messages: {
metadataRequired: string;
moveMetadataToTop: string;
noClosingMetadata: string;
noCodeBetween: string;
attributeNotStartsWithAtTheRate: string;
};
schema: {
type: "object";
properties: {
top: {
enum: string[];
default: string;
};
};
additionalProperties: false;
}[];
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
messages: {
attributeNotPrefixedBySpace: string;
};
schema: never[];
};
create: (context: eslint.Rule.RuleContext) => {};
} | {
meta: {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: {
type: "integer";
minimum: number;
default: number;
}[];
messages: {
spaceMetadata: string;
};
fixable: "code";
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: json_schema.JSONSchema4 | json_schema.JSONSchema4[] | undefined;
messages: {
missingAttribute: string;
};
fixable: "code" | undefined;
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: {
enum: string[];
}[];
messages: {
filenameExtension: string;
};
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
fixable: "whitespace";
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
messages: {
metadataRequired: string;
moveMetadataToTop: string;
noClosingMetadata: string;
noCodeBetween: string;
attributeNotStartsWithAtTheRate: string;
};
schema: {
type: "object";
properties: {
top: {
enum: string[];
default: string;
};
};
additionalProperties: false;
}[];
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
messages: {
attributeNotPrefixedBySpace: string;
};
schema: never[];
};
create: (context: eslint.Rule.RuleContext) => {
Program?: undefined;
} | {
Program(): void;
};
} | {
meta: {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: {
type: "integer";
minimum: number;
default: number;
}[];
messages: {
spaceMetadata: string;
};
fixable: "code";
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: json_schema.JSONSchema4 | json_schema.JSONSchema4[] | undefined;
messages: {
missingAttribute: string;
};
fixable: "code" | undefined;
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: {
enum: string[];
}[];
messages: {
filenameExtension: string;
};
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
fixable: "whitespace";
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
messages: {
metadataRequired: string;
moveMetadataToTop: string;
noClosingMetadata: string;
noCodeBetween: string;
attributeNotStartsWithAtTheRate: string;
};
schema: {
type: "object";
properties: {
top: {
enum: string[];
default: string;
};
};
additionalProperties: false;
}[];
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
messages: {
attributeNotPrefixedBySpace: string;
};
schema: never[];
};
create: (context: eslint.Rule.RuleContext) => {};
} | {
meta: {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: {
type: "integer";
minimum: number;
default: number;
}[];
messages: {
spaceMetadata: string;
};
fixable: "code";
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: json_schema.JSONSchema4 | json_schema.JSONSchema4[] | undefined;
messages: {
missingAttribute: string;
};
fixable: "code" | undefined;
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: {
enum: string[];
}[];
messages: {
filenameExtension: string;
};
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
fixable: "whitespace";
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
messages: {
metadataRequired: string;
moveMetadataToTop: string;
noClosingMetadata: string;
noCodeBetween: string;
attributeNotStartsWithAtTheRate: string;
};
schema: {
type: "object";
properties: {
top: {
enum: string[];
default: string;
};
};
additionalProperties: false;
}[];
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
messages: {
attributeNotPrefixedBySpace: string;
};
schema: never[];
};
create: (context: eslint.Rule.RuleContext) => {
Program(node: estree.Program): void;
};
} | {
meta: {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: {
type: "integer";
minimum: number;
default: number;
}[];
messages: {
spaceMetadata: string;
};
fixable: "code";
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: json_schema.JSONSchema4 | json_schema.JSONSchema4[] | undefined;
messages: {
missingAttribute: string;
};
fixable: "code" | undefined;
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
schema: {
enum: string[];
}[];
messages: {
filenameExtension: string;
};
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
fixable: "whitespace";
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
messages: {
metadataRequired: string;
moveMetadataToTop: string;
noClosingMetadata: string;
noCodeBetween: string;
attributeNotStartsWithAtTheRate: string;
};
schema: {
type: "object";
properties: {
top: {
enum: string[];
default: string;
};
};
additionalProperties: false;
}[];
} | {
docs: {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
} | {
url: string;
description: string;
category: string;
};
type: "suggestion";
messages: {
attributeNotPrefixedBySpace: string;
};
schema: never[];
};
create: (context: eslint.Rule.RuleContext) => {};
};
[k: string]: Rule.RuleModule;
};

@@ -1256,0 +6,0 @@ declare const configs: {

18

dist/index.js

@@ -68,15 +68,7 @@ "use strict";

}).map(([ruleName, ruleMeta]) => {
return [
ruleName,
{
...ruleMeta,
meta: {
...ruleMeta.meta,
docs: {
...ruleMeta.meta.docs,
url: `https://yash-singh1.github.io/eslint-plugin-userscripts/#/rules/${ruleName}`
}
}
}
];
var _a;
if ((_a = ruleMeta.meta) == null ? void 0 : _a.docs) {
ruleMeta.meta.docs.url = `https://yash-singh1.github.io/eslint-plugin-userscripts/#/rules/${ruleName}`;
}
return [ruleName, ruleMeta];
})

@@ -83,0 +75,0 @@ );

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

let end = null;
let maxLength = 0;
let minSpace = Number.POSITIVE_INFINITY;
for (const comment of comments) {

@@ -77,2 +79,4 @@ if (done || comment.type !== "Line" || !(0, import_comment.isNonNullishComment)(comment)) {

});
maxLength = Math.max(maxLength, metadata.at(-1).key.length);
minSpace = Math.min(minSpace, metadata.at(-1).space);
}

@@ -86,4 +90,4 @@ }

}
const totalSpacing = Math.max(...metadata.map(({ key }) => key.length)) + spacing;
const hasSpaceLessThenSpacing = metadata.map(({ space }) => space).sort()[0] < spacing;
const totalSpacing = maxLength + spacing;
const hasSpaceLessThenSpacing = minSpace < spacing;
if (start && end && (hasSpaceLessThenSpacing || metadata.some(({ key, space }) => key.length + space !== totalSpacing))) {

@@ -90,0 +94,0 @@ context.report({

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

var import_createValidator = require("../utils/createValidator");
const versionRegex = /^([\dA-Za-z–-]+)(\.[\dA-Za-z–-]+)*(\+([\dA-Za-z]+)(\.[\dA-Za-z]+)*)?\s*$/;
const versionRegex = /^(?=[\dA-Za-z–-]*\d[\dA-Za-z–-]*)[\dA-Za-z–-]+(\.[\dA-Za-z–-]+)*([+_]([\dA-Za-z-]+)(\.[\dA-Za-z-]+)*)?\.?\s*$/;
var require_version_default = (0, import_createValidator.createValidator)({

@@ -28,0 +28,0 @@ name: "version",

@@ -1,5 +0,6 @@

import { JSONSchema4 } from 'json-schema';
import { SourceLocation } from 'acorn';
import * as json_schema from 'json-schema';
import { SourceLocation } from './parse.js';
import { Rule } from 'eslint';
type JSONSchema4 = Rule.RuleMetaData['schema'];
type Metadata = {

@@ -54,3 +55,3 @@ comment: {

*/
schema?: JSONSchema4 | JSONSchema4[];
schema?: JSONSchema4;
}

@@ -109,3 +110,3 @@ interface OptionsRunOnce extends Options {

};
schema: JSONSchema4 | JSONSchema4[] | undefined;
schema: json_schema.JSONSchema4 | json_schema.JSONSchema4[] | undefined;
messages: {

@@ -116,5 +117,5 @@ missingAttribute: string;

};
create: (context: Rule.RuleContext) => {};
create: (context: Rule.RuleContext) => Record<string, never>;
};
export { type Metadata, createValidator };

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

}
const attributeValues = matchingMetadataKeyIndex.map((index) => metadata[metadataKeys[index]]).reduce(
(accumalator, metadataPart) => Array.isArray(metadataPart) ? [...accumalator, ...metadataPart] : [...accumalator, metadataPart],
[]
const attributeValues = matchingMetadataKeyIndex.flatMap(
(index) => metadata[metadataKeys[index]]
);

@@ -128,0 +127,0 @@ validator({

import { SourceCode } from 'eslint';
import { SourceLocation } from 'acorn';

@@ -12,2 +11,13 @@ interface Line {

}
interface SourceLocation {
source?: string | null;
start: Position;
end: Position;
}
interface Position {
/** 1-based */
line: number;
/** 0-based */
column: number;
}
interface ParsingResult {

@@ -43,2 +53,2 @@ /**

export { type ParsingResult, parse };
export { type ParsingResult, type Position, type SourceLocation, parse };

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

const isLineComment = trimmedLine.startsWith("//");
const commentContent = trimmedLine.slice(2).trim();
if (

@@ -67,3 +68,3 @@ // https://github.com/Yash-Singh1/eslint-plugin-userscripts/issues/8

});
} else if (inMetadata && isLineComment && trimmedLine.slice(2).trim() === "==/UserScript==") {
} else if (inMetadata && isLineComment && commentContent === "==/UserScript==") {
result.end = true;

@@ -77,3 +78,3 @@ done = true;

});
} else if (!inMetadata && isLineComment && trimmedLine.slice(2).trim() === "==UserScript==") {
} else if (!inMetadata && isLineComment && commentContent === "==UserScript==") {
result.enteredMetadata = index;

@@ -87,5 +88,5 @@ inMetadata = true;

});
} else if (inMetadata && isLineComment && trimmedLine.slice(2).trim() !== "") {
if (trimmedLine.slice(2).trim().startsWith("@")) {
const mainContent = trimmedLine.slice(2).trim().slice(1);
} else if (inMetadata && isLineComment && commentContent !== "") {
if (commentContent.startsWith("@")) {
const mainContent = commentContent.slice(1);
result.lines.push({

@@ -92,0 +93,0 @@ value: line,

{
"name": "eslint-plugin-userscripts",
"version": "0.5.0",
"version": "0.5.1",
"description": "Implements rules for userscripts metadata in eslint",

@@ -25,3 +25,2 @@ "keywords": [

"@typescript-eslint/parser": "^6.17.0",
"acorn": "^8.8.2",
"esbuild": "^0.19.11",

@@ -33,4 +32,5 @@ "esbuild-runner": "^2.2.2",

"eslint-plugin-import": "^2.27.5",
"eslint-plugin-unicorn": "^47.0.0",
"eslint-plugin-unicorn": "^50.0.1",
"husky": "^8.0.3",
"json-schema": "^0.4.0",
"live-server": "^1.2.2",

@@ -42,5 +42,3 @@ "markdownlint": "^0.32.1",

"prettier": "^3.1.1",
"prettier-plugin-jsdoc": "^1.3.0",
"should": "^13.2.3",
"ts-node": "^10.9.2",
"tsup": "^8.0.1",

@@ -65,9 +63,8 @@ "typescript": "^5.3.3"

"scripts": {
"test": "nyc --reporter=lcov --reporter=text mocha --recursive --file $(find tests -type f -name \"*.ts\") -r esbuild-runner/register",
"test": "mocha --recursive --file $(find tests -type f -name \"*.ts\") -r esbuild-runner/register",
"build": "tsup",
"type-check": "tsc --noEmit",
"lint": "eslint . --ignore-path .gitignore && prettier --check . --ignore-path .gitignore && markdownlint . --ignore-path .gitignore",
"lint:fix": "eslint . --ignore-path .gitignore --fix && prettier --write . --ignore-path .gitignore && markdownlint --fix . --ignore-path .gitignore",
"coverage": "live-server coverage/lcov-report"
"lint:fix": "eslint . --ignore-path .gitignore --fix && prettier --write . --ignore-path .gitignore && markdownlint --fix . --ignore-path .gitignore"
}
}
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