@veryfi/veryfi-sdk
Advanced tools
Comparing version 1.1.5 to 1.2.0
265
lib/main.js
@@ -5,3 +5,2 @@ const {createHmac} = require('crypto'); | ||
const fs = require('fs'); | ||
const VeryfiClientError = require('./errors'); | ||
@@ -15,14 +14,14 @@ /** | ||
* @param {string} api_key Your Veryfi API key | ||
* @param {string} base_url | ||
* @param {string} api_version | ||
* @param {Number} timeout | ||
* @param {string} base_url | ||
* @param {string} api_version | ||
* @param {Number} timeout | ||
*/ | ||
function Client( | ||
client_id, | ||
client_secret, | ||
username, | ||
api_key, | ||
base_url="https://api.veryfi.com/api/", | ||
api_version="v7", | ||
timeout=120,) { | ||
client_id, | ||
client_secret, | ||
username, | ||
api_key, | ||
base_url = "https://api.veryfi.com/", | ||
api_version = "v8", | ||
timeout = 120,) { | ||
this.client_id = client_id; | ||
@@ -53,2 +52,10 @@ this.client_secret = client_secret; | ||
/** | ||
* Check api version for w2 documents | ||
* @private | ||
* @throws if api_version is different to v8 | ||
*/ | ||
Client.prototype._check_w2_version = function () { | ||
if (this.api_version !== "v8") throw Error("w2 is only supported on v8") | ||
} | ||
@@ -61,5 +68,5 @@ /** | ||
*/ | ||
Client.prototype._get_headers = function (has_files=false){ | ||
Client.prototype._get_headers = function (has_files = false) { | ||
let final_headers = { | ||
"User-Agent": "Node.js Veryfi-Nodejs/1.1.4", | ||
"User-Agent": "Node.js Veryfi-Nodejs/1.2.0", | ||
"Accept": "application/json", | ||
@@ -70,3 +77,3 @@ "Content-Type": "application/json", | ||
}; | ||
if (has_files){ | ||
if (has_files) { | ||
final_headers["Content-Type"] = "application/x-www-form-urlencoded"; | ||
@@ -82,4 +89,4 @@ } | ||
*/ | ||
Client.prototype._get_url = function (){ | ||
return this.base_url + this.api_version; | ||
Client.prototype._get_url = function () { | ||
return this.base_url + "api/" + this.api_version; | ||
} | ||
@@ -94,5 +101,5 @@ | ||
*/ | ||
Client.prototype._generate_signature = function (payload_params, timestamp){ | ||
Client.prototype._generate_signature = function (payload_params, timestamp) { | ||
let payload = `timestamp:${timestamp}`; | ||
for (let i=0; i<Object.keys(payload_params).length; i++){ | ||
for (let i = 0; i < Object.keys(payload_params).length; i++) { | ||
let key = Object.keys(payload_params)[i]; | ||
@@ -122,3 +129,3 @@ let value = payload_params[key]; | ||
*/ | ||
Client.prototype._request = async function (http_verb, endpoint_name, request_arguments, file_stream=null){ | ||
Client.prototype._request = async function (http_verb, endpoint_name, request_arguments, file_stream = null) { | ||
let has_files = (Boolean(file_stream)); | ||
@@ -128,7 +135,9 @@ let headers = this._get_headers(has_files); | ||
if (this.client_secret){ | ||
if (this.client_secret) { | ||
let timestamp = Date.now(); | ||
let signature = this._generate_signature(request_arguments, timestamp); | ||
headers = Object.assign(headers,{"X-Veryfi-Request-Timestamp": timestamp, | ||
"X-Veryfi-Request-Signature": signature}); | ||
headers = Object.assign(headers, { | ||
"X-Veryfi-Request-Timestamp": timestamp, | ||
"X-Veryfi-Request-Signature": signature | ||
}); | ||
} | ||
@@ -139,3 +148,3 @@ | ||
} else { | ||
Object.assign(headers,{...request_arguments}); | ||
Object.assign(headers, {...request_arguments}); | ||
} | ||
@@ -152,5 +161,5 @@ | ||
} catch (response) { | ||
let Err = new VeryfiClientError(response,response['response']['data']); | ||
let err_msg = Err.from_response(response['response']); | ||
throw new Error(err_msg['status'] + err_msg['error']); | ||
let errorStatus = response['response']['status']; | ||
let errorInfo = response['response']['data']['error']; | ||
throw new Error(errorStatus + errorInfo); | ||
} | ||
@@ -165,8 +174,8 @@ } | ||
*/ | ||
Client.prototype.get_documents = async function (){ | ||
Client.prototype.get_documents = async function () { | ||
let endpoint_name = "/documents/"; | ||
let request_arguments = {}; | ||
let documents = await this._request("GET", endpoint_name, request_arguments); | ||
if ("data" in documents){ | ||
return documents["data"]; | ||
if ("data" in documents) { | ||
documents = documents["data"]; | ||
} | ||
@@ -193,6 +202,6 @@ return documents; | ||
* veryfi_client.process_document('file/path', | ||
* ['Entertainment','Food'], | ||
* true, | ||
* ['Entertainment','Food'], | ||
* true, | ||
* {"extra":"parameters"}) | ||
* | ||
* | ||
* @memberof Client | ||
@@ -206,10 +215,10 @@ * @param {String} file_path Path on disk to a file to submit for data extraction | ||
Client.prototype.process_document = async function ( | ||
file_path, | ||
categories = null, | ||
delete_after_processing = false, | ||
{...kwargs} = {} | ||
) { | ||
file_path, | ||
categories = null, | ||
delete_after_processing = false, | ||
{...kwargs} = {} | ||
) { | ||
let endpoint_name = "/documents/"; | ||
if (!categories){ | ||
if (!categories) { | ||
categories = this.CATEGORIES; | ||
@@ -226,3 +235,3 @@ } | ||
}; | ||
request_arguments = Object.assign(request_arguments,kwargs) | ||
request_arguments = Object.assign(request_arguments, kwargs) | ||
let document = await this._request("POST", endpoint_name, request_arguments) | ||
@@ -237,6 +246,6 @@ return document['data']; | ||
* 'receipt.png', | ||
* ['Entertainment','Food'], | ||
* true, | ||
* ['Entertainment','Food'], | ||
* true, | ||
* {'extra': 'parameters'}) | ||
* | ||
* | ||
* @memberof Client | ||
@@ -251,11 +260,11 @@ * @param {String} base64_encoded_string Buffer of a file to submit for data extraction | ||
Client.prototype.process_document_buffer = async function ( | ||
base64_encoded_string, | ||
file_name, | ||
categories = null, | ||
delete_after_processing = false, | ||
{...kwargs} = {} | ||
) { | ||
base64_encoded_string, | ||
file_name, | ||
categories = null, | ||
delete_after_processing = false, | ||
{...kwargs} = {} | ||
) { | ||
let endpoint_name = "/documents/"; | ||
if (!categories){ | ||
if (!categories) { | ||
categories = this.CATEGORIES; | ||
@@ -269,3 +278,3 @@ } | ||
}; | ||
request_arguments = Object.assign(request_arguments,kwargs) | ||
request_arguments = Object.assign(request_arguments, kwargs) | ||
let document = await this._request("POST", endpoint_name, request_arguments) | ||
@@ -292,13 +301,13 @@ return document['data']; | ||
Client.prototype.process_document_url = async function ( | ||
file_url = "", | ||
file_urls = null, | ||
categories = null, | ||
delete_after_processing = false, | ||
boost_mode = 0, | ||
external_id = "", | ||
max_pages_to_process = 1, | ||
{...kwargs} = {}, | ||
) { | ||
file_url = "", | ||
file_urls = null, | ||
categories = null, | ||
delete_after_processing = false, | ||
boost_mode = 0, | ||
external_id = "", | ||
max_pages_to_process = 1, | ||
{...kwargs} = {}, | ||
) { | ||
let endpoint_name = "/documents/"; | ||
if (!categories){ | ||
if (!categories) { | ||
categories = this.CATEGORIES; | ||
@@ -315,3 +324,3 @@ } | ||
}; | ||
request_arguments = Object.assign(request_arguments,kwargs) | ||
request_arguments = Object.assign(request_arguments, kwargs) | ||
let response = await this._request("POST", endpoint_name, request_arguments); | ||
@@ -323,11 +332,10 @@ return response['data']; | ||
* Delete document from Veryfi | ||
* | ||
* | ||
* @memberof Client | ||
* @param {string} document_id ID of the document you'd like to delete | ||
*/ | ||
Client.prototype.delete_document = async function (document_id){ | ||
Client.prototype.delete_document = async function (document_id) { | ||
let endpoint_name = `/documents/${document_id}/`; | ||
let request_arguments = {"id": document_id}; | ||
let response = await this._request("DELETE", endpoint_name, request_arguments); | ||
return response; | ||
return this._request("DELETE", endpoint_name, request_arguments); | ||
} | ||
@@ -339,3 +347,3 @@ | ||
* veryfi_client.update_document(id, {date:"2021-01-01", notes:"look what I did"}) | ||
* | ||
* | ||
* @memberof Client | ||
@@ -346,3 +354,3 @@ * @param {string} document_id ID of the document you'd like to update | ||
*/ | ||
Client.prototype.update_document = async function (document_id, {...kwargs} = {}){ | ||
Client.prototype.update_document = async function (document_id, {...kwargs} = {}) { | ||
let endpoint_name = `/documents/${document_id}/`; | ||
@@ -353,4 +361,123 @@ let response = await this._request("PUT", endpoint_name, kwargs); | ||
/** | ||
* Get all w2 documents. | ||
* @memberOf Client | ||
* @return {Array} An array of JSON with all w2 documents. | ||
*/ | ||
Client.prototype.get_w2_documents = async function () { | ||
this._check_w2_version() | ||
let endpoint_name = "/w2s/" | ||
let request_arguments = {} | ||
let response = await this._request("GET", endpoint_name, request_arguments) | ||
return response['data']['results'] | ||
} | ||
/** | ||
* Get a w2 document | ||
* @memberOf Client | ||
* @param {string} document_id ID of the document you'd like to retrieve | ||
* @returns {JSON} Data extracted from the Document | ||
*/ | ||
Client.prototype.get_w2_document = async function ( | ||
document_id, | ||
) { | ||
this._check_w2_version() | ||
let endpoint_name = `/w2s/${document_id}/` | ||
let request_arguments = {"id": document_id} | ||
let response = await this._request("GET", endpoint_name, request_arguments) | ||
return response['data'] | ||
} | ||
/** | ||
* Upload a document from a buffer. | ||
* @memberOf Client | ||
* @param {String} file_name The file name including the extension | ||
* @param {String} file_buffer Buffer of a file to submit for data extraction | ||
* @param {boolean} delete_after_processing Delete this document from Veryfi after data has been extracted | ||
* @param {int} max_pages_to_process When sending a long document to Veryfi for processing, this parameter controls how many pages of the document will be read and processed, starting from page 1. | ||
* @param {Object} kwargs Additional request parameters | ||
* @return {JSON} Data extracted from the document. | ||
*/ | ||
Client.prototype.process_w2_document_from_buffer = async function ( | ||
file_name, | ||
file_buffer, | ||
delete_after_processing = null, | ||
max_pages_to_process = null, | ||
{...kwargs} = {} | ||
) { | ||
this._check_w2_version() | ||
let endpoint_name = "/w2s/" | ||
let request_arguments = { | ||
"file_name": file_name, | ||
"file_data": file_buffer, | ||
"auto_delete": delete_after_processing, | ||
"max_pages_to_process": max_pages_to_process, | ||
} | ||
request_arguments = Object.assign(request_arguments, kwargs) | ||
let response = await this._request("POST", endpoint_name, request_arguments) | ||
return response['data'] | ||
} | ||
/** | ||
* Upload a document from a file path | ||
* @param {String} file_path Path on disk to a file to submit for data extraction | ||
* @param {boolean} delete_after_processing Delete this document from Veryfi after data has been extracted | ||
* @param {int} max_pages_to_process When sending a long document to Veryfi for processing, this parameter controls how many pages of the document will be read and processed, starting from page 1. | ||
* @param {Object} kwargs Additional request parameters | ||
* @return {JSON} Data extracted from the document. | ||
*/ | ||
Client.prototype.process_w2_document = async function ( | ||
file_path, | ||
delete_after_processing = false, | ||
max_pages_to_process = 1, | ||
{...kwargs} = {} | ||
) { | ||
const file_name = path.basename(file_path) | ||
const image_file = fs.readFileSync(file_path, {encoding: 'base64'}) | ||
const base64_encoded_string = Buffer.from(image_file).toString('utf-8') | ||
return this.process_w2_document_from_buffer( | ||
file_name, | ||
base64_encoded_string, | ||
delete_after_processing, | ||
max_pages_to_process, | ||
kwargs | ||
) | ||
} | ||
/** | ||
* Process a w2 document from an url. | ||
* @memberOf Client | ||
* @param {String} file_name The file name including the extension | ||
* @memberof Client | ||
* @param {string} file_url Required if file_urls isn't specified. Publicly accessible URL to a file, e.g. "https://cdn.example.com/receipt.jpg". | ||
* @param {Array} file_urls Required if file_url isn't specified. List of publicly accessible URLs to multiple files, e.g. ["https://cdn.example.com/receipt1.jpg", "https://cdn.example.com/receipt2.jpg"] | ||
* @param {boolean} delete_after_processing Delete this document from Veryfi after data has been extracted | ||
* @param {int} max_pages_to_process When sending a long document to Veryfi for processing, this parameter controls how many pages of the document will be read and processed, starting from page 1. | ||
* @param {Object} kwargs Additional request parameters | ||
* @return {JSON} Data extracted from the document. | ||
*/ | ||
Client.prototype.process_w2_document_from_url = async function ( | ||
file_name, | ||
file_url, | ||
file_urls = null, | ||
delete_after_processing = false, | ||
max_pages_to_process = 1, | ||
{...kwargs} = {} | ||
) { | ||
this._check_w2_version() | ||
let endpoint_name = "/w2s/" | ||
let request_arguments = { | ||
"file_name": file_name, | ||
"auto_delete": delete_after_processing, | ||
"file_url": file_url, | ||
"file_urls": file_urls, | ||
"max_pages_to_process": max_pages_to_process | ||
} | ||
request_arguments = Object.assign(request_arguments, kwargs) | ||
let response = await this._request("POST", endpoint_name, request_arguments) | ||
return response['data'] | ||
} | ||
// Exports | ||
module.exports = Client; |
{ | ||
"name": "@veryfi/veryfi-sdk", | ||
"version": "1.1.5", | ||
"version": "1.2.0", | ||
"description": "Node.js module for communicating with the Veryfi OCR API", | ||
@@ -10,3 +10,3 @@ "main": "lib/main.js", | ||
"doc": "jsdoc -d docs --configure jsconf.json main.js", | ||
"generate-docs": "jsdoc --configure .jsdoc.json --verbose" | ||
"generate-docs": "jsdoc --configure jsdoc.json --verbose" | ||
}, | ||
@@ -16,3 +16,4 @@ "author": "Veryfi <support@veryfi.com> (https://www.veryfi.com)", | ||
"contributors": [ | ||
"Matthew Eng <matthew@veryfi.com>" | ||
"Matthew Eng <matthew@veryfi.com>", | ||
"Alejandro Uribe <alejandro@veryfi.com>" | ||
], | ||
@@ -22,3 +23,3 @@ "license": "MIT", | ||
"lib", | ||
"types" | ||
"lib/types" | ||
], | ||
@@ -30,7 +31,13 @@ "directories": { | ||
"devDependencies": { | ||
"jest": "^27.0.5", | ||
"jsdoc": "^3.6.7" | ||
"jest": "^29.0.0", | ||
"jsdoc": "^3.6.7", | ||
"minami": "^1.2.3", | ||
"ts-jest": "^29.0.1", | ||
"typescript": "^4.8.3" | ||
}, | ||
"dependencies": { | ||
"axios": "^0.21.1" | ||
"@jest/globals": "^29.0.3", | ||
"axios": "^0.21.1", | ||
"docdash": "^1.2.0", | ||
"jest-config": "^29.0.3" | ||
}, | ||
@@ -37,0 +44,0 @@ "repository": { |
@@ -44,3 +44,3 @@ # Veryfi SDK for Node.js | ||
The **veryfi** library can be used to communicate with Veryfi API. All available functionality is described here: <https://veryfi.github.io/veryfi-nodejs/Client.html> | ||
The **veryfi** library can be used to communicate with Veryfi API. All available functionality is described here: <https://veryfi.github.io/veryfi-nodejs/> | ||
@@ -255,2 +255,2 @@ Below is a sample script using **Veryfi** for OCR and extracting data from a document: | ||
[![Veryfi Tutorial](https://img.youtube.com/vi/PcJdgnvyfBc/maxresdefault.jpg)](https://www.youtube.com/watch?v=PcJdgnvyfBc) | ||
[![Veryfi Tutorial](https://img.youtube.com/vi/PcJdgnvyfBc/maxresdefault.jpg)](https://www.youtube.com/watch?v=PcJdgnvyfBc) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
34612
685
255
4
5
4
2
+ Added@jest/globals@^29.0.3
+ Addeddocdash@^1.2.0
+ Addedjest-config@^29.0.3
+ Added@ampproject/remapping@2.3.0(transitive)
+ Added@babel/code-frame@7.24.7(transitive)
+ Added@babel/compat-data@7.25.4(transitive)
+ Added@babel/core@7.25.2(transitive)
+ Added@babel/generator@7.25.6(transitive)
+ Added@babel/helper-compilation-targets@7.25.2(transitive)
+ Added@babel/helper-module-imports@7.24.7(transitive)
+ Added@babel/helper-module-transforms@7.25.2(transitive)
+ Added@babel/helper-plugin-utils@7.24.8(transitive)
+ Added@babel/helper-simple-access@7.24.7(transitive)
+ Added@babel/helper-string-parser@7.24.8(transitive)
+ Added@babel/helper-validator-identifier@7.24.7(transitive)
+ Added@babel/helper-validator-option@7.24.8(transitive)
+ Added@babel/helpers@7.25.6(transitive)
+ Added@babel/highlight@7.24.7(transitive)
+ Added@babel/parser@7.25.6(transitive)
+ Added@babel/plugin-syntax-async-generators@7.8.4(transitive)
+ Added@babel/plugin-syntax-bigint@7.8.3(transitive)
+ Added@babel/plugin-syntax-class-properties@7.12.13(transitive)
+ Added@babel/plugin-syntax-class-static-block@7.14.5(transitive)
+ Added@babel/plugin-syntax-import-attributes@7.25.6(transitive)
+ Added@babel/plugin-syntax-import-meta@7.10.4(transitive)
+ Added@babel/plugin-syntax-json-strings@7.8.3(transitive)
+ Added@babel/plugin-syntax-jsx@7.24.7(transitive)
+ Added@babel/plugin-syntax-logical-assignment-operators@7.10.4(transitive)
+ Added@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(transitive)
+ Added@babel/plugin-syntax-numeric-separator@7.10.4(transitive)
+ Added@babel/plugin-syntax-object-rest-spread@7.8.3(transitive)
+ Added@babel/plugin-syntax-optional-catch-binding@7.8.3(transitive)
+ Added@babel/plugin-syntax-optional-chaining@7.8.3(transitive)
+ Added@babel/plugin-syntax-private-property-in-object@7.14.5(transitive)
+ Added@babel/plugin-syntax-top-level-await@7.14.5(transitive)
+ Added@babel/plugin-syntax-typescript@7.25.4(transitive)
+ Added@babel/template@7.25.0(transitive)
+ Added@babel/traverse@7.25.6(transitive)
+ Added@babel/types@7.25.6(transitive)
+ Added@istanbuljs/load-nyc-config@1.1.0(transitive)
+ Added@istanbuljs/schema@0.1.3(transitive)
+ Added@jest/console@29.7.0(transitive)
+ Added@jest/environment@29.7.0(transitive)
+ Added@jest/expect@29.7.0(transitive)
+ Added@jest/expect-utils@29.7.0(transitive)
+ Added@jest/fake-timers@29.7.0(transitive)
+ Added@jest/globals@29.7.0(transitive)
+ Added@jest/schemas@29.6.3(transitive)
+ Added@jest/source-map@29.6.3(transitive)
+ Added@jest/test-result@29.7.0(transitive)
+ Added@jest/test-sequencer@29.7.0(transitive)
+ Added@jest/transform@29.7.0(transitive)
+ Added@jest/types@29.6.3(transitive)
+ Added@jridgewell/gen-mapping@0.3.5(transitive)
+ Added@jridgewell/resolve-uri@3.1.2(transitive)
+ Added@jridgewell/set-array@1.2.1(transitive)
+ Added@jridgewell/sourcemap-codec@1.5.0(transitive)
+ Added@jridgewell/trace-mapping@0.3.25(transitive)
+ Added@sinclair/typebox@0.27.8(transitive)
+ Added@sinonjs/commons@3.0.1(transitive)
+ Added@sinonjs/fake-timers@10.3.0(transitive)
+ Added@types/babel__core@7.20.5(transitive)
+ Added@types/babel__generator@7.6.8(transitive)
+ Added@types/babel__template@7.4.4(transitive)
+ Added@types/babel__traverse@7.20.6(transitive)
+ Added@types/graceful-fs@4.1.9(transitive)
+ Added@types/istanbul-lib-coverage@2.0.6(transitive)
+ Added@types/istanbul-lib-report@3.0.3(transitive)
+ Added@types/istanbul-reports@3.0.4(transitive)
+ Added@types/node@22.7.3(transitive)
+ Added@types/stack-utils@2.0.3(transitive)
+ Added@types/yargs@17.0.33(transitive)
+ Added@types/yargs-parser@21.0.3(transitive)
+ Addedansi-escapes@4.3.2(transitive)
+ Addedansi-regex@5.0.1(transitive)
+ Addedansi-styles@3.2.14.3.05.2.0(transitive)
+ Addedanymatch@3.1.3(transitive)
+ Addedargparse@1.0.10(transitive)
+ Addedbabel-jest@29.7.0(transitive)
+ Addedbabel-plugin-istanbul@6.1.1(transitive)
+ Addedbabel-plugin-jest-hoist@29.6.3(transitive)
+ Addedbabel-preset-current-node-syntax@1.1.0(transitive)
+ Addedbabel-preset-jest@29.6.3(transitive)
+ Addedbalanced-match@1.0.2(transitive)
+ Addedbrace-expansion@1.1.11(transitive)
+ Addedbraces@3.0.3(transitive)
+ Addedbrowserslist@4.24.0(transitive)
+ Addedbser@2.1.1(transitive)
+ Addedbuffer-from@1.1.2(transitive)
+ Addedcallsites@3.1.0(transitive)
+ Addedcamelcase@5.3.16.3.0(transitive)
+ Addedcaniuse-lite@1.0.30001664(transitive)
+ Addedchalk@2.4.24.1.2(transitive)
+ Addedchar-regex@1.0.2(transitive)
+ Addedci-info@3.9.0(transitive)
+ Addedcjs-module-lexer@1.4.1(transitive)
+ Addedco@4.6.0(transitive)
+ Addedcollect-v8-coverage@1.0.2(transitive)
+ Addedcolor-convert@1.9.32.0.1(transitive)
+ Addedcolor-name@1.1.31.1.4(transitive)
+ Addedconcat-map@0.0.1(transitive)
+ Addedconvert-source-map@2.0.0(transitive)
+ Addeddebug@4.3.7(transitive)
+ Addeddedent@1.5.3(transitive)
+ Addeddeepmerge@4.3.1(transitive)
+ Addeddetect-newline@3.1.0(transitive)
+ Addeddiff-sequences@29.6.3(transitive)
+ Addeddocdash@1.2.0(transitive)
+ Addedelectron-to-chromium@1.5.29(transitive)
+ Addedemittery@0.13.1(transitive)
+ Addederror-ex@1.3.2(transitive)
+ Addedescalade@3.2.0(transitive)
+ Addedescape-string-regexp@1.0.52.0.0(transitive)
+ Addedesprima@4.0.1(transitive)
+ Addedexpect@29.7.0(transitive)
+ Addedfast-json-stable-stringify@2.1.0(transitive)
+ Addedfb-watchman@2.0.2(transitive)
+ Addedfill-range@7.1.1(transitive)
+ Addedfind-up@4.1.0(transitive)
+ Addedfs.realpath@1.0.0(transitive)
+ Addedfsevents@2.3.3(transitive)
+ Addedfunction-bind@1.1.2(transitive)
+ Addedgensync@1.0.0-beta.2(transitive)
+ Addedget-package-type@0.1.0(transitive)
+ Addedglob@7.2.3(transitive)
+ Addedglobals@11.12.0(transitive)
+ Addedgraceful-fs@4.2.11(transitive)
+ Addedhas-flag@3.0.04.0.0(transitive)
+ Addedhasown@2.0.2(transitive)
+ Addedimurmurhash@0.1.4(transitive)
+ Addedinflight@1.0.6(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedis-arrayish@0.2.1(transitive)
+ Addedis-core-module@2.15.1(transitive)
+ Addedis-generator-fn@2.1.0(transitive)
+ Addedis-number@7.0.0(transitive)
+ Addedistanbul-lib-coverage@3.2.2(transitive)
+ Addedistanbul-lib-instrument@5.2.1(transitive)
+ Addedjest-circus@29.7.0(transitive)
+ Addedjest-config@29.7.0(transitive)
+ Addedjest-diff@29.7.0(transitive)
+ Addedjest-docblock@29.7.0(transitive)
+ Addedjest-each@29.7.0(transitive)
+ Addedjest-environment-node@29.7.0(transitive)
+ Addedjest-get-type@29.6.3(transitive)
+ Addedjest-haste-map@29.7.0(transitive)
+ Addedjest-leak-detector@29.7.0(transitive)
+ Addedjest-matcher-utils@29.7.0(transitive)
+ Addedjest-message-util@29.7.0(transitive)
+ Addedjest-mock@29.7.0(transitive)
+ Addedjest-pnp-resolver@1.2.3(transitive)
+ Addedjest-regex-util@29.6.3(transitive)
+ Addedjest-resolve@29.7.0(transitive)
+ Addedjest-runner@29.7.0(transitive)
+ Addedjest-runtime@29.7.0(transitive)
+ Addedjest-snapshot@29.7.0(transitive)
+ Addedjest-util@29.7.0(transitive)
+ Addedjest-validate@29.7.0(transitive)
+ Addedjest-watcher@29.7.0(transitive)
+ Addedjest-worker@29.7.0(transitive)
+ Addedjs-tokens@4.0.0(transitive)
+ Addedjs-yaml@3.14.1(transitive)
+ Addedjsesc@2.5.2(transitive)
+ Addedjson-parse-even-better-errors@2.3.1(transitive)
+ Addedjson5@2.2.3(transitive)
+ Addedleven@3.1.0(transitive)
+ Addedlines-and-columns@1.2.4(transitive)
+ Addedlocate-path@5.0.0(transitive)
+ Addedlru-cache@5.1.1(transitive)
+ Addedmakeerror@1.0.12(transitive)
+ Addedmerge-stream@2.0.0(transitive)
+ Addedmicromatch@4.0.8(transitive)
+ Addedminimatch@3.1.2(transitive)
+ Addedms@2.1.3(transitive)
+ Addednatural-compare@1.4.0(transitive)
+ Addednode-int64@0.4.0(transitive)
+ Addednode-releases@2.0.18(transitive)
+ Addednormalize-path@3.0.0(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedp-limit@2.3.03.1.0(transitive)
+ Addedp-locate@4.1.0(transitive)
+ Addedp-try@2.2.0(transitive)
+ Addedparse-json@5.2.0(transitive)
+ Addedpath-exists@4.0.0(transitive)
+ Addedpath-is-absolute@1.0.1(transitive)
+ Addedpath-parse@1.0.7(transitive)
+ Addedpicocolors@1.1.0(transitive)
+ Addedpicomatch@2.3.1(transitive)
+ Addedpirates@4.0.6(transitive)
+ Addedpretty-format@29.7.0(transitive)
+ Addedpure-rand@6.1.0(transitive)
+ Addedreact-is@18.3.1(transitive)
+ Addedresolve@1.22.8(transitive)
+ Addedresolve-from@5.0.0(transitive)
+ Addedresolve.exports@2.0.2(transitive)
+ Addedsemver@6.3.17.6.3(transitive)
+ Addedsignal-exit@3.0.7(transitive)
+ Addedslash@3.0.0(transitive)
+ Addedsource-map@0.6.1(transitive)
+ Addedsource-map-support@0.5.13(transitive)
+ Addedsprintf-js@1.0.3(transitive)
+ Addedstack-utils@2.0.6(transitive)
+ Addedstring-length@4.0.2(transitive)
+ Addedstrip-ansi@6.0.1(transitive)
+ Addedstrip-bom@4.0.0(transitive)
+ Addedstrip-json-comments@3.1.1(transitive)
+ Addedsupports-color@5.5.07.2.08.1.1(transitive)
+ Addedsupports-preserve-symlinks-flag@1.0.0(transitive)
+ Addedtest-exclude@6.0.0(transitive)
+ Addedtmpl@1.0.5(transitive)
+ Addedto-fast-properties@2.0.0(transitive)
+ Addedto-regex-range@5.0.1(transitive)
+ Addedtype-detect@4.0.8(transitive)
+ Addedtype-fest@0.21.3(transitive)
+ Addedundici-types@6.19.8(transitive)
+ Addedupdate-browserslist-db@1.1.1(transitive)
+ Addedwalker@1.0.8(transitive)
+ Addedwrappy@1.0.2(transitive)
+ Addedwrite-file-atomic@4.0.2(transitive)
+ Addedyallist@3.1.1(transitive)
+ Addedyocto-queue@0.1.0(transitive)