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

@mintlify/http-client

Package Overview
Dependencies
Maintainers
5
Versions
256
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@mintlify/http-client - npm Package Compare versions

Comparing version 0.0.24 to 0.0.25

20

./dist/index.js

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

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = 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);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./leaves-client"), exports);
__exportStar(require("./client"), exports);
export * from './leaves-client/index.js';
export * from './client/index.js';
//# sourceMappingURL=index.js.map

4

dist/client/baseClient.d.ts

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

import { IBaseClient } from './interfaces';
import { HttpMethods, QueryType, RequestInitType } from './types';
import { IBaseClient } from './interfaces.js';
import { HttpMethods, QueryType, RequestInitType } from './types.js';
/**

@@ -4,0 +4,0 @@ * BaseClient serves as the base class for API clients.

@@ -1,5 +0,11 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseClient = void 0;
const clientError_1 = require("./clientError");
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { handleJson, handleText } from './clientError.js';
/**

@@ -9,3 +15,3 @@ * BaseClient serves as the base class for API clients.

*/
class BaseClient {
export class BaseClient {
/**

@@ -19,14 +25,10 @@ * @param host - The server's address.

}
async fetch(path, query, init) {
const req = {
...this.reqInit,
...init,
headers: {
...this.reqInit?.headers,
...init?.headers,
},
};
let uri = this.getUri(path);
uri = query ? `${uri}?${new URLSearchParams(query)}` : uri;
return { uri, res: await fetch(uri, req), req };
fetch(path, query, init) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
const req = Object.assign(Object.assign(Object.assign({}, this.reqInit), init), { headers: Object.assign(Object.assign({}, (_a = this.reqInit) === null || _a === void 0 ? void 0 : _a.headers), init === null || init === void 0 ? void 0 : init.headers) });
let uri = this.getUri(path);
uri = query ? `${uri}?${new URLSearchParams(query)}` : uri;
return { uri, res: yield fetch(uri, req), req };
});
}

@@ -45,13 +47,19 @@ get(path, query, init) {

}
async text(path, query, init) {
const result = await this.fetch(path, query, init);
return this.handleText(result);
text(path, query, init) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this.fetch(path, query, init);
return this.handleText(result);
});
}
async json(path, query, init) {
const result = await this.fetch(path, query, init);
return this.handleJson(result);
json(path, query, init) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this.fetch(path, query, init);
return this.handleJson(result);
});
}
async method(method, path, query, init) {
const result = await this.fetch(path, query, { ...init, method });
return result.res;
method(method, path, query, init) {
return __awaiter(this, void 0, void 0, function* () {
const result = yield this.fetch(path, query, Object.assign(Object.assign({}, init), { method }));
return result.res;
});
}

@@ -82,3 +90,3 @@ /**

handleText({ req, res, uri, }) {
return clientError_1.handleText.bind(this)(req, res, uri);
return handleText.bind(this)(req, res, uri);
}

@@ -93,7 +101,6 @@ /**

handleJson({ req, res, uri, }) {
const handle = (clientError_1.handleJson);
const handle = (handleJson);
return handle.bind(this)(req, res, uri);
}
}
exports.BaseClient = BaseClient;
//# sourceMappingURL=baseClient.js.map

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

import { BaseClient } from './baseClient';
import { IClientError } from './interfaces';
import { BaseClient } from './baseClient.js';
import { IClientError } from './interfaces.js';
/**

@@ -4,0 +4,0 @@ * Type guard for ClientError.

@@ -1,5 +0,11 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.handleAccess = exports.handleJson = exports.handleText = exports.isClientError = void 0;
const leaves_client_1 = require("../leaves-client");
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { ACCESS_DENIED, UNAUTHORIZED } from '../leaves-client/index.js';
/**

@@ -31,3 +37,3 @@ * Represents a client-side error.

// eslint-disable-next-line @typescript-eslint/no-explicit-any
function isClientError(object) {
export function isClientError(object) {
return (object instanceof ClientError ||

@@ -43,3 +49,2 @@ ('client' in object &&

}
exports.isClientError = isClientError;
/**

@@ -53,12 +58,13 @@ * Fetches a resource as text.

*/
async function handleText(req, res, uri) {
const text = await res.text();
if (res.ok) {
return text;
}
else {
throw new ClientError(text, this, res, req, uri);
}
export function handleText(req, res, uri) {
return __awaiter(this, void 0, void 0, function* () {
const text = yield res.text();
if (res.ok) {
return text;
}
else {
throw new ClientError(text, this, res, req, uri);
}
});
}
exports.handleText = handleText;
/**

@@ -72,11 +78,12 @@ * Fetches a resource as JSON.

*/
async function handleJson(req, res, uri) {
if (res.ok) {
return res.json();
}
else {
throw new ClientError(await res.text(), this, res, req, uri);
}
export function handleJson(req, res, uri) {
return __awaiter(this, void 0, void 0, function* () {
if (res.ok) {
return res.json();
}
else {
throw new ClientError(yield res.text(), this, res, req, uri);
}
});
}
exports.handleJson = handleJson;
/**

@@ -87,8 +94,7 @@ * Checks if a client has access to a resource.

*/
function handleAccess(accessCondition) {
export function handleAccess(accessCondition) {
if (!accessCondition) {
throw new ClientError(leaves_client_1.ACCESS_DENIED, this, leaves_client_1.UNAUTHORIZED);
throw new ClientError(ACCESS_DENIED, this, UNAUTHORIZED);
}
}
exports.handleAccess = handleAccess;
//# sourceMappingURL=clientError.js.map

@@ -1,7 +0,7 @@

import { BaseClient } from './baseClient';
import { isClientError } from './clientError';
import { IBaseClient, IClientError } from './interfaces';
import { HttpMethods, QueryType } from './types';
import { BaseClient } from './baseClient.js';
import { isClientError } from './clientError.js';
import { IBaseClient, IClientError } from './interfaces.js';
import { HttpMethods, QueryType } from './types.js';
export { BaseClient, isClientError };
export type { IBaseClient, IClientError, HttpMethods, QueryType };
//# sourceMappingURL=index.d.ts.map

@@ -1,8 +0,4 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isClientError = exports.BaseClient = void 0;
const baseClient_1 = require("./baseClient");
Object.defineProperty(exports, "BaseClient", { enumerable: true, get: function () { return baseClient_1.BaseClient; } });
const clientError_1 = require("./clientError");
Object.defineProperty(exports, "isClientError", { enumerable: true, get: function () { return clientError_1.isClientError; } });
import { BaseClient } from './baseClient.js';
import { isClientError } from './clientError.js';
export { BaseClient, isClientError };
//# sourceMappingURL=index.js.map

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

import { ErrorResponseType, HttpMethods, QueryType, RequestInitType } from './types';
import { ErrorResponseType, HttpMethods, QueryType, RequestInitType } from './types.js';
/**

@@ -3,0 +3,0 @@ * The `IBaseClient` interface outlines the structure for a base client with basic configurations for making HTTP requests.

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
export {};
//# sourceMappingURL=interfaces.js.map

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
export {};
//# sourceMappingURL=types.js.map

@@ -1,8 +0,8 @@

import { HttpMethods, IBaseClient, IClientError, QueryType } from './client';
import { ILeavesClient } from './leaves-client';
import { PagePropsResponseType } from './leaves-client/types';
export * from './leaves-client';
export * from './client';
import { HttpMethods, IBaseClient, IClientError, QueryType } from './client/index.js';
import { ILeavesClient } from './leaves-client/index.js';
import { PagePropsResponseType } from './leaves-client/types.js';
export * from './leaves-client/index.js';
export * from './client/index.js';
export type { ILeavesClient, PagePropsResponseType };
export type { IBaseClient, IClientError, HttpMethods, QueryType };
//# sourceMappingURL=index.d.ts.map

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

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = 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);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./leaves-client"), exports);
__exportStar(require("./client"), exports);
export * from './leaves-client/index.js';
export * from './client/index.js';
//# sourceMappingURL=index.js.map

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

import { ErrorResponseType } from '../client/types';
import { ErrorResponseType } from '../client/types.js';
export declare const ADMIN_TOKEN: string | undefined;

@@ -3,0 +3,0 @@ export declare const SUBDOMAIN: string | undefined;

@@ -1,20 +0,17 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.IS_PASSWORD_PROTECTED = exports.ACCESS_DENIED = exports.UNAUTHORIZED = exports.ORG_BY_ID_ROUTE = exports.PLAN_BY_ID_ROUTE = exports.PLAN_ROUTE = exports.HIDDEN_PAGES_ROUTE = exports.HOSTING_LOCATION_ROUTE = exports.PATHS_ROUTE = exports.NAVIGATION_ROUTE = exports.HEADERS = exports.ENDPOINT = exports.API_ENDPOINT = exports.AUTH_HEADER = exports.SUBDOMAIN = exports.ADMIN_TOKEN = void 0;
exports.ADMIN_TOKEN = process.env.ADMIN_TOKEN;
exports.SUBDOMAIN = process.env.SUBDOMAIN;
exports.AUTH_HEADER = exports.ADMIN_TOKEN ? { Authorization: `Bearer ${exports.ADMIN_TOKEN}` } : undefined;
exports.API_ENDPOINT = process.env.API_ENDPOINT || 'http://localhost:5000';
exports.ENDPOINT = `${exports.API_ENDPOINT}/api`;
exports.HEADERS = exports.AUTH_HEADER;
exports.NAVIGATION_ROUTE = 'navigation';
exports.PATHS_ROUTE = 'paths';
exports.HOSTING_LOCATION_ROUTE = 'hosting-location';
exports.HIDDEN_PAGES_ROUTE = 'hidden-pages';
exports.PLAN_ROUTE = 'plan';
exports.PLAN_BY_ID_ROUTE = 'planById';
exports.ORG_BY_ID_ROUTE = 'byId';
exports.UNAUTHORIZED = { status: 401 };
exports.ACCESS_DENIED = 'Access denied. Not authorized to access protected content.';
exports.IS_PASSWORD_PROTECTED = process.env.IS_PASSWORD_PROTECTED === 'true';
export const ADMIN_TOKEN = process.env.ADMIN_TOKEN;
export const SUBDOMAIN = process.env.SUBDOMAIN;
export const AUTH_HEADER = ADMIN_TOKEN ? { Authorization: `Bearer ${ADMIN_TOKEN}` } : undefined;
export const API_ENDPOINT = process.env.API_ENDPOINT || 'http://localhost:5000';
export const ENDPOINT = `${API_ENDPOINT}/api`;
export const HEADERS = AUTH_HEADER;
export const NAVIGATION_ROUTE = 'navigation';
export const PATHS_ROUTE = 'paths';
export const HOSTING_LOCATION_ROUTE = 'hosting-location';
export const HIDDEN_PAGES_ROUTE = 'hidden-pages';
export const PLAN_ROUTE = 'plan';
export const PLAN_BY_ID_ROUTE = 'planById';
export const ORG_BY_ID_ROUTE = 'byId';
export const UNAUTHORIZED = { status: 401 };
export const ACCESS_DENIED = 'Access denied. Not authorized to access protected content.';
export const IS_PASSWORD_PROTECTED = process.env.IS_PASSWORD_PROTECTED === 'true';
//# sourceMappingURL=constants.js.map

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

import { ILeavesClient } from './interfaces';
import getLeavesClient from './leavesClient';
import { ILeavesClient } from './interfaces.js';
import getLeavesClient from './leavesClient.js';
export { getLeavesClient };
export * from './constants';
export * from './constants.js';
export type { ILeavesClient };
//# sourceMappingURL=index.d.ts.map

@@ -1,24 +0,4 @@

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = 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);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getLeavesClient = void 0;
const leavesClient_1 = __importDefault(require("./leavesClient"));
exports.getLeavesClient = leavesClient_1.default;
__exportStar(require("./constants"), exports);
import getLeavesClient from './leavesClient.js';
export { getLeavesClient };
export * from './constants.js';
//# sourceMappingURL=index.js.map
import { DeploymentType, SnippetType, CustomerPageType, DecoratedNavigation, OrgType } from '@mintlify/models';
import { IBaseClient } from '../client';
import { IBaseClient } from '../client/index.js';
export interface ILeavesClient extends IBaseClient {

@@ -4,0 +4,0 @@ readonly subdomain: string;

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
export {};
//# sourceMappingURL=interfaces.js.map

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

import { ILeavesClient } from './interfaces';
import { ILeavesClient } from './interfaces.js';
export declare const getLeavesClient: (subdomain: string, isPasswordProtected?: boolean, host?: string, reqInit?: {

@@ -3,0 +3,0 @@ headers: {

@@ -1,14 +0,11 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getLeavesClient = void 0;
const client_1 = require("../client");
const clientError_1 = require("../client/clientError");
const constants_1 = require("./constants");
class LeavesClient extends client_1.BaseClient {
import { handleAccess } from '../client/clientError.js';
import { BaseClient } from '../client/index.js';
import { ENDPOINT, HEADERS, HIDDEN_PAGES_ROUTE, HOSTING_LOCATION_ROUTE, IS_PASSWORD_PROTECTED, NAVIGATION_ROUTE, ORG_BY_ID_ROUTE, PATHS_ROUTE, SUBDOMAIN, PLAN_BY_ID_ROUTE, PLAN_ROUTE, } from './constants.js';
class LeavesClient extends BaseClient {
constructor(subdomain, isPasswordProtected, host, reqInit = undefined) {
super(host, reqInit);
this.isPasswordProtected = isPasswordProtected;
this.subdomain = constants_1.SUBDOMAIN ?? subdomain;
const isAccessDenied = constants_1.SUBDOMAIN !== subdomain && this.isPasswordProtected;
clientError_1.handleAccess.bind(this)(!isAccessDenied);
this.subdomain = SUBDOMAIN !== null && SUBDOMAIN !== void 0 ? SUBDOMAIN : subdomain;
const isAccessDenied = SUBDOMAIN !== subdomain && this.isPasswordProtected;
handleAccess.bind(this)(!isAccessDenied);
}

@@ -19,3 +16,3 @@ getDeployment() {

getNavigation() {
const path = this.getPath(constants_1.NAVIGATION_ROUTE, this.subdomain);
const path = this.getPath(NAVIGATION_ROUTE, this.subdomain);
return this.json(path);

@@ -31,3 +28,3 @@ }

const route = this.getRoute("org" /* ENTITY_TYPE.ORG */);
const path = this.getPath(route, this.subdomain, constants_1.PLAN_ROUTE);
const path = this.getPath(route, this.subdomain, PLAN_ROUTE);
return this.text(path);

@@ -37,3 +34,3 @@ }

const route = this.getRoute("org" /* ENTITY_TYPE.ORG */);
const path = this.getPath(route, constants_1.ORG_BY_ID_ROUTE, orgId);
const path = this.getPath(route, ORG_BY_ID_ROUTE, orgId);
return this.json(path);

@@ -43,11 +40,7 @@ }

const route = this.getRoute("org" /* ENTITY_TYPE.ORG */);
const path = this.getPath(route, constants_1.PLAN_BY_ID_ROUTE, orgId);
const path = this.getPath(route, PLAN_BY_ID_ROUTE, orgId);
return this.text(path);
}
getPage(path, basePath, ...fields) {
return this.entity("page" /* ENTITY_TYPE.PAGE */, {
path,
...this.getFields(fields),
...(basePath ? { basePath } : {}),
});
return this.entity("page" /* ENTITY_TYPE.PAGE */, Object.assign(Object.assign({ path }, this.getFields(fields)), (basePath ? { basePath } : {})));
}

@@ -57,10 +50,7 @@ getPages(basePath, ...fields) {

const path = this.getPath(route, this.subdomain, 'list');
return this.json(path, {
...this.getFields(fields),
...(basePath ? { basePath } : {}),
});
return this.json(path, Object.assign(Object.assign({}, this.getFields(fields)), (basePath ? { basePath } : {})));
}
getHiddenPages() {
const route = this.getRoute("page" /* ENTITY_TYPE.PAGE */);
const path = this.getPath(route, this.subdomain, constants_1.HIDDEN_PAGES_ROUTE);
const path = this.getPath(route, this.subdomain, HIDDEN_PAGES_ROUTE);
return this.json(path);

@@ -70,3 +60,3 @@ }

const route = this.getRoute("page" /* ENTITY_TYPE.PAGE */);
const path = this.getPath(route, this.subdomain, constants_1.PATHS_ROUTE);
const path = this.getPath(route, this.subdomain, PATHS_ROUTE);
return this.json(path);

@@ -76,3 +66,3 @@ }

const route = this.getRoute("deployment" /* ENTITY_TYPE.DEPLOYMENT */);
const path = this.getPath(route, this.subdomain, constants_1.HOSTING_LOCATION_ROUTE);
const path = this.getPath(route, this.subdomain, HOSTING_LOCATION_ROUTE);
return this.text(path);

@@ -97,8 +87,8 @@ }

getFields(fields) {
return (fields?.length ?? 0) > 0 ? { fields: JSON.stringify(fields) } : {};
var _a;
return ((_a = fields === null || fields === void 0 ? void 0 : fields.length) !== null && _a !== void 0 ? _a : 0) > 0 ? { fields: JSON.stringify(fields) } : {};
}
}
const getLeavesClient = (subdomain, isPasswordProtected = constants_1.IS_PASSWORD_PROTECTED, host = constants_1.ENDPOINT, reqInit = { headers: constants_1.HEADERS }) => new LeavesClient(subdomain, isPasswordProtected, host, reqInit);
exports.getLeavesClient = getLeavesClient;
exports.default = exports.getLeavesClient;
export const getLeavesClient = (subdomain, isPasswordProtected = IS_PASSWORD_PROTECTED, host = ENDPOINT, reqInit = { headers: HEADERS }) => new LeavesClient(subdomain, isPasswordProtected, host, reqInit);
export default getLeavesClient;
//# sourceMappingURL=leavesClient.js.map

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
export {};
//# sourceMappingURL=types.js.map
{
"name": "@mintlify/http-client",
"version": "0.0.24",
"version": "0.0.25",
"type": "module",
"description": "The Mintlify http client package",

@@ -59,6 +60,6 @@ "engines": {

"@mintlify/eslint-config-typescript": "1.0.7",
"@mintlify/models": "0.0.33",
"@mintlify/models": "0.0.34",
"@mintlify/prettier-config": "1.0.1",
"@mintlify/ts-config": "1.0.7",
"@mintlify/validation": "0.1.67",
"@mintlify/ts-config": "2.0.0",
"@mintlify/validation": "0.1.68",
"@testing-library/jest-dom": "^5.16.5",

@@ -82,3 +83,3 @@ "@trivago/prettier-plugin-sort-imports": "3.x",

},
"gitHead": "1f3285350a41f589349743f2aeb390cb05be0536"
"gitHead": "ab27814faa49e32de06a450617c635e3b2f8d21f"
}

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