├── .github └── workflows │ └── node.js.yml ├── .gitignore ├── .npmrc ├── .travis.yml ├── LICENSE ├── Makefile ├── README.md ├── lib ├── AppleAppStoreSearch.js ├── BaiduSearch.js ├── BingSearch.js ├── DuckDuckGoSearch.js ├── EbaySearch.js ├── GoogleSearch.js ├── HomeDepotSearch.js ├── NaverSearch.js ├── SerpApiSearch.js ├── WalmartSearch.js ├── YahooSearch.js ├── YandexSearch.js ├── YoutubeSearch.js └── main.js ├── oobt ├── google_demo.js └── package.json ├── package-lock.json ├── package.json └── test ├── AccountApiSpec.js ├── AppleAppStoreSearchSpec.js ├── BaiduSearchSpec.js ├── BingSearchSpec.js ├── DuckDuckGoSpec.js ├── EbaySearchSpec.js ├── ExampleSpec.js ├── GoogleSearchSpec.js ├── HomeDepotSpec.js ├── LocationApiSpec.js ├── NaverSpec.js ├── SearchArchiveApiSpec.js ├── SerpApiClientSpec.js ├── WalmartSearchSpec.js ├── YahooSearchSpec.js ├── YandexSearchSpec.js └── YoutubeSearchSpec.js /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: test 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | pull_request: 10 | branches: [ master ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | strategy: 18 | matrix: 19 | node-version: [10.x, 12.x, 14.x, 16.x, 17.x ] 20 | 21 | steps: 22 | - uses: actions/checkout@v2 23 | - name: Use Node.js ${{ matrix.node-version }} 24 | uses: actions/setup-node@v1 25 | with: 26 | node-version: ${{ matrix.node-version }} 27 | - run: npm ci 28 | - run: npm test 29 | env: 30 | API_KEY: ${{secrets.API_KEY}} 31 | - run: make oobt 32 | env: 33 | API_KEY: ${{secrets.API_KEY}} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | *.tgz 3 | *.rb 4 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | //registry.npmjs.org/:_authToken=${NPM_TOKEN} 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "7" 4 | - "11.12.0" 5 | before_script: 6 | - "npm install" 7 | script: 8 | - "npm test" 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018-2023 SerpApi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | root=$(shell pwd) 2 | pkg=$(shell ls *.tgz | head -1) 3 | 4 | all: test 5 | 6 | .PHONY: test oobt 7 | 8 | package: 9 | npm pack 10 | 11 | oobt: package 12 | rm -rf /oobt/tmp 13 | cp -R oobt /tmp 14 | cd /tmp/oobt ; \ 15 | npm install --save ${root}/${pkg} 16 | cd /tmp/oobt ; \ 17 | npm run-script run 18 | 19 | test: 20 | npm test 21 | 22 | autotest: 23 | npm run test -- --watch 24 | 25 | release: test 26 | npm publish -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Google Search Node.js 2 | 3 | [![npm version](https://badge.fury.io/js/google-search-results-nodejs.svg)](https://badge.fury.io/js/google-search-results-nodejs) 4 | ![test](https://github.com/serpapi/google-search-results-nodejs/workflows/test/badge.svg) 5 | 6 | `google-search-results-nodejs` is a MIT-licensed [Node.js](https://nodejs.org/en/) package that meant to [scrape](https://en.wikipedia.org/wiki/Web_scraping) search results from Google, Bing, Baidu, Yahoo and [10+ more search engines](#supported-engines) with a [SerpApi](https://serpapi.com/) backend. SerpApi provides a [Playground](https://serpapi.com/playground) to get you started quickly by testing API interactively. 7 | 8 | Find SerpApi documentation at: https://serpapi.com/search-api 9 | 10 | Find SerpApi package at: https://www.npmjs.com/package/google-search-results-nodejs 11 | 12 | 13 |
14 | Table of Contents 15 | 16 | - [Requirements](#requirements) 17 | - [Installation](#installation) 18 | - [Quick Start](#quick-start) 19 | - [How SerpApi backend works](#how-serpapi-backend-works) 20 | - [How to set SerpApi key](#how-to-set-serpapi-key) 21 | - [Google Search API Capability](#google-search-api-capability) 22 | - [Supported Engines](#supported-engines) 23 | - [Example by Specification](#example-by-specification) 24 | - [Extra APIs](#extra-apis) 25 | - [Location API](#location-api) 26 | - [Search Archive API](#search-archive-api) 27 | - [Account API](#account-api) 28 | - [Promise and Callback](#promise-and-callback) 29 | - [Coding Style](#coding-style) 30 | - [Run Regression](#run-regression) 31 | - [Error Management](#error-management) 32 | - [Changelog](#change-log) 33 |
34 | 35 | ## Requirements 36 | 37 | - ES6 basic understanding 38 | - Node 7+ and [NPM installed](https://www.npmjs.com/package/npm) 39 | 40 | ## Installation 41 | 42 | ```bash 43 | $ npm install google-search-results-nodejs 44 | ``` 45 | 46 | ## Quick start 47 | 48 | The following example runs a search for `"coffee"` using your secret API key which you can find at [SerpApi Dashboard](https://serpapi.com/manage-api-key) page. 49 | 50 | [Open in the online IDE](https://replit.com/@serpapi/google-search-results-nodejs-quick-start?v=1) (Replit). 51 | 52 | ```javascript 53 | const SerpApi = require('google-search-results-nodejs') 54 | const search = new SerpApi.GoogleSearch("") 55 | 56 | search.json({ 57 | q: "Coffee", 58 | location: "Austin, TX" 59 | }, (result) => { 60 | console.log(result) 61 | }) 62 | ``` 63 | 64 | ### How SerpApi backend works 65 | 66 | ![image](https://user-images.githubusercontent.com/78694043/192951614-81ea265f-a8d4-49eb-9b51-10b09868b875.png) 67 | 68 | ## How to set SerpApi key 69 | 70 | `api_key` can be set globally using a singleton pattern: 71 | 72 | ```javascript 73 | // https://serpapi.com/manage-api-key 74 | const SerpApi = require("google-search-results-nodejs") 75 | const search = new SerpApi.GoogleSearch("") 76 | ``` 77 | 78 | `api_key` can be [read from the environment variable](https://nodejs.dev/en/learn/how-to-read-environment-variables-from-nodejs/): 79 | 80 | ```javascript 81 | const search = new SerpApi.GoogleSearch(process.env.API_KEY); 82 | ``` 83 | 84 | `api_key` can be provided for each request: 85 | 86 | ```javascript 87 | const SerpApi = require("google-search-results-nodejs") 88 | const search = new SerpApi.GoogleSearch() 89 | 90 | let result = search.json({ 91 | api_key: "", // https://serpapi.com/manage-api-key 92 | q: "Coffee", // search query 93 | location: "Austin, TX", // location of the search 94 | }, (data) => { 95 | console.log(data) 96 | }) 97 | ``` 98 | 99 | ## Google Search API Capability 100 | 101 | ```javascript 102 | const SerpApi = require("google-search-results-nodejs") 103 | const search = new SerpApi.GoogleSearch() 104 | 105 | query_params = { 106 | api_key: "asdewqe1231241asm", // Your SerpApi API key, https://serpapi.com/manage-api-key 107 | q: "coffee", // Search query. 108 | google_domain: "google.com", // Google domain to use. 109 | location: "Austin, Texas, United States", // Location requested for the search. 110 | uule: "w+CAIQICINVW5pdGVkIFN0YXRlcw", // Google encoded location you want to use for the search. 111 | ludocid: "CID ID", // ID (CID) of the Google My Business listing you want to scrape. 112 | lsig: "AB86z5W5r155sIcs3jqfYkm9Y8Fp", // Force the knowledge graph map view to show up. 113 | device: "desktop|mobile|tablet", // Device used when making a search. 114 | hl: "en", // Language of the search. 115 | gl: "gl", // Country of the search. 116 | lr: "lang_en|lang_fr", // One or multiple languages to limit the search to. 117 | safe: "active|off", // Level of filtering for adult content. 118 | nfpr: "1|0", // Exclusion of results from an auto-corrected query that is spelled wrong. 119 | num: "100", // Number of results per page. 120 | start: "20", // Pagination offset. 121 | ijn:"1", // Page number for Google Images. 122 | tbm: "nws|isch|shop|lcl|vid", // Type of search: news, images, shopping. local, video results. 123 | tbs: "custom to be search criteria", // Advanced search for patents, dates, news, videos, images, apps, or text contents 124 | async: True|False, // Allow async request. 125 | no_cache: True|False // Force SerpApi to fetch the Google results even if a cached version is already present 126 | } 127 | 128 | const callback = (data) => { 129 | console.log(data) // create a callback 130 | } 131 | 132 | search.json(query_params, callback) // Show result as JSON 133 | search.html(query_params, callback) // Show result as HTML file 134 | ``` 135 | 136 | ## Supported Engines 137 | 138 |
139 | Google Search and 20+ other engines 👇 140 | 141 | | Engine | Class name | 142 | |------------------------------------------------------------------------------|-------------------------| 143 | | [Google Search Engine](https://serpapi.com/search-api) | `GoogleSearch()` | 144 | | [Google Maps](https://serpapi.com/google-maps-api) | `GoogleSearch()` | 145 | | [Google Jobs](https://serpapi.com/google-jobs-api) | `GoogleSearch()` | 146 | | [Google Trends](https://serpapi.com/google-trends-api) | `GoogleSearch()` | 147 | | [Google Autocomplete](https://serpapi.com/google-autocomplete-api) | `GoogleScholarSearch()` | 148 | | [Google About This Result](https://serpapi.com/google-about-this-result) | `GoogleSearch()` | 149 | | [Google Lens](https://serpapi.com/google-lens-api) | `GoogleSearch()` | 150 | | [Google Finance](https://serpapi.com/google-finance-api) | `GoogleSearch()` | 151 | | [Google Related Questions](https://serpapi.com/google-related-questions-api) | `GoogleScholarSearch()` | 152 | | [Google Scholar](https://serpapi.com/google-scholar-api) | `GoogleScholarSearch()` | 153 | | [Google Play Store](https://serpapi.com/google-play-api) | `GoogleSearch()` | 154 | | [Google Product](https://serpapi.com/google-product-api) | `GoogleSearch()` | 155 | | [Google Immersive Product](https://serpapi.com/google-immersive-product-api) | `GoogleSearch()` | 156 | | [Google Reverse Image](https://serpapi.com/google-reverse-image) | `GoogleSearch()` | 157 | | [Google Events](https://serpapi.com/google-events-api) | `GoogleSearch()` | 158 | | [Google Local Services](https://serpapi.com/google-local-services-api) | `GoogleSearch()` | 159 | | [Bing](https://serpapi.com/bing-search-api) | `BingSearch()` | 160 | | [Baidu](https://serpapi.com/baidu-search-api) | `BaiduSearch()` | 161 | | [DuckDuckGo](https://serpapi.com/duckduckgo-search-api) | `DuckDuckGoSearch()` | 162 | | [Yahoo](https://serpapi.com/yahoo-search-api) | `YahooSearch()` | 163 | | [Yandex](https://serpapi.com/yandex-search-api) | `YandexSearch()` | 164 | | [eBay](https://serpapi.com/ebay-search-api) | `EbaySearch()` | 165 | | [Youtube](https://serpapi.com/youtube-search-api) | `YoutubeSearch()` | 166 | | [Walmart](https://serpapi.com/walmart-search-api) | `WalmartSearch()` | 167 | | [HomeDepot](https://serpapi.com/home-depot-search-api) | `HomeDepotSearch()` | 168 | | [Apple App Store](https://serpapi.com/apple-app-store) | `AppleAppStoreSearch()` | 169 | | [Naver](https://serpapi.com/naver-search-api) | `NaverSearch()` | 170 | | [Yelp](https://serpapi.com/yelp-search-api) | `YelpSearch()` | 171 | 172 |
173 | 174 | ## Example by specification 175 | 176 | We love open source, continuous integration and [Test Driven Development](https://en.wikipedia.org/wiki/Test-driven_development) (TDD). We are using [Mocha](https://mochajs.org/) to test [our infrastructure around the clock](https://travis-ci.org/serpapi/google-search-results-nodejs) to achieve the best [Quality of Service](https://en.wikipedia.org/wiki/Quality_of_service) (QoS). 177 | 178 | The directory `test/` includes specification/examples. 179 | 180 | Set your API key: 181 | 182 | ```bash 183 | export API_KEY="" 184 | ``` 185 | 186 | Run all tests: 187 | 188 | ```bash 189 | npm test 190 | ``` 191 | 192 | ## Extra APIs 193 | 194 | ### Location API 195 | 196 | ```javascript 197 | const search = new SerpApi.GoogleSearch("") 198 | 199 | search.location("Austin", 3, (data) => { 200 | console.log(data) 201 | }) 202 | ``` 203 | 204 | Prints the first three (3) locations matching Austin (Texas, Texas, Rochester) 205 | 206 | ```javascript 207 | [ 208 | { 209 | "id":"585069bdee19ad271e9bc072", 210 | "google_id":200635, 211 | "google_parent_id":21176, 212 | "name":"Austin, TX", 213 | "canonical_name":"Austin,TX,Texas,United States", 214 | "country_code":"US", 215 | "target_type":"DMA Region", 216 | "reach":5560000, 217 | "gps":[ 218 | -97.7430608, 219 | 30.267153 220 | ], 221 | "keys":[ 222 | "austin", 223 | "tx", 224 | "texas", 225 | "united", 226 | "states" 227 | ] 228 | }, ... other results 229 | ] 230 | ``` 231 | 232 | ### Search Archive API 233 | 234 | The first search result returns a `search_id` which can be provided to get the search result from the archive. The following code will print the search from the archive. 235 | 236 | ```javascript 237 | var search = new SerpApi.GoogleSearch("") 238 | 239 | search.json({q: "Coffee", location: "Portland" }, (search_result) => { 240 | // search in archive for the search just returned 241 | search.search_archive(search_result.search_metadata.id, (archived_search) => { 242 | console.log(archived_search) 243 | }) 244 | }) 245 | ``` 246 | 247 | ### Account API 248 | 249 | The following code snippet will print your account information. 250 | 251 | ```javascript 252 | const search = new SerpApi.GoogleSearch("") 253 | 254 | search.account((data) => { 255 | console.log(data) 256 | }) 257 | ``` 258 | 259 | ## Promise and callback 260 | 261 | This API was developped using basic callback to handle response. Exception are just throw away with interceptor. 262 | 263 | If you want to take advantage of the promise to block the request, here is how we'll do: 264 | 265 | ```javascript 266 | const util = require('util') 267 | 268 | function getJson(parameter, resolve, reject) { 269 | const search = new SerpApi.GoogleSearch("") 270 | try { 271 | search.json(parameter, resolve) 272 | } catch (e) { 273 | reject(e) 274 | } 275 | } 276 | 277 | const blockFn = util.promisify(getJson) 278 | blockFn[util.promisify.custom](parameter).then((data) => { 279 | expect(data.local_results[0].title.length).toBeGreaterThan(5) 280 | done() 281 | }).catch((error) => { 282 | console.error(error) 283 | done() 284 | }) 285 | ``` 286 |
287 | Practical code example using Google Images API 288 | 289 | [Open in the online IDE](https://replit.com/@serpapi/google-search-results-nodejs-practical-code-example?v=1) (Replit) 290 | 291 | ```javascript 292 | const SerpApi = require("google-search-results-nodejs"); 293 | const search = new SerpApi.GoogleSearch(process.env.API_KEY); // your serpapi API key, https://serpapi.com/manage-api-key 294 | 295 | const searchQuery = "coffee"; 296 | 297 | const params = { 298 | q: searchQuery, // what we want to search 299 | engine: "google", // parsing engine 300 | hl: "en", // parameter defines the language to use for the Google search 301 | gl: "us", // parameter defines the country to use for the Google search 302 | tbm: "isch", // parameter defines the type of search you want to do (isch - Google Images) 303 | }; 304 | 305 | const getJson = () => { 306 | return new Promise((resolve) => { 307 | search.json(params, resolve); 308 | }); 309 | }; 310 | 311 | const getResults = async () => { 312 | const imagesResults = []; 313 | 314 | while (true) { 315 | const json = await getJson(); 316 | if (json.images_results) { 317 | imagesResults.push(...json.images_results); 318 | params.ijn ? (params.ijn += 1) : (params.ijn = 1); 319 | } else break; 320 | } 321 | return imagesResults; 322 | }; 323 | 324 | getResults().then((result) => console.dir(result, { depth: null })); 325 | ``` 326 |
327 | 328 | Reference: 329 | * test: `test/ExampleSpec.js` 330 | * documentation: https://nodejs.org/docs/latest-v8.x/api/util.html#util_util_promisify_original 331 | 332 | ## Coding style 333 | 334 | This API is using callback to run in non-blocking code. Here we are trying to follow the spirit of NodeJS. 335 | 336 | Reference: 337 | * https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/ 338 | * https://nodejs.org/en/docs/guides/dont-block-the-event-loop/ 339 | 340 | For pratical example, you can see the test located under `test/` folder. 341 | 342 | ## Run regression 343 | 344 | To run the regression suite. 345 | ```bash 346 | export API_KEY="your api key" 347 | make test 348 | ``` 349 | 350 | ## Error Management 351 | 352 | SerpApi keeps error management simple: 353 | 1. backend service error or search fail. 354 | 2. client error. 355 | 356 | If it's a backend error, a simple error message is returned as string in the server response. If it's a client error, then a `SerpApiClientException` is raised. 357 | 358 | ## Change log 359 | 360 | * 2.1 361 | * add support for Naver, HomeDepot, AppleStoreApp, DuckDuckGo 362 | * defeature location if it is not supported by the search engine 363 | * 2.0.1 364 | * fix classes loading. 365 | * 2.0 366 | * Refractor class name: SearchResult -> Search 367 | * 1.2 368 | * stable version to support all the basic search API. 369 | -------------------------------------------------------------------------------- /lib/AppleAppStoreSearch.js: -------------------------------------------------------------------------------- 1 | const SerpApiSearch = require('./SerpApiSearch') 2 | 3 | class AppleAppStore extends SerpApiSearch { 4 | 5 | constructor(api_key) { 6 | super(api_key, "apple_app_store"); 7 | } 8 | 9 | location(q, limit, callback) { 10 | throw "location is not supported for: " + this.engine ; 11 | } 12 | } 13 | 14 | module.exports = AppleAppStore -------------------------------------------------------------------------------- /lib/BaiduSearch.js: -------------------------------------------------------------------------------- 1 | const SerpApiSearch = require('./SerpApiSearch') 2 | 3 | class BaiduSearch extends SerpApiSearch { 4 | 5 | constructor(api_key) { 6 | super(api_key, "baidu") 7 | } 8 | } 9 | 10 | module.exports = BaiduSearch -------------------------------------------------------------------------------- /lib/BingSearch.js: -------------------------------------------------------------------------------- 1 | const SerpApiSearch = require('./SerpApiSearch') 2 | 3 | class BingSearch extends SerpApiSearch { 4 | 5 | constructor(api_key) { 6 | super(api_key, "bing") 7 | } 8 | } 9 | 10 | module.exports = BingSearch -------------------------------------------------------------------------------- /lib/DuckDuckGoSearch.js: -------------------------------------------------------------------------------- 1 | const SerpApiSearch = require('./SerpApiSearch') 2 | 3 | class DuckDuckGoSearch extends SerpApiSearch { 4 | 5 | constructor(api_key) { 6 | super(api_key, "duckduckgo") 7 | } 8 | } 9 | 10 | module.exports = DuckDuckGoSearch -------------------------------------------------------------------------------- /lib/EbaySearch.js: -------------------------------------------------------------------------------- 1 | const SerpApiSearch = require('./SerpApiSearch') 2 | 3 | class EbaySearch extends SerpApiSearch { 4 | 5 | constructor(api_key) { 6 | super(api_key, "ebay") 7 | } 8 | } 9 | 10 | module.exports = EbaySearch -------------------------------------------------------------------------------- /lib/GoogleSearch.js: -------------------------------------------------------------------------------- 1 | const SerpApiSearch = require('./SerpApiSearch') 2 | 3 | class GoogleSearch extends SerpApiSearch { 4 | 5 | constructor(api_key) { 6 | super(api_key, "google") 7 | } 8 | } 9 | 10 | module.exports = GoogleSearch -------------------------------------------------------------------------------- /lib/HomeDepotSearch.js: -------------------------------------------------------------------------------- 1 | const SerpApiSearch = require('./SerpApiSearch') 2 | 3 | class HomeDepotSearch extends SerpApiSearch { 4 | 5 | constructor(api_key) { 6 | super(api_key, "home_depot") 7 | } 8 | 9 | location(q, limit, callback) { 10 | throw "location is not supported for: " + this.engine ; 11 | } 12 | } 13 | 14 | module.exports = HomeDepotSearch -------------------------------------------------------------------------------- /lib/NaverSearch.js: -------------------------------------------------------------------------------- 1 | const SerpApiSearch = require('./SerpApiSearch') 2 | 3 | class NaverSearch extends SerpApiSearch { 4 | 5 | constructor(api_key) { 6 | super(api_key, "naver") 7 | } 8 | 9 | location(q, limit, callback) { 10 | throw "location is not supported for: " + this.engine ; 11 | } 12 | } 13 | 14 | module.exports = NaverSearch -------------------------------------------------------------------------------- /lib/SerpApiSearch.js: -------------------------------------------------------------------------------- 1 | const search = require('https'); 2 | const querystring = require('querystring'); 3 | const LOCATION_API = "/locations.json" 4 | 5 | /*** 6 | * SerpApiSearch generic implementation to call serpapi.com 7 | */ 8 | class SerpApiSearch { 9 | 10 | constructor(api_key = null, engine = 'google', timeout = 60000) { 11 | if (api_key != null) { 12 | this.api_key = api_key 13 | } 14 | // set search engine 15 | this.engine = engine 16 | 17 | // set default timeout 18 | this.defaultTimeout = timeout 19 | } 20 | 21 | // build url on the fly 22 | // private 23 | buildUrl(path, parameter, output) { 24 | // Set language 25 | parameter["source"] = "nodejs" 26 | 27 | // Set format 28 | if (output != null) { 29 | parameter["output"] = output 30 | } 31 | 32 | // Add api_key 33 | if (parameter["api_key"] == null) { 34 | if (this.api_key != null) { 35 | parameter["api_key"] = this.api_key 36 | } 37 | else if (path == LOCATION_API) { 38 | // skip free request 39 | } 40 | else { 41 | throw new Error("api_key is required. copy it from: https://serpapi.com/dashboard ") 42 | } 43 | } 44 | 45 | if (parameter['engine'] == null) { 46 | parameter['engine'] = this.engine 47 | } 48 | 49 | // build url 50 | return "https://serpapi.com" + path + "?" + querystring.stringify(parameter) 51 | } 52 | 53 | /*** 54 | * setTimeout 55 | * @param timeout maximum time to wait the http response in ms (default: 60000ms) 56 | */ 57 | setTimeout(timeout) { 58 | this.defaultTimeout = timeout 59 | } 60 | 61 | /*** 62 | * execute 63 | * 64 | * @param path URL path 65 | * @param parameter query 66 | * @param callback handle next step 67 | * @param output format json|html 68 | */ 69 | execute(path, parameter, callback, output) { 70 | let url = this.buildUrl(path, parameter, output) 71 | search.timeout = this.defaultTimeout 72 | search.get(url, (resp) => { 73 | let data = '' 74 | 75 | // A chunk of data has been recieved. 76 | resp.on('data', (chunk) => { 77 | data += chunk 78 | }) 79 | 80 | // The whole response has been received. Print out the result. 81 | resp.on('end', () => { 82 | try { 83 | if (resp.statusCode == 200) { 84 | callback(data) 85 | } else { 86 | throw data 87 | } 88 | } catch (e) { 89 | throw e 90 | } 91 | }); 92 | 93 | }).on("error", (err) => { 94 | throw err; 95 | }); 96 | } 97 | 98 | /*** 99 | * Run raw search query 100 | * 101 | * @param [Map] parameter (see: serpapi.com) 102 | * @param [Function] callback 103 | */ 104 | search(parameter, output, callback) { 105 | this.execute("/search", parameter, callback, output) 106 | } 107 | 108 | /*** 109 | * Provide json search result in the callback 110 | * 111 | * @param [Map] parameter query 112 | * @param [Function] callback with search result as json 113 | */ 114 | json(parameter, callback) { 115 | this.search(parameter, "json", (data) => { 116 | let parsed = JSON.parse(data) 117 | callback(parsed) 118 | }) 119 | } 120 | 121 | /*** 122 | * Provide html search result in the callback 123 | * 124 | * @param [Map] parameter 125 | * @param [Function] callback with json as argument 126 | * @param [String] api_key 127 | */ 128 | html(parameter, callback, api_key = null) { 129 | this.search(parameter, "html", (data) => { 130 | callback(data) 131 | }, api_key) 132 | } 133 | 134 | /*** 135 | * Location API returns matching location in the callback 136 | */ 137 | location(q, limit, callback) { 138 | let query = { 139 | q: q, 140 | limit: limit 141 | } 142 | this.execute(LOCATION_API, query, (data) => { 143 | callback(JSON.parse(data)) 144 | }, null, null) 145 | } 146 | 147 | /*** 148 | * Account API returns account information in the callback 149 | */ 150 | account(callback) { 151 | this.execute("/account", {}, (data) => { 152 | callback(JSON.parse(data)) 153 | }, null, null) 154 | } 155 | 156 | /*** 157 | * Search Archive API returns search result from the archive 158 | * @param search_id previous search result = search_metadata.id 159 | * @param callback handle next step 160 | * @param api_key user secret key 161 | */ 162 | search_archive(search_id, callback, api_key = null) { 163 | this.execute("/searches/" + search_id + ".json", {}, (data) => { 164 | callback(JSON.parse(data)) 165 | }, null, api_key) 166 | } 167 | } 168 | 169 | module.exports = SerpApiSearch; 170 | -------------------------------------------------------------------------------- /lib/WalmartSearch.js: -------------------------------------------------------------------------------- 1 | const SerpApiSearch = require('./SerpApiSearch') 2 | 3 | class WalmartSearch extends SerpApiSearch { 4 | 5 | constructor(api_key) { 6 | super(api_key, "walmart") 7 | } 8 | 9 | location(q, limit, callback) { 10 | throw "location is not supported for: " + this.engine ; 11 | } 12 | } 13 | 14 | module.exports = WalmartSearch -------------------------------------------------------------------------------- /lib/YahooSearch.js: -------------------------------------------------------------------------------- 1 | const SerpApiSearch = require('./SerpApiSearch') 2 | 3 | class YahooSearch extends SerpApiSearch { 4 | 5 | constructor(api_key) { 6 | super(api_key, "yahoo") 7 | } 8 | } 9 | 10 | module.exports = YahooSearch -------------------------------------------------------------------------------- /lib/YandexSearch.js: -------------------------------------------------------------------------------- 1 | const SerpApiSearch = require('./SerpApiSearch') 2 | 3 | class YandexSearch extends SerpApiSearch { 4 | 5 | constructor(api_key) { 6 | super(api_key, "yandex") 7 | } 8 | } 9 | 10 | module.exports = YandexSearch -------------------------------------------------------------------------------- /lib/YoutubeSearch.js: -------------------------------------------------------------------------------- 1 | const SerpApiSearch = require('./SerpApiSearch') 2 | 3 | class YoutubeSearch extends SerpApiSearch { 4 | 5 | constructor(api_key) { 6 | super(api_key, "youtube") 7 | } 8 | } 9 | 10 | module.exports = YoutubeSearch 11 | -------------------------------------------------------------------------------- /lib/main.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const BaiduSearch = require('./BaiduSearch') 4 | const BingSearch = require('./BingSearch') 5 | const EbaySearch = require('./EbaySearch') 6 | const GoogleSearch = require('./GoogleSearch') 7 | const SerpApiSearch = require('./SerpApiSearch') 8 | const WalmartSearch = require('./WalmartSearch') 9 | const YahooSearch = require('./YahooSearch') 10 | const YandexSearch = require('./YandexSearch') 11 | const YoutubeSearch = require('./YoutubeSearch') 12 | const HomeDepotSearch = require('./HomeDepotSearch') 13 | const NaverSearch = require('./NaverSearch') 14 | const AppleAppStoreSearch = require('./AppleAppStoreSearch') 15 | const DuckDuckGoSearch = require('./DuckDuckGoSearch') 16 | 17 | module.exports = { 18 | SerpApiSearch, 19 | GoogleSearch, 20 | BaiduSearch, 21 | BingSearch, 22 | DuckDuckGoSearch, 23 | YahooSearch, 24 | YandexSearch, 25 | YoutubeSearch, 26 | EbaySearch, 27 | WalmartSearch, 28 | HomeDepotSearch, 29 | NaverSearch, 30 | AppleAppStoreSearch 31 | } -------------------------------------------------------------------------------- /oobt/google_demo.js: -------------------------------------------------------------------------------- 1 | const serpapi = require('google-search-results-nodejs') 2 | const api_key = process.env.API_KEY 3 | let search = new serpapi.GoogleSearch(api_key) 4 | search.json({ 5 | q: "Coffee" 6 | }, (data) => { 7 | if (data.search_metadata.status == "Success") { 8 | if (data.organic_results.length > 0) { 9 | console.log("ok: search executed successfully") 10 | process.exit(0) 11 | } else { 12 | console.log("oops something went wrong..") 13 | console.log(data) 14 | process.exit(1) 15 | } 16 | } else { 17 | console.log("oops request failed!") 18 | console.log(data) 19 | process.exit(1) 20 | } 21 | }) -------------------------------------------------------------------------------- /oobt/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "oobt", 3 | "version": "1.0.0", 4 | "description": "google example", 5 | "main": "google_demo.js", 6 | "scripts": { 7 | "run": "node google_demo.js" 8 | }, 9 | "author": "", 10 | "license": "ISC" 11 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "google-search-results-nodejs", 3 | "version": "2.1.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "google-search-results-nodejs", 9 | "version": "2.1.0", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "braces": ">=2.3.1", 13 | "expect": "^26.4.2", 14 | "minimist": ">=0.2.1", 15 | "mocha": "^8.4.0" 16 | } 17 | }, 18 | "node_modules/@babel/code-frame": { 19 | "version": "7.16.0", 20 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", 21 | "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", 22 | "dev": true, 23 | "dependencies": { 24 | "@babel/highlight": "^7.16.0" 25 | }, 26 | "engines": { 27 | "node": ">=6.9.0" 28 | } 29 | }, 30 | "node_modules/@babel/helper-validator-identifier": { 31 | "version": "7.15.7", 32 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", 33 | "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", 34 | "dev": true, 35 | "engines": { 36 | "node": ">=6.9.0" 37 | } 38 | }, 39 | "node_modules/@babel/highlight": { 40 | "version": "7.16.0", 41 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", 42 | "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", 43 | "dev": true, 44 | "dependencies": { 45 | "@babel/helper-validator-identifier": "^7.15.7", 46 | "chalk": "^2.0.0", 47 | "js-tokens": "^4.0.0" 48 | }, 49 | "engines": { 50 | "node": ">=6.9.0" 51 | } 52 | }, 53 | "node_modules/@babel/highlight/node_modules/ansi-styles": { 54 | "version": "3.2.1", 55 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 56 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 57 | "dev": true, 58 | "dependencies": { 59 | "color-convert": "^1.9.0" 60 | }, 61 | "engines": { 62 | "node": ">=4" 63 | } 64 | }, 65 | "node_modules/@babel/highlight/node_modules/chalk": { 66 | "version": "2.4.2", 67 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 68 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 69 | "dev": true, 70 | "dependencies": { 71 | "ansi-styles": "^3.2.1", 72 | "escape-string-regexp": "^1.0.5", 73 | "supports-color": "^5.3.0" 74 | }, 75 | "engines": { 76 | "node": ">=4" 77 | } 78 | }, 79 | "node_modules/@babel/highlight/node_modules/color-convert": { 80 | "version": "1.9.3", 81 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 82 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 83 | "dev": true, 84 | "dependencies": { 85 | "color-name": "1.1.3" 86 | } 87 | }, 88 | "node_modules/@babel/highlight/node_modules/color-name": { 89 | "version": "1.1.3", 90 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 91 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 92 | "dev": true 93 | }, 94 | "node_modules/@babel/highlight/node_modules/escape-string-regexp": { 95 | "version": "1.0.5", 96 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 97 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 98 | "dev": true, 99 | "engines": { 100 | "node": ">=0.8.0" 101 | } 102 | }, 103 | "node_modules/@babel/highlight/node_modules/has-flag": { 104 | "version": "3.0.0", 105 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 106 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 107 | "dev": true, 108 | "engines": { 109 | "node": ">=4" 110 | } 111 | }, 112 | "node_modules/@babel/highlight/node_modules/supports-color": { 113 | "version": "5.5.0", 114 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 115 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 116 | "dev": true, 117 | "dependencies": { 118 | "has-flag": "^3.0.0" 119 | }, 120 | "engines": { 121 | "node": ">=4" 122 | } 123 | }, 124 | "node_modules/@jest/types": { 125 | "version": "26.6.2", 126 | "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", 127 | "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", 128 | "dev": true, 129 | "dependencies": { 130 | "@types/istanbul-lib-coverage": "^2.0.0", 131 | "@types/istanbul-reports": "^3.0.0", 132 | "@types/node": "*", 133 | "@types/yargs": "^15.0.0", 134 | "chalk": "^4.0.0" 135 | }, 136 | "engines": { 137 | "node": ">= 10.14.2" 138 | } 139 | }, 140 | "node_modules/@types/istanbul-lib-coverage": { 141 | "version": "2.0.4", 142 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", 143 | "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", 144 | "dev": true 145 | }, 146 | "node_modules/@types/istanbul-lib-report": { 147 | "version": "3.0.0", 148 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 149 | "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", 150 | "dev": true, 151 | "dependencies": { 152 | "@types/istanbul-lib-coverage": "*" 153 | } 154 | }, 155 | "node_modules/@types/istanbul-reports": { 156 | "version": "3.0.1", 157 | "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", 158 | "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", 159 | "dev": true, 160 | "dependencies": { 161 | "@types/istanbul-lib-report": "*" 162 | } 163 | }, 164 | "node_modules/@types/node": { 165 | "version": "17.0.5", 166 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.5.tgz", 167 | "integrity": "sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw==", 168 | "dev": true 169 | }, 170 | "node_modules/@types/stack-utils": { 171 | "version": "2.0.1", 172 | "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", 173 | "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", 174 | "dev": true 175 | }, 176 | "node_modules/@types/yargs": { 177 | "version": "15.0.14", 178 | "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", 179 | "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", 180 | "dev": true, 181 | "dependencies": { 182 | "@types/yargs-parser": "*" 183 | } 184 | }, 185 | "node_modules/@types/yargs-parser": { 186 | "version": "20.2.1", 187 | "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", 188 | "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", 189 | "dev": true 190 | }, 191 | "node_modules/@ungap/promise-all-settled": { 192 | "version": "1.1.2", 193 | "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", 194 | "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", 195 | "dev": true 196 | }, 197 | "node_modules/ansi-colors": { 198 | "version": "4.1.1", 199 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 200 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 201 | "dev": true, 202 | "engines": { 203 | "node": ">=6" 204 | } 205 | }, 206 | "node_modules/ansi-regex": { 207 | "version": "5.0.1", 208 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 209 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 210 | "dev": true, 211 | "engines": { 212 | "node": ">=8" 213 | } 214 | }, 215 | "node_modules/ansi-styles": { 216 | "version": "4.3.0", 217 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 218 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 219 | "dev": true, 220 | "dependencies": { 221 | "color-convert": "^2.0.1" 222 | }, 223 | "engines": { 224 | "node": ">=8" 225 | }, 226 | "funding": { 227 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 228 | } 229 | }, 230 | "node_modules/anymatch": { 231 | "version": "3.1.2", 232 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 233 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 234 | "dev": true, 235 | "dependencies": { 236 | "normalize-path": "^3.0.0", 237 | "picomatch": "^2.0.4" 238 | }, 239 | "engines": { 240 | "node": ">= 8" 241 | } 242 | }, 243 | "node_modules/argparse": { 244 | "version": "2.0.1", 245 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 246 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 247 | "dev": true 248 | }, 249 | "node_modules/balanced-match": { 250 | "version": "1.0.2", 251 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 252 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 253 | "dev": true 254 | }, 255 | "node_modules/binary-extensions": { 256 | "version": "2.2.0", 257 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 258 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 259 | "dev": true, 260 | "engines": { 261 | "node": ">=8" 262 | } 263 | }, 264 | "node_modules/brace-expansion": { 265 | "version": "1.1.11", 266 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 267 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 268 | "dev": true, 269 | "dependencies": { 270 | "balanced-match": "^1.0.0", 271 | "concat-map": "0.0.1" 272 | } 273 | }, 274 | "node_modules/braces": { 275 | "version": "3.0.2", 276 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 277 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 278 | "dev": true, 279 | "dependencies": { 280 | "fill-range": "^7.0.1" 281 | }, 282 | "engines": { 283 | "node": ">=8" 284 | } 285 | }, 286 | "node_modules/browser-stdout": { 287 | "version": "1.3.1", 288 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 289 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 290 | "dev": true 291 | }, 292 | "node_modules/camelcase": { 293 | "version": "6.2.1", 294 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", 295 | "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", 296 | "dev": true, 297 | "engines": { 298 | "node": ">=10" 299 | }, 300 | "funding": { 301 | "url": "https://github.com/sponsors/sindresorhus" 302 | } 303 | }, 304 | "node_modules/chalk": { 305 | "version": "4.1.2", 306 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 307 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 308 | "dev": true, 309 | "dependencies": { 310 | "ansi-styles": "^4.1.0", 311 | "supports-color": "^7.1.0" 312 | }, 313 | "engines": { 314 | "node": ">=10" 315 | }, 316 | "funding": { 317 | "url": "https://github.com/chalk/chalk?sponsor=1" 318 | } 319 | }, 320 | "node_modules/chokidar": { 321 | "version": "3.5.1", 322 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", 323 | "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", 324 | "dev": true, 325 | "dependencies": { 326 | "anymatch": "~3.1.1", 327 | "braces": "~3.0.2", 328 | "glob-parent": "~5.1.0", 329 | "is-binary-path": "~2.1.0", 330 | "is-glob": "~4.0.1", 331 | "normalize-path": "~3.0.0", 332 | "readdirp": "~3.5.0" 333 | }, 334 | "engines": { 335 | "node": ">= 8.10.0" 336 | }, 337 | "optionalDependencies": { 338 | "fsevents": "~2.3.1" 339 | } 340 | }, 341 | "node_modules/cliui": { 342 | "version": "7.0.4", 343 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 344 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 345 | "dev": true, 346 | "dependencies": { 347 | "string-width": "^4.2.0", 348 | "strip-ansi": "^6.0.0", 349 | "wrap-ansi": "^7.0.0" 350 | } 351 | }, 352 | "node_modules/cliui/node_modules/is-fullwidth-code-point": { 353 | "version": "3.0.0", 354 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 355 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 356 | "dev": true, 357 | "engines": { 358 | "node": ">=8" 359 | } 360 | }, 361 | "node_modules/cliui/node_modules/string-width": { 362 | "version": "4.2.3", 363 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 364 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 365 | "dev": true, 366 | "dependencies": { 367 | "emoji-regex": "^8.0.0", 368 | "is-fullwidth-code-point": "^3.0.0", 369 | "strip-ansi": "^6.0.1" 370 | }, 371 | "engines": { 372 | "node": ">=8" 373 | } 374 | }, 375 | "node_modules/cliui/node_modules/strip-ansi": { 376 | "version": "6.0.1", 377 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 378 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 379 | "dev": true, 380 | "dependencies": { 381 | "ansi-regex": "^5.0.1" 382 | }, 383 | "engines": { 384 | "node": ">=8" 385 | } 386 | }, 387 | "node_modules/color-convert": { 388 | "version": "2.0.1", 389 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 390 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 391 | "dev": true, 392 | "dependencies": { 393 | "color-name": "~1.1.4" 394 | }, 395 | "engines": { 396 | "node": ">=7.0.0" 397 | } 398 | }, 399 | "node_modules/color-name": { 400 | "version": "1.1.4", 401 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 402 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 403 | "dev": true 404 | }, 405 | "node_modules/concat-map": { 406 | "version": "0.0.1", 407 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 408 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 409 | "dev": true 410 | }, 411 | "node_modules/debug": { 412 | "version": "4.3.1", 413 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 414 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 415 | "dev": true, 416 | "dependencies": { 417 | "ms": "2.1.2" 418 | }, 419 | "engines": { 420 | "node": ">=6.0" 421 | }, 422 | "peerDependenciesMeta": { 423 | "supports-color": { 424 | "optional": true 425 | } 426 | } 427 | }, 428 | "node_modules/debug/node_modules/ms": { 429 | "version": "2.1.2", 430 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 431 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 432 | "dev": true 433 | }, 434 | "node_modules/decamelize": { 435 | "version": "4.0.0", 436 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 437 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 438 | "dev": true, 439 | "engines": { 440 | "node": ">=10" 441 | }, 442 | "funding": { 443 | "url": "https://github.com/sponsors/sindresorhus" 444 | } 445 | }, 446 | "node_modules/diff": { 447 | "version": "5.0.0", 448 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 449 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 450 | "dev": true, 451 | "engines": { 452 | "node": ">=0.3.1" 453 | } 454 | }, 455 | "node_modules/diff-sequences": { 456 | "version": "26.6.2", 457 | "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", 458 | "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", 459 | "dev": true, 460 | "engines": { 461 | "node": ">= 10.14.2" 462 | } 463 | }, 464 | "node_modules/emoji-regex": { 465 | "version": "8.0.0", 466 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 467 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 468 | "dev": true 469 | }, 470 | "node_modules/escalade": { 471 | "version": "3.1.1", 472 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 473 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 474 | "dev": true, 475 | "engines": { 476 | "node": ">=6" 477 | } 478 | }, 479 | "node_modules/escape-string-regexp": { 480 | "version": "4.0.0", 481 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 482 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 483 | "dev": true, 484 | "engines": { 485 | "node": ">=10" 486 | }, 487 | "funding": { 488 | "url": "https://github.com/sponsors/sindresorhus" 489 | } 490 | }, 491 | "node_modules/expect": { 492 | "version": "26.6.2", 493 | "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", 494 | "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", 495 | "dev": true, 496 | "dependencies": { 497 | "@jest/types": "^26.6.2", 498 | "ansi-styles": "^4.0.0", 499 | "jest-get-type": "^26.3.0", 500 | "jest-matcher-utils": "^26.6.2", 501 | "jest-message-util": "^26.6.2", 502 | "jest-regex-util": "^26.0.0" 503 | }, 504 | "engines": { 505 | "node": ">= 10.14.2" 506 | } 507 | }, 508 | "node_modules/fill-range": { 509 | "version": "7.0.1", 510 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 511 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 512 | "dev": true, 513 | "dependencies": { 514 | "to-regex-range": "^5.0.1" 515 | }, 516 | "engines": { 517 | "node": ">=8" 518 | } 519 | }, 520 | "node_modules/find-up": { 521 | "version": "5.0.0", 522 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 523 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 524 | "dev": true, 525 | "dependencies": { 526 | "locate-path": "^6.0.0", 527 | "path-exists": "^4.0.0" 528 | }, 529 | "engines": { 530 | "node": ">=10" 531 | }, 532 | "funding": { 533 | "url": "https://github.com/sponsors/sindresorhus" 534 | } 535 | }, 536 | "node_modules/flat": { 537 | "version": "5.0.2", 538 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 539 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 540 | "dev": true, 541 | "bin": { 542 | "flat": "cli.js" 543 | } 544 | }, 545 | "node_modules/fs.realpath": { 546 | "version": "1.0.0", 547 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 548 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 549 | "dev": true 550 | }, 551 | "node_modules/fsevents": { 552 | "version": "2.3.2", 553 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 554 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 555 | "dev": true, 556 | "hasInstallScript": true, 557 | "optional": true, 558 | "os": [ 559 | "darwin" 560 | ], 561 | "engines": { 562 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 563 | } 564 | }, 565 | "node_modules/get-caller-file": { 566 | "version": "2.0.5", 567 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 568 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 569 | "dev": true, 570 | "engines": { 571 | "node": "6.* || 8.* || >= 10.*" 572 | } 573 | }, 574 | "node_modules/glob": { 575 | "version": "7.1.6", 576 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 577 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 578 | "dev": true, 579 | "dependencies": { 580 | "fs.realpath": "^1.0.0", 581 | "inflight": "^1.0.4", 582 | "inherits": "2", 583 | "minimatch": "^3.0.4", 584 | "once": "^1.3.0", 585 | "path-is-absolute": "^1.0.0" 586 | }, 587 | "engines": { 588 | "node": "*" 589 | }, 590 | "funding": { 591 | "url": "https://github.com/sponsors/isaacs" 592 | } 593 | }, 594 | "node_modules/glob-parent": { 595 | "version": "5.1.2", 596 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 597 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 598 | "dev": true, 599 | "dependencies": { 600 | "is-glob": "^4.0.1" 601 | }, 602 | "engines": { 603 | "node": ">= 6" 604 | } 605 | }, 606 | "node_modules/graceful-fs": { 607 | "version": "4.2.8", 608 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", 609 | "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", 610 | "dev": true 611 | }, 612 | "node_modules/growl": { 613 | "version": "1.10.5", 614 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 615 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 616 | "dev": true, 617 | "engines": { 618 | "node": ">=4.x" 619 | } 620 | }, 621 | "node_modules/has-flag": { 622 | "version": "4.0.0", 623 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 624 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 625 | "dev": true, 626 | "engines": { 627 | "node": ">=8" 628 | } 629 | }, 630 | "node_modules/he": { 631 | "version": "1.2.0", 632 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 633 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 634 | "dev": true, 635 | "bin": { 636 | "he": "bin/he" 637 | } 638 | }, 639 | "node_modules/inflight": { 640 | "version": "1.0.6", 641 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 642 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 643 | "dev": true, 644 | "dependencies": { 645 | "once": "^1.3.0", 646 | "wrappy": "1" 647 | } 648 | }, 649 | "node_modules/inherits": { 650 | "version": "2.0.4", 651 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 652 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 653 | "dev": true 654 | }, 655 | "node_modules/is-binary-path": { 656 | "version": "2.1.0", 657 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 658 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 659 | "dev": true, 660 | "dependencies": { 661 | "binary-extensions": "^2.0.0" 662 | }, 663 | "engines": { 664 | "node": ">=8" 665 | } 666 | }, 667 | "node_modules/is-extglob": { 668 | "version": "2.1.1", 669 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 670 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 671 | "dev": true, 672 | "engines": { 673 | "node": ">=0.10.0" 674 | } 675 | }, 676 | "node_modules/is-fullwidth-code-point": { 677 | "version": "2.0.0", 678 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 679 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 680 | "dev": true, 681 | "engines": { 682 | "node": ">=4" 683 | } 684 | }, 685 | "node_modules/is-glob": { 686 | "version": "4.0.3", 687 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 688 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 689 | "dev": true, 690 | "dependencies": { 691 | "is-extglob": "^2.1.1" 692 | }, 693 | "engines": { 694 | "node": ">=0.10.0" 695 | } 696 | }, 697 | "node_modules/is-number": { 698 | "version": "7.0.0", 699 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 700 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 701 | "dev": true, 702 | "engines": { 703 | "node": ">=0.12.0" 704 | } 705 | }, 706 | "node_modules/is-plain-obj": { 707 | "version": "2.1.0", 708 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 709 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 710 | "dev": true, 711 | "engines": { 712 | "node": ">=8" 713 | } 714 | }, 715 | "node_modules/isexe": { 716 | "version": "2.0.0", 717 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 718 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 719 | "dev": true 720 | }, 721 | "node_modules/jest-diff": { 722 | "version": "26.6.2", 723 | "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", 724 | "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", 725 | "dev": true, 726 | "dependencies": { 727 | "chalk": "^4.0.0", 728 | "diff-sequences": "^26.6.2", 729 | "jest-get-type": "^26.3.0", 730 | "pretty-format": "^26.6.2" 731 | }, 732 | "engines": { 733 | "node": ">= 10.14.2" 734 | } 735 | }, 736 | "node_modules/jest-get-type": { 737 | "version": "26.3.0", 738 | "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", 739 | "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", 740 | "dev": true, 741 | "engines": { 742 | "node": ">= 10.14.2" 743 | } 744 | }, 745 | "node_modules/jest-matcher-utils": { 746 | "version": "26.6.2", 747 | "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", 748 | "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", 749 | "dev": true, 750 | "dependencies": { 751 | "chalk": "^4.0.0", 752 | "jest-diff": "^26.6.2", 753 | "jest-get-type": "^26.3.0", 754 | "pretty-format": "^26.6.2" 755 | }, 756 | "engines": { 757 | "node": ">= 10.14.2" 758 | } 759 | }, 760 | "node_modules/jest-message-util": { 761 | "version": "26.6.2", 762 | "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", 763 | "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", 764 | "dev": true, 765 | "dependencies": { 766 | "@babel/code-frame": "^7.0.0", 767 | "@jest/types": "^26.6.2", 768 | "@types/stack-utils": "^2.0.0", 769 | "chalk": "^4.0.0", 770 | "graceful-fs": "^4.2.4", 771 | "micromatch": "^4.0.2", 772 | "pretty-format": "^26.6.2", 773 | "slash": "^3.0.0", 774 | "stack-utils": "^2.0.2" 775 | }, 776 | "engines": { 777 | "node": ">= 10.14.2" 778 | } 779 | }, 780 | "node_modules/jest-regex-util": { 781 | "version": "26.0.0", 782 | "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", 783 | "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", 784 | "dev": true, 785 | "engines": { 786 | "node": ">= 10.14.2" 787 | } 788 | }, 789 | "node_modules/js-tokens": { 790 | "version": "4.0.0", 791 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 792 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 793 | "dev": true 794 | }, 795 | "node_modules/js-yaml": { 796 | "version": "4.0.0", 797 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", 798 | "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", 799 | "dev": true, 800 | "dependencies": { 801 | "argparse": "^2.0.1" 802 | }, 803 | "bin": { 804 | "js-yaml": "bin/js-yaml.js" 805 | } 806 | }, 807 | "node_modules/locate-path": { 808 | "version": "6.0.0", 809 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 810 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 811 | "dev": true, 812 | "dependencies": { 813 | "p-locate": "^5.0.0" 814 | }, 815 | "engines": { 816 | "node": ">=10" 817 | }, 818 | "funding": { 819 | "url": "https://github.com/sponsors/sindresorhus" 820 | } 821 | }, 822 | "node_modules/log-symbols": { 823 | "version": "4.0.0", 824 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", 825 | "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", 826 | "dev": true, 827 | "dependencies": { 828 | "chalk": "^4.0.0" 829 | }, 830 | "engines": { 831 | "node": ">=10" 832 | } 833 | }, 834 | "node_modules/micromatch": { 835 | "version": "4.0.4", 836 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", 837 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", 838 | "dev": true, 839 | "dependencies": { 840 | "braces": "^3.0.1", 841 | "picomatch": "^2.2.3" 842 | }, 843 | "engines": { 844 | "node": ">=8.6" 845 | } 846 | }, 847 | "node_modules/minimatch": { 848 | "version": "3.0.4", 849 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 850 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 851 | "dev": true, 852 | "dependencies": { 853 | "brace-expansion": "^1.1.7" 854 | }, 855 | "engines": { 856 | "node": "*" 857 | } 858 | }, 859 | "node_modules/minimist": { 860 | "version": "1.2.6", 861 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 862 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 863 | "dev": true 864 | }, 865 | "node_modules/mocha": { 866 | "version": "8.4.0", 867 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", 868 | "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", 869 | "dev": true, 870 | "dependencies": { 871 | "@ungap/promise-all-settled": "1.1.2", 872 | "ansi-colors": "4.1.1", 873 | "browser-stdout": "1.3.1", 874 | "chokidar": "3.5.1", 875 | "debug": "4.3.1", 876 | "diff": "5.0.0", 877 | "escape-string-regexp": "4.0.0", 878 | "find-up": "5.0.0", 879 | "glob": "7.1.6", 880 | "growl": "1.10.5", 881 | "he": "1.2.0", 882 | "js-yaml": "4.0.0", 883 | "log-symbols": "4.0.0", 884 | "minimatch": "3.0.4", 885 | "ms": "2.1.3", 886 | "nanoid": "3.1.20", 887 | "serialize-javascript": "5.0.1", 888 | "strip-json-comments": "3.1.1", 889 | "supports-color": "8.1.1", 890 | "which": "2.0.2", 891 | "wide-align": "1.1.3", 892 | "workerpool": "6.1.0", 893 | "yargs": "16.2.0", 894 | "yargs-parser": "20.2.4", 895 | "yargs-unparser": "2.0.0" 896 | }, 897 | "bin": { 898 | "_mocha": "bin/_mocha", 899 | "mocha": "bin/mocha" 900 | }, 901 | "engines": { 902 | "node": ">= 10.12.0" 903 | }, 904 | "funding": { 905 | "type": "opencollective", 906 | "url": "https://opencollective.com/mochajs" 907 | } 908 | }, 909 | "node_modules/mocha/node_modules/supports-color": { 910 | "version": "8.1.1", 911 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 912 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 913 | "dev": true, 914 | "dependencies": { 915 | "has-flag": "^4.0.0" 916 | }, 917 | "engines": { 918 | "node": ">=10" 919 | }, 920 | "funding": { 921 | "url": "https://github.com/chalk/supports-color?sponsor=1" 922 | } 923 | }, 924 | "node_modules/ms": { 925 | "version": "2.1.3", 926 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 927 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 928 | "dev": true 929 | }, 930 | "node_modules/nanoid": { 931 | "version": "3.1.20", 932 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", 933 | "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", 934 | "dev": true, 935 | "bin": { 936 | "nanoid": "bin/nanoid.cjs" 937 | }, 938 | "engines": { 939 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 940 | } 941 | }, 942 | "node_modules/normalize-path": { 943 | "version": "3.0.0", 944 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 945 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 946 | "dev": true, 947 | "engines": { 948 | "node": ">=0.10.0" 949 | } 950 | }, 951 | "node_modules/once": { 952 | "version": "1.4.0", 953 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 954 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 955 | "dev": true, 956 | "dependencies": { 957 | "wrappy": "1" 958 | } 959 | }, 960 | "node_modules/p-limit": { 961 | "version": "3.1.0", 962 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 963 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 964 | "dev": true, 965 | "dependencies": { 966 | "yocto-queue": "^0.1.0" 967 | }, 968 | "engines": { 969 | "node": ">=10" 970 | }, 971 | "funding": { 972 | "url": "https://github.com/sponsors/sindresorhus" 973 | } 974 | }, 975 | "node_modules/p-locate": { 976 | "version": "5.0.0", 977 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 978 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 979 | "dev": true, 980 | "dependencies": { 981 | "p-limit": "^3.0.2" 982 | }, 983 | "engines": { 984 | "node": ">=10" 985 | }, 986 | "funding": { 987 | "url": "https://github.com/sponsors/sindresorhus" 988 | } 989 | }, 990 | "node_modules/path-exists": { 991 | "version": "4.0.0", 992 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 993 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 994 | "dev": true, 995 | "engines": { 996 | "node": ">=8" 997 | } 998 | }, 999 | "node_modules/path-is-absolute": { 1000 | "version": "1.0.1", 1001 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1002 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1003 | "dev": true, 1004 | "engines": { 1005 | "node": ">=0.10.0" 1006 | } 1007 | }, 1008 | "node_modules/picomatch": { 1009 | "version": "2.3.0", 1010 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", 1011 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", 1012 | "dev": true, 1013 | "engines": { 1014 | "node": ">=8.6" 1015 | }, 1016 | "funding": { 1017 | "url": "https://github.com/sponsors/jonschlinkert" 1018 | } 1019 | }, 1020 | "node_modules/pretty-format": { 1021 | "version": "26.6.2", 1022 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", 1023 | "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", 1024 | "dev": true, 1025 | "dependencies": { 1026 | "@jest/types": "^26.6.2", 1027 | "ansi-regex": "^5.0.0", 1028 | "ansi-styles": "^4.0.0", 1029 | "react-is": "^17.0.1" 1030 | }, 1031 | "engines": { 1032 | "node": ">= 10" 1033 | } 1034 | }, 1035 | "node_modules/randombytes": { 1036 | "version": "2.1.0", 1037 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1038 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1039 | "dev": true, 1040 | "dependencies": { 1041 | "safe-buffer": "^5.1.0" 1042 | } 1043 | }, 1044 | "node_modules/react-is": { 1045 | "version": "17.0.2", 1046 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", 1047 | "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", 1048 | "dev": true 1049 | }, 1050 | "node_modules/readdirp": { 1051 | "version": "3.5.0", 1052 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", 1053 | "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", 1054 | "dev": true, 1055 | "dependencies": { 1056 | "picomatch": "^2.2.1" 1057 | }, 1058 | "engines": { 1059 | "node": ">=8.10.0" 1060 | } 1061 | }, 1062 | "node_modules/require-directory": { 1063 | "version": "2.1.1", 1064 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1065 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1066 | "dev": true, 1067 | "engines": { 1068 | "node": ">=0.10.0" 1069 | } 1070 | }, 1071 | "node_modules/safe-buffer": { 1072 | "version": "5.2.1", 1073 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1074 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1075 | "dev": true, 1076 | "funding": [ 1077 | { 1078 | "type": "github", 1079 | "url": "https://github.com/sponsors/feross" 1080 | }, 1081 | { 1082 | "type": "patreon", 1083 | "url": "https://www.patreon.com/feross" 1084 | }, 1085 | { 1086 | "type": "consulting", 1087 | "url": "https://feross.org/support" 1088 | } 1089 | ] 1090 | }, 1091 | "node_modules/serialize-javascript": { 1092 | "version": "5.0.1", 1093 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", 1094 | "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", 1095 | "dev": true, 1096 | "dependencies": { 1097 | "randombytes": "^2.1.0" 1098 | } 1099 | }, 1100 | "node_modules/slash": { 1101 | "version": "3.0.0", 1102 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1103 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 1104 | "dev": true, 1105 | "engines": { 1106 | "node": ">=8" 1107 | } 1108 | }, 1109 | "node_modules/stack-utils": { 1110 | "version": "2.0.5", 1111 | "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", 1112 | "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", 1113 | "dev": true, 1114 | "dependencies": { 1115 | "escape-string-regexp": "^2.0.0" 1116 | }, 1117 | "engines": { 1118 | "node": ">=10" 1119 | } 1120 | }, 1121 | "node_modules/stack-utils/node_modules/escape-string-regexp": { 1122 | "version": "2.0.0", 1123 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", 1124 | "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", 1125 | "dev": true, 1126 | "engines": { 1127 | "node": ">=8" 1128 | } 1129 | }, 1130 | "node_modules/string-width": { 1131 | "version": "2.1.1", 1132 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1133 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1134 | "dev": true, 1135 | "dependencies": { 1136 | "is-fullwidth-code-point": "^2.0.0", 1137 | "strip-ansi": "^4.0.0" 1138 | }, 1139 | "engines": { 1140 | "node": ">=4" 1141 | } 1142 | }, 1143 | "node_modules/strip-ansi": { 1144 | "version": "4.0.0", 1145 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1146 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1147 | "dev": true, 1148 | "dependencies": { 1149 | "ansi-regex": "^3.0.0" 1150 | }, 1151 | "engines": { 1152 | "node": ">=4" 1153 | } 1154 | }, 1155 | "node_modules/strip-ansi/node_modules/ansi-regex": { 1156 | "version": "3.0.0", 1157 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1158 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1159 | "dev": true, 1160 | "engines": { 1161 | "node": ">=4" 1162 | } 1163 | }, 1164 | "node_modules/strip-json-comments": { 1165 | "version": "3.1.1", 1166 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1167 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1168 | "dev": true, 1169 | "engines": { 1170 | "node": ">=8" 1171 | }, 1172 | "funding": { 1173 | "url": "https://github.com/sponsors/sindresorhus" 1174 | } 1175 | }, 1176 | "node_modules/supports-color": { 1177 | "version": "7.2.0", 1178 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1179 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1180 | "dev": true, 1181 | "dependencies": { 1182 | "has-flag": "^4.0.0" 1183 | }, 1184 | "engines": { 1185 | "node": ">=8" 1186 | } 1187 | }, 1188 | "node_modules/to-regex-range": { 1189 | "version": "5.0.1", 1190 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1191 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1192 | "dev": true, 1193 | "dependencies": { 1194 | "is-number": "^7.0.0" 1195 | }, 1196 | "engines": { 1197 | "node": ">=8.0" 1198 | } 1199 | }, 1200 | "node_modules/which": { 1201 | "version": "2.0.2", 1202 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1203 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1204 | "dev": true, 1205 | "dependencies": { 1206 | "isexe": "^2.0.0" 1207 | }, 1208 | "bin": { 1209 | "node-which": "bin/node-which" 1210 | }, 1211 | "engines": { 1212 | "node": ">= 8" 1213 | } 1214 | }, 1215 | "node_modules/wide-align": { 1216 | "version": "1.1.3", 1217 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1218 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1219 | "dev": true, 1220 | "dependencies": { 1221 | "string-width": "^1.0.2 || 2" 1222 | } 1223 | }, 1224 | "node_modules/workerpool": { 1225 | "version": "6.1.0", 1226 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", 1227 | "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", 1228 | "dev": true 1229 | }, 1230 | "node_modules/wrap-ansi": { 1231 | "version": "7.0.0", 1232 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1233 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1234 | "dev": true, 1235 | "dependencies": { 1236 | "ansi-styles": "^4.0.0", 1237 | "string-width": "^4.1.0", 1238 | "strip-ansi": "^6.0.0" 1239 | }, 1240 | "engines": { 1241 | "node": ">=10" 1242 | }, 1243 | "funding": { 1244 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1245 | } 1246 | }, 1247 | "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { 1248 | "version": "3.0.0", 1249 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1250 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1251 | "dev": true, 1252 | "engines": { 1253 | "node": ">=8" 1254 | } 1255 | }, 1256 | "node_modules/wrap-ansi/node_modules/string-width": { 1257 | "version": "4.2.3", 1258 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1259 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1260 | "dev": true, 1261 | "dependencies": { 1262 | "emoji-regex": "^8.0.0", 1263 | "is-fullwidth-code-point": "^3.0.0", 1264 | "strip-ansi": "^6.0.1" 1265 | }, 1266 | "engines": { 1267 | "node": ">=8" 1268 | } 1269 | }, 1270 | "node_modules/wrap-ansi/node_modules/strip-ansi": { 1271 | "version": "6.0.1", 1272 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1273 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1274 | "dev": true, 1275 | "dependencies": { 1276 | "ansi-regex": "^5.0.1" 1277 | }, 1278 | "engines": { 1279 | "node": ">=8" 1280 | } 1281 | }, 1282 | "node_modules/wrappy": { 1283 | "version": "1.0.2", 1284 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1285 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1286 | "dev": true 1287 | }, 1288 | "node_modules/y18n": { 1289 | "version": "5.0.8", 1290 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1291 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1292 | "dev": true, 1293 | "engines": { 1294 | "node": ">=10" 1295 | } 1296 | }, 1297 | "node_modules/yargs": { 1298 | "version": "16.2.0", 1299 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1300 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1301 | "dev": true, 1302 | "dependencies": { 1303 | "cliui": "^7.0.2", 1304 | "escalade": "^3.1.1", 1305 | "get-caller-file": "^2.0.5", 1306 | "require-directory": "^2.1.1", 1307 | "string-width": "^4.2.0", 1308 | "y18n": "^5.0.5", 1309 | "yargs-parser": "^20.2.2" 1310 | }, 1311 | "engines": { 1312 | "node": ">=10" 1313 | } 1314 | }, 1315 | "node_modules/yargs-parser": { 1316 | "version": "20.2.4", 1317 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 1318 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 1319 | "dev": true, 1320 | "engines": { 1321 | "node": ">=10" 1322 | } 1323 | }, 1324 | "node_modules/yargs-unparser": { 1325 | "version": "2.0.0", 1326 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 1327 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1328 | "dev": true, 1329 | "dependencies": { 1330 | "camelcase": "^6.0.0", 1331 | "decamelize": "^4.0.0", 1332 | "flat": "^5.0.2", 1333 | "is-plain-obj": "^2.1.0" 1334 | }, 1335 | "engines": { 1336 | "node": ">=10" 1337 | } 1338 | }, 1339 | "node_modules/yargs/node_modules/is-fullwidth-code-point": { 1340 | "version": "3.0.0", 1341 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1342 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1343 | "dev": true, 1344 | "engines": { 1345 | "node": ">=8" 1346 | } 1347 | }, 1348 | "node_modules/yargs/node_modules/string-width": { 1349 | "version": "4.2.3", 1350 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1351 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1352 | "dev": true, 1353 | "dependencies": { 1354 | "emoji-regex": "^8.0.0", 1355 | "is-fullwidth-code-point": "^3.0.0", 1356 | "strip-ansi": "^6.0.1" 1357 | }, 1358 | "engines": { 1359 | "node": ">=8" 1360 | } 1361 | }, 1362 | "node_modules/yargs/node_modules/strip-ansi": { 1363 | "version": "6.0.1", 1364 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1365 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1366 | "dev": true, 1367 | "dependencies": { 1368 | "ansi-regex": "^5.0.1" 1369 | }, 1370 | "engines": { 1371 | "node": ">=8" 1372 | } 1373 | }, 1374 | "node_modules/yocto-queue": { 1375 | "version": "0.1.0", 1376 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1377 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1378 | "dev": true, 1379 | "engines": { 1380 | "node": ">=10" 1381 | }, 1382 | "funding": { 1383 | "url": "https://github.com/sponsors/sindresorhus" 1384 | } 1385 | } 1386 | }, 1387 | "dependencies": { 1388 | "@babel/code-frame": { 1389 | "version": "7.16.0", 1390 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", 1391 | "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", 1392 | "dev": true, 1393 | "requires": { 1394 | "@babel/highlight": "^7.16.0" 1395 | } 1396 | }, 1397 | "@babel/helper-validator-identifier": { 1398 | "version": "7.15.7", 1399 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", 1400 | "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", 1401 | "dev": true 1402 | }, 1403 | "@babel/highlight": { 1404 | "version": "7.16.0", 1405 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", 1406 | "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", 1407 | "dev": true, 1408 | "requires": { 1409 | "@babel/helper-validator-identifier": "^7.15.7", 1410 | "chalk": "^2.0.0", 1411 | "js-tokens": "^4.0.0" 1412 | }, 1413 | "dependencies": { 1414 | "ansi-styles": { 1415 | "version": "3.2.1", 1416 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1417 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1418 | "dev": true, 1419 | "requires": { 1420 | "color-convert": "^1.9.0" 1421 | } 1422 | }, 1423 | "chalk": { 1424 | "version": "2.4.2", 1425 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1426 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1427 | "dev": true, 1428 | "requires": { 1429 | "ansi-styles": "^3.2.1", 1430 | "escape-string-regexp": "^1.0.5", 1431 | "supports-color": "^5.3.0" 1432 | } 1433 | }, 1434 | "color-convert": { 1435 | "version": "1.9.3", 1436 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1437 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1438 | "dev": true, 1439 | "requires": { 1440 | "color-name": "1.1.3" 1441 | } 1442 | }, 1443 | "color-name": { 1444 | "version": "1.1.3", 1445 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1446 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1447 | "dev": true 1448 | }, 1449 | "escape-string-regexp": { 1450 | "version": "1.0.5", 1451 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1452 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1453 | "dev": true 1454 | }, 1455 | "has-flag": { 1456 | "version": "3.0.0", 1457 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1458 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1459 | "dev": true 1460 | }, 1461 | "supports-color": { 1462 | "version": "5.5.0", 1463 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1464 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1465 | "dev": true, 1466 | "requires": { 1467 | "has-flag": "^3.0.0" 1468 | } 1469 | } 1470 | } 1471 | }, 1472 | "@jest/types": { 1473 | "version": "26.6.2", 1474 | "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", 1475 | "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", 1476 | "dev": true, 1477 | "requires": { 1478 | "@types/istanbul-lib-coverage": "^2.0.0", 1479 | "@types/istanbul-reports": "^3.0.0", 1480 | "@types/node": "*", 1481 | "@types/yargs": "^15.0.0", 1482 | "chalk": "^4.0.0" 1483 | } 1484 | }, 1485 | "@types/istanbul-lib-coverage": { 1486 | "version": "2.0.4", 1487 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", 1488 | "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", 1489 | "dev": true 1490 | }, 1491 | "@types/istanbul-lib-report": { 1492 | "version": "3.0.0", 1493 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 1494 | "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", 1495 | "dev": true, 1496 | "requires": { 1497 | "@types/istanbul-lib-coverage": "*" 1498 | } 1499 | }, 1500 | "@types/istanbul-reports": { 1501 | "version": "3.0.1", 1502 | "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", 1503 | "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", 1504 | "dev": true, 1505 | "requires": { 1506 | "@types/istanbul-lib-report": "*" 1507 | } 1508 | }, 1509 | "@types/node": { 1510 | "version": "17.0.5", 1511 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.5.tgz", 1512 | "integrity": "sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw==", 1513 | "dev": true 1514 | }, 1515 | "@types/stack-utils": { 1516 | "version": "2.0.1", 1517 | "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", 1518 | "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", 1519 | "dev": true 1520 | }, 1521 | "@types/yargs": { 1522 | "version": "15.0.14", 1523 | "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", 1524 | "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", 1525 | "dev": true, 1526 | "requires": { 1527 | "@types/yargs-parser": "*" 1528 | } 1529 | }, 1530 | "@types/yargs-parser": { 1531 | "version": "20.2.1", 1532 | "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", 1533 | "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", 1534 | "dev": true 1535 | }, 1536 | "@ungap/promise-all-settled": { 1537 | "version": "1.1.2", 1538 | "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", 1539 | "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", 1540 | "dev": true 1541 | }, 1542 | "ansi-colors": { 1543 | "version": "4.1.1", 1544 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 1545 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 1546 | "dev": true 1547 | }, 1548 | "ansi-regex": { 1549 | "version": "5.0.1", 1550 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1551 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1552 | "dev": true 1553 | }, 1554 | "ansi-styles": { 1555 | "version": "4.3.0", 1556 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1557 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1558 | "dev": true, 1559 | "requires": { 1560 | "color-convert": "^2.0.1" 1561 | } 1562 | }, 1563 | "anymatch": { 1564 | "version": "3.1.2", 1565 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 1566 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 1567 | "dev": true, 1568 | "requires": { 1569 | "normalize-path": "^3.0.0", 1570 | "picomatch": "^2.0.4" 1571 | } 1572 | }, 1573 | "argparse": { 1574 | "version": "2.0.1", 1575 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1576 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1577 | "dev": true 1578 | }, 1579 | "balanced-match": { 1580 | "version": "1.0.2", 1581 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1582 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1583 | "dev": true 1584 | }, 1585 | "binary-extensions": { 1586 | "version": "2.2.0", 1587 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1588 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1589 | "dev": true 1590 | }, 1591 | "brace-expansion": { 1592 | "version": "1.1.11", 1593 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1594 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1595 | "dev": true, 1596 | "requires": { 1597 | "balanced-match": "^1.0.0", 1598 | "concat-map": "0.0.1" 1599 | } 1600 | }, 1601 | "braces": { 1602 | "version": "3.0.2", 1603 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1604 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1605 | "dev": true, 1606 | "requires": { 1607 | "fill-range": "^7.0.1" 1608 | } 1609 | }, 1610 | "browser-stdout": { 1611 | "version": "1.3.1", 1612 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 1613 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 1614 | "dev": true 1615 | }, 1616 | "camelcase": { 1617 | "version": "6.2.1", 1618 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", 1619 | "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", 1620 | "dev": true 1621 | }, 1622 | "chalk": { 1623 | "version": "4.1.2", 1624 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1625 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1626 | "dev": true, 1627 | "requires": { 1628 | "ansi-styles": "^4.1.0", 1629 | "supports-color": "^7.1.0" 1630 | } 1631 | }, 1632 | "chokidar": { 1633 | "version": "3.5.1", 1634 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", 1635 | "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", 1636 | "dev": true, 1637 | "requires": { 1638 | "anymatch": "~3.1.1", 1639 | "braces": "~3.0.2", 1640 | "fsevents": "~2.3.1", 1641 | "glob-parent": "~5.1.0", 1642 | "is-binary-path": "~2.1.0", 1643 | "is-glob": "~4.0.1", 1644 | "normalize-path": "~3.0.0", 1645 | "readdirp": "~3.5.0" 1646 | } 1647 | }, 1648 | "cliui": { 1649 | "version": "7.0.4", 1650 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 1651 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 1652 | "dev": true, 1653 | "requires": { 1654 | "string-width": "^4.2.0", 1655 | "strip-ansi": "^6.0.0", 1656 | "wrap-ansi": "^7.0.0" 1657 | }, 1658 | "dependencies": { 1659 | "is-fullwidth-code-point": { 1660 | "version": "3.0.0", 1661 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1662 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1663 | "dev": true 1664 | }, 1665 | "string-width": { 1666 | "version": "4.2.3", 1667 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1668 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1669 | "dev": true, 1670 | "requires": { 1671 | "emoji-regex": "^8.0.0", 1672 | "is-fullwidth-code-point": "^3.0.0", 1673 | "strip-ansi": "^6.0.1" 1674 | } 1675 | }, 1676 | "strip-ansi": { 1677 | "version": "6.0.1", 1678 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1679 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1680 | "dev": true, 1681 | "requires": { 1682 | "ansi-regex": "^5.0.1" 1683 | } 1684 | } 1685 | } 1686 | }, 1687 | "color-convert": { 1688 | "version": "2.0.1", 1689 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1690 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1691 | "dev": true, 1692 | "requires": { 1693 | "color-name": "~1.1.4" 1694 | } 1695 | }, 1696 | "color-name": { 1697 | "version": "1.1.4", 1698 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1699 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1700 | "dev": true 1701 | }, 1702 | "concat-map": { 1703 | "version": "0.0.1", 1704 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1705 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 1706 | "dev": true 1707 | }, 1708 | "debug": { 1709 | "version": "4.3.1", 1710 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 1711 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 1712 | "dev": true, 1713 | "requires": { 1714 | "ms": "2.1.2" 1715 | }, 1716 | "dependencies": { 1717 | "ms": { 1718 | "version": "2.1.2", 1719 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1720 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1721 | "dev": true 1722 | } 1723 | } 1724 | }, 1725 | "decamelize": { 1726 | "version": "4.0.0", 1727 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 1728 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 1729 | "dev": true 1730 | }, 1731 | "diff": { 1732 | "version": "5.0.0", 1733 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 1734 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 1735 | "dev": true 1736 | }, 1737 | "diff-sequences": { 1738 | "version": "26.6.2", 1739 | "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", 1740 | "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", 1741 | "dev": true 1742 | }, 1743 | "emoji-regex": { 1744 | "version": "8.0.0", 1745 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1746 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1747 | "dev": true 1748 | }, 1749 | "escalade": { 1750 | "version": "3.1.1", 1751 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1752 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1753 | "dev": true 1754 | }, 1755 | "escape-string-regexp": { 1756 | "version": "4.0.0", 1757 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1758 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1759 | "dev": true 1760 | }, 1761 | "expect": { 1762 | "version": "26.6.2", 1763 | "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", 1764 | "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", 1765 | "dev": true, 1766 | "requires": { 1767 | "@jest/types": "^26.6.2", 1768 | "ansi-styles": "^4.0.0", 1769 | "jest-get-type": "^26.3.0", 1770 | "jest-matcher-utils": "^26.6.2", 1771 | "jest-message-util": "^26.6.2", 1772 | "jest-regex-util": "^26.0.0" 1773 | } 1774 | }, 1775 | "fill-range": { 1776 | "version": "7.0.1", 1777 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1778 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1779 | "dev": true, 1780 | "requires": { 1781 | "to-regex-range": "^5.0.1" 1782 | } 1783 | }, 1784 | "find-up": { 1785 | "version": "5.0.0", 1786 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1787 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1788 | "dev": true, 1789 | "requires": { 1790 | "locate-path": "^6.0.0", 1791 | "path-exists": "^4.0.0" 1792 | } 1793 | }, 1794 | "flat": { 1795 | "version": "5.0.2", 1796 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 1797 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 1798 | "dev": true 1799 | }, 1800 | "fs.realpath": { 1801 | "version": "1.0.0", 1802 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1803 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1804 | "dev": true 1805 | }, 1806 | "fsevents": { 1807 | "version": "2.3.2", 1808 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1809 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1810 | "dev": true, 1811 | "optional": true 1812 | }, 1813 | "get-caller-file": { 1814 | "version": "2.0.5", 1815 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1816 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1817 | "dev": true 1818 | }, 1819 | "glob": { 1820 | "version": "7.1.6", 1821 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1822 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1823 | "dev": true, 1824 | "requires": { 1825 | "fs.realpath": "^1.0.0", 1826 | "inflight": "^1.0.4", 1827 | "inherits": "2", 1828 | "minimatch": "^3.0.4", 1829 | "once": "^1.3.0", 1830 | "path-is-absolute": "^1.0.0" 1831 | } 1832 | }, 1833 | "glob-parent": { 1834 | "version": "5.1.2", 1835 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1836 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1837 | "dev": true, 1838 | "requires": { 1839 | "is-glob": "^4.0.1" 1840 | } 1841 | }, 1842 | "graceful-fs": { 1843 | "version": "4.2.8", 1844 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", 1845 | "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", 1846 | "dev": true 1847 | }, 1848 | "growl": { 1849 | "version": "1.10.5", 1850 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 1851 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 1852 | "dev": true 1853 | }, 1854 | "has-flag": { 1855 | "version": "4.0.0", 1856 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1857 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1858 | "dev": true 1859 | }, 1860 | "he": { 1861 | "version": "1.2.0", 1862 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1863 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1864 | "dev": true 1865 | }, 1866 | "inflight": { 1867 | "version": "1.0.6", 1868 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1869 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1870 | "dev": true, 1871 | "requires": { 1872 | "once": "^1.3.0", 1873 | "wrappy": "1" 1874 | } 1875 | }, 1876 | "inherits": { 1877 | "version": "2.0.4", 1878 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1879 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1880 | "dev": true 1881 | }, 1882 | "is-binary-path": { 1883 | "version": "2.1.0", 1884 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1885 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1886 | "dev": true, 1887 | "requires": { 1888 | "binary-extensions": "^2.0.0" 1889 | } 1890 | }, 1891 | "is-extglob": { 1892 | "version": "2.1.1", 1893 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1894 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1895 | "dev": true 1896 | }, 1897 | "is-fullwidth-code-point": { 1898 | "version": "2.0.0", 1899 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1900 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1901 | "dev": true 1902 | }, 1903 | "is-glob": { 1904 | "version": "4.0.3", 1905 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1906 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1907 | "dev": true, 1908 | "requires": { 1909 | "is-extglob": "^2.1.1" 1910 | } 1911 | }, 1912 | "is-number": { 1913 | "version": "7.0.0", 1914 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1915 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1916 | "dev": true 1917 | }, 1918 | "is-plain-obj": { 1919 | "version": "2.1.0", 1920 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1921 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1922 | "dev": true 1923 | }, 1924 | "isexe": { 1925 | "version": "2.0.0", 1926 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1927 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1928 | "dev": true 1929 | }, 1930 | "jest-diff": { 1931 | "version": "26.6.2", 1932 | "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", 1933 | "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", 1934 | "dev": true, 1935 | "requires": { 1936 | "chalk": "^4.0.0", 1937 | "diff-sequences": "^26.6.2", 1938 | "jest-get-type": "^26.3.0", 1939 | "pretty-format": "^26.6.2" 1940 | } 1941 | }, 1942 | "jest-get-type": { 1943 | "version": "26.3.0", 1944 | "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", 1945 | "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", 1946 | "dev": true 1947 | }, 1948 | "jest-matcher-utils": { 1949 | "version": "26.6.2", 1950 | "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", 1951 | "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", 1952 | "dev": true, 1953 | "requires": { 1954 | "chalk": "^4.0.0", 1955 | "jest-diff": "^26.6.2", 1956 | "jest-get-type": "^26.3.0", 1957 | "pretty-format": "^26.6.2" 1958 | } 1959 | }, 1960 | "jest-message-util": { 1961 | "version": "26.6.2", 1962 | "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", 1963 | "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", 1964 | "dev": true, 1965 | "requires": { 1966 | "@babel/code-frame": "^7.0.0", 1967 | "@jest/types": "^26.6.2", 1968 | "@types/stack-utils": "^2.0.0", 1969 | "chalk": "^4.0.0", 1970 | "graceful-fs": "^4.2.4", 1971 | "micromatch": "^4.0.2", 1972 | "pretty-format": "^26.6.2", 1973 | "slash": "^3.0.0", 1974 | "stack-utils": "^2.0.2" 1975 | } 1976 | }, 1977 | "jest-regex-util": { 1978 | "version": "26.0.0", 1979 | "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", 1980 | "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", 1981 | "dev": true 1982 | }, 1983 | "js-tokens": { 1984 | "version": "4.0.0", 1985 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1986 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1987 | "dev": true 1988 | }, 1989 | "js-yaml": { 1990 | "version": "4.0.0", 1991 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", 1992 | "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", 1993 | "dev": true, 1994 | "requires": { 1995 | "argparse": "^2.0.1" 1996 | } 1997 | }, 1998 | "locate-path": { 1999 | "version": "6.0.0", 2000 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2001 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2002 | "dev": true, 2003 | "requires": { 2004 | "p-locate": "^5.0.0" 2005 | } 2006 | }, 2007 | "log-symbols": { 2008 | "version": "4.0.0", 2009 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", 2010 | "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", 2011 | "dev": true, 2012 | "requires": { 2013 | "chalk": "^4.0.0" 2014 | } 2015 | }, 2016 | "micromatch": { 2017 | "version": "4.0.4", 2018 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", 2019 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", 2020 | "dev": true, 2021 | "requires": { 2022 | "braces": "^3.0.1", 2023 | "picomatch": "^2.2.3" 2024 | } 2025 | }, 2026 | "minimatch": { 2027 | "version": "3.0.4", 2028 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2029 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2030 | "dev": true, 2031 | "requires": { 2032 | "brace-expansion": "^1.1.7" 2033 | } 2034 | }, 2035 | "minimist": { 2036 | "version": "1.2.6", 2037 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 2038 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 2039 | "dev": true 2040 | }, 2041 | "mocha": { 2042 | "version": "8.4.0", 2043 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", 2044 | "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", 2045 | "dev": true, 2046 | "requires": { 2047 | "@ungap/promise-all-settled": "1.1.2", 2048 | "ansi-colors": "4.1.1", 2049 | "browser-stdout": "1.3.1", 2050 | "chokidar": "3.5.1", 2051 | "debug": "4.3.1", 2052 | "diff": "5.0.0", 2053 | "escape-string-regexp": "4.0.0", 2054 | "find-up": "5.0.0", 2055 | "glob": "7.1.6", 2056 | "growl": "1.10.5", 2057 | "he": "1.2.0", 2058 | "js-yaml": "4.0.0", 2059 | "log-symbols": "4.0.0", 2060 | "minimatch": "3.0.4", 2061 | "ms": "2.1.3", 2062 | "nanoid": "3.1.20", 2063 | "serialize-javascript": "5.0.1", 2064 | "strip-json-comments": "3.1.1", 2065 | "supports-color": "8.1.1", 2066 | "which": "2.0.2", 2067 | "wide-align": "1.1.3", 2068 | "workerpool": "6.1.0", 2069 | "yargs": "16.2.0", 2070 | "yargs-parser": "20.2.4", 2071 | "yargs-unparser": "2.0.0" 2072 | }, 2073 | "dependencies": { 2074 | "supports-color": { 2075 | "version": "8.1.1", 2076 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2077 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2078 | "dev": true, 2079 | "requires": { 2080 | "has-flag": "^4.0.0" 2081 | } 2082 | } 2083 | } 2084 | }, 2085 | "ms": { 2086 | "version": "2.1.3", 2087 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2088 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2089 | "dev": true 2090 | }, 2091 | "nanoid": { 2092 | "version": "3.1.20", 2093 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", 2094 | "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", 2095 | "dev": true 2096 | }, 2097 | "normalize-path": { 2098 | "version": "3.0.0", 2099 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2100 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2101 | "dev": true 2102 | }, 2103 | "once": { 2104 | "version": "1.4.0", 2105 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2106 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2107 | "dev": true, 2108 | "requires": { 2109 | "wrappy": "1" 2110 | } 2111 | }, 2112 | "p-limit": { 2113 | "version": "3.1.0", 2114 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2115 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2116 | "dev": true, 2117 | "requires": { 2118 | "yocto-queue": "^0.1.0" 2119 | } 2120 | }, 2121 | "p-locate": { 2122 | "version": "5.0.0", 2123 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2124 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2125 | "dev": true, 2126 | "requires": { 2127 | "p-limit": "^3.0.2" 2128 | } 2129 | }, 2130 | "path-exists": { 2131 | "version": "4.0.0", 2132 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2133 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2134 | "dev": true 2135 | }, 2136 | "path-is-absolute": { 2137 | "version": "1.0.1", 2138 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2139 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2140 | "dev": true 2141 | }, 2142 | "picomatch": { 2143 | "version": "2.3.0", 2144 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", 2145 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", 2146 | "dev": true 2147 | }, 2148 | "pretty-format": { 2149 | "version": "26.6.2", 2150 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", 2151 | "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", 2152 | "dev": true, 2153 | "requires": { 2154 | "@jest/types": "^26.6.2", 2155 | "ansi-regex": "^5.0.0", 2156 | "ansi-styles": "^4.0.0", 2157 | "react-is": "^17.0.1" 2158 | } 2159 | }, 2160 | "randombytes": { 2161 | "version": "2.1.0", 2162 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2163 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2164 | "dev": true, 2165 | "requires": { 2166 | "safe-buffer": "^5.1.0" 2167 | } 2168 | }, 2169 | "react-is": { 2170 | "version": "17.0.2", 2171 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", 2172 | "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", 2173 | "dev": true 2174 | }, 2175 | "readdirp": { 2176 | "version": "3.5.0", 2177 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", 2178 | "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", 2179 | "dev": true, 2180 | "requires": { 2181 | "picomatch": "^2.2.1" 2182 | } 2183 | }, 2184 | "require-directory": { 2185 | "version": "2.1.1", 2186 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2187 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 2188 | "dev": true 2189 | }, 2190 | "safe-buffer": { 2191 | "version": "5.2.1", 2192 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2193 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2194 | "dev": true 2195 | }, 2196 | "serialize-javascript": { 2197 | "version": "5.0.1", 2198 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", 2199 | "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", 2200 | "dev": true, 2201 | "requires": { 2202 | "randombytes": "^2.1.0" 2203 | } 2204 | }, 2205 | "slash": { 2206 | "version": "3.0.0", 2207 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 2208 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 2209 | "dev": true 2210 | }, 2211 | "stack-utils": { 2212 | "version": "2.0.5", 2213 | "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", 2214 | "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", 2215 | "dev": true, 2216 | "requires": { 2217 | "escape-string-regexp": "^2.0.0" 2218 | }, 2219 | "dependencies": { 2220 | "escape-string-regexp": { 2221 | "version": "2.0.0", 2222 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", 2223 | "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", 2224 | "dev": true 2225 | } 2226 | } 2227 | }, 2228 | "string-width": { 2229 | "version": "2.1.1", 2230 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2231 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2232 | "dev": true, 2233 | "requires": { 2234 | "is-fullwidth-code-point": "^2.0.0", 2235 | "strip-ansi": "^4.0.0" 2236 | } 2237 | }, 2238 | "strip-ansi": { 2239 | "version": "4.0.0", 2240 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2241 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2242 | "dev": true, 2243 | "requires": { 2244 | "ansi-regex": "^3.0.0" 2245 | }, 2246 | "dependencies": { 2247 | "ansi-regex": { 2248 | "version": "3.0.0", 2249 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 2250 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 2251 | "dev": true 2252 | } 2253 | } 2254 | }, 2255 | "strip-json-comments": { 2256 | "version": "3.1.1", 2257 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2258 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2259 | "dev": true 2260 | }, 2261 | "supports-color": { 2262 | "version": "7.2.0", 2263 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2264 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2265 | "dev": true, 2266 | "requires": { 2267 | "has-flag": "^4.0.0" 2268 | } 2269 | }, 2270 | "to-regex-range": { 2271 | "version": "5.0.1", 2272 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2273 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2274 | "dev": true, 2275 | "requires": { 2276 | "is-number": "^7.0.0" 2277 | } 2278 | }, 2279 | "which": { 2280 | "version": "2.0.2", 2281 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2282 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2283 | "dev": true, 2284 | "requires": { 2285 | "isexe": "^2.0.0" 2286 | } 2287 | }, 2288 | "wide-align": { 2289 | "version": "1.1.3", 2290 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 2291 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 2292 | "dev": true, 2293 | "requires": { 2294 | "string-width": "^1.0.2 || 2" 2295 | } 2296 | }, 2297 | "workerpool": { 2298 | "version": "6.1.0", 2299 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", 2300 | "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", 2301 | "dev": true 2302 | }, 2303 | "wrap-ansi": { 2304 | "version": "7.0.0", 2305 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2306 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2307 | "dev": true, 2308 | "requires": { 2309 | "ansi-styles": "^4.0.0", 2310 | "string-width": "^4.1.0", 2311 | "strip-ansi": "^6.0.0" 2312 | }, 2313 | "dependencies": { 2314 | "is-fullwidth-code-point": { 2315 | "version": "3.0.0", 2316 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2317 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2318 | "dev": true 2319 | }, 2320 | "string-width": { 2321 | "version": "4.2.3", 2322 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2323 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2324 | "dev": true, 2325 | "requires": { 2326 | "emoji-regex": "^8.0.0", 2327 | "is-fullwidth-code-point": "^3.0.0", 2328 | "strip-ansi": "^6.0.1" 2329 | } 2330 | }, 2331 | "strip-ansi": { 2332 | "version": "6.0.1", 2333 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2334 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2335 | "dev": true, 2336 | "requires": { 2337 | "ansi-regex": "^5.0.1" 2338 | } 2339 | } 2340 | } 2341 | }, 2342 | "wrappy": { 2343 | "version": "1.0.2", 2344 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2345 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2346 | "dev": true 2347 | }, 2348 | "y18n": { 2349 | "version": "5.0.8", 2350 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2351 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2352 | "dev": true 2353 | }, 2354 | "yargs": { 2355 | "version": "16.2.0", 2356 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 2357 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 2358 | "dev": true, 2359 | "requires": { 2360 | "cliui": "^7.0.2", 2361 | "escalade": "^3.1.1", 2362 | "get-caller-file": "^2.0.5", 2363 | "require-directory": "^2.1.1", 2364 | "string-width": "^4.2.0", 2365 | "y18n": "^5.0.5", 2366 | "yargs-parser": "^20.2.2" 2367 | }, 2368 | "dependencies": { 2369 | "is-fullwidth-code-point": { 2370 | "version": "3.0.0", 2371 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2372 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2373 | "dev": true 2374 | }, 2375 | "string-width": { 2376 | "version": "4.2.3", 2377 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2378 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2379 | "dev": true, 2380 | "requires": { 2381 | "emoji-regex": "^8.0.0", 2382 | "is-fullwidth-code-point": "^3.0.0", 2383 | "strip-ansi": "^6.0.1" 2384 | } 2385 | }, 2386 | "strip-ansi": { 2387 | "version": "6.0.1", 2388 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2389 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2390 | "dev": true, 2391 | "requires": { 2392 | "ansi-regex": "^5.0.1" 2393 | } 2394 | } 2395 | } 2396 | }, 2397 | "yargs-parser": { 2398 | "version": "20.2.4", 2399 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 2400 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 2401 | "dev": true 2402 | }, 2403 | "yargs-unparser": { 2404 | "version": "2.0.0", 2405 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 2406 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 2407 | "dev": true, 2408 | "requires": { 2409 | "camelcase": "^6.0.0", 2410 | "decamelize": "^4.0.0", 2411 | "flat": "^5.0.2", 2412 | "is-plain-obj": "^2.1.0" 2413 | } 2414 | }, 2415 | "yocto-queue": { 2416 | "version": "0.1.0", 2417 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2418 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2419 | "dev": true 2420 | } 2421 | } 2422 | } 2423 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "google-search-results-nodejs", 3 | "version": "2.1.0", 4 | "description": "Google Search Node JS API via SerpApi.com", 5 | "scripts": { 6 | "test": "mocha", 7 | "coverage": "mocha -R test && npm run coverage" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/serpapi/google-search-results-nodejs.git" 12 | }, 13 | "keywords": [ 14 | "google", 15 | "search", 16 | "scrape", 17 | "api", 18 | "query", 19 | "json", 20 | "html", 21 | "image", 22 | "automated", 23 | "localization", 24 | "serp", 25 | "serpapi", 26 | "image", 27 | "news", 28 | "seo", 29 | "walmart", 30 | "yahoo", 31 | "yandex", 32 | "scholar", 33 | "bing", 34 | "baidu", 35 | "ebay", 36 | "youtube", 37 | "apple", 38 | "store", 39 | "app", 40 | "homedepot", 41 | "naver", 42 | "duckduckgo" 43 | ], 44 | "devDependencies": { 45 | "braces": ">=2.3.1", 46 | "expect": "^26.4.2", 47 | "minimist": ">=0.2.1", 48 | "mocha": "^8.4.0" 49 | }, 50 | "author": "Victor Benarbia victor@serpapi.com", 51 | "license": "ISC", 52 | "bugs": { 53 | "url": "https://github.com/serpapi/google-search-results-nodejs/issues" 54 | }, 55 | "homepage": "https://github.com/serpapi/google-search-results-nodejs#readme", 56 | "main": "lib/main.js", 57 | "files": [ 58 | "lib/BaiduSearch.js", 59 | "lib/BingSearch.js", 60 | "lib/EbaySearch.js", 61 | "lib/GoogleSearch.js", 62 | "lib/SerpApiSearch.js", 63 | "lib/WalmartSearch.js", 64 | "lib/YahooSearch.js", 65 | "lib/YandexSearch.js", 66 | "lib/YoutubeSearch.js", 67 | "lib/DuckDuckGoSearch.js", 68 | "lib/HomeDepotSearch.js", 69 | "lib/AppleAppStoreSearch.js", 70 | "lib/NaverSearch.js" 71 | ] 72 | } 73 | -------------------------------------------------------------------------------- /test/AccountApiSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const GoogleSearch = require('../lib/GoogleSearch'); 3 | 4 | describe('Account API', () => { 5 | 6 | let api_key 7 | beforeEach(() => { 8 | // api_key is not required for the location API 9 | api_key = process.env.API_KEY || "demo" 10 | }) 11 | 12 | it('example', (done) => { 13 | if (!process.env.API_KEY) { 14 | done() 15 | return 16 | } 17 | 18 | const search = new GoogleSearch(api_key) 19 | search.account((data) => { 20 | expect(data.account_id).toExist 21 | done() 22 | }) 23 | }) 24 | }) -------------------------------------------------------------------------------- /test/AppleAppStoreSearchSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const serpapi = require('./../lib/main'); 3 | 4 | describe('AppleAppStoreSearch', () => { 5 | it("json", (done) => { 6 | let api_key = process.env.API_KEY 7 | if (api_key == null) { 8 | done() 9 | return 10 | } 11 | let search = new serpapi.AppleAppStoreSearch(api_key) 12 | search.json({ 13 | term: "Laptop" 14 | }, (data) => { 15 | expect(data.search_metadata.status).toEqual("Success") 16 | done() 17 | }) 18 | }).timeout(10000); 19 | 20 | it("location is not supported", (done) => { 21 | let api_key = process.env.API_KEY 22 | if (api_key == null) { 23 | done() 24 | return 25 | } 26 | let search = new serpapi.AppleAppStoreSearch(api_key) 27 | try { 28 | search.location('Austin, TX', 5, {}) 29 | fail("location is not supported") 30 | } catch (e) { 31 | expect(e).toMatch(/location is not supported/) 32 | done() 33 | } 34 | }).timeout(1000); 35 | }); 36 | -------------------------------------------------------------------------------- /test/BaiduSearchSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const serpapi = require('./../lib/main'); 3 | 4 | describe('Baidu Search', () => { 5 | it("json", (done) => { 6 | let api_key = process.env.API_KEY 7 | if (api_key != null) { 8 | let search = new serpapi.BaiduSearch(api_key) 9 | search.json({ 10 | q: "Coffee" 11 | }, (data) => { 12 | expect(data.search_metadata.status).toEqual("Success") 13 | expect(data.organic_results.length).toBeGreaterThan(5) 14 | done() 15 | }) 16 | } else { 17 | done() 18 | } 19 | }).timeout(10000) 20 | }); 21 | -------------------------------------------------------------------------------- /test/BingSearchSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const serpapi = require('./../lib/main'); 3 | 4 | describe('Bing Search', () => { 5 | it("json", (done) => { 6 | let api_key = process.env.API_KEY 7 | if (api_key != null) { 8 | let search = new serpapi.BingSearch(api_key) 9 | search.json({ 10 | q: "Coffee" 11 | }, (data) => { 12 | expect(data.search_metadata.status).toEqual("Success") 13 | done() 14 | }) 15 | } else { 16 | done() 17 | } 18 | }).timeout(10000) 19 | }); 20 | -------------------------------------------------------------------------------- /test/DuckDuckGoSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const serpapi = require('./../lib/main'); 3 | 4 | describe('DuckDuckGo Search', () => { 5 | it("json", (done) => { 6 | let api_key = process.env.API_KEY 7 | if (api_key != null) { 8 | let search = new serpapi.DuckDuckGoSearch(api_key) 9 | search.json({ 10 | q: "Coffee" 11 | }, (data) => { 12 | expect(data.search_metadata.status).toEqual("Success") 13 | done() 14 | }) 15 | } else { 16 | done() 17 | } 18 | }).timeout(10000) 19 | }); 20 | -------------------------------------------------------------------------------- /test/EbaySearchSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const serpapi = require('./../lib/main'); 3 | 4 | describe('Ebay Search', () => { 5 | it("json", (done) => { 6 | let api_key = process.env.API_KEY 7 | if (api_key == null) { 8 | done() 9 | return 10 | } 11 | let search = new serpapi.EbaySearch(api_key) 12 | search.json({ 13 | _nkw: "Coffee" 14 | }, (data) => { 15 | expect(data.search_metadata.status).toEqual("Success") 16 | expect(data.organic_results.length).toBeGreaterThan(5) 17 | done() 18 | }) 19 | }).timeout(100000) 20 | }); 21 | -------------------------------------------------------------------------------- /test/ExampleSpec.js: -------------------------------------------------------------------------------- 1 | // const expect = require('expect') 2 | // const util = require('util') 3 | // const serpapi = require('../lib/main') 4 | 5 | // describe('Google Search - Example', function () { 6 | // let parameter, api_key 7 | // beforeEach(function () { 8 | // parameter = { 9 | // q: "Coffee", 10 | // location: "Austin, Texas" 11 | // } 12 | 13 | // // Copy your secret api_key from https://serpapi.com/dashboard 14 | // api_key = process.env.API_KEY || "demo" 15 | // }) 16 | 17 | // it("promisified callback function", (done) => { 18 | // if (api_key == "demo") { 19 | // done() 20 | // return 21 | // } 22 | 23 | // function getJson(parameter, resolve, reject) { 24 | // const search = new serpapi.GoogleSearch(api_key) 25 | // try { 26 | // search.json(parameter, resolve) 27 | // } catch (e) { 28 | // reject(e) 29 | // } 30 | // } 31 | 32 | // const blockFn = util.promisify(getJson) 33 | // blockFn[util.promisify.custom](parameter).then((data) => { 34 | // expect(data.organic_results[0].title.length).toBeGreaterThan(5) 35 | // done() 36 | // }).catch((error) => { 37 | // // console.error(error) 38 | // reject() 39 | // }) 40 | // }).timeout(100000) 41 | 42 | // it("callback to custom promise", (done) => { 43 | // if (api_key == "demo") { 44 | // done() 45 | // return 46 | // } 47 | 48 | // function blockFn(parameter, callback) { } 49 | 50 | // blockFn[util.promisify.custom] = (parameter) => { 51 | // return new Promise((resolve, reject) => { 52 | // let search = new serpapi.GoogleSearch(api_key) 53 | // try { 54 | // search.json(parameter, resolve) 55 | // } catch (e) { 56 | // reject(e) 57 | // } 58 | // }) 59 | // } 60 | 61 | // blockFn[util.promisify.custom](parameter).then((data) => { 62 | // expect(data.organic_results.length).toBeGreaterThan(5) 63 | // done() 64 | // }).catch((error) => { 65 | // //console.error(error) 66 | // fail() 67 | // }) 68 | // }).timeout(100000) 69 | // }); 70 | -------------------------------------------------------------------------------- /test/GoogleSearchSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const serpapi = require('./../lib/main'); 3 | 4 | describe('Google Search', () => { 5 | it("json", (done) => { 6 | let api_key = process.env.API_KEY 7 | if (api_key != null) { 8 | let search = new serpapi.GoogleSearch(api_key) 9 | search.json({ 10 | q: "Coffee" 11 | }, (data) => { 12 | expect(data.search_metadata.status).toEqual("Success") 13 | expect(data.organic_results.length).toBeGreaterThan(5) 14 | done() 15 | }) 16 | } else { 17 | done() 18 | } 19 | }).timeout(10000) 20 | }); 21 | -------------------------------------------------------------------------------- /test/HomeDepotSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const serpapi = require('./../lib/main'); 3 | 4 | describe('HomeDepot Search', () => { 5 | it("json", (done) => { 6 | let api_key = process.env.API_KEY 7 | if (api_key != null) { 8 | let search = new serpapi.HomeDepotSearch(api_key) 9 | search.json({ 10 | q: "Coffee" 11 | }, (data) => { 12 | expect(data.search_metadata.status).toEqual("Success") 13 | done() 14 | }) 15 | } else { 16 | done() 17 | } 18 | }).timeout(10000) 19 | }); 20 | -------------------------------------------------------------------------------- /test/LocationApiSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const serpapi = require('../lib/main'); 3 | 4 | describe('Location API', () => { 5 | it('example', (done) => { 6 | var search = new serpapi.GoogleSearch() 7 | search.location("Austin", 3, (data) => { 8 | //console.log(data) 9 | expect(data[0].google_id).toEqual(200635) 10 | expect(data.length).toEqual(3) 11 | done() 12 | }) 13 | }) 14 | }) -------------------------------------------------------------------------------- /test/NaverSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const serpapi = require('./../lib/main'); 3 | 4 | describe('Naver Search', () => { 5 | it("json", (done) => { 6 | let api_key = process.env.API_KEY 7 | if (api_key != null) { 8 | let search = new serpapi.NaverSearch(api_key) 9 | search.json({ 10 | query: "Coffee" 11 | }, (data) => { 12 | expect(data.search_metadata.status).toEqual("Success") 13 | done() 14 | }) 15 | } else { 16 | done() 17 | } 18 | }).timeout(10000) 19 | }); 20 | -------------------------------------------------------------------------------- /test/SearchArchiveApiSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const serpapi = require('../lib/main'); 3 | 4 | describe('Search Archive API', () => { 5 | it('example', (done) => { 6 | if (!process.env.API_KEY) { 7 | done() 8 | return 9 | } 10 | 11 | var search = new serpapi.GoogleSearch(process.env.API_KEY) 12 | search.json({ q: "Coffee", location: "Portland" }, (search_result) => { 13 | // search in archive for the search just returned 14 | search.search_archive(search_result.search_metadata.id, (archived_search) => { 15 | expect(archived_search.search_metadata.id).toEqual(search_result.search_metadata.id) 16 | done() 17 | }) 18 | }) 19 | }).timeout(10000) 20 | }) -------------------------------------------------------------------------------- /test/SerpApiClientSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const serpapi = require('../lib/main'); 3 | 4 | describe('Google Search', () => { 5 | let p, api_key; 6 | beforeEach(() => { 7 | p = { 8 | q: "Coffee", 9 | location: "Austin, Texas" 10 | } 11 | 12 | // Copy your secret api_key from https://serpapi.com/dashboard 13 | api_key = process.env.API_KEY || "demo" 14 | }); 15 | 16 | it('fail:buildUrl', (done) => { 17 | let search = new serpapi.SerpApiSearch(null) 18 | expect(() => { 19 | search.buildUrl('/path', {}, "json", null) 20 | }).toThrow(/api_key/) 21 | done() 22 | }).timeout(10000) 23 | 24 | it('buildUrl', (done) => { 25 | let search = new serpapi.SerpApiSearch(this.api_key) 26 | expect(search.buildUrl('/path', { q: 'Coffee', location: 'Austin, Texas', api_key: 'beta' }, "json")).toMatch(/https:\/\/serpapi.com\/path\?q=Coffee&location=Austin%2C%20Texas&api_key=beta&source=nodejs&output=json/) 27 | done() 28 | }).timeout(10000) 29 | 30 | it('buildUrl without api_key', (done) => { 31 | let search = new serpapi.SerpApiSearch(this.api_key) 32 | try { 33 | search.buildUrl('/path', { q: 'Coffee', location: 'Austin, Texas' }, "json") 34 | fail("error should have been raised") 35 | } catch (e) { 36 | expect(e.toString()).toMatch(/api_key is required/) 37 | } 38 | done() 39 | }).timeout(10000) 40 | 41 | it("search", (done) => { 42 | let search = new serpapi.SerpApiSearch(api_key, "google") 43 | search.setTimeout(6000); 44 | search.search(p, "json", (raw) => { 45 | let data = JSON.parse(raw) 46 | expect(data.search_metadata.status).toEqual("Success") 47 | expect(data.organic_results[0].title.length).toBeGreaterThan(5) 48 | done() 49 | }) 50 | }).timeout(10000) 51 | 52 | it("json", (done) => { 53 | let search = new serpapi.SerpApiSearch(api_key, "google") 54 | search.json(p, (data) => { 55 | expect(data.organic_results[0].title.length).toBeGreaterThan(5) 56 | done() 57 | }) 58 | }).timeout(10000) 59 | 60 | it("html", (done) => { 61 | let search = new serpapi.SerpApiSearch(api_key, "google") 62 | search.html(p, (body) => { 63 | expect(body).toMatch(/<\/html>/) 64 | done() 65 | }) 66 | }).timeout(10000) 67 | 68 | }); 69 | -------------------------------------------------------------------------------- /test/WalmartSearchSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const serpapi = require('../lib/main'); 3 | 4 | describe('Walmart Search', () => { 5 | it("json", (done) => { 6 | let api_key = process.env.API_KEY 7 | if (api_key != null) { 8 | let search = new serpapi.WalmartSearch(api_key) 9 | search.json({ 10 | query: "Coffee" 11 | }, (data) => { 12 | expect(data.search_metadata.status).toEqual("Success") 13 | expect(data.organic_results.length).toBeGreaterThan(5) 14 | done() 15 | }) 16 | } else { 17 | done() 18 | } 19 | }).timeout(100000) 20 | }); 21 | -------------------------------------------------------------------------------- /test/YahooSearchSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const serpapi = require('./../lib/main'); 3 | 4 | describe('Yahoo Search', () => { 5 | it("json", (done) => { 6 | let api_key = process.env.API_KEY 7 | if (api_key != null) { 8 | let search = new serpapi.YahooSearch(api_key) 9 | search.json({ 10 | p: "Coffee" 11 | }, (data) => { 12 | expect(data.search_metadata.status).toEqual("Success") 13 | expect(data.organic_results.length).toBeGreaterThan(4) 14 | done() 15 | }) 16 | } else { 17 | done() 18 | } 19 | }).timeout(10000) 20 | }); 21 | -------------------------------------------------------------------------------- /test/YandexSearchSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const serpapi = require('./../lib/main'); 3 | 4 | describe('Yandex Search', () => { 5 | it("json", (done) => { 6 | let api_key = process.env.API_KEY 7 | if (api_key != null) { 8 | let search = new serpapi.YandexSearch(api_key) 9 | search.json({ 10 | text: "Coffee" 11 | }, (data) => { 12 | expect(data.search_metadata.status).toEqual("Success") 13 | expect(data.organic_results.length).toBeGreaterThan(5) 14 | done() 15 | }) 16 | } else { 17 | done() 18 | } 19 | }).timeout(10000) 20 | }); 21 | -------------------------------------------------------------------------------- /test/YoutubeSearchSpec.js: -------------------------------------------------------------------------------- 1 | const expect = require('expect'); 2 | const serpapi = require('./../lib/main'); 3 | 4 | describe('Youtube Search', () => { 5 | it("json", (done) => { 6 | let api_key = process.env.API_KEY 7 | if (api_key != null) { 8 | let search = new serpapi.YoutubeSearch(api_key) 9 | search.json({ 10 | search_query: "Coffee" 11 | }, (data) => { 12 | expect(data.search_metadata.status).toEqual("Success") 13 | expect(data.video_results.length).toBeGreaterThan(5) 14 | done() 15 | }) 16 | } else { 17 | done() 18 | } 19 | }).timeout(100000) 20 | }); 21 | --------------------------------------------------------------------------------