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

nocopyrightsounds-api

Package Overview
Dependencies
Maintainers
1
Versions
21
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

nocopyrightsounds-api - npm Package Compare versions

Comparing version 2.0.1 to 2.1.0

4

dist/cjs/helpers/SongCache.d.ts
import type Song from '../api/Song'
export declare type events = 'save' | 'ready'
export interface CacheOptions {
web: boolean
proxy_url: string
cache_path?: string

@@ -13,5 +11,3 @@ detailed_log?: boolean

protected path: string | undefined
protected proxy_url: string
protected detailed_log: boolean
protected web: boolean
protected is_ready: boolean

@@ -18,0 +14,0 @@ constructor(options: CacheOptions)

102

dist/cjs/helpers/SongCache.js

@@ -147,5 +147,10 @@ 'use strict'

}
var __importDefault =
(this && this.__importDefault) ||
function (mod) {
return mod && mod.__esModule ? mod : { default: mod }
}
Object.defineProperty(exports, '__esModule', { value: true })
var fs_1 = __importDefault(require('fs'))
var search_1 = require('../modules/search')
var web_1 = require('../modules/web')
var SongCache = /** @class */ (function () {

@@ -158,7 +163,4 @@ function SongCache(options) {

this.detailed_log = false
this.web = false
this.is_ready = false
this.web = options.web
this.path = options.cache_path
this.proxy_url = options.proxy_url
this.detailed_log =

@@ -174,6 +176,2 @@ (_a = options.detailed_log) !== null && _a !== void 0 ? _a : false

.then(function (status) {
if (!status && _this.web)
window.addEventListener('online', function () {
return _this.checkForNew()
})
_this.is_ready = true

@@ -186,28 +184,10 @@ _this.triggerEvent('ready')

return __awaiter(this, void 0, void 0, function () {
var rawSongs, fs, rawSongs
var rawSongs
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (this.path == undefined || this.path.trim() == '')
return [2 /*return*/]
if (!this.web) return [3 /*break*/, 1]
rawSongs = localStorage.getItem(this.path)
if (rawSongs) this.songs = JSON.parse(rawSongs)
return [3 /*break*/, 3]
case 1:
return [
4 /*yield*/,
Promise.resolve().then(function () {
return require('fs')
})
]
case 2:
fs = _a.sent()
if (!fs.existsSync(this.path)) return [2 /*return*/]
rawSongs = fs.readFileSync(this.path).toString()
this.songs = JSON.parse(rawSongs)
_a.label = 3
case 3:
return [2 /*return*/]
}
if (this.path == undefined || this.path.trim() == '')
return [2 /*return*/]
if (!fs_1.default.existsSync(this.path)) return [2 /*return*/]
rawSongs = fs_1.default.readFileSync(this.path).toString()
this.songs = JSON.parse(rawSongs)
return [2 /*return*/]
})

@@ -218,26 +198,8 @@ })

return __awaiter(this, void 0, void 0, function () {
var fs
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (this.path == undefined || this.path.trim() == '')
return [2 /*return*/]
if (!this.web) return [3 /*break*/, 1]
localStorage.setItem(this.path, JSON.stringify(this.songs))
return [3 /*break*/, 3]
case 1:
return [
4 /*yield*/,
Promise.resolve().then(function () {
return require('fs')
})
]
case 2:
fs = _a.sent()
fs.writeFileSync(this.path, JSON.stringify(this.songs))
_a.label = 3
case 3:
this.triggerEvent('save')
return [2 /*return*/]
}
if (this.path == undefined || this.path.trim() == '')
return [2 /*return*/]
fs_1.default.writeFileSync(this.path, JSON.stringify(this.songs))
this.triggerEvent('save')
return [2 /*return*/]
})

@@ -290,25 +252,15 @@ })

return __awaiter(this, void 0, void 0, function () {
var cp, appendCache, songs, _a, newSongs
var cp, appendCache, songs, newSongs
var _this = this
return __generator(this, function (_b) {
switch (_b.label) {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (this.web && !navigator.onLine) return [2 /*return*/, false]
cp = 1
appendCache = []
_b.label = 1
_a.label = 1
case 1:
if (!true) return [3 /*break*/, 6]
if (!this.web) return [3 /*break*/, 3]
return [4 /*yield*/, web_1.default.getSongs(this.proxy_url, cp)]
if (!true) return [3 /*break*/, 3]
return [4 /*yield*/, (0, search_1.search)({}, cp)]
case 2:
_a = _b.sent()
return [3 /*break*/, 5]
case 3:
return [4 /*yield*/, (0, search_1.search)({}, cp)]
case 4:
_a = _b.sent()
_b.label = 5
case 5:
songs = _a
songs = _a.sent()
newSongs = songs.filter(function (song) {

@@ -334,6 +286,6 @@ return !_this.songs.find(function (s) {

appendCache.push.apply(appendCache, newSongs)
if (newSongs.length == 0) return [3 /*break*/, 6]
if (newSongs.length == 0) return [3 /*break*/, 3]
cp++
return [3 /*break*/, 1]
case 6:
case 3:
this.addSongs.apply(this, appendCache)

@@ -340,0 +292,0 @@ if (this.detailed_log) console.log('finished refreshing song list')

export * from './modules/musiclist'
export * from './modules/search'
export * from './modules/artist'
export { default as web } from './modules/web'
export { default as Client } from './modules/Client'

@@ -6,0 +5,0 @@ export type { default as Song } from './api/Song'

@@ -7,8 +7,15 @@ 'use strict'

if (k2 === undefined) k2 = k
Object.defineProperty(o, k2, {
enumerable: true,
get: function () {
return m[k]
var desc = Object.getOwnPropertyDescriptor(m, k)
if (
!desc ||
('get' in desc ? !m.__esModule : desc.writable || desc.configurable)
) {
desc = {
enumerable: true,
get: function () {
return m[k]
}
}
})
}
Object.defineProperty(o, k2, desc)
}

@@ -26,14 +33,12 @@ : function (o, m, k, k2) {

}
var __importDefault =
(this && this.__importDefault) ||
function (mod) {
return mod && mod.__esModule ? mod : { default: mod }
}
Object.defineProperty(exports, '__esModule', { value: true })
exports.Client = exports.web = void 0
exports.Client = void 0
__exportStar(require('./modules/musiclist'), exports)
__exportStar(require('./modules/search'), exports)
__exportStar(require('./modules/artist'), exports)
var web_1 = require('./modules/web')
Object.defineProperty(exports, 'web', {
enumerable: true,
get: function () {
return web_1.default
}
})
var Client_1 = require('./modules/Client')

@@ -43,4 +48,4 @@ Object.defineProperty(exports, 'Client', {

get: function () {
return Client_1.default
return __importDefault(Client_1).default
}
})

@@ -135,7 +135,12 @@ 'use strict'

}
var __importDefault =
(this && this.__importDefault) ||
function (mod) {
return mod && mod.__esModule ? mod : { default: mod }
}
Object.defineProperty(exports, '__esModule', { value: true })
exports.getArtistInfo = void 0
var jsdom_1 = require('jsdom')
var axios_1 = require('axios')
var parse_table_1 = require('../helpers/parse_table')
var axios_1 = __importDefault(require('axios'))
var parse_table_1 = __importDefault(require('../helpers/parse_table'))
var getArtistInfo = function (artist_url) {

@@ -142,0 +147,0 @@ return __awaiter(void 0, void 0, void 0, function () {

@@ -5,4 +5,2 @@ import SongCache from '../helpers/SongCache'

export interface NCSClientOptions {
web?: boolean
proxy_url?: string
use_cache?: boolean

@@ -13,4 +11,2 @@ cache_path?: string

export default class NCSClient {
private proxy_url
private web
private detailed_log

@@ -17,0 +13,0 @@ protected cache: SongCache | undefined

@@ -135,5 +135,9 @@ 'use strict'

}
var __importDefault =
(this && this.__importDefault) ||
function (mod) {
return mod && mod.__esModule ? mod : { default: mod }
}
Object.defineProperty(exports, '__esModule', { value: true })
var SongCache_1 = require('../helpers/SongCache')
var web_1 = require('./web')
var SongCache_1 = __importDefault(require('../helpers/SongCache'))
var musiclist_1 = require('./musiclist')

@@ -147,12 +151,7 @@ var search_1 = require('./search')

}
var _a, _b, _c
this.web = (_a = options.web) !== null && _a !== void 0 ? _a : false
this.proxy_url =
(_b = options.proxy_url) !== null && _b !== void 0 ? _b : ''
var _a
this.detailed_log =
(_c = options.detailed_log) !== null && _c !== void 0 ? _c : false
(_a = options.detailed_log) !== null && _a !== void 0 ? _a : false
if (options.use_cache) {
this.cache = new SongCache_1.default({
web: this.web,
proxy_url: this.proxy_url,
cache_path: options.cache_path,

@@ -185,10 +184,5 @@ detailed_log: this.detailed_log

case 1:
if (!this.web) return [3 /*break*/, 3]
return [4 /*yield*/, web_1.default.getSongs(this.proxy_url, page)]
return [4 /*yield*/, (0, musiclist_1.getMusic)(page)]
case 2:
return [2 /*return*/, _a.sent()]
case 3:
return [4 /*yield*/, (0, musiclist_1.getMusic)(page)]
case 4:
return [2 /*return*/, _a.sent()]
}

@@ -211,13 +205,5 @@ })

}
if (!this.web) return [3 /*break*/, 2]
return [
4 /*yield*/,
web_1.default.search(this.proxy_url, filter, page)
]
return [4 /*yield*/, (0, search_1.search)(filter, page)]
case 1:
return [2 /*return*/, _a.sent()]
case 2:
return [4 /*yield*/, (0, search_1.search)(filter, page)]
case 3:
return [2 /*return*/, _a.sent()]
}

@@ -235,13 +221,5 @@ })

}
if (!this.web) return [3 /*break*/, 2]
return [
4 /*yield*/,
web_1.default.getArtistInfo(this.proxy_url, artist_url)
]
return [4 /*yield*/, (0, artist_1.getArtistInfo)(artist_url)]
case 1:
return [2 /*return*/, _a.sent()]
case 2:
return [4 /*yield*/, (0, artist_1.getArtistInfo)(artist_url)]
case 3:
return [2 /*return*/, _a.sent()]
}

@@ -248,0 +226,0 @@ })

import type Song from '../api/Song'
export declare const getMusic: (page?: number | undefined) => Promise<Song[]>
export declare const getMusic: (page?: number) => Promise<Song[]>

@@ -135,6 +135,11 @@ 'use strict'

}
var __importDefault =
(this && this.__importDefault) ||
function (mod) {
return mod && mod.__esModule ? mod : { default: mod }
}
Object.defineProperty(exports, '__esModule', { value: true })
exports.getMusic = void 0
var jsdom_1 = require('jsdom')
var axios_1 = require('axios')
var axios_1 = __importDefault(require('axios'))
var getMusic = function (page) {

@@ -141,0 +146,0 @@ return __awaiter(void 0, void 0, void 0, function () {

@@ -135,7 +135,12 @@ 'use strict'

}
var __importDefault =
(this && this.__importDefault) ||
function (mod) {
return mod && mod.__esModule ? mod : { default: mod }
}
Object.defineProperty(exports, '__esModule', { value: true })
exports.search = void 0
var jsdom_1 = require('jsdom')
var axios_1 = require('axios')
var parse_table_1 = require('../helpers/parse_table')
var axios_1 = __importDefault(require('axios'))
var parse_table_1 = __importDefault(require('../helpers/parse_table'))
var search = function (filter, page) {

@@ -142,0 +147,0 @@ if (page === void 0) {

import type Song from '../api/Song'
export declare type events = 'save' | 'ready'
export interface CacheOptions {
web: boolean
proxy_url: string
cache_path?: string

@@ -13,5 +11,3 @@ detailed_log?: boolean

protected path: string | undefined
protected proxy_url: string
protected detailed_log: boolean
protected web: boolean
protected is_ready: boolean

@@ -18,0 +14,0 @@ constructor(options: CacheOptions)

@@ -146,4 +146,4 @@ var __awaiter =

}
import fs from 'fs'
import { search } from '../modules/search'
import web from '../modules/web'
var SongCache = /** @class */ (function () {

@@ -156,7 +156,4 @@ function SongCache(options) {

this.detailed_log = false
this.web = false
this.is_ready = false
this.web = options.web
this.path = options.cache_path
this.proxy_url = options.proxy_url
this.detailed_log =

@@ -172,6 +169,2 @@ (_a = options.detailed_log) !== null && _a !== void 0 ? _a : false

.then(function (status) {
if (!status && _this.web)
window.addEventListener('online', function () {
return _this.checkForNew()
})
_this.is_ready = true

@@ -184,23 +177,10 @@ _this.triggerEvent('ready')

return __awaiter(this, void 0, void 0, function () {
var rawSongs, fs, rawSongs
var rawSongs
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (this.path == undefined || this.path.trim() == '')
return [2 /*return*/]
if (!this.web) return [3 /*break*/, 1]
rawSongs = localStorage.getItem(this.path)
if (rawSongs) this.songs = JSON.parse(rawSongs)
return [3 /*break*/, 3]
case 1:
return [4 /*yield*/, import('fs')]
case 2:
fs = _a.sent()
if (!fs.existsSync(this.path)) return [2 /*return*/]
rawSongs = fs.readFileSync(this.path).toString()
this.songs = JSON.parse(rawSongs)
_a.label = 3
case 3:
return [2 /*return*/]
}
if (this.path == undefined || this.path.trim() == '')
return [2 /*return*/]
if (!fs.existsSync(this.path)) return [2 /*return*/]
rawSongs = fs.readFileSync(this.path).toString()
this.songs = JSON.parse(rawSongs)
return [2 /*return*/]
})

@@ -211,21 +191,8 @@ })

return __awaiter(this, void 0, void 0, function () {
var fs
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (this.path == undefined || this.path.trim() == '')
return [2 /*return*/]
if (!this.web) return [3 /*break*/, 1]
localStorage.setItem(this.path, JSON.stringify(this.songs))
return [3 /*break*/, 3]
case 1:
return [4 /*yield*/, import('fs')]
case 2:
fs = _a.sent()
fs.writeFileSync(this.path, JSON.stringify(this.songs))
_a.label = 3
case 3:
this.triggerEvent('save')
return [2 /*return*/]
}
if (this.path == undefined || this.path.trim() == '')
return [2 /*return*/]
fs.writeFileSync(this.path, JSON.stringify(this.songs))
this.triggerEvent('save')
return [2 /*return*/]
})

@@ -278,25 +245,15 @@ })

return __awaiter(this, void 0, void 0, function () {
var cp, appendCache, songs, _a, newSongs
var cp, appendCache, songs, newSongs
var _this = this
return __generator(this, function (_b) {
switch (_b.label) {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (this.web && !navigator.onLine) return [2 /*return*/, false]
cp = 1
appendCache = []
_b.label = 1
_a.label = 1
case 1:
if (!true) return [3 /*break*/, 6]
if (!this.web) return [3 /*break*/, 3]
return [4 /*yield*/, web.getSongs(this.proxy_url, cp)]
if (!true) return [3 /*break*/, 3]
return [4 /*yield*/, search({}, cp)]
case 2:
_a = _b.sent()
return [3 /*break*/, 5]
case 3:
return [4 /*yield*/, search({}, cp)]
case 4:
_a = _b.sent()
_b.label = 5
case 5:
songs = _a
songs = _a.sent()
newSongs = songs.filter(function (song) {

@@ -322,6 +279,6 @@ return !_this.songs.find(function (s) {

appendCache.push.apply(appendCache, newSongs)
if (newSongs.length == 0) return [3 /*break*/, 6]
if (newSongs.length == 0) return [3 /*break*/, 3]
cp++
return [3 /*break*/, 1]
case 6:
case 3:
this.addSongs.apply(this, appendCache)

@@ -328,0 +285,0 @@ if (this.detailed_log) console.log('finished refreshing song list')

export * from './modules/musiclist'
export * from './modules/search'
export * from './modules/artist'
export { default as web } from './modules/web'
export { default as Client } from './modules/Client'

@@ -6,0 +5,0 @@ export type { default as Song } from './api/Song'

export * from './modules/musiclist'
export * from './modules/search'
export * from './modules/artist'
export { default as web } from './modules/web'
export { default as Client } from './modules/Client'

@@ -5,4 +5,2 @@ import SongCache from '../helpers/SongCache'

export interface NCSClientOptions {
web?: boolean
proxy_url?: string
use_cache?: boolean

@@ -13,4 +11,2 @@ cache_path?: string

export default class NCSClient {
private proxy_url
private web
private detailed_log

@@ -17,0 +13,0 @@ protected cache: SongCache | undefined

@@ -135,3 +135,2 @@ var __awaiter =

import SongCache from '../helpers/SongCache'
import web from './web'
import { getMusic } from './musiclist'

@@ -145,12 +144,7 @@ import { search } from './search'

}
var _a, _b, _c
this.web = (_a = options.web) !== null && _a !== void 0 ? _a : false
this.proxy_url =
(_b = options.proxy_url) !== null && _b !== void 0 ? _b : ''
var _a
this.detailed_log =
(_c = options.detailed_log) !== null && _c !== void 0 ? _c : false
(_a = options.detailed_log) !== null && _a !== void 0 ? _a : false
if (options.use_cache) {
this.cache = new SongCache({
web: this.web,
proxy_url: this.proxy_url,
cache_path: options.cache_path,

@@ -183,10 +177,5 @@ detailed_log: this.detailed_log

case 1:
if (!this.web) return [3 /*break*/, 3]
return [4 /*yield*/, web.getSongs(this.proxy_url, page)]
return [4 /*yield*/, getMusic(page)]
case 2:
return [2 /*return*/, _a.sent()]
case 3:
return [4 /*yield*/, getMusic(page)]
case 4:
return [2 /*return*/, _a.sent()]
}

@@ -209,10 +198,5 @@ })

}
if (!this.web) return [3 /*break*/, 2]
return [4 /*yield*/, web.search(this.proxy_url, filter, page)]
return [4 /*yield*/, search(filter, page)]
case 1:
return [2 /*return*/, _a.sent()]
case 2:
return [4 /*yield*/, search(filter, page)]
case 3:
return [2 /*return*/, _a.sent()]
}

@@ -230,10 +214,5 @@ })

}
if (!this.web) return [3 /*break*/, 2]
return [4 /*yield*/, web.getArtistInfo(this.proxy_url, artist_url)]
return [4 /*yield*/, getArtistInfo(artist_url)]
case 1:
return [2 /*return*/, _a.sent()]
case 2:
return [4 /*yield*/, getArtistInfo(artist_url)]
case 3:
return [2 /*return*/, _a.sent()]
}

@@ -240,0 +219,0 @@ })

import type Song from '../api/Song'
export declare const getMusic: (page?: number | undefined) => Promise<Song[]>
export declare const getMusic: (page?: number) => Promise<Song[]>
{
"name": "nocopyrightsounds-api",
"version": "2.0.1",
"version": "2.1.0",
"description": "A webscraper for the NoCopyrightSounds website to provide an API",

@@ -25,2 +25,3 @@ "main": "dist/cjs/main.js",

"@types/jsdom": "^16.2.14",
"@types/node": "^17.0.40",
"concurrently": "^6.2.0",

@@ -31,5 +32,5 @@ "prettier": "^2.3.2",

"dependencies": {
"axios": "^0.26.1",
"axios": "^0.27.2",
"jsdom": "^19.0.0"
}
}

@@ -106,23 +106,4 @@ # NoCopyrightSounds API

### in the browser
```js
import * as ncs from 'nocopyrightsounds-api'
ncs.web // add ".web" before the function
.getMusic(/*page here*/)
.then(songs => {
//use the songs here
console.log(songs)
})
.catch(err => {
//error handeling here
console.error(err)
})
```
## using the client class
### in nodejs
```js

@@ -145,13 +126,2 @@ import * as ncs from 'nocopyrightsounds-api'

### in the browser
```js
import * as ncs from 'nocopyrightsounds-api'
const client = new ncs.Client({
web: true,
proxy_url: /*add your proxy url here (use the NoCopyrightSounds-API-server found on npm)*/
})
```
### with caching

@@ -158,0 +128,0 @@

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

import fs from 'fs'
import { search } from '../modules/search'
import web from '../modules/web'

@@ -10,4 +10,2 @@ import type Song from '../api/Song'

export interface CacheOptions {
web: boolean
proxy_url: string
cache_path?: string

@@ -21,11 +19,7 @@ detailed_log?: boolean

protected path: string | undefined
protected proxy_url: string
protected detailed_log = false
protected web = false
protected is_ready = false
public constructor(options: CacheOptions) {
this.web = options.web
this.path = options.cache_path
this.proxy_url = options.proxy_url
this.detailed_log = options.detailed_log ?? false

@@ -37,4 +31,2 @@

.then(status => {
if (!status && this.web)
window.addEventListener('online', () => this.checkForNew())
this.is_ready = true

@@ -48,11 +40,5 @@ this.triggerEvent('ready')

if (this.path == undefined || this.path.trim() == '') return
if (this.web) {
const rawSongs = localStorage.getItem(this.path)
if (rawSongs) this.songs = JSON.parse(rawSongs)
} else {
const fs = await import('fs')
if (!fs.existsSync(this.path)) return
const rawSongs = fs.readFileSync(this.path).toString()
this.songs = JSON.parse(rawSongs)
}
if (!fs.existsSync(this.path)) return
const rawSongs = fs.readFileSync(this.path).toString()
this.songs = JSON.parse(rawSongs)
}

@@ -62,8 +48,3 @@

if (this.path == undefined || this.path.trim() == '') return
if (this.web) {
localStorage.setItem(this.path, JSON.stringify(this.songs))
} else {
const fs = await import('fs')
fs.writeFileSync(this.path, JSON.stringify(this.songs))
}
fs.writeFileSync(this.path, JSON.stringify(this.songs))
this.triggerEvent('save')

@@ -109,9 +90,6 @@ }

public async checkForNew() {
if (this.web && !navigator.onLine) return false
var cp = 1
const appendCache: Song[] = []
while (true) {
const songs = this.web
? await web.getSongs(this.proxy_url, cp)
: await search({}, cp)
const songs = await search({}, cp)
const newSongs = songs.filter(

@@ -118,0 +96,0 @@ song => !this.songs.find(s => s.songUrl == song.songUrl)

export * from './modules/musiclist'
export * from './modules/search'
export * from './modules/artist'
export { default as web } from './modules/web'
export { default as Client } from './modules/Client'

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

import SongCache from '../helpers/SongCache'
import web from './web'
import { getMusic } from './musiclist'

@@ -11,4 +10,2 @@ import { search } from './search'

export interface NCSClientOptions {
web?: boolean
proxy_url?: string
use_cache?: boolean

@@ -20,4 +17,2 @@ cache_path?: string

export default class NCSClient {
private proxy_url: string
private web: boolean
private detailed_log: boolean

@@ -27,4 +22,2 @@ protected cache: SongCache | undefined

public constructor(options: NCSClientOptions = {}) {
this.web = options.web ?? false
this.proxy_url = options.proxy_url ?? ''
this.detailed_log = options.detailed_log ?? false

@@ -34,4 +27,2 @@

this.cache = new SongCache({
web: this.web,
proxy_url: this.proxy_url,
cache_path: options.cache_path,

@@ -55,7 +46,3 @@ detailed_log: this.detailed_log

} else {
if (this.web) {
return await web.getSongs(this.proxy_url, page)
} else {
return await getMusic(page)
}
return await getMusic(page)
}

@@ -70,7 +57,3 @@ }

}
if (this.web) {
return await web.search(this.proxy_url, filter, page)
} else {
return await search(filter, page)
}
return await search(filter, page)
}

@@ -82,8 +65,4 @@

}
if (this.web) {
return await web.getArtistInfo(this.proxy_url, artist_url)
} else {
return await getArtistInfo(artist_url)
}
return await getArtistInfo(artist_url)
}
}

@@ -6,2 +6,3 @@ {

"declaration": true,
"esModuleInterop": true,
"moduleResolution": "Node"

@@ -8,0 +9,0 @@ },

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