Socket
Socket
Sign inDemoInstall

@microsoft/api-extractor

Package Overview
Dependencies
Maintainers
2
Versions
487
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@microsoft/api-extractor - npm Package Compare versions

Comparing version 1.1.0 to 1.1.1

15

CHANGELOG.json

@@ -5,2 +5,17 @@ {

{
"version": "1.1.1",
"tag": "@microsoft/api-extractor_v1.1.1",
"date": "Thu, 19 Jan 2017 20:04:40 GMT",
"comments": {
"patch": [
{
"comment": "Check for missing JsDoc sequences changed."
},
{
"comment": "Improved error messages"
}
]
}
},
{
"version": "1.1.0",

@@ -7,0 +22,0 @@ "tag": "@microsoft/api-extractor_v1.1.0",

10

CHANGELOG.md
# Change Log - @microsoft/api-extractor
This log was last generated on Wed, 18 Jan 2017 20:04:29 GMT and should not be manually modified.
This log was last generated on Thu, 19 Jan 2017 20:04:40 GMT and should not be manually modified.
## 1.1.1
Thu, 19 Jan 2017 20:04:40 GMT
### Patches
- Check for missing JsDoc sequences changed.
- Improved error messages
## 1.1.0

@@ -6,0 +14,0 @@ Wed, 18 Jan 2017 20:04:29 GMT

86

lib/DebugRun.js
// NOTE: THIS SOURCE FILE IS FOR DEBUGGING PURPOSES ONLY.
// IT IS INVOKED BY THE "Run.cmd" AND "Debug.cmd" BATCH FILES.
"use strict";
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var ts = require("typescript");
var os = require("os");
var Analyzer_1 = require("./Analyzer");
var ApiFileGenerator_1 = require("./generators/ApiFileGenerator");
var ApiJsonGenerator_1 = require("./generators/ApiJsonGenerator");
var DocItemLoader_1 = require("./DocItemLoader");
var DocElementParser_1 = require("./DocElementParser");
var TestFileComparer_1 = require("./TestFileComparer");
var JsonFile_1 = require("./JsonFile");
var ApiDocumentation_1 = require("./definitions/ApiDocumentation");
var Tokenizer_1 = require("./Tokenizer");
var docs = '{@link @microsoft/sp-core-library:Guid.equals | Guid equals}';
var tokenizer = new Tokenizer_1.default(docs, console.log);
/* tslint:disable:no-unused-variable */
var linkResult = DocElementParser_1.default.parse(tokenizer, console.log);
var analyzer = new Analyzer_1.default();
var analyzer = new Analyzer_1.default(function (message, fileName, lineNumber) {
console.log("ErrorHandler: " + message + os.EOL
+ (" " + fileName + "#" + lineNumber));
});
/**
* Dummy class wrapping ApiDocumentation to test its protected methods
*/
var myDocumentedClass;
var TestApiDocumentation = (function (_super) {
__extends(TestApiDocumentation, _super);
function TestApiDocumentation() {
return _super.call(this, myDocumentedClass, analyzer.docItemLoader, function (msg) { return; }) || this;
}
TestApiDocumentation.prototype.parseParam = function (_tokenizer) {
return this._parseParam(_tokenizer);
};
return TestApiDocumentation;
}(ApiDocumentation_1.default));
/**
* Debugging inheritdoc expression parser.

@@ -49,5 +24,5 @@ * Analyzer on example2 is needed for testing the parser.

jsx: ts.JsxEmit.React,
rootDir: './testInputs/example2'
rootDir: 'D:/GitRepos/sp-client/spfx-core/sp-codepart-base'
},
entryPointFile: './testInputs/example2/index.ts',
entryPointFile: 'D:/GitRepos/sp-client/spfx-core/sp-codepart-base/src/index.ts',
otherFiles: []

@@ -59,49 +34,4 @@ });

apiJsonGenerator.writeJsonFile('./lib/DebugRun.json', analyzer);
myDocumentedClass = analyzer.package.getSortedMemberItems()
.filter(function (apiItem) { return apiItem.name === 'MyDocumentedClass'; })[0];
var apiDoc = new TestApiDocumentation();
docs = '@param x - The height in {@link http://wikipedia.org/pixel_units}';
tokenizer = new Tokenizer_1.default(docs, console.log);
// ApiDocumentation gets the @param token before calling parseParam()
tokenizer.getToken();
apiDoc.parseParam(tokenizer);
/**
* Put test cases here
*/
var apiReferenceExpr = '@microsoft/sp-core-library:Guid.equals';
var actual;
actual = ApiDocumentation_1.default.parseApiReferenceExpression(apiReferenceExpr, apiDoc.reportError);
apiReferenceExpr = '@microsoft/sp-core-library:Guid';
actual = ApiDocumentation_1.default.parseApiReferenceExpression(apiReferenceExpr, apiDoc.reportError);
apiReferenceExpr = 'sp-core-library:Guid';
actual = ApiDocumentation_1.default.parseApiReferenceExpression(apiReferenceExpr, apiDoc.reportError);
apiReferenceExpr = 'Guid.equals';
actual = ApiDocumentation_1.default.parseApiReferenceExpression(apiReferenceExpr, apiDoc.reportError);
apiReferenceExpr = 'Guid';
actual = ApiDocumentation_1.default.parseApiReferenceExpression(apiReferenceExpr, apiDoc.reportError);
// Should report error
apiReferenceExpr = 'sp-core-library:Guid:equals';
try {
actual = ApiDocumentation_1.default.parseApiReferenceExpression(apiReferenceExpr, apiDoc.reportError);
}
catch (error) {
console.log(error);
}
/**
* Debugging DocItemLoader
*/
var apiDefinitionRef = {
scopeName: '@microsoft',
packageName: 'sp-core-library',
exportName: 'DisplayMode',
memberName: ''
};
var docItemLoader = new DocItemLoader_1.default('./testInputs/example2');
/* tslint:disable:no-unused-variable */
var apiDocItemNotInCache = docItemLoader.getItem(apiDefinitionRef);
JsonFile_1.default.saveJsonFile('./lib/inheritedDoc-output.json', JSON.stringify(apiDocItemNotInCache));
TestFileComparer_1.default.assertFileMatchesExpected('./lib/inheritedDoc-output.json', './testInputs/inheritedDoc-output.json');
/* tslint:disable:no-unused-variable */
var apiDocItemInCache = docItemLoader.getItem(apiDefinitionRef);
console.log('DebugRun completed.');
//# sourceMappingURL=DebugRun.js.map

@@ -55,3 +55,4 @@ /// <reference types="es6-collections" />

export default class ApiDocumentation {
private static _allowedJsdocTags;
private static _allowedRegularJsdocTags;
private static _allowedInlineJsdocTags;
/**

@@ -162,3 +163,4 @@ * Match JsDoc block tags and inline tags

protected _parseParam(tokenizer: Tokenizer): IParam;
private _reportBadJSDocTag(token);
private _checkInheritDocStatus();
}

@@ -6,2 +6,3 @@ /* tslint:disable:no-bitwise */

var DocElementParser_1 = require("../DocElementParser");
var Token_1 = require("../Token");
var Tokenizer_1 = require("../Tokenizer");

@@ -134,9 +135,7 @@ /**

// not use the @inheritdoc and copy+paste the documentation
this.reportError("Use of @inheritdoc API item reference that is deprecated. " +
'Either include @deprecated JSDoc with message on this item or remove the @inheritdoc tag ' +
'and copy+paste the documentation.');
this.reportError("A deprecation message must be included after the @deprecated tag.");
}
break;
}
if (token.type === 'Tag') {
if (token.type === Token_1.TokenType.Tag) {
switch (token.tag) {

@@ -207,13 +206,6 @@ case '@remarks':

tokenizer.getToken();
if (ApiDocumentation._allowedJsdocTags.indexOf(token.tag) < 0) {
this.reportError("The JSDoc tag \"" + token.tag + "\" is not allowed");
break;
}
else {
this.reportError("Error formatting token tag: " + token.tag);
break;
}
this._reportBadJSDocTag(token);
}
}
else if (token.type === 'Inline') {
else if (token.type === Token_1.TokenType.Inline) {
switch (token.tag) {

@@ -236,13 +228,19 @@ case '@inheritdoc':

tokenizer.getToken();
this.reportError("Unidentifiable inline token " + token.tag);
this._reportBadJSDocTag(token);
break;
}
}
else if (token.type === 'Text') {
else if (token.type === Token_1.TokenType.Text) {
tokenizer.getToken();
this.reportError('Unexpected text. Text must either be the first sentences of the JSDoc, or if too long for ' +
'the first 2-3 sentences the text must be preceded by a @internalremarks tag.');
// Shorten "This is too long text" to "This is..."
var MAX_LENGTH = 40;
var problemText = token.text.trim();
if (problemText.length > MAX_LENGTH) {
problemText = problemText.substr(0, MAX_LENGTH - 3).trim() + '...';
}
this.reportError("Unexpected text in JSDoc comment: \"" + problemText + "\"");
}
else {
tokenizer.getToken();
// This would be a program bug
this.reportError("Unexpected token: " + token.type + " " + token.tag + " " + token.text);

@@ -346,2 +344,20 @@ }

};
ApiDocumentation.prototype._reportBadJSDocTag = function (token) {
var supportsRegular = ApiDocumentation._allowedRegularJsdocTags.indexOf(token.tag) >= 0;
var supportsInline = ApiDocumentation._allowedInlineJsdocTags.indexOf(token.tag) >= 0;
if (!supportsRegular && !supportsInline) {
this.reportError("Unknown JSDoc tag \"" + token.tag + "\"");
return;
}
if (token.type === Token_1.TokenType.Inline && !supportsInline) {
this.reportError("The JSDoc tag \"" + token.tag + "\" must not use the non-inline syntax (no curly braces)");
return;
}
if (token.type === Token_1.TokenType.Tag && !supportsRegular) {
this.reportError("The JSDoc tag \"" + token.tag + "\" must use the inline syntax (with curly braces)");
return;
}
this.reportError("The JSDoc tag \"" + token.tag + "\" is not supported in this context");
return;
};
ApiDocumentation.prototype._checkInheritDocStatus = function () {

@@ -357,3 +373,3 @@ if (this.isDocInherited) {

// ?path=/common/docs/ApiPrinciplesAndProcess.md
ApiDocumentation._allowedJsdocTags = [
ApiDocumentation._allowedRegularJsdocTags = [
// (alphabetical order)

@@ -363,6 +379,4 @@ '@alpha',

'@betadocumentation',
'@inheritdoc',
'@internal',
'@internalremarks',
'@link',
'@param',

@@ -378,2 +392,7 @@ '@preapproved',

];
ApiDocumentation._allowedInlineJsdocTags = [
// (alphabetical order)
'@inheritdoc',
'@link'
];
/**

@@ -380,0 +399,0 @@ * Match JsDoc block tags and inline tags

"use strict";
var ApiDocumentation_1 = require("./definitions/ApiDocumentation");
var Token_1 = require("./Token");
var DocElementParser = (function () {

@@ -22,3 +23,3 @@ function DocElementParser() {

}
if (token.type === 'Tag') {
if (token.type === Token_1.TokenType.Tag) {
switch (token.tag) {

@@ -37,3 +38,3 @@ case '@see':

}
else if (token.type === 'Inline') {
else if (token.type === Token_1.TokenType.Inline) {
switch (token.tag) {

@@ -52,3 +53,3 @@ case '@link':

}
else if (token.type === 'Text') {
else if (token.type === Token_1.TokenType.Text) {
docElements.push({ kind: 'textDocElement', value: token.text });

@@ -55,0 +56,0 @@ tokenizer.getToken();

@@ -330,4 +330,17 @@ {

}
},
"TestMissingCommentStar": {
"kind": "enum",
"values": {},
"deprecatedMessage": [],
"summary": [
{
"kind": "textDocElement",
"value": "Degenerate comment star missing here end of comment"
}
],
"remarks": [],
"isBeta": false
}
}
}

@@ -45,6 +45,5 @@ /// <reference types="mocha" />

chai_1.assert.equal(capturedErrors.length, 2);
chai_1.assert.equal(capturedErrors[0].message, 'The JSDoc tag "@badjsdoctag" is not allowed');
chai_1.assert.equal(capturedErrors[1].message, 'Unexpected text. Text must either be the first ' +
'sentences of the JSDoc, or if too long for the first 2-3 sentences the text must be ' +
'preceded by a @internalremarks tag.');
chai_1.assert.equal(capturedErrors[0].message, 'Unknown JSDoc tag "@badjsdoctag"');
chai_1.assert.equal(capturedErrors[1].message, 'Unexpected text in JSDoc comment: '
+ '"(Error #1 is the bad tag) Text can no..."');
});

@@ -51,0 +50,0 @@ });

@@ -11,12 +11,12 @@ /// <reference types="mocha" />

var token;
token = new Token_1.default('Text', '', 'Some text');
chai_1.assert.equal(token.type, 'Text');
token = new Token_1.default(Token_1.TokenType.Text, '', 'Some text');
chai_1.assert.equal(token.type, Token_1.TokenType.Text);
chai_1.assert.equal(token.tag, '');
chai_1.assert.equal(token.text, 'Some text');
token = new Token_1.default('Tag', '@tagA');
chai_1.assert.equal(token.type, 'Tag');
token = new Token_1.default(Token_1.TokenType.Tag, '@tagA');
chai_1.assert.equal(token.type, Token_1.TokenType.Tag);
chai_1.assert.equal(token.tag, '@tagA');
chai_1.assert.equal(token.text, '');
token = new Token_1.default('Inline', '@link', 'http://www.microsoft.com');
chai_1.assert.equal(token.type, 'Inline');
token = new Token_1.default(Token_1.TokenType.Inline, '@link', 'http://www.microsoft.com');
chai_1.assert.equal(token.type, Token_1.TokenType.Inline);
chai_1.assert.equal(token.tag, '@link');

@@ -27,6 +27,6 @@ chai_1.assert.equal(token.text, 'http://www.microsoft.com');

var token;
token = new Token_1.default('Text', '', 'Some text');
token = new Token_1.default(Token_1.TokenType.Text, '', 'Some text');
var errorThrown = false;
try {
token.requireType('Text');
token.requireType(Token_1.TokenType.Text);
}

@@ -38,3 +38,3 @@ catch (error) {

try {
token.requireType('Tag');
token.requireType(Token_1.TokenType.Tag);
}

@@ -41,0 +41,0 @@ catch (error) {

@@ -37,10 +37,10 @@ /// <reference types="mocha" />

var expectedTokens = [
new Token_1.default('Text', '', 'this is a mock documentation'),
new Token_1.default('Tag', '@taga'),
new Token_1.default('Text', '', 'hi'),
new Token_1.default('Tag', '@tagb'),
new Token_1.default('Text', '', 'hello @invalid@tag email@domain.com'),
new Token_1.default('Tag', '@tagc'),
new Token_1.default('Text', '', 'this is'),
new Token_1.default('Text', '', 'and this is {just curly braces}')
new Token_1.default(Token_1.TokenType.Text, '', 'this is a mock documentation'),
new Token_1.default(Token_1.TokenType.Tag, '@taga'),
new Token_1.default(Token_1.TokenType.Text, '', 'hi'),
new Token_1.default(Token_1.TokenType.Tag, '@tagb'),
new Token_1.default(Token_1.TokenType.Text, '', 'hello @invalid@tag email@domain.com'),
new Token_1.default(Token_1.TokenType.Tag, '@tagc'),
new Token_1.default(Token_1.TokenType.Text, '', 'this is'),
new Token_1.default(Token_1.TokenType.Text, '', 'and this is {just curly braces}')
];

@@ -54,3 +54,3 @@ var actualTokens = testTokenizer.tokenizeDocs(docs);

var token = '{ @link https://bing.com | Bing }';
var expectedToken = new Token_1.default('Inline', '@link', 'https://bing.com | Bing');
var expectedToken = new Token_1.default(Token_1.TokenType.Inline, '@link', 'https://bing.com | Bing');
var actualToken = testTokenizer.tokenizeInline(token);

@@ -57,0 +57,0 @@ chai_1.assert.equal(expectedToken.type, actualToken.type);

/**
* Allowed Token types.
*/
export declare enum TokenTypes {
export declare enum TokenType {
/**

@@ -30,3 +30,2 @@ * A Token that contains only text.

* The type of the token.
* Possible options: Text, Tag, Inline.
*/

@@ -43,8 +42,8 @@ private _type;

private _text;
constructor(type: string, tag?: string, text?: string);
constructor(type: TokenType, tag?: string, text?: string);
/**
* Determines if the type is not what we expect.
*/
requireType(type: string): void;
readonly type: string;
requireType(type: TokenType): void;
readonly type: TokenType;
readonly tag: string;

@@ -51,0 +50,0 @@ readonly text: string;

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

*/
var TokenTypes;
(function (TokenTypes) {
var TokenType;
(function (TokenType) {
/**
* A Token that contains only text.
*/
TokenTypes[TokenTypes["Text"] = 0] = "Text";
TokenType[TokenType["Text"] = 0] = "Text";
/**

@@ -16,3 +16,3 @@ * A Token that specifies a tag.

*/
TokenTypes[TokenTypes["Tag"] = 1] = "Tag";
TokenType[TokenType["Tag"] = 1] = "Tag";
/**

@@ -26,4 +26,4 @@ * This is a specific kind of Tag that is important to

*/
TokenTypes[TokenTypes["Inline"] = 2] = "Inline";
})(TokenTypes = exports.TokenTypes || (exports.TokenTypes = {}));
TokenType[TokenType["Inline"] = 2] = "Inline";
})(TokenType = exports.TokenType || (exports.TokenType = {}));
/**

@@ -44,3 +44,3 @@ * A structured object created from a doc comment string within a JSDoc comment block.

if (this._type !== type) {
throw new Error('Token of type \"${this._type}\" is not of required type \"${type}\"');
throw new Error("Encountered a token of type \"" + this._type + "\" when expecting \"" + type + "\"");
}

@@ -47,0 +47,0 @@ };

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

"[{\"_type\":\"Text\",\"_tag\":\"\",\"_text\":\"this is a mock documentation\"},{\"_type\":\"Tag\",\"_tag\":\"@taga\",\"_text\":\"\"},{\"_type\":\"Text\",\"_tag\":\"\",\"_text\":\"hi\"},{\"_type\":\"Tag\",\"_tag\":\"@tagb\",\"_text\":\"\"},{\"_type\":\"Text\",\"_tag\":\"\",\"_text\":\"hello @invalid@tag email@domain.com\"},{\"_type\":\"Tag\",\"_tag\":\"@tagc\",\"_text\":\"\"},{\"_type\":\"Text\",\"_tag\":\"\",\"_text\":\"this is\"},{\"_type\":\"Text\",\"_tag\":\"\",\"_text\":\"and this is {just curly braces}\"}]"
"[{\"_type\":0,\"_tag\":\"\",\"_text\":\"this is a mock documentation\"},{\"_type\":1,\"_tag\":\"@taga\",\"_text\":\"\"},{\"_type\":0,\"_tag\":\"\",\"_text\":\"hi\"},{\"_type\":1,\"_tag\":\"@tagb\",\"_text\":\"\"},{\"_type\":0,\"_tag\":\"\",\"_text\":\"hello @invalid@tag email@domain.com\"},{\"_type\":1,\"_tag\":\"@tagc\",\"_text\":\"\"},{\"_type\":0,\"_tag\":\"\",\"_text\":\"this is\"},{\"_type\":0,\"_tag\":\"\",\"_text\":\"and this is {just curly braces}\"}]"

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

"[{\"_type\":\"Text\",\"_tag\":\"\",\"_text\":\"this is a mock documentation\"},{\"_type\":\"Tag\",\"_tag\":\"@taga\",\"_text\":\"\"},{\"_type\":\"Text\",\"_tag\":\"\",\"_text\":\"hi\"},{\"_type\":\"Tag\",\"_tag\":\"@tagb\",\"_text\":\"\"},{\"_type\":\"Text\",\"_tag\":\"\",\"_text\":\"hello @invalid@tag email@domain.com\"},{\"_type\":\"Tag\",\"_tag\":\"@tagc\",\"_text\":\"\"},{\"_type\":\"Text\",\"_tag\":\"\",\"_text\":\"this is\"},{\"_type\":\"Text\",\"_tag\":\"\",\"_text\":\"and this is {just curly braces}\"}]"
"[{\"_type\":0,\"_tag\":\"\",\"_text\":\"this is a mock documentation\"},{\"_type\":1,\"_tag\":\"@taga\",\"_text\":\"\"},{\"_type\":0,\"_tag\":\"\",\"_text\":\"hi\"},{\"_type\":1,\"_tag\":\"@tagb\",\"_text\":\"\"},{\"_type\":0,\"_tag\":\"\",\"_text\":\"hello @invalid@tag email@domain.com\"},{\"_type\":1,\"_tag\":\"@tagc\",\"_text\":\"\"},{\"_type\":0,\"_tag\":\"\",\"_text\":\"this is\"},{\"_type\":0,\"_tag\":\"\",\"_text\":\"and this is {just curly braces}\"}]"

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

var docEntries = TypeScriptHelpers_1.default.splitStringWithRegEx(docs, Tokenizer._jsdocTagsRegex);
var sanitizedTokens = this._sanitizeDocEntries(docEntries); // remove white space and empty entries
var sanitizedTokens = this._sanitizeDocEntries(docEntries); // remove white space and empty entries
// process each sanitized doc string to a Token object

@@ -38,3 +38,3 @@ var tokens = [];

if (value.charAt(0) === '@') {
token = new Token_1.default('Tag', value);
token = new Token_1.default(Token_1.TokenType.Tag, value);
}

@@ -45,3 +45,3 @@ else if (value.charAt(0) === '{' && value.charAt(value.length - 1) === '}') {

else {
token = new Token_1.default('Text', '', value);
token = new Token_1.default(Token_1.TokenType.Text, '', value);
}

@@ -83,3 +83,3 @@ if (token) {

tokenChunks.shift(); // Gets rid of '@link'
var token = new Token_1.default('Inline', '@link', tokenChunks.join(' '));
var token = new Token_1.default(Token_1.TokenType.Inline, '@link', tokenChunks.join(' '));
return token;

@@ -89,3 +89,3 @@ }

tokenChunks.shift(); // Gets rid of '@inheritdoc'
var token = new Token_1.default('Inline', '@inheritdoc', tokenChunks.join(' '));
var token = new Token_1.default(Token_1.TokenType.Inline, '@inheritdoc', tokenChunks.join(' '));
return token;

@@ -92,0 +92,0 @@ }

@@ -47,8 +47,13 @@ /* tslint:disable:no-bitwise */

var jsDocLines = jsDocFullText.split(TypeScriptHelpers.newLineRegEx);
var jsDocStartSeqExists = TypeScriptHelpers.jsDocStartRegEx.test(jsDocLines[0]);
var jsDocEndSeqExists = TypeScriptHelpers.jsDocEndRegEx.test(jsDocLines[jsDocLines.length - 1]);
if (!(jsDocStartSeqExists && jsDocEndSeqExists)) {
errorLogger('JsDoc comment must begin with \"/**\" sequence and end with \"*/\" sequence.');
var jsDocStartSeqExists = TypeScriptHelpers.jsDocStartRegEx.test(jsDocLines[0].toString());
// Report error for each missing sequence seperately
if (!jsDocStartSeqExists) {
errorLogger('JsDoc comment must begin with a \"/**\" sequence.');
return '';
}
var jsDocEndSeqExists = TypeScriptHelpers.jsDocEndRegEx.test(jsDocLines[jsDocLines.length - 1].toString());
if (!jsDocEndSeqExists) {
errorLogger('JsDoc comment must end with a \"*/\" sequence.');
return '';
}
jsDoc = TypeScriptHelpers.removeJsDocSequences(jsDocLines);

@@ -206,3 +211,3 @@ }

*/
TypeScriptHelpers.jsDocEndRegEx = /^\s*\*\//g;
TypeScriptHelpers.jsDocEndRegEx = /\s*\*\/\s*$/g;
/**

@@ -209,0 +214,0 @@ * Intermediate lines of JSDoc comment character.

{
"name": "@microsoft/api-extractor",
"version": "1.1.0",
"version": "1.1.1",
"description": "Validatation, documentation, and auditing for the exported API of a TypeScript package",

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

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