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

pshregistry-parser

Package Overview
Dependencies
Maintainers
1
Versions
18
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

pshregistry-parser - npm Package Compare versions

Comparing version 1.1.1 to 1.2.0

6

CHANGELOG.md

@@ -8,2 +8,8 @@ # Changelog

## [1.2.0] - 2020-12-10
### Removed
- The `mysql` type is removed from `additionalTypes` in `registry-parser.js`, which means example config file snippets will not be generated automatically from the `mariadb` type object in a registry file source. A separate `mysql` object is required in that registry file to produce configuration snippets. Related: the `mysql` type has been added to a `ignoreTypesInTable` variable, which keeps duplicate images with differing supported versions from both showing up in the supported table (since they point to the same page in docs anyway).
## [1.1.1] - 2019-10-11

@@ -10,0 +16,0 @@

24

lib/images.js

@@ -5,2 +5,14 @@ 'use strict';

/**
* Utility method to get the value of a nested object key that may not exist.
*
* @param obj
* The object to read.
* @param args
* A variadic list of the properties to traverse.
* @return {*}
*/
function getNested(obj, ...args) {
return args.reduce((obj, level) => obj && obj[level], obj);
}

@@ -74,6 +86,6 @@ /**

makeDataAccessibleAsProperties(data) {
for(let dataProperty in data){
if (dataProperty == "versions") {
this["supported"] = data.versions.supported;
this["deprecated"] = data.versions.deprecated;
for(let dataProperty in data) {
if (dataProperty === "versions") {
this["supported"] = getNested(data, "versions", "supported") || {};
this["deprecated"] = getNested(data, "versions", "deprecated") || {};
} else {

@@ -96,3 +108,3 @@ this[dataProperty] = data[dataProperty];

// Only build the string if the Image contains versions for the lifecycle.
if (this[lifecycle].length != 0) {
if (this[lifecycle].length !== 0) {
unorderedList += "<ul>";

@@ -118,3 +130,3 @@ for(let version of this[lifecycle]) {

// Only build the string if the Image contains versions for the lifecycle.
if (this[lifecycle].length != 0) {
if (this[lifecycle].length !== 0) {
fullString += this[lifecycle].join(", ");

@@ -121,0 +133,0 @@ }

@@ -70,8 +70,2 @@ 'use strict';

this.additionalTypes = {
"mysql": {
"baseImage": "mariadb",
"diff": {
"type": "mysql"
}
},
"redis-persistent": {

@@ -92,2 +86,6 @@ "baseImage": "redis",

this.ignoreTypesInTable = {
"mysql": true
};
this.saveLocations = this.deriveSaveLocations(saveDir, registrySource);

@@ -245,18 +243,18 @@

fs.mkdirSync(saveDir);
};
}
if (!fs.existsSync(saveDir + 'examples/')){
fs.mkdirSync(saveDir + 'examples/');
};
}
if (!fs.existsSync(saveDir + 'examples/commented/')){
fs.mkdirSync(saveDir + 'examples/commented/');
};
}
if (!fs.existsSync(saveDir + 'examples/full/')){
fs.mkdirSync(saveDir + 'examples/full/');
};
}
if (!fs.existsSync(saveDir + 'examples/snippet/')){
fs.mkdirSync(saveDir + 'examples/snippet/');
};
}
if (!fs.existsSync(saveDir.split('/').slice(0, -1).join('/') + "/" + 'tables/')){
fs.mkdirSync(saveDir.split('/').slice(0, -1).join('/') + "/" + 'tables/');
};
}
}

@@ -317,5 +315,5 @@

let table = "";
if (imageGroup == "runtimes") {
if (imageGroup === "runtimes") {
table += "| **Language** | **`runtime`** | **Supported `version`** |";
} else if (imageGroup == "services") {
} else if (imageGroup === "services") {
table += "| **Service** | **`type`** | **Supported `version`** |";

@@ -330,2 +328,4 @@ }

.filter(image => !(Object.keys(this.additionalTypes).includes(image)))
// Filter out types where versions do not match (mysql/mariadb).
.filter(image => !(Object.keys(this.ignoreTypesInTable).includes(image)))
// Sort alphabetically by type.

@@ -370,3 +370,3 @@ .sort()

// Handle app subkey yaml file names.
if (majorConfig != "app" && majorConfig != "services" && majorConfig != "routes") {
if (majorConfig !== "app" && majorConfig !== "services" && majorConfig !== "routes") {
filename = `${image.type}.${majorConfig}.app.yaml`;

@@ -392,3 +392,3 @@ // Handle all other main app and services yaml file names.

write(currentImage) {
if (currentImage == undefined) {
if (currentImage === undefined) {
for (let image in this.images) {

@@ -395,0 +395,0 @@ this.write(image);

{
"name": "pshregistry-parser",
"version": "1.1.1",
"version": "1.2.0",
"description": "Helper for library for accessing image data from the Platform.sh Registry and generating configuration files.",

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

@@ -5,2 +5,14 @@ 'use strict';

/**
* Utility method to get the value of a nested object key that may not exist.
*
* @param obj
* The object to read.
* @param args
* A variadic list of the properties to traverse.
* @return {*}
*/
function getNested(obj, ...args) {
return args.reduce((obj, level) => obj && obj[level], obj);
}

@@ -74,6 +86,6 @@ /**

makeDataAccessibleAsProperties(data) {
for(let dataProperty in data){
if (dataProperty == "versions") {
this["supported"] = data.versions.supported;
this["deprecated"] = data.versions.deprecated;
for(let dataProperty in data) {
if (dataProperty === "versions") {
this["supported"] = getNested(data, "versions", "supported") || {};
this["deprecated"] = getNested(data, "versions", "deprecated") || {};
} else {

@@ -96,3 +108,3 @@ this[dataProperty] = data[dataProperty];

// Only build the string if the Image contains versions for the lifecycle.
if (this[lifecycle].length != 0) {
if (this[lifecycle].length !== 0) {
unorderedList += "<ul>";

@@ -118,3 +130,3 @@ for(let version of this[lifecycle]) {

// Only build the string if the Image contains versions for the lifecycle.
if (this[lifecycle].length != 0) {
if (this[lifecycle].length !== 0) {
fullString += this[lifecycle].join(", ");

@@ -121,0 +133,0 @@ }

@@ -70,8 +70,2 @@ 'use strict';

this.additionalTypes = {
"mysql": {
"baseImage": "mariadb",
"diff": {
"type": "mysql"
}
},
"redis-persistent": {

@@ -92,2 +86,6 @@ "baseImage": "redis",

this.ignoreTypesInTable = {
"mysql": true
};
this.saveLocations = this.deriveSaveLocations(saveDir, registrySource);

@@ -245,18 +243,18 @@

fs.mkdirSync(saveDir);
};
}
if (!fs.existsSync(saveDir + 'examples/')){
fs.mkdirSync(saveDir + 'examples/');
};
}
if (!fs.existsSync(saveDir + 'examples/commented/')){
fs.mkdirSync(saveDir + 'examples/commented/');
};
}
if (!fs.existsSync(saveDir + 'examples/full/')){
fs.mkdirSync(saveDir + 'examples/full/');
};
}
if (!fs.existsSync(saveDir + 'examples/snippet/')){
fs.mkdirSync(saveDir + 'examples/snippet/');
};
}
if (!fs.existsSync(saveDir.split('/').slice(0, -1).join('/') + "/" + 'tables/')){
fs.mkdirSync(saveDir.split('/').slice(0, -1).join('/') + "/" + 'tables/');
};
}
}

@@ -317,5 +315,5 @@

let table = "";
if (imageGroup == "runtimes") {
if (imageGroup === "runtimes") {
table += "| **Language** | **`runtime`** | **Supported `version`** |";
} else if (imageGroup == "services") {
} else if (imageGroup === "services") {
table += "| **Service** | **`type`** | **Supported `version`** |";

@@ -330,2 +328,4 @@ }

.filter(image => !(Object.keys(this.additionalTypes).includes(image)))
// Filter out types where versions do not match (mysql/mariadb).
.filter(image => !(Object.keys(this.ignoreTypesInTable).includes(image)))
// Sort alphabetically by type.

@@ -370,3 +370,3 @@ .sort()

// Handle app subkey yaml file names.
if (majorConfig != "app" && majorConfig != "services" && majorConfig != "routes") {
if (majorConfig !== "app" && majorConfig !== "services" && majorConfig !== "routes") {
filename = `${image.type}.${majorConfig}.app.yaml`;

@@ -392,3 +392,3 @@ // Handle all other main app and services yaml file names.

write(currentImage) {
if (currentImage == undefined) {
if (currentImage === undefined) {
for (let image in this.images) {

@@ -395,0 +395,0 @@ this.write(image);

@@ -12,3 +12,3 @@ 'use strict';

let registrySource = "test/testdata/valid.json";
let registry = new psh.RegistryParser(registrySource);
let registry = new psh.RegistryParser(registrySource, 'test/');
registry.write();

@@ -43,3 +43,3 @@ done();

let registry = new psh.RegistryParser(registrySource);
assert.equal(Object.keys(registry.runtimes).length, 8);
assert.equal(Object.keys(registry.runtimes).length, 9);
assert.equal(Object.keys(registry.runtimes)[0], "dotnet");

@@ -78,10 +78,11 @@ });

|----------------------------------|---------------|-------------------------|
| [C#/.Net Core](/languages/dotnet.html) | \`dotnet\` | 2.0, 2.1, 2.2 |
| [Go](/languages/go.html) | \`golang\` | 1.11, 1.12, 1.13 |
| [C#/.Net Core](/languages/dotnet.html) | \`dotnet\` | 2.0, 2.1, 2.2, 3.1 |
| [Elixir](/languages/elixir.html) | \`elixir\` | 1.9 |
| [Go](/languages/go.html) | \`golang\` | 1.11, 1.12, 1.13, 1.14 |
| [Java](/languages/java.html) | \`java\` | 11, 12, 8, 13 |
| [Lisp](/languages/lisp.html) | \`lisp\` | 1.5 |
| [Node.js](/languages/nodejs.html) | \`nodejs\` | 6, 8, 10 |
| [PHP](/languages/php.html) | \`php\` | 7.1, 7.2, 7.3 |
| [Python](/languages/python.html) | \`python\` | 2.7, 3.5, 3.6, 3.7 |
| [Ruby](/languages/ruby.html) | \`ruby\` | 2.3, 2.4, 2.5, 2.6 |`.trim();
| [Node.js](/languages/nodejs.html) | \`nodejs\` | 6, 8, 10, 12 |
| [PHP](/languages/php.html) | \`php\` | 7.2, 7.3, 7.4 |
| [Python](/languages/python.html) | \`python\` | 2.7, 3.5, 3.6, 3.7, 3.8 |
| [Ruby](/languages/ruby.html) | \`ruby\` | 2.3, 2.4, 2.5, 2.6, 2.7 |`.trim();
assert.equal(registry.makeSupportedVersionsTable("runtimes"), expected);

@@ -99,12 +100,12 @@ });

| [InfluxDB](/configuration/services/influxdb.html) | \`influxdb\` | 1.2, 1.3, 1.7 |
| [Kafka](/configuration/services/kafka.html) | \`kafka\` | 2.1, 2.2 |
| [MariaDB](/configuration/services/mysql.html) | \`mariadb\` | 10.0, 10.1, 10.2, 10.3, 10.4 |
| [Memcached](/configuration/services/memcached.html) | \`memcached\` | 1.4 |
| [Kafka](/configuration/services/kafka.html) | \`kafka\` | 2.1, 2.2, 2.3, 2.4 |
| [MariaDB](/configuration/services/mysql.html) | \`mariadb\` | 10.0, 10.1, 10.2, 10.3, 10.4, 10.5 |
| [Memcached](/configuration/services/memcached.html) | \`memcached\` | 1.4, 1.5, 1.6 |
| [MongoDB](/configuration/services/mongodb.html) | \`mongodb\` | 3.0, 3.2, 3.4, 3.6 |
| [Network Storage](/configuration/services/network-storage.html) | \`network-storage\` | 1.0 |
| [Oracle MySQL](/configuration/services/mysql.html) | \`oracle-mysql\` | 5.7, 8.0 |
| [PostgreSQL](/configuration/services/postgresql.html) | \`postgresql\` | 9.6, 10, 11 |
| [RabbitMQ](/configuration/services/rabbitmq.html) | \`rabbitmq\` | 3.5, 3.6, 3.7 |
| [PostgreSQL](/configuration/services/postgresql.html) | \`postgresql\` | 9.6, 10, 11, 12 |
| [RabbitMQ](/configuration/services/rabbitmq.html) | \`rabbitmq\` | 3.5, 3.6, 3.7, 3.8 |
| [Redis](/configuration/services/redis.html) | \`redis\` | 3.2, 4.0, 5.0 |
| [Solr](/configuration/services/solr.html) | \`solr\` | 3.6, 4.1, 6.3, 6.6, 7.6, 7.7, 8.0 |
| [Solr](/configuration/services/solr.html) | \`solr\` | 3.6, 4.1, 6.3, 6.6, 7.6, 7.7, 8.0, 8.4 |
| [Varnish](/configuration/services/varnish.html) | \`varnish\` | 5.6, 6.0 |`.trim();

@@ -242,3 +243,3 @@ assert.equal(registry.makeSupportedVersionsTable("services"), expected);

let registry = new psh.RegistryParser(registrySource);
assert.equal(registry.images["golang"].deprecatedString, "1.1, 1.8, 1.9");
assert.equal(registry.images["golang"].deprecatedString, "1.10, 1.8, 1.9");
});

@@ -255,3 +256,3 @@

let registry = new psh.RegistryParser(registrySource);
assert.equal(registry.images["golang"].deprecatedHTML, "<ul><li>1.1</li><li>1.8</li><li>1.9</li></ul>");
assert.equal(registry.images["golang"].deprecatedHTML, "<ul><li>1.10</li><li>1.8</li><li>1.9</li></ul>");
});

@@ -269,7 +270,7 @@ })

it('Test recommended Go version is 1.13', function() {
it('Test recommended Go version is 1.14', function() {
let registrySource = "test/testdata/valid.json";
let registry = new psh.RegistryParser(registrySource);
assert.equal(registry.images["golang"].recommended, "1.13");
assert.equal(registry.runtimes["golang"].recommended, "1.13");
assert.equal(registry.images["golang"].recommended, "1.14");
assert.equal(registry.runtimes["golang"].recommended, "1.14");
});

@@ -345,3 +346,3 @@

# to find the supported versions for the 'golang' type.
type: 'golang:1.13'`;
type: 'golang:1.14'`;
assert.equal(expected, registry.images["golang"].config.app.commented);

@@ -348,0 +349,0 @@ assert.equal(expected, fs.readFileSync('test/testdata/examples/commented/golang.app.yaml', 'utf8'))

@@ -8,3 +8,3 @@ {

"service_name": "headlessbrowser",
"url": "\/configuration\/services\/headless-chrome.html"
"url": "/configuration/services/headless-chrome.html"
},

@@ -18,5 +18,3 @@ "endpoint": "http",

"versions": {
"deprecated": [
],
"deprecated": [],
"supported": [

@@ -34,3 +32,3 @@ "73"

"service_name": null,
"url": "\/languages\/dotnet.html",
"url": "/languages/dotnet.html",
"web": {

@@ -41,3 +39,3 @@ "commands": {

"locations": {
"\/": {
"/": {
"root": "\"wwwroot\"",

@@ -59,13 +57,12 @@ "allow": true,

"min_disk_size": null,
"name": "C#\/.Net Core",
"name": "C#/.Net Core",
"runtime": true,
"type": "dotnet",
"versions": {
"deprecated": [
],
"deprecated": [],
"supported": [
"2.0",
"2.1",
"2.2"
"2.2",
"3.1"
]

@@ -80,3 +77,3 @@ }

"service_name": "searchelastic",
"url": "\/configuration\/services\/elasticsearch.html"
"url": "/configuration/services/elasticsearch.html"
},

@@ -104,2 +101,44 @@ "endpoint": "elasticsearch",

},
"elixir": {
"description": "",
"repo_name": "elixir",
"disk": false,
"docs": {
"relationship_name": null,
"service_name": null,
"url": "/languages/elixir.html",
"web": {
"commands": {
"start": "mix run --no-halt"
},
"locations": {
"/": {
"allow": false,
"root": "\"web\"",
"passthru": true
}
}
},
"hooks": {
"build": [
"|",
"mix local.hex --force",
"mix local.rebar --force",
"mix do deps.get --only prod, deps.compile, compile"
]
}
},
"endpoint": null,
"min_disk_size": null,
"name": "Elixir",
"runtime": true,
"type": "elixir",
"versions": {
"deprecated": [],
"supported": [
"1.9"
]
}
},
"golang": {

@@ -111,3 +150,3 @@ "description": "",

"service_name": null,
"url": "\/languages\/go.html",
"url": "/languages/go.html",
"web": {

@@ -119,6 +158,6 @@ "upstream": {

"commands": {
"start": ".\/bin\/app"
"start": "./bin/app"
},
"locations": {
"\/": {
"/": {
"allow": false,

@@ -131,3 +170,3 @@ "passthru": true

"build": [
"go build -o bin\/app"
"go build -o bin/app"
]

@@ -144,3 +183,3 @@ }

"deprecated": [
"1.1",
"1.10",
"1.8",

@@ -152,3 +191,4 @@ "1.9"

"1.12",
"1.13"
"1.13",
"1.14"
]

@@ -163,3 +203,3 @@ }

"service_name": "timedb",
"url": "\/configuration\/services\/influxdb.html"
"url": "/configuration/services/influxdb.html"
},

@@ -173,5 +213,3 @@ "endpoint": "influxdb",

"versions": {
"deprecated": [
],
"deprecated": [],
"supported": [

@@ -189,6 +227,6 @@ "1.2",

"service_name": null,
"url": "\/languages\/java.html",
"url": "/languages/java.html",
"web": {
"commands": {
"start": "java -jar target\/application.jar --server.port=$PORT"
"start": "java -jar target/application.jar --server.port=$PORT"
}

@@ -209,5 +247,3 @@ },

"versions": {
"deprecated": [
],
"deprecated": [],
"supported": [

@@ -227,3 +263,3 @@ "11",

"service_name": "queuekafka",
"url": "\/configuration\/services\/kafka.html"
"url": "/configuration/services/kafka.html"
},

@@ -237,8 +273,8 @@ "endpoint": "kafka",

"versions": {
"deprecated": [
],
"deprecated": [],
"supported": [
"2.1",
"2.2"
"2.2",
"2.3",
"2.4"
]

@@ -255,9 +291,9 @@ }

"service_name": null,
"url": "\/languages\/lisp.html",
"url": "/languages/lisp.html",
"web": {
"commands": {
"start": ".\/example"
"start": "./example"
},
"locations": {
"\/": {
"/": {
"allow": false,

@@ -275,5 +311,3 @@ "passthru": true

"versions": {
"deprecated": [
],
"deprecated": [],
"supported": [

@@ -291,3 +325,3 @@ "1.5"

"service_name": "db",
"url": "\/configuration\/services\/mysql.html"
"url": "/configuration/services/mysql.html"
},

@@ -308,2 +342,30 @@ "endpoint": "mysql",

"10.3",
"10.4",
"10.5"
]
}
},
"mysql": {
"description": "A manufacture-based container for MariaDB",
"repo_name": "mariadb",
"disk": true,
"docs": {
"relationship_name": "database",
"service_name": "db",
"url": "/configuration/services/mysql.html"
},
"endpoint": "mysql",
"min_disk_size": 256,
"name": "MariaDB",
"runtime": false,
"type": "mysql",
"versions": {
"deprecated": [
"5.5"
],
"supported": [
"10.0",
"10.1",
"10.2",
"10.3",
"10.4"

@@ -320,3 +382,3 @@ ]

"service_name": "cachemc",
"url": "\/configuration\/services\/memcached.html"
"url": "/configuration/services/memcached.html"
},

@@ -329,7 +391,7 @@ "endpoint": "memcached",

"versions": {
"deprecated": [
],
"deprecated": [],
"supported": [
"1.4"
"1.4",
"1.5",
"1.6"
]

@@ -343,5 +405,5 @@ }

"docs": {
"relationship_name": "database",
"relationship_name": "mongodatabase",
"service_name": "dbmongo",
"url": "\/configuration\/services\/mongodb.html"
"url": "/configuration/services/mongodb.html"
},

@@ -354,5 +416,3 @@ "endpoint": "mongodb",

"versions": {
"deprecated": [
],
"deprecated": [],
"supported": [

@@ -373,3 +433,3 @@ "3.0",

"service_name": "files",
"url": "\/configuration\/services\/network-storage.html"
"url": "/configuration/services/network-storage.html"
},

@@ -382,5 +442,3 @@ "endpoint": "something",

"versions": {
"deprecated": [
],
"deprecated": [],
"supported": [

@@ -398,3 +456,3 @@ "1.0"

"service_name": null,
"url": "\/languages\/nodejs.html",
"url": "/languages/nodejs.html",
"web": {

@@ -423,3 +481,4 @@ "commands": {

"8",
"10"
"10",
"12"
]

@@ -435,3 +494,3 @@ }

"service_name": "dbmysql",
"url": "\/configuration\/services\/mysql.html"
"url": "/configuration/services/mysql.html"
},

@@ -444,5 +503,3 @@ "endpoint": "mysql",

"versions": {
"deprecated": [
],
"deprecated": [],
"supported": [

@@ -461,8 +518,8 @@ "5.7",

"service_name": null,
"url": "\/languages\/php.html",
"url": "/languages/php.html",
"web": {
"locations": {
"\/": {
"/": {
"root": "\"web\"",
"passthru": "\/index.php"
"passthru": "/index.php"
}

@@ -495,8 +552,9 @@ }

"5.6",
"7.0"
"7.0",
"7.1"
],
"supported": [
"7.1",
"7.2",
"7.3"
"7.3",
"7.4"
]

@@ -512,3 +570,3 @@ }

"service_name": "dbpostgres",
"url": "\/configuration\/services\/postgresql.html"
"url": "/configuration/services/postgresql.html"
},

@@ -522,3 +580,3 @@ "endpoint": "postgresql",

"deprecated": [
"9.3"
],

@@ -528,3 +586,4 @@ "supported": [

"10",
"11"
"11",
"12"
]

@@ -540,3 +599,3 @@ }

"service_name": null,
"url": "\/languages\/python.html",
"url": "/languages/python.html",
"web": {

@@ -565,5 +624,3 @@ "commands": {

"versions": {
"deprecated": [
],
"deprecated": [],
"supported": [

@@ -573,3 +630,4 @@ "2.7",

"3.6",
"3.7"
"3.7",
"3.8"
]

@@ -585,3 +643,3 @@ }

"service_name": "queuerabbit",
"url": "\/configuration\/services\/rabbitmq.html"
"url": "/configuration/services/rabbitmq.html"
},

@@ -594,9 +652,8 @@ "endpoint": "rabbitmq",

"versions": {
"deprecated": [
],
"deprecated": [],
"supported": [
"3.5",
"3.6",
"3.7"
"3.7",
"3.8"
]

@@ -612,3 +669,3 @@ }

"service_name": "cacheredis",
"url": "\/configuration\/services\/redis.html"
"url": "/configuration/services/redis.html"
},

@@ -639,3 +696,3 @@ "endpoint": "redis",

"service_name": null,
"url": "\/languages\/ruby.html",
"url": "/languages/ruby.html",
"web": {

@@ -649,3 +706,3 @@ "upstream": {

"locations": {
"\/": {
"/": {
"root": "\"public\"",

@@ -675,5 +732,3 @@ "passthru": true,

"versions": {
"deprecated": [
],
"deprecated": [],
"supported": [

@@ -683,3 +738,4 @@ "2.3",

"2.5",
"2.6"
"2.6",
"2.7"
]

@@ -695,3 +751,3 @@ }

"service_name": "searchsolr",
"url": "\/configuration\/services\/solr.html"
"url": "/configuration/services/solr.html"
},

@@ -704,5 +760,3 @@ "endpoint": "solr",

"versions": {
"deprecated": [
],
"deprecated": [],
"supported": [

@@ -715,3 +769,4 @@ "3.6",

"7.7",
"8.0"
"8.0",
"8.4"
]

@@ -727,3 +782,3 @@ }

"service_name": "proxy",
"url": "\/configuration\/services\/varnish.html"
"url": "/configuration/services/varnish.html"
},

@@ -736,5 +791,3 @@ "endpoint": "http+stats",

"versions": {
"deprecated": [
],
"deprecated": [],
"supported": [

@@ -741,0 +794,0 @@ "5.6",

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