From 766fe6fb5d878500b9520563cdbc099e79864e2c Mon Sep 17 00:00:00 2001 From: Diokuz Date: Sat, 14 Dec 2019 19:43:43 +0300 Subject: [PATCH] initial commit --- .editorconfig | 27 + .gitignore | 13 + .npmignore | 13 + .prettierignore | 1 + .prettierrc.yml | 6 + Makefile | 6 + README.md | 130 + .../localhost-api/post-diet-sink-color.json | 27 + .../localhost-api/post-enemy-miss-fillet.json | 27 + .../post-jupiter-kitten-iowa.json | 27 + .../post-social-december-moon.json | 27 + .../localhost-api/get-app-diet-moon.json | 22 + .../get-cardinal-item-social.json | 22 + .../localhost-api/get-fly-axe-august.json | 22 + .../localhost-api/get-gee-jet-pasta.json | 22 + assets/pipeline.svg | 135 + assets/pipeline.vizjs | 25 + changelog.md | 0 jest.config.js | 5 + package.json | 49 + screenshots/github.png | Bin 0 -> 96762 bytes src/getRequestId.ts | 103 + src/handleRequest.ts | 184 + src/handleResponse.ts | 160 + src/index.ts | 5 + src/logger.ts | 36 + src/mocker.ts | 311 + src/storage.ts | 128 + src/utils.ts | 34 + src/words-hash.ts | 296 + tests/getNames.spec.js | 200 + tests/getRequestId.spec.js | 182 + tests/puppeteer.spec.js | 394 ++ tests/server/index.html | 109 + tests/server/index.js | 71 + tests/server/logger.js | 34 + tests/words-hash.spec.js | 37 + tsconfig.json | 23 + yarn.lock | 5692 +++++++++++++++++ 39 files changed, 8605 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .npmignore create mode 100644 .prettierignore create mode 100644 .prettierrc.yml create mode 100644 Makefile create mode 100644 README.md create mode 100644 __teremocks-post__/localhost-api/post-diet-sink-color.json create mode 100644 __teremocks-post__/localhost-api/post-enemy-miss-fillet.json create mode 100644 __teremocks-post__/localhost-api/post-jupiter-kitten-iowa.json create mode 100644 __teremocks-post__/localhost-api/post-social-december-moon.json create mode 100644 __teremocks__/localhost-api/get-app-diet-moon.json create mode 100644 __teremocks__/localhost-api/get-cardinal-item-social.json create mode 100644 __teremocks__/localhost-api/get-fly-axe-august.json create mode 100644 __teremocks__/localhost-api/get-gee-jet-pasta.json create mode 100644 assets/pipeline.svg create mode 100644 assets/pipeline.vizjs create mode 100644 changelog.md create mode 100644 jest.config.js create mode 100644 package.json create mode 100644 screenshots/github.png create mode 100644 src/getRequestId.ts create mode 100644 src/handleRequest.ts create mode 100644 src/handleResponse.ts create mode 100644 src/index.ts create mode 100644 src/logger.ts create mode 100644 src/mocker.ts create mode 100644 src/storage.ts create mode 100644 src/utils.ts create mode 100644 src/words-hash.ts create mode 100644 tests/getNames.spec.js create mode 100644 tests/getRequestId.spec.js create mode 100644 tests/puppeteer.spec.js create mode 100644 tests/server/index.html create mode 100644 tests/server/index.js create mode 100644 tests/server/logger.js create mode 100644 tests/words-hash.spec.js create mode 100644 tsconfig.json create mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..c43e256 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,27 @@ +; http://editorconfig.org + +root = true + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.{js,ts}] +indent_style = space +indent_size = 2 + +[*.json] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +indent_size = 4 + +[node_modules/**.js] +codepaint = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..035ae14 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +node_modules/ +.pnp.js +.pnp +.idea +.vscode +npm-debug.log* +.DS_Store +coverage +*.sublime* +*.log +dist +.yarn +.yarnrc diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..25733d9 --- /dev/null +++ b/.npmignore @@ -0,0 +1,13 @@ +assets +screenshots +tests +.pnp +.pnp.js +__remocks__ +yarn.lock +Makefile +.editorconfig +.prettierignore +.prettierrc.yml +changelog.md +README.md diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..d93aea1 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +/assets diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 0000000..dd6ca65 --- /dev/null +++ b/.prettierrc.yml @@ -0,0 +1,6 @@ +--- +printWidth: 120 +semi: false +singleQuote: true +trailingComma: "es5" +arrowParens: "always" diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..975b3ab --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +.PHONY: prepare +prepare: + yarn pnpify tsc + yarn prettier --write tests/**/*.js + yarn prettier --write src/**/*.ts + yarn jest diff --git a/README.md b/README.md new file mode 100644 index 0000000..f95b4fe --- /dev/null +++ b/README.md @@ -0,0 +1,130 @@ +# teremock + +## Do I need that thing? + +If you are writing puppeteer tests, and you want to mock your network responses easily – probably yes. + +## How to use + +```js +import mocker from 'teremock' + +await mocker.start() + +// async stuff which is making requests + +await mocker.stop() +``` + +## How it works + +First, `teremock` intercepts puppeteers page requests and tries to find its body in mocks folder. Generated filename depends on `url`, `method` and `postBody` – so, you always know, do you have a mock for that particular request or not. If you have it – you will get it as a response, instantly. If not – request will go to the real backend (see also: mockList and okList). + +Second, `teremock` intercepts all responds, and writes them to the filesystem, if they are not on it already. In case of `CI` (if mock was not found), it uses mockMiss middleware, so you could be sure – all your requests are mocked (or build will fail otherwise). + +## Pipeline + + + +## API + +You could use `options` +```js +mocker.start(options) +``` +All options are optional (that's why they called so). +```js +const options = { + // Absolute path to folder where you want to store mocks + // process.cwd() + '/__remocks__' by default + workDir: __dirname, + + // puppeteer page + // global.page by default + page: page, + + // In some cases you could have some random GET params, which are not affect the response body + // but several params may be important for you (White List) + // [] by default + queryParams: ['important'], + + // In some cases you could have some random GET params, which are not affects the response body + // but could lead to `always out of date` mocks (Black List) + // [] by default + skipQueryParams: ['randomId', 'timestamp'], + + // Same as skipQueryParams but for post body params + // Only application/json MIME type is supported + skipPostParams: [ + 'randomId', + 'timestamp', + ['objectParameter', 'property'] + ], + + // Probably you dont want to mock some requests (e.g. cdn js files) + // And you definitely dont want to mock your webapp requests (e.g. localhost/app.js) + // So, you could explicitly whitelist urls you want to mock + // _all except localhost_ if both – mockList and okList – were not set + // Could be an array, or a `,` delimited string + mockList: 'my-backend.org/used/by/test', + + // It is recommended to explicitly mock only _critical-for-your-test_ urls + // But you could also mock with simple 200-OK response some other requests, + // which are not critical, but should be intercepted + // (to prevent ddos-effect to your real backend, for example) + // All items from mockList have higher priority over okList + // Could be an array, or a `,` delimited string + okList: ['my-backend.org/not/critical/for/test'], + + // If url not in mockList, nor okList, it will be blocked, unless any of two conditions + // 1) url is same origin, and method is GET + // 2) url is matched agains any string in passList + // By default, block any cross origin and non-GET same-origin requests + passList: [], + + // Run as CI if true. That means, your tests will fail if any of the requests were not mocked + // Default is `is-ci` package value (same as in Jest) + ci: require('is-ci'), + + // A middleware to call when mock is not found on the file system + // Works only in CI mode + // Possible values are: + // 1) CODE (number) – respond with CODE http code for any unmocked request (e.g. 200) + // 2) 'throw' (string) – will throw an error + // 3) (next) => next(anyResponse) - respond with anyResponse object + // default value is: 500 + // Note: request is not available in the middleware function + // Note: body must be a string (use JSON.stringify for objects) + mockMiss: (next) => next({ code: 200, body: JSON.stringify({ foo: 'bar' }) }), + + // Set true, to await all non-closed connections when trying to stop mocker + // Warning: some tests could became flaky + awaitConnectionsOnStop: false, + + // Custom headers or/and body or/and status for ANY request from the mockList + // All keys in the object are optional (e.g. you could change only status code) + // Usefull with combination of mocker.set() method + // Warning! It is not working in the mocks generation mode! So, first, create your mocks. + // See also https://github.com/puppeteer/puppeteer/issues/599 + response: { + headers: { 'Access-Control-Allow-Origin': '*' }, + body: 'OK', + status: 200, + }, +} +``` +Both `mocker.start()` and `mocker.stop()` return a `Promise`. + +## mocker.set() + +You could temporary change any option and then get back to its initial value. + +For example: + +```js +mocker.set('response', { status: 427 }) +const result = await doRequest() +expect(result).toBe('Server responded with an error, status code is 427') +// note: headers and body will be taken from the mocks, only status code is changed +mocker.unset('response) // or mocker.reset() +``` diff --git a/__teremocks-post__/localhost-api/post-diet-sink-color.json b/__teremocks-post__/localhost-api/post-diet-sink-color.json new file mode 100644 index 0000000..e211617 --- /dev/null +++ b/__teremocks-post__/localhost-api/post-diet-sink-color.json @@ -0,0 +1,27 @@ +{ + "request": { + "method": "POST", + "url": "http://localhost:3000/api", + "headers": { + "accept": "application/json", + "referer": "http://localhost:3000/", + "origin": "http://localhost:3000", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", + "content-type": "application/json" + }, + "postData": { + "q": "abc" + } + }, + "response": { + "status": 200, + "headers": { + "access-control-allow-origin": "*", + "connection": "keep-alive", + "content-type": "application/json; charset=utf-8" + }, + "body": { + "suggest": "green" + } + } +} \ No newline at end of file diff --git a/__teremocks-post__/localhost-api/post-enemy-miss-fillet.json b/__teremocks-post__/localhost-api/post-enemy-miss-fillet.json new file mode 100644 index 0000000..bf34c1c --- /dev/null +++ b/__teremocks-post__/localhost-api/post-enemy-miss-fillet.json @@ -0,0 +1,27 @@ +{ + "request": { + "method": "POST", + "url": "http://localhost:3000/api", + "headers": { + "accept": "application/json", + "referer": "http://localhost:3000/", + "origin": "http://localhost:3000", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", + "content-type": "application/json" + }, + "postData": { + "q": "ab" + } + }, + "response": { + "status": 200, + "headers": { + "access-control-allow-origin": "*", + "connection": "keep-alive", + "content-type": "application/json; charset=utf-8" + }, + "body": { + "suggest": "world" + } + } +} \ No newline at end of file diff --git a/__teremocks-post__/localhost-api/post-jupiter-kitten-iowa.json b/__teremocks-post__/localhost-api/post-jupiter-kitten-iowa.json new file mode 100644 index 0000000..60beace --- /dev/null +++ b/__teremocks-post__/localhost-api/post-jupiter-kitten-iowa.json @@ -0,0 +1,27 @@ +{ + "request": { + "method": "POST", + "url": "http://localhost:3000/api", + "headers": { + "accept": "application/json", + "referer": "http://localhost:3000/", + "origin": "http://localhost:3000", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", + "content-type": "application/json" + }, + "postData": { + "q": "a" + } + }, + "response": { + "status": 200, + "headers": { + "access-control-allow-origin": "*", + "connection": "keep-alive", + "content-type": "application/json; charset=utf-8" + }, + "body": { + "suggest": "example" + } + } +} \ No newline at end of file diff --git a/__teremocks-post__/localhost-api/post-social-december-moon.json b/__teremocks-post__/localhost-api/post-social-december-moon.json new file mode 100644 index 0000000..d855a86 --- /dev/null +++ b/__teremocks-post__/localhost-api/post-social-december-moon.json @@ -0,0 +1,27 @@ +{ + "request": { + "method": "POST", + "url": "http://localhost:3000/api", + "headers": { + "accept": "application/json", + "referer": "http://localhost:3000/", + "origin": "http://localhost:3000", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", + "content-type": "application/json" + }, + "postData": { + "q": "abcd" + } + }, + "response": { + "status": 200, + "headers": { + "access-control-allow-origin": "*", + "connection": "keep-alive", + "content-type": "application/json; charset=utf-8" + }, + "body": { + "suggest": "book" + } + } +} \ No newline at end of file diff --git a/__teremocks__/localhost-api/get-app-diet-moon.json b/__teremocks__/localhost-api/get-app-diet-moon.json new file mode 100644 index 0000000..fb7fef3 --- /dev/null +++ b/__teremocks__/localhost-api/get-app-diet-moon.json @@ -0,0 +1,22 @@ +{ + "request": { + "method": "GET", + "url": "http://localhost:3000/api?q=a", + "headers": { + "referer": "http://localhost:3000/", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36" + }, + "postData": "" + }, + "response": { + "status": 200, + "headers": { + "access-control-allow-origin": "*", + "connection": "keep-alive", + "content-type": "application/json; charset=utf-8" + }, + "body": { + "suggest": "example" + } + } +} \ No newline at end of file diff --git a/__teremocks__/localhost-api/get-cardinal-item-social.json b/__teremocks__/localhost-api/get-cardinal-item-social.json new file mode 100644 index 0000000..0e2e4b1 --- /dev/null +++ b/__teremocks__/localhost-api/get-cardinal-item-social.json @@ -0,0 +1,22 @@ +{ + "request": { + "method": "GET", + "url": "http://localhost:3000/api?q=abc", + "headers": { + "referer": "http://localhost:3000/", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36" + }, + "postData": "" + }, + "response": { + "status": 200, + "headers": { + "access-control-allow-origin": "*", + "connection": "keep-alive", + "content-type": "application/json; charset=utf-8" + }, + "body": { + "suggest": "green" + } + } +} \ No newline at end of file diff --git a/__teremocks__/localhost-api/get-fly-axe-august.json b/__teremocks__/localhost-api/get-fly-axe-august.json new file mode 100644 index 0000000..064ecac --- /dev/null +++ b/__teremocks__/localhost-api/get-fly-axe-august.json @@ -0,0 +1,22 @@ +{ + "request": { + "method": "GET", + "url": "http://localhost:3000/api?q=abcd", + "headers": { + "referer": "http://localhost:3000/", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36" + }, + "postData": "" + }, + "response": { + "status": 200, + "headers": { + "access-control-allow-origin": "*", + "connection": "keep-alive", + "content-type": "application/json; charset=utf-8" + }, + "body": { + "suggest": "book" + } + } +} \ No newline at end of file diff --git a/__teremocks__/localhost-api/get-gee-jet-pasta.json b/__teremocks__/localhost-api/get-gee-jet-pasta.json new file mode 100644 index 0000000..668c774 --- /dev/null +++ b/__teremocks__/localhost-api/get-gee-jet-pasta.json @@ -0,0 +1,22 @@ +{ + "request": { + "method": "GET", + "url": "http://localhost:3000/api?q=ab", + "headers": { + "referer": "http://localhost:3000/", + "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36" + }, + "postData": "" + }, + "response": { + "status": 200, + "headers": { + "access-control-allow-origin": "*", + "connection": "keep-alive", + "content-type": "application/json; charset=utf-8" + }, + "body": { + "suggest": "world" + } + } +} \ No newline at end of file diff --git a/assets/pipeline.svg b/assets/pipeline.svg new file mode 100644 index 0000000..7cbf3bc --- /dev/null +++ b/assets/pipeline.svg @@ -0,0 +1,135 @@ + + + + + + +G + + + +url + +url + + + +in mockList + +in mockList + + + +url->in mockList + + + + + +in okList + +in okList + + + +in mockList->in okList + + +no + + + +have mock + +have mock + + + +in mockList->have mock + + +yes + + + +in passList + +in passList + + + +in okList->in passList + + +no + + + +empty response + +empty response + + + +in okList->empty response + + +yes + + + +abort + +abort + + + +in passList->abort + + +no + + + +make real request + +make real request + + + +in passList->make real request + + +yes + + + +mocked response + +mocked response + + + +have mock->mocked response + + +yes + + + +response with 500 + +response with 500 + + + +have mock->response with 500 + + +no + + + diff --git a/assets/pipeline.vizjs b/assets/pipeline.vizjs new file mode 100644 index 0000000..a37a603 --- /dev/null +++ b/assets/pipeline.vizjs @@ -0,0 +1,25 @@ +# http://www.graphviz.org/content/cluster + +digraph G { + url [fillcolor=yellow, style="rounded,filled", shape=diamond] + "in mockList" [color=blue, shape=diamond] + "in okList" [color=blue, shape=diamond] + "in passList" [color=blue, shape=diamond] + "have mock" [color=blue, shape=diamond] + "mocked response" [fillcolor=green, style="rounded,filled", shape=oval] + "empty response" [fillcolor=green, style="rounded,filled", shape=oval] + "abort" [fillcolor=red, style="rounded,filled", shape=oval] + "response with 500" [fillcolor=red, style="rounded,filled", shape=oval] + "make real request" [fillcolor=yellow, style="rounded,filled", shape=oval] + + url -> "in mockList" + "in mockList" -> "in okList" [label=no, color=grey] + "in mockList" -> "have mock" [label=yes, color=grey] + "have mock" -> "response with 500" [label=no, color=grey] + "have mock" -> "mocked response" [label=yes, color=grey] + + "in okList" -> "in passList" [label=no, color=grey] + "in okList" -> "empty response" [label=yes, color=grey] + "in passList" -> "abort" [label=no, color=grey] + "in passList" -> "make real request" [label=yes, color=grey] +} diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..e69de29 diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..f279456 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,5 @@ +module.exports = { + transform: { + '^.+\\.tsx?$': 'ts-jest', + }, +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1a2b67c --- /dev/null +++ b/package.json @@ -0,0 +1,49 @@ +{ + "name": "teremock", + "version": "0.1.0", + "description": "Easy to use test request mocker for puppeteer / mocha / karma", + "main": "dist/index.js", + "installConfig": { + "pnp": true + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Diokuz/teremock.git" + }, + "keywords": [ + "request", + "mocker", + "puppeteer", + "interceptor", + "request", + "response", + "test" + ], + "author": "Diokuz", + "license": "ISC", + "bugs": { + "url": "https://github.com/Diokuz/teremock/issues" + }, + "homepage": "https://github.com/Diokuz/teremock#readme", + "dependencies": { + "debug": "^4.1.1", + "is-ci": "^2.0.0", + "make-dir": "^3.0.0", + "query-string": "^6.8.3", + "signale": "^1.4.0", + "tslib": "^1.10.0" + }, + "devDependencies": { + "@types/node": "^12.12.17", + "@yarnpkg/pnpify": "^2.0.0-rc.12", + "body-parser": "^1.19.0", + "express": "^4.17.1", + "jest": "^24.9.0", + "prettier": "1.19.1", + "puppeteer": "^2.0.0", + "rimraf": "^3.0.0", + "ts-jest": "^24.2.0", + "typescript": "^3.7.3", + "wait-port": "^0.2.6" + } +} diff --git a/screenshots/github.png b/screenshots/github.png new file mode 100644 index 0000000000000000000000000000000000000000..384e6fc2bd0e2fa04d21573446a6d1eefea2274b GIT binary patch literal 96762 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 TQYml!W#DqKb3RpZ(kJ { + let url = params.url + let method = params.method || 'GET' + let headers = params.headers + let postData = params.postData || '' + let queryParams = params.queryParams || [] + let skipPostParams = params.skipPostParams || [] + let skipQueryParams = params.skipQueryParams || [] + + const urlObj = new URL(url) + let postObj + + urlObj.searchParams.sort() + + if (postData !== '' && headers) { + switch (headers['content-type']) { + case 'application/json': + postObj = JSON.parse(postData) + break + default: + postObj = queryString.parse(postData) + break + } + } + + if (params.verbose) { + console.log('requestId: postObj', postObj) + } + + if (postObj) { + skipPostParams.forEach((param) => { + let currentObj = postObj + let paramForDelete = param + + if (Array.isArray(paramForDelete)) { + const path = [...param] + + while (path.length > 1) { + currentObj = currentObj[path.shift()] + + if (!currentObj) { + return + } + } + + paramForDelete = path.shift() + } + + delete currentObj[paramForDelete] + }) + + postData = JSON.stringify(postObj) + } + + /** + * If queryParams is set, removes any searchParams from the url, + * which are not declared in the queryParams array + */ + if (queryParams.length > 0) { + // @ts-ignore + let keys = [...urlObj.searchParams.keys()] + for (let key of keys) { + if (!queryParams.includes(key)) { + urlObj.searchParams.delete(key) + } + } + } + + // Some parameters could vary over the time, so we can exclude them from naming + // (be carefull, use it only if it does not affect actual response body) + skipQueryParams.forEach((param) => urlObj.searchParams.delete(param)) + let baseStr = urlObj.toString() + postData + + if (params.verbose) { + console.log('requestId: baseStr, baseStr.length', baseStr, baseStr.length) + } + + return `${method.toLowerCase()}-${humanize(baseStr, 3)}` +} + +export default getRequestId diff --git a/src/handleRequest.ts b/src/handleRequest.ts new file mode 100644 index 0000000..1813103 --- /dev/null +++ b/src/handleRequest.ts @@ -0,0 +1,184 @@ +import path from 'path' +import debug from 'debug' +import signale from 'signale' +import { shouldOk, shouldNotIntercept, isPassableByDefault } from './utils' +import * as storage from './storage' + +const logger = debug('prm:-request') + +export default function createHandler(initialParams) { + logger('Creating request handler') + + return function handleRequest(interceptedRequest, extraParams = {}) { + const params = { ...initialParams, ...extraParams } + + const { + pageUrl, + reqSet, + workDir, + mockList, + okList, + ci, + verbose, + cacheRequests, + passList, + queryParams, + skipQueryParams, + skipPostParams, + mockMiss, + response, + responseHeaders, + status, + } = params + + if (responseHeaders) { + signale.warn(`options.responseHeaders is deprecated,`) + signale.warn(`use options.response.headers or mock.response.headers instead.`) + } + + const url = interceptedRequest.url() + const method = interceptedRequest.method() + const postData = interceptedRequest.postData() + const headers = interceptedRequest.headers() + const reqParams = { url, method, postData } + const purl = typeof pageUrl === 'function' ? pageUrl() : pageUrl + + // https://github.com/Diokuz/puppeteer-request-mocker/pull/12 + if (cacheRequests) { + logger(`» Cached request with method "${method}" and url "${url}"`) + params._onSetReqCache(interceptedRequest) + } + + logger(`» Intercepted request with method "${method}" and url "${url}"`) + + if (verbose) { + signale.info(`Request handling for:\n${reqParams}`) + signale.info(`Request headers :\n${headers}`) + signale.info('handleRequest', interceptedRequest) + signale.info('decodeURIComponent(postData)', decodeURIComponent(postData)) + signale.info('encodeURIComponent(postData)', encodeURIComponent(postData)) + } + + // If url is not in mockList nor okList + if (shouldNotIntercept(mockList, okList, url)) { + logger('» shouldNotIntercept') + let isPassable + + if (passList && passList.length) { + isPassable = passList.find((passUrl) => url.startsWith(passUrl)) + } else { + isPassable = isPassableByDefault(purl, url, method) + } + + if (!isPassable && !interceptedRequest.isNavigationRequest()) { + signale.error(`Url ${url} is not from the options.passList, aborting request`) + signale.error(`pageUrl is "${purl}", passList is "${passList}"`) + interceptedRequest.abort('aborted') + } else { + logger(`» Url is from pass list, sending it to real server`) + interceptedRequest.continue() + } + + return + } + + // Just say OK, dont save the mock + if (shouldOk(mockList, okList, url)) { + logger('» shouldOk. Skipping. Responding with 200-OK') + + interceptedRequest.respond({ + headers: responseHeaders, + ...response, + body: 'OK', + status: 200, + }) + + return + } + + const mock_params = { + url, + method, + headers, + postData, + queryParams, + skipQueryParams, + skipPostParams, + verbose, + workDir, + } + + const fn = storage.name(mock_params) + + params._onReqStarted() + reqSet.add(fn) + debug('prm:connections:add')( + path.basename(fn), + Array.from(reqSet).map((f: string) => path.basename(f)) + ) + + logger(`» Trying to read from file ${fn}`) + + storage + .read(fn) + .then((rawData: any) => { + let body = rawData + let headers = {} + + try { + const res = JSON.parse(rawData).response + body = res.body + headers = res.headers + } catch (e) { + logger(`« Failed to parse mock as json, continue as text`) + body = rawData.substring(rawData.indexOf('\n\n') + 2) + // Old default for options.response.headers for old format mocks + headers = (response && response.headers) || + responseHeaders || { + 'Access-Control-Allow-Headers': 'Content-Type', + 'Access-Control-Allow-Origin': '*', + 'Content-Type': 'application/json', + } + logger(`« Body starts with ${body.substring(0, 100)}`) + } + + logger(`« Successfully read from file`) + + interceptedRequest.respond({ + headers: { + // mock level headers have higher priprity than global options level headers + ...responseHeaders, + ...headers, + }, + body: typeof body === 'string' ? body : JSON.stringify(body), + status, + ...response, + }) + }) + .catch((e) => { + logger(`« Failed to read: ${e.fn}`) + + if (ci) { + if (mockMiss === 'throw') { + signale.error(`« Mock not found in CI mode! Rejecting. "${e.fn}" ${url}`) + + params._onReqsReject('MONOFO') + } else if (typeof mockMiss === 'number') { + interceptedRequest.respond({ + code: mockMiss, + body: 'Mock not found', + }) + } else if (typeof mockMiss === 'function') { + mockMiss((response) => { + interceptedRequest.respond(response) + }) + } else { + params._onReqsReject(`Wrong mockMiss value. Check mocker.start() params and read the docks.`) + } + } else { + logger('« About to interceptedRequest.continue...') + interceptedRequest.continue() + } + }) + } +} diff --git a/src/handleResponse.ts b/src/handleResponse.ts new file mode 100644 index 0000000..930fd2c --- /dev/null +++ b/src/handleResponse.ts @@ -0,0 +1,160 @@ +import path from 'path' +import debug from 'debug' +import signale from 'signale' +import { shouldOk, shouldNotIntercept } from './utils' +import * as storage from './storage' + +const logger = debug('prm:response') + +export default function createHandler(initialParams) { + logger('Creating response handler') + + return function handlerResponse(interceptedResponse, extraParams = {}) { + const params = { ...initialParams, ...extraParams } + const { + reqSet, + workDir, + mockList, + okList, + verbose, + ci, + queryParams, + skipQueryParams, + skipPostParams, + skipResponseHeaders, + } = params + const request = interceptedResponse.request() + const postData = request.postData() || '' + const url = request.url() + const method = request.method() + const requestHeaders = request.headers() + const resParams = { url, method, postData } + const responseHeaders = interceptedResponse.headers() + const responseStatus = interceptedResponse.status() + + if (skipResponseHeaders && skipResponseHeaders.length) { + skipResponseHeaders.forEach((headerName) => delete responseHeaders[headerName]) + } + + logger(`» Intercepted response with method "${method}" and url "${url}"`) + + if (verbose) { + signale.info(`Response handling for:\n${resParams}`) + signale.info(`Request headers :\n${requestHeaders}`) + signale.info('decodeURIComponent(postData)', decodeURIComponent(postData)) + signale.info('encodeURIComponent(postData)', encodeURIComponent(postData)) + } + + // If synthetic OK-response, no needs to write it to fs + if (shouldNotIntercept(mockList, okList, url) || shouldOk(mockList, okList, url)) { + logger('» shouldNotIntercept or shouldOk. Skipping.') + + return + } + + const mock_params = { + url, + method, + headers: requestHeaders, + postData, + queryParams, + skipQueryParams, + skipPostParams, + verbose, + workDir, + } + + const fn = storage.name(mock_params) + + logger(`» Preparing to write a new file (if it does not exist and it is not CI) ${fn}`) + + interceptedResponse + .json() + .catch((e) => { + logger('« interceptedResponse.json() error:', e) + return interceptedResponse.text() + }) + .then((body) => { + if (typeof body === 'string') { + logger(`« Response body starts with: ${body.substr(0, 100)}`) + } + logger(`« Sending the response to storage.write`) + + if (ci) { + reqSet.delete(fn) + debug('prm:connections:delete')( + path.basename(fn), + Array.from(reqSet).map((f: string) => path.basename(f)) + ) + + return + } + + let postDataToWrite = postData + + try { + postDataToWrite = JSON.parse(postData) + } catch (e) { + // pass + } + + /* + * Do not write in CI, because + * 1) It is forbidden anyway (handle mock-miss in storage.read) + * 2) Because it breaks mockMiss behavior + */ + return storage + .write({ + url, + fn, + body: JSON.stringify( + { + request: { + method, + url, + headers: requestHeaders, + postData: postDataToWrite, + }, + response: { + status: responseStatus, + headers: responseHeaders, + body, + }, + }, + null, + ' ' + ), + ci, + }) + .then((e: any) => { + logger(`« Successfully exited from storage.write for file ${e.fn}`) + + reqSet.delete(e.fn) + debug('prm:connections:delete')( + path.basename(fn), + Array.from(reqSet).map((f: string) => path.basename(f)) + ) + }) + .catch((err) => { + debug('prm:connections:delete')('fail', path.basename(fn), err) + signale.error(`Fail to save the file because of `, err) + params._onReqsReject('WRITEERR') + }) + }) + .catch((err) => { + logger('« interceptedResponse.text error:', err) + }) + .then(() => { + // finally + logger(`« About to exit the response handler. reqSet.size is ${reqSet.size}`) + + if (reqSet.size === 0) { + logger('« Invoking _onReqsCompleted') + + params._onReqsCompleted() + + logger('« Response is done.') + } + }) + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..c024b47 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,5 @@ +import Mocker from './mocker' + +const mocker = new Mocker() + +export default mocker diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 0000000..ec985db --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,36 @@ +import { Signale } from 'signale' + +let logLevel = process.env.SIGNALE_LOG_LEVEL || 'debug' + +const options = { + disabled: false, + interactive: false, + logLevel, + scope: 'teremock', + secrets: [], + stream: process.stdout, + types: { + debug: { + badge: '»', + color: 'grey', + label: 'debug', + logLevel: 'info', + }, + read: { + badge: '»', + color: 'gray', + label: 'read', + logLevel: 'info', + }, + write: { + badge: 'œ', + color: 'red', + label: 'write', + logLevel: 'warn', + }, + }, +} + +const logger = new Signale(options) + +export default logger diff --git a/src/mocker.ts b/src/mocker.ts new file mode 100644 index 0000000..b7062c5 --- /dev/null +++ b/src/mocker.ts @@ -0,0 +1,311 @@ +/* + * It is a singleton, the only instance is located in `exports` + * @todo instantiate for each test suite explicitly + */ + +import path from 'path' +import makeDir from 'make-dir' +import debug from 'debug' +import signale from './logger' +import createRequestHandler from './handleRequest' +import createResponseHandler from './handleResponse' + +const logger = debug('prm') + +const defaultParams = { + rootDir: process.cwd(), + namespace: '__teremocks__', + // @ts-ignore + page: typeof page === 'undefined' ? null : page, + queryParams: [], + skipQueryParams: [], + skipPostParams: [], + skipResponseHeaders: [ + 'date', + 'expires', + 'last-modified', + 'x-powered-by', + 'etag', + 'cache-control', + 'content-length', + 'server', + ], + okList: [], + mockList: [], + passList: [], + force: false, + // https://github.com/facebook/jest/blob/c6512ad1b32a5d22aab9937300aa61aa87f76a27/packages/jest-cli/src/cli/args.js#L128 + ci: require('is-ci'), // Same behaviour as in Jest + verbose: false, + cacheRequests: false, + pagesSet: new Set(), // Singleton by default + mockMiss: 500, + awaitConnectionsOnStop: false, +} + +class Mocker { + constructor(customDefaultParams = {}) { + this.defaultParams = Object.assign({}, defaultParams, customDefaultParams) + } + + page: any + defaultParams: Object + extraParams: Object + params: any + reqSet: Set + cachedReqs: Map + alive: boolean + reqsPromise: Promise + requestHandler: Function + responseHandler: Function + onCloseHandler: Function | null + _startPromise: Promise | void + _resolveReqs: Function + _rejectReqs: Function + + _getParams(userConfig) { + const params = Object.assign({}, this.defaultParams, userConfig) + const { rootDir, namespace, mockList, okList } = params + const workDir = path.join(rootDir, namespace) + let resultMockList = mockList + let resultOkList = okList + + if (typeof mockList === 'string') { + resultMockList = mockList.split(',') + } else if (mockList === null) { + resultMockList = [] + } + + if (typeof okList === 'string') { + resultOkList = okList.split(',') + } else if (okList === null) { + resultOkList = [] + } + + return { ...params, workDir, mockList: resultMockList, okList: resultOkList } + } + + _validate() { + const { page, pagesSet } = this.params + + if (!page) { + throw new Error('Option "page" and global.page – both are not defined') + } + + if (pagesSet.has(page)) { + throw new Error(`Second "mocker.start()" call on the same page! + Probably you didn\'t call "mocker.stop()".`) + } + + pagesSet.add(page) + } + + _onAnyReqStart() { + if (this.reqSet.size === 0) { + this.reqsPromise = new Promise((resolve, reject) => { + this._resolveReqs = resolve + this._rejectReqs = (...args) => { + console.trace() + console.log('args', args) + reject(...args) + } + }) + } + } + + /* + * Starts to intercept requests + */ + start(userConfig) { + this.reset() + this.alive = true + this.params = this._getParams(userConfig) + + const logParams = Object.assign({}, this.params, { page: '...' }) + logger('Mocker starts with resulting params:') + logger(logParams) + + this._validate() + this.page = this.params.page + this.reqSet = new Set() + this.cachedReqs = new Map() + this.onCloseHandler = () => { + if (this.cachedReqs.size !== 0) { + this.cachedReqs.clear() + } + if (this.reqSet.size !== 0) { + if (!this.params.ci) { + signale.error(`Some connections was not completed, but navigation happened.`) + signale.error(`That is bad, mkay? Because you have a race: server response and navigation`) + signale.error(`That will lead to heisenberg MONOFO errors in case when response will win the race`) + signale.error(`Alive connections:\n${[...this.reqSet]}`) + throw new Error(`Some connections was not completed, but navigation happened.`) + } + this.reqSet.clear() + this._resolveReqs() + } + } + // Clear on any page close, or sometimes you loose some responses on unload, and `connections` will never resolves + this.params.page.on('close', this.onCloseHandler) + const pureRequestHandler = createRequestHandler({ + ...this.params, + reqSet: this.reqSet, + _onSetReqCache: (req) => this.cachedReqs.set(`${req._url}_${req._method}`, req._postData), + _onReqStarted: () => this._onAnyReqStart(), + _onReqsReject: (...args) => this._rejectReqs(...args), + pageUrl: () => this.params.page.url(), + }) + this.requestHandler = (ir) => pureRequestHandler(ir, this.extraParams) + const pureResponseHandler = createResponseHandler({ + ...this.params, + reqSet: this.reqSet, + _onReqsCompleted: () => this._resolveReqs(), + _onReqsReject: (...args) => this._rejectReqs(...args), + }) + this.responseHandler = (ir) => pureResponseHandler(ir, this.extraParams) + + logger('Handlers created, params validated') + + this._startPromise = makeDir(this.params.workDir) + .then(() => { + logger(`Successfully created workDir ${this.params.workDir}`) + + return this.page.setRequestInterception(true) + }) + .then(() => { + // Intercepting all requests and respinding with mocks + this.page.on('request', this.requestHandler) + + // Writing mocks on real responses to filesystem + this.page.on('response', this.responseHandler) + + logger('_startPromise about to resolve (Request interception enabled, listeners added)') + }) + .catch((e) => { + logger(`Unknown error from puppeteer: ${e.message}`) + }) + + return this._startPromise + } + + set(key, value) { + this.extraParams = this.extraParams || {} + this.extraParams[key] = value + } + + unset(key) { + if (this.extraParams && typeof this.extraParams[key] !== 'undefined') { + this.extraParams[key] = undefined + } + } + + reset() { + this.extraParams = {} + } + + /* + * Resolves when all mocked connections are completed + * @deprecated + */ + connections() { + signale.warn('mocker.connections() is deprecated and will be removed') + signale.warn('try to await explicit UI changes, not connections') + + if (typeof this._startPromise === 'undefined') { + throw new Error('Cant await connections. Probably you didnt start the mocker?') + } + + return this.reqsPromise || Promise.resolve() + } + + /* + * Waits for all connections to be completed and removes all handlers from the page + */ + stop() { + this.cachedReqs.clear() + if (!this.alive) { + // Async, because jest suppress Errors in `after` callbacks + setTimeout(() => { + throw new Error(`Trying to stop already stopped mocker! Did you call 'mocker.stop()' twice?`) + }) + } + + const t1 = setTimeout(() => { + if (this.reqSet.size === 0) { + logger(`Mocker failed to stop. reqSet.size === 0`) + } else { + logger(`Mocker failed to stop. Alive connections:\n${[...this.reqSet]}`) + } + + logger('About to throw an Error') + + signale.error(`Failed to stop mocker!`) + signale.error(`Possible reasons:`) + signale.error(`1) navigation happened before all responses completed.`) + signale.error(`2) some connections are not finished in 20 seconds.`) + signale.error(`The number of opened connections is ${this.reqSet.size}.\nReqSet:${[...this.reqSet]}`) + throw new Error(`Failed to stop mocker!`) + }, 20 * 1000) + + logger('Begining of mocker.stop procedure') + + if (typeof this._startPromise === 'undefined') { + throw new Error('Cant stop mocker. Probably you didnt start it?') + } + + let failed = false + + // If any request is not mocked, return promise will reject + return this._startPromise + .then(() => { + if (this.params.awaitConnectionsOnStop) { + return this.connections() + } + }) + .catch((err) => { + signale.error(`this.connections was rejected with error. Continue...`, err) + failed = err + }) + .then(() => { + logger('`Start` promise was resolved, `connections` promise was resolved or rejected') + + clearTimeout(t1) + + this.params.page.removeListener('request', this.requestHandler) + this.params.page.removeListener('response', this.responseHandler) + this.params.page.removeListener('close', this.onCloseHandler) + + return this.params.page.setRequestInterception(false) + }) + .then(() => { + logger('requestInterception disabled, fail timeout cleared') + + this.params.pagesSet.delete(this.params.page) + + this._startPromise = undefined + this.params = undefined + this.alive = false + this.onCloseHandler = null + + logger(`Mocker full stop. Period.`) + + // @todo how to solve that without closure? + // Must reject on `connections` reject, but must finish all tasks also + if (failed) { + signale.error(`Rejecting mocker.stop() promise, because connections promise was rejected`) + + logger(`About to exit from mocker.stop with reject`) + + return Promise.reject(failed) + } + + logger(`About to exit from mocker.stop with resolve`) + }) + } + + getCachedRequests() { + return this.cachedReqs + } +} + +export default Mocker diff --git a/src/storage.ts b/src/storage.ts new file mode 100644 index 0000000..fc0c6fd --- /dev/null +++ b/src/storage.ts @@ -0,0 +1,128 @@ +import fs from 'fs' +import path from 'path' +import { URL } from 'url' +import makeDir from 'make-dir' +import debug from 'debug' +import signale from './logger' +import getRequestId from './getRequestId' +import logger from './logger' + +const loggerRead = debug('prm:storage:read') +const loggerWrite = debug('prm:storage:write') + +const loggerNames = debug('prm:storage:names') + +const getNames = (params) => { + const { hostname, pathname, protocol } = new URL(params.url) + + loggerNames(`Url parts are hostname=${hostname}, pathname=${pathname}, protocol=${protocol}`) + + const dirName = pathname.replace(/\//g, '-').replace(/^-|-$/g, '') + + loggerNames(`dirName=${dirName} workDir=${params.workDir}`) + + const targetDir = path.join(params.workDir, `${hostname}${dirName ? '-' + dirName : ''}`) + + loggerNames(`targetDir=${targetDir}`) + + const fileName = getRequestId(params) + + loggerNames(`fileName=${fileName}`) + + const absFileName = path.join(targetDir, fileName) + + loggerNames(`absFileName=${absFileName}`) + + return { + targetDir, + absFileName, + } +} + +export const write = ({ fn, body, url, ci }) => { + loggerWrite(`Entering storage.write with fn === ${fn}`) + + const jsonFn = fn + '.json' + const targetDir = path.dirname(fn) + + return makeDir(targetDir).then(() => { + loggerWrite(`Successfully checked/created targetDir ${targetDir}`) + + return new Promise((resolve, reject) => { + let fileExists = fs.existsSync(jsonFn) + + if (!fileExists) { + fileExists = fs.existsSync(fn) + } + + if (!fileExists) { + loggerWrite(`File does not exists ${fn}`) + + if (ci) { + loggerWrite(`Url "${url}" wasnt mocked! Rejecting and exiting storage.write.`) + reject(Error(`Mock cannot be saved in CI mode.`)) + + return + } + + signale.write(`Writing mock for url "${url}"`) + signale.write(`to file "${jsonFn}"`) + + fs.writeFile(jsonFn, body, (err) => { + if (err) { + signale.error(`Failed to write new file ${jsonFn}`) + + reject(err) + } + + signale.success(`Successfully wrote new file ${jsonFn}`) + + resolve({ fn, new: true }) + }) + } else { + loggerWrite(`File already exists, do nothing ${fn}`) + + resolve({ fn, new: false }) + } + }) + }) +} + +export const read = (fn) => { + loggerRead(`About to read file ${fn}(.json)`) + const jsonFn = fn + '.json' + let fileToRead = jsonFn + + return new Promise((resolve, reject) => { + if (!fs.existsSync(jsonFn)) { + loggerRead(`json version of the mock does not exists, trying to read ${fn}`) + fileToRead = fn + } + + try { + fs.readFile(fileToRead, 'utf8', (err, data) => { + if (err) { + if (err.code === 'ENOENT') { + loggerRead(`File does not exist ${fileToRead}`) + } else { + logger.error(`Fail to read the file ${fileToRead}`, err) + } + + reject({ fn, err }) + } else { + logger.read(`Successfully read the file ${fileToRead}`) + + resolve(data) + } + }) + } catch (err) { + logger.error(`Unexpected failure of file reading ${fileToRead}`, err) + + reject({ fn, err }) + } + }) +} + +export const __getNames = getNames +// @ts-ignore +export const name = (...args) => getNames(...args).absFileName diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..8c0c5fb --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,34 @@ +import { URL } from 'url' + +const matches = (arr, str) => !!arr.find((el) => str.includes(el)) + +// @todo tests +const shouldNotIntercept = (mockList = [], okList = [], url = '') => { + const inOkList = matches(okList, url) + const inMockList = matches(mockList, url) + const inAnyList = inOkList || inMockList + const listsAreConfigured = mockList.length > 0 || okList.length > 0 + + // If mockList/okList werent set – intercept all requests except localhost + return (listsAreConfigured && !inAnyList) || (!listsAreConfigured && url.includes('localhost')) +} + +const shouldOk = (mockList = [], okList = [], url = '') => { + const inOkList = matches(okList, url) + const inMockList = matches(mockList, url) + + return inOkList && !inMockList +} + +function isSameOrigin(url1, url2) { + const p1 = new URL(url1) + const p2 = new URL(url2) + + return p1.host === p2.host && p1.protocol === p2.protocol +} + +function isPassableByDefault(pageUrl, reqUrl, method) { + return method === 'GET' && isSameOrigin(pageUrl, reqUrl) +} + +export { matches, shouldNotIntercept, shouldOk, isPassableByDefault } diff --git a/src/words-hash.ts b/src/words-hash.ts new file mode 100644 index 0000000..103386e --- /dev/null +++ b/src/words-hash.ts @@ -0,0 +1,296 @@ +// @ts-ignore +import { createHash } from 'crypto' + +const WORDS: string[] = [ + 'ack', + 'aim', + 'air', + 'and', + 'angel', + 'apart', + 'app', + 'april', + 'arizona', + 'ark', + 'artist', + 'aspen', + 'august', + 'autumn', + 'avocado', + 'axe', + 'bacon', + 'ban', + 'bark', + 'batman', + 'beam', + 'beer', + 'berlin', + 'biz', + 'black', + 'blue', + 'boo', + 'bravo', + 'bud', + 'bump', + 'burger', + 'bus', + 'butter', + 'carbon', + 'cardinal', + 'carolina', + 'carpet', + 'cat', + 'ceiling', + 'charlie', + 'chicken', + 'clip', + 'coffee', + 'cola', + 'cold', + 'color', + 'comet', + 'crazy', + 'cry', + 'cup', + 'cut', + 'dakota', + 'december', + 'delaware', + 'delta', + 'diet', + 'dog', + 'don', + 'door', + 'duck', + 'early', + 'earth', + 'east', + 'echo', + 'eco', + 'edward', + 'eight', + 'eme', + 'emma', + 'enemy', + 'equal', + 'failed', + 'fake', + 'fanta', + 'fifteen', + 'fillet', + 'finch', + 'fish', + 'five', + 'fix', + 'fiz', + 'floor', + 'flux', + 'fly', + 'four', + 'fruit', + 'gee', + 'georgia', + 'glucose', + 'goby', + 'golf', + 'green', + 'grey', + 'hamper', + 'happy', + 'harry', + 'hawaii', + 'helium', + 'high', + 'hook', + 'hot', + 'hotel', + 'hug', + 'hydrogen', + 'ice', + 'idaho', + 'illinois', + 'india', + 'indigo', + 'ink', + 'iowa', + 'island', + 'item', + 'jaws', + 'jazz', + 'jersey', + 'jet', + 'jig', + 'johnny', + 'juliet', + 'july', + 'jupiter', + 'kansas', + 'kentucky', + 'kid', + 'kilo', + 'king', + 'kitten', + 'lactose', + 'lake', + 'lamp', + 'lax', + 'lemon', + 'leopard', + 'lima', + 'limb', + 'lion', + 'lithium', + 'london', + 'low', + 'magazine', + 'maine', + 'mango', + 'march', + 'mars', + 'mass', + 'may', + 'mexico', + 'mic', + 'mike', + 'mirror', + 'miss', + 'mobile', + 'monkey', + 'moon', + 'muppet', + 'music', + 'neptune', + 'network', + 'nevada', + 'nine', + 'node', + 'north', + 'november', + 'nut', + 'nuts', + 'october', + 'ohio', + 'oil', + 'one', + 'orange', + 'oregon', + 'oscar', + 'oven', + 'owe', + 'oxid', + 'oxygen', + 'papa', + 'paris', + 'pasta', + 'perk', + 'pic', + 'pin', + 'pip', + 'pizza', + 'pluto', + 'potato', + 'queen', + 'quiet', + 'red', + 'rem', + 'ria', + 'river', + 'robin', + 'romeo', + 'rugby', + 'sad', + 'sad', + 'salami', + 'saturn', + 'seven', + 'sexy', + 'shade', + 'sierra', + 'single', + 'sink', + 'six', + 'sixteen', + 'skylark', + 'snake', + 'social', + 'sodium', + 'solar', + 'south', + 'spring', + 'spy', + 'steak', + 'steel', + 'stream', + 'summer', + 'sweet', + 'table', + 'tango', + 'tel', + 'ten', + 'tennis', + 'texas', + 'three', + 'tick', + 'timing', + 'tor', + 'toy', + 'twelve', + 'twenty', + 'two', + 'uncle', + 'uniform', + 'utah', + 'vegan', + 'venus', + 'victor', + 'video', + 'violet', + 'west', + 'white', + 'wiki', + 'winner', + 'winter', + 'xray', + 'yellow', + 'zag', + 'zebra', + 'zee', + 'zero', + 'zulu', + 'zuz', +] + +const SEP = '-' + +export function humanize(hexdigest: string, words: number = 3): string { + // if one char changed, all words must change + const hashed = createHash('md5') + .update(hexdigest) + .digest('hex') + const pairs: string[] = hashed.match(/(..?)/g) as string[] + const bytes: number[] = pairs.map((x) => parseInt(x, 16)) + const compressed = compress(bytes, words) + + return compressed.map((x: number): string => WORDS[x]).join(SEP) +} + +function compress(bytes: number[], len: number): number[] { + const length = bytes.length + + if (len > length) { + throw new Error('Fewer input bytes than requested output') + } + + const seg_size = (length / len) >> 0 + const segments: number[][] = [] + + for (let i = 0; i < seg_size * len; i += seg_size) { + segments.push(bytes.slice(i, i + seg_size)) + } + + segments[segments.length - 1] = segments[segments.length - 1].concat(bytes.slice(len * seg_size)) + + const checksums = segments.map((x) => x.reduce((acc, curr) => acc ^ curr)) + + return checksums +} diff --git a/tests/getNames.spec.js b/tests/getNames.spec.js new file mode 100644 index 0000000..2ee8ef1 --- /dev/null +++ b/tests/getNames.spec.js @@ -0,0 +1,200 @@ +const getNames = require('../dist/storage').__getNames + +// url, method, postData = '', workDir, skipQueryParams = [], skipPostParams = [] + +it('Generates filename for domain without slash', () => { + const names = getNames({ + url: 'http://example.com', + workDir: '/diokuz/dir' + }) + + expect(names.targetDir).toBe('/diokuz/dir/example.com') + expect(names.absFileName).toBe('/diokuz/dir/example.com/get-october-leopard-owe') +}) + +it('Generates filename for domain with slash', () => { + const names = getNames({ + url: 'http://example.com/', + workDir: '/diokuz/dir', + }) + + expect(names.targetDir).toBe('/diokuz/dir/example.com') + expect(names.absFileName).toBe('/diokuz/dir/example.com/get-october-leopard-owe') +}) + +it('Generates filename for domain with slugs', () => { + const names = getNames({ + url: 'http://example.com/foo/bar', + workDir: '/diokuz/dir', + }) + + expect(names.targetDir).toBe('/diokuz/dir/example.com-foo-bar') + expect(names.absFileName).toBe('/diokuz/dir/example.com-foo-bar/get-october-lithium-oven') +}) + +it('Generates filename for domain with slugs and trailing slash', () => { + const names = getNames({ + url: 'http://example.com/foo/bar/', + workDir: '/diokuz/dir', + }) + + expect(names.targetDir).toBe('/diokuz/dir/example.com-foo-bar') + expect(names.absFileName).toBe('/diokuz/dir/example.com-foo-bar/get-papa-oil-london') +}) + +it('Generates different filenames for different query params', () => { + const names1 = getNames({ + url: 'http://example.com/foo/bar/?foo=bar', + workDir: '/diokuz/dir', + }) + const names2 = getNames({ + url: 'http://example.com/foo/bar/?baz=1', + workDir: '/diokuz/dir', + }) + + expect(names1.absFileName).toBe('/diokuz/dir/example.com-foo-bar/get-mars-node-nine') + expect(names1.absFileName).not.toBe(names2.absFileName) +}) + +it('Generates same filenames for different skipped query params', () => { + const names1 = getNames({ + url: 'http://example.com/foo/bar/?foo=bar&x=y', + workDir: '/diokuz/dir', + skipQueryParams: ['random'] + }) + const names2 = getNames({ + url: 'http://example.com/foo/bar/?foo=bar&x=y&random=123', + workDir: '/diokuz/dir', + skipQueryParams: ['random'] + }) + + expect(names1.absFileName).toBe('/diokuz/dir/example.com-foo-bar/get-fruit-ark-beam') + expect(names1.absFileName).toBe(names2.absFileName) +}) + +it('Generates same filenames for different order of query params', () => { + const names1 = getNames({ + url: 'http://example.com/foo/bar/?foo=bar&x=y', + workDir: '/diokuz/dir', + skipQueryParams: ['random'] + }) + const names2 = getNames({ + url: 'http://example.com/foo/bar/?x=y&foo=bar', + workDir: '/diokuz/dir' + }) + + expect(names1.absFileName).toBe('/diokuz/dir/example.com-foo-bar/get-fruit-ark-beam') + expect(names1.absFileName).toBe(names2.absFileName) +}) + +it('Generates different filenames for different post bodies without content-type', () => { + const names1 = getNames({ + url:'http://example.com', + method: 'POST', + postData: 'post_body_1', + workDir: '/diokuz/dir' + }) + const names2 = getNames({ + url: 'http://example.com', + method: 'POST', + postData: 'post_body_2', + workDir: '/diokuz/dir' + }) + + expect(names1.absFileName).toBe('/diokuz/dir/example.com/post-romeo-flux-chicken') + expect(names1.absFileName).not.toBe(names2.absFileName) +}) + +it('Generates different filenames for different FromData post bodies', () => { + const headers = {"content-type": "application/x-www-form-urlencoded"} + + const names1 = getNames({ + url: 'http://example.com', + method: 'POST', + headers, + postData: "foo=bar&x=2", + workDir: '/diokuz/dir' + }) + const names2 = getNames({ + url: 'http://example.com', + method: 'POST', + headers, + postData: "foo=bazzzz&x=2", + workDir: '/diokuz/dir' + }) + + expect(names1.absFileName).toBe('/diokuz/dir/example.com/post-jet-mars-table') + expect(names1.absFileName).not.toBe(names2.absFileName) +}) + +it('Generates different filenames for different JSON post bodies', () => { + const headers = {"content-type": "application/json"} + + const names1 = getNames({ + url: 'http://example.com', + method: 'POST', + headers, + postData: JSON.stringify({ id: 1, randomId: 2, timestamp: 123 }), + workDir: '/diokuz/dir' + }) + const names2 = getNames({ + url: 'http://example.com', + method: 'POST', + headers, + postData: JSON.stringify({ id: 1, randomId: 3, timestamp: 321 }), + workDir: '/diokuz/dir' + }) + + expect(names1.absFileName).toBe('/diokuz/dir/example.com/post-failed-monkey-hotel') + expect(names1.absFileName).not.toBe(names2.absFileName) +}) + +it('Generates same filenames for different skipped FormData post bodies', () => { + const skipPostParams = ['foo'] + + const headers = {"content-type": "application/x-www-form-urlencoded"} + const names1 = getNames({ + url: 'http://example.com', + method: 'POST', + headers, + postData: "foo=bar&x=2", + workDir: '/diokuz/dir', + skipPostParams + }) + const names2 = getNames({ + url: 'http://example.com', + method: 'POST', + headers, + postData: "foo=bazzzz&x=2", + workDir: '/diokuz/dir', + skipPostParams + }) + + expect(names1.absFileName).toBe('/diokuz/dir/example.com/post-lamp-echo-jupiter') + expect(names1.absFileName).toBe(names2.absFileName) +}) + +it('Generates same filenames for different skipped JSON post bodies', () => { + const skipPostParams = ['randomId', 'timestamp'] + + const headers = {"content-type": "application/json"} + const names1 = getNames({ + url: 'http://example.com', + method: 'POST', + headers, + postData: JSON.stringify({ id: 1, randomId: 2, timestamp: 123 }), + workDir: '/diokuz/dir', + skipPostParams + }) + const names2 = getNames({ + url: 'http://example.com', + method: 'POST', + headers, + postData: JSON.stringify({ id: 1, randomId: 3, timestamp: 321 }), + workDir: '/diokuz/dir', + skipPostParams + }) + + expect(names1.absFileName).toBe('/diokuz/dir/example.com/post-equal-uniform-ice') + expect(names1.absFileName).toBe(names2.absFileName) +}) diff --git a/tests/getRequestId.spec.js b/tests/getRequestId.spec.js new file mode 100644 index 0000000..de544d9 --- /dev/null +++ b/tests/getRequestId.spec.js @@ -0,0 +1,182 @@ +const getRequestId = require('../src/getRequestId').default + +it('Generates same names for same request', () => { + const name1 = getRequestId({ url: 'http://example.com' }) + const name2 = getRequestId({ url: 'http://example.com' }) + + expect(name1).toBe('get-october-leopard-owe') + expect(name2).toBe(name1) +}) + +it('Generates prefix according to method', () => { + const nameGet = getRequestId({ url: 'http://example.com', method: 'gEt' }) + const namePatch = getRequestId({ url: 'http://example.com', method: 'PATCH' }) + + expect(nameGet).toBe('get-october-leopard-owe') + expect(namePatch).toBe('patch-october-leopard-owe') +}) + +it('skipQueryParams does not affects output name', () => { + const skipQueryParams = ['foo'] + const name1 = getRequestId({ url: 'http://example.com?foo=bar&x=y', skipQueryParams }) + const name2 = getRequestId({ url: 'http://example.com?x=y&foo=bazzzzz', skipQueryParams }) + + expect(name1).toBe(name2) +}) + +it('queryParams does not affect output name', () => { + const queryParams = ['foo'] + const name1 = getRequestId({ url: 'http://example.com?foo=bar&y=x', queryParams }) + const name2 = getRequestId({ url: 'http://example.com?foo=bar', queryParams }) + + expect(name1).toBe(name2) +}) + +it('unnecessary params bigger than 1 does not affect output name', () => { + const queryParams = ['foo'] + const name1 = getRequestId({ url: 'http://example.com?foo=bar&x=y&y=x', queryParams }) + const name2 = getRequestId({ url: 'http://example.com?foo=bar', queryParams }) + + expect(name1).toBe(name2) +}) + +it('queryParams > 1 does not affect output name', () => { + const queryParams = ['foo', 'trois'] + const name1 = getRequestId({ url: 'http://example.com?foo=bar&trois=quatre&x=y', queryParams }) + const name2 = getRequestId({ url: 'http://example.com?trois=quatre&foo=bar', queryParams }) + + expect(name1).toBe(name2) +}) + +it('skip params from queryParams does not affect output name', () => { + const queryParams = ['foo', 'trois'] + const skipQueryParams = ['foo'] + const name1 = getRequestId({ url: 'http://example.com?foo=bar&trois=quatre&x=y', queryParams, skipQueryParams }) + const name2 = getRequestId({ url: 'http://example.com?trois=quatre&foo=bar', queryParams, skipQueryParams }) + + expect(name1).toBe(name2) +}) + +it('Skipped post body params for request with content-type="application/json" does not affects output name', () => { + const method = 'POST' + const skipPostParams = ['foo'] + const headers = {"content-type": "application/json"} + const name1 = getRequestId({ + url: 'http://example.com', + method, + headers, + postData: JSON.stringify({ foo: 'bar', x: 2 }), + skipPostParams + }) + const name2 = getRequestId({ + url: 'http://example.com', + method, + headers, + postData: JSON.stringify({ foo: 'bazzzz', x: 2 }), + skipPostParams + }) + + expect(name1).toBe(name2) +}) + +it('Skipped post body params for request with content-type="application/x-www-form-urlencoded" does not affects output name', () => { + const skipPostParams = ['foo'] + const headers = {"content-type": "application/x-www-form-urlencoded"} + + const name1 = getRequestId({ + url: 'http://example.com', + method: 'POST', + headers, + postData: "foo=bar&x=2", + skipPostParams + }) + const name2 = getRequestId({ + url: 'http://example.com', + method: 'POST', + headers, + postData: "foo=bazzzz&x=2", + skipPostParams + }) + + expect(name1).toBe(name2) +}) + +it('Skipped post body params for request without content-type affects output name', () => { + const method = 'POST' + const skipPostParams = ['foo'] + const headers = {} + const name1 = getRequestId({ + url: 'http://example.com', + method, + headers, + postData: "foo=bar&x=2", + skipPostParams + }) + const name2 = getRequestId({ + url: 'http://example.com', + method, + headers, + postData: "foo=bazzzz&x=2", + skipPostParams + }) + + expect(name1).toBe(name2) +}) + +it('Skipped post body params for request with not supported content-type affects output name', () => { + const method = 'POST' + const skipPostParams = ['foo'] + const headers = {"content-type": "multipart/form-data"} + const name1 = getRequestId({ + url: 'http://example.com', + method, + headers, + postData: "foo=bar&x=2", + skipPostParams + }) + const name2 = getRequestId({ + url: 'http://example.com', + method, + headers, + postData: "foo=bazzzz&x=2", + skipPostParams + }) + + expect(name1).toBe(name2) +}) + +it('Skip nested post body params', () => { + const method = 'POST' + const skipPostParams = [['foo', 'bar']] + const headers = {"content-type": "application/json"} + const name1 = getRequestId({ + url: 'http://example.com', + method, + headers, + postData: JSON.stringify({ foo: { bar: 1 }, baz: 2 }), + skipPostParams + }) + const name2 = getRequestId({ + url: 'http://example.com', + method, + headers, + postData: JSON.stringify({ foo: { bar: 2 }, baz: 2 }), + skipPostParams + }) + + expect(name1).toBe(name2) +}) + +it('Nonexistent level of nested body parameters does not throw an error', () => { + getRequestId({ + url: 'http://example.com', + method: 'POST', + headers:{ 'content-type': 'application/json' }, + postData: JSON.stringify({ foo: 1 }), + skipPostParams: [['foo', 'bar', 'baz']] + }) +}) + +it('Non-json post body does not throws an error', () => { + getRequestId({ url: 'http://example.com', postData: 'post_body' }) +}) diff --git a/tests/puppeteer.spec.js b/tests/puppeteer.spec.js new file mode 100644 index 0000000..436ab0f --- /dev/null +++ b/tests/puppeteer.spec.js @@ -0,0 +1,394 @@ +const fs = require('fs') +const path = require('path') +const { spawn } = require('child_process') +const puppeteer = require('puppeteer') +const waitPort = require('wait-port') +const rimraf = require('rimraf') +const signale = require('signale') +const mocker = require('../dist').default + +async function sleep(time) { + return new Promise((resolve, reject) => { + setTimeout(resolve, time) + }) +} + +describe('connections', () => { + let page + let browser + let server + + beforeAll(async () => { + const serverPath = path.resolve(__dirname, 'server') + browser = await puppeteer.launch(process.env.D ? { + headless: false, + slowMo: 80, + } : {}) + + page = await browser.newPage() + // Cant kill if detached: false (for reasons unknown) + // Probably https://azimi.me/2014/12/31/kill-child_process-node-js.html + server = spawn('node', [serverPath], { detached: true }) + server.stdout.on('data', function(data) { + signale.info(data.toString()) + // process.stdout.write(data.toString()) + }); + await waitPort({ host: 'localhost', port: 3000 }) + }) + + afterAll(async () => { + await browser.close() + // server.kill() + process.kill(-server.pid) + }) + + it('Generates mocks', async () => { + const mockFilePath = path.resolve(__dirname, '../__teremocks__/localhost-api/get-app-diet-moon.json') + + rimraf.sync(path.resolve(__dirname, '../__teremocks__')) + await page.goto('http://localhost:3000') + + // * Starting mocker + await mocker.start({ + page, + mockList: 'localhost:3000/api', + }) + + expect(fs.existsSync(mockFilePath)).toBe(false) + + // * Typing `abcd` → invoking request to `/api` + await page.click('#input') + await page.keyboard.type('abcd', { delay: 100 }) + + // * wait for all connections to complete + await mocker.connections() + + // * At that point there must be mock files + expect(fs.existsSync(mockFilePath)).toBe(true) + + // * stopping the mocker + await mocker.stop() + }) + + it('Generates mocks for POST request', async () => { + const mockFilePath = path.resolve(__dirname, '../__teremocks-post__/localhost-api/post-diet-sink-color.json') + + rimraf.sync(path.resolve(__dirname, '../__teremocks-post__')) + await page.goto('http://localhost:3000') + + // * Starting mocker + await mocker.start({ + page, + mockList: 'localhost:3000/api', + namespace: '__teremocks-post__', + }) + + expect(fs.existsSync(mockFilePath)).toBe(false) + + // * Typing `abcd` → invoking POST request to `/api` + await page.click('#input-post') + await page.keyboard.type('abcd', { delay: 10 }) + + // * wait for all connections to complete + await mocker.connections() + + // * At that point there must be mock files + expect(fs.existsSync(mockFilePath)).toBe(true) + + // * stopping the mocker + await mocker.stop() + }) + + it('Uses existing mocks', async () => { + await page.goto('http://localhost:3000') + + // * Starting mocker + await mocker.start({ + page, + mockList: 'localhost:3000/api', + }) + + // * Typing `abc` → invoking request to `/api`, which are mocked + await page.click('#input') + await page.keyboard.type('abc') + + // * Because all requests are mocked, they respond instantly, without delay + // * So, page reaction on the response must be within 100 ms + // * Checking that reaction: there must be a text `green` in the suggest div + await page.waitForFunction(() => { + return document.querySelector('#suggest').innerText === '200 green' + }, { timeout: 100 }) + + await mocker.stop() + }) + + it('Resolves `connections` even when no requests from mockList were made', async () => { + await page.goto('http://localhost:3000') + + // * Starting mocker with void mockList + await mocker.start({ + page, + mockList: null, + }) + + // * Typing `abc` → invoking request to `/api`, which is not mocked + await page.click('#input') + await page.keyboard.type('a') + + // * Awaiting for real response and its corresponding reaction (text `suggest: example` must appear) + await page.waitForFunction(() => { + return document.querySelector('#suggest').innerText === '200 example' + }, { timeout: 4000 }) + + // * All connections must resolves after theirs completion + await expect(mocker.connections()).resolves.toEqual(undefined) + + // * Stopping the mocker + await mocker.stop() + }) + + it('Resolves `stop` even when no requests from mockList were made', async () => { + await page.goto('http://localhost:3000') + + // * Starting mocker with void mockList + await mocker.start({ + page, + mockList: null, + }) + + // * Typing `abc` → invoking request to `/api`, which is not mocked + await page.click('#input') + await page.keyboard.type('a') + + // * Awaiting for real response and its corresponding reaction (text `suggest: example` must appear) + await page.waitForFunction(() => { + return document.querySelector('#suggest').innerText === '200 example' + }, { timeout: 4000 }) + + await expect(mocker.stop()).resolves.toEqual(undefined) + }) + + it.skip('Fails `stop` in CI mode when no mock found', async () => { + await page.goto('http://localhost:3000') + + // * Starting mocker with void mockList + await mocker.start({ page, mockList: 'localhost:3000/api', ci: true, mockMiss: 'throw', awaitConnectionsOnStop: true }) + + // * Typing `x` → invoking request to `/api`, which is not mocked + await page.click('#input') + await page.keyboard.type('x') + await sleep(500) + + // * Expecting `stop` promise to reject, because no `mock file not found` (MONOFO) + // await expect(mocker.stop()).rejects.toEqual('MONOFO') + }) + + describe('mocker.set()', () => { + it('Generates mocks in extra workDir', async () => { + const mockFilePath = path.resolve(__dirname, '../__extra-mocks__/localhost-api/get-app-diet-moon.json') + + await page.goto('http://localhost:3000') + + // * Starting mocker + await mocker.start({ + page, + mockList: 'localhost:3000/api', + }) + await mocker.set('workDir', path.resolve(process.cwd(), '__extra-mocks__')) + + expect(fs.existsSync(mockFilePath)).toBe(false) + + // * Typing `abcd` → invoking request to `/api` + await page.click('#input') + await page.keyboard.type('abcd', { delay: 100 }) + + // * mocker.stop waits for all connections + await mocker.connections() + await sleep(1000) + + // * At that point there must be mock files + expect(fs.existsSync(mockFilePath)).toBe(true) + }) + + it('Changes request.status', async () => { + await page.goto('http://localhost:3000') + + // * Starting mocker + await mocker.start({ + page, + mockList: 'localhost:3000/api', + }) + + // * Typing `a` → invoking request to `/api` + await page.click('#input') + await page.keyboard.type('a') + + // * Awaiting for suggest innerText with code 200 + await page.waitForFunction(() => { + return document.querySelector('#suggest').innerText === '200 example' + }, { timeout: 700 }) + + await mocker.set('response', { status: 429 }) + await page.keyboard.type('b') + + // * Awaiting for suggest innerText with code 429 + await page.waitForFunction(() => { + return document.querySelector('#suggest').innerText === '429 world' + }, { timeout: 700 }) + }) + + afterAll(() => { + rimraf.sync(path.resolve(__dirname, '../__extra-mocks__')) + }) + + // * stopping the mocker + afterEach(async () => await mocker.stop()) + }) + + + describe('mockMiss', () => { + it('Do not throws in CI with mockMiss === 200', async () => { + await page.goto('http://localhost:3000') + + // * Starting mocker with void mockList + await mocker.start({ page, mockList: 'localhost:3000/api', ci: true, mockMiss: 200 }) + + // * Typing `x` → invoking request to `/api`, which is not mocked + await page.click('#input') + await page.keyboard.type('x') + + // * Expecting `stop` promise to resolve, because mockMiss is number + await expect(mocker.stop()).resolves.toEqual() + }) + + it('Uses mockMiss middleware for response', async () => { + await page.goto('http://localhost:3000') + + // * Starting mocker with void mockList + await mocker.start({ + page, + mockList: 'localhost:3000/api', + ci: true, + mockMiss: (next) => next({ body: JSON.stringify({ suggest: 'mockMiss_middleware' }) }), + }) + + // * Typing `x` → invoking request to `/api`, which is not mocked + await page.click('#input') + await page.keyboard.type('x') + + // * Awaiting for middlware response and its body in suggest div + await page.waitForFunction(() => { + return document.querySelector('#suggest').innerText === '200 mockMiss_middleware' + }, { timeout: 4000 }) + + // * Expecting `stop` promise to resolve, because mockMiss is function + await expect(mocker.stop()).resolves.toEqual() + }) + + it('Must not use mockMiss function if mock exists', async () => { + await page.goto('http://localhost:3000') + + // * Starting mocker with void mockList + await mocker.start({ + page, + mockList: 'localhost:3000/api', + ci: true, + mockMiss: (next) => next({ body: JSON.stringify({ suggest: 'mockMiss_middleware' }) }), + }) + + // * Typing `x` → invoking request to `/api`, which is not mocked + await page.click('#input') + await page.keyboard.type('abc') + + // * Awaiting for middlware response and its body in suggest div + await page.waitForFunction(() => { + return document.querySelector('#suggest').innerText === '200 green' + }, { timeout: 4000 }) + + // * Expecting `stop` promise to resolve + await expect(mocker.stop()).resolves.toEqual() + }) + }) + + describe('options.passList', () => { + it('blocks cross origin requests by default', async () => { + await page.goto('http://localhost:3000') + + // * Starting mocker with void passList + await mocker.start({ page }) + + // * Typing `a` → invoking cors request to `/api`, which must be blocked + await page.click('#input-cors') + await page.keyboard.type('a') + + // * Awaiting for suggest innerText, which indicates wether request was blocked + await page.waitForFunction(() => { + return document.querySelector('#suggest-cors').innerText === 'cors request failed' + }, { timeout: 1000 }) + }) + + it('blocks same origin non-GET requests by default', async () => { + await page.goto('http://localhost:3000') + + // * Starting mocker with void passList + await mocker.start({ page }) + + // * Typing `a` → invoking POST request to `/api`, which must be blocked + await page.click('#input-post') + await page.keyboard.type('a') + + // * Awaiting for suggest innerText, which indicates wether request was blocked + await page.waitForFunction(() => { + return document.querySelector('#suggest-post').innerText === 'post request failed' + }, { timeout: 1000 }) + }) + + it('dont blocks cross origin request when url in passList', async () => { + await page.goto('http://localhost:3000') + + // * Starting mocker with void passList + await mocker.start({ page, passList: ['http://localhost:4000'] }) + + // * Typing `a` → invoking CORS request to `/api`, which must not be blocked + await page.click('#input-cors') + await page.keyboard.type('a') + + // * Awaiting for suggest innerText, which indicates wether request was blocked + await page.waitForFunction(() => { + return document.querySelector('#suggest-cors').innerText === '200 example' + }, { timeout: 1000 }) + }) + + it('dont blocks cross origin request when url in passList, but with query', async () => { + await page.goto('http://localhost:3000') + + // * Starting mocker with void passList + await mocker.start({ page, passList: ['http://localhost:4000'] }) + + // * Typing `a` → invoking CORS request to `/api?q=a`, which must not be blocked + await page.click('#input-cors') + await page.keyboard.type('a') + + // * Awaiting for suggest innerText, which indicates wether request was blocked + await page.waitForFunction(() => { + return document.querySelector('#suggest-cors').innerText === '200 example' + }, { timeout: 1000 }) + }) + + it('navigation request should not be blocked', async () => { + // * Starting mocker without passList + await mocker.start({ page }) + + // * Goto 'about:blank' → 'localhost:3000' some url – that url should not be blocked + await page.goto('http://localhost:3000') + await page.waitFor('#suggest') + + // * Goto 'localhost:3000' → 'localhost:4000/text' some url – that url should not be blocked + await page.goto('http://localhost:4000/text') + await page.waitFor('#text') + }) + + afterEach(async () => await mocker.stop()) + }) +}) + diff --git a/tests/server/index.html b/tests/server/index.html new file mode 100644 index 0000000..db70e5a --- /dev/null +++ b/tests/server/index.html @@ -0,0 +1,109 @@ + + + + + + + Puppeteer Request Mocker // Test page + + + +
    +
    Start typing 'abc' and wait for GET-requests
    + +
     
    + +
    Start typing 'abc' and wait for POST-requests
    + +
     
    + +
    Start typing 'abc' and wait for CORS-requests
    + +
     
    +
    + + + + diff --git a/tests/server/index.js b/tests/server/index.js new file mode 100644 index 0000000..f6c8718 --- /dev/null +++ b/tests/server/index.js @@ -0,0 +1,71 @@ +const fs = require('fs') +const path = require('path') +const express = require('express') +const bodyParser = require('body-parser') +const logger = require('./logger') + +const app = express() +app.use(bodyParser.json()) +app.use(bodyParser.urlencoded({ extended: false })) + +const suggests = { + a: 'example', + ab: 'world', + abc: 'green', + abcd: 'book', +} + +app.get('/api', (req, res) => { + logger.info(`get /api`, req.query) + + const q = req.query.q + + setTimeout(() => { + res.set('Access-Control-Allow-Origin', '*') + res.json({ suggest: suggests[q] || q }) + }, 300) +}) + +app.post('/api', (req, res) => { + logger.req(`post /api`, req.body) + + const q = req.body.q + + setTimeout(() => { + res.set('Access-Control-Allow-Origin', '*') + res.json({ suggest: suggests[q] || q }) + }, 100) +}) + +app.post('/cors-api', (req, res) => { + logger.req(`post /cors-api`, req.query) + + const q = req.query.q + + setTimeout(() => { + res.set('Access-Control-Allow-Origin', '*') + res.json({ suggest: suggests[q] || q }) + }, 100) +}) + +app.get('/', (req, res) => { + logger.req(`entering /`) + try { + const htmlPath = path.resolve(__dirname, './index.html') + const htmlContent = fs.readFileSync(htmlPath, 'utf8') + + res.send(htmlContent) + } catch (e) { + logger.fatal(e.message) + res.send('not ok') + } +}) + +app.get('/text', (req, res) => { + logger.info(`get /text`) + + res.send('
    text
    ') +}) + +app.listen(3000, () => logger.info('http://localhost:3000')) +app.listen(4000, () => logger.info('http://localhost:4000')) diff --git a/tests/server/logger.js b/tests/server/logger.js new file mode 100644 index 0000000..bf1d8d0 --- /dev/null +++ b/tests/server/logger.js @@ -0,0 +1,34 @@ +const { Signale } = require('signale') + +const options = { + disabled: false, + interactive: false, + logLevel: process.env.SIGNALE_LOG_LEVEL || 'debug', + scope: 'tests express server', + secrets: [], + stream: process.stdout, + types: { + req: { + badge: '»', + color: 'yellow', + label: 'req', + logLevel: 'info', + }, + res: { + badge: '«', + color: 'yellow', + label: 'res', + logLevel: 'info', + }, + log: { + badge: '🎅', + color: 'red', + label: 'santa', + logLevel: 'debug', + }, + }, +} + +const logger = new Signale(options) + +module.exports = logger diff --git a/tests/words-hash.spec.js b/tests/words-hash.spec.js new file mode 100644 index 0000000..d2d9af0 --- /dev/null +++ b/tests/words-hash.spec.js @@ -0,0 +1,37 @@ +const { humanize } = require('../src/words-hash') + +it('Generates same words for same hash', () => { + const hash = 'a6bf1757fff057f266b697df9cf176fd' + const words1 = humanize(hash) + const words2 = humanize(hash) + + expect(words1).toBe(words2) +}) + +it('Three words by default', () => { + const hash = 'a6bf1757fff057f266b697df9cf176fd' + const words = humanize(hash) + const len = words.split('-').length + + expect(len).toBe(3) +}) + +it('All words must be changed when one symbol in string changes', () => { + const str1 = 'a-qwertyuiop[]' + const str2 = 'b-qwertyuiop[]' + const words1 = humanize(str1) + const words2 = humanize(str2) + + expect(words1).toBe('grey-texas-summer') + expect(words2).toBe('goby-sodium-ack') +}) + +it('Empty string', () => { + const words = humanize('') + + expect(words).toBe('batman-tel-pluto') +}) + +it('Not a string must throw', () => { + expect(() => humanize()).toThrow() +}) diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..7dadb3f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "target": "es5", + "lib": ["es2015", "es2016", "dom"], + "outDir": "./dist", + "moduleResolution": "Node", + "module": "CommonJS", + "noUnusedLocals": true, + "noUnusedParameters": true, + "sourceMap": false, + "declaration": true, + "resolveJsonModule": true, + "strictNullChecks": true, + "importHelpers": true, + "skipLibCheck": true, + "downlevelIteration": true + }, + "include": [ + "src/*", + ] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..2957e9d --- /dev/null +++ b/yarn.lock @@ -0,0 +1,5692 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 4 + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.5.5": + version: 7.5.5 + resolution: "@babel/code-frame@npm:7.5.5" + dependencies: + "@babel/highlight": ^7.0.0 + checksum: 551cba5f44acd781f3dd96ce52c7477130ab30364d67cf738a6b35917bde64300b9be8efad1c068405ad7bd92197647214df5292cf8b51272af9fab59141ccc0 + languageName: node + linkType: hard + +"@babel/core@npm:^7.1.0": + version: 7.7.2 + resolution: "@babel/core@npm:7.7.2" + dependencies: + "@babel/code-frame": ^7.5.5 + "@babel/generator": ^7.7.2 + "@babel/helpers": ^7.7.0 + "@babel/parser": ^7.7.2 + "@babel/template": ^7.7.0 + "@babel/traverse": ^7.7.2 + "@babel/types": ^7.7.2 + convert-source-map: ^1.7.0 + debug: ^4.1.0 + json5: ^2.1.0 + lodash: ^4.17.13 + resolve: ^1.3.2 + semver: ^5.4.1 + source-map: ^0.5.0 + checksum: 0bf1e095fe5f854b78dafde06e6d6399dbda0080846491fe9ec68fb0a1f955feddeb8f044ca6581e8519d0596b5d53731090c460a86b3d738114074ed4ed8754 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.4.0, @babel/generator@npm:^7.7.2": + version: 7.7.2 + resolution: "@babel/generator@npm:7.7.2" + dependencies: + "@babel/types": ^7.7.2 + jsesc: ^2.5.1 + lodash: ^4.17.13 + source-map: ^0.5.0 + checksum: 16dfcf6654fbdbe0f4c281d8ecb88277d9bc6603bbac77f988cbfb8b8ddb33520f6e3340fb3206ec97e71a2277b94d774796c219acab65a57bc4fd267b43ffd7 + languageName: node + linkType: hard + +"@babel/helper-function-name@npm:^7.7.0": + version: 7.7.0 + resolution: "@babel/helper-function-name@npm:7.7.0" + dependencies: + "@babel/helper-get-function-arity": ^7.7.0 + "@babel/template": ^7.7.0 + "@babel/types": ^7.7.0 + checksum: 58049149f9689c9fbcf05c226f1c18434295c0d091196ede3314c18903a0c6a4e7b49b7852f7ea70d303539628e56fee5acbed1aaad7cf9708675808c528508e + languageName: node + linkType: hard + +"@babel/helper-get-function-arity@npm:^7.7.0": + version: 7.7.0 + resolution: "@babel/helper-get-function-arity@npm:7.7.0" + dependencies: + "@babel/types": ^7.7.0 + checksum: bbebf4bea43ab72994232e7bc9922af034143594303adc90dc3aea064e185fa2760bf83aad4425901c822076e867c6fdcd998cf7155256e4745b9b64b1ea4d70 + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.0.0": + version: 7.0.0 + resolution: "@babel/helper-plugin-utils@npm:7.0.0" + checksum: d7f070bb3fb61544a16fa1f1835a8f317283feca4200feb6c1ee4b6a878c621b7d59fe55ef62d68148ece6387158d78d5711edbc8ed1568e4b0fb5ddb8efa69f + languageName: node + linkType: hard + +"@babel/helper-split-export-declaration@npm:^7.7.0": + version: 7.7.0 + resolution: "@babel/helper-split-export-declaration@npm:7.7.0" + dependencies: + "@babel/types": ^7.7.0 + checksum: 6e353dccf58dbbef5a9929c03e2168e7d9c6dd93fc70add5b11afa5a3349014318f6f16cda6cf60c8936fd8f5a999c3a6e079c5e561a079b182ede4d1bad741f + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.7.0": + version: 7.7.0 + resolution: "@babel/helpers@npm:7.7.0" + dependencies: + "@babel/template": ^7.7.0 + "@babel/traverse": ^7.7.0 + "@babel/types": ^7.7.0 + checksum: a18caa23ddb93b2a11e12da1705dbaea5b25957cad13c95c22d8bc037cbdea6865aa36ad7c59e18eee90f5e989b7d73f235b0936b40510ffde1da065df802be1 + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.0.0": + version: 7.5.0 + resolution: "@babel/highlight@npm:7.5.0" + dependencies: + chalk: ^2.0.0 + esutils: ^2.0.2 + js-tokens: ^4.0.0 + checksum: 243061e70d8788a4379bc07ce546beca8c58aa789c2bee4e2147700df0ed89ae475cc634ebe4071f0bdabbaa56f8bc9b2b35158ce8a9dc45241db8e89c311aa6 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.4.3, @babel/parser@npm:^7.7.0, @babel/parser@npm:^7.7.2": + version: 7.7.2 + resolution: "@babel/parser@npm:7.7.2" + bin: + parser: ./bin/babel-parser.js + checksum: b447840766281b1b40f9b1b92cceb268f49c1cf4df167570542ad4b3e73374abb2202ff2f5b5e3a2077dbebd0df18688817d76af783a3a7cbd83d0f8f77d897c + languageName: node + linkType: hard + +"@babel/plugin-syntax-object-rest-spread@npm:^7.0.0": + version: 7.2.0 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.2.0" + dependencies: + "@babel/helper-plugin-utils": ^7.0.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 9541c13a40c9be2bef42769b1e22878d47c2b2395f235ce50234d7ee8c8594e70064e9fb5538aff50ec86c516735e9cada6f448e9b6e80955ed67d83f6231893 + languageName: node + linkType: hard + +"@babel/template@npm:^7.4.0, @babel/template@npm:^7.7.0": + version: 7.7.0 + resolution: "@babel/template@npm:7.7.0" + dependencies: + "@babel/code-frame": ^7.0.0 + "@babel/parser": ^7.7.0 + "@babel/types": ^7.7.0 + checksum: 5eddf9038622c55fd34495e91cfdcd2bd9462809d289a3e5373a2c6158a57705c17f3615bd218de45881ab26c6da7e670e3d468e8fedfdacab6662d84e569819 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.1.0, @babel/traverse@npm:^7.4.3, @babel/traverse@npm:^7.7.0, @babel/traverse@npm:^7.7.2": + version: 7.7.2 + resolution: "@babel/traverse@npm:7.7.2" + dependencies: + "@babel/code-frame": ^7.5.5 + "@babel/generator": ^7.7.2 + "@babel/helper-function-name": ^7.7.0 + "@babel/helper-split-export-declaration": ^7.7.0 + "@babel/parser": ^7.7.2 + "@babel/types": ^7.7.2 + debug: ^4.1.0 + globals: ^11.1.0 + lodash: ^4.17.13 + checksum: 773261f648c773da3817a36facd658cae96379f76bc563e0c016856c836796645a52e975be13c46a3765a6101239713b15a5ee10944783726d2dd6d273ec34d0 + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.3.0, @babel/types@npm:^7.4.0, @babel/types@npm:^7.7.0, @babel/types@npm:^7.7.2": + version: 7.7.2 + resolution: "@babel/types@npm:7.7.2" + dependencies: + esutils: ^2.0.2 + lodash: ^4.17.13 + to-fast-properties: ^2.0.0 + checksum: ceab39349aa8b7a8ee4a140a8fa00b8eadf646a377192ec410d2809cdcd9606157490bb000831f4a92e808e2c1e0357b4e4271a1469572205be4901bf4741643 + languageName: node + linkType: hard + +"@cnakazawa/watch@npm:^1.0.3": + version: 1.0.3 + resolution: "@cnakazawa/watch@npm:1.0.3" + dependencies: + exec-sh: ^0.3.2 + minimist: ^1.2.0 + bin: + watch: ./cli.js + checksum: 996ac2fde1c7c700fa7d475ccda4d3c37b916e1e3c923ea23c08f59c683515df1520e0adf9dafbdb7a99a307af414a7210e5d0f36188cc07c76566a08439f90c + languageName: node + linkType: hard + +"@jest/console@npm:^24.7.1, @jest/console@npm:^24.9.0": + version: 24.9.0 + resolution: "@jest/console@npm:24.9.0" + dependencies: + "@jest/source-map": ^24.9.0 + chalk: ^2.0.1 + slash: ^2.0.0 + checksum: 34bd1a4bc145037ce202a4e46bcec331cc522091fa0dfe1c8e26b57055a13ec1842f1b688ba916577d642d89a1b4d90809e5b4e8e20ee2c7125a4277eb0073ff + languageName: node + linkType: hard + +"@jest/core@npm:^24.9.0": + version: 24.9.0 + resolution: "@jest/core@npm:24.9.0" + dependencies: + "@jest/console": ^24.7.1 + "@jest/reporters": ^24.9.0 + "@jest/test-result": ^24.9.0 + "@jest/transform": ^24.9.0 + "@jest/types": ^24.9.0 + ansi-escapes: ^3.0.0 + chalk: ^2.0.1 + exit: ^0.1.2 + graceful-fs: ^4.1.15 + jest-changed-files: ^24.9.0 + jest-config: ^24.9.0 + jest-haste-map: ^24.9.0 + jest-message-util: ^24.9.0 + jest-regex-util: ^24.3.0 + jest-resolve: ^24.9.0 + jest-resolve-dependencies: ^24.9.0 + jest-runner: ^24.9.0 + jest-runtime: ^24.9.0 + jest-snapshot: ^24.9.0 + jest-util: ^24.9.0 + jest-validate: ^24.9.0 + jest-watcher: ^24.9.0 + micromatch: ^3.1.10 + p-each-series: ^1.0.0 + realpath-native: ^1.1.0 + rimraf: ^2.5.4 + slash: ^2.0.0 + strip-ansi: ^5.0.0 + checksum: 0c3f4822fac2f78a9d7966b8286fe21564df86e8dc8f7b3961cf3e17aa8a46b7578a57139d4d209c4f5d55007dd940d05ca83cc75468cfec6a40ed5ceb2030b2 + languageName: node + linkType: hard + +"@jest/environment@npm:^24.9.0": + version: 24.9.0 + resolution: "@jest/environment@npm:24.9.0" + dependencies: + "@jest/fake-timers": ^24.9.0 + "@jest/transform": ^24.9.0 + "@jest/types": ^24.9.0 + jest-mock: ^24.9.0 + checksum: 06c39aa9ca2c877a6cd0e07fba3d9d18ef22e703d49543c2ce1c466eff537d753b5b0ce2ae45e967031567742ee600dc37743cce45bd7e769a8050b393bc36d4 + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^24.9.0": + version: 24.9.0 + resolution: "@jest/fake-timers@npm:24.9.0" + dependencies: + "@jest/types": ^24.9.0 + jest-message-util: ^24.9.0 + jest-mock: ^24.9.0 + checksum: 68b3598198667e79560d79dd496a1bbb68e6f140509d6886d0f2e3a22ad6b25d44606ccb90837fb1de1e58ea90f26e4e223f49a21068506c8fe253003af282fd + languageName: node + linkType: hard + +"@jest/reporters@npm:^24.9.0": + version: 24.9.0 + resolution: "@jest/reporters@npm:24.9.0" + dependencies: + "@jest/environment": ^24.9.0 + "@jest/test-result": ^24.9.0 + "@jest/transform": ^24.9.0 + "@jest/types": ^24.9.0 + chalk: ^2.0.1 + exit: ^0.1.2 + glob: ^7.1.2 + istanbul-lib-coverage: ^2.0.2 + istanbul-lib-instrument: ^3.0.1 + istanbul-lib-report: ^2.0.4 + istanbul-lib-source-maps: ^3.0.1 + istanbul-reports: ^2.2.6 + jest-haste-map: ^24.9.0 + jest-resolve: ^24.9.0 + jest-runtime: ^24.9.0 + jest-util: ^24.9.0 + jest-worker: ^24.6.0 + node-notifier: ^5.4.2 + slash: ^2.0.0 + source-map: ^0.6.0 + string-length: ^2.0.0 + checksum: 0cd4fac5823733b04e1ce8beab871643b23ee94472701e370efefe46ab45e028901dbbdf631926cb1217c48ba895b7f4ade0c767899c86b947e3728a043a8b41 + languageName: node + linkType: hard + +"@jest/source-map@npm:^24.3.0, @jest/source-map@npm:^24.9.0": + version: 24.9.0 + resolution: "@jest/source-map@npm:24.9.0" + dependencies: + callsites: ^3.0.0 + graceful-fs: ^4.1.15 + source-map: ^0.6.0 + checksum: 7492b336feb39b105638cdc68470d9a1fd3102ce8e65fd1f910f7b06fcaa34222fa7e7bbd6dc953c52dd9942776337c621a3c795f03ea7e04e817b5e5e4cd125 + languageName: node + linkType: hard + +"@jest/test-result@npm:^24.9.0": + version: 24.9.0 + resolution: "@jest/test-result@npm:24.9.0" + dependencies: + "@jest/console": ^24.9.0 + "@jest/types": ^24.9.0 + "@types/istanbul-lib-coverage": ^2.0.0 + checksum: 53b5680a377f8ce7685b04516a769f04621237caa00f72230261fff1857952a6a2022832c843bcd85904e11a16cb9c799f2d8778bb984d2b71b2ebd38481494c + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:^24.9.0": + version: 24.9.0 + resolution: "@jest/test-sequencer@npm:24.9.0" + dependencies: + "@jest/test-result": ^24.9.0 + jest-haste-map: ^24.9.0 + jest-runner: ^24.9.0 + jest-runtime: ^24.9.0 + checksum: b787fe579c79a711123bd4cd3998c8762cae20f6b9a036b3ade201120c1c67541aef26113a3c62b70f1c405c78845be1bfeebb56aba02a4b7e1f770ea1dd9aa5 + languageName: node + linkType: hard + +"@jest/transform@npm:^24.9.0": + version: 24.9.0 + resolution: "@jest/transform@npm:24.9.0" + dependencies: + "@babel/core": ^7.1.0 + "@jest/types": ^24.9.0 + babel-plugin-istanbul: ^5.1.0 + chalk: ^2.0.1 + convert-source-map: ^1.4.0 + fast-json-stable-stringify: ^2.0.0 + graceful-fs: ^4.1.15 + jest-haste-map: ^24.9.0 + jest-regex-util: ^24.9.0 + jest-util: ^24.9.0 + micromatch: ^3.1.10 + pirates: ^4.0.1 + realpath-native: ^1.1.0 + slash: ^2.0.0 + source-map: ^0.6.1 + write-file-atomic: 2.4.1 + checksum: f50ec6a8b82c9aeaebb9a46c6fca44c9050adcf0d4398781d28061fcb445640d278b479e848b04199d4f2ec707726c912085a6a9b61a9333a76d36f040ae339c + languageName: node + linkType: hard + +"@jest/types@npm:^24.9.0": + version: 24.9.0 + resolution: "@jest/types@npm:24.9.0" + dependencies: + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^1.1.1 + "@types/yargs": ^13.0.0 + checksum: 8b9206216a7770f636d69b2738581affed268891defc767770e55018984167ce2e37d31b8945de57485444452a2986b018db5fc32adf15d2f702b69c540ec559 + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.1.0": + version: 7.1.3 + resolution: "@types/babel__core@npm:7.1.3" + dependencies: + "@babel/parser": ^7.1.0 + "@babel/types": ^7.0.0 + "@types/babel__generator": "*" + "@types/babel__template": "*" + "@types/babel__traverse": "*" + checksum: 13f1606ff22cf27d1794b2a3c55210f5736ccbff4eab065257b62f90804aa9218b6163b897b0ed4f915ba9b53f2acc0d5a61261f0a95c8d808975a8cd7e6ed32 + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.0 + resolution: "@types/babel__generator@npm:7.6.0" + dependencies: + "@babel/types": ^7.0.0 + checksum: ea4ccd432384653b9c7785d834ae1dc58d064cc18a542042b893e338dd270e1c3da7c070c921cfef51484185a0f32519f8eaa675ab63c8fb9c6f2e924b0ed03e + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.0.2 + resolution: "@types/babel__template@npm:7.0.2" + dependencies: + "@babel/parser": ^7.1.0 + "@babel/types": ^7.0.0 + checksum: 26b4941ba79a3c5faa7878022ca035782db8033025cf676c094de6bd450a33bc9e381881ce50cae1b40f16b6465bc652cf729378fa23e40e24b1e429d7c38573 + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": + version: 7.0.7 + resolution: "@types/babel__traverse@npm:7.0.7" + dependencies: + "@babel/types": ^7.3.0 + checksum: 77eefa7eb1588033ddf8d83e8c901b197a193344d3aa60e2f0307e1dab6e62d377cab3461b307cf3a6de6427f894ee7af80296c1aed69fb415b63af802cf0a0f + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0": + version: 2.0.1 + resolution: "@types/istanbul-lib-coverage@npm:2.0.1" + checksum: e6f0fb00f5927b5d538416cd709c7ff0b9606ae7c523f1a64c9bf9eaa7f7aea33e96a66875f3a8301a404aca98661c92c7891c534e28f6eb13e5ca2c7df14893 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 1.1.1 + resolution: "@types/istanbul-lib-report@npm:1.1.1" + dependencies: + "@types/istanbul-lib-coverage": "*" + checksum: ff9c3c813340b2374c98ef62d41bfded0e7e9057b1617a57fd1231199f634ea854e889d67dda0d8e408a39f4c9d5f442fef9dea58bea6af1fc95a9aea7e1e5b1 + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^1.1.1": + version: 1.1.1 + resolution: "@types/istanbul-reports@npm:1.1.1" + dependencies: + "@types/istanbul-lib-coverage": "*" + "@types/istanbul-lib-report": "*" + checksum: eff2df25e02b1654344be1f1e1dc4c63673f77c7b8e59fda4b236ac3cae571b8306ecc7f901037843fcc7cf5e97907d55c8555d632ee4e6a24c6ad425b55f04d + languageName: node + linkType: hard + +"@types/node@npm:^12.12.17": + version: 12.12.17 + resolution: "@types/node@npm:12.12.17" + checksum: 5a624f7a120127faa853a09845bfa8dfaec9167ed369456e4bfbda4c1ccde00e242e2a37af3406d5ed72f081fdfdb31a4c18910b7710069a8470c6f777953fb2 + languageName: node + linkType: hard + +"@types/stack-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "@types/stack-utils@npm:1.0.1" + checksum: 5dc06076f3ed8dfa61f65584b9fb956079fc45c6b2ae2902e608df3b1494c0c4b35d29e63c51427cce2ec28925076d0f393ec6faf3a003dad24dc1b8a578f96b + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 13.1.0 + resolution: "@types/yargs-parser@npm:13.1.0" + checksum: f3bb90e40f7baf2e5f50af6c51b28030eac67547946d5843818c13978e65997bc5d80566d720cdb5abe046b1b200ac4e2dac2805f720d7cc49917cff8498ec1f + languageName: node + linkType: hard + +"@types/yargs@npm:^13.0.0": + version: 13.0.3 + resolution: "@types/yargs@npm:13.0.3" + dependencies: + "@types/yargs-parser": "*" + checksum: 9fc9e5d79a390a29ecb70722db88b81ccbc7f5296618a61beb0f047f27870e0f70566e849de7625f1a0285f8973deb8f455c9b101d19bcfe4d23427506127355 + languageName: node + linkType: hard + +"@yarnpkg/fslib@npm:2.0.0-rc.12": + version: 2.0.0-rc.12 + resolution: "@yarnpkg/fslib@npm:2.0.0-rc.12" + dependencies: + "@yarnpkg/libzip": 2.0.0-rc.5 + tmp: ^0.1.0 + checksum: 762ded293e41c197c388e121aa56627bcad46c88205b611ca75a113ac36622c91d7a6b84774e2022ea7933f6dbe002e94ced6bc6020bf6e7199b061ad0cb9e7d + languageName: node + linkType: hard + +"@yarnpkg/libzip@npm:2.0.0-rc.5": + version: 2.0.0-rc.5 + resolution: "@yarnpkg/libzip@npm:2.0.0-rc.5" + checksum: 07e22dfb449599709125e651bce5e39f057704dd577c7e1276c8cbb832a3d7d018c53deb096663e4498c7055c4ca0c6c311d924e67f963b97342b10c99439a82 + languageName: node + linkType: hard + +"@yarnpkg/pnpify@npm:^2.0.0-rc.12": + version: 2.0.0-rc.12 + resolution: "@yarnpkg/pnpify@npm:2.0.0-rc.12" + dependencies: + "@yarnpkg/fslib": 2.0.0-rc.12 + comment-json: ^2.2.0 + cross-spawn: ^6.0.5 + peerDependencies: + eslint: "*" + typescript: "*" + peerDependenciesMeta: + eslint: + optional: true + typescript: + optional: true + bin: + pnpify: ./lib/cli.js + checksum: 07c42a025dc2ad30351ee349cb737c0aee4170055a1fb7d3f901c68004f424b6ae2588f6dff13770b9f637c21dcb539866a613382710d1561717208781ce99b6 + languageName: node + linkType: hard + +"abab@npm:^1.0.4": + version: 1.0.4 + resolution: "abab@npm:1.0.4" + checksum: 966e4be80d6910c6d4ccfe2b555cc8727db97ebea4d6a45957ad45ca90cab8b64658e7a3770373518de022c91b48c6056fcfcb071310ba30ebcc7a46ad0a8c15 + languageName: node + linkType: hard + +"abbrev@npm:1": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: f832fdb07dcece6f089ead093b52bd408d60ceb3ddee665ba9806461998f0e897d61d8e7e12e0b787a9954c8f1f2c32280ebc59c60a477e8919527d66afd16e5 + languageName: node + linkType: hard + +"accepts@npm:~1.3.7": + version: 1.3.7 + resolution: "accepts@npm:1.3.7" + dependencies: + mime-types: ~2.1.24 + negotiator: 0.6.2 + checksum: 1cc69aea0c58440b645f4e14f0d4d55a1236258e54ceacd31cd9efdf62eda36d35bc324560af95efad15c082681510f9e7601403ce8ee32a811a809946f9e433 + languageName: node + linkType: hard + +"acorn-globals@npm:^4.1.0": + version: 4.1.0 + resolution: "acorn-globals@npm:4.1.0" + dependencies: + acorn: ^5.0.0 + checksum: 54b23e89cc56ee25a731fd47fb4ec043676093e29b696848e15c7756322d2de8385b3748d4ba60f9a385f08e8147ccdb223243bbaa1131a03982f2f8a6d07518 + languageName: node + linkType: hard + +"acorn@npm:^5.0.0, acorn@npm:^5.3.0": + version: 5.7.1 + resolution: "acorn@npm:5.7.1" + bin: + acorn: ./bin/acorn + checksum: 871ed181257cac56d5ee7d6f9534bc7ba6fb25a61edf5bb9744a7bc1a671d251fe0512d054e58c048ccf97d6133f6ae2220b008749a391d2b4e8acccce48bfbc + languageName: node + linkType: hard + +"agent-base@npm:^4.3.0": + version: 4.3.0 + resolution: "agent-base@npm:4.3.0" + dependencies: + es6-promisify: ^5.0.0 + checksum: dc92d455111af017c831f28584fe53298907b07cb5102307e8e89385ff8af2fb452a7510befd528929d800f12a91f8da6eec530cd8cf826622f04ba2f52d74bb + languageName: node + linkType: hard + +"ajv@npm:^5.1.0": + version: 5.5.2 + resolution: "ajv@npm:5.5.2" + dependencies: + co: ^4.6.0 + fast-deep-equal: ^1.0.0 + fast-json-stable-stringify: ^2.0.0 + json-schema-traverse: ^0.3.0 + checksum: dce71a9350577280b1c68f182c5f3b036531cbd247b25ab96726b9208ed61bfbb6721607c2fe96b9d89876879ee689410be674b77f6cbf2896176980a41f9e6a + languageName: node + linkType: hard + +"ajv@npm:^6.5.5": + version: 6.10.2 + resolution: "ajv@npm:6.10.2" + dependencies: + fast-deep-equal: ^2.0.1 + fast-json-stable-stringify: ^2.0.0 + json-schema-traverse: ^0.4.1 + uri-js: ^4.2.2 + checksum: 2295662698bf63a8c27b32c42384d404f1e1b75400f6ab36439675e02628fbdb91d88b418fc276311b51043e58dd57c9417e01bfec03fa87d4c571fb274e266d + languageName: node + linkType: hard + +"ansi-escapes@npm:^3.0.0": + version: 3.1.0 + resolution: "ansi-escapes@npm:3.1.0" + checksum: dd62a405681bedb65fc40e44d994fb47854cdd0cca14b66f8922cae1607ef1649447aabbbd4ba969a27a2cf1fe8209726a04e24bba0fb1adf5b85a27553f1757 + languageName: node + linkType: hard + +"ansi-regex@npm:^2.0.0": + version: 2.1.1 + resolution: "ansi-regex@npm:2.1.1" + checksum: 166a4be3a94bbab82de8cc32f3833f14b3648e3274c081a1ba76ed4e6c9d9a7453ae93867518625c8a23dbb585a4a9ef424be122bb1300fc152e8e26027f0740 + languageName: node + linkType: hard + +"ansi-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "ansi-regex@npm:3.0.0" + checksum: 8bb91d5a72509b4930774afcbb086c6dda4c31c5557a89ff6b29dddb7830204b7835e7e035970652a2e7b8ace0f06001890a1d826b330c731715387db959004e + languageName: node + linkType: hard + +"ansi-regex@npm:^4.0.0, ansi-regex@npm:^4.1.0": + version: 4.1.0 + resolution: "ansi-regex@npm:4.1.0" + checksum: 9de38b55c876c42f26000de67fc4c8735998f79679ba93bda3854a9cbcf27abfcb2c4e2041125497ceabdb75f3a9147a40471de5e33b4dcff2125513b6d94d32 + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.0, ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: ^1.9.0 + checksum: 6f99bc6ac278aa5c51543d30aeaeab2b6c3de468d1a23504c1e818283680d0f310bb49a59162bc1b0b81e9b5f2dfa60326791a02b82e5d7cf6803e5b922ea142 + languageName: node + linkType: hard + +"anymatch@npm:^2.0.0": + version: 2.0.0 + resolution: "anymatch@npm:2.0.0" + dependencies: + micromatch: ^3.1.4 + normalize-path: ^2.1.1 + checksum: a776a44ea58cb562a809902b95da3ef941b6d08785016fb483b001ef5d8f6128ae6e629e3eb32d2dc9a2c392defb1c9dc2322193d8b11bb988c2f43b052667d9 + languageName: node + linkType: hard + +"aproba@npm:^1.0.3": + version: 1.2.0 + resolution: "aproba@npm:1.2.0" + checksum: 9a0d0dc1b83830baec519922e07e2efdd065b3ec7c8920e61bfcf463b612d07b4e516cfbcbca6ade7f6f99489fd90334b8b34e4d0f8c6e1933f5c2780e7c7e53 + languageName: node + linkType: hard + +"are-we-there-yet@npm:~1.1.2": + version: 1.1.5 + resolution: "are-we-there-yet@npm:1.1.5" + dependencies: + delegates: ^1.0.0 + readable-stream: ^2.0.6 + checksum: 2a7fc37e2d7e82c862a72bc8946d8fcdb34b07593429b484b71c11aaf4aa47e8ed970c11655f386f223640a5984be20c66b80e14887ccfd11d8ecf780e118b09 + languageName: node + linkType: hard + +"arr-diff@npm:^4.0.0": + version: 4.0.0 + resolution: "arr-diff@npm:4.0.0" + checksum: 83f28c048e8ba8edc6b1b00e6b802173b9e5e27db5386ad1514eac3820d5abaeac99b81150fcf3ba5cf6dc836605315237951c1d6143cdb1bc189f4a87fe0973 + languageName: node + linkType: hard + +"arr-flatten@npm:^1.1.0": + version: 1.1.0 + resolution: "arr-flatten@npm:1.1.0" + checksum: 231a19c79909adcef8456cb216e7e01b86e03c7b5af524ac3c7694be7e3cb3d1bc2e82deac9a312120faeb0c1e0ee6672d05b2a212132f144cde0c22489a5e58 + languageName: node + linkType: hard + +"arr-union@npm:^3.1.0": + version: 3.1.0 + resolution: "arr-union@npm:3.1.0" + checksum: ed06c90ef8e45ed94b48a33ac4c04b1b26b90b45de9445cabd2632c6f57cdc4e63edb3949174a61f8d2b4f72b0b3ec905b68046e39842b7063c51a2e272cfa0f + languageName: node + linkType: hard + +"array-equal@npm:^1.0.0": + version: 1.0.0 + resolution: "array-equal@npm:1.0.0" + checksum: c90a563d60e85cbbc1c4246c75fc3ed300e5de150f2a1411d51a6aa38e1711d75324fb5a84e467b63abc484c6f74b7152cf70dd23592f42305548b3fd7113206 + languageName: node + linkType: hard + +"array-flatten@npm:1.1.1": + version: 1.1.1 + resolution: "array-flatten@npm:1.1.1" + checksum: 9b53b90c6553dac52279cbaeb682db3c8d89dfb6ffa82ce08ba3b0333a3e81e9747cc14daaa0e705a3193879dada635b6994b85846cb99d3275d0839bb61ad15 + languageName: node + linkType: hard + +"array-unique@npm:^0.3.2": + version: 0.3.2 + resolution: "array-unique@npm:0.3.2" + checksum: 60b071fa416369effc6bbc98c7d81887afbe5935b5b5e04c1d7aed94936e9be7d9bbe8581e0a4c7068e3f07c6eff10343fa548a2447397be2b25e1c09edc93c2 + languageName: node + linkType: hard + +"asn1@npm:~0.2.3": + version: 0.2.3 + resolution: "asn1@npm:0.2.3" + checksum: 66e4de7c751c9cb4c1fe558a1cc56d99e8d9a2fc513b5ddba77535368c63577bd7ddc7bfebc9ffd2a21342209986cf53efde94a0b19382b25810751da76f6f53 + languageName: node + linkType: hard + +"assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": + version: 1.0.0 + resolution: "assert-plus@npm:1.0.0" + checksum: 0dbcfb92c233e31f58bc2dd4109728e961eef044dc31b8f85f2b7bd2b0435fc32312258de4e7d9ad07d641aef663b3336d071ad2aa31fdf0686848315cc67f26 + languageName: node + linkType: hard + +"assign-symbols@npm:^1.0.0": + version: 1.0.0 + resolution: "assign-symbols@npm:1.0.0" + checksum: e93a5b480879bb30edb517253359e666b4cb6eb8d6f1678faeb63d2dabebcf5e9fc3afc2ff13352efe02672a2e01762fe07c419dca2c7513c28932c753d7a67e + languageName: node + linkType: hard + +"astral-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "astral-regex@npm:1.0.0" + checksum: dcf7d72f1b4ba6d172b14baf663226ee2f44f64a2413947761fc56cbb9fade5ae1bc21c4c1d8e75c9e487d9a6ef9312eb61a70fc902542685a6d41ba9213a726 + languageName: node + linkType: hard + +"async-limiter@npm:~1.0.0": + version: 1.0.0 + resolution: "async-limiter@npm:1.0.0" + checksum: 8cd1136e3c5eb16857d64fe23814fc12060c6970342f450fe455e0d36a7f5bcc301d5795e18102d9689b9967c958ec04b8f318fd6967b4a013bc98a043bb8735 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 9f0abbb2af5ed83007505d1a98e6e6bc63dc8ffaa28288927d978c0d1f7af0a106ae05bac2407078fd147c1001068c0f9a7cc21e94d34b9838f78109c5266948 + languageName: node + linkType: hard + +"atob@npm:^2.1.1": + version: 2.1.1 + resolution: "atob@npm:2.1.1" + bin: + atob: bin/atob.js + checksum: 0113347b5a0101dfedaa625950470e6295e032b4cea2d745d60037fd7c4d1ead1596a73574edbb35c16d4b43ad46e8a7be77ac48d0be5ed3cc8f69c672e96eec + languageName: node + linkType: hard + +"aws-sign2@npm:~0.7.0": + version: 0.7.0 + resolution: "aws-sign2@npm:0.7.0" + checksum: 448068c11ab51c1e797956a72d52a068f5600753e07e90c18a894799744bfd2b161d83e2217162d05ade214579f69624b9a9374c693572e6821fd2d1eea72099 + languageName: node + linkType: hard + +"aws4@npm:^1.6.0": + version: 1.7.0 + resolution: "aws4@npm:1.7.0" + checksum: a7bdb39eaf293c1c1037bb2c728cc73900e0cc1dd38a5ac5be18b963ff0cb614225cedd660c86c4c0f80686abc2393031e7aded70eb803c5943cccaf5822894b + languageName: node + linkType: hard + +"aws4@npm:^1.8.0": + version: 1.9.0 + resolution: "aws4@npm:1.9.0" + checksum: 9e4b33bc571f3b6621088fd33b6912f3ed3e66fbb21fafa9a22a7fae0e1d395bf780bd5d12da59f92ac8782d20b51f689b0477afc9684bd82051f7e5e7e55cd3 + languageName: node + linkType: hard + +"babel-jest@npm:^24.9.0": + version: 24.9.0 + resolution: "babel-jest@npm:24.9.0" + dependencies: + "@jest/transform": ^24.9.0 + "@jest/types": ^24.9.0 + "@types/babel__core": ^7.1.0 + babel-plugin-istanbul: ^5.1.0 + babel-preset-jest: ^24.9.0 + chalk: ^2.4.2 + slash: ^2.0.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 85b677c2e3e3bfb98a92fd7ffbddd25aef6592657db6d85e56abbea8b8df3f68a49607d5a609d50e171b12f5a52fa199a220814da6156e4de3d8e01974ff6318 + languageName: node + linkType: hard + +"babel-plugin-istanbul@npm:^5.1.0": + version: 5.2.0 + resolution: "babel-plugin-istanbul@npm:5.2.0" + dependencies: + "@babel/helper-plugin-utils": ^7.0.0 + find-up: ^3.0.0 + istanbul-lib-instrument: ^3.3.0 + test-exclude: ^5.2.3 + checksum: 8b921825ccbe43220287232b245c04f52d1a96f8e9fbd78574905599752c32253ad3a59926293b6da1629c66cdcb0792aa788179bf2f8a77b26332f3346cdb24 + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^24.9.0": + version: 24.9.0 + resolution: "babel-plugin-jest-hoist@npm:24.9.0" + dependencies: + "@types/babel__traverse": ^7.0.6 + checksum: 8983ab35b584215279846640c35e8c0cdb160a549a630c154b755eb5c5e49ea7b4d93a3b119b54b5c075e38b18c2ce5e180c29956b4157a6102e6ccfb4858d89 + languageName: node + linkType: hard + +"babel-preset-jest@npm:^24.9.0": + version: 24.9.0 + resolution: "babel-preset-jest@npm:24.9.0" + dependencies: + "@babel/plugin-syntax-object-rest-spread": ^7.0.0 + babel-plugin-jest-hoist: ^24.9.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 9c10064aa7d37cd1c22c17991ca56388e77863fb735cfc6c561c42e2cb7fa45c794cac396247537d542defc1ee7cd76de01b565dee75ec86840c98e5febd8045 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.0 + resolution: "balanced-match@npm:1.0.0" + checksum: 6a1a4021cc9cb35182852582ed42470041430842bbc9d3dfad9536fca203281e4bc6316a017a0b876df0acb8d0d83daa22d5c6483108869c0895582525af9f60 + languageName: node + linkType: hard + +"base@npm:^0.11.1": + version: 0.11.2 + resolution: "base@npm:0.11.2" + dependencies: + cache-base: ^1.0.1 + class-utils: ^0.3.5 + component-emitter: ^1.2.1 + define-property: ^1.0.0 + isobject: ^3.0.1 + mixin-deep: ^1.2.0 + pascalcase: ^0.1.1 + checksum: 04bc4d0bed8fda2d7017afd2be4f3aab14c2af740190a47ee29b5faf8f67dc5c168ec509d84da96d23cfc4ee65bcc614897ee51c34e252f3ab34612b5aa7e12a + languageName: node + linkType: hard + +"bcrypt-pbkdf@npm:^1.0.0": + version: 1.0.2 + resolution: "bcrypt-pbkdf@npm:1.0.2" + dependencies: + tweetnacl: ^0.14.3 + checksum: be6f38b9db6df9b023c17d952a02809eec63931c2183e6b3a9b373f971f85f8a1372e3a379d72877f748695d313eaee033fc1b7905448f62d75e4bef3ef175cb + languageName: node + linkType: hard + +"body-parser@npm:1.19.0, body-parser@npm:^1.19.0": + version: 1.19.0 + resolution: "body-parser@npm:1.19.0" + dependencies: + bytes: 3.1.0 + content-type: ~1.0.4 + debug: 2.6.9 + depd: ~1.1.2 + http-errors: 1.7.2 + iconv-lite: 0.4.24 + on-finished: ~2.3.0 + qs: 6.7.0 + raw-body: 2.4.0 + type-is: ~1.6.17 + checksum: ff8b98d8be53b56938ae2e344feae9d5551aa5d6acabeed98c39ef0386a684685d6cfc9a1ca165d0ba9a4b23a20df60546ee4438079da6749d0f77e37abf2fdc + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: 6bf044764309bad6d15c6eabc39e93701643b00192439251afe8b4e0c08f941b840f3c8844b163fc307111459121712fb74e40073ddffb0358f8a640f14ba7b1 + languageName: node + linkType: hard + +"braces@npm:^2.3.1": + version: 2.3.2 + resolution: "braces@npm:2.3.2" + dependencies: + arr-flatten: ^1.1.0 + array-unique: ^0.3.2 + extend-shallow: ^2.0.1 + fill-range: ^4.0.0 + isobject: ^3.0.1 + repeat-element: ^1.1.2 + snapdragon: ^0.8.1 + snapdragon-node: ^2.0.1 + split-string: ^3.0.2 + to-regex: ^3.0.1 + checksum: b18b19131d3688bdfa0f19635560831b7e743ff8acfdae176b038f185771efe848ea32d50b475ec8e8d0e5a1f5fc27907e4ce54a4b765949e4976c055b992958 + languageName: node + linkType: hard + +"browser-process-hrtime@npm:^0.1.2": + version: 0.1.2 + resolution: "browser-process-hrtime@npm:0.1.2" + checksum: 33c1506785f0696511937d907fe4463c9ab1b02e414e4a0135eef9b5c45e410df360b1a629e47fb866ebbec67d2328f87971519d2110c81e8563598e3692ddc3 + languageName: node + linkType: hard + +"browser-resolve@npm:^1.11.3": + version: 1.11.3 + resolution: "browser-resolve@npm:1.11.3" + dependencies: + resolve: 1.1.7 + checksum: ec4489b9d29e0cc616f70c867ff3144e48072bba91a47020a90c404e10decdd7b4e8c374d6739efea52385d10a6ec7439e2d0b3a4a9efcc3647e3d5dea21c958 + languageName: node + linkType: hard + +"bs-logger@npm:0.x": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: 2.x + checksum: 2d64666c84e0792881dbba5b58823630a6a52ea40aad1d36870451197f67e0125656ad114a0f37b48fae786bc16cb5dbfe71343b3d440a08ac9d4b75825fdeb6 + languageName: node + linkType: hard + +"bser@npm:^2.0.0": + version: 2.0.0 + resolution: "bser@npm:2.0.0" + dependencies: + node-int64: ^0.4.0 + checksum: 37f35410b2787a041774ab8a0aac5d34c62ca90dabdcd76dc77fc9e885c0028d8d21321e9612208e58b1003f0df241422eb082b033125b4e4799082293014059 + languageName: node + linkType: hard + +"buffer-from@npm:1.x": + version: 1.1.1 + resolution: "buffer-from@npm:1.1.1" + checksum: b34c802232998fe342f64398c6bfbcd74c7e3d8115513ccc1c932c8ea0e0a205293847bc69be4c32ed9388ca151f635b005019e0bddbd80a5df34da537d722d6 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.0 + resolution: "buffer-from@npm:1.1.0" + checksum: f551b3bf2b07c29a8b773023647ffde8bc35481a76637bde85e8037ea3e3b940651c9a4c779cf926a0be8677d832004cf5b588730d09edbbabe450e6c72b0551 + languageName: node + linkType: hard + +"builtin-modules@npm:^1.0.0": + version: 1.1.1 + resolution: "builtin-modules@npm:1.1.1" + checksum: ea05c1b6f4a8099f7cd5b194ceee2ea9685f7bd04b3b65b7896947c91321573d05140363f4f7ee4cb84ecdbe48daee27510cbf6d25fb0886764f4c3f24f9892b + languageName: node + linkType: hard + +"bytes@npm:3.1.0": + version: 3.1.0 + resolution: "bytes@npm:3.1.0" + checksum: 4810d53e395e3b5d2cd54df0f1b4433ac01670efee10d74785625fa8ca4ce364975f152ad13408c796aa925ccab2a14423bd56c9107837ab4a114853ab988a76 + languageName: node + linkType: hard + +"cache-base@npm:^1.0.1": + version: 1.0.1 + resolution: "cache-base@npm:1.0.1" + dependencies: + collection-visit: ^1.0.0 + component-emitter: ^1.2.1 + get-value: ^2.0.6 + has-value: ^1.0.0 + isobject: ^3.0.1 + set-value: ^2.0.0 + to-object-path: ^0.3.0 + union-value: ^1.0.0 + unset-value: ^1.0.0 + checksum: 7741d2a72d09b805dd072cc6f6b6e8c81dd1d3d838e4b73b6fd9136dc3cb3076bad80c76161da85c8cfe7557816cce6c7bdea9541f977428fecbc91dd4bcee1c + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 539341e948410059e2f8ff927127e718ab58c36026cb84a1b0967defff6d2be0b072a985b75853112016a4f09d94f222d0d9f70e6b622bd2e34e5d9de3f26315 + languageName: node + linkType: hard + +"camelcase@npm:^4.1.0": + version: 4.1.0 + resolution: "camelcase@npm:4.1.0" + checksum: e43e9bf50c4537311e658a0192f5295e6fc0eb8404e42485a1385dbfb735a0e76c899c17b41defda58f7984248ec11e6f92907dda0a5548690747777e5967bfc + languageName: node + linkType: hard + +"camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: 58f271afe62d5396a5a2d28cbbeb3520732763d3c005e295225d48a58408d44575bf92475cd828f597790725f1be43aa08e623b65bdffb5619f16fb402773bb6 + languageName: node + linkType: hard + +"capture-exit@npm:^2.0.0": + version: 2.0.0 + resolution: "capture-exit@npm:2.0.0" + dependencies: + rsvp: ^4.8.4 + checksum: 2ea78cbe02f281ef7058ea86409673181882f036d79c87763acdd05ab23c896dee36688bd73279bd4f4a1beb62854076899527ce75d6d364b840114f277fd50f + languageName: node + linkType: hard + +"caseless@npm:~0.12.0": + version: 0.12.0 + resolution: "caseless@npm:0.12.0" + checksum: 78d62874b145ce0351ebdc76fe77402ef47ac9d94728e896606ffc2da85d049311824219dc671bb9a957eb56dcd223dc785a743da28b2740ca0f966c0ac240dd + languageName: node + linkType: hard + +"chalk@npm:^2.0.0, chalk@npm:^2.0.1": + version: 2.4.1 + resolution: "chalk@npm:2.4.1" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: dd22f497d62524e6bcecf8bf14d58ea425baac24c9c4e97b8d4ffc7f82c463984ce76560a31d00a518e582bcccb61f33e7da27a0cd4aeae7851257ea0d25389e + languageName: node + linkType: hard + +"chalk@npm:^2.3.2, chalk@npm:^2.4.2": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: 06d1d94779a0e08fe03ef15676ae30e973d7269017d3b1e6d06a3bb81e70a3a6b0c26d5743e94b4dfc21a852884306759b8b8c4fe98d72204ed678413beb21f3 + languageName: node + linkType: hard + +"chownr@npm:^1.0.1": + version: 1.0.1 + resolution: "chownr@npm:1.0.1" + checksum: dca3e924c3545916342aa25f30a513b09fbf6d8af527fa23c8265c0ab37c41ab5bd1ac54c38434f90c93bf39162fa352fa05599dc6e51402b874ffc59fd4493d + languageName: node + linkType: hard + +"chownr@npm:^1.1.1": + version: 1.1.3 + resolution: "chownr@npm:1.1.3" + checksum: 384cf62ef219f12f1af1159777163154f68c455405217d94b8e2e107164242884521b5e92d4d8f510fd17f66f5aafaa83f2ed7b0d59be19f3d448d8d05301947 + languageName: node + linkType: hard + +"ci-info@npm:^2.0.0": + version: 2.0.0 + resolution: "ci-info@npm:2.0.0" + checksum: 4926b2dd00eefa64ed6eef3a5a3381c2033418ddca5a6d794c4a0741e15aca5cfd4fa177a0965be54624d2c354b24371daf693fe44b25bb96f54351ad825b1ad + languageName: node + linkType: hard + +"class-utils@npm:^0.3.5": + version: 0.3.6 + resolution: "class-utils@npm:0.3.6" + dependencies: + arr-union: ^3.1.0 + define-property: ^0.2.5 + isobject: ^3.0.0 + static-extend: ^0.1.1 + checksum: 64ced6f5bfc461af7885e222c7522cc6e5674f0d2cac234426227878504439d658d21b6b822e0f32ae2ba097cf0b739f770249a2931bf972560145361548f6e3 + languageName: node + linkType: hard + +"cliui@npm:^5.0.0": + version: 5.0.0 + resolution: "cliui@npm:5.0.0" + dependencies: + string-width: ^3.1.0 + strip-ansi: ^5.2.0 + wrap-ansi: ^5.1.0 + checksum: 53f2f93ae1e7958e85737535759ad05b5b558b21d596c778b7c3728c8bab4ded78938553cf57a8d808b2ea9d0b62009ba2dfadd5ee79c8c08025241a34ce130d + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: 649f1b037fcf998f112fdc642b930da7489f047c0152469d87870b8bb2dd212cdd4e8be7fb9a224f9d0768ac21cbed80f4be7533b5d87b3396205effe857f3a7 + languageName: node + linkType: hard + +"code-point-at@npm:^1.0.0": + version: 1.1.0 + resolution: "code-point-at@npm:1.1.0" + checksum: c0a50074d39d0051356938df5ffd5e2c1cb3e054fc883bfbec32e48a6ee6630db0aa8cc1cc86482b255abefa38140ae72542dd8fa6af8d946a618a17c0e00f55 + languageName: node + linkType: hard + +"collection-visit@npm:^1.0.0": + version: 1.0.0 + resolution: "collection-visit@npm:1.0.0" + dependencies: + map-visit: ^1.0.0 + object-visit: ^1.0.0 + checksum: bd3d2403b77ce9649ba7fe7d3ca6d29bce88b752577979f9b617e8a175a5adc7a14091dcb223d595c50eb720bc8679ec196fe45ab92efd1145303795aff65cf1 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.2 + resolution: "color-convert@npm:1.9.2" + dependencies: + color-name: 1.1.1 + checksum: 2aa8059bcb575f76a6f531dc2747503cc33c1e60bf35e330a79a01870528ac9bca29b196064ea93235bf393de6bbf2f0d364389b8f1154f68d6c428f6680aa7e + languageName: node + linkType: hard + +"color-name@npm:1.1.1": + version: 1.1.1 + resolution: "color-name@npm:1.1.1" + checksum: 61fd6f458058b721428b61d13643e61bb273efcbafd616c525c01af4622089720a505ff70cccd8817dc50b826837c9aa662fcdf2399b5b9279b715865a4563bb + languageName: node + linkType: hard + +"combined-stream@npm:1.0.6, combined-stream@npm:~1.0.5, combined-stream@npm:~1.0.6": + version: 1.0.6 + resolution: "combined-stream@npm:1.0.6" + dependencies: + delayed-stream: ~1.0.0 + checksum: d63aa58d716ac75a162fb5a62b22f9a53855b9d6c843fc8f399e34401b72387cc0adcc989eeb8c1a946d161269d095c6c0d11847d8bef42af9b38dba63badb04 + languageName: node + linkType: hard + +"commander@npm:^3.0.2": + version: 3.0.2 + resolution: "commander@npm:3.0.2" + checksum: 27b2dc3de481f3ba2a7aaa2c7efe2da7eea916b4428163aeed2f3251fa5767c8ddb75d7afdce7c2112e9b86a1ee2ff1a306ed879d72bb0c90f25b362a388c241 + languageName: node + linkType: hard + +"commander@npm:~2.20.3": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: eae98d97c0a3a59096be01418e7d882978bbc0c9b8921db75e9907a738dd764ecca833950a883fa1a81d9149e7492bc65af0adaef17f5b112558c176089062bd + languageName: node + linkType: hard + +"comment-json@npm:^2.2.0": + version: 2.2.0 + resolution: "comment-json@npm:2.2.0" + dependencies: + core-util-is: ^1.0.2 + esprima: ^4.0.1 + has-own-prop: ^2.0.0 + repeat-string: ^1.6.1 + checksum: 4934f6efb43c18ec0adc6d0a9ed535a2ac1360c2f3b53c1af677c9e87ee9ef5841d3ebc85600aad760e4097e9762718a716a423a3db54019b6ccd547719bddd7 + languageName: node + linkType: hard + +"component-emitter@npm:^1.2.1": + version: 1.2.1 + resolution: "component-emitter@npm:1.2.1" + checksum: 4eb98f78857663d7cb4ac99dd8c8d9c614b82a287845eb4a15b60fa479680627f6075cb7ff5236db2ac7514ba1ce82f7f2fdf16831dad13a37a69e1444f74c8d + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: b295d07d6ac4f0e3fe511fce7ac74c5f6583e67bace249c32c6b2baa44b2c6220c7c177c9e44954485f37b7e7ec6a6a231447b62137d0fb56b44a7e871ac33e3 + languageName: node + linkType: hard + +"concat-stream@npm:1.6.2": + version: 1.6.2 + resolution: "concat-stream@npm:1.6.2" + dependencies: + buffer-from: ^1.0.0 + inherits: ^2.0.3 + readable-stream: ^2.2.2 + typedarray: ^0.0.6 + checksum: d25429841f1c12fd08f2ce4e2d3faec4682bfce9a16650fac1beb462899491bb453c2625885e0c6a626e316e63fea005fa6029ee52fda12ff8abeb606db44552 + languageName: node + linkType: hard + +"console-control-strings@npm:^1.0.0, console-control-strings@npm:~1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 7a3fee932f3d7bfa3b3d465c81dea0a7e20c682b092d27e0726d6a1025f88f8a6111e6a44589ca9e17a8e5f24bea3dae3c7423d432739bd0a6488e5134a9e06f + languageName: node + linkType: hard + +"content-disposition@npm:0.5.3": + version: 0.5.3 + resolution: "content-disposition@npm:0.5.3" + dependencies: + safe-buffer: 5.1.2 + checksum: 51df49e7899d9fba77f2ffe3a81f23eb8217d65e6f42d9ce2d1ad8bb2b56ae6d2a43d3d4ba670f4714ede4593f4ceed3c632943b6ea70a88b6f6d82498473a05 + languageName: node + linkType: hard + +"content-type@npm:~1.0.4": + version: 1.0.4 + resolution: "content-type@npm:1.0.4" + checksum: 05fb930c707de87506e0fcbce8f0fcb3f3e34e67abce3c7720959499488895245c9e743607ed382244ca8a6190f970ab43d081cdae28553a8e7cf56e3f8e3fd9 + languageName: node + linkType: hard + +"convert-source-map@npm:^1.4.0": + version: 1.5.1 + resolution: "convert-source-map@npm:1.5.1" + checksum: 3a454c91c779a1ab42569cc2a185ff6408212ceb0cb5f2904e502be23a277122a1cafd98bae83d89688fdc07ee0f9c9013ba6cb931360bd11500d9f32f7ea948 + languageName: node + linkType: hard + +"convert-source-map@npm:^1.7.0": + version: 1.7.0 + resolution: "convert-source-map@npm:1.7.0" + dependencies: + safe-buffer: ~5.1.1 + checksum: 50c6138f75db8a63d5bdbdfa56ffa632179d02944c7c6c7e8b37f8ce9bacabc5f2999cadf76baea3a8ed2225f3cd780b6eb772d8601fb81ebc0130862d130f89 + languageName: node + linkType: hard + +"cookie-signature@npm:1.0.6": + version: 1.0.6 + resolution: "cookie-signature@npm:1.0.6" + checksum: ff2caf141b4e894ac0c48150b43a90582c6bcf27219a66f0da1cddfd751fe978a051343700a28a36f9801a944651227fc1e7baf15a7e1b3b92d6b68e0d951c0b + languageName: node + linkType: hard + +"cookie@npm:0.4.0": + version: 0.4.0 + resolution: "cookie@npm:0.4.0" + checksum: 9284243f9ed99cb00d705892f41ce0ae243d06330a82f64eaabf65103448e7508e90d5be737701e4e786e39779672b6ce3a52061da21a6437c3533e89d4db3fd + languageName: node + linkType: hard + +"copy-descriptor@npm:^0.1.0": + version: 0.1.1 + resolution: "copy-descriptor@npm:0.1.1" + checksum: 106a1a6c9c3b09966f1960e1fabd6144911d078a2c1a2f934162e4e390c5ebfe9abbf4cbc9cc850f6541b53e95c4ebf2a36fb759af8ce6fc0eaecf038eecf939 + languageName: node + linkType: hard + +"core-util-is@npm:1.0.2, core-util-is@npm:^1.0.2, core-util-is@npm:~1.0.0": + version: 1.0.2 + resolution: "core-util-is@npm:1.0.2" + checksum: b2aeb723279455a85125383b7067e66d650187adee4151b6587bc28d8334c9d5ebbc6e4bd6c344355191865e1add46fdec83f2a7f4d83889cfe7e586d9fd50b6 + languageName: node + linkType: hard + +"cross-spawn@npm:^6.0.0, cross-spawn@npm:^6.0.5": + version: 6.0.5 + resolution: "cross-spawn@npm:6.0.5" + dependencies: + nice-try: ^1.0.4 + path-key: ^2.0.1 + semver: ^5.5.0 + shebang-command: ^1.2.0 + which: ^1.2.9 + checksum: 5103fd3ec3c3d914d78190d1b7021bcca3f66d1c35008f67a696884a7d8c74a415158110436610abaae044d7351ecf8d71bb66872e88bbd80525b013b5b44256 + languageName: node + linkType: hard + +"cssom@npm:0.3.x, cssom@npm:>= 0.3.2 < 0.4.0": + version: 0.3.4 + resolution: "cssom@npm:0.3.4" + checksum: b760fb62b822dc8e3ad50f0ba3aa3b29ff96587d2279fadc381186b431b2a3bfcde89ee9b4568bb98cea4c3d17eb817f422c71c405866b040af40decb1bf5fa5 + languageName: node + linkType: hard + +"cssstyle@npm:>= 0.3.1 < 0.4.0": + version: 0.3.1 + resolution: "cssstyle@npm:0.3.1" + dependencies: + cssom: 0.3.x + checksum: fd9bd458a7665c42626bde28875635d3a1fc560c2efefd29c0404d1554e121426717a8ae41c759967f28d2937d7f4d966f3061ab7d663e95f6e18a6079382f89 + languageName: node + linkType: hard + +"dashdash@npm:^1.12.0": + version: 1.14.1 + resolution: "dashdash@npm:1.14.1" + dependencies: + assert-plus: ^1.0.0 + checksum: ae1c06eeabf13a791303aeee536bd96b2ef24ecb77cbb69072297b389b91329131b8b7134289fe83bd6eccf6ec674e8d712dd9e8aea1b4aabaf3d46c2fb4db83 + languageName: node + linkType: hard + +"data-urls@npm:^1.0.0": + version: 1.0.0 + resolution: "data-urls@npm:1.0.0" + dependencies: + abab: ^1.0.4 + whatwg-mimetype: ^2.0.0 + whatwg-url: ^6.4.0 + checksum: 58202e9c91695b328196b980efe3bf1402694b1a504483b6c51ab9abdc7d625171787e9f870756652396c2f21b43f4fcd55278bfb3f8074b43e9d6f1671e0b20 + languageName: node + linkType: hard + +"debug@npm:2.6.9, debug@npm:^2.1.2, debug@npm:^2.2.0, debug@npm:^2.3.3": + version: 2.6.9 + resolution: "debug@npm:2.6.9" + dependencies: + ms: 2.0.0 + checksum: 178d6da8132866882a69ee868c68eec1a27297c99a01d8afc72d4b9d8f4fea709bd29c6746be72b2466b2f7d2c29fd95f0b89a3f940df6ca22edc9edad0e804f + languageName: node + linkType: hard + +"debug@npm:^3.1.0": + version: 3.1.0 + resolution: "debug@npm:3.1.0" + dependencies: + ms: 2.0.0 + checksum: 31ac62be845b3e2bc49ea566665749e58030123e6d0b2960cb7c730037dc825f46d012e3f63f43fc9d60de3c52edbce705d22cb7e571e2822c81bc5d5ae09da9 + languageName: node + linkType: hard + +"debug@npm:^4.1.0, debug@npm:^4.1.1": + version: 4.1.1 + resolution: "debug@npm:4.1.1" + dependencies: + ms: ^2.1.1 + checksum: e3bfa1544ced80ac5764aa313530150af442e5ce53f91090f00e3aff33a8b535ce60a7502d1451b3cbc2b9cd6994b3a08a38fbd3ff7a2ec801ad79d8b457b8e8 + languageName: node + linkType: hard + +"decamelize@npm:^1.2.0": + version: 1.2.0 + resolution: "decamelize@npm:1.2.0" + checksum: b4f9874e4777db39289cfe0d34d079df9531b10b50290ec8443e342faa840abbd1e7003ea0d735e03ea143d0bb34151afcb3711e7bc02fdcf19fe002683699ba + languageName: node + linkType: hard + +"decode-uri-component@npm:^0.2.0": + version: 0.2.0 + resolution: "decode-uri-component@npm:0.2.0" + checksum: 4ec60208b36c39b72e4e4a203cdcca54641d61ef0588b2cb96732a5f51421ac10a3cd5497ec0ec146164ff0963af2f21f01207194d31af3e95a591581f1660e5 + languageName: node + linkType: hard + +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: aaaa1df6d11d65480f056a07a2c1277fa9dddb4be35bd4e941a0bf4bb72c81f89465300423783b1bcde6b82b7995cc148b5ba025eefd90019d027dd88fbef30e + languageName: node + linkType: hard + +"deep-is@npm:~0.1.3": + version: 0.1.3 + resolution: "deep-is@npm:0.1.3" + checksum: e677b684c98c351eccf9fdc863e9bbac626cab9343ce4088f1a43e5290ab5f74be393c7d62b7560ce156fbdc08a6cfc6ffb0ed2dd5929d58cee6957b5c7bbb4e + languageName: node + linkType: hard + +"define-properties@npm:^1.1.2": + version: 1.1.2 + resolution: "define-properties@npm:1.1.2" + dependencies: + foreach: ^2.0.5 + object-keys: ^1.0.8 + checksum: 598d8c2709cbc43087593de9f6c766fd17bccdfb9ad8d2a1954f1789ccd5a78cdfac0c9f5c1d70aa2fb64319ac9a8abba19ae652d575fe44d34e077fd124928a + languageName: node + linkType: hard + +"define-property@npm:^0.2.5": + version: 0.2.5 + resolution: "define-property@npm:0.2.5" + dependencies: + is-descriptor: ^0.1.0 + checksum: 7e7ef9f792173f2354117e8da18165ad486af44d33835b9eff9a53566223fa34f77a34e2bedefbc6c6be95c7ad1ee0bdaf5b90b6b206416719ea5378c0e1861a + languageName: node + linkType: hard + +"define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "define-property@npm:1.0.0" + dependencies: + is-descriptor: ^1.0.0 + checksum: fe3e39e9c8a0447e52f4b9d16ce61f0378625c191809fd153f77bd58744e19c92e6682331b0a684709312898d6f72ce2b2ad4643b0cbe7e54125abfd9d7c72ee + languageName: node + linkType: hard + +"define-property@npm:^2.0.2": + version: 2.0.2 + resolution: "define-property@npm:2.0.2" + dependencies: + is-descriptor: ^1.0.2 + isobject: ^3.0.1 + checksum: 4b0c53a97eb6db90432fb06b9764a78ad9de46d74838b8948ed1e9ff067a1baa491a2fb52042234cbc5783a79fc871ad5eb752bdf61422b14bb2089a28a55364 + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 859d2824377d82c7e9b182da9c3799753d7271b223f83c141adca59674ae1df4b3215d7b9faa7555f943772f75c4ab98895e2ecba43ff904338d9208535f9af6 + languageName: node + linkType: hard + +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: 66086ba7ccb4ca82f3318d8af33cd283265cefa758a5d9385ec3fd5ce5ebed55ec7db662ab15955a7a9ecedaa9e6c2ccabeb88efae1a3c7d30cf2659b2a5c0a1 + languageName: node + linkType: hard + +"depd@npm:~1.1.2": + version: 1.1.2 + resolution: "depd@npm:1.1.2" + checksum: 02a96eee42732cecda70432be01f7ac92cca924c73b9ad5c0c6c2e06883fcf4d3b92755c753c94e7530cfa33069a23e870194828d7da11fc7652f33bf79de00b + languageName: node + linkType: hard + +"destroy@npm:~1.0.4": + version: 1.0.4 + resolution: "destroy@npm:1.0.4" + checksum: bc2f61513204e5c7fbc5b7780c626292f165a2481773a143075c8544e9150b6a46ef507cde3515e78ba22a62acf73894d1d6a894e0352bc059a6d644a141a2f0 + languageName: node + linkType: hard + +"detect-libc@npm:^1.0.2": + version: 1.0.3 + resolution: "detect-libc@npm:1.0.3" + bin: + detect-libc: ./bin/detect-libc.js + checksum: c1f0d9ae0ac0f0b558ffee547a51dc4de58e154e2a68faf1fa3c8a20dc37741b2a339a9fcc0c0601e70afa6640b45008561e9d3adbc79fa357a388b76ca44cf6 + languageName: node + linkType: hard + +"detect-newline@npm:^2.1.0": + version: 2.1.0 + resolution: "detect-newline@npm:2.1.0" + checksum: 0cf56fcaeb2b88f4b5f2b6d8884416d1d784e02fca6665b494d69a58e52ee2aee3e64d535bf88e3281013f4be953f999237ae35cda79c14e5f5f4c378dd9233c + languageName: node + linkType: hard + +"diff-sequences@npm:^24.9.0": + version: 24.9.0 + resolution: "diff-sequences@npm:24.9.0" + checksum: 30499a611e33fc33f1ce67434681bfb201a63a9be804b8302f9f541f5e0bd23a8409a671be479525f644a9fb7ac2d9e3936050e6b5a8cdbd786b3274c24ee200 + languageName: node + linkType: hard + +"domexception@npm:^1.0.0": + version: 1.0.1 + resolution: "domexception@npm:1.0.1" + dependencies: + webidl-conversions: ^4.0.2 + checksum: 35fc7371f3f615c3253d99094edd954d701a0121ee3a01ea75f70025f76ed005c1f482b8d37f8caa3016881fa5d5e979a92a2914269a5b67db103bdfffb6b4e8 + languageName: node + linkType: hard + +"ecc-jsbn@npm:~0.1.1": + version: 0.1.1 + resolution: "ecc-jsbn@npm:0.1.1" + dependencies: + jsbn: ~0.1.0 + checksum: 2b8574c4f6f26cc7491978a523aa9c6f54c3e92fa14e988e3ff2f0c9a5e66075022213ece96ad7d35f9d87de34dc2986a7ae4958afdc11abbda111f1744179e6 + languageName: node + linkType: hard + +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: ea8cace46f8e217451f3ec571b2fac3b12cc0361a4ce82342df8b0fcff60501da08214af0f249e3c6792f0a375091d4a565ea7b84705e3c1f51fc65113240f6a + languageName: node + linkType: hard + +"emoji-regex@npm:^7.0.1": + version: 7.0.3 + resolution: "emoji-regex@npm:7.0.3" + checksum: b0fd6fa82f291d60c4841e9ca6812a55ce44ceb8540e42a7641a989f4d8fa0d879de7033eaadbb725d92b9163e97a41fea657498dcf4ca97ea6d70df107ce9c0 + languageName: node + linkType: hard + +"encodeurl@npm:~1.0.2": + version: 1.0.2 + resolution: "encodeurl@npm:1.0.2" + checksum: 56e6d3ef00224b1880060739447a9c2de2424850be0b9d63d4491d037449512fe252c24fcb287ada50be9079fa627d1795ec6ea2ce8946b4772f837ac3573df8 + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: ^1.4.0 + checksum: a25dcd0d559363e7c63cce300e4224473fc5f8bf8d363c0b81c6b61b4773358463bac99dfd0b7146e79ebce591cd92fd608720325436cd3b6b31eacc9e9e859b + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.0 + resolution: "env-paths@npm:2.2.0" + checksum: b22caac2bc407553693721afd769fc15a5ab59ff7707b3797b9885dcdd3814497d6e9b3a97cc09178a4d0fbad407cae6cc4ca3eaba7d2d0b31a832528ec1460e + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: ^0.2.1 + checksum: 5bd07df02c20deee8adf70e535f3e95ff5ce8da2af3fce68a7e9f4a2fc0ad7610112a4f4bf012a4b5edd18c008f59a7acceeca1f7a47ac6ab7fef376a0f05d1d + languageName: node + linkType: hard + +"es-abstract@npm:^1.5.1": + version: 1.12.0 + resolution: "es-abstract@npm:1.12.0" + dependencies: + es-to-primitive: ^1.1.1 + function-bind: ^1.1.1 + has: ^1.0.1 + is-callable: ^1.1.3 + is-regex: ^1.0.4 + checksum: db418fd8b8fa1bbf9d5a4a3da544d74268bc321be145a8352fd2e680d213e67633b3853c5166016f781c02c921551037f15d32424b504c460f506e0110d14b98 + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "es-to-primitive@npm:1.1.1" + dependencies: + is-callable: ^1.1.1 + is-date-object: ^1.0.1 + is-symbol: ^1.0.1 + checksum: 375c3e874609f5f75e1bde25d231f007dfba8766b6822afbb8ca5af2fa8ff8813146ed1d1b089cb1ec5b68d3ec52c222db82c9f5feeab6e95970cd0cb411c4d0 + languageName: node + linkType: hard + +"es6-promise@npm:^4.0.3": + version: 4.2.4 + resolution: "es6-promise@npm:4.2.4" + checksum: 6326943d661ceb066120ebfb1104c7b805a5e941f5fb6e11e034a7bd4ac85aa1093000e73938c01cb060364a1de3adaf5ed5eb4644db5ccd9141e49f204f2171 + languageName: node + linkType: hard + +"es6-promisify@npm:^5.0.0": + version: 5.0.0 + resolution: "es6-promisify@npm:5.0.0" + dependencies: + es6-promise: ^4.0.3 + checksum: 29b695ea7003688c7908fcb5cdeb80c83667c89bce8f99889f193e82876339e4356384feeac58b72df686284de528751b0e8cea2bc26ccac009def1a3ba9b489 + languageName: node + linkType: hard + +"escape-html@npm:~1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: baa5a2fc8fdf3e2c3e586a687fc2fc6fe070a04cc6cc340fd4cae45fd664b8e7e147a3be7f6cbe353949ea10c71b016683c2c87c2a6c1f99f765ffd059feaec9 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 31da9adff9694f7b63c0542462267656e1d4dcac66a91551781d1ad2554d6641685ff812acc717cd467676af57be458a466d34b086e900354b38dde8724c8046 + languageName: node + linkType: hard + +"escodegen@npm:^1.9.0": + version: 1.11.0 + resolution: "escodegen@npm:1.11.0" + dependencies: + esprima: ^3.1.3 + estraverse: ^4.2.0 + esutils: ^2.0.2 + optionator: ^0.8.1 + source-map: ~0.6.1 + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: ./bin/escodegen.js + esgenerate: ./bin/esgenerate.js + checksum: 536d5c8b663512fa5b1fa3ad49e7bc377ca81c9e1c15871dd2685dd60a7a4e13ca351a0445c1ab8f102b75deb434dcb017e8b167ff370bba74e67875c8dcc46c + languageName: node + linkType: hard + +"esprima@npm:^3.1.3": + version: 3.1.3 + resolution: "esprima@npm:3.1.3" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 7ab0169dbf2d3cced9c9f0784c501cab11be8442b810a841db423b6f93735d0e6e5e1908b92c540735aa40ef38b52583ae33b17f4953ba52233e153fcf91d759 + languageName: node + linkType: hard + +"esprima@npm:^4.0.1": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: a9bec67e9a3dfccc29a2d54c65a3210129668b3eeae7fe296145bc564c963c4d1d7be101dd13fbe65000414ac07f35bd2f85ac9d3254016e5a2f3aa13d18caf1 + languageName: node + linkType: hard + +"estraverse@npm:^4.2.0": + version: 4.2.0 + resolution: "estraverse@npm:4.2.0" + checksum: c23ff71edfceaf2ea1af37fd312b558d85cfa418e755d752a65a6646e07c55067b26f093464383af2294783b45d05ee2068f7f2aab439145f96ea6a9bd01d464 + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.2 + resolution: "esutils@npm:2.0.2" + checksum: afd56f051c1cad291e2f96104eb77e6af6e130843aeac4f4b3fa208450dca53c4fec9f5920f3b140cad24a7a84737e55d9bfc3350370d0dddb70ea710046a313 + languageName: node + linkType: hard + +"etag@npm:~1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: ec7760ce28ccbdc8cfe3bdba5902fb924359a9c018a5549d36cad7a343af849dc42fc513e59c80bcb73a3cb3509df98ac570415292d35c7fbb494a90181a85ce + languageName: node + linkType: hard + +"exec-sh@npm:^0.3.2": + version: 0.3.2 + resolution: "exec-sh@npm:0.3.2" + checksum: 1fe34ac81782e80979cf4494f2182696be5825050fb23ce0df510dfb3427bea4e3d8455d6064d7a38d96b42a340fe76baeae483fa8032c363aa01e9dad3ef9dc + languageName: node + linkType: hard + +"execa@npm:^1.0.0": + version: 1.0.0 + resolution: "execa@npm:1.0.0" + dependencies: + cross-spawn: ^6.0.0 + get-stream: ^4.0.0 + is-stream: ^1.1.0 + npm-run-path: ^2.0.0 + p-finally: ^1.0.0 + signal-exit: ^3.0.0 + strip-eof: ^1.0.0 + checksum: 4c8005b1192433dd9cb42c0b2e3d616d8f5def85f38906bb644b8468c44824b5f2f8b265661e2f6ed7ba87cb7ae2e6aa66a96ae5093d8feca99fa51ac30b3783 + languageName: node + linkType: hard + +"exit@npm:^0.1.2": + version: 0.1.2 + resolution: "exit@npm:0.1.2" + checksum: 78b113ca759a78d7add77a88fb0fe4f4a4cddd3e58b01e043dee4afa91fb71035d65ccdb8a708e35c5f903bcff8087f73263f1d5ce599823a1e01f7a1f02f28b + languageName: node + linkType: hard + +"expand-brackets@npm:^2.1.4": + version: 2.1.4 + resolution: "expand-brackets@npm:2.1.4" + dependencies: + debug: ^2.3.3 + define-property: ^0.2.5 + extend-shallow: ^2.0.1 + posix-character-classes: ^0.1.0 + regex-not: ^1.0.0 + snapdragon: ^0.8.1 + to-regex: ^3.0.1 + checksum: e402bd749579ab4f6d4c5b533411eb6d61de8907fe51d5740ba2ca095f9e62a72a579b459029b0f1da855886c2ca576421d1b9dc9810a00ade5d81dfe658668f + languageName: node + linkType: hard + +"expect@npm:^24.9.0": + version: 24.9.0 + resolution: "expect@npm:24.9.0" + dependencies: + "@jest/types": ^24.9.0 + ansi-styles: ^3.2.0 + jest-get-type: ^24.9.0 + jest-matcher-utils: ^24.9.0 + jest-message-util: ^24.9.0 + jest-regex-util: ^24.9.0 + checksum: 9c7f201674719a6c6f443834d03be1e33cc016e69879edfd2c90c6201baf85d7a1d4b9d8ad6621bcee2db4b137e5151bfa9cb8e6e1192e0ad7bb6556a81d91ec + languageName: node + linkType: hard + +"express@npm:^4.17.1": + version: 4.17.1 + resolution: "express@npm:4.17.1" + dependencies: + accepts: ~1.3.7 + array-flatten: 1.1.1 + body-parser: 1.19.0 + content-disposition: 0.5.3 + content-type: ~1.0.4 + cookie: 0.4.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: ~1.1.2 + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + etag: ~1.8.1 + finalhandler: ~1.1.2 + fresh: 0.5.2 + merge-descriptors: 1.0.1 + methods: ~1.1.2 + on-finished: ~2.3.0 + parseurl: ~1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: ~2.0.5 + qs: 6.7.0 + range-parser: ~1.2.1 + safe-buffer: 5.1.2 + send: 0.17.1 + serve-static: 1.14.1 + setprototypeof: 1.1.1 + statuses: ~1.5.0 + type-is: ~1.6.18 + utils-merge: 1.0.1 + vary: ~1.1.2 + checksum: 7d2ff8102b24f52483a3b576f9fb3f48a477d302be26ecb0ced7857458d9029c806370106567f437647a9477a444dbfdfafb5c7d9e2198eb8fe07b8edb6fedf7 + languageName: node + linkType: hard + +"extend-shallow@npm:^2.0.1": + version: 2.0.1 + resolution: "extend-shallow@npm:2.0.1" + dependencies: + is-extendable: ^0.1.0 + checksum: 4a30733bec7ca5cb035fe3c0c1a663f32d4a2336eb67398b81bfa4513fd53a3f23e2420d2775b691af0841259f5f6b8a444459d12ab803be1672042d3da035a5 + languageName: node + linkType: hard + +"extend-shallow@npm:^3.0.0, extend-shallow@npm:^3.0.2": + version: 3.0.2 + resolution: "extend-shallow@npm:3.0.2" + dependencies: + assign-symbols: ^1.0.0 + is-extendable: ^1.0.1 + checksum: 7d4f16a69ec8be0f02f1f97cc1c3c3da0b286e39be34b793de87de8f6fec2f8dd606826bf47314ae8ecbb1bc80d3467bbd6c49e2a8f956b9dbcf505f421e9bf1 + languageName: node + linkType: hard + +"extend@npm:~3.0.1": + version: 3.0.1 + resolution: "extend@npm:3.0.1" + checksum: bd5e5eba694e86bd646f34f675b4afef7037a211427ee8e3f51c3366a29d4000bcd46ce34fe5aed4bf94fe003f57c7fb990eb3893d92c4abac128946a568bbc3 + languageName: node + linkType: hard + +"extend@npm:~3.0.2": + version: 3.0.2 + resolution: "extend@npm:3.0.2" + checksum: 3df56be8d20d6a282e712c3c6aa4548ccdddd2dcfacc96a79ef23529c3b5d267e995cdb285aac2ed6d65bd556dc71ee8fef1c01d1fca9ef148fd9e5d1ecbb924 + languageName: node + linkType: hard + +"extglob@npm:^2.0.4": + version: 2.0.4 + resolution: "extglob@npm:2.0.4" + dependencies: + array-unique: ^0.3.2 + define-property: ^1.0.0 + expand-brackets: ^2.1.4 + extend-shallow: ^2.0.1 + fragment-cache: ^0.2.1 + regex-not: ^1.0.0 + snapdragon: ^0.8.1 + to-regex: ^3.0.1 + checksum: a9d90329ac64ba5b5fee4c879384802a1011b4c9cf7df01c4b0cb618ccf224f781c5f037f676187737f6cc136ef5b90045069456b67159e7b8ce8b4e48c9f6f1 + languageName: node + linkType: hard + +"extract-zip@npm:^1.6.6": + version: 1.6.7 + resolution: "extract-zip@npm:1.6.7" + dependencies: + concat-stream: 1.6.2 + debug: 2.6.9 + mkdirp: 0.5.1 + yauzl: 2.4.1 + bin: + extract-zip: cli.js + checksum: d6fc6beb0cbe594a75f0a78f3a450ce37bcda571dda6fc3584f23d7871afa6a9a7eaaf677991d6230f56fcea107fadffdcf0fc5f0baadcad211c6d1f392e57a2 + languageName: node + linkType: hard + +"extsprintf@npm:1.3.0": + version: 1.3.0 + resolution: "extsprintf@npm:1.3.0" + checksum: 8cf20d3044b6333076eacb7b134fa56586273e9d47ad4fa3e396ce0b6f79d575c32212c579db2de1c1991c02b58f71ad269cfdffdbd193fa040b0bfff233955f + languageName: node + linkType: hard + +"extsprintf@npm:^1.2.0": + version: 1.4.0 + resolution: "extsprintf@npm:1.4.0" + checksum: 5ce016ed485f47f742ac65cc26a49fd2a05515beec3f860baaf1e201cf26c1f15e3a97847c19ce82a926d820ec21a3356c7190b64fb74c42ac7dabc879a47a3e + languageName: node + linkType: hard + +"fast-deep-equal@npm:^1.0.0": + version: 1.1.0 + resolution: "fast-deep-equal@npm:1.1.0" + checksum: f27b2257fd7f8670e976c620399475f0f923297a9e0f3405a2ae48464d3736252d5ca097473cc15fbc167c305eea9b79858312a101e0618a67a16a6442d04136 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^2.0.1": + version: 2.0.1 + resolution: "fast-deep-equal@npm:2.0.1" + checksum: 3edf36d062e80f50c0ec797af0d4bea0961f7a8c3964108518d1dfe8150bb1e3488ed8642ca1b7b633abfebe8bae27b12db1ffada5ef9689d382a1f6a54375e2 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0": + version: 2.0.0 + resolution: "fast-json-stable-stringify@npm:2.0.0" + checksum: cd22848b7072f690a6d37af85ecafcb55d7324386e8383e8a4c4a68a6f63c551a791616d8f63caddeb287a07ed855067120ef894df9f7ce8e1d32ee2a00016c9 + languageName: node + linkType: hard + +"fast-levenshtein@npm:~2.0.4": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 1b86a0643f2b1023cff80f933f88cc479dee4d7c138a71d980f72ca6810ec0b9173651e52292054db1e2b4bd879a16b3507f04d92a408b469900a1b825734cd2 + languageName: node + linkType: hard + +"fb-watchman@npm:^2.0.0": + version: 2.0.0 + resolution: "fb-watchman@npm:2.0.0" + dependencies: + bser: ^2.0.0 + checksum: 958d60b0aba5007378a658209013ff4337cd82ad073675d53c142bf6b377760d28f5b2b19a6ee891721cf230d86d9793732e1fe07dd9be2fa0986feda841b942 + languageName: node + linkType: hard + +"fd-slicer@npm:~1.0.1": + version: 1.0.1 + resolution: "fd-slicer@npm:1.0.1" + dependencies: + pend: ~1.2.0 + checksum: 3efdda7979e6dfcfba63d742a379650c1fde77361ef81b2f35fe8d09c75fc16ad0c369832dd941bc8070090f204eb3922a1588d1b766fcaec240661fc52face5 + languageName: node + linkType: hard + +"figures@npm:^2.0.0": + version: 2.0.0 + resolution: "figures@npm:2.0.0" + dependencies: + escape-string-regexp: ^1.0.5 + checksum: dd246b0e0f38ccd191f8aca2e923844a8c8157433eb863ca0dad12cba6f8ff59bdc6a3f15875aa2c8a684e221ff83d65982e095c3e00cad12986a5c0f59ea324 + languageName: node + linkType: hard + +"fill-range@npm:^4.0.0": + version: 4.0.0 + resolution: "fill-range@npm:4.0.0" + dependencies: + extend-shallow: ^2.0.1 + is-number: ^3.0.0 + repeat-string: ^1.6.1 + to-regex-range: ^2.1.0 + checksum: 414bcb708149d97df21b0ee5d2726f3c1c83b408dcd4d4fde0d57dad1be3940b9698733ad44ee04e811a7a31ed2d7dda5fd1f8ab55e88bc3a9ad92dad5785c3a + languageName: node + linkType: hard + +"finalhandler@npm:~1.1.2": + version: 1.1.2 + resolution: "finalhandler@npm:1.1.2" + dependencies: + debug: 2.6.9 + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + on-finished: ~2.3.0 + parseurl: ~1.3.3 + statuses: ~1.5.0 + unpipe: ~1.0.0 + checksum: 621e50ccbe8a9f4762ced7658ccf4c669c9b807478e63ade09f962c3ce20617f3775821a3a5db7765e1f5fc16f2265b4a61509adc06193583734f570cb6a5c97 + languageName: node + linkType: hard + +"find-up@npm:^2.0.0": + version: 2.1.0 + resolution: "find-up@npm:2.1.0" + dependencies: + locate-path: ^2.0.0 + checksum: f3c078cf000e01ecd04ee85553939614fb7eb36fea12711234b0aa822440ef09df3a173ba5a86e7c83c3d1a8c50388171a45b48f2ae4c3fa132e0bbae52fd2af + languageName: node + linkType: hard + +"find-up@npm:^3.0.0": + version: 3.0.0 + resolution: "find-up@npm:3.0.0" + dependencies: + locate-path: ^3.0.0 + checksum: a58b85fac6dd65a13f873a2313d955b8d520396122a8b0bc4a5010eb5d6f71036222169b9fa9914d2a62360f6b9943c5c6e0dbf1139d8130230b33785e7b86c2 + languageName: node + linkType: hard + +"for-in@npm:^1.0.2": + version: 1.0.2 + resolution: "for-in@npm:1.0.2" + checksum: f86d3f02a03b8f712d1b31cf060fd996a55efb10dced72a4b602afde6a74ac40f931f6d52419f4aa224867d9b3f16a81c770c87bdbbdbdba070bcf97f407bf8a + languageName: node + linkType: hard + +"foreach@npm:^2.0.5": + version: 2.0.5 + resolution: "foreach@npm:2.0.5" + checksum: 2628d36c6009868029821e61694d1fa458583c20742e0b13c4da6c79a5521405e1b5765e9d176d84c390b6a58700011032ac20ee2f5f2fe1d6b9aa9fe120ab57 + languageName: node + linkType: hard + +"forever-agent@npm:~0.6.1": + version: 0.6.1 + resolution: "forever-agent@npm:0.6.1" + checksum: c93124c19389fc884c5caa376c76789789a9f7d94a6079214abfc87a2b49c2b6388e3bc2214b8f1442f1e92ca574cc48f7dd6b9a52bb199f3cec75fd5ff59f7f + languageName: node + linkType: hard + +"form-data@npm:~2.3.1, form-data@npm:~2.3.2": + version: 2.3.2 + resolution: "form-data@npm:2.3.2" + dependencies: + asynckit: ^0.4.0 + combined-stream: 1.0.6 + mime-types: ^2.1.12 + checksum: 9d502d95e3f6880bf4b9f61f546e9ed347dfd326e238b493829eef725c186daba1472d8a286a29da6b8e9ced71bda7452db46e798e8a148d10f04c515d4fa671 + languageName: node + linkType: hard + +"forwarded@npm:~0.1.2": + version: 0.1.2 + resolution: "forwarded@npm:0.1.2" + checksum: 96e556b8855c8ef4bff21c5471fb12294fba6d3c665aad4b62cede291d985f739e7eeb4605d46db0dac6fa181349a997d2be8e17995ba9dd86d5dc7f7a818e5f + languageName: node + linkType: hard + +"fragment-cache@npm:^0.2.1": + version: 0.2.1 + resolution: "fragment-cache@npm:0.2.1" + dependencies: + map-cache: ^0.2.2 + checksum: 71b91de43146892ca788e54f5ee3dd6e6cf512cc8e68b382e0f99708dbfc5825f0a7d564f6f0be5c3a60139df4984258f58066ae9dbdb874c9b1bcb38225a062 + languageName: node + linkType: hard + +"fresh@npm:0.5.2": + version: 0.5.2 + resolution: "fresh@npm:0.5.2" + checksum: ab13a40ed77036d504386d01d350b94d82e134f286fddd2d7f7267a98ecdc5873fa8ff53c4aad9c86bfcfbd74a8b5f32f2648120dd75d0c335662eca9cb9ad5b + languageName: node + linkType: hard + +"fs-minipass@npm:^1.2.5": + version: 1.2.5 + resolution: "fs-minipass@npm:1.2.5" + dependencies: + minipass: ^2.2.1 + checksum: 2a785d9800882e03e57a50a65e4d9a66a35c5cb6c64f30183a03ff819c9edbfac2f55a3c1f3a9f0aa35d9b054e7347e3d159f980bd0442eeefc509c6519e0064 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 7838256cafb93ee7a40754e7fdcae9c6e57b12528e22ae51a10bc6161ad6a647931dd99aa95ddf3a4ce8501766f78e57a56ed010043dddf8dddb4ad5af616acb + languageName: node + linkType: hard + +"fsevents@npm:^1.2.7": + version: 1.2.9 + resolution: "fsevents@npm:1.2.9" + dependencies: + nan: ^2.12.1 + node-pre-gyp: ^0.12.0 + checksum: ef553a8fe83b2870c53b2670454829c71329477684c7d0de4ef87702d880b27dcfbac8f9a4be83d00a8e07d3ce73ee2c5f892f45121c65d16afce3c6a21d8b9f + languageName: node + linkType: hard + +"function-bind@npm:^1.1.1": + version: 1.1.1 + resolution: "function-bind@npm:1.1.1" + checksum: 6ed0e3f90e8eab9d2a32f526fddd51020a23ad48d6c3806583b0c6e9dd97fbd0736a11bc0d75ee59e32979f149b3ac3c7a8608540968ed3f87d7ef8799c54602 + languageName: node + linkType: hard + +"gauge@npm:~2.7.3": + version: 2.7.4 + resolution: "gauge@npm:2.7.4" + dependencies: + aproba: ^1.0.3 + console-control-strings: ^1.0.0 + has-unicode: ^2.0.0 + object-assign: ^4.1.0 + signal-exit: ^3.0.0 + string-width: ^1.0.1 + strip-ansi: ^3.0.1 + wide-align: ^1.1.0 + checksum: 0e97d66257a39635753778e4788e05423cb5b47fbb3ae3b4523d13c71bb13701a442a58efd826a597bb7993b0f97efcbd98c59458a6e9e58c34ea7f66e4cc01e + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.1": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: 34fbf61ee9adc7504115743a19829427885d5d5713bd31c86f3a5839362925e3b579d61cf3e30250fad9ed16d02d957d8dfc0a13f7111f5b1f763d35c6f0a1a8 + languageName: node + linkType: hard + +"get-stream@npm:^4.0.0": + version: 4.1.0 + resolution: "get-stream@npm:4.1.0" + dependencies: + pump: ^3.0.0 + checksum: e3ff150d54d0e0052f7d85f9be060182cb2b3313721ca757af0f90e4399bdd80992727245b4e731bc5edbb4f67a51a3489ab7ad9ebb0b3560ce1d925985151e8 + languageName: node + linkType: hard + +"get-value@npm:^2.0.3, get-value@npm:^2.0.6": + version: 2.0.6 + resolution: "get-value@npm:2.0.6" + checksum: 18f2d276ef06e98a1dcd906eb1483b1614c4e10d98ea25cea381c0f1c577e982d4c55cdcbe0be0787e535d65144d768774b085ca724665487f90030390dff14a + languageName: node + linkType: hard + +"getpass@npm:^0.1.1": + version: 0.1.7 + resolution: "getpass@npm:0.1.7" + dependencies: + assert-plus: ^1.0.0 + checksum: dc1d4184d1b3ea565b2f223542615bd2c16905563827172e2ca9a0e2e0dcc1173407b0523ca15dbd53bf8b75b4485a1815ccb0bfeb4668e1d2520899cb5c57f5 + languageName: node + linkType: hard + +"glob@npm:^7.0.5, glob@npm:^7.1.1, glob@npm:^7.1.2": + version: 7.1.2 + resolution: "glob@npm:7.1.2" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.0.4 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: bf81b3315c7dbb49354721674ef75e4f6de4ae01fe971e1dcce8866cc60224f97029f787c12067d524254aa5ef5baafdd19d7f0812fd15d6ef4a0478418c8a39 + languageName: node + linkType: hard + +"glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.1.6 + resolution: "glob@npm:7.1.6" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.0.4 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 1e4476a9b7a81eec0bcfee78de4c27a40d2bde349eb04a63c58636acf8dc5ad8c68bc47c841bf7de5fde22696b1d2a737ada65e66c2359a0b3195fafc1316814 + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 39e096e838b7a62f864aa523c0bbdcdc835958f3fca657784e067470ef7cf98678b621838d1e0822bb901ab99b52db440051f8ac5c9d5f7136955bf074005abb + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2": + version: 4.1.11 + resolution: "graceful-fs@npm:4.1.11" + checksum: 717d0ded30babd9480a05b85014d6b24f30f6531d460f283463db95b80ccd3ef437fe34c61287ce7bc02a27c8746306b164e5e5855b06e065d6fc4ad8e59ea2a + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.2.2": + version: 4.2.3 + resolution: "graceful-fs@npm:4.2.3" + checksum: ed0570de762f98ddeaff67a54375d9869eda6ac5fd0c55e1783ce13fbf8ed3c6f1243bc459a7c848d20a916e20985c0c80a544f18a2a9a14ab8dee4a77285fcd + languageName: node + linkType: hard + +"growly@npm:^1.3.0": + version: 1.3.0 + resolution: "growly@npm:1.3.0" + checksum: 0d5b9d86c437f48b24f245f63dfc3d157a917759d48eb28d806341751fcc913588dc2ece1d96af153241e628fb40694efd5e9c0cbe9f704c8af4bc35ba4f5e96 + languageName: node + linkType: hard + +"handlebars@npm:^4.1.2": + version: 4.5.1 + resolution: "handlebars@npm:4.5.1" + dependencies: + neo-async: ^2.6.0 + optimist: ^0.6.1 + source-map: ^0.6.1 + uglify-js: ^3.1.4 + dependenciesMeta: + uglify-js: + optional: true + bin: + handlebars: bin/handlebars + checksum: 85a11058b99a5edc5a96ce7f70c649f227e8ba92c0f9b2da752a531e860c26ca7ee48be7b71b3297dce948fb8c0095330565cb99956dfd3fcd8a35d0f750ef71 + languageName: node + linkType: hard + +"har-schema@npm:^2.0.0": + version: 2.0.0 + resolution: "har-schema@npm:2.0.0" + checksum: dc922e19113c0d52351adb6307e9971e5ff82cae901ac09e6a8000dde7bf5da736c936e05ddfe1a53811a0e4f702efc71aeb8dcd4d8f1a3bda6ccff77b86288e + languageName: node + linkType: hard + +"har-validator@npm:~5.0.3": + version: 5.0.3 + resolution: "har-validator@npm:5.0.3" + dependencies: + ajv: ^5.1.0 + har-schema: ^2.0.0 + checksum: 1dad5aff50b4dcf2a096cbd7bb186cbb1accd6c236a1a08d3f4aa15c6071b16589e574b464a5604a099be6bf5ada64bbdedd2350c8747b0e8edc35d748e6e9b4 + languageName: node + linkType: hard + +"har-validator@npm:~5.1.0": + version: 5.1.3 + resolution: "har-validator@npm:5.1.3" + dependencies: + ajv: ^6.5.5 + har-schema: ^2.0.0 + checksum: 048be5641c1cacfa8e72084e042d198e2f34ef4eca3d61ac3612402b45f6983c3d2d01ea16beb0d37902bd3d6310ffaa0b5f3c9b7b1219601252e1467bf09f28 + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: c69624d2a38d77d4d715b40932cd55635426d75c7c0e72a609a67b4d251905517ca6d1ff6f69ee3b0cfa95a39b31e25af9e3fe04f46b092699ea5f26371d14ab + languageName: node + linkType: hard + +"has-own-prop@npm:^2.0.0": + version: 2.0.0 + resolution: "has-own-prop@npm:2.0.0" + checksum: 4827d2a15aec3cc55742eab2703a57fde43f962f4e29086413e43e326885727a38422c020a050cd2ac485918127669cda7372bc64acabd1c3b09922e9aa8f8d2 + languageName: node + linkType: hard + +"has-unicode@npm:^2.0.0": + version: 2.0.1 + resolution: "has-unicode@npm:2.0.1" + checksum: 5ffb744ca53591cd4a4c79ac2673ba0481dbcaf5ab1dfbab584a048a6333089ff702b02d606cdb11f776748e3062b018f31b9be136ee3368568f1413262d4b58 + languageName: node + linkType: hard + +"has-value@npm:^0.3.1": + version: 0.3.1 + resolution: "has-value@npm:0.3.1" + dependencies: + get-value: ^2.0.3 + has-values: ^0.1.4 + isobject: ^2.0.0 + checksum: 510d22e36a30f325c1f24b50ce194565864502ddd45cfcc5043138305f6c4bdb9b6371e37d924d4fae4ff7174b576fb1a840d7b577d46ba6efaad810e8484f79 + languageName: node + linkType: hard + +"has-value@npm:^1.0.0": + version: 1.0.0 + resolution: "has-value@npm:1.0.0" + dependencies: + get-value: ^2.0.6 + has-values: ^1.0.0 + isobject: ^3.0.0 + checksum: 024341432f0da45d990332ee4bea98e1c5cc905a1b40c8d70b66615fd68ced0ef5e9fb74737eae566201e2e0a38ad2dfcfa3feed23de8d6fec8dc51d6b119390 + languageName: node + linkType: hard + +"has-values@npm:^0.1.4": + version: 0.1.4 + resolution: "has-values@npm:0.1.4" + checksum: 318f1bbda20f8198f274984f25a2b39fdece406627442a00e8ebe207120b5759fed484675c645754c778bc575b6d2e04cf9963390ad6bb72b2d671fd826cf930 + languageName: node + linkType: hard + +"has-values@npm:^1.0.0": + version: 1.0.0 + resolution: "has-values@npm:1.0.0" + dependencies: + is-number: ^3.0.0 + kind-of: ^4.0.0 + checksum: 465b90970deecc8ac8fff77de5eff1c2b2acbbcf6fb501a0fe605999301a0ffae47cecc6f74dba7717ef23b8bf97c0ed088693fb55600b77306f9f54e21f499f + languageName: node + linkType: hard + +"has@npm:^1.0.1": + version: 1.0.3 + resolution: "has@npm:1.0.3" + dependencies: + function-bind: ^1.1.1 + checksum: 88e52bdec13edd789d27e483cb710f2b11b18f7c03c9f5431d2cef49d8a4f499e182f00fc95e3fc240ea63e89805fac1d6e04a8270e83c14d6ef4ef7b5dd1f78 + languageName: node + linkType: hard + +"hosted-git-info@npm:^2.1.4": + version: 2.7.1 + resolution: "hosted-git-info@npm:2.7.1" + checksum: 7a3992d0ee4f7903588ad63b235000eb835491ae56b81b4ee4fc206d95149a6d9f996b3784f22c1aaca97192be521c340d7d2e550e190567d05c6f3c1a88a83c + languageName: node + linkType: hard + +"html-encoding-sniffer@npm:^1.0.2": + version: 1.0.2 + resolution: "html-encoding-sniffer@npm:1.0.2" + dependencies: + whatwg-encoding: ^1.0.1 + checksum: c6e558ddcb137be638dde5e44ebde8019b08e4d8792899d95d29a1e77a8f0540f706b0de940c4c1a715374fb50a95cda144d0354790d2cf08c31bfbf9d1e9425 + languageName: node + linkType: hard + +"http-errors@npm:1.7.2": + version: 1.7.2 + resolution: "http-errors@npm:1.7.2" + dependencies: + depd: ~1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.1 + statuses: ">= 1.5.0 < 2" + toidentifier: 1.0.0 + checksum: ee01a7035c20060e8c03021da6e788e33dcb49e253d552746a416dc0cb5ad8d755b10688b2fe8073fa9972d9bfe28b772fc016d012172468d82f797802e8b203 + languageName: node + linkType: hard + +"http-errors@npm:~1.7.2": + version: 1.7.3 + resolution: "http-errors@npm:1.7.3" + dependencies: + depd: ~1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: ">= 1.5.0 < 2" + toidentifier: 1.0.0 + checksum: b5a969ae98de61bf5a5a51574390b6f1d8d623dbcb2bfc0ec5adb585a1babd134e9e3752aff235153e1efe972162b0dc2846533c68a62ced91c6d6c9b69f2db4 + languageName: node + linkType: hard + +"http-signature@npm:~1.2.0": + version: 1.2.0 + resolution: "http-signature@npm:1.2.0" + dependencies: + assert-plus: ^1.0.0 + jsprim: ^1.2.2 + sshpk: ^1.7.0 + checksum: c04e17a347d732bfaa4ddc22dacba181475cc378dfbb1cd0ac9f911d38ee9d693370dc119082c1a9789871e7c114bbb5317abb1da3391bee02ae26e4adcadaad + languageName: node + linkType: hard + +"https-proxy-agent@npm:^3.0.0": + version: 3.0.1 + resolution: "https-proxy-agent@npm:3.0.1" + dependencies: + agent-base: ^4.3.0 + debug: ^3.1.0 + checksum: dbd4091db0110f23b92123070dc6abc525952459aab4674d7dad1cbb98fa8da5f3f9d9a0e76aea0b24f65a4802bf4f2136fe226880331d3b9546778cf406702f + languageName: node + linkType: hard + +"iconv-lite@npm:0.4.19": + version: 0.4.19 + resolution: "iconv-lite@npm:0.4.19" + checksum: c08e0bfbc07205f128ad3a833b73ecd199f10a7d61d45eba7b5d7d9dba992f5631004c589c83c4d85da7ad18fe6f24add560377c5c211942ac0f2ba55b718677 + languageName: node + linkType: hard + +"iconv-lite@npm:0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: ">= 2.1.2 < 3" + checksum: c6a428001a93cc0b3680fed2301685f9a136df1a48b5bd06093d11005460c76c96b2ff7a7dc46444c24da6a64620a0c8297ae2ae4012a32fa31408c9411b8179 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.4.4": + version: 0.4.23 + resolution: "iconv-lite@npm:0.4.23" + dependencies: + safer-buffer: ">= 2.1.2 < 3" + checksum: 38d63f4e5382d1d075392efc9c864ea2f4e92511f6e3b36c404801d047566eebd17066f161f85ae67ed58289cfeed76863cf06aa40b677379587612f2ebfd780 + languageName: node + linkType: hard + +"ignore-walk@npm:^3.0.1": + version: 3.0.1 + resolution: "ignore-walk@npm:3.0.1" + dependencies: + minimatch: ^3.0.4 + checksum: 958ae968ca9e534d973f89cc58291bcc9184d4b4b46c2ca1fc151050ff0d93c430fb2e2206f9e5047a6b6fe3dc4f103307bf1f07ddd70d57ab202c63bc6add16 + languageName: node + linkType: hard + +"import-local@npm:^2.0.0": + version: 2.0.0 + resolution: "import-local@npm:2.0.0" + dependencies: + pkg-dir: ^3.0.0 + resolve-cwd: ^2.0.0 + bin: + import-local-fixture: fixtures/cli.js + checksum: d24ce68f1349f8cd4bd4496b787864b9a28827e23cb2879dd4247aac44e690ef2123880f32a54fa692b1bff76a3ea71a6e4365c94426aaace7dafa3ed2bd71b6 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 7c698a208c922ba8b65ee6deb61295bed1a3303615795963ed080d87db3f24ac415cf738fabc0233f7d1f414ba4fc0de7affb20263dfd2484f0706cff4201933 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: ^1.3.0 + wrappy: 1 + checksum: 4ae4f2a43120647487d1650aaecd81044692397040d46d38257c349f142889be56ffb23f599c09dadc4287baeb4f3381e304e7eef111d7c7fec00def06111c4c + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:2.0.3, inherits@npm:^2.0.3, inherits@npm:~2.0.3": + version: 2.0.3 + resolution: "inherits@npm:2.0.3" + checksum: 7e20ced2334a7f9ea37288769037a186377028a52827ef7fd9d6aeed1ee7466357428cd1cba376c517735ad93d15c295e406b3e29ee10729ab04955f45ec489b + languageName: node + linkType: hard + +"inherits@npm:2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: d11734fde3095ce63e83a4be33779c8597b0c95edec3efcadf9a78a9312a520028e25acb2d126656005791550f9f2e17de3ea6abeb026fa24627401e5e174d6c + languageName: node + linkType: hard + +"ini@npm:~1.3.0": + version: 1.3.5 + resolution: "ini@npm:1.3.5" + checksum: 17073c00b99107e03e7592fa8c9aa24894cccf9635162641899191e67c057ad8e42760ccfc0b009de084c82aaa09ccaa455f8275a2cccdd75815da894d9eb9c2 + languageName: node + linkType: hard + +"invariant@npm:^2.2.4": + version: 2.2.4 + resolution: "invariant@npm:2.2.4" + dependencies: + loose-envify: ^1.0.0 + checksum: 9cb7badde97b05daf0a3cc16c162625ca222e806d8763cd8ff2e797db234680db894eb0598452043ad46f63b687710d4be26d3e00634de34d88517051a5e6c6a + languageName: node + linkType: hard + +"ipaddr.js@npm:1.9.0": + version: 1.9.0 + resolution: "ipaddr.js@npm:1.9.0" + checksum: 1e81f673a61764d0411c1c1b919a08dd70b2a5090a6e08acaf42a868dd1717b4fa3a5c958c31512f6e177f12793c563a7c4b2cab21030ff1e32e22df6e29a3db + languageName: node + linkType: hard + +"is-accessor-descriptor@npm:^0.1.6": + version: 0.1.6 + resolution: "is-accessor-descriptor@npm:0.1.6" + dependencies: + kind-of: ^3.0.2 + checksum: 54092f35322a0637f3aa7e273afa0cb2fe4c85048d35e19309fe57bf1c6d7e956e3af696f26a3813f0a2b184f9d63f4c8a215058f340352e9038c5e26e53b7f2 + languageName: node + linkType: hard + +"is-accessor-descriptor@npm:^1.0.0": + version: 1.0.0 + resolution: "is-accessor-descriptor@npm:1.0.0" + dependencies: + kind-of: ^6.0.0 + checksum: af15513d21ea7911ed4edbce320da1502242fb3d78cee7ae42f5b0e19c705c3ead2aed3d206cf8bc5d60ec1ae6a02af83ee14b5ee22155cf5b33c84e50bb5bf5 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: 6a48ba019c21e4f305a8cfb28e898e6908bd97f8868f1529214df1d2c6db2d462df7497e514094c9d90ab04492b675b8e04d63e26b43624cf07bd54ba20fbc34 + languageName: node + linkType: hard + +"is-buffer@npm:^1.1.5": + version: 1.1.6 + resolution: "is-buffer@npm:1.1.6" + checksum: 05a436b42a9b1adae8eb9afc2bff59057926f2de92d166ca24e8d8b56a3dbc4b83658c3417945619a166b69dcf3c0be20309a94d3bab3e12db7b666d134b97c0 + languageName: node + linkType: hard + +"is-builtin-module@npm:^1.0.0": + version: 1.0.0 + resolution: "is-builtin-module@npm:1.0.0" + dependencies: + builtin-modules: ^1.0.0 + checksum: 65c2be7ffbbfd4ee7a05266051702d3fb85efbf4257ce737216bd7fb4f7c18adce42f9f528690f08873528044cac0f5d9c0a4ac8717a99152cc46b854cc7c6b1 + languageName: node + linkType: hard + +"is-callable@npm:^1.1.1, is-callable@npm:^1.1.3": + version: 1.1.4 + resolution: "is-callable@npm:1.1.4" + checksum: fb0c3a5cbc576caa633f42e2218f14da6476d864ddf4013e08726db8467e68293f203961ddf61cda0ac71f2b827788c0a5c7010ab758d378e9061f75671993a9 + languageName: node + linkType: hard + +"is-ci@npm:^2.0.0": + version: 2.0.0 + resolution: "is-ci@npm:2.0.0" + dependencies: + ci-info: ^2.0.0 + bin: + is-ci: bin.js + checksum: bce8367f6f42207c7be46a08550518afc5338bf1efb5f08b72b630ab11ba204ea445f0d5a146bf6ed1a61183d5f293d306106917ddbad045045c22246980df02 + languageName: node + linkType: hard + +"is-data-descriptor@npm:^0.1.4": + version: 0.1.4 + resolution: "is-data-descriptor@npm:0.1.4" + dependencies: + kind-of: ^3.0.2 + checksum: 465b11b46622375059f39869d597f7eac4044623bbac7f7f5b9b1edf0a646f8940a41b173afb5e8bd85725512bfb040729026b1256df4e74dd98e50ffff7ad18 + languageName: node + linkType: hard + +"is-data-descriptor@npm:^1.0.0": + version: 1.0.0 + resolution: "is-data-descriptor@npm:1.0.0" + dependencies: + kind-of: ^6.0.0 + checksum: a0765ff0d9f07343bd68d9ea9636ea5bd2f552410c789fc2cef0e15bac20f5ccb1e23da3871133a9661d3bc1e0d28d9359c0008ef59228d5636ea0291ea1e6dd + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.1": + version: 1.0.1 + resolution: "is-date-object@npm:1.0.1" + checksum: 07087cc96fc5c38aef7e232bb480fea921e9b18a42f22efd6d839852d2a28b62ded1956b9571626c74e7dab7df93269e596f51c25d19835571108b0b178d5938 + languageName: node + linkType: hard + +"is-descriptor@npm:^0.1.0": + version: 0.1.6 + resolution: "is-descriptor@npm:0.1.6" + dependencies: + is-accessor-descriptor: ^0.1.6 + is-data-descriptor: ^0.1.4 + kind-of: ^5.0.0 + checksum: 8728472f7d8754952d305e55ee7f58f4319f8100585a2245f573b81ceb84bb229456b2fe6c6f1d59b37ab4afdcc132753e62696262a024b204ed154a034ead5d + languageName: node + linkType: hard + +"is-descriptor@npm:^1.0.0, is-descriptor@npm:^1.0.2": + version: 1.0.2 + resolution: "is-descriptor@npm:1.0.2" + dependencies: + is-accessor-descriptor: ^1.0.0 + is-data-descriptor: ^1.0.0 + kind-of: ^6.0.2 + checksum: 7859c0cf50b5e5c3f058f5b11b73df1fe586c1b58b795eef28e85bc8adc12ddec24f406c3f55613d1ab5c1fcf592ff33a08f05224393273e664d0f3c58a2a122 + languageName: node + linkType: hard + +"is-extendable@npm:^0.1.0, is-extendable@npm:^0.1.1": + version: 0.1.1 + resolution: "is-extendable@npm:0.1.1" + checksum: 02fd0b864703459bce2a90b2f40c4814222c787bd494d6d0022fd3e93a2860af6c9bdb946158b955cedf29fcbeaf44bbe0b1fe73bcf7ff750531283614381050 + languageName: node + linkType: hard + +"is-extendable@npm:^1.0.1": + version: 1.0.1 + resolution: "is-extendable@npm:1.0.1" + dependencies: + is-plain-object: ^2.0.4 + checksum: b04adac0ce21a8eb9edd73250dadbbb668111a8ce370951339662349fbd5c98352f7aafc68f847dcc037d5f2eea167527c0482e297667ec77faf4fe1413fc737 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^1.0.0": + version: 1.0.0 + resolution: "is-fullwidth-code-point@npm:1.0.0" + dependencies: + number-is-nan: ^1.0.0 + checksum: 7e50f3c2e21617a7dde049a2cfecd22cd85c57f3a05a8a216785c4196926867a6dd85ff6d035cc3f1210853edd01f01a480aa4ce183d73c4cccc1b396e4fbea4 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^2.0.0": + version: 2.0.0 + resolution: "is-fullwidth-code-point@npm:2.0.0" + checksum: ab96662efbb49a1e33dd59bdf1451e913c69bf407daae26e2ad6f64458bcbb1b5d5a91b1d95c690540da00f7183e53d7a0b81b9d494073e85e7bd75410a6f358 + languageName: node + linkType: hard + +"is-generator-fn@npm:^2.0.0": + version: 2.1.0 + resolution: "is-generator-fn@npm:2.1.0" + checksum: f5e9b7455357253b28cc86c4bf4b8c217c3f472052fdbcdafca0fa9717dc4e29596b188bc020a44725701448f263670d0633843383dcd58c6085ef9404254609 + languageName: node + linkType: hard + +"is-number@npm:^3.0.0": + version: 3.0.0 + resolution: "is-number@npm:3.0.0" + dependencies: + kind-of: ^3.0.2 + checksum: d754e19ae5e83091c69a42502ae1157d464f29682dbc79a71583713c7e13dde07ad329e7090cb68257cf4694f628ea92d4bfe86d2cb4039773a8eeacefd48b86 + languageName: node + linkType: hard + +"is-plain-object@npm:^2.0.1, is-plain-object@npm:^2.0.3, is-plain-object@npm:^2.0.4": + version: 2.0.4 + resolution: "is-plain-object@npm:2.0.4" + dependencies: + isobject: ^3.0.1 + checksum: 44c1c20871ca875fef6cf53c1bdafd8f80aedac0d296bb099440956c697e804c40ddd41d2f98e596956ddab2b1ad5eab7c4c42af69d8def951e83d704488c57a + languageName: node + linkType: hard + +"is-regex@npm:^1.0.4": + version: 1.0.4 + resolution: "is-regex@npm:1.0.4" + dependencies: + has: ^1.0.1 + checksum: 64dc136eb4bcdb7e564d34f9ad6f5674adf434a8063b4f24ddd871576cddc8efddf87949389af8294038a4e154832c3ba34f0cb9d30c4bfb00398f9b4888c0ed + languageName: node + linkType: hard + +"is-stream@npm:^1.1.0": + version: 1.1.0 + resolution: "is-stream@npm:1.1.0" + checksum: 0c43bc68eb748e970e6df1163a52ce9ec37bfa4c0161557b4524d640ac414934c74427ae8f49c91f55c7fac807f4407a0eb5c7b24ac0b9e78f203aa706bc4cfa + languageName: node + linkType: hard + +"is-symbol@npm:^1.0.1": + version: 1.0.1 + resolution: "is-symbol@npm:1.0.1" + checksum: 2bc1ca54610a6bc246914b25381ff95da7dbf63f24481d91cb1b5a5f96e5b7188e27413508084564e74dc0c682e2118368b36a01c17faa6796f8e02b20102195 + languageName: node + linkType: hard + +"is-typedarray@npm:~1.0.0": + version: 1.0.0 + resolution: "is-typedarray@npm:1.0.0" + checksum: 781a95df2e18eaa0ddf4cd1ea0aa1b81cbfc9139d19f551cfc90db4d1a555c3d3f907ac8194ed312512c3b87b160fecb5bf453d2226e54d5e63c3757523a05e5 + languageName: node + linkType: hard + +"is-windows@npm:^1.0.2": + version: 1.0.2 + resolution: "is-windows@npm:1.0.2" + checksum: 28e1a475546dbfe580b09f86a88536467b2dd81bf10b51d8b87f486acae83b66d95782483dab794e9884b9abb5a35d4191f4baf472dc0754e01dcabf37257d7f + languageName: node + linkType: hard + +"is-wsl@npm:^1.1.0": + version: 1.1.0 + resolution: "is-wsl@npm:1.1.0" + checksum: b74ad4284411257afed846a6f8e63306720707e04e838ee8422068219864975da093cb1f26d06fc65c706b76aebdc0f5f58bba3a2ec5ac5cc4c886a42e703f2b + languageName: node + linkType: hard + +"isarray@npm:1.0.0, isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: f82bc93a43f4344cbbab83bc40645f211e14ba2e1b696c75de07a6a6a16e6dc2bd45b60be0a4eedff281bbd7ca2de18801687d529470d3583cc39c432a9bd208 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 1f6f7ccf6206a544097e27f04018fbd4fdb45d71eadac305d4b60cc18668d35c970d3c0bfadc4b348dd603d5536496a5634dd5f64792ea5e745c62cbc0ce9730 + languageName: node + linkType: hard + +"isobject@npm:^2.0.0": + version: 2.1.0 + resolution: "isobject@npm:2.1.0" + dependencies: + isarray: 1.0.0 + checksum: 12b7019bcecdebb34c86ed8e15ad0f1da99b2fe703ed00dd98e259e1f74c58ca34c24dcaca26ce68cd34b71828bc098f4eceeceec60cb57803604cd4d1a20398 + languageName: node + linkType: hard + +"isobject@npm:^3.0.0, isobject@npm:^3.0.1": + version: 3.0.1 + resolution: "isobject@npm:3.0.1" + checksum: 68b5690353510167179980d57f1f2dd6f23f41e101d4518a15ddf1880de4a6f61f708dc88a5ef79ba0b0ddfe1ada644df5ff8520ceea0729ccf1b5dd98d514ce + languageName: node + linkType: hard + +"isstream@npm:~0.1.2": + version: 0.1.2 + resolution: "isstream@npm:0.1.2" + checksum: aa7954a14871449e27bbbb5918f773964661b19287a6e6a6dccfba1f3680fb01605d13ac866c4032449fd6e7d307c7456709bb62f4fe6735a4ecfab37c1918c6 + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^2.0.2, istanbul-lib-coverage@npm:^2.0.5": + version: 2.0.5 + resolution: "istanbul-lib-coverage@npm:2.0.5" + checksum: 17ab504beae05a0df1a482fd4e502017f82df2bc7e3462b8eabc9d7b15d0b5ad39f8c399a28eaf70f2b35e0b51ce015f8bf82b72101470efe7c853bd49934a54 + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^3.0.1, istanbul-lib-instrument@npm:^3.3.0": + version: 3.3.0 + resolution: "istanbul-lib-instrument@npm:3.3.0" + dependencies: + "@babel/generator": ^7.4.0 + "@babel/parser": ^7.4.3 + "@babel/template": ^7.4.0 + "@babel/traverse": ^7.4.3 + "@babel/types": ^7.4.0 + istanbul-lib-coverage: ^2.0.5 + semver: ^6.0.0 + checksum: 9dbcdc66f45866d610d5b6499484f023f38e09f78374b6fb6b6753a253560ef208bc93dd420eb61dbc1ae7a31c9f39ad5c7f6ff399fe1404c5213a7dd1fd1f74 + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^2.0.4": + version: 2.0.8 + resolution: "istanbul-lib-report@npm:2.0.8" + dependencies: + istanbul-lib-coverage: ^2.0.5 + make-dir: ^2.1.0 + supports-color: ^6.1.0 + checksum: 4118c9d17be84bdf7644a4548c258a19b0fe8e65afe319676032a661fb14ff748d978fb9b80aa9382abb209787295addd21cb43665494d12859dedd7cef1c412 + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^3.0.1": + version: 3.0.6 + resolution: "istanbul-lib-source-maps@npm:3.0.6" + dependencies: + debug: ^4.1.1 + istanbul-lib-coverage: ^2.0.5 + make-dir: ^2.1.0 + rimraf: ^2.6.3 + source-map: ^0.6.1 + checksum: d4710ce1e1183a26626937d4eac80e7ea58814f27e897190ee3216a5f9b20521b01e55a0ba271c66293abb593e363c5094005a020bb6e7e51cd3be2da0a6997d + languageName: node + linkType: hard + +"istanbul-reports@npm:^2.2.6": + version: 2.2.6 + resolution: "istanbul-reports@npm:2.2.6" + dependencies: + handlebars: ^4.1.2 + checksum: a7dedd802793c3f4b22f98b8dfc47df03ab5886aa71424e0f14f45ca75e23337f403ae99d6b67dcce2dd1a4b3d40342dc09807b122d8ab0fbceb4ea1dbfce583 + languageName: node + linkType: hard + +"jest-changed-files@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-changed-files@npm:24.9.0" + dependencies: + "@jest/types": ^24.9.0 + execa: ^1.0.0 + throat: ^4.0.0 + checksum: 1b9f744761417e6be00c06ef8a792f7467e83f148f6bb17c1320d7f8e07b11c26c00051f5bae999a246f2c3622288cd1bd138dea952495b848f4300053bf9046 + languageName: node + linkType: hard + +"jest-cli@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-cli@npm:24.9.0" + dependencies: + "@jest/core": ^24.9.0 + "@jest/test-result": ^24.9.0 + "@jest/types": ^24.9.0 + chalk: ^2.0.1 + exit: ^0.1.2 + import-local: ^2.0.0 + is-ci: ^2.0.0 + jest-config: ^24.9.0 + jest-util: ^24.9.0 + jest-validate: ^24.9.0 + prompts: ^2.0.1 + realpath-native: ^1.1.0 + yargs: ^13.3.0 + bin: + jest: ./bin/jest.js + checksum: a47b1b9de289d06b62201de9d12e2d450924da99e1dc0c99427769b9e3a1927a8867581e60520590facfad7774bf34b6461d1d1a9ac43492fe0fcca2f402c775 + languageName: node + linkType: hard + +"jest-config@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-config@npm:24.9.0" + dependencies: + "@babel/core": ^7.1.0 + "@jest/test-sequencer": ^24.9.0 + "@jest/types": ^24.9.0 + babel-jest: ^24.9.0 + chalk: ^2.0.1 + glob: ^7.1.1 + jest-environment-jsdom: ^24.9.0 + jest-environment-node: ^24.9.0 + jest-get-type: ^24.9.0 + jest-jasmine2: ^24.9.0 + jest-regex-util: ^24.3.0 + jest-resolve: ^24.9.0 + jest-util: ^24.9.0 + jest-validate: ^24.9.0 + micromatch: ^3.1.10 + pretty-format: ^24.9.0 + realpath-native: ^1.1.0 + checksum: 743acacd2119285c5ec5eae0790d34e4fba31612844db5486ca8a47723435352b2ece786e017c4067f714c326bae7b7fdfb01239c9294693f3398397bf799cef + languageName: node + linkType: hard + +"jest-diff@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-diff@npm:24.9.0" + dependencies: + chalk: ^2.0.1 + diff-sequences: ^24.9.0 + jest-get-type: ^24.9.0 + pretty-format: ^24.9.0 + checksum: 21af26d51986b493ae5962381d5375d93720da8d6521300da633148247f509ec9a5899e397dd8d2990b0e6482757e6be259cc5a670c4aac54259d4f0493ee1b4 + languageName: node + linkType: hard + +"jest-docblock@npm:^24.3.0": + version: 24.9.0 + resolution: "jest-docblock@npm:24.9.0" + dependencies: + detect-newline: ^2.1.0 + checksum: 0e406c06b2b958fba670d91952fa367dcd6ba0f6e177654fe41a764cd6e33f3d6e01c692be4c9328ae1b8f218d9fd2abe8db118c4a624bb12c36aa63af961a4c + languageName: node + linkType: hard + +"jest-each@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-each@npm:24.9.0" + dependencies: + "@jest/types": ^24.9.0 + chalk: ^2.0.1 + jest-get-type: ^24.9.0 + jest-util: ^24.9.0 + pretty-format: ^24.9.0 + checksum: 1fa97a014c089f7ef67d0253ddbeb36bd1bee9a33f2604d3dd7fbc8ac626b8ac79bbd069e3d3bd6f72744b752c4e4f8447b9b161b0f834c4e88778d866b357a7 + languageName: node + linkType: hard + +"jest-environment-jsdom@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-environment-jsdom@npm:24.9.0" + dependencies: + "@jest/environment": ^24.9.0 + "@jest/fake-timers": ^24.9.0 + "@jest/types": ^24.9.0 + jest-mock: ^24.9.0 + jest-util: ^24.9.0 + jsdom: ^11.5.1 + checksum: 49cf4d4383b8ec4638c146ee1cc230152551f24adce3f45f8601cd47d732dd50abf58770f32819e1b1176727b74e0e241cda77cebb3edb497b9d03506821ece5 + languageName: node + linkType: hard + +"jest-environment-node@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-environment-node@npm:24.9.0" + dependencies: + "@jest/environment": ^24.9.0 + "@jest/fake-timers": ^24.9.0 + "@jest/types": ^24.9.0 + jest-mock: ^24.9.0 + jest-util: ^24.9.0 + checksum: 37abf9c2af1b4bd4b4eee03eb985fc7ddea60c556f48128548e865a2b4d617b1c80fb914024e23f4db92d32579911752a56ba24622b49d3b11d8e4496b69ab4f + languageName: node + linkType: hard + +"jest-get-type@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-get-type@npm:24.9.0" + checksum: 08c3eb9be138a9af358c6fbcc28c313ec770f7e165ab4984989027ee8c1a2d0402d347b53ca50bd5653cc69676207becc3d8eba481b74c793dbfc1b887d4f315 + languageName: node + linkType: hard + +"jest-haste-map@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-haste-map@npm:24.9.0" + dependencies: + "@jest/types": ^24.9.0 + anymatch: ^2.0.0 + fb-watchman: ^2.0.0 + fsevents: ^1.2.7 + graceful-fs: ^4.1.15 + invariant: ^2.2.4 + jest-serializer: ^24.9.0 + jest-util: ^24.9.0 + jest-worker: ^24.9.0 + micromatch: ^3.1.10 + sane: ^4.0.3 + walker: ^1.0.7 + dependenciesMeta: + fsevents: + optional: true + checksum: 630589a9b4535f31144cbf7bfd7ffbb67f3b0a9213cd6bb81bb8403504e8ec6e8b0640f8f823a13aa5b89cac04c5e26d944a9c6114ca046a56e71486ee40a19f + languageName: node + linkType: hard + +"jest-jasmine2@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-jasmine2@npm:24.9.0" + dependencies: + "@babel/traverse": ^7.1.0 + "@jest/environment": ^24.9.0 + "@jest/test-result": ^24.9.0 + "@jest/types": ^24.9.0 + chalk: ^2.0.1 + co: ^4.6.0 + expect: ^24.9.0 + is-generator-fn: ^2.0.0 + jest-each: ^24.9.0 + jest-matcher-utils: ^24.9.0 + jest-message-util: ^24.9.0 + jest-runtime: ^24.9.0 + jest-snapshot: ^24.9.0 + jest-util: ^24.9.0 + pretty-format: ^24.9.0 + throat: ^4.0.0 + checksum: ff62b459c2510ea99276f7027388ec0cce7569fc4837b22a3a461ab7f5a66afa6d13750b28ed49307340a66abc7521d0ae7592ee0aa42c5576c687f20d3bfaa5 + languageName: node + linkType: hard + +"jest-leak-detector@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-leak-detector@npm:24.9.0" + dependencies: + jest-get-type: ^24.9.0 + pretty-format: ^24.9.0 + checksum: a5de4eb5614a8b811126b54fa9a4ab78fc7c240f233acbf855a9eca5db6a8e7997eed10d415e485b46daec33c89e64c6f34972f7625e4add4ab75396d2c3fe3d + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-matcher-utils@npm:24.9.0" + dependencies: + chalk: ^2.0.1 + jest-diff: ^24.9.0 + jest-get-type: ^24.9.0 + pretty-format: ^24.9.0 + checksum: 228cf96fefa838bc9d4d902d025e14d7094e4ddade7411df8342e53782ab16a9e3be382a7188fe967696a51155128a6c96a6ba03d049b77985d18e4dc7b45ce4 + languageName: node + linkType: hard + +"jest-message-util@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-message-util@npm:24.9.0" + dependencies: + "@babel/code-frame": ^7.0.0 + "@jest/test-result": ^24.9.0 + "@jest/types": ^24.9.0 + "@types/stack-utils": ^1.0.1 + chalk: ^2.0.1 + micromatch: ^3.1.10 + slash: ^2.0.0 + stack-utils: ^1.0.1 + checksum: 5855a9bc6a99ecc2f92f5c03d7479664e931f1827100e80f6784423cfdfbb7bbf216f1fa3866bbe950cb8b54f0f377ff135cb38d2ded69f76fc52e8d93e397ff + languageName: node + linkType: hard + +"jest-mock@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-mock@npm:24.9.0" + dependencies: + "@jest/types": ^24.9.0 + checksum: 5b02abb8834e4775027ccfdfec9bf49d54a0b7647ba91eafc816637506a1867e7f42265fb212f40ab810dba4bcd7f9dd640d11c3c4abae9f1d390bfed9256ecf + languageName: node + linkType: hard + +"jest-pnp-resolver@npm:^1.2.1": + version: 1.2.1 + resolution: "jest-pnp-resolver@npm:1.2.1" + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + checksum: 90496f987a68010a5461bec1670e0484e8beafbba9c4e7c8038a831a1710ade6d2093d0eb7a4bc40b1b25d1c1e5f1e7b02202e17f3d6ded8ff07aaa6767073bc + languageName: node + linkType: hard + +"jest-regex-util@npm:^24.3.0, jest-regex-util@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-regex-util@npm:24.9.0" + checksum: 32217c010ef7d958d767bdce92c91d4f2dd8cd0dd9eed143af489771fb88cbe1a6fe55239a0f0f93bf471e494e3ca799fe654c30f80a74ba34a11f890e860956 + languageName: node + linkType: hard + +"jest-resolve-dependencies@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-resolve-dependencies@npm:24.9.0" + dependencies: + "@jest/types": ^24.9.0 + jest-regex-util: ^24.3.0 + jest-snapshot: ^24.9.0 + checksum: 6fcac31f4cd14ae8c8402314dfc95fb6b3e1a309fa909ef1627d54dbe904b02a0ba495a2147797e396becf976838c9e1cc0eb309d4345491dfbceabb829b8d6b + languageName: node + linkType: hard + +"jest-resolve@npm:24.9.0, jest-resolve@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-resolve@npm:24.9.0" + dependencies: + "@jest/types": ^24.9.0 + browser-resolve: ^1.11.3 + chalk: ^2.0.1 + jest-pnp-resolver: ^1.2.1 + realpath-native: ^1.1.0 + checksum: 27d3849649dde604c5aacca4b0fbb75f2d5236fd8c5d03be9116de779e25afec0439f5aeb9ad6ed302329f51319047d36756c1ed3fdca99a67a7b94420941a55 + languageName: node + linkType: hard + +"jest-runner@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-runner@npm:24.9.0" + dependencies: + "@jest/console": ^24.7.1 + "@jest/environment": ^24.9.0 + "@jest/test-result": ^24.9.0 + "@jest/types": ^24.9.0 + chalk: ^2.4.2 + exit: ^0.1.2 + graceful-fs: ^4.1.15 + jest-config: ^24.9.0 + jest-docblock: ^24.3.0 + jest-haste-map: ^24.9.0 + jest-jasmine2: ^24.9.0 + jest-leak-detector: ^24.9.0 + jest-message-util: ^24.9.0 + jest-resolve: ^24.9.0 + jest-runtime: ^24.9.0 + jest-util: ^24.9.0 + jest-worker: ^24.6.0 + source-map-support: ^0.5.6 + throat: ^4.0.0 + checksum: 7eaacf3e2871b14a045b3b51807a2b3da67c5de1b89728992c0ded87b9d47ff9df734842478ffd14e4ba4ab43bf2843ee2464c903d4587c19cd9557000fd0f28 + languageName: node + linkType: hard + +"jest-runtime@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-runtime@npm:24.9.0" + dependencies: + "@jest/console": ^24.7.1 + "@jest/environment": ^24.9.0 + "@jest/source-map": ^24.3.0 + "@jest/transform": ^24.9.0 + "@jest/types": ^24.9.0 + "@types/yargs": ^13.0.0 + chalk: ^2.0.1 + exit: ^0.1.2 + glob: ^7.1.3 + graceful-fs: ^4.1.15 + jest-config: ^24.9.0 + jest-haste-map: ^24.9.0 + jest-message-util: ^24.9.0 + jest-mock: ^24.9.0 + jest-regex-util: ^24.3.0 + jest-resolve: ^24.9.0 + jest-snapshot: ^24.9.0 + jest-util: ^24.9.0 + jest-validate: ^24.9.0 + realpath-native: ^1.1.0 + slash: ^2.0.0 + strip-bom: ^3.0.0 + yargs: ^13.3.0 + bin: + jest-runtime: ./bin/jest-runtime.js + checksum: 4e3e10057f20aa2a876e08a583d5d21dd618cedb773ac1af64fa06cc9abfb4a758b85e941927f423a6dce9785f7cacc186d1204efe4cc6b3519ddb948f7f08cf + languageName: node + linkType: hard + +"jest-serializer@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-serializer@npm:24.9.0" + checksum: fbb4fb399826c7b3d5f00d6549d06523ce4af589b7c34e17d70f13753dc87f185726c30120db56902c555f00c6d37fc9b0e7f833f7183c6bf7a3aa68e317964d + languageName: node + linkType: hard + +"jest-snapshot@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-snapshot@npm:24.9.0" + dependencies: + "@babel/types": ^7.0.0 + "@jest/types": ^24.9.0 + chalk: ^2.0.1 + expect: ^24.9.0 + jest-diff: ^24.9.0 + jest-get-type: ^24.9.0 + jest-matcher-utils: ^24.9.0 + jest-message-util: ^24.9.0 + jest-resolve: ^24.9.0 + mkdirp: ^0.5.1 + natural-compare: ^1.4.0 + pretty-format: ^24.9.0 + semver: ^6.2.0 + checksum: a9b9b34194c1a1dc10eee92ecc4bca89449079a5fea0e3a74dd34f9c17aa407004752be49712c7ec83079a7879de6845bbc3e262f79676e76ad24b0f685930f4 + languageName: node + linkType: hard + +"jest-util@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-util@npm:24.9.0" + dependencies: + "@jest/console": ^24.9.0 + "@jest/fake-timers": ^24.9.0 + "@jest/source-map": ^24.9.0 + "@jest/test-result": ^24.9.0 + "@jest/types": ^24.9.0 + callsites: ^3.0.0 + chalk: ^2.0.1 + graceful-fs: ^4.1.15 + is-ci: ^2.0.0 + mkdirp: ^0.5.1 + slash: ^2.0.0 + source-map: ^0.6.0 + checksum: 016df01ea79385ff9a81825b32bb63e025dda9690637bb065590a01f1cc12f076d4ff0405b68eded5da99c04b2a296dbaecba4b60726e0e065c40aab1564aaa7 + languageName: node + linkType: hard + +"jest-validate@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-validate@npm:24.9.0" + dependencies: + "@jest/types": ^24.9.0 + camelcase: ^5.3.1 + chalk: ^2.0.1 + jest-get-type: ^24.9.0 + leven: ^3.1.0 + pretty-format: ^24.9.0 + checksum: 1062244bbf9a1bbdf1e987f5e68d904337ad9d3d41bd479ff740b844804eafb32aa3ec6d25ca20d24f97b159be186370afd4b8d7fdd42f2c9f5b73d0720c403e + languageName: node + linkType: hard + +"jest-watcher@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-watcher@npm:24.9.0" + dependencies: + "@jest/test-result": ^24.9.0 + "@jest/types": ^24.9.0 + "@types/yargs": ^13.0.0 + ansi-escapes: ^3.0.0 + chalk: ^2.0.1 + jest-util: ^24.9.0 + string-length: ^2.0.0 + checksum: 9026c0746246185043b7655c2a70266e74ca02f4a31c334cd5ce1a825a613ada9027dfc7ceafd991acad76856aa582d636db67eba1783f9be8dc6ab83bfb6173 + languageName: node + linkType: hard + +"jest-worker@npm:^24.6.0, jest-worker@npm:^24.9.0": + version: 24.9.0 + resolution: "jest-worker@npm:24.9.0" + dependencies: + merge-stream: ^2.0.0 + supports-color: ^6.1.0 + checksum: 8e009c4a77a4e3cfdc7e2268940034de31948560dc6e9514cd40e417120f7043823e0dab5202c8125cfcfe1814ba4fb769e419be23bd73d53e61cf945e36838b + languageName: node + linkType: hard + +"jest@npm:^24.9.0": + version: 24.9.0 + resolution: "jest@npm:24.9.0" + dependencies: + import-local: ^2.0.0 + jest-cli: ^24.9.0 + bin: + jest: ./bin/jest.js + checksum: 7627bb82070ea116008cab807b77d25b088057e008a02f1ba1bdeb32b5e6bd02ecb66dd9afd43772bc859ee4d169afc24a0bd75f3973b6929598ef3f49642f31 + languageName: node + linkType: hard + +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: b6b6b65a47500e55103e5ed962133b9c999dd14f00c49494b109e0379482d030ae0db629b870af4f9023991b21a3055749653fb836736f9c2a76046399e8d84a + languageName: node + linkType: hard + +"jsbn@npm:~0.1.0": + version: 0.1.1 + resolution: "jsbn@npm:0.1.1" + checksum: 0a485f89e5bd9ffa84ed65e1d840c3398a0d3eeecd1211ceca545050298a5dc1c0cfe9f2d0d779785b583cb6c3b3cff50d7a89e407cbcad29b474e7a2cf6ac1e + languageName: node + linkType: hard + +"jsdom@npm:^11.5.1": + version: 11.11.0 + resolution: "jsdom@npm:11.11.0" + dependencies: + abab: ^1.0.4 + acorn: ^5.3.0 + acorn-globals: ^4.1.0 + array-equal: ^1.0.0 + cssom: ">= 0.3.2 < 0.4.0" + cssstyle: ">= 0.3.1 < 0.4.0" + data-urls: ^1.0.0 + domexception: ^1.0.0 + escodegen: ^1.9.0 + html-encoding-sniffer: ^1.0.2 + left-pad: ^1.2.0 + nwsapi: ^2.0.0 + parse5: 4.0.0 + pn: ^1.1.0 + request: ^2.83.0 + request-promise-native: ^1.0.5 + sax: ^1.2.4 + symbol-tree: ^3.2.2 + tough-cookie: ^2.3.3 + w3c-hr-time: ^1.0.1 + webidl-conversions: ^4.0.2 + whatwg-encoding: ^1.0.3 + whatwg-mimetype: ^2.1.0 + whatwg-url: ^6.4.1 + ws: ^4.0.0 + xml-name-validator: ^3.0.0 + checksum: c24c73720915b408785cbc287fd3ca89d232558395a0cc1389324bb60fe6a82dc3ec10140219f5c07ba774bff8f55fabf27ac51b45153bce052408a47311fb52 + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 31b1e167e4a82a088ac3d20f85470213c1479ad38fca09716c09ffdc4cfb04f977f715b15e7c5dfd6191d9414699beffb076a3d80c347eed320808b8a9fe390a + languageName: node + linkType: hard + +"json-parse-better-errors@npm:^1.0.1": + version: 1.0.2 + resolution: "json-parse-better-errors@npm:1.0.2" + checksum: 7f5a35dfe844b8b5a4fb03e6c1838e6678d6b2c30e65746d73ca4c58ed7d3a9e3a77b83be7c6df56193606a654eb5b6e808ea594ee62a2db3985ef1a89aee7e3 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.3.0": + version: 0.3.1 + resolution: "json-schema-traverse@npm:0.3.1" + checksum: 6328efa882e32439d72c0230ae946467fd00a98740c121c3b0e396e8b38eee1c728e0c781a72780964e27651683999efa04bb126f51c1c083838e30a24b8e1c2 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 511768bce007e0e4f505c08f94f2c59f8aeabc9e6f0f187e7e1838ff445b022d05107a6aaac62dee3e2e6a6b2265e23a0b625255a98700f88c104ad4b97e525d + languageName: node + linkType: hard + +"json-schema@npm:0.2.3": + version: 0.2.3 + resolution: "json-schema@npm:0.2.3" + checksum: 33b4fdb870fb86d6882791b59892535a2466573a156c4649cfeff4d07a8c59bd9fb54d46609567cad88c0de60a46276d0d469bcde45fabc20c166c7bb3bc04b9 + languageName: node + linkType: hard + +"json-stringify-safe@npm:~5.0.1": + version: 5.0.1 + resolution: "json-stringify-safe@npm:5.0.1" + checksum: b3d9281f42e16fab884eaa6294cba891730f38e1e64049d3bfd41057878b52d53a0be309ff8a4968c30efc5065585b7c9cabdc05336d7d277866f4b28241a924 + languageName: node + linkType: hard + +"json5@npm:2.x, json5@npm:^2.1.0": + version: 2.1.1 + resolution: "json5@npm:2.1.1" + dependencies: + minimist: ^1.2.0 + bin: + json5: lib/cli.js + checksum: d590aca587972744a44f1d6a544b5308b1b529da41fb59cacd99f8cf9d9e67ae2bc27ee426458c4aa4cfb720674d33ec4093f70eb7393b84fc4c8e0397f9bf42 + languageName: node + linkType: hard + +"jsprim@npm:^1.2.2": + version: 1.4.1 + resolution: "jsprim@npm:1.4.1" + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.2.3 + verror: 1.10.0 + checksum: c4afef21da19a73379df0d906b354b401db318096b0e711cc7927547b8d37788a2f7768c875d5abdfc02613cb3af0d943f4d505b9f2e28fa09d2d0d12851ff53 + languageName: node + linkType: hard + +"kind-of@npm:^3.0.2, kind-of@npm:^3.0.3, kind-of@npm:^3.2.0": + version: 3.2.2 + resolution: "kind-of@npm:3.2.2" + dependencies: + is-buffer: ^1.1.5 + checksum: 035f81eb9a3e060c8216ba56cdf629e7709f75efaf1d0948b496636dd0a02614f11fc3055a11b742ff2e67143c773479bb74b914f75c2940b54439b94b0601ef + languageName: node + linkType: hard + +"kind-of@npm:^4.0.0": + version: 4.0.0 + resolution: "kind-of@npm:4.0.0" + dependencies: + is-buffer: ^1.1.5 + checksum: f01fa5f23755f1fa94cf373977cb3187388fd8228e0039c54fba2753ff8db07299e118cdad4dc6fa54ffb156c395e3e190d21365bb091e22190aa53461d0b11e + languageName: node + linkType: hard + +"kind-of@npm:^5.0.0": + version: 5.1.0 + resolution: "kind-of@npm:5.1.0" + checksum: 70a5ab72fccc0b7ace712872c0889be8998f6d3fddd5c341332294e9622c3a07e9bbfc729fb06bcb4f71035db242a6a8f9d91f106bc2de0575b9b2aa7e6f21f5 + languageName: node + linkType: hard + +"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2": + version: 6.0.2 + resolution: "kind-of@npm:6.0.2" + checksum: a2c059786b6cabb7ebe094122a08d50e95fdedab72ab4df33f822d41653966bb8b034ae450d26d9a21a334ff5f81a0e0955ebe0bbb5e03038e771546fe25d53e + languageName: node + linkType: hard + +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: 83797db35bab5810129108511794dc990c2db9019f053b39895acbe3848d35616024a7d046d7dce34e0ed70af5a7c2fe516b7ff510805329a550054fbc724693 + languageName: node + linkType: hard + +"left-pad@npm:^1.2.0": + version: 1.3.0 + resolution: "left-pad@npm:1.3.0" + checksum: eab17d2302911f0b9f3f90416386a9919f658f1cd50e5224f0e8af61ad98fc854cb444ec5d22128c6f4393c5174804f027fabac178e018f127200850d6b37f1c + languageName: node + linkType: hard + +"leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: 460528b971b6c93cbbdd16082f6174c8ebb7a8f121e26b200b87c26b8be39614a586de0f8950575b08b12e3f6454d4ce42fa3b71285664feea2651e87170e30b + languageName: node + linkType: hard + +"levn@npm:~0.3.0": + version: 0.3.0 + resolution: "levn@npm:0.3.0" + dependencies: + prelude-ls: ~1.1.2 + type-check: ~0.3.2 + checksum: 7f996f3178d5fe11c9501f2955b47951b73ca09f5318caee9ffb66810703c7e84feea777f9a33c1c38e325e9af4596e0bc9c95cf0b3f501ca732e5d562f67292 + languageName: node + linkType: hard + +"load-json-file@npm:^4.0.0": + version: 4.0.0 + resolution: "load-json-file@npm:4.0.0" + dependencies: + graceful-fs: ^4.1.2 + parse-json: ^4.0.0 + pify: ^3.0.0 + strip-bom: ^3.0.0 + checksum: 8bd8362913ca53284a050d7a015f4e294eba8e979a693b9709ef63b1baa69b8bce1453c0eeef05bf44ae3eed165dc6311852a168e5032a9d0ca71bec611847cf + languageName: node + linkType: hard + +"locate-path@npm:^2.0.0": + version: 2.0.0 + resolution: "locate-path@npm:2.0.0" + dependencies: + p-locate: ^2.0.0 + path-exists: ^3.0.0 + checksum: b5a809a7ffd9ac5355424602a4bc3a716b51cfe18a7a656b69bc7c7e722314b5ba6bfc6d1117c6e8856d347b6a0d4b43f54a0c7429e64265331f64ad36ab6a7a + languageName: node + linkType: hard + +"locate-path@npm:^3.0.0": + version: 3.0.0 + resolution: "locate-path@npm:3.0.0" + dependencies: + p-locate: ^3.0.0 + path-exists: ^3.0.0 + checksum: 4f89906f2841b7a2f49842958ac794bb928623dadd07fb857ad63f55afc0133aed754f1d059d881265bd4ca2f6ff89ff77889c290212029f0bc5611a6f1a3dfb + languageName: node + linkType: hard + +"lodash.memoize@npm:4.x": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 75ecd1c58697ed0e1472b4a2ca8dc164af8e57be5c5c0def307758e3854a7988b517cba5c7ea07472005c09cf1694b8a0952a3ee336d58a4985196a791290432 + languageName: node + linkType: hard + +"lodash.sortby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.sortby@npm:4.7.0" + checksum: 64438e6debe410ee3f322caa22f4d8c953753c90b468a047ace001852772ace148595562a0243c087d38573d0dc32b26b31639ce5ec4efd57c7125e99e52dfa6 + languageName: node + linkType: hard + +"lodash@npm:^4.13.1": + version: 4.17.10 + resolution: "lodash@npm:4.17.10" + checksum: b3a096e31efae5429140cd086f45b1f8b67764013879f9dd2bd5670e727bef7939b96d0b0ea5ddb8ac2f169f689f5062d358f357e5c9088e14c287e27a142665 + languageName: node + linkType: hard + +"lodash@npm:^4.17.13": + version: 4.17.15 + resolution: "lodash@npm:4.17.15" + checksum: b018ec8d4c95f14a4b57005a247eca1bc25639322939471a1958d3bc721b4f18e90edb6ea564854593a8bc1f94956a0352cf0cd372991b98c42d61c0cd11e5a3 + languageName: node + linkType: hard + +"loose-envify@npm:^1.0.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: ^3.0.0 || ^4.0.0 + bin: + loose-envify: cli.js + checksum: decbd8d338ba7d1628b11b6c2a6635c799d12236d642c7f1b392683f013bcd7ad0f5a293ef118d3b1a214a8b7fd4e1d1e7d5b04e6eb0afa9f553e1a798dd9616 + languageName: node + linkType: hard + +"make-dir@npm:^2.1.0": + version: 2.1.0 + resolution: "make-dir@npm:2.1.0" + dependencies: + pify: ^4.0.1 + semver: ^5.6.0 + checksum: 424390dad90d43d0d5c127ed2757254b5ad97d57fdebd7a991eb310700b8fd8194cda2112b56071dd48e165e04b5457caf2da30bc05a3597fbdbf87c5c898029 + languageName: node + linkType: hard + +"make-dir@npm:^3.0.0": + version: 3.0.0 + resolution: "make-dir@npm:3.0.0" + dependencies: + semver: ^6.0.0 + checksum: 089579ddb85ede1affe2b172ed9dc4fde1a22b5135f63f0da47e983a00f743472efefa1d19c06eee515e1c9b9f81a86f9a89c9e334129a3e22a55bb799ebc0f0 + languageName: node + linkType: hard + +"make-error@npm:1.x": + version: 1.3.5 + resolution: "make-error@npm:1.3.5" + checksum: 93393c8e18caf7e82314636039d07a3541c73bfd5ddb6534f355c618927c8d0d000655981a773988deec14f7af95abe92c3654b880d9d1998abbe2ead4241d2c + languageName: node + linkType: hard + +"makeerror@npm:1.0.x": + version: 1.0.11 + resolution: "makeerror@npm:1.0.11" + dependencies: + tmpl: 1.0.x + checksum: d6ae7cf783c79c4cb20c28093e1b1b2b79e901e576047fa3219145d9e7dcbf2f7e4ab65983ab3e82eb72825f9116ebe9cafe023135edd1ba3769ba7380fd703b + languageName: node + linkType: hard + +"map-cache@npm:^0.2.2": + version: 0.2.2 + resolution: "map-cache@npm:0.2.2" + checksum: 31e00798dc290c05bc05afe90815f2d3496b30a06a1107089f5cdc79ffa65cf7e13dd1804d875149f91d7ed48d58b03c9e79b220edf7140ae8346add6a834f9a + languageName: node + linkType: hard + +"map-visit@npm:^1.0.0": + version: 1.0.0 + resolution: "map-visit@npm:1.0.0" + dependencies: + object-visit: ^1.0.0 + checksum: 193549cf1b5570e92c72ae19710a84741cc83728f4354ce10c55486d137c38c9ac13a9028576010cc280dbc2133b7f7105ed4d6fdc195de3bafcaae41fbc0582 + languageName: node + linkType: hard + +"media-typer@npm:0.3.0": + version: 0.3.0 + resolution: "media-typer@npm:0.3.0" + checksum: a557ca96d89ac7f56891db3abcc235742e03a52ba4d584b5c1c3f55fae01655a8df4aa1f237c8f29450f7b633e3c491563421c32fbd7abc36264f6d910c743b4 + languageName: node + linkType: hard + +"merge-descriptors@npm:1.0.1": + version: 1.0.1 + resolution: "merge-descriptors@npm:1.0.1" + checksum: 968d88eb49a3f9c64a4fcff4d986da2b92759472fb01d1c162e4ed202acb72c2ce065b4f09ae996cfd901efef4e0a3777dc54a7e37f9aed26072e6dd381058d7 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 6901f822a92122dee1cece545b235fdf040494ec64ea11a36bac4d074e9feabc84ce2679ec5fc9c9b47b875e7d588ed405f09d51448581634bc82c4d106e2d87 + languageName: node + linkType: hard + +"methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: e5c0e2bb30db968433acf5d6ea1d918ba67d2752e45f079727afe98c673f847385385a4efa07bce7a00e2016f6deee01efbefd0b5110dbd01e499b176082d3fa + languageName: node + linkType: hard + +"micromatch@npm:^3.1.10, micromatch@npm:^3.1.4": + version: 3.1.10 + resolution: "micromatch@npm:3.1.10" + dependencies: + arr-diff: ^4.0.0 + array-unique: ^0.3.2 + braces: ^2.3.1 + define-property: ^2.0.2 + extend-shallow: ^3.0.2 + extglob: ^2.0.4 + fragment-cache: ^0.2.1 + kind-of: ^6.0.2 + nanomatch: ^1.2.9 + object.pick: ^1.3.0 + regex-not: ^1.0.0 + snapdragon: ^0.8.1 + to-regex: ^3.0.2 + checksum: 35191828fe5cab8a8340d0bd1cb01038de956321de18040617c210a49de5e4d1957272eb227ea2f09ba462aef7ba7ec41868ca07e846ba0e567e21f258e032d5 + languageName: node + linkType: hard + +"mime-db@npm:1.40.0": + version: 1.40.0 + resolution: "mime-db@npm:1.40.0" + checksum: 0621aab4b17438cd6abe6870c116d1edcf92576038357ad86b779f885bac0a6aa7a9bf80186eefb716d29b87687070b6f63c1bd679ac10d4403a1dda82edcc38 + languageName: node + linkType: hard + +"mime-db@npm:~1.33.0": + version: 1.33.0 + resolution: "mime-db@npm:1.33.0" + checksum: 3779bfe3b32f35344622c97c81b387babd6b01e5e33faac2e02bae2009002913796f1730d167806454c832be4f1391fce1e8f1aa41b898ee5b4d0bf024b5f905 + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12, mime-types@npm:~2.1.17": + version: 2.1.18 + resolution: "mime-types@npm:2.1.18" + dependencies: + mime-db: ~1.33.0 + checksum: fd01fa54942676843afde8b37c0836a44889640b8bd52b29063aedbdf2d4d271736214ace1c479c29e20693ea042eeabd645cea25fca8f901b646a1569943093 + languageName: node + linkType: hard + +"mime-types@npm:~2.1.19, mime-types@npm:~2.1.24": + version: 2.1.24 + resolution: "mime-types@npm:2.1.24" + dependencies: + mime-db: 1.40.0 + checksum: 15bb3af5671d0b795fcf1ffb04b2274e7c54af5941c8917ffda14ec3790ebc0c75939ea5ef143ef9d336f259ef3513084a555260adbcc8b324244b5615002d72 + languageName: node + linkType: hard + +"mime@npm:1.6.0": + version: 1.6.0 + resolution: "mime@npm:1.6.0" + bin: + mime: cli.js + checksum: ac3dc5d97099c067a010769305330735b3b1fc0d1893f0a050c8fde428daab93a351fd3fec1dfdd10f6eb02682a94b0a690ca2f762c0dac32b82334f3e798176 + languageName: node + linkType: hard + +"mime@npm:^2.0.3": + version: 2.3.1 + resolution: "mime@npm:2.3.1" + bin: + mime: cli.js + checksum: 76c8c6f4beb586a4e79ac9e1f6f0afa972e53088f658ff6522004d9b1464ca318216e4b42e3305c8b8c64047c36ef39aea19489506ddc04a1b628210d58579cc + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4": + version: 3.0.4 + resolution: "minimatch@npm:3.0.4" + dependencies: + brace-expansion: ^1.1.7 + checksum: c32249a40b1dbbb8d836495877d91874fcf6ce9c287409c41bcb3efe5ad67e21512a459a4ae3ce9b32e1df376c1cde14cbe9fe3ba17f703c2b253993577f4ccf + languageName: node + linkType: hard + +"minimist@npm:0.0.8": + version: 0.0.8 + resolution: "minimist@npm:0.0.8" + checksum: 007f9b6af3b3eeb48eb7f8df6384e57daa112db8cae745f55539835e1900eab0242cca890cb4420e7361bcad397eba316b24317d995b1f452c1486cf6fb09934 + languageName: node + linkType: hard + +"minimist@npm:^1.1.1, minimist@npm:^1.2.0": + version: 1.2.0 + resolution: "minimist@npm:1.2.0" + checksum: 06755eb86c09cfff6a239cc3a0a21fac046f333952c508ffdba6b796511725467f930bb0e2cf070401b4287d3383ce29cedb28d1d4b53d569fabc209af8d8706 + languageName: node + linkType: hard + +"minimist@npm:~0.0.1": + version: 0.0.10 + resolution: "minimist@npm:0.0.10" + checksum: b8ee0d628f1fc9d669309ac0b2153167dd3e7733c450cf0dbd9c6ec00d07ef32f8150e5e7462ffe607a2a974981a00c67c82077d836168afb929d96d57d36186 + languageName: node + linkType: hard + +"minipass@npm:^2.2.1, minipass@npm:^2.3.3": + version: 2.3.3 + resolution: "minipass@npm:2.3.3" + dependencies: + safe-buffer: ^5.1.2 + yallist: ^3.0.0 + checksum: ce9abdb9cee2cb132bcb7ab638fbcccdf9a7b898f6215bd03075cf347433b6f5d06e6c80645596bae0f1d7a80e98769f5502b14750690eff39fab3ab4626e79e + languageName: node + linkType: hard + +"minipass@npm:^2.8.6, minipass@npm:^2.9.0": + version: 2.9.0 + resolution: "minipass@npm:2.9.0" + dependencies: + safe-buffer: ^5.1.2 + yallist: ^3.0.0 + checksum: e4327e565fc4341b10fb42565462e9ee0a4364c34b240e74d01c9171619cb33c5af90d6ad6dd778af05eef18abfc84e07bccf46317440ddc690db2785a63c531 + languageName: node + linkType: hard + +"minizlib@npm:^1.1.0": + version: 1.1.0 + resolution: "minizlib@npm:1.1.0" + dependencies: + minipass: ^2.2.1 + checksum: eb863b7a2d0dd9d8bf065c43d9b2715a72dbd989ee04bfe7385e18cf30afef4f008bb840f6e019d86fc1749eaef3c3825842c916a469fbdddc7a8c1be6147e93 + languageName: node + linkType: hard + +"minizlib@npm:^1.2.1": + version: 1.3.3 + resolution: "minizlib@npm:1.3.3" + dependencies: + minipass: ^2.9.0 + checksum: c1d752ae819b53e0db0214336370d4cc4f89d2d3bbcc547576ba484e74942307bca4758071f20718d77f4ff221211092cdb0a7abee87fbd3ba0089dcee0d91a1 + languageName: node + linkType: hard + +"mixin-deep@npm:^1.2.0": + version: 1.3.1 + resolution: "mixin-deep@npm:1.3.1" + dependencies: + for-in: ^1.0.2 + is-extendable: ^1.0.1 + checksum: 8b84500dce28571beb6c4c28ae21d0c5eb3dab6a85ed0969cf55969469d17d983132e2ee95f2824522b87d8a30e05c2feba520307b8d3625a4c089bf0e99fd05 + languageName: node + linkType: hard + +"mkdirp@npm:0.5.1, mkdirp@npm:0.x, mkdirp@npm:^0.5.0, mkdirp@npm:^0.5.1": + version: 0.5.1 + resolution: "mkdirp@npm:0.5.1" + dependencies: + minimist: 0.0.8 + bin: + mkdirp: bin/cmd.js + checksum: ab0413777774b9c8255bce8e43b4e355bf329f7da0e3db007d6d370567cd82a858bd2aff028b7c5d39ff19bfd26b3c29d8e7ae706bd768a114ae95fbc9311b51 + languageName: node + linkType: hard + +"ms@npm:2.0.0": + version: 2.0.0 + resolution: "ms@npm:2.0.0" + checksum: 531c5c3f1d224510ab703166ad6883762bfbc0465c5b43dd8e2aa29e95ac141ca77e5704b7810d4c649d45580e9f78fa8febfe9ffec6a08424033f31089c83fd + languageName: node + linkType: hard + +"ms@npm:2.1.1": + version: 2.1.1 + resolution: "ms@npm:2.1.1" + checksum: f6a582361bde460587db401d7c9ede3bfe00a2fbf3f02b4e230343ef7385263280eb4b6c86e28dc2a17d321225fceb606591b84b20b770e4e7e03d6f1d27eaab + languageName: node + linkType: hard + +"ms@npm:^2.1.1": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 2a3d955e5199024d4b18630ff47c21b52703a5e892615ae233486b8108f26b5493736009754263eebae765ab79d6e20327dad6e52d7843b689d404245e286549 + languageName: node + linkType: hard + +"nan@npm:^2.12.1": + version: 2.14.0 + resolution: "nan@npm:2.14.0" + dependencies: + node-gyp: latest + checksum: 900ee9c9f5e13c493196bbfbbe09af1430e7ebb5efcebf7ba2975a834f68d5253a6f67f5ec40e14a9acbab5b620e047bebbd16f608a50a909edbdb7c74ab5eea + languageName: node + linkType: hard + +"nanomatch@npm:^1.2.9": + version: 1.2.13 + resolution: "nanomatch@npm:1.2.13" + dependencies: + arr-diff: ^4.0.0 + array-unique: ^0.3.2 + define-property: ^2.0.2 + extend-shallow: ^3.0.2 + fragment-cache: ^0.2.1 + is-windows: ^1.0.2 + kind-of: ^6.0.2 + object.pick: ^1.3.0 + regex-not: ^1.0.0 + snapdragon: ^0.8.1 + to-regex: ^3.0.1 + checksum: 9da15df0a062f15d7ba6fa7b54b3e771faf6b3c059b83afd4c21bb2c497a13f7524f3f72a8139787553279c0a0d5ed8d0599a131add5f2fbb30c38e913e197ef + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 7701162725a727ffbf4d0f60ffd48cec7b07eaf4c2a0bdd34139aa8800bff22cf6528ee95729d75ad9f92bed36a9d6f11904f4bd1ef3e535d62df5fe97a5e4e5 + languageName: node + linkType: hard + +"needle@npm:^2.2.1": + version: 2.2.1 + resolution: "needle@npm:2.2.1" + dependencies: + debug: ^2.1.2 + iconv-lite: ^0.4.4 + sax: ^1.2.4 + bin: + needle: ./bin/needle + checksum: 3bc560390c2be80ca28167e313579ff416da98503f1096dac5d670c8a03f53972052a66d7d366c7cb1a54dfa83522e13e67bcc23eec0c5232c1d8d580e997f73 + languageName: node + linkType: hard + +"negotiator@npm:0.6.2": + version: 0.6.2 + resolution: "negotiator@npm:0.6.2" + checksum: ba007b54f72a0718de14202b58203641805347db8c805d6edc69d3f369b02dd93f372aa26c90f28de21475e874e372f5de0ef581ab85ed0700a4d43185673832 + languageName: node + linkType: hard + +"neo-async@npm:^2.6.0": + version: 2.6.1 + resolution: "neo-async@npm:2.6.1" + checksum: fd6f29140b9bd6b96e047602245dae330ab8dd6da27346c360395105432abb8684d1a2bd4dd71a6265039eef33ca9f651c2c271858ead19237a01e123670ca8d + languageName: node + linkType: hard + +"nice-try@npm:^1.0.4": + version: 1.0.5 + resolution: "nice-try@npm:1.0.5" + checksum: 67ed974ae082d8efabbd1e4c0b052bb651efd43db7efba36ef2f32699bafae51bfd5f7bab8ae2ba528f060943e902fb42d5b9c68b8ea0e432246beac8ea2360c + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 6.0.1 + resolution: "node-gyp@npm:6.0.1" + dependencies: + env-paths: ^2.2.0 + glob: ^7.1.4 + graceful-fs: ^4.2.2 + mkdirp: ^0.5.1 + nopt: ^4.0.1 + npmlog: ^4.1.2 + request: ^2.88.0 + rimraf: ^2.6.3 + semver: ^5.7.1 + tar: ^4.4.12 + which: ^1.3.1 + bin: + node-gyp: ./bin/node-gyp.js + checksum: 6cb9baef32a7e1897f23ebdcd7d3664187709c10f34123c031ff595633c03cca45bf2550ccbc8c8533bce138c9b18c391eb566e7f6bcd683bbfd1d9c80b2aad3 + languageName: node + linkType: hard + +"node-int64@npm:^0.4.0": + version: 0.4.0 + resolution: "node-int64@npm:0.4.0" + checksum: dc224b55bea355fc40da727cf224773b9836856d8518defd61782e3a78301be1b575a38ee2a0c66bd34f18ba436bec8cb6211f37adba9a724524ffdde479a51a + languageName: node + linkType: hard + +"node-modules-regexp@npm:^1.0.0": + version: 1.0.0 + resolution: "node-modules-regexp@npm:1.0.0" + checksum: bd567c873c1128e0ccf64e52eb68dea190d19920a91df45dfe481f51bf934a7e644402da1edd1ea4a8e94497a872926da2c90487cf9864229a33f65827136131 + languageName: node + linkType: hard + +"node-notifier@npm:^5.4.2": + version: 5.4.3 + resolution: "node-notifier@npm:5.4.3" + dependencies: + growly: ^1.3.0 + is-wsl: ^1.1.0 + semver: ^5.5.0 + shellwords: ^0.1.1 + which: ^1.3.0 + checksum: 8182f9e865c018f5dd40f2a07ba1e4fe18a841db6f0ae4137a3a36a60ef3b7aff0ff495c0e5e43b4230f8829a9e62c656265289c497e03a02dffc25020712a89 + languageName: node + linkType: hard + +"node-pre-gyp@npm:^0.12.0": + version: 0.12.0 + resolution: "node-pre-gyp@npm:0.12.0" + dependencies: + detect-libc: ^1.0.2 + mkdirp: ^0.5.1 + needle: ^2.2.1 + nopt: ^4.0.1 + npm-packlist: ^1.1.6 + npmlog: ^4.0.2 + rc: ^1.2.7 + rimraf: ^2.6.1 + semver: ^5.3.0 + tar: ^4 + bin: + node-pre-gyp: ./bin/node-pre-gyp + checksum: 495135e3ac12bd6d0db17126486a84bfc864647b611219f7d53677659e8b772990afae32d041aeba171e856e8faf6a9414d39565bcecf6e0497ca86e0a929112 + languageName: node + linkType: hard + +"nopt@npm:^4.0.1": + version: 4.0.1 + resolution: "nopt@npm:4.0.1" + dependencies: + abbrev: 1 + osenv: ^0.1.4 + bin: + nopt: ./bin/nopt.js + checksum: bc28896a27babb2edc8be76d77b2f10432da251bc86ad0ff5c03c2cd8ff10f1ecd5aba7f4b8db63cd8e0961362a573417a84dd60a7bd97c15b4099cbc10accb1 + languageName: node + linkType: hard + +"normalize-package-data@npm:^2.3.2": + version: 2.4.0 + resolution: "normalize-package-data@npm:2.4.0" + dependencies: + hosted-git-info: ^2.1.4 + is-builtin-module: ^1.0.0 + semver: 2 || 3 || 4 || 5 + validate-npm-package-license: ^3.0.1 + checksum: 477ea687001ec8c684a16a6bce5620ab5848b726c278fb6d2296dedb492bfb5b74962b73443121262e1714e8cbf361335871d9a3a5f7543328e6e3a8fb3c19c0 + languageName: node + linkType: hard + +"normalize-path@npm:^2.1.1": + version: 2.1.1 + resolution: "normalize-path@npm:2.1.1" + dependencies: + remove-trailing-separator: ^1.0.1 + checksum: 6df0d13bcd2b4fbaf890e7ad3b0b122322503620ee79987e47071db4acb742aeb57c13442a299b430a4f22cef5afafbc328b3d831b593e840debfcbfdec65dfa + languageName: node + linkType: hard + +"npm-bundled@npm:^1.0.1": + version: 1.0.3 + resolution: "npm-bundled@npm:1.0.3" + checksum: 4df49c15d3c2ae7ebc5b045f90e8b94408f2e217cdbec0153d95bce55402e25f61b46956b99259d005438bcabbb5091f107d6d01e1f7866bc77252e31e335e33 + languageName: node + linkType: hard + +"npm-packlist@npm:^1.1.6": + version: 1.1.10 + resolution: "npm-packlist@npm:1.1.10" + dependencies: + ignore-walk: ^3.0.1 + npm-bundled: ^1.0.1 + checksum: 2a098cfcbc945ec6a836087b1e205ac76536b81851531293b9643e5d71e7dc0aced600194b983b81ca3934926fbc1dba22e9df702675a2632a05b6c939af11a7 + languageName: node + linkType: hard + +"npm-run-path@npm:^2.0.0": + version: 2.0.2 + resolution: "npm-run-path@npm:2.0.2" + dependencies: + path-key: ^2.0.0 + checksum: 209cab1259d0380dba8065603e120b29fdf167678d86c832fde853bf89de6cf85c64bb9aa1be04ae0237dd6b1fc469632554107c1d9961ec35ce07d9c5d3b5f5 + languageName: node + linkType: hard + +"npmlog@npm:^4.0.2, npmlog@npm:^4.1.2": + version: 4.1.2 + resolution: "npmlog@npm:4.1.2" + dependencies: + are-we-there-yet: ~1.1.2 + console-control-strings: ~1.1.0 + gauge: ~2.7.3 + set-blocking: ~2.0.0 + checksum: 94b5f0c2243471d13a66357c5afe382dbc7ed6f02a2da7674f9cb3dcab3d810240949c709b642560c48d894e535d34e70451e2cc1647953bb5d361e6d88a4c82 + languageName: node + linkType: hard + +"number-is-nan@npm:^1.0.0": + version: 1.0.1 + resolution: "number-is-nan@npm:1.0.1" + checksum: 57477f268f33135ab7765730d4411957f128765259b7281b403384d174ef45bb4d82421a74e8e233fa3913f1c0d9a8be1671f1b4d35947b6eb51e8ab7639a888 + languageName: node + linkType: hard + +"nwsapi@npm:^2.0.0": + version: 2.0.5 + resolution: "nwsapi@npm:2.0.5" + checksum: ba4cc1a4335ac9f5534c61847f340d4a5495fc268afcd6a7c9da1c7dfc14818195ddc297f62de488521d825ade6dfd4e90667f58b1d9f1511f4e06e68ac0fade + languageName: node + linkType: hard + +"oauth-sign@npm:~0.8.2": + version: 0.8.2 + resolution: "oauth-sign@npm:0.8.2" + checksum: a932a3238449d4ad10efd65fe9a83c339f2cf3c36360e91b260a252307a66e4b2933adf990965a87d3c67b1bf00ff8c0ffa19abcaf9a61de06e66582acf7b1ec + languageName: node + linkType: hard + +"oauth-sign@npm:~0.9.0": + version: 0.9.0 + resolution: "oauth-sign@npm:0.9.0" + checksum: f4cb09c65243732ca9d7a9279b29f0c1ae1cdf15722a23c19b5f37cb693545df7822c29d506a10991aaf12231976361ed2a9c90a18101a73f990df5423954d9b + languageName: node + linkType: hard + +"object-assign@npm:^4.1.0": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 8a281400d57a8880141ceb4335061b17e2d21405b2d5909e3fd71948d6b10f366c65d71a62aac27a0e45754a5e467bcc3f6ff78f26a929948d751b582b46d14e + languageName: node + linkType: hard + +"object-copy@npm:^0.1.0": + version: 0.1.0 + resolution: "object-copy@npm:0.1.0" + dependencies: + copy-descriptor: ^0.1.0 + define-property: ^0.2.5 + kind-of: ^3.0.3 + checksum: 6f90d587edfbe4832d8cfaf8dcd8c30ee2c01a4010598b0fe1dc2603c1fb3268985eaa9ab2148e267d5b8dd1bd3bc12911db6a0abe3555d4dc4906fffae40e7d + languageName: node + linkType: hard + +"object-keys@npm:^1.0.8": + version: 1.0.12 + resolution: "object-keys@npm:1.0.12" + checksum: acd19a607be4a6026e2ba23c7ec66069aee8a5d08fadf17aa1a1f59de535dc4469a9c963c9d8c092c13753102e178a37394724b457b9b31b8475ba27aae7525a + languageName: node + linkType: hard + +"object-visit@npm:^1.0.0": + version: 1.0.1 + resolution: "object-visit@npm:1.0.1" + dependencies: + isobject: ^3.0.0 + checksum: f0e29a4c6453a5613ca4ca4f534b4b0f1770726bd9d82b836aef208cfc26f8447c2e0bdf29839ef51c93003fd7bedfb3857067942e76b843ef4c04b1b6f7a860 + languageName: node + linkType: hard + +"object.getownpropertydescriptors@npm:^2.0.3": + version: 2.0.3 + resolution: "object.getownpropertydescriptors@npm:2.0.3" + dependencies: + define-properties: ^1.1.2 + es-abstract: ^1.5.1 + checksum: f6317b1d1fea2ffb15acb10dd72cdaf750ccfc09b60c9cd53833f89edde6ef18406a465064d469f106053eff7671d7f83ced6b46c09f0f677b6241edb71376be + languageName: node + linkType: hard + +"object.pick@npm:^1.3.0": + version: 1.3.0 + resolution: "object.pick@npm:1.3.0" + dependencies: + isobject: ^3.0.1 + checksum: b209228f4ee68b63a9c238512c159278a49fd29e9765e024c27eaf2c4a749dd9300e06efc07f54718ad974e85a74e7f05e017c9ca00e6ad6802662e55cc4e20a + languageName: node + linkType: hard + +"on-finished@npm:~2.3.0": + version: 2.3.0 + resolution: "on-finished@npm:2.3.0" + dependencies: + ee-first: 1.1.1 + checksum: a22fb45dade5cdc10ab0d0064a035dcb42f5cb6bb302da58c4a9db4e6b8a5042209da8644c9e020a81872be5259b5c0be3385979b3d5802591454181c64143eb + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: 1 + checksum: 47a04404e9aa3a209a7e536b199780fe75aba04df0a035b221285f2f703d0ab58286ffb402ff7cb5a3b894d0e86685eb4fc2766ce7a19555c14221437f248c03 + languageName: node + linkType: hard + +"optimist@npm:^0.6.1": + version: 0.6.1 + resolution: "optimist@npm:0.6.1" + dependencies: + minimist: ~0.0.1 + wordwrap: ~0.0.2 + checksum: 977347fe2694653cb099fb74a08ff4dafffc7fc9d2400c1b35473fea6ca5436d83070317d09960b8c7fb0cb8ea1c6f2539185fc49797e80156cb7fa74f5b74a0 + languageName: node + linkType: hard + +"optionator@npm:^0.8.1": + version: 0.8.2 + resolution: "optionator@npm:0.8.2" + dependencies: + deep-is: ~0.1.3 + fast-levenshtein: ~2.0.4 + levn: ~0.3.0 + prelude-ls: ~1.1.2 + type-check: ~0.3.2 + wordwrap: ~1.0.0 + checksum: f094b9ebe0775edc51f0406ccd484c9191521afef6526b1a1b930e394f3bfaffa1ad43cce2f0856c7323ab8414e727df1bcf266a216a01ff879d91a2f784752c + languageName: node + linkType: hard + +"os-homedir@npm:^1.0.0": + version: 1.0.2 + resolution: "os-homedir@npm:1.0.2" + checksum: d9addcdab0f1c9b903510a8bac0a5caef246f186563c09b6b1dab643f19e875667913ffb29e8dc6d742c8ef6e8f422c00ca9f5d9e330f0bede64236e4d35168d + languageName: node + linkType: hard + +"os-tmpdir@npm:^1.0.0": + version: 1.0.2 + resolution: "os-tmpdir@npm:1.0.2" + checksum: 755d9c21ad7e5155978247cbdab470427e035b507bb6cc9cc2730b027dce1e7f649f2044d81fa280ccdf9293c4f4e51b21bb9657d32893ff3d9f4bbff1522506 + languageName: node + linkType: hard + +"osenv@npm:^0.1.4": + version: 0.1.5 + resolution: "osenv@npm:0.1.5" + dependencies: + os-homedir: ^1.0.0 + os-tmpdir: ^1.0.0 + checksum: 87f8cd7bb82e0366e70c9f6df550eaf2788e80339bc1def027c25ac5db1f0c456716e39e63a04d721c660d69ca1b4dc9e83532a52ede13082fa7d393d7895367 + languageName: node + linkType: hard + +"p-each-series@npm:^1.0.0": + version: 1.0.0 + resolution: "p-each-series@npm:1.0.0" + dependencies: + p-reduce: ^1.0.0 + checksum: 1891692eb9d6dd5f2bc9ee97953008e0f4a923c86c307589434e9f6c81952e9f79bc14a6512e8f412ef37785c9f68e7d6922c427301e545c49aeeec2d2dbcda1 + languageName: node + linkType: hard + +"p-finally@npm:^1.0.0": + version: 1.0.0 + resolution: "p-finally@npm:1.0.0" + checksum: fe1770b0c3a3d21013a4b1754458bfdca7c145c65adb4a8d19892c2376d2daf195c572aef07c0a7753b3c552a47d3310193462c95b5eb4ff6e0397d889078c3f + languageName: node + linkType: hard + +"p-limit@npm:^1.1.0": + version: 1.3.0 + resolution: "p-limit@npm:1.3.0" + dependencies: + p-try: ^1.0.0 + checksum: c08e3a74db853e01b61fc95547135ca38dac5f968a7d2dea5adc9cfa6c466bc68f5e0a6dbe83484696a0580e792b438cc905ade90faac75432416832e84f113c + languageName: node + linkType: hard + +"p-limit@npm:^2.0.0": + version: 2.2.1 + resolution: "p-limit@npm:2.2.1" + dependencies: + p-try: ^2.0.0 + checksum: e5260c9fc533cda82a7ec2b63d64dc56bdc2c236f494972e2b62f4aee1e932a08d2ddf9a7672abe8fa355edab1dc22cd369cc485dd4695163a0296078b994f8a + languageName: node + linkType: hard + +"p-locate@npm:^2.0.0": + version: 2.0.0 + resolution: "p-locate@npm:2.0.0" + dependencies: + p-limit: ^1.1.0 + checksum: 0f43ac9656bea6f3d25e52fb7bec0f7375dde4d74b14d90a327e8bb85b8364a643ef2fc2e88373d8e2782a740ba4d639c3d86e455a8bcb1f59c2eea2c837a820 + languageName: node + linkType: hard + +"p-locate@npm:^3.0.0": + version: 3.0.0 + resolution: "p-locate@npm:3.0.0" + dependencies: + p-limit: ^2.0.0 + checksum: 79303104cac5fad06fc1c30057e1cf14c805180cf82be6efb8b15942079bd3cddb5768ab14b1f19a13be28c1a8491f6a7cd4335f3993078dec4b6aa0888dc7a6 + languageName: node + linkType: hard + +"p-reduce@npm:^1.0.0": + version: 1.0.0 + resolution: "p-reduce@npm:1.0.0" + checksum: f10ec1f4d1e0d0fff8c1e2c212d0b0ea7dfc1f2e99550eec33ee77eefd52655e5b4b9164fc3faef0ebe6a83f64c2a17cdce5b20eb74a9e0764cf89b4cf08c425 + languageName: node + linkType: hard + +"p-try@npm:^1.0.0": + version: 1.0.0 + resolution: "p-try@npm:1.0.0" + checksum: 963055d21dd1db934c7fac8590e46f7783832574318c5f5c46701632c383db461316fc21960a4c5e1e0789dae7fc7631ab1ef439a47670e68dcee05cf2f7f674 + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: e7dceba546bcab1c72a4c1c8af45c7017e93dcafc4bdd9bd7e78d3b155a7e74cd0ec5277f2039cbc0d538050de1cfa52e8a157a3a741c0a6de870e0f5b03da33 + languageName: node + linkType: hard + +"parse-json@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-json@npm:4.0.0" + dependencies: + error-ex: ^1.3.1 + json-parse-better-errors: ^1.0.1 + checksum: 1d9795dcb2a839e5ee3c7a0d3f609c939109080027c7d403f7f2e6c2cfc7276035a1b297d8f0ca7a4aae25bb4094e567a0a96e8ae5f5e7c1f7f38d7a4d030d5f + languageName: node + linkType: hard + +"parse5@npm:4.0.0": + version: 4.0.0 + resolution: "parse5@npm:4.0.0" + checksum: c37fbfe44f4b13989740c4dcd72d29a08bf2f076d4d1aa8e68d32fdbfddc46ce6501e3049d6f01307bc0b4b76024b5edf8333fc6cb80d573e4698252029a01b6 + languageName: node + linkType: hard + +"parseurl@npm:~1.3.3": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: dce90b0503088ff4c51a9011955720d568359103e0e3775e1bf5d1c4f8d4c6b92a53810a60f15198337c1f4efec22ca68123c00591423b5d41263b5b2759186d + languageName: node + linkType: hard + +"pascalcase@npm:^0.1.1": + version: 0.1.1 + resolution: "pascalcase@npm:0.1.1" + checksum: 2186112380d0c860c10677d10104e3e52e72595ad8e3abd8f5909169aa0fc94c9cf7670b2f4343c6cce7ceab94db7b0c2bc8f0d471eff09d0749d9c57d8b43f2 + languageName: node + linkType: hard + +"path-exists@npm:^3.0.0": + version: 3.0.0 + resolution: "path-exists@npm:3.0.0" + checksum: b04837ffc484dbe6edde02ee4e00daa4dbc01eaa7da7aae23b643021072a519fa99b3acd225936934f27455abef5b139974f0813ce6b293821f79aaefa5babbb + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 0e197d7cfa28209bce077b65646e21beb9a9980cc2b57efa4a4bf3b3331ec003f823bfec0948326264a2cbc57645a666cf911eb5d949d627d9e788280cccaa07 + languageName: node + linkType: hard + +"path-key@npm:^2.0.0, path-key@npm:^2.0.1": + version: 2.0.1 + resolution: "path-key@npm:2.0.1" + checksum: c89ee103cdc74ba8a5772cb56e9f1346cc7eae0789c4f9cb01ba5e6d501c2642900538e444ba26284a3a52fc01b9f1d70c7270d638c3cf37c25958ebf860be4e + languageName: node + linkType: hard + +"path-parse@npm:^1.0.6": + version: 1.0.6 + resolution: "path-parse@npm:1.0.6" + checksum: 02894a9a2dd29ba61ce0f79c0cbb230869d16e3129eea46ee1195d6bed370806f254a51f494ad51d5bab4e494ea0a9040819923bec3be586b1f9004a70c65a3a + languageName: node + linkType: hard + +"path-to-regexp@npm:0.1.7": + version: 0.1.7 + resolution: "path-to-regexp@npm:0.1.7" + checksum: 7b368efe426ab6f505a668e8bd7d3b801fb714e7af5cb4679819c76bc3b8d0bd6b4f791e77a88679907d8e6ecab357b36b10b9630ac28a65b572b6ec3fd4c676 + languageName: node + linkType: hard + +"path-type@npm:^3.0.0": + version: 3.0.0 + resolution: "path-type@npm:3.0.0" + dependencies: + pify: ^3.0.0 + checksum: d167c88ab4b3ef92d2d05e01e24e4d40f6a9fc77ffd4fb0d5e1f86c69cee232afe31b4e2153b9111b2d6b30f1697053ae613b67ecec4c12d022e78ae563930bb + languageName: node + linkType: hard + +"pend@npm:~1.2.0": + version: 1.2.0 + resolution: "pend@npm:1.2.0" + checksum: cb22897b37846fcfced0a8919fc5fd094b487c22abef53593088ffcb150401a0a0eac0ee17b25f648932321bcc500439cb5fb45de8ad7067ed39a260a4c42eac + languageName: node + linkType: hard + +"performance-now@npm:^2.1.0": + version: 2.1.0 + resolution: "performance-now@npm:2.1.0" + checksum: 6a5b3d6104304d00a0ec4bbf2799bfb1e2dcfe5403d7d1c3c9a595451b32acb7396c831817730288e4a33cae5de0d3c76d38cfebb62b59927a021b3300f8d29e + languageName: node + linkType: hard + +"pify@npm:^3.0.0": + version: 3.0.0 + resolution: "pify@npm:3.0.0" + checksum: f541f33af19872d2b3a40427c7b065369823c9a4e7ba92a8d7102b9cc2b89983418dac2dbd272ddfbc684963c84d6cd766e033dff83545b41414dff8c3c266d7 + languageName: node + linkType: hard + +"pify@npm:^4.0.1": + version: 4.0.1 + resolution: "pify@npm:4.0.1" + checksum: 62b9d1bea3b63eea2857fa50b56dc8b6ae7c60a49e1edb45fab1a33bcb21ed551c6ecd811d2362dba0529b56e2715f7fd7d533141e6f3718d36a1a4261107feb + languageName: node + linkType: hard + +"pirates@npm:^4.0.1": + version: 4.0.1 + resolution: "pirates@npm:4.0.1" + dependencies: + node-modules-regexp: ^1.0.0 + checksum: 33854d16fd918619111053fda6e0d2e4093211f02f5df4692967e230e5a40dedcc860b8abb759aea20fda6cb4e031d331e4b39e2be47905749617e3393f324fd + languageName: node + linkType: hard + +"pkg-conf@npm:^2.1.0": + version: 2.1.0 + resolution: "pkg-conf@npm:2.1.0" + dependencies: + find-up: ^2.0.0 + load-json-file: ^4.0.0 + checksum: 72ba23e9052d44106c6ef5035a2ab9667ea26bfd5345e1c1ac0a92780191c90750670b90164c3873372cc734e7811de385edad0b4c57ab971dcd4d63f4e3ec3a + languageName: node + linkType: hard + +"pkg-dir@npm:^3.0.0": + version: 3.0.0 + resolution: "pkg-dir@npm:3.0.0" + dependencies: + find-up: ^3.0.0 + checksum: 4d8b5cda8118f4f02a49c5cac96f1c28cec64aa53090da6d6ba3a22ff42358ff6042ad83cdbb2bdf418db485426050ae8ea01bea160ec29c7f6c8fe225dc4455 + languageName: node + linkType: hard + +"pn@npm:^1.1.0": + version: 1.1.0 + resolution: "pn@npm:1.1.0" + checksum: 4d7477e59b4b698e1cf257f2a83eb6eba851ce493236da31f6c365ea2693e8865fe031534fc306298933e2c4c81f01a35413efe4d5530df3d30e15701721350f + languageName: node + linkType: hard + +"posix-character-classes@npm:^0.1.0": + version: 0.1.1 + resolution: "posix-character-classes@npm:0.1.1" + checksum: 7c72756644cb3fa6918231009890a520ac7d446e122c5c8fb755b59c613dbcb7387d3f20162514ad886641adf2e52a4662fbb56e4bd975b78151d2091ad216fd + languageName: node + linkType: hard + +"prelude-ls@npm:~1.1.2": + version: 1.1.2 + resolution: "prelude-ls@npm:1.1.2" + checksum: 28f121cf8ac4b4b7b61f2bca9c1f63edd61250e4186c75fc3d05762ba090f13f45baf092aa10a4a16a42167884cad6ce40ff819692ad8d8060a0d4ed7bf45899 + languageName: node + linkType: hard + +"prettier@npm:1.19.1": + version: 1.19.1 + resolution: "prettier@npm:1.19.1" + bin: + prettier: ./bin-prettier.js + checksum: 0b8665fa22259378feaf46a54a559a09bd2c367e6391015af5068e88c6fb8d96e20afc56a6a6b2bac2eb0ad1ad26302ea634377e6397eca09301f64b01f3021a + languageName: node + linkType: hard + +"pretty-format@npm:^24.9.0": + version: 24.9.0 + resolution: "pretty-format@npm:24.9.0" + dependencies: + "@jest/types": ^24.9.0 + ansi-regex: ^4.0.0 + ansi-styles: ^3.2.0 + react-is: ^16.8.4 + checksum: 2a55ef0189e1c0251c3af70c6d88cd4bf330ddc353855d42839cfac6111856bdf46e997da5664bea507e021c3c8d02314a75f9a6df3c71f8a0a1c8aa41a73fcc + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.0 + resolution: "process-nextick-args@npm:2.0.0" + checksum: 544685b0e88727179f54562c7c0b6597c32ab97212e522e5f497a220e3b9de8836fb49c043168082f69fb59bcad2e46bacc8cf8dbc968a0d9890625730f78ccf + languageName: node + linkType: hard + +"progress@npm:^2.0.1": + version: 2.0.3 + resolution: "progress@npm:2.0.3" + checksum: 32bae4231a6c78481aa173b4239746b15208471a9c6fc27ba602d1ef08d79b689d6ffedb8027a227386258654f6ea10866ef4b4db38ba4a2a8a5622171d586c6 + languageName: node + linkType: hard + +"prompts@npm:^2.0.1": + version: 2.2.1 + resolution: "prompts@npm:2.2.1" + dependencies: + kleur: ^3.0.3 + sisteransi: ^1.0.3 + checksum: e01ee809c333a8bdc5b149ba5664de014c3378a88ff24708d7b6b852122c37bf4b750e5bc9f75a59cb14637309138a47ba04552aec3053318ba77eec5002f13b + languageName: node + linkType: hard + +"proxy-addr@npm:~2.0.5": + version: 2.0.5 + resolution: "proxy-addr@npm:2.0.5" + dependencies: + forwarded: ~0.1.2 + ipaddr.js: 1.9.0 + checksum: 92cb8fad5c3f69107bf500615289001334d9cfe1e1280131b6ef5e2cfe1a219991c77b3b696842dd10f77a248f0b4fda71677c41a87c68e63049944deb1ed81a + languageName: node + linkType: hard + +"proxy-from-env@npm:^1.0.0": + version: 1.0.0 + resolution: "proxy-from-env@npm:1.0.0" + checksum: 7987d7df470c16b78eeedc7265636f23d5fe3269bc92371e7cd4820ddfcaa8bd12417711818633e9cd972c2a0776faf976c3caefa4eb3e3483d3c954a950b79e + languageName: node + linkType: hard + +"psl@npm:^1.1.24": + version: 1.1.28 + resolution: "psl@npm:1.1.28" + checksum: 4b818870caa25cd3af71c55e8848be318056fb2cdfbf21b272a51aea800592b7e5086590aa9906f5afca17c970f084f1b83fbc6189d88ccbb1699df000fd6777 + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.0 + resolution: "pump@npm:3.0.0" + dependencies: + end-of-stream: ^1.1.0 + once: ^1.3.1 + checksum: 09633ba0f0d3d09f68afa6d7ad46e05e4860ec0549d9e55a87baa28fca048c3b87d1debdf1b3fac9bbbd21cdb0c3e11c527cb63471569cf88bcc0daeb466b32e + languageName: node + linkType: hard + +"punycode@npm:^1.4.1": + version: 1.4.1 + resolution: "punycode@npm:1.4.1" + checksum: 747838f367f6e00bd688e968fe7d510d33fbd8d75e4dd6a7919bbbaf51fbd1c1e861ff24ced239adee076b4a5fcb08cdc3a26d88e7980e94efd9a96a950b0014 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.1.1 + resolution: "punycode@npm:2.1.1" + checksum: 497a65093f48fc94a91a2166cf4365d162ab07977adc8dc23dfb6c109c3d0dc004ea3623813a64e62992ad85d14b6a13a489055acd5c4763f56cae0733d71095 + languageName: node + linkType: hard + +"puppeteer@npm:^2.0.0": + version: 2.0.0 + resolution: "puppeteer@npm:2.0.0" + dependencies: + debug: ^4.1.0 + extract-zip: ^1.6.6 + https-proxy-agent: ^3.0.0 + mime: ^2.0.3 + progress: ^2.0.1 + proxy-from-env: ^1.0.0 + rimraf: ^2.6.1 + ws: ^6.1.0 + checksum: e5008e55e9bbcfea19a83e5ee3df3525df7e62e39e2dd47c1d0bc7f48f29d93c9962b0b9435ad0059a88eeea130e64d57f02b93f1b999fdb40db9b632207996a + languageName: node + linkType: hard + +"qs@npm:6.7.0": + version: 6.7.0 + resolution: "qs@npm:6.7.0" + checksum: 00917393bac59cda442020ca17fe8df9c176ca12c915b8475ab181c0d81e8cefc66d559af9287f47380d37a5188f95f8489300ff059514449982f3deed1fc52a + languageName: node + linkType: hard + +"qs@npm:~6.5.1, qs@npm:~6.5.2": + version: 6.5.2 + resolution: "qs@npm:6.5.2" + checksum: 0e9377802164c7a454397660305eaa3b2e10afd915cff80dedab1b90ebc017105a3cfc6d995116374cd2d07d18349478b9ad1eb1ac72596c402b89010e46c0e5 + languageName: node + linkType: hard + +"query-string@npm:^6.8.3": + version: 6.8.3 + resolution: "query-string@npm:6.8.3" + dependencies: + decode-uri-component: ^0.2.0 + split-on-first: ^1.0.0 + strict-uri-encode: ^2.0.0 + checksum: 556fcf9127f43e9fbe58f30e2b3894cb553f04685743f0a74ac77481b5a739cc26223f1e04a22a7feee42c7e39cb5d10bb2086fe1d0cbbdfba2094875f52a0e4 + languageName: node + linkType: hard + +"range-parser@npm:~1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: bb275debfeeecf3a3da38167e24356eb8c365914d2b3b76074d270553184c05b3fb85c27a6936c3abd57b2f6b5c0a57848e33227f32dd5295d2e18c4f79346b0 + languageName: node + linkType: hard + +"raw-body@npm:2.4.0": + version: 2.4.0 + resolution: "raw-body@npm:2.4.0" + dependencies: + bytes: 3.1.0 + http-errors: 1.7.2 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + checksum: 79f3fca0e5a077d3b37c6dac70bc6f1140219b2191455625642b32cc80b7d5d7497f7c0910e1b158c8d4413d6e0e7a47e21ea9ead493a8bc8a322c738573d150 + languageName: node + linkType: hard + +"rc@npm:^1.2.7": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: ^0.6.0 + ini: ~1.3.0 + minimist: ^1.2.0 + strip-json-comments: ~2.0.1 + bin: + rc: ./cli.js + checksum: 622cc77b4aac7485132e5b60875e59a9c227396a41714b0d9a141c0439daed9e5e6fc985a8761c513e650660136d2e24321fddd72cb2b7886cb930958374b718 + languageName: node + linkType: hard + +"react-is@npm:^16.8.4": + version: 16.11.0 + resolution: "react-is@npm:16.11.0" + checksum: e593d38595ecbb642e7ccfff4ec0869be7b1f3e1b083eb51131231e1dea33a47c7132b870cbad5c769dce5e94e2212ccf732b8a7cad482bab729e7df1075adf3 + languageName: node + linkType: hard + +"read-pkg-up@npm:^4.0.0": + version: 4.0.0 + resolution: "read-pkg-up@npm:4.0.0" + dependencies: + find-up: ^3.0.0 + read-pkg: ^3.0.0 + checksum: 2f6b7d36ec3a35add081d5bf4f1a2ecbdaa39365c531cf7510abb3cd3193a09c5b185d95224d8d09dee5404b7a8ce08474ffe4ae6ddaf0ec8c3b98261cce4399 + languageName: node + linkType: hard + +"read-pkg@npm:^3.0.0": + version: 3.0.0 + resolution: "read-pkg@npm:3.0.0" + dependencies: + load-json-file: ^4.0.0 + normalize-package-data: ^2.3.2 + path-type: ^3.0.0 + checksum: 355d7dfd1e3dc21b48b78366c3f7c93878c12f82fe337ce88b0392034b309ced3c98c60cf1f7499dc003a203df1dd61ce3b7613fe18a98330a59e759c3393c4a + languageName: node + linkType: hard + +"readable-stream@npm:^2.0.6, readable-stream@npm:^2.2.2": + version: 2.3.6 + resolution: "readable-stream@npm:2.3.6" + dependencies: + core-util-is: ~1.0.0 + inherits: ~2.0.3 + isarray: ~1.0.0 + process-nextick-args: ~2.0.0 + safe-buffer: ~5.1.1 + string_decoder: ~1.1.1 + util-deprecate: ~1.0.1 + checksum: 467e806a373a91bc20b57c9ac78ad2662d68cd3f8ae823d639ccbda6e37c7c9225b57e3f0fec43a5e195418dc70049a021ef5b536748a360e8d15346492f161b + languageName: node + linkType: hard + +"realpath-native@npm:^1.1.0": + version: 1.1.0 + resolution: "realpath-native@npm:1.1.0" + dependencies: + util.promisify: ^1.0.0 + checksum: e265193645cf1ec1dae5859773540ccf7da0e0a633635324944512ef3fbb7a991c091bcc1d9a286742aa00a7d56641337e7e64e19cf14ef46f7e90b10d19ec6d + languageName: node + linkType: hard + +"regex-not@npm:^1.0.0, regex-not@npm:^1.0.2": + version: 1.0.2 + resolution: "regex-not@npm:1.0.2" + dependencies: + extend-shallow: ^3.0.2 + safe-regex: ^1.1.0 + checksum: 0be0f572ae86579904058db2285ad91029020fc554ee4695781dc4805a02e643b90adc31669b7fa72872977b4e02abfc7f90c6ebf429c02131e010e0ca7779d9 + languageName: node + linkType: hard + +"remove-trailing-separator@npm:^1.0.1": + version: 1.1.0 + resolution: "remove-trailing-separator@npm:1.1.0" + checksum: f295e0d260d6d290f89d74c1dc021166c75fd4315952d6b908e493ce012d530089255eb0ee293878ed3a0e9878b8a0bddb1c6543cd2e0ba7e8f215a522a2f400 + languageName: node + linkType: hard + +"repeat-element@npm:^1.1.2": + version: 1.1.2 + resolution: "repeat-element@npm:1.1.2" + checksum: 5e031790766906e5775ea2aa32828fce7ebe6b77000c300ccdaaa5d6d06a788dd522917784a284af3d5726a6baa0cd4239ca9255e7e483b7e23e2e2ac1544e24 + languageName: node + linkType: hard + +"repeat-string@npm:^1.6.1": + version: 1.6.1 + resolution: "repeat-string@npm:1.6.1" + checksum: ef9617af35ea90f6fbd5794810a854d91205ed20ec017e9dfdf9973d625a3fa6f7b486be340f8155b46e53ef972a346c27fa7187393f61b5cb5b331afba16187 + languageName: node + linkType: hard + +"request-promise-core@npm:1.1.1": + version: 1.1.1 + resolution: "request-promise-core@npm:1.1.1" + dependencies: + lodash: ^4.13.1 + peerDependencies: + request: ^2.34 + checksum: e8fcd5d6f0e90b81b1f3868347100a71ac39e0c4bcef1f5ff001d20530a28b0e4ac2afef28b9b9e8b826aea7dccd8a2c2a096b83d1c69aee7c6f160b9c7e1a3b + languageName: node + linkType: hard + +"request-promise-native@npm:^1.0.5": + version: 1.0.5 + resolution: "request-promise-native@npm:1.0.5" + dependencies: + request-promise-core: 1.1.1 + stealthy-require: ^1.1.0 + tough-cookie: ">=2.3.3" + peerDependencies: + request: ^2.34 + checksum: f84ba84572cb1ab637bd33e7484146139259e85a263be36bf474149ab5aba0dce362f90c488484e1c930f23819f9a5466aa6a619e6f13e84a909f673bd04b7e4 + languageName: node + linkType: hard + +"request@npm:^2.83.0": + version: 2.87.0 + resolution: "request@npm:2.87.0" + dependencies: + aws-sign2: ~0.7.0 + aws4: ^1.6.0 + caseless: ~0.12.0 + combined-stream: ~1.0.5 + extend: ~3.0.1 + forever-agent: ~0.6.1 + form-data: ~2.3.1 + har-validator: ~5.0.3 + http-signature: ~1.2.0 + is-typedarray: ~1.0.0 + isstream: ~0.1.2 + json-stringify-safe: ~5.0.1 + mime-types: ~2.1.17 + oauth-sign: ~0.8.2 + performance-now: ^2.1.0 + qs: ~6.5.1 + safe-buffer: ^5.1.1 + tough-cookie: ~2.3.3 + tunnel-agent: ^0.6.0 + uuid: ^3.1.0 + checksum: 0be3fcca3a033d80f9cd3fed9d0ca8452b634f17d0c94fb67f2473922fdd582c477c7f8af8df3109da81beed105878a69da3b330f6701d6d4e74b183ad4c3abe + languageName: node + linkType: hard + +"request@npm:^2.88.0": + version: 2.88.0 + resolution: "request@npm:2.88.0" + dependencies: + aws-sign2: ~0.7.0 + aws4: ^1.8.0 + caseless: ~0.12.0 + combined-stream: ~1.0.6 + extend: ~3.0.2 + forever-agent: ~0.6.1 + form-data: ~2.3.2 + har-validator: ~5.1.0 + http-signature: ~1.2.0 + is-typedarray: ~1.0.0 + isstream: ~0.1.2 + json-stringify-safe: ~5.0.1 + mime-types: ~2.1.19 + oauth-sign: ~0.9.0 + performance-now: ^2.1.0 + qs: ~6.5.2 + safe-buffer: ^5.1.2 + tough-cookie: ~2.4.3 + tunnel-agent: ^0.6.0 + uuid: ^3.3.2 + checksum: 828fafdf57036d5f22d8829c44157a8c112f149b08709e6fd61f43e4f152ca448dd7713cb15861955c71964085f7595443851fa8c7eebcae749be7c63fff9e45 + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 7af7d1bd006a28164bdc6f774be413700bdbd817c9c96857fe6018f8ae804b8faef040ca77dfba9606d08b5ef1c623516aaa677d43c754a2810a3a83deef9ee7 + languageName: node + linkType: hard + +"require-main-filename@npm:^2.0.0": + version: 2.0.0 + resolution: "require-main-filename@npm:2.0.0" + checksum: 6c4488028860b4769145fdb61eaa2a666cd65da1d8bb38bed7eced5a0a6da44f16d3324a0fe17b444cb3832201d0f08186d4e5b7f568b836124287356b19068a + languageName: node + linkType: hard + +"resolve-cwd@npm:^2.0.0": + version: 2.0.0 + resolution: "resolve-cwd@npm:2.0.0" + dependencies: + resolve-from: ^3.0.0 + checksum: 0f001dd6e58b103a1912a79209d4607d20000d2683eb8b54bd08d0a6fad255fea7388699c4dc82185c06f34bd997b0e30d076895c881bafdfc36176322214947 + languageName: node + linkType: hard + +"resolve-from@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-from@npm:3.0.0" + checksum: f6cc584252bcbbad78387e5453896552b141d134700706ff0e2a29eec7a23fad5a926bb51349bf9eadc34608d6a6a5d64ededa291058c298975b79ce621c14d8 + languageName: node + linkType: hard + +"resolve-url@npm:^0.2.1": + version: 0.2.1 + resolution: "resolve-url@npm:0.2.1" + checksum: 16f585f1c8724a891fcd623fdeb3e3f98cfbad72fe8354cae37c0b8aa69aff2a7ac4197c4f143d8b2569aba961dfb69ef652ce05bdc3238b73a33072d21ed0fd + languageName: node + linkType: hard + +"resolve@npm:1.1.7": + version: 1.1.7 + resolution: "resolve@npm:1.1.7" + checksum: c511af443bb6ae6764c11e33c1633d07ea44b5f1795820ea2414fc92215ee7678d6ddd6af74671ced6821523d26d399c51d054384363fda7d9d0e54faab74723 + languageName: node + linkType: hard + +"resolve@npm:1.x": + version: 1.13.1 + resolution: "resolve@npm:1.13.1" + dependencies: + path-parse: ^1.0.6 + checksum: 3403913540dd0d5f4908513878576ff7bcee81b1b48f6d323ffad5090236100ef50d98ea268273746c98742249bad76cae3b38e15d88fd0c0a95c96d28e49052 + languageName: node + linkType: hard + +"resolve@npm:^1.3.2": + version: 1.12.0 + resolution: "resolve@npm:1.12.0" + dependencies: + path-parse: ^1.0.6 + checksum: 256fdc6a9ccc9aff1b49529663f95ee43d030e985f1c5f01bc0d5a5c7fc34ee303fee53320ab411bb84216aeef407c5b0c1ec8bb29d27e7aa614b639e20dc4f5 + languageName: node + linkType: hard + +"ret@npm:~0.1.10": + version: 0.1.15 + resolution: "ret@npm:0.1.15" + checksum: 4fb39958f5f94fad5ddb8e778d3af3629fbcb5588494106402138b63b339e0bdbbc66690f6b574b072b355a702ce3f068df9e9e383a7a4e20cc237bea6bdab9a + languageName: node + linkType: hard + +"rimraf@npm:^2.5.4, rimraf@npm:^2.6.1": + version: 2.6.2 + resolution: "rimraf@npm:2.6.2" + dependencies: + glob: ^7.0.5 + bin: + rimraf: ./bin.js + checksum: e91dcb0b4d96b9cf2f08dbd99c2ecc441165ee547d24e2c22dad1108e32dc7026183c2f7ad808dbb956cc457c17d14998432bb3514a2f84e075194d73e82da58 + languageName: node + linkType: hard + +"rimraf@npm:^2.6.3": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: ^7.1.3 + bin: + rimraf: ./bin.js + checksum: 580678159cca56caf1a5600414716c66ffae68e2c8e31991080f304cf19a3c6b84983cd11405da22bd8b508dd60d492d573bb4e76b7ac8c080cf03f54fcb529e + languageName: node + linkType: hard + +"rimraf@npm:^3.0.0": + version: 3.0.0 + resolution: "rimraf@npm:3.0.0" + dependencies: + glob: ^7.1.3 + bin: + rimraf: ./bin.js + checksum: 52b17e319f8efd5c428a5a9a47337821d862719feedad08f817a0cb2f69ddcfb657a1a660b8b821af86ed32448f58800e1cae9f3557dfacd3e51d7a545574871 + languageName: node + linkType: hard + +"rsvp@npm:^4.8.4": + version: 4.8.5 + resolution: "rsvp@npm:4.8.5" + checksum: a9bbd804a64ec284b080cf00b105dfa7874852be60d5100456d5244f79a63324863b3fd564b70e92a05e571e6c18bc16900b4cccfa3eeadf21ba2185fbebe3d1 + languageName: node + linkType: hard + +"safe-buffer@npm:5.1.2, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 55f6e9116b875a5459a13fd1949d90ed6932f1c6fef70460896abcdf666852cb2119a12435ebbe823416ec49bc3fa5716ff2cc0dd36b9512631148e5113c145e + languageName: node + linkType: hard + +"safe-regex@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex@npm:1.1.0" + dependencies: + ret: ~0.1.10 + checksum: 869186266462f72d6c0ebaea2cd47133ffaec51d1f52e9ecb6fc3af3956bdd944954552dab4e575662bf898e89832c7e181d55c210a3576b68c1a10b50c0bea8 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:^2.0.2": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: cfd3f4d7dc37db071c3b36c8e4315e3912e70f1a44c87936cafb6b3b15af362893ca02da703398fbbc299c1599fa49fca9ddda41ffd347adda417f988848dcf2 + languageName: node + linkType: hard + +"sane@npm:^4.0.3": + version: 4.1.0 + resolution: "sane@npm:4.1.0" + dependencies: + "@cnakazawa/watch": ^1.0.3 + anymatch: ^2.0.0 + capture-exit: ^2.0.0 + exec-sh: ^0.3.2 + execa: ^1.0.0 + fb-watchman: ^2.0.0 + micromatch: ^3.1.4 + minimist: ^1.1.1 + walker: ~1.0.5 + bin: + sane: ./src/cli.js + checksum: f93f2dc9c2dd5377480049cdb1e4a9b21946b54e6a0c128fda122eb9dff415a36acf4a14c114458087d041804ed9956eaff92ee5e202b898c9a7466d1ba37ef3 + languageName: node + linkType: hard + +"sax@npm:^1.2.4": + version: 1.2.4 + resolution: "sax@npm:1.2.4" + checksum: ca31df9cef3645a5a1d39ba2c946287261ef028bc89c06823685c700117bc60d7f02f01786d9f8566fb8620ce0f2d68263a8ae024104d2077c7489ce4b5fec26 + languageName: node + linkType: hard + +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.3.0, semver@npm:^5.4.1, semver@npm:^5.5.0": + version: 5.5.0 + resolution: "semver@npm:5.5.0" + bin: + semver: ./bin/semver + checksum: a422b7f6c4e882e0da5744b76496465a270f8cd7332599353154adaa57d7ca7f03dad0bed4c820f0c4195853d9bc1c8dd77eeb668b164e4fbb2cdd2a7c92ffeb + languageName: node + linkType: hard + +"semver@npm:^5.5, semver@npm:^5.6.0, semver@npm:^5.7.1": + version: 5.7.1 + resolution: "semver@npm:5.7.1" + bin: + semver: ./bin/semver + checksum: dce4680e58a60e12fd7ec1f274635267206e466eaca54e3238f7c49baf33ba07aae8fe8f002a0cf6ec3e8c6f1ccbf158e8f59acc89c1777063e93eb239fe8b76 + languageName: node + linkType: hard + +"semver@npm:^6.0.0, semver@npm:^6.2.0": + version: 6.3.0 + resolution: "semver@npm:6.3.0" + bin: + semver: ./bin/semver.js + checksum: a6207299968942b97da5b31d6499c4152c21157bbbfb35bf9efa308382d1de101b6c5beb481fb77c6ac680854fe9c083062fec6d72ab2a964636b77dd55e1746 + languageName: node + linkType: hard + +"send@npm:0.17.1": + version: 0.17.1 + resolution: "send@npm:0.17.1" + dependencies: + debug: 2.6.9 + depd: ~1.1.2 + destroy: ~1.0.4 + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + etag: ~1.8.1 + fresh: 0.5.2 + http-errors: ~1.7.2 + mime: 1.6.0 + ms: 2.1.1 + on-finished: ~2.3.0 + range-parser: ~1.2.1 + statuses: ~1.5.0 + checksum: ae895afa58b4daf914bd992126308a51e960449090c8518ab394c62f84d30b57daa80f19a6060c06868a3982562732aa125d79b25c993878b9ae3219f3e868fb + languageName: node + linkType: hard + +"serve-static@npm:1.14.1": + version: 1.14.1 + resolution: "serve-static@npm:1.14.1" + dependencies: + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + parseurl: ~1.3.3 + send: 0.17.1 + checksum: 4ea8c736546304788be47aa4cca032af76d8f877cdbcb2b934be517a99fb0ae5b22398a8a2a81382c1bf9edd5b764d0e035b92ca0b0c6464d0d8185ca0dc1ad9 + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0, set-blocking@npm:~2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: f8215d87051e3ace26fef38cefcaed923a20de15bda373ddcc6d1e8cc9f32d27aade1824847e2a4188261005f20fba05485b76f6e1b39d9d099ad1a50e677181 + languageName: node + linkType: hard + +"set-value@npm:^0.4.3": + version: 0.4.3 + resolution: "set-value@npm:0.4.3" + dependencies: + extend-shallow: ^2.0.1 + is-extendable: ^0.1.1 + is-plain-object: ^2.0.1 + to-object-path: ^0.3.0 + checksum: 5885c5484b22a86f4e04d0e4351ed131e8e8614e0a42ac8e077d9db4dfeaf22a2dbbd152ced6c751bab9911e1c987e7ed24d6acf65f4bdb551446abed0b7012c + languageName: node + linkType: hard + +"set-value@npm:^2.0.0": + version: 2.0.0 + resolution: "set-value@npm:2.0.0" + dependencies: + extend-shallow: ^2.0.1 + is-extendable: ^0.1.1 + is-plain-object: ^2.0.3 + split-string: ^3.0.1 + checksum: 79f465a853aeb95db0fbd7b95b3272c06517d8c6dab1c4b6e1eae21c610ae13dbc6b8b27c2a8bd3e352f945151c5ac00a160b75132b1667f76414791acf4d09f + languageName: node + linkType: hard + +"setprototypeof@npm:1.1.1": + version: 1.1.1 + resolution: "setprototypeof@npm:1.1.1" + checksum: b2c43cc075cda6b20a16c8937169dc0401a04a61c567a89613df3bb54fb499cc971f36dc321592201a49c2355469e596e022e9d967e49c6f6c728b57b2737a6f + languageName: node + linkType: hard + +"shebang-command@npm:^1.2.0": + version: 1.2.0 + resolution: "shebang-command@npm:1.2.0" + dependencies: + shebang-regex: ^1.0.0 + checksum: 3d830f3ad0c796f671ad3a8a0ed9ac75a52b21a2f0cfc1e0675fb4d0530e332b10a3b0171f63ef6a2efa14dd7f92a3d03c49927afc9b3529830628671fade78a + languageName: node + linkType: hard + +"shebang-regex@npm:^1.0.0": + version: 1.0.0 + resolution: "shebang-regex@npm:1.0.0" + checksum: fba9381f369e3e5e30e4e1353164243575a82f9b4b0010fc43dab33e7341d86032f9fdc6aa2d122f0737fce69a3c6544c295d9787aa4d522bc24ac1fcaac69d6 + languageName: node + linkType: hard + +"shellwords@npm:^0.1.1": + version: 0.1.1 + resolution: "shellwords@npm:0.1.1" + checksum: 51621b4f6893f1be940a451b11e8704a0bb57a3c396f8f4e4e72b0590e67bcfbbdbc537a590abeee99e2e4e053b9cdf93cf78a391bed38af741eac77c6a46739 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2": + version: 3.0.2 + resolution: "signal-exit@npm:3.0.2" + checksum: b3d9a5567188a680bdb67fb996c2ffe49dfb1db5295d4e55e34ce77ca8e7a9f3f81672b71279fed5dcb2057afd133a5a7d5bd4de4652a8714c668460900f183c + languageName: node + linkType: hard + +"signale@npm:^1.4.0": + version: 1.4.0 + resolution: "signale@npm:1.4.0" + dependencies: + chalk: ^2.3.2 + figures: ^2.0.0 + pkg-conf: ^2.1.0 + checksum: 9afedd784ccd878651766953e08590728592e3a31ba680e832303046487aba3c90b9537bf3c7bf62c02d4647746e579666fb800b53afc9e0ce205a9bbf287e06 + languageName: node + linkType: hard + +"sisteransi@npm:^1.0.3": + version: 1.0.3 + resolution: "sisteransi@npm:1.0.3" + checksum: aea4576b487a9c48ee92aa9e09b3a7517ea733f9f2050ba480771c1924232fd22308140647a8de64929abe82a69374d405798175f01324a04f0a691430e11c91 + languageName: node + linkType: hard + +"slash@npm:^2.0.0": + version: 2.0.0 + resolution: "slash@npm:2.0.0" + checksum: 93ae16664d6ca373786020815ec88a5762c7f0f473346dc514480dc894c864fad76450b069930740a9e25ac3aa34eb8b91bc26582da202d1f21579cffea2fe80 + languageName: node + linkType: hard + +"snapdragon-node@npm:^2.0.1": + version: 2.1.1 + resolution: "snapdragon-node@npm:2.1.1" + dependencies: + define-property: ^1.0.0 + isobject: ^3.0.0 + snapdragon-util: ^3.0.1 + checksum: 31dd514a7b7db7c153edaca98f499f321f76810c3fd956739c8885853948a10341ba4ef65436cf784d190df838907571ed5342eb8f28725b1b23bca67723a181 + languageName: node + linkType: hard + +"snapdragon-util@npm:^3.0.1": + version: 3.0.1 + resolution: "snapdragon-util@npm:3.0.1" + dependencies: + kind-of: ^3.2.0 + checksum: 3234b8bcb05673d90c1cf08dcb3faba39741e62309f4b236465eb593d8137e437c212256f1add5feeb19aa3550d869810270ca870a44b9c3a7ca0c392298e1cd + languageName: node + linkType: hard + +"snapdragon@npm:^0.8.1": + version: 0.8.2 + resolution: "snapdragon@npm:0.8.2" + dependencies: + base: ^0.11.1 + debug: ^2.2.0 + define-property: ^0.2.5 + extend-shallow: ^2.0.1 + map-cache: ^0.2.2 + source-map: ^0.5.6 + source-map-resolve: ^0.5.0 + use: ^3.1.0 + checksum: c73cefa5aad88cc911b8535f53c225c78af66fa4c40262df6fa12270c679fea6789de221fd114b602d33ad15602815a5ade7a8dc1649acd0ba4b906d096f07c9 + languageName: node + linkType: hard + +"source-map-resolve@npm:^0.5.0": + version: 0.5.2 + resolution: "source-map-resolve@npm:0.5.2" + dependencies: + atob: ^2.1.1 + decode-uri-component: ^0.2.0 + resolve-url: ^0.2.1 + source-map-url: ^0.4.0 + urix: ^0.1.0 + checksum: 9cef2b6b5d056dc8f0c42a901360b1504682f95275c3bead3230dec1e912f5c337a88581933b019e220895f474ebc668ffb5cb0783a6a39e4efd4904f846f350 + languageName: node + linkType: hard + +"source-map-support@npm:^0.5.6": + version: 0.5.6 + resolution: "source-map-support@npm:0.5.6" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: e1623f7f702c36d5bd15464d7ed3092c9c025f41b217bfbbe26e8bceab57ca0458b3ca7e05a92990eecde24ca9f6faaed1c3d9fb655778e6ef5b51ff69404224 + languageName: node + linkType: hard + +"source-map-url@npm:^0.4.0": + version: 0.4.0 + resolution: "source-map-url@npm:0.4.0" + checksum: e0c349dab2a73191b40f39e1af4cc7a5fa396f4af8078129dec18d388ae0b8df0338ff98085b47dd449774389abe6a72744fa15853e3ad13fc7538f71404471a + languageName: node + linkType: hard + +"source-map@npm:^0.5.0, source-map@npm:^0.5.6": + version: 0.5.7 + resolution: "source-map@npm:0.5.7" + checksum: 692efad3884fd7ff69fb1087fce61e3bdb14d21458a391cf856c3ddd01fece42dd8be6677042589733a50d783eecc3821769cb08986efb0d2d15cc8aaa2f911d + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: fa17f30e37dfa8d8065fc98e8c51ae80d7050055f90dbd40e8644269bda04707386180c4c43af7104a29af56109663e994ccbc2cf766af01e915285c7f93cc40 + languageName: node + linkType: hard + +"spdx-correct@npm:^3.0.0": + version: 3.0.0 + resolution: "spdx-correct@npm:3.0.0" + dependencies: + spdx-expression-parse: ^3.0.0 + spdx-license-ids: ^3.0.0 + checksum: 398c6e97e9aef7abfde00638a37113a5a517f5e2102217f1be4066546e4e33c0c58990d2ec577b365e5fded70b3159843a5a4e2705cc70d323f254c0a7151663 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.1.0 + resolution: "spdx-exceptions@npm:2.1.0" + checksum: 6e5ac93a3035ef5881d9d1e6c98199c68b8e15a7b669752106bcd0dd4e6635ac4314471e1b35a4bd95a78af58eb8638aaf31a19fdc0266756f14ca540817e29e + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.0": + version: 3.0.0 + resolution: "spdx-expression-parse@npm:3.0.0" + dependencies: + spdx-exceptions: ^2.1.0 + spdx-license-ids: ^3.0.0 + checksum: 9ab573388b389d24d66c3488a0cd59332e44c40cf479ffc0fa78817902ee2b4020e12248ad6190f79737f9b8aaa2907d35755b35e488ae8fc52f1a31df0bba55 + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.0 + resolution: "spdx-license-ids@npm:3.0.0" + checksum: 1e5bf1380c4cebbafa4cbaf398b3182233606a4d54a81291af68f36c1cdc992238432c66a98c7fc355656ead8b04ba23026960894e37279f39dcb270ebf31436 + languageName: node + linkType: hard + +"split-on-first@npm:^1.0.0": + version: 1.1.0 + resolution: "split-on-first@npm:1.1.0" + checksum: 7712c1553ef303b3ae66a361c2817da29dc56338edc02c47927df8880756683ee378b5f64e5028edef367c47ed2290e47a4a583a3ebd1415fe096ed74180cfde + languageName: node + linkType: hard + +"split-string@npm:^3.0.1, split-string@npm:^3.0.2": + version: 3.1.0 + resolution: "split-string@npm:3.1.0" + dependencies: + extend-shallow: ^3.0.0 + checksum: 4d32449493d5c1948b5e25a829c8625bf238875c9cf052250cca00797c643032776aa4436f9d9b8773f7e4a1a6380f5ddaa7c7575a9046e040dae2515cd95a4d + languageName: node + linkType: hard + +"sshpk@npm:^1.7.0": + version: 1.14.2 + resolution: "sshpk@npm:1.14.2" + dependencies: + asn1: ~0.2.3 + assert-plus: ^1.0.0 + bcrypt-pbkdf: ^1.0.0 + dashdash: ^1.12.0 + ecc-jsbn: ~0.1.1 + getpass: ^0.1.1 + jsbn: ~0.1.0 + safer-buffer: ^2.0.2 + tweetnacl: ~0.14.0 + dependenciesMeta: + bcrypt-pbkdf: + optional: true + ecc-jsbn: + optional: true + jsbn: + optional: true + tweetnacl: + optional: true + bin: + sshpk-conv: bin/sshpk-conv + sshpk-sign: bin/sshpk-sign + sshpk-verify: bin/sshpk-verify + checksum: 8a68b367a3b184ea39a24d94bd6f1e051f934e7dfefe2eddf8691cf5a3b1fce9bd531130ea122e17b273dbb483dcf45e22d25b3913c2165d637c0fbb383ba213 + languageName: node + linkType: hard + +"stack-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "stack-utils@npm:1.0.1" + checksum: c59f75398690da2d9622394450effaae1b8aabb8a3c90e4eb004aa444cebe845a9dbe78001f7b1fa8fddbef17dbdb620447e96416145769941a275a105c6df0b + languageName: node + linkType: hard + +"static-extend@npm:^0.1.1": + version: 0.1.2 + resolution: "static-extend@npm:0.1.2" + dependencies: + define-property: ^0.2.5 + object-copy: ^0.1.0 + checksum: c7ae02b5ab9ebf69eb1bea24d1f63f2f96b08e6f8c052c2b506b356c7bfa8d7d551a578d34dc3cb467d7a17336e3ea9c3e56e115219d6d788b6c1a7e4425f562 + languageName: node + linkType: hard + +"statuses@npm:>= 1.5.0 < 2, statuses@npm:~1.5.0": + version: 1.5.0 + resolution: "statuses@npm:1.5.0" + checksum: f9d54c70e9abf0ea577d03e93c4dc13dd6d458740fd913ea6c53378f82638d518a69dee44d480606d4e443faacc19aac628ffabf066f6c88107eaa8b55e3854d + languageName: node + linkType: hard + +"stealthy-require@npm:^1.1.0": + version: 1.1.1 + resolution: "stealthy-require@npm:1.1.1" + checksum: ac27495d1a1d6018109606146a83203471ef1ebadac2c4cd3ea6fd5468596f0a0ba2d5cfcb2d5ffb3a77f8e80379a6ecfd496fbf5a224e9ab88fd675eecf4941 + languageName: node + linkType: hard + +"strict-uri-encode@npm:^2.0.0": + version: 2.0.0 + resolution: "strict-uri-encode@npm:2.0.0" + checksum: 77a40129a8cbae92f1c069b68bea0b53037e9d37f830435d1d6291b49315474d8185fe5cb4ec410bb44e97466432a3970ac9e0efdb33cf36de2499f6ebabdba7 + languageName: node + linkType: hard + +"string-length@npm:^2.0.0": + version: 2.0.0 + resolution: "string-length@npm:2.0.0" + dependencies: + astral-regex: ^1.0.0 + strip-ansi: ^4.0.0 + checksum: 24654589b11241fe13d6315b907781accee984b2701488aefdb2b9b86ace23fa2d92720069306ac6027f41f5daeecbd9c07f6ec09d2aa9f80b4dae7d8a914d0d + languageName: node + linkType: hard + +"string-width@npm:^1.0.1": + version: 1.0.2 + resolution: "string-width@npm:1.0.2" + dependencies: + code-point-at: ^1.0.0 + is-fullwidth-code-point: ^1.0.0 + strip-ansi: ^3.0.0 + checksum: 8acab10b985f1a207f8a6b4689502ea3c9c96e2908774d662169aa8c4bd831f77bf41176fbb86d3d0df5dc997106774e37550e8da878ce6fd8445102afec88bf + languageName: node + linkType: hard + +"string-width@npm:^1.0.2 || 2": + version: 2.1.1 + resolution: "string-width@npm:2.1.1" + dependencies: + is-fullwidth-code-point: ^2.0.0 + strip-ansi: ^4.0.0 + checksum: 0c8d175d8414245688a2ea59bdd600760c7efdaf99571708ce9171a82d3da8bfd2056fb4cd1aca40e6d9854945270a501fedff59fcd1aabaef2eefcdfea1d9ce + languageName: node + linkType: hard + +"string-width@npm:^3.0.0, string-width@npm:^3.1.0": + version: 3.1.0 + resolution: "string-width@npm:3.1.0" + dependencies: + emoji-regex: ^7.0.1 + is-fullwidth-code-point: ^2.0.0 + strip-ansi: ^5.1.0 + checksum: c280f89bae289bd686f095e71c9ecbc97eef2dfacc973c7ed3ce094f51ff44db38cbb0794435e5cfab09c5a395cb21c9422d0c9ce7f07ad12ed61d886f325b02 + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: ~5.1.0 + checksum: 99ca1c4880b1098df6d25f59771f2ef2f1ca13ab6a239b050809d78501f5b8e1d00dcf85dc6153678784b13e990f5b1c634eead820114e32b342e40c1fe91713 + languageName: node + linkType: hard + +"strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": + version: 3.0.1 + resolution: "strip-ansi@npm:3.0.1" + dependencies: + ansi-regex: ^2.0.0 + checksum: 2919e07ae8a9634c111913cc20c6c619109c754108b8d8777ecc92ff999ca1adc84b32a51efd6e6a19168de38b06359d3b31fd1906d905731f3065cc2f9de5d7 + languageName: node + linkType: hard + +"strip-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-ansi@npm:4.0.0" + dependencies: + ansi-regex: ^3.0.0 + checksum: 65d6d40d63adccbf03deeb2919a303ea571933ce3dc463087745da3f5a7c14caa30a2776c3ea2b941c220abf7d4acd8e9922fd4335d5988508ddadbf1aa9d94a + languageName: node + linkType: hard + +"strip-ansi@npm:^5.0.0, strip-ansi@npm:^5.1.0, strip-ansi@npm:^5.2.0": + version: 5.2.0 + resolution: "strip-ansi@npm:5.2.0" + dependencies: + ansi-regex: ^4.1.0 + checksum: 3c00f49debb52a94a878e3d585a3f166d76f27fb415e3bcc1d5257f4694dc418ddec4b15f9fb4122cce095f836d1d7b23e3dc4b5b4fa0a4a2d9a34f370fbf4f7 + languageName: node + linkType: hard + +"strip-bom@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-bom@npm:3.0.0" + checksum: 653e50f7027ab2d8282ead86ad83a4efc7f01070a2573807c0aa15a3f9e8d31362289a5d2ad6275ec654fa56dcb80e2da688268611415fa0b2d1dd609f88e67e + languageName: node + linkType: hard + +"strip-eof@npm:^1.0.0": + version: 1.0.0 + resolution: "strip-eof@npm:1.0.0" + checksum: 20a828d78417a6a92db24ed630967d57c1d323d4da159a79bbdf66032374367729f70ee7076094a29723d33e41a2df8617f1e2083ab85f588a9fdf1786e91b11 + languageName: node + linkType: hard + +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 8d41b14dfd5d71e1ed9b4846291e709cd773f73d4ea6458e096d65c14af43c12b90808934373fedde19f3ecb78057d29430665069af7f3c4e10343f2de956b74 + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0": + version: 5.4.0 + resolution: "supports-color@npm:5.4.0" + dependencies: + has-flag: ^3.0.0 + checksum: 372e24fac8afbb4e7a8a9610d644186569bf529442efea859341aa2c12d22e95c539b12c0950b916837ac619e20ec9877f7730d2e1fba61a0cde2a14b7f3c2f3 + languageName: node + linkType: hard + +"supports-color@npm:^6.1.0": + version: 6.1.0 + resolution: "supports-color@npm:6.1.0" + dependencies: + has-flag: ^3.0.0 + checksum: 164253b8eff0712e1fec3b862d0c4a8cff151e1b3ce7fb4f69a6a59a86d104dc05c4e2b3834ed3f2b5bb279da8fb221b964f6c7984fbd8af56867c95a0e1a8b9 + languageName: node + linkType: hard + +"symbol-tree@npm:^3.2.2": + version: 3.2.2 + resolution: "symbol-tree@npm:3.2.2" + checksum: 11ef9fb4e584898075baadb324fbb426b65ad1f9dfafdb8fe4c782211fb6be105a76c21ff6043ee90ef189d01d64c71419f1e04849a241c5bb04a8b814a558a9 + languageName: node + linkType: hard + +"tar@npm:^4": + version: 4.4.4 + resolution: "tar@npm:4.4.4" + dependencies: + chownr: ^1.0.1 + fs-minipass: ^1.2.5 + minipass: ^2.3.3 + minizlib: ^1.1.0 + mkdirp: ^0.5.0 + safe-buffer: ^5.1.2 + yallist: ^3.0.2 + checksum: 5a303fe3022b507916492aa8d0c90d0f5a11cfb03069d5142e977a65ee4afe82bd9cc948eba0170d6efbc18e04420cc70e9b37249555550b0b4d81965343026c + languageName: node + linkType: hard + +"tar@npm:^4.4.12": + version: 4.4.13 + resolution: "tar@npm:4.4.13" + dependencies: + chownr: ^1.1.1 + fs-minipass: ^1.2.5 + minipass: ^2.8.6 + minizlib: ^1.2.1 + mkdirp: ^0.5.0 + safe-buffer: ^5.1.2 + yallist: ^3.0.3 + checksum: a21f56df0aecd47fc2c847199e99eb96b959bc02fe64e0816bb1746ed83263e7f8c60477b104b0a86058c2852172d0ca85215c10ba80025a477a5052791d3d03 + languageName: node + linkType: hard + +"teremock@workspace:.": + version: 0.0.0-use.local + resolution: "teremock@workspace:." + dependencies: + "@types/node": ^12.12.17 + "@yarnpkg/pnpify": ^2.0.0-rc.12 + body-parser: ^1.19.0 + debug: ^4.1.1 + express: ^4.17.1 + is-ci: ^2.0.0 + jest: ^24.9.0 + make-dir: ^3.0.0 + prettier: 1.19.1 + puppeteer: ^2.0.0 + query-string: ^6.8.3 + rimraf: ^3.0.0 + signale: ^1.4.0 + ts-jest: ^24.2.0 + tslib: ^1.10.0 + typescript: ^3.7.3 + wait-port: ^0.2.6 + languageName: unknown + linkType: soft + +"test-exclude@npm:^5.2.3": + version: 5.2.3 + resolution: "test-exclude@npm:5.2.3" + dependencies: + glob: ^7.1.3 + minimatch: ^3.0.4 + read-pkg-up: ^4.0.0 + require-main-filename: ^2.0.0 + checksum: 3e12476e39deb3447dbd7d4c8f130cddfd1e4de5876e19bd438ed2d62fc1aee15861f091683badde22b8cef14c163d994c869637c0a33288c5023b02588e9c61 + languageName: node + linkType: hard + +"throat@npm:^4.0.0": + version: 4.1.0 + resolution: "throat@npm:4.1.0" + checksum: 8de971dd008ac6af672962e0778fc9854d176c5ed08aa26087f5c9ae83dadc9dcbe72ea3a8b916401320c6a3cfdeae51eaee85a1cb8b69de8de7662574656a5d + languageName: node + linkType: hard + +"tmp@npm:^0.1.0": + version: 0.1.0 + resolution: "tmp@npm:0.1.0" + dependencies: + rimraf: ^2.6.3 + checksum: e3ddd8c38655efe4668abd1a103b61c78c28ae59e938fbb21537809cdf74f71fd5ccfe8f7e52be7386d78c091a1782ae950d4d020021c46f23fb28d021109b00 + languageName: node + linkType: hard + +"tmpl@npm:1.0.x": + version: 1.0.4 + resolution: "tmpl@npm:1.0.4" + checksum: 53f021655d219581fa1635bea8fcc9220ebed7c9a72b6f1964adc83bfa744e73e60cb1dca98e9d2c7a7282f837731931be1cd96112aa4f950338ae296acac33b + languageName: node + linkType: hard + +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: 0ff0bd3e27356443836aa12dba66fea6469563ca42fccb7f74b54d2e41743b2a3c36ae92a0a98178d039dafe1ac6faca87e7ed398514c3511142b7c450d7e9e7 + languageName: node + linkType: hard + +"to-object-path@npm:^0.3.0": + version: 0.3.0 + resolution: "to-object-path@npm:0.3.0" + dependencies: + kind-of: ^3.0.2 + checksum: 9d5a330787effa930b90332e1a8c06d307334683376eb4680a5ba1dc00db7dc406fcb20efdefa96a0ec50cefd63c755303259ca02f6ff4e6bdb3b99b2f6ecac9 + languageName: node + linkType: hard + +"to-regex-range@npm:^2.1.0": + version: 2.1.1 + resolution: "to-regex-range@npm:2.1.1" + dependencies: + is-number: ^3.0.0 + repeat-string: ^1.6.1 + checksum: 9acc7180e0a5c8adaa6b717f36e15f9d19acb69be7dccbd8d914988dae31925f644f08bb0f59b9428c28e9a57d30faae15f7c0989cdb9f18a3b985fc7d83a48b + languageName: node + linkType: hard + +"to-regex@npm:^3.0.1, to-regex@npm:^3.0.2": + version: 3.0.2 + resolution: "to-regex@npm:3.0.2" + dependencies: + define-property: ^2.0.2 + extend-shallow: ^3.0.2 + regex-not: ^1.0.2 + safe-regex: ^1.1.0 + checksum: d8a861ff7d1d17c231eb5cdab3af97865cdaf1b407e7d4a09ba6c9c822b4e21bf774f0605d64e9624b387cc95ae321b1770e3fcb0a357db987fffcb61a9a72a1 + languageName: node + linkType: hard + +"toidentifier@npm:1.0.0": + version: 1.0.0 + resolution: "toidentifier@npm:1.0.0" + checksum: 77baf43c84297a1695a18fadf33cf52caa742d983304dc66a2faea4cdbfce1b56a36c15e8a0744b4d63f53f6770153f9392941cb8e60c556d41737b7741a548a + languageName: node + linkType: hard + +"tough-cookie@npm:>=2.3.3, tough-cookie@npm:^2.3.3, tough-cookie@npm:~2.4.3": + version: 2.4.3 + resolution: "tough-cookie@npm:2.4.3" + dependencies: + psl: ^1.1.24 + punycode: ^1.4.1 + checksum: 4fb852840d622e9e8bb789aa8da960cc03997fd18262b41e038e02bd00ef3a8d190ffae426412d5fef6990af5d42501b8d4adb2a9c8e1100251e1bf5f5166017 + languageName: node + linkType: hard + +"tough-cookie@npm:~2.3.3": + version: 2.3.4 + resolution: "tough-cookie@npm:2.3.4" + dependencies: + punycode: ^1.4.1 + checksum: 80e1c66876d44bb7b682e54dfaf4f7ecb17690d7cb4a252b0ac46c5aff6a3044961d77d0b7713c795598dd5026cbbd486d138bd9239b0a63828b86c4dc26d3c9 + languageName: node + linkType: hard + +"tr46@npm:^1.0.1": + version: 1.0.1 + resolution: "tr46@npm:1.0.1" + dependencies: + punycode: ^2.1.0 + checksum: 2790d3e6251ccc357242d2034214eb02c103794a6f3f570d6baae9debf1858de1604aeb55049c4bb178cc1a2aba501d2ae0970ea8503cd25612dd346bcfc9dd5 + languageName: node + linkType: hard + +"ts-jest@npm:^24.2.0": + version: 24.2.0 + resolution: "ts-jest@npm:24.2.0" + dependencies: + bs-logger: 0.x + buffer-from: 1.x + fast-json-stable-stringify: 2.x + json5: 2.x + lodash.memoize: 4.x + make-error: 1.x + mkdirp: 0.x + resolve: 1.x + semver: ^5.5 + yargs-parser: 10.x + peerDependencies: + jest: ">=24 <25" + bin: + ts-jest: cli.js + checksum: c65274487f3fbeb4fc9333f29523f82fd7846806a1aebe0fc4a2e8b3a859206a4c4376bfe3031876fa171cd02d7bfa1ef534d2a97a974ff1b3116fedc349947f + languageName: node + linkType: hard + +"tslib@npm:^1.10.0": + version: 1.10.0 + resolution: "tslib@npm:1.10.0" + checksum: 626387669b38797372530d84df93dafcc0eca2b3bad31b109c7308b2e8d9c4ed0ba94113eb08a6946aa1fbee3b619fb69dd81f8681654bbc806cf8f208caeb47 + languageName: node + linkType: hard + +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: ^5.0.1 + checksum: 42dde635e062df310cb74826836711913c410ab0141299ac9c06f311fc1d00624f0fbac442695fef06a800e0c7a498cb5532b2ad3ab6357baac47904896e1dde + languageName: node + linkType: hard + +"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": + version: 0.14.5 + resolution: "tweetnacl@npm:0.14.5" + checksum: 8494c8d72852a438fc945a5b290af9e0aaa2f98491ee77022ae14845e403462e63e56379ba3ca917106a54b4007855586b174ad34d0c0ef740998e72e3ecdd60 + languageName: node + linkType: hard + +"type-check@npm:~0.3.2": + version: 0.3.2 + resolution: "type-check@npm:0.3.2" + dependencies: + prelude-ls: ~1.1.2 + checksum: beee3728d8e3bf0081324327013ec33c14633746602c769f2a26df6b26d3d1c7ff89a9dc4f414eac37ddb78e2178d9933edf3075a359ce9136467bbf4873513d + languageName: node + linkType: hard + +"type-is@npm:~1.6.17, type-is@npm:~1.6.18": + version: 1.6.18 + resolution: "type-is@npm:1.6.18" + dependencies: + media-typer: 0.3.0 + mime-types: ~2.1.24 + checksum: 3b24b0076092707b47d4beb06c47ddb3a0539d48d6ec3b6f471c47f98d5a7887dbc47c995fda6cfc29203dcc093aa65dcba88b4837c61a0e2744926f5730486e + languageName: node + linkType: hard + +"typedarray@npm:^0.0.6": + version: 0.0.6 + resolution: "typedarray@npm:0.0.6" + checksum: ac7ba7703641f111b6f3952033ebed4bc68f09afeef7dcc250bcf53653008a119a0904a00183a61e2ef96f19f59de6af28b462005be561612c6ff5dbdf30c8bd + languageName: node + linkType: hard + +"typescript@npm:^3.7.3": + version: 3.7.3 + resolution: "typescript@npm:3.7.3" + bin: + tsc: ./bin/tsc + tsserver: ./bin/tsserver + checksum: 2ddc6164a1c876213e48434d7a40f54960c0eca3af9b38d1cb68ef8809813458575e408863cc88d256353b2ba31c9f21e967f8085d42529d847ec1ea2539bbe6 + languageName: node + linkType: hard + +"uglify-js@npm:^3.1.4": + version: 3.6.8 + resolution: "uglify-js@npm:3.6.8" + dependencies: + commander: ~2.20.3 + source-map: ~0.6.1 + bin: + uglifyjs: bin/uglifyjs + checksum: d197ddcc9d12b54426a4563d9e227bfd8d27edb8d5bd4840065d877800b5ac2a90003901dcca9032554075210327f12cdd7e3515bc68cb8912856b81af741f31 + languageName: node + linkType: hard + +"union-value@npm:^1.0.0": + version: 1.0.0 + resolution: "union-value@npm:1.0.0" + dependencies: + arr-union: ^3.1.0 + get-value: ^2.0.6 + is-extendable: ^0.1.1 + set-value: ^0.4.3 + checksum: a461f0b64a1242c08dbaebf449cccb39cb4e9d2bd8936271ca477dbf76ad8443e1a7edfc9737b8836846853c29a52fe1c75eb589026f4cc5e02296946a1b6ff0 + languageName: node + linkType: hard + +"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": + version: 1.0.0 + resolution: "unpipe@npm:1.0.0" + checksum: 42b49dfde2a9131cc0f6ecd182c66c6ac4e1fb372683a665d131c33be0d009c5b8b76fd1ec4a7a1ec2afb43204e23c61c178a2c6124266d66fdb605ed5196739 + languageName: node + linkType: hard + +"unset-value@npm:^1.0.0": + version: 1.0.0 + resolution: "unset-value@npm:1.0.0" + dependencies: + has-value: ^0.3.1 + isobject: ^3.0.0 + checksum: 0847cb940e83453620e0f2ea35d165bd9d148a2c76f91bbc53a7fb5aec70db1c7f05eb4a30a7a8e7a7b0260ec5ed8bfee63c1e936d77328f68e3beca5bdf743a + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.2.2 + resolution: "uri-js@npm:4.2.2" + dependencies: + punycode: ^2.1.0 + checksum: a81e6af3f3e978391eadbc0425c786867f5ea519234ceece60aeda7d614fb3f025ff195f97a0900b8deb129996296b30b39993b4edce0d85c119833254f8836f + languageName: node + linkType: hard + +"urix@npm:^0.1.0": + version: 0.1.0 + resolution: "urix@npm:0.1.0" + checksum: b168e6b83a11bc6d8d11f43934290b6d3982f890c864f7aa0d02ad36dafb5deee889487dd65b63a4a26e5860d5db949352c997880c8fc13c85c85341e51ac47a + languageName: node + linkType: hard + +"use@npm:^3.1.0": + version: 3.1.1 + resolution: "use@npm:3.1.1" + checksum: 018d13d04a9e0ab07978efb108284b8ad5eb5f510f651f8ef50da597f01e86daa7f156399b2e9f9ed367ada5baefb3751b76b9e7462ba4532136d518cb5d6722 + languageName: node + linkType: hard + +"util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 7bd691844e8e12f228777c3c718efaee35284c4422cf215f394fc2b56b5bbc8fef979fc1ab086e66f195227941270d7267c8105e871617f27fa292ec9fa83933 + languageName: node + linkType: hard + +"util.promisify@npm:^1.0.0": + version: 1.0.0 + resolution: "util.promisify@npm:1.0.0" + dependencies: + define-properties: ^1.1.2 + object.getownpropertydescriptors: ^2.0.3 + checksum: 749a412502972bad49a38d12c70144a8c49cbf752ee17471a83f0aa4a8a942a4bfaf195f5554d7a255e3a34615ae6b51969da8524a577c001a4b50985ea13964 + languageName: node + linkType: hard + +"utils-merge@npm:1.0.1": + version: 1.0.1 + resolution: "utils-merge@npm:1.0.1" + checksum: e43eb20eac16d00e447f229a5ac271e39fd9e2b50eb09fde53140905d75f9ea6c2c644f80b221aec01cec633d45b5b8b31eb174896c3b18146b0d0a32697db5f + languageName: node + linkType: hard + +"uuid@npm:^3.1.0, uuid@npm:^3.3.2": + version: 3.3.2 + resolution: "uuid@npm:3.3.2" + bin: + uuid: ./bin/uuid + checksum: 7724f2bf26901159efe1d807867fa8d1218aad4fee265450924c63f6f7b20d227623dd7e20e47494fad53945c4c7ed7c62385642d9072b8127abc7fc3ad0a7e5 + languageName: node + linkType: hard + +"validate-npm-package-license@npm:^3.0.1": + version: 3.0.3 + resolution: "validate-npm-package-license@npm:3.0.3" + dependencies: + spdx-correct: ^3.0.0 + spdx-expression-parse: ^3.0.0 + checksum: df7bd2ca585bd34ff7ec34934458aaad6dbc61bd7c5252b42fed94b433c0955101dfe7378ab10022406aa22f89a97de8c0f1dc908766383a020fc011d8f91689 + languageName: node + linkType: hard + +"vary@npm:~1.1.2": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: 09e07d2b27e4a8689e1af67a03ca4402aebc2c0e1bf72d1b17cdc9b136eccc4b543072db314fd4dea15f1462c9de2773ceecbd1271eef6506520171f6fc14430 + languageName: node + linkType: hard + +"verror@npm:1.10.0": + version: 1.10.0 + resolution: "verror@npm:1.10.0" + dependencies: + assert-plus: ^1.0.0 + core-util-is: 1.0.2 + extsprintf: ^1.2.0 + checksum: e1632bbbd6b056ac26037da4ebe46ad9934625ad2945823ca7d83027cd9229da47a57347c1933961efd32a8f1ee0e8f099cf4658f1b83b85d3fabe8c813d7a96 + languageName: node + linkType: hard + +"w3c-hr-time@npm:^1.0.1": + version: 1.0.1 + resolution: "w3c-hr-time@npm:1.0.1" + dependencies: + browser-process-hrtime: ^0.1.2 + checksum: a7045ec04da250035330dd5b5efc20fdbc2ce3a72cc1c92259ee240c7183b15e5bed25d3eef3c06f21d1acaca82a7f75661aa6c2f12b2cc3b139e89be720c745 + languageName: node + linkType: hard + +"wait-port@npm:^0.2.6": + version: 0.2.6 + resolution: "wait-port@npm:0.2.6" + dependencies: + chalk: ^2.4.2 + commander: ^3.0.2 + debug: ^4.1.1 + bin: + wait-port: ./bin/wait-port.js + checksum: 8e8ab7de377d579e12bf2c47fc87918dc93b1e71a6c8eac87df409b3a451e34ec05d68c914357169bdb3a95e6e1aa4a258d814688edb85b545118ac5031707b0 + languageName: node + linkType: hard + +"walker@npm:^1.0.7, walker@npm:~1.0.5": + version: 1.0.7 + resolution: "walker@npm:1.0.7" + dependencies: + makeerror: 1.0.x + checksum: 904324af25511e01dad2bde8726fed03984e217119020d9ac8d8875e618e2e7fb9822ba4b193432204cace3fea8b7fb4f761593c0acbee6c7eff1118370d6055 + languageName: node + linkType: hard + +"webidl-conversions@npm:^4.0.2": + version: 4.0.2 + resolution: "webidl-conversions@npm:4.0.2" + checksum: 652b280d3d94bb94423c1fe67a2985fb37b967ec9624f9d65d0741ab2b12e669074ba2d54c4e2a1d43552086b90a94ee06f6596b04ae5e85ce0abf2b2345097f + languageName: node + linkType: hard + +"whatwg-encoding@npm:^1.0.1, whatwg-encoding@npm:^1.0.3": + version: 1.0.3 + resolution: "whatwg-encoding@npm:1.0.3" + dependencies: + iconv-lite: 0.4.19 + checksum: c614a52acd08868521c959c8070610e9d3c6fdd1f92f496ff3c88618de3f7907f9f85a495535f838111ab6163d9bf8699664a04908696fcddf469e0d36d52ddd + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^2.0.0, whatwg-mimetype@npm:^2.1.0": + version: 2.1.0 + resolution: "whatwg-mimetype@npm:2.1.0" + checksum: 46d5c8485bb00592a66f90559865d82c69a211ce40ba050bcd5deaff1a8b9e9bd7f7b89a7b3e3b6838fedb18ba0737e59625ecc456a3d62e39288e545441f595 + languageName: node + linkType: hard + +"whatwg-url@npm:^6.4.0, whatwg-url@npm:^6.4.1": + version: 6.5.0 + resolution: "whatwg-url@npm:6.5.0" + dependencies: + lodash.sortby: ^4.7.0 + tr46: ^1.0.1 + webidl-conversions: ^4.0.2 + checksum: e23ae8b02eedcdc34a25d02334119c854bc1dd05e4a1dd80607ff767d796111af0b836c674884b7f3f8a6f1d43ff39d342fa830fc64df988069f21fb4086f294 + languageName: node + linkType: hard + +"which-module@npm:^2.0.0": + version: 2.0.0 + resolution: "which-module@npm:2.0.0" + checksum: 1f90d98b64a16da8cc614ae7373df97973ded10ae3b0ef3fe6e9a836f6a46dad77d99b6148791fd4191d45a42a7481fc952414650a896494d2d04448e568e905 + languageName: node + linkType: hard + +"which@npm:^1.2.9, which@npm:^1.3.0, which@npm:^1.3.1": + version: 1.3.1 + resolution: "which@npm:1.3.1" + dependencies: + isexe: ^2.0.0 + bin: + which: ./bin/which + checksum: 8c639095289e694cbce93f17662e56f740ceafb8d73cdccf0d2b2968df0e8b9c8ddf16f44711d1d5a5efe4d2091cb3ca06d1afa2db359df48588a71a4b60d0c6 + languageName: node + linkType: hard + +"wide-align@npm:^1.1.0": + version: 1.1.3 + resolution: "wide-align@npm:1.1.3" + dependencies: + string-width: ^1.0.2 || 2 + checksum: 9b707815701d80647cdd92acc907e1d386f387b404c63427a116ae8a9b478daa7561d271226e665b7a39d88274c1abfefa63bedd8776b7b4eb958184b3a2df9d + languageName: node + linkType: hard + +"wordwrap@npm:~0.0.2": + version: 0.0.3 + resolution: "wordwrap@npm:0.0.3" + checksum: 23e585299f6268d7e876917e02472227a1edbbb0e473f26aa9b502b20affadfa9c4958ce7d0b1cefea429b3369dc6112883e98baf09a0fc003ff692ff5b9dbd4 + languageName: node + linkType: hard + +"wordwrap@npm:~1.0.0": + version: 1.0.0 + resolution: "wordwrap@npm:1.0.0" + checksum: 1e54504346e84b862eab11464e32c04b1f9b197523cb50caa07ccb2f80e3b2e6b070912dd7b538027be9cc9b7d74857fd16a8c2a1b08729c9d225fcf23cf799c + languageName: node + linkType: hard + +"wrap-ansi@npm:^5.1.0": + version: 5.1.0 + resolution: "wrap-ansi@npm:5.1.0" + dependencies: + ansi-styles: ^3.2.0 + string-width: ^3.0.0 + strip-ansi: ^5.0.0 + checksum: a0065345184fa1eee0f846fb682d46ee38ffa3c24affe38e76cb30efa6b2684b8278ce010934966cbe044f2e332ee4d68c296bf64bd1060660a46f609ed6fa67 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 0796da084f06bced2351fed9686a7211f4a4b774a7a3b64c7ead1b3bef162b1721f2a1d3fb1268bf2e848c9d743eca189c2a243159a1512d5dfab4b0d4dd60b5 + languageName: node + linkType: hard + +"write-file-atomic@npm:2.4.1": + version: 2.4.1 + resolution: "write-file-atomic@npm:2.4.1" + dependencies: + graceful-fs: ^4.1.11 + imurmurhash: ^0.1.4 + signal-exit: ^3.0.2 + checksum: 92587a24f3cdd1ce276097ad4e1e759d2fbb5e3a66f81acbd36763f9faf28099cf1ab4b08d4fbe3f0e2cff1dcf893374866c7636d615c2cc7db5435f804b2095 + languageName: node + linkType: hard + +"ws@npm:^4.0.0": + version: 4.1.0 + resolution: "ws@npm:4.1.0" + dependencies: + async-limiter: ~1.0.0 + safe-buffer: ~5.1.0 + checksum: 2989194db20a498411773dfe3edf06e430039a14d597e9b6ea9312a04a0247d8df0626e5a522f508cd10d6e88768c94a3657c21f5b3055fada4433e66627d226 + languageName: node + linkType: hard + +"ws@npm:^6.1.0": + version: 6.2.1 + resolution: "ws@npm:6.2.1" + dependencies: + async-limiter: ~1.0.0 + checksum: 731ad2205472faf91c33e09240cf36f0941e7e627c1adb3287d00810e1b308cc346526eeca6ef2f60f12be2313c3a76582bd1ff4c12d6aec6968457273741e6f + languageName: node + linkType: hard + +"xml-name-validator@npm:^3.0.0": + version: 3.0.0 + resolution: "xml-name-validator@npm:3.0.0" + checksum: d8e776efffd0df6b0b202568bfbd33f2a9973f2bb6fa89e06f3b4c97257ef41bb22f5b6e39ec90ac9b2f2332f36fc64af2ee58f208aaac86edd2b36010e1278d + languageName: node + linkType: hard + +"y18n@npm:^4.0.0": + version: 4.0.0 + resolution: "y18n@npm:4.0.0" + checksum: f3fcafde11e668d66a061d4cdb49243a2cac83012193666941728d6e8002e2022c22c3ac318123b2ff84d8c99ff4c0b0764e2ac6dfd8c8df3488305724387f78 + languageName: node + linkType: hard + +"yallist@npm:^3.0.0, yallist@npm:^3.0.2": + version: 3.0.2 + resolution: "yallist@npm:3.0.2" + checksum: 9b5c703ce72e9a0bc5ef058f9a18f80ee24c76f17bc25d59c303d1e9e0b7951466d0786193c26850d42152090adcf299f8360a4700abaf777e4c5a52063da1c3 + languageName: node + linkType: hard + +"yallist@npm:^3.0.3": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 96944f7521c3b45bac838a9893abe0d731b76ce32d2d794cb8633e93371ae9662c0fa2c05a114b588bc2972413c01c55e4925f15202257429f7f6844e4d7f174 + languageName: node + linkType: hard + +"yargs-parser@npm:10.x": + version: 10.1.0 + resolution: "yargs-parser@npm:10.1.0" + dependencies: + camelcase: ^4.1.0 + checksum: 3b9acbc2631668870d58762101d588666410f0c55fa403abd7bd48a9c0b72c2d8e8da06e712db2cdd8399f2be5286539ff98d02d5046a12086a3ac8eae2f6cc6 + languageName: node + linkType: hard + +"yargs-parser@npm:^13.1.1": + version: 13.1.1 + resolution: "yargs-parser@npm:13.1.1" + dependencies: + camelcase: ^5.0.0 + decamelize: ^1.2.0 + checksum: 5c5ee4b20cc38d3f956109a9b888aa038d853617aaea7f652cd64994ad63da271346e0e6a023ea956b1e9fa5a0b7c13d7dcb47877c9b609cc6d01d05e8089b2a + languageName: node + linkType: hard + +"yargs@npm:^13.3.0": + version: 13.3.0 + resolution: "yargs@npm:13.3.0" + dependencies: + cliui: ^5.0.0 + find-up: ^3.0.0 + get-caller-file: ^2.0.1 + require-directory: ^2.1.1 + require-main-filename: ^2.0.0 + set-blocking: ^2.0.0 + string-width: ^3.0.0 + which-module: ^2.0.0 + y18n: ^4.0.0 + yargs-parser: ^13.1.1 + checksum: ec4786ce16563576ddbb392a940e4d411d7caed50cb4fa2466aa9e97f1edfeee065cda9361c13be21f6132991975ba4b899cb3d5acbe747d30e31f0cdf8de16a + languageName: node + linkType: hard + +"yauzl@npm:2.4.1": + version: 2.4.1 + resolution: "yauzl@npm:2.4.1" + dependencies: + fd-slicer: ~1.0.1 + checksum: 83fed93b3240a59c2371af89d9578640e43e31e38de02e47d1c37b59f9330aa3842e7d9f34f219ac4af74c831288d52efad67d5cf6fb1644619133faf3760f17 + languageName: node + linkType: hard