├── .github └── workflows │ └── nodejs.yaml ├── .gitignore ├── .npmignore ├── .opensource └── project.json ├── .prettierignore ├── .prettierrc.json ├── .travis.yml ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── assets └── logo.png ├── jest.config.js ├── package-lock.json ├── package.json ├── src ├── firegraph │ ├── CacheManager.ts │ ├── Collection.ts │ ├── Document.ts │ ├── Order.ts │ └── Where.ts ├── index.ts └── types │ ├── Firegraph.ts │ └── GraphQL.ts ├── test ├── alias.test.ts ├── cache.test.ts ├── collections.test.ts ├── documentReference.test.ts ├── firebase │ └── index.ts ├── limit.test.ts ├── order.test.ts └── where.test.ts └── tsconfig.json /.github/workflows/nodejs.yaml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Build 5 | 6 | on: 7 | push: 8 | branches: [main] 9 | pull_request: 10 | branches: [main] 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | 16 | strategy: 17 | matrix: 18 | node-version: [12.x, 14.x, 16.x] 19 | steps: 20 | - uses: actions/checkout@v2 21 | - name: Use Node.js ${{ matrix.node-version }} 22 | uses: actions/setup-node@v2 23 | with: 24 | node-version: ${{ matrix.node-version }} 25 | cache: 'npm' 26 | - run: npm ci 27 | - run: npm run build --if-present 28 | - run: npm test 29 | env: 30 | FIREBASE_API_KEY: ${{secrets.FIREBASE_API_KEY}} 31 | FIREBASE_AUTH_DOMAIN: ${{secrets.FIREBASE_AUTH_DOMAIN}} 32 | FIREBASE_DATABASE_URL: ${{secrets.FIREBASE_DATABASE_URL}} 33 | FIREBASE_PROJECT_ID: ${{secrets.FIREBASE_PROJECT_ID}} 34 | FIREBASE_STORAGE_BUCKET: ${{secrets.FIREBASE_STORAGE_BUCKET}} 35 | FIREBASE_MESSAGING_SENDER_ID: ${{secrets.FIREBASE_MESSAGING_SENDER_ID}} 36 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | 63 | # build output 64 | lib/ -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # This file is intentionally left blank. 2 | !lib/ -------------------------------------------------------------------------------- /.opensource/project.json: -------------------------------------------------------------------------------- 1 | { 2 | // Display name for the project 3 | "name": "Firegraph", 4 | 5 | // Platforms this repository supports. 6 | // Options are Android, iOS, Web, and Games. 7 | "platforms": [ 8 | "Web" 9 | ], 10 | 11 | // Main content file 12 | "content": "README.md", 13 | 14 | // Non-README markdown pages to render 15 | "pages" : [], 16 | 17 | // Related projects on Github, in the format $owner/$repo 18 | "related": [], 19 | 20 | // (optional) Links to external resources 21 | "tabs": [] 22 | } 23 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | jest.config.js 2 | package.json 3 | tsconfig.json 4 | lib/ 5 | .opensource/ 6 | .prettierrc.json 7 | .travis.yml -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote":true 3 | } -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "node" 4 | - "lts/*" -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "editor.tabSize": 2 4 | } 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Sam Roth 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 |

GraphQL Superpowers for Google Cloud Firestore

5 | 6 |

7 | 8 | npm version 9 | 10 | 11 | nodejs build 12 | 13 |

14 | 15 | > This is **not** an official Google product, nor is it maintained or supported by Google employees. For support with Firebase or Firestore, please [click here](https://firebase.google.com/support/). 16 | 17 | --- 18 | 19 | # Introduction 20 | 21 | [Cloud Firestore](https://cloud.google.com/firestore/docs/) is a NoSQL document database built for automatic scaling, high performance, and ease of application development. While the Cloud Firestore interface has many of the same features as traditional databases, as a NoSQL database it differs from them in the way it describes relationships between data objects. It is a part of the Google Cloud platform, and a spiritual successor to the Firebase Real-Time Database. 22 | 23 | Firestore makes it easy to securely store and retrieve data, and already has a powerful API for querying data. **Firegraph** builds on that awesome foundation by making it even easier to retrieve data across collections, subcollections, and document references. 24 | 25 | ## Primary Goals 26 | 27 | - **Wrap the Firestore SDK in its entirety.** This means that, in time, we hope to support features like real-time updates, caching, index management, and other APIs available through Firestore's SDK. 28 | - **Leverage features of GraphQL query syntax.** When creating this library, I initially planned to create a "GraphQL-esque" query language specifically for Firestore. I have since decided that is the wrong way to go, and opted to ensure that all Firegraph queries are valid GraphQL. This should make it easier if you decide to roll your own GraphQL backend at some point. 29 | - **Operate as a lightweight wrapper.** As we move toward supporting all Firestore APIs, the goal is to also introduce support for some common (but not directly supported) Firestore use cases. That said, Firegraph should retain a small footprint and avoid depending on other NPM modules as much as possible. 30 | 31 | # Getting Started 32 | 33 | Getting started with Firegraph is very easy! **You do not need to host a GraphQL server to use Firegraph.** However, your project does require some GraphQL-related dependencies. 34 | 35 | ## Installing 36 | 37 | ```bash 38 | # npm 39 | npm install --save graphql graphql-tag firegraph 40 | 41 | # Yarn 42 | yarn add graphql graphql-tag firegraph 43 | ``` 44 | 45 | ## Queries 46 | 47 | You can either write queries inside your JavaScript files with `gql`, or if you use webpack, you can use `graphql-tag/loader` to import GraphQL query files (`*.graphql`) directly. 48 | 49 | ### Collections 50 | 51 | Every top-level name in a `query` is considered a Firestore collection. For 52 | example, in the query below, we are querying every document in the `posts` 53 | collection and retrieving the `id`, `title`, and `body` values from each 54 | document in the response. Note: `id` is a special field that actually retrieves 55 | the document key. 56 | 57 | ```typescript 58 | const { posts } = await firegraph.resolve( 59 | firestore, 60 | gql` 61 | query { 62 | posts { 63 | id 64 | title 65 | body 66 | } 67 | } 68 | ` 69 | ); 70 | ``` 71 | 72 | ### Subcollections 73 | 74 | When you have nested values (e.g. in the query below), they are processed 75 | as child collections. To clarify, for each `doc` in the `posts` collection, 76 | we also retrieve the `posts/${doc.id}/comments` collection. This result is 77 | stored in the `comments` key for each document that is returned. 78 | 79 | ```typescript 80 | const { posts: postsWithComments } = await firegraph.resolve( 81 | firestore, 82 | gql` 83 | query { 84 | posts { 85 | id 86 | title 87 | body 88 | comments { 89 | id 90 | body 91 | } 92 | } 93 | } 94 | ` 95 | ); 96 | ``` 97 | 98 | ### Document References 99 | 100 | If `post.author` is a `DocumentReference` field, it is considered as a complete path to the document from the root of the database. 101 | 102 | If `post.author` is a `String` type of field, it is also considered as a complete path to document. However, you can optionally provide a parent path to the document collection using the `path` argument. Note that path argument must end in a `"/"` to be valid. 103 | 104 | ```typescript 105 | const { posts: postsWithAuthorAndComments } = await firegraph.resolve( 106 | firestore, 107 | gql` 108 | query { 109 | posts { 110 | id 111 | title 112 | body 113 | 114 | # Here author is either a DocumentReference type of field 115 | # or is a String field with complete path to the document 116 | author { 117 | id 118 | displayName 119 | } 120 | 121 | comments { 122 | id 123 | body 124 | 125 | # Here author's id is only saved in the field, 126 | # hence parent path to document is provided 127 | authorId(path: "users/") { 128 | id 129 | displayName 130 | } 131 | } 132 | } 133 | } 134 | ` 135 | ); 136 | ``` 137 | 138 | ### Filtering Results 139 | 140 | One of our primary goals is to wrap the Firestore API in its entirety. That said, the `where` 141 | clause in Firegraph maps directly to the expected behavior in Firestore: 142 | 143 | - `someKey: someValue` maps to `.where(someKey, '==', someValue)` 144 | - `someKey_gt: someValue` maps to `.where(someKey, '>', someValue)` 145 | - `someKey_gte: someValue` maps to `.where(someKey, '>=', someValue)` 146 | - `someKey_lt: someValue` maps to `.where(someKey, '<', someValue)` 147 | - `someKey_lte: someValue` maps to `.where(someKey, '>=', someValue)` 148 | - `someKey_contains: someValue` maps to `.where(someKey, 'array-contains', someValue)` 149 | 150 | For the last one, of course, `someKey` would have to use Firestore's array type. All of the restrictions 151 | related to compound queries with Firestore (no logical OR or inequality testing) still apply but those 152 | are some of the first things we are hoping to add support for. 153 | 154 | ```typescript 155 | const authorId = 'sZOgUC33ijsGSzX17ybT'; 156 | const { posts: postsBySomeAuthor } = await firegraph.resolve( 157 | firestore, 158 | gql` 159 | query { 160 | posts(where: { 161 | author: ${authorId}, 162 | }) { 163 | id 164 | message 165 | author { 166 | id 167 | displayName 168 | } 169 | } 170 | } 171 | ` 172 | ); 173 | ``` 174 | 175 | ### Ordering Results 176 | 177 | The result of sub/collections can be ordered by using the `orderBy` clause, with providing an object containing fields and their order type of either `asc`ending or `desc`ending 178 | 179 | ```typescript 180 | const { posts } = await firegraph.resolve( 181 | firestore, 182 | gql` 183 | query { 184 | posts(orderBy: { createdOn: "desc", title: "asc" }) { 185 | id 186 | title 187 | createdOn 188 | body 189 | } 190 | } 191 | ` 192 | ); 193 | ``` 194 | 195 | **NOTE:** The `indexes` for ordering fields _must be created beforehand_ in firebase console, and those fields _should be part of the query_. 196 | 197 | ### Limiting Results 198 | 199 | To limit the loading of documents to a certain number in a sub/collection query, `limit` argument can be supplied to the query. 200 | 201 | ```typescript 202 | const { posts } = await firegraph.resolve( 203 | firestore, 204 | gql` 205 | query { 206 | posts(limit: 10) { 207 | id 208 | title 209 | body 210 | comments(limit: 10) { 211 | id 212 | message 213 | } 214 | } 215 | } 216 | ` 217 | ); 218 | ``` 219 | 220 | # Roadmap 221 | 222 | - [x] Querying values from collections 223 | - [x] Querying nested collections 224 | - [ ] GraphQL mutations allowing updates to multiple documents at once 225 | - [ ] Basic search functionality (on par with current Firestore API) 226 | - [ ] More advanced search functionality (GraphQL params, fragments, etc) 227 | 228 | # Contributing 229 | 230 | Thank you for your interest! You are welcome (and encouraged) to submit Issues and Pull Requests. If you want to add features, check out the roadmap above (which will have more information as time passes). You are welcome to ping me on Twitter as well: [@sjroot](https://twitter.com/sjroot) 231 | 232 | ## New Features 233 | 234 | To submit a new feature, you should follow these steps: 235 | 236 | 1. Clone the repository and write tests that describe how your new feature is used and the results you would expect. 237 | 2. Implement the appropriate changes to our code base. The `test` directory includes a Firestore instance that is ready to go; just provide your Firebase app config as environment variables. 238 | 3. Submit a PR once you've implemented changes and ensured that your new tests pass without causing problems with other tests. 239 | -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sejr/firegraph/58f05722ab6adb893eb1fc35ad77dff7f1bc2ffb/assets/logo.png -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: 'ts-jest', 3 | testEnvironment: 'node', 4 | }; -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "firegraph", 3 | "version": "1.0.14", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.14.5", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", 10 | "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.14.5" 14 | } 15 | }, 16 | "@babel/compat-data": { 17 | "version": "7.14.7", 18 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", 19 | "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", 20 | "dev": true 21 | }, 22 | "@babel/core": { 23 | "version": "7.14.8", 24 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz", 25 | "integrity": "sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/code-frame": "^7.14.5", 29 | "@babel/generator": "^7.14.8", 30 | "@babel/helper-compilation-targets": "^7.14.5", 31 | "@babel/helper-module-transforms": "^7.14.8", 32 | "@babel/helpers": "^7.14.8", 33 | "@babel/parser": "^7.14.8", 34 | "@babel/template": "^7.14.5", 35 | "@babel/traverse": "^7.14.8", 36 | "@babel/types": "^7.14.8", 37 | "convert-source-map": "^1.7.0", 38 | "debug": "^4.1.0", 39 | "gensync": "^1.0.0-beta.2", 40 | "json5": "^2.1.2", 41 | "semver": "^6.3.0", 42 | "source-map": "^0.5.0" 43 | }, 44 | "dependencies": { 45 | "source-map": { 46 | "version": "0.5.7", 47 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 48 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 49 | "dev": true 50 | } 51 | } 52 | }, 53 | "@babel/generator": { 54 | "version": "7.14.8", 55 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", 56 | "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", 57 | "dev": true, 58 | "requires": { 59 | "@babel/types": "^7.14.8", 60 | "jsesc": "^2.5.1", 61 | "source-map": "^0.5.0" 62 | }, 63 | "dependencies": { 64 | "source-map": { 65 | "version": "0.5.7", 66 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 67 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 68 | "dev": true 69 | } 70 | } 71 | }, 72 | "@babel/helper-compilation-targets": { 73 | "version": "7.14.5", 74 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", 75 | "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", 76 | "dev": true, 77 | "requires": { 78 | "@babel/compat-data": "^7.14.5", 79 | "@babel/helper-validator-option": "^7.14.5", 80 | "browserslist": "^4.16.6", 81 | "semver": "^6.3.0" 82 | } 83 | }, 84 | "@babel/helper-function-name": { 85 | "version": "7.14.5", 86 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", 87 | "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", 88 | "dev": true, 89 | "requires": { 90 | "@babel/helper-get-function-arity": "^7.14.5", 91 | "@babel/template": "^7.14.5", 92 | "@babel/types": "^7.14.5" 93 | } 94 | }, 95 | "@babel/helper-get-function-arity": { 96 | "version": "7.14.5", 97 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", 98 | "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", 99 | "dev": true, 100 | "requires": { 101 | "@babel/types": "^7.14.5" 102 | } 103 | }, 104 | "@babel/helper-hoist-variables": { 105 | "version": "7.14.5", 106 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", 107 | "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", 108 | "dev": true, 109 | "requires": { 110 | "@babel/types": "^7.14.5" 111 | } 112 | }, 113 | "@babel/helper-member-expression-to-functions": { 114 | "version": "7.14.7", 115 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", 116 | "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", 117 | "dev": true, 118 | "requires": { 119 | "@babel/types": "^7.14.5" 120 | } 121 | }, 122 | "@babel/helper-module-imports": { 123 | "version": "7.14.5", 124 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", 125 | "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", 126 | "dev": true, 127 | "requires": { 128 | "@babel/types": "^7.14.5" 129 | } 130 | }, 131 | "@babel/helper-module-transforms": { 132 | "version": "7.14.8", 133 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.8.tgz", 134 | "integrity": "sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA==", 135 | "dev": true, 136 | "requires": { 137 | "@babel/helper-module-imports": "^7.14.5", 138 | "@babel/helper-replace-supers": "^7.14.5", 139 | "@babel/helper-simple-access": "^7.14.8", 140 | "@babel/helper-split-export-declaration": "^7.14.5", 141 | "@babel/helper-validator-identifier": "^7.14.8", 142 | "@babel/template": "^7.14.5", 143 | "@babel/traverse": "^7.14.8", 144 | "@babel/types": "^7.14.8" 145 | } 146 | }, 147 | "@babel/helper-optimise-call-expression": { 148 | "version": "7.14.5", 149 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", 150 | "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", 151 | "dev": true, 152 | "requires": { 153 | "@babel/types": "^7.14.5" 154 | } 155 | }, 156 | "@babel/helper-plugin-utils": { 157 | "version": "7.14.5", 158 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", 159 | "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", 160 | "dev": true 161 | }, 162 | "@babel/helper-replace-supers": { 163 | "version": "7.14.5", 164 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", 165 | "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", 166 | "dev": true, 167 | "requires": { 168 | "@babel/helper-member-expression-to-functions": "^7.14.5", 169 | "@babel/helper-optimise-call-expression": "^7.14.5", 170 | "@babel/traverse": "^7.14.5", 171 | "@babel/types": "^7.14.5" 172 | } 173 | }, 174 | "@babel/helper-simple-access": { 175 | "version": "7.14.8", 176 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", 177 | "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", 178 | "dev": true, 179 | "requires": { 180 | "@babel/types": "^7.14.8" 181 | } 182 | }, 183 | "@babel/helper-split-export-declaration": { 184 | "version": "7.14.5", 185 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", 186 | "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", 187 | "dev": true, 188 | "requires": { 189 | "@babel/types": "^7.14.5" 190 | } 191 | }, 192 | "@babel/helper-validator-identifier": { 193 | "version": "7.14.8", 194 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", 195 | "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", 196 | "dev": true 197 | }, 198 | "@babel/helper-validator-option": { 199 | "version": "7.14.5", 200 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", 201 | "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", 202 | "dev": true 203 | }, 204 | "@babel/helpers": { 205 | "version": "7.14.8", 206 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", 207 | "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", 208 | "dev": true, 209 | "requires": { 210 | "@babel/template": "^7.14.5", 211 | "@babel/traverse": "^7.14.8", 212 | "@babel/types": "^7.14.8" 213 | } 214 | }, 215 | "@babel/highlight": { 216 | "version": "7.14.5", 217 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", 218 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", 219 | "dev": true, 220 | "requires": { 221 | "@babel/helper-validator-identifier": "^7.14.5", 222 | "chalk": "^2.0.0", 223 | "js-tokens": "^4.0.0" 224 | }, 225 | "dependencies": { 226 | "ansi-styles": { 227 | "version": "3.2.1", 228 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 229 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 230 | "dev": true, 231 | "requires": { 232 | "color-convert": "^1.9.0" 233 | } 234 | }, 235 | "chalk": { 236 | "version": "2.4.2", 237 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 238 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 239 | "dev": true, 240 | "requires": { 241 | "ansi-styles": "^3.2.1", 242 | "escape-string-regexp": "^1.0.5", 243 | "supports-color": "^5.3.0" 244 | } 245 | }, 246 | "color-convert": { 247 | "version": "1.9.3", 248 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 249 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 250 | "dev": true, 251 | "requires": { 252 | "color-name": "1.1.3" 253 | } 254 | }, 255 | "color-name": { 256 | "version": "1.1.3", 257 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 258 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 259 | "dev": true 260 | }, 261 | "escape-string-regexp": { 262 | "version": "1.0.5", 263 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 264 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 265 | "dev": true 266 | }, 267 | "has-flag": { 268 | "version": "3.0.0", 269 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 270 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 271 | "dev": true 272 | }, 273 | "supports-color": { 274 | "version": "5.5.0", 275 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 276 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 277 | "dev": true, 278 | "requires": { 279 | "has-flag": "^3.0.0" 280 | } 281 | } 282 | } 283 | }, 284 | "@babel/parser": { 285 | "version": "7.14.8", 286 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", 287 | "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==", 288 | "dev": true 289 | }, 290 | "@babel/plugin-syntax-async-generators": { 291 | "version": "7.8.4", 292 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", 293 | "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", 294 | "dev": true, 295 | "requires": { 296 | "@babel/helper-plugin-utils": "^7.8.0" 297 | } 298 | }, 299 | "@babel/plugin-syntax-bigint": { 300 | "version": "7.8.3", 301 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", 302 | "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", 303 | "dev": true, 304 | "requires": { 305 | "@babel/helper-plugin-utils": "^7.8.0" 306 | } 307 | }, 308 | "@babel/plugin-syntax-class-properties": { 309 | "version": "7.12.13", 310 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", 311 | "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", 312 | "dev": true, 313 | "requires": { 314 | "@babel/helper-plugin-utils": "^7.12.13" 315 | } 316 | }, 317 | "@babel/plugin-syntax-import-meta": { 318 | "version": "7.10.4", 319 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", 320 | "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", 321 | "dev": true, 322 | "requires": { 323 | "@babel/helper-plugin-utils": "^7.10.4" 324 | } 325 | }, 326 | "@babel/plugin-syntax-json-strings": { 327 | "version": "7.8.3", 328 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", 329 | "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", 330 | "dev": true, 331 | "requires": { 332 | "@babel/helper-plugin-utils": "^7.8.0" 333 | } 334 | }, 335 | "@babel/plugin-syntax-logical-assignment-operators": { 336 | "version": "7.10.4", 337 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", 338 | "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", 339 | "dev": true, 340 | "requires": { 341 | "@babel/helper-plugin-utils": "^7.10.4" 342 | } 343 | }, 344 | "@babel/plugin-syntax-nullish-coalescing-operator": { 345 | "version": "7.8.3", 346 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", 347 | "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", 348 | "dev": true, 349 | "requires": { 350 | "@babel/helper-plugin-utils": "^7.8.0" 351 | } 352 | }, 353 | "@babel/plugin-syntax-numeric-separator": { 354 | "version": "7.10.4", 355 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", 356 | "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", 357 | "dev": true, 358 | "requires": { 359 | "@babel/helper-plugin-utils": "^7.10.4" 360 | } 361 | }, 362 | "@babel/plugin-syntax-object-rest-spread": { 363 | "version": "7.8.3", 364 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", 365 | "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", 366 | "dev": true, 367 | "requires": { 368 | "@babel/helper-plugin-utils": "^7.8.0" 369 | } 370 | }, 371 | "@babel/plugin-syntax-optional-catch-binding": { 372 | "version": "7.8.3", 373 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", 374 | "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", 375 | "dev": true, 376 | "requires": { 377 | "@babel/helper-plugin-utils": "^7.8.0" 378 | } 379 | }, 380 | "@babel/plugin-syntax-optional-chaining": { 381 | "version": "7.8.3", 382 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", 383 | "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", 384 | "dev": true, 385 | "requires": { 386 | "@babel/helper-plugin-utils": "^7.8.0" 387 | } 388 | }, 389 | "@babel/plugin-syntax-top-level-await": { 390 | "version": "7.14.5", 391 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", 392 | "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", 393 | "dev": true, 394 | "requires": { 395 | "@babel/helper-plugin-utils": "^7.14.5" 396 | } 397 | }, 398 | "@babel/plugin-syntax-typescript": { 399 | "version": "7.14.5", 400 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", 401 | "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", 402 | "dev": true, 403 | "requires": { 404 | "@babel/helper-plugin-utils": "^7.14.5" 405 | } 406 | }, 407 | "@babel/template": { 408 | "version": "7.14.5", 409 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", 410 | "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", 411 | "dev": true, 412 | "requires": { 413 | "@babel/code-frame": "^7.14.5", 414 | "@babel/parser": "^7.14.5", 415 | "@babel/types": "^7.14.5" 416 | } 417 | }, 418 | "@babel/traverse": { 419 | "version": "7.14.8", 420 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz", 421 | "integrity": "sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==", 422 | "dev": true, 423 | "requires": { 424 | "@babel/code-frame": "^7.14.5", 425 | "@babel/generator": "^7.14.8", 426 | "@babel/helper-function-name": "^7.14.5", 427 | "@babel/helper-hoist-variables": "^7.14.5", 428 | "@babel/helper-split-export-declaration": "^7.14.5", 429 | "@babel/parser": "^7.14.8", 430 | "@babel/types": "^7.14.8", 431 | "debug": "^4.1.0", 432 | "globals": "^11.1.0" 433 | } 434 | }, 435 | "@babel/types": { 436 | "version": "7.14.8", 437 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", 438 | "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", 439 | "dev": true, 440 | "requires": { 441 | "@babel/helper-validator-identifier": "^7.14.8", 442 | "to-fast-properties": "^2.0.0" 443 | } 444 | }, 445 | "@bcoe/v8-coverage": { 446 | "version": "0.2.3", 447 | "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", 448 | "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", 449 | "dev": true 450 | }, 451 | "@firebase/analytics": { 452 | "version": "0.6.15", 453 | "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.6.15.tgz", 454 | "integrity": "sha512-/x7AY7t5tEgfNuh01cZSgno+5AzF7iA0tvUOiv28JcvBOqmwBRcQb2KlatSFvXwqOL4Sk8G8duKTwlxl8R0m6A==", 455 | "requires": { 456 | "@firebase/analytics-types": "0.5.0", 457 | "@firebase/component": "0.5.4", 458 | "@firebase/installations": "0.4.30", 459 | "@firebase/logger": "0.2.6", 460 | "@firebase/util": "1.1.0", 461 | "tslib": "^2.1.0" 462 | } 463 | }, 464 | "@firebase/analytics-types": { 465 | "version": "0.5.0", 466 | "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.5.0.tgz", 467 | "integrity": "sha512-VTV5Xtq5gVabbL/4n6pBtMJWcQBgOUDE2XbEHl8EOuwRaU9weyGUS7ofbisDkpl1RlFU1aewnc33pbLcYbi0iQ==" 468 | }, 469 | "@firebase/app": { 470 | "version": "0.6.28", 471 | "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.6.28.tgz", 472 | "integrity": "sha512-ZsR5372bNDfY9aGMg+0zgoxwUg/Upf8Mq1M82XCByCVdn6krnPwGr486UssiYFCVANweiOR1Mrhrg2y5O01RRw==", 473 | "requires": { 474 | "@firebase/app-types": "0.6.2", 475 | "@firebase/component": "0.5.4", 476 | "@firebase/logger": "0.2.6", 477 | "@firebase/util": "1.1.0", 478 | "dom-storage": "2.1.0", 479 | "tslib": "^2.1.0", 480 | "xmlhttprequest": "1.8.0" 481 | } 482 | }, 483 | "@firebase/app-check": { 484 | "version": "0.2.0", 485 | "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.2.0.tgz", 486 | "integrity": "sha512-h5eNSYf4ZU9FGawDSLGSGBcaYzdkydVBCGzbQW5urAd7czhB5QF+T4nnTOQ0Gto5upqPGuUH9s9CbQ4Gf49OEw==", 487 | "requires": { 488 | "@firebase/app-check-interop-types": "0.1.0", 489 | "@firebase/app-check-types": "0.2.0", 490 | "@firebase/component": "0.5.4", 491 | "@firebase/logger": "0.2.6", 492 | "@firebase/util": "1.1.0", 493 | "tslib": "^2.1.0" 494 | } 495 | }, 496 | "@firebase/app-check-interop-types": { 497 | "version": "0.1.0", 498 | "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.0.tgz", 499 | "integrity": "sha512-uZfn9s4uuRsaX5Lwx+gFP3B6YsyOKUE+Rqa6z9ojT4VSRAsZFko9FRn6OxQUA1z5t5d08fY4pf+/+Dkd5wbdbA==" 500 | }, 501 | "@firebase/app-check-types": { 502 | "version": "0.2.0", 503 | "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.2.0.tgz", 504 | "integrity": "sha512-CfZhWtChLK9uNmrxbJyTg1BPtROiwc/VJGu3f39KjS0F5ZvZjHmyRFMrDiSoXDoybM4B6X0pQhJYi9rifT2wpQ==" 505 | }, 506 | "@firebase/app-types": { 507 | "version": "0.6.2", 508 | "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.2.tgz", 509 | "integrity": "sha512-2VXvq/K+n8XMdM4L2xy5bYp2ZXMawJXluUIDzUBvMthVR+lhxK4pfFiqr1mmDbv9ydXvEAuFsD+6DpcZuJcSSw==" 510 | }, 511 | "@firebase/auth": { 512 | "version": "0.16.8", 513 | "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.16.8.tgz", 514 | "integrity": "sha512-mR0UXG4LirWIfOiCWxVmvz1o23BuKGxeItQ2cCUgXLTjNtWJXdcky/356iTUsd7ZV5A78s2NHeN5tIDDG6H4rg==", 515 | "requires": { 516 | "@firebase/auth-types": "0.10.3" 517 | } 518 | }, 519 | "@firebase/auth-interop-types": { 520 | "version": "0.1.6", 521 | "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz", 522 | "integrity": "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==" 523 | }, 524 | "@firebase/auth-types": { 525 | "version": "0.10.3", 526 | "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.10.3.tgz", 527 | "integrity": "sha512-zExrThRqyqGUbXOFrH/sowuh2rRtfKHp9SBVY2vOqKWdCX1Ztn682n9WLtlUDsiYVIbBcwautYWk2HyCGFv0OA==" 528 | }, 529 | "@firebase/component": { 530 | "version": "0.5.4", 531 | "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.4.tgz", 532 | "integrity": "sha512-KoLDPTsvxWr6FT9kn/snffJItaWXZLHLJlZVKiiw+flKE6MVA8Eec+ctvM2zcsMZzC2Z47gFnVqywfBlOevmpQ==", 533 | "requires": { 534 | "@firebase/util": "1.1.0", 535 | "tslib": "^2.1.0" 536 | } 537 | }, 538 | "@firebase/database": { 539 | "version": "0.10.8", 540 | "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.10.8.tgz", 541 | "integrity": "sha512-LCjQ6ELOm9TrENV0FuH3grkLTT0gPjBQC7K4dK2ggw39hSzmw09/WKVCmz0mCZtDDfxCiv+5Q6Md/w3zz6awEw==", 542 | "requires": { 543 | "@firebase/auth-interop-types": "0.1.6", 544 | "@firebase/component": "0.5.4", 545 | "@firebase/database-types": "0.7.2", 546 | "@firebase/logger": "0.2.6", 547 | "@firebase/util": "1.1.0", 548 | "faye-websocket": "0.11.3", 549 | "tslib": "^2.1.0" 550 | } 551 | }, 552 | "@firebase/database-types": { 553 | "version": "0.7.2", 554 | "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.7.2.tgz", 555 | "integrity": "sha512-cdAd/dgwvC0r3oLEDUR+ULs1vBsEvy0b27nlzKhU6LQgm9fCDzgaH9nFGv8x+S9dly4B0egAXkONkVoWcOAisg==", 556 | "requires": { 557 | "@firebase/app-types": "0.6.2" 558 | } 559 | }, 560 | "@firebase/firestore": { 561 | "version": "2.3.9", 562 | "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-2.3.9.tgz", 563 | "integrity": "sha512-DUYLSHdCY6YeTFrlgy6cbtlIvxZvLtEemTOupp52/1sSoF9/u46CCxvfyDyIFxvq4QCreEykjgc1p+Difb8uvQ==", 564 | "requires": { 565 | "@firebase/component": "0.5.4", 566 | "@firebase/firestore-types": "2.3.0", 567 | "@firebase/logger": "0.2.6", 568 | "@firebase/util": "1.1.0", 569 | "@firebase/webchannel-wrapper": "0.5.1", 570 | "@grpc/grpc-js": "^1.3.2", 571 | "@grpc/proto-loader": "^0.6.0", 572 | "node-fetch": "2.6.1", 573 | "tslib": "^2.1.0" 574 | } 575 | }, 576 | "@firebase/firestore-types": { 577 | "version": "2.3.0", 578 | "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.3.0.tgz", 579 | "integrity": "sha512-QTW7NP7nDL0pgT/X53lyj+mIMh4nRQBBTBlRNQBt7eSyeqBf3ag3bxdQhCg358+5KbjYTC2/O6QtX9DlJZmh1A==" 580 | }, 581 | "@firebase/functions": { 582 | "version": "0.6.13", 583 | "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.6.13.tgz", 584 | "integrity": "sha512-BSMXjcGXfe33Tdb/a6esYGndMPY7bhMTRlP1si5W0oL8ovsHpiAllrrECbcqp7VU1qQtAZlC7U/pWF733yIRuw==", 585 | "requires": { 586 | "@firebase/component": "0.5.4", 587 | "@firebase/functions-types": "0.4.0", 588 | "@firebase/messaging-types": "0.5.0", 589 | "node-fetch": "2.6.1", 590 | "tslib": "^2.1.0" 591 | } 592 | }, 593 | "@firebase/functions-types": { 594 | "version": "0.4.0", 595 | "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.4.0.tgz", 596 | "integrity": "sha512-3KElyO3887HNxtxNF1ytGFrNmqD+hheqjwmT3sI09FaDCuaxGbOnsXAXH2eQ049XRXw9YQpHMgYws/aUNgXVyQ==" 597 | }, 598 | "@firebase/installations": { 599 | "version": "0.4.30", 600 | "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.4.30.tgz", 601 | "integrity": "sha512-7Ci8UVIkeb+V5BzZiA2dfjTYDIeKS4cW7EXit5ZGnd4J9d9NZW9Fnyx/XpvlhrODleBKhXuip/3rF1pfJq+/5Q==", 602 | "requires": { 603 | "@firebase/component": "0.5.4", 604 | "@firebase/installations-types": "0.3.4", 605 | "@firebase/util": "1.1.0", 606 | "idb": "3.0.2", 607 | "tslib": "^2.1.0" 608 | } 609 | }, 610 | "@firebase/installations-types": { 611 | "version": "0.3.4", 612 | "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.3.4.tgz", 613 | "integrity": "sha512-RfePJFovmdIXb6rYwtngyxuEcWnOrzdZd9m7xAW0gRxDIjBT20n3BOhjpmgRWXo/DAxRmS7bRjWAyTHY9cqN7Q==" 614 | }, 615 | "@firebase/logger": { 616 | "version": "0.2.6", 617 | "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.6.tgz", 618 | "integrity": "sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw==" 619 | }, 620 | "@firebase/messaging": { 621 | "version": "0.7.14", 622 | "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.7.14.tgz", 623 | "integrity": "sha512-qWaaGaDAFA/QejkHXPTRbA17KUi1+Rvip7XMo8Oqrh14E8o0VQwR2e7n54qTkngl4hphOv1YMuM8uXRKU5fVGQ==", 624 | "requires": { 625 | "@firebase/component": "0.5.4", 626 | "@firebase/installations": "0.4.30", 627 | "@firebase/messaging-types": "0.5.0", 628 | "@firebase/util": "1.1.0", 629 | "idb": "3.0.2", 630 | "tslib": "^2.1.0" 631 | } 632 | }, 633 | "@firebase/messaging-types": { 634 | "version": "0.5.0", 635 | "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.5.0.tgz", 636 | "integrity": "sha512-QaaBswrU6umJYb/ZYvjR5JDSslCGOH6D9P136PhabFAHLTR4TWjsaACvbBXuvwrfCXu10DtcjMxqfhdNIB1Xfg==" 637 | }, 638 | "@firebase/performance": { 639 | "version": "0.4.16", 640 | "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.4.16.tgz", 641 | "integrity": "sha512-todNreR+HPedqPul0FXalKzJYzYIs5Q9jba9ulqKo19vqTRX9YO+8EOmqwS445CgBghCZxeXkKmKm9p//JNZtg==", 642 | "requires": { 643 | "@firebase/component": "0.5.4", 644 | "@firebase/installations": "0.4.30", 645 | "@firebase/logger": "0.2.6", 646 | "@firebase/performance-types": "0.0.13", 647 | "@firebase/util": "1.1.0", 648 | "tslib": "^2.1.0" 649 | } 650 | }, 651 | "@firebase/performance-types": { 652 | "version": "0.0.13", 653 | "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.0.13.tgz", 654 | "integrity": "sha512-6fZfIGjQpwo9S5OzMpPyqgYAUZcFzZxHFqOyNtorDIgNXq33nlldTL/vtaUZA8iT9TT5cJlCrF/jthKU7X21EA==" 655 | }, 656 | "@firebase/polyfill": { 657 | "version": "0.3.36", 658 | "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.36.tgz", 659 | "integrity": "sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg==", 660 | "requires": { 661 | "core-js": "3.6.5", 662 | "promise-polyfill": "8.1.3", 663 | "whatwg-fetch": "2.0.4" 664 | } 665 | }, 666 | "@firebase/remote-config": { 667 | "version": "0.1.41", 668 | "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.1.41.tgz", 669 | "integrity": "sha512-ixySdhripxOz/wUiGxjVwU9hhxPkRy1N9YzLZmbQK9zrD6HPmyIRFRGp9Uh3PukD+gMqrHAwPPdkkwt6I35k9A==", 670 | "requires": { 671 | "@firebase/component": "0.5.4", 672 | "@firebase/installations": "0.4.30", 673 | "@firebase/logger": "0.2.6", 674 | "@firebase/remote-config-types": "0.1.9", 675 | "@firebase/util": "1.1.0", 676 | "tslib": "^2.1.0" 677 | } 678 | }, 679 | "@firebase/remote-config-types": { 680 | "version": "0.1.9", 681 | "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.1.9.tgz", 682 | "integrity": "sha512-G96qnF3RYGbZsTRut7NBX0sxyczxt1uyCgXQuH/eAfUCngxjEGcZQnBdy6mvSdqdJh5mC31rWPO4v9/s7HwtzA==" 683 | }, 684 | "@firebase/storage": { 685 | "version": "0.6.0", 686 | "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.6.0.tgz", 687 | "integrity": "sha512-JUfPt6SEQxDdkwzcGuhv9+sRdlvSAY2IiFR5cf1sYfzGJDxKUNldsmUy3llTY4HxKiMPC7y2rG78Q2xhOWeUDA==", 688 | "requires": { 689 | "@firebase/component": "0.5.4", 690 | "@firebase/storage-types": "0.4.1", 691 | "@firebase/util": "1.1.0", 692 | "node-fetch": "2.6.1", 693 | "tslib": "^2.1.0" 694 | } 695 | }, 696 | "@firebase/storage-types": { 697 | "version": "0.4.1", 698 | "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.4.1.tgz", 699 | "integrity": "sha512-IM4cRzAnQ6QZoaxVZ5MatBzqXVcp47hOlE28jd9xXw1M9V7gfjhmW0PALGFQx58tPVmuUwIKyoEbHZjV4qRJwQ==" 700 | }, 701 | "@firebase/util": { 702 | "version": "1.1.0", 703 | "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.1.0.tgz", 704 | "integrity": "sha512-lfuSASuPKNdfebuFR8rjFamMQUPH9iiZHcKS755Rkm/5gRT0qC7BMhCh3ZkHf7NVbplzIc/GhmX2jM+igDRCag==", 705 | "requires": { 706 | "tslib": "^2.1.0" 707 | } 708 | }, 709 | "@firebase/webchannel-wrapper": { 710 | "version": "0.5.1", 711 | "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.5.1.tgz", 712 | "integrity": "sha512-dZMzN0uAjwJXWYYAcnxIwXqRTZw3o14hGe7O6uhwjD1ZQWPVYA5lASgnNskEBra0knVBsOXB4KXg+HnlKewN/A==" 713 | }, 714 | "@grpc/grpc-js": { 715 | "version": "1.3.6", 716 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.6.tgz", 717 | "integrity": "sha512-v7+LQFbqZKmd/Tvf5/j1Xlbq6jXL/4d+gUtm2TNX4QiEC3ELWADmGr2dGlUyLl6aKTuYfsN72vAsO5zmavYkEg==", 718 | "requires": { 719 | "@types/node": ">=12.12.47" 720 | } 721 | }, 722 | "@grpc/proto-loader": { 723 | "version": "0.6.4", 724 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.4.tgz", 725 | "integrity": "sha512-7xvDvW/vJEcmLUltCUGOgWRPM8Oofv0eCFSVMuKqaqWJaXSzmB+m9hiyqe34QofAl4WAzIKUZZlinIF9FOHyTQ==", 726 | "requires": { 727 | "@types/long": "^4.0.1", 728 | "lodash.camelcase": "^4.3.0", 729 | "long": "^4.0.0", 730 | "protobufjs": "^6.10.0", 731 | "yargs": "^16.1.1" 732 | } 733 | }, 734 | "@istanbuljs/load-nyc-config": { 735 | "version": "1.1.0", 736 | "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", 737 | "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", 738 | "dev": true, 739 | "requires": { 740 | "camelcase": "^5.3.1", 741 | "find-up": "^4.1.0", 742 | "get-package-type": "^0.1.0", 743 | "js-yaml": "^3.13.1", 744 | "resolve-from": "^5.0.0" 745 | } 746 | }, 747 | "@istanbuljs/schema": { 748 | "version": "0.1.3", 749 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 750 | "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 751 | "dev": true 752 | }, 753 | "@jest/console": { 754 | "version": "27.0.6", 755 | "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.6.tgz", 756 | "integrity": "sha512-fMlIBocSHPZ3JxgWiDNW/KPj6s+YRd0hicb33IrmelCcjXo/pXPwvuiKFmZz+XuqI/1u7nbUK10zSsWL/1aegg==", 757 | "dev": true, 758 | "requires": { 759 | "@jest/types": "^27.0.6", 760 | "@types/node": "*", 761 | "chalk": "^4.0.0", 762 | "jest-message-util": "^27.0.6", 763 | "jest-util": "^27.0.6", 764 | "slash": "^3.0.0" 765 | } 766 | }, 767 | "@jest/core": { 768 | "version": "27.0.6", 769 | "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.0.6.tgz", 770 | "integrity": "sha512-SsYBm3yhqOn5ZLJCtccaBcvD/ccTLCeuDv8U41WJH/V1MW5eKUkeMHT9U+Pw/v1m1AIWlnIW/eM2XzQr0rEmow==", 771 | "dev": true, 772 | "requires": { 773 | "@jest/console": "^27.0.6", 774 | "@jest/reporters": "^27.0.6", 775 | "@jest/test-result": "^27.0.6", 776 | "@jest/transform": "^27.0.6", 777 | "@jest/types": "^27.0.6", 778 | "@types/node": "*", 779 | "ansi-escapes": "^4.2.1", 780 | "chalk": "^4.0.0", 781 | "emittery": "^0.8.1", 782 | "exit": "^0.1.2", 783 | "graceful-fs": "^4.2.4", 784 | "jest-changed-files": "^27.0.6", 785 | "jest-config": "^27.0.6", 786 | "jest-haste-map": "^27.0.6", 787 | "jest-message-util": "^27.0.6", 788 | "jest-regex-util": "^27.0.6", 789 | "jest-resolve": "^27.0.6", 790 | "jest-resolve-dependencies": "^27.0.6", 791 | "jest-runner": "^27.0.6", 792 | "jest-runtime": "^27.0.6", 793 | "jest-snapshot": "^27.0.6", 794 | "jest-util": "^27.0.6", 795 | "jest-validate": "^27.0.6", 796 | "jest-watcher": "^27.0.6", 797 | "micromatch": "^4.0.4", 798 | "p-each-series": "^2.1.0", 799 | "rimraf": "^3.0.0", 800 | "slash": "^3.0.0", 801 | "strip-ansi": "^6.0.0" 802 | }, 803 | "dependencies": { 804 | "jest-config": { 805 | "version": "27.0.6", 806 | "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.6.tgz", 807 | "integrity": "sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==", 808 | "dev": true, 809 | "requires": { 810 | "@babel/core": "^7.1.0", 811 | "@jest/test-sequencer": "^27.0.6", 812 | "@jest/types": "^27.0.6", 813 | "babel-jest": "^27.0.6", 814 | "chalk": "^4.0.0", 815 | "deepmerge": "^4.2.2", 816 | "glob": "^7.1.1", 817 | "graceful-fs": "^4.2.4", 818 | "is-ci": "^3.0.0", 819 | "jest-circus": "^27.0.6", 820 | "jest-environment-jsdom": "^27.0.6", 821 | "jest-environment-node": "^27.0.6", 822 | "jest-get-type": "^27.0.6", 823 | "jest-jasmine2": "^27.0.6", 824 | "jest-regex-util": "^27.0.6", 825 | "jest-resolve": "^27.0.6", 826 | "jest-runner": "^27.0.6", 827 | "jest-util": "^27.0.6", 828 | "jest-validate": "^27.0.6", 829 | "micromatch": "^4.0.4", 830 | "pretty-format": "^27.0.6" 831 | } 832 | }, 833 | "ts-node": { 834 | "version": "10.1.0", 835 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.1.0.tgz", 836 | "integrity": "sha512-6szn3+J9WyG2hE+5W8e0ruZrzyk1uFLYye6IGMBadnOzDh8aP7t8CbFpsfCiEx2+wMixAhjFt7lOZC4+l+WbEA==", 837 | "requires": { 838 | "arg": "^4.1.0", 839 | "diff": "^4.0.1", 840 | "make-error": "^1.1.1", 841 | "source-map-support": "^0.5.17", 842 | "yn": "3.1.1" 843 | } 844 | } 845 | } 846 | }, 847 | "@jest/environment": { 848 | "version": "27.0.6", 849 | "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.0.6.tgz", 850 | "integrity": "sha512-4XywtdhwZwCpPJ/qfAkqExRsERW+UaoSRStSHCCiQTUpoYdLukj+YJbQSFrZjhlUDRZeNiU9SFH0u7iNimdiIg==", 851 | "dev": true, 852 | "requires": { 853 | "@jest/fake-timers": "^27.0.6", 854 | "@jest/types": "^27.0.6", 855 | "@types/node": "*", 856 | "jest-mock": "^27.0.6" 857 | } 858 | }, 859 | "@jest/fake-timers": { 860 | "version": "27.0.6", 861 | "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.0.6.tgz", 862 | "integrity": "sha512-sqd+xTWtZ94l3yWDKnRTdvTeZ+A/V7SSKrxsrOKSqdyddb9CeNRF8fbhAU0D7ZJBpTTW2nbp6MftmKJDZfW2LQ==", 863 | "dev": true, 864 | "requires": { 865 | "@jest/types": "^27.0.6", 866 | "@sinonjs/fake-timers": "^7.0.2", 867 | "@types/node": "*", 868 | "jest-message-util": "^27.0.6", 869 | "jest-mock": "^27.0.6", 870 | "jest-util": "^27.0.6" 871 | } 872 | }, 873 | "@jest/globals": { 874 | "version": "27.0.6", 875 | "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.0.6.tgz", 876 | "integrity": "sha512-DdTGCP606rh9bjkdQ7VvChV18iS7q0IMJVP1piwTWyWskol4iqcVwthZmoJEf7obE1nc34OpIyoVGPeqLC+ryw==", 877 | "dev": true, 878 | "requires": { 879 | "@jest/environment": "^27.0.6", 880 | "@jest/types": "^27.0.6", 881 | "expect": "^27.0.6" 882 | } 883 | }, 884 | "@jest/reporters": { 885 | "version": "27.0.6", 886 | "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.0.6.tgz", 887 | "integrity": "sha512-TIkBt09Cb2gptji3yJXb3EE+eVltW6BjO7frO7NEfjI9vSIYoISi5R3aI3KpEDXlB1xwB+97NXIqz84qYeYsfA==", 888 | "dev": true, 889 | "requires": { 890 | "@bcoe/v8-coverage": "^0.2.3", 891 | "@jest/console": "^27.0.6", 892 | "@jest/test-result": "^27.0.6", 893 | "@jest/transform": "^27.0.6", 894 | "@jest/types": "^27.0.6", 895 | "chalk": "^4.0.0", 896 | "collect-v8-coverage": "^1.0.0", 897 | "exit": "^0.1.2", 898 | "glob": "^7.1.2", 899 | "graceful-fs": "^4.2.4", 900 | "istanbul-lib-coverage": "^3.0.0", 901 | "istanbul-lib-instrument": "^4.0.3", 902 | "istanbul-lib-report": "^3.0.0", 903 | "istanbul-lib-source-maps": "^4.0.0", 904 | "istanbul-reports": "^3.0.2", 905 | "jest-haste-map": "^27.0.6", 906 | "jest-resolve": "^27.0.6", 907 | "jest-util": "^27.0.6", 908 | "jest-worker": "^27.0.6", 909 | "slash": "^3.0.0", 910 | "source-map": "^0.6.0", 911 | "string-length": "^4.0.1", 912 | "terminal-link": "^2.0.0", 913 | "v8-to-istanbul": "^8.0.0" 914 | } 915 | }, 916 | "@jest/source-map": { 917 | "version": "27.0.6", 918 | "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.0.6.tgz", 919 | "integrity": "sha512-Fek4mi5KQrqmlY07T23JRi0e7Z9bXTOOD86V/uS0EIW4PClvPDqZOyFlLpNJheS6QI0FNX1CgmPjtJ4EA/2M+g==", 920 | "dev": true, 921 | "requires": { 922 | "callsites": "^3.0.0", 923 | "graceful-fs": "^4.2.4", 924 | "source-map": "^0.6.0" 925 | } 926 | }, 927 | "@jest/test-result": { 928 | "version": "27.0.6", 929 | "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.0.6.tgz", 930 | "integrity": "sha512-ja/pBOMTufjX4JLEauLxE3LQBPaI2YjGFtXexRAjt1I/MbfNlMx0sytSX3tn5hSLzQsR3Qy2rd0hc1BWojtj9w==", 931 | "dev": true, 932 | "requires": { 933 | "@jest/console": "^27.0.6", 934 | "@jest/types": "^27.0.6", 935 | "@types/istanbul-lib-coverage": "^2.0.0", 936 | "collect-v8-coverage": "^1.0.0" 937 | } 938 | }, 939 | "@jest/test-sequencer": { 940 | "version": "27.0.6", 941 | "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.0.6.tgz", 942 | "integrity": "sha512-bISzNIApazYOlTHDum9PwW22NOyDa6VI31n6JucpjTVM0jD6JDgqEZ9+yn575nDdPF0+4csYDxNNW13NvFQGZA==", 943 | "dev": true, 944 | "requires": { 945 | "@jest/test-result": "^27.0.6", 946 | "graceful-fs": "^4.2.4", 947 | "jest-haste-map": "^27.0.6", 948 | "jest-runtime": "^27.0.6" 949 | } 950 | }, 951 | "@jest/transform": { 952 | "version": "27.0.6", 953 | "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.0.6.tgz", 954 | "integrity": "sha512-rj5Dw+mtIcntAUnMlW/Vju5mr73u8yg+irnHwzgtgoeI6cCPOvUwQ0D1uQtc/APmWgvRweEb1g05pkUpxH3iCA==", 955 | "dev": true, 956 | "requires": { 957 | "@babel/core": "^7.1.0", 958 | "@jest/types": "^27.0.6", 959 | "babel-plugin-istanbul": "^6.0.0", 960 | "chalk": "^4.0.0", 961 | "convert-source-map": "^1.4.0", 962 | "fast-json-stable-stringify": "^2.0.0", 963 | "graceful-fs": "^4.2.4", 964 | "jest-haste-map": "^27.0.6", 965 | "jest-regex-util": "^27.0.6", 966 | "jest-util": "^27.0.6", 967 | "micromatch": "^4.0.4", 968 | "pirates": "^4.0.1", 969 | "slash": "^3.0.0", 970 | "source-map": "^0.6.1", 971 | "write-file-atomic": "^3.0.0" 972 | } 973 | }, 974 | "@jest/types": { 975 | "version": "27.0.6", 976 | "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz", 977 | "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==", 978 | "dev": true, 979 | "requires": { 980 | "@types/istanbul-lib-coverage": "^2.0.0", 981 | "@types/istanbul-reports": "^3.0.0", 982 | "@types/node": "*", 983 | "@types/yargs": "^16.0.0", 984 | "chalk": "^4.0.0" 985 | } 986 | }, 987 | "@protobufjs/aspromise": { 988 | "version": "1.1.2", 989 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 990 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 991 | }, 992 | "@protobufjs/base64": { 993 | "version": "1.1.2", 994 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 995 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 996 | }, 997 | "@protobufjs/codegen": { 998 | "version": "2.0.4", 999 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 1000 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 1001 | }, 1002 | "@protobufjs/eventemitter": { 1003 | "version": "1.1.0", 1004 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 1005 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 1006 | }, 1007 | "@protobufjs/fetch": { 1008 | "version": "1.1.0", 1009 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 1010 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 1011 | "requires": { 1012 | "@protobufjs/aspromise": "^1.1.1", 1013 | "@protobufjs/inquire": "^1.1.0" 1014 | } 1015 | }, 1016 | "@protobufjs/float": { 1017 | "version": "1.0.2", 1018 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 1019 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 1020 | }, 1021 | "@protobufjs/inquire": { 1022 | "version": "1.1.0", 1023 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 1024 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 1025 | }, 1026 | "@protobufjs/path": { 1027 | "version": "1.1.2", 1028 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 1029 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 1030 | }, 1031 | "@protobufjs/pool": { 1032 | "version": "1.1.0", 1033 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 1034 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 1035 | }, 1036 | "@protobufjs/utf8": { 1037 | "version": "1.1.0", 1038 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 1039 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 1040 | }, 1041 | "@sinonjs/commons": { 1042 | "version": "1.8.3", 1043 | "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", 1044 | "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", 1045 | "dev": true, 1046 | "requires": { 1047 | "type-detect": "4.0.8" 1048 | } 1049 | }, 1050 | "@sinonjs/fake-timers": { 1051 | "version": "7.1.2", 1052 | "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", 1053 | "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", 1054 | "dev": true, 1055 | "requires": { 1056 | "@sinonjs/commons": "^1.7.0" 1057 | } 1058 | }, 1059 | "@tootallnate/once": { 1060 | "version": "1.1.2", 1061 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 1062 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 1063 | "dev": true 1064 | }, 1065 | "@types/babel__core": { 1066 | "version": "7.1.15", 1067 | "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", 1068 | "integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==", 1069 | "dev": true, 1070 | "requires": { 1071 | "@babel/parser": "^7.1.0", 1072 | "@babel/types": "^7.0.0", 1073 | "@types/babel__generator": "*", 1074 | "@types/babel__template": "*", 1075 | "@types/babel__traverse": "*" 1076 | } 1077 | }, 1078 | "@types/babel__generator": { 1079 | "version": "7.6.3", 1080 | "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", 1081 | "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", 1082 | "dev": true, 1083 | "requires": { 1084 | "@babel/types": "^7.0.0" 1085 | } 1086 | }, 1087 | "@types/babel__template": { 1088 | "version": "7.4.1", 1089 | "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", 1090 | "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", 1091 | "dev": true, 1092 | "requires": { 1093 | "@babel/parser": "^7.1.0", 1094 | "@babel/types": "^7.0.0" 1095 | } 1096 | }, 1097 | "@types/babel__traverse": { 1098 | "version": "7.14.2", 1099 | "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", 1100 | "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", 1101 | "dev": true, 1102 | "requires": { 1103 | "@babel/types": "^7.3.0" 1104 | } 1105 | }, 1106 | "@types/graceful-fs": { 1107 | "version": "4.1.5", 1108 | "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", 1109 | "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", 1110 | "dev": true, 1111 | "requires": { 1112 | "@types/node": "*" 1113 | } 1114 | }, 1115 | "@types/istanbul-lib-coverage": { 1116 | "version": "2.0.3", 1117 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", 1118 | "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", 1119 | "dev": true 1120 | }, 1121 | "@types/istanbul-lib-report": { 1122 | "version": "3.0.0", 1123 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 1124 | "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", 1125 | "dev": true, 1126 | "requires": { 1127 | "@types/istanbul-lib-coverage": "*" 1128 | } 1129 | }, 1130 | "@types/istanbul-reports": { 1131 | "version": "3.0.1", 1132 | "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", 1133 | "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", 1134 | "dev": true, 1135 | "requires": { 1136 | "@types/istanbul-lib-report": "*" 1137 | } 1138 | }, 1139 | "@types/jest": { 1140 | "version": "23.3.14", 1141 | "resolved": "https://registry.npmjs.org/@types/jest/-/jest-23.3.14.tgz", 1142 | "integrity": "sha512-Q5hTcfdudEL2yOmluA1zaSyPbzWPmJ3XfSWeP3RyoYvS9hnje1ZyagrZOuQ6+1nQC1Gw+7gap3pLNL3xL6UBug==", 1143 | "dev": true 1144 | }, 1145 | "@types/long": { 1146 | "version": "4.0.1", 1147 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 1148 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 1149 | }, 1150 | "@types/node": { 1151 | "version": "16.4.2", 1152 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.2.tgz", 1153 | "integrity": "sha512-vxyhOzFCm+jC/T5KugbVsYy1DbQM0h3NCFUrVbu0+pYa/nr+heeucpqxpa8j4pUmIGLPYzboY9zIdOF0niFAjQ==" 1154 | }, 1155 | "@types/prettier": { 1156 | "version": "2.3.2", 1157 | "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz", 1158 | "integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==", 1159 | "dev": true 1160 | }, 1161 | "@types/stack-utils": { 1162 | "version": "2.0.1", 1163 | "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", 1164 | "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", 1165 | "dev": true 1166 | }, 1167 | "@types/yargs": { 1168 | "version": "16.0.4", 1169 | "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", 1170 | "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", 1171 | "dev": true, 1172 | "requires": { 1173 | "@types/yargs-parser": "*" 1174 | } 1175 | }, 1176 | "@types/yargs-parser": { 1177 | "version": "20.2.1", 1178 | "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", 1179 | "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", 1180 | "dev": true 1181 | }, 1182 | "abab": { 1183 | "version": "2.0.5", 1184 | "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", 1185 | "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", 1186 | "dev": true 1187 | }, 1188 | "acorn": { 1189 | "version": "8.4.1", 1190 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", 1191 | "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", 1192 | "dev": true 1193 | }, 1194 | "acorn-globals": { 1195 | "version": "6.0.0", 1196 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", 1197 | "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", 1198 | "dev": true, 1199 | "requires": { 1200 | "acorn": "^7.1.1", 1201 | "acorn-walk": "^7.1.1" 1202 | }, 1203 | "dependencies": { 1204 | "acorn": { 1205 | "version": "7.4.1", 1206 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 1207 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 1208 | "dev": true 1209 | } 1210 | } 1211 | }, 1212 | "acorn-walk": { 1213 | "version": "7.2.0", 1214 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 1215 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 1216 | "dev": true 1217 | }, 1218 | "agent-base": { 1219 | "version": "6.0.2", 1220 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 1221 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 1222 | "dev": true, 1223 | "requires": { 1224 | "debug": "4" 1225 | } 1226 | }, 1227 | "ansi-escapes": { 1228 | "version": "4.3.2", 1229 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 1230 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 1231 | "dev": true, 1232 | "requires": { 1233 | "type-fest": "^0.21.3" 1234 | } 1235 | }, 1236 | "ansi-regex": { 1237 | "version": "5.0.0", 1238 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 1239 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 1240 | }, 1241 | "ansi-styles": { 1242 | "version": "4.3.0", 1243 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1244 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1245 | "requires": { 1246 | "color-convert": "^2.0.1" 1247 | } 1248 | }, 1249 | "anymatch": { 1250 | "version": "3.1.2", 1251 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 1252 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 1253 | "dev": true, 1254 | "requires": { 1255 | "normalize-path": "^3.0.0", 1256 | "picomatch": "^2.0.4" 1257 | } 1258 | }, 1259 | "arg": { 1260 | "version": "4.1.3", 1261 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 1262 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" 1263 | }, 1264 | "argparse": { 1265 | "version": "1.0.10", 1266 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 1267 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 1268 | "dev": true, 1269 | "requires": { 1270 | "sprintf-js": "~1.0.2" 1271 | } 1272 | }, 1273 | "asynckit": { 1274 | "version": "0.4.0", 1275 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 1276 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 1277 | "dev": true 1278 | }, 1279 | "babel-jest": { 1280 | "version": "27.0.6", 1281 | "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.0.6.tgz", 1282 | "integrity": "sha512-iTJyYLNc4wRofASmofpOc5NK9QunwMk+TLFgGXsTFS8uEqmd8wdI7sga0FPe2oVH3b5Agt/EAK1QjPEuKL8VfA==", 1283 | "dev": true, 1284 | "requires": { 1285 | "@jest/transform": "^27.0.6", 1286 | "@jest/types": "^27.0.6", 1287 | "@types/babel__core": "^7.1.14", 1288 | "babel-plugin-istanbul": "^6.0.0", 1289 | "babel-preset-jest": "^27.0.6", 1290 | "chalk": "^4.0.0", 1291 | "graceful-fs": "^4.2.4", 1292 | "slash": "^3.0.0" 1293 | } 1294 | }, 1295 | "babel-plugin-istanbul": { 1296 | "version": "6.0.0", 1297 | "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", 1298 | "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", 1299 | "dev": true, 1300 | "requires": { 1301 | "@babel/helper-plugin-utils": "^7.0.0", 1302 | "@istanbuljs/load-nyc-config": "^1.0.0", 1303 | "@istanbuljs/schema": "^0.1.2", 1304 | "istanbul-lib-instrument": "^4.0.0", 1305 | "test-exclude": "^6.0.0" 1306 | } 1307 | }, 1308 | "babel-plugin-jest-hoist": { 1309 | "version": "27.0.6", 1310 | "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.0.6.tgz", 1311 | "integrity": "sha512-CewFeM9Vv2gM7Yr9n5eyyLVPRSiBnk6lKZRjgwYnGKSl9M14TMn2vkN02wTF04OGuSDLEzlWiMzvjXuW9mB6Gw==", 1312 | "dev": true, 1313 | "requires": { 1314 | "@babel/template": "^7.3.3", 1315 | "@babel/types": "^7.3.3", 1316 | "@types/babel__core": "^7.0.0", 1317 | "@types/babel__traverse": "^7.0.6" 1318 | } 1319 | }, 1320 | "babel-preset-current-node-syntax": { 1321 | "version": "1.0.1", 1322 | "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", 1323 | "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", 1324 | "dev": true, 1325 | "requires": { 1326 | "@babel/plugin-syntax-async-generators": "^7.8.4", 1327 | "@babel/plugin-syntax-bigint": "^7.8.3", 1328 | "@babel/plugin-syntax-class-properties": "^7.8.3", 1329 | "@babel/plugin-syntax-import-meta": "^7.8.3", 1330 | "@babel/plugin-syntax-json-strings": "^7.8.3", 1331 | "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", 1332 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", 1333 | "@babel/plugin-syntax-numeric-separator": "^7.8.3", 1334 | "@babel/plugin-syntax-object-rest-spread": "^7.8.3", 1335 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", 1336 | "@babel/plugin-syntax-optional-chaining": "^7.8.3", 1337 | "@babel/plugin-syntax-top-level-await": "^7.8.3" 1338 | } 1339 | }, 1340 | "babel-preset-jest": { 1341 | "version": "27.0.6", 1342 | "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.0.6.tgz", 1343 | "integrity": "sha512-WObA0/Biw2LrVVwZkF/2GqbOdzhKD6Fkdwhoy9ASIrOWr/zodcSpQh72JOkEn6NWyjmnPDjNSqaGN4KnpKzhXw==", 1344 | "dev": true, 1345 | "requires": { 1346 | "babel-plugin-jest-hoist": "^27.0.6", 1347 | "babel-preset-current-node-syntax": "^1.0.0" 1348 | } 1349 | }, 1350 | "balanced-match": { 1351 | "version": "1.0.2", 1352 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1353 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1354 | "dev": true 1355 | }, 1356 | "brace-expansion": { 1357 | "version": "1.1.11", 1358 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1359 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1360 | "dev": true, 1361 | "requires": { 1362 | "balanced-match": "^1.0.0", 1363 | "concat-map": "0.0.1" 1364 | } 1365 | }, 1366 | "braces": { 1367 | "version": "3.0.2", 1368 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1369 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1370 | "dev": true, 1371 | "requires": { 1372 | "fill-range": "^7.0.1" 1373 | } 1374 | }, 1375 | "browser-process-hrtime": { 1376 | "version": "1.0.0", 1377 | "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", 1378 | "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", 1379 | "dev": true 1380 | }, 1381 | "browserslist": { 1382 | "version": "4.16.6", 1383 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", 1384 | "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", 1385 | "dev": true, 1386 | "requires": { 1387 | "caniuse-lite": "^1.0.30001219", 1388 | "colorette": "^1.2.2", 1389 | "electron-to-chromium": "^1.3.723", 1390 | "escalade": "^3.1.1", 1391 | "node-releases": "^1.1.71" 1392 | } 1393 | }, 1394 | "bs-logger": { 1395 | "version": "0.2.6", 1396 | "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", 1397 | "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", 1398 | "dev": true, 1399 | "requires": { 1400 | "fast-json-stable-stringify": "2.x" 1401 | } 1402 | }, 1403 | "bser": { 1404 | "version": "2.1.1", 1405 | "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", 1406 | "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", 1407 | "dev": true, 1408 | "requires": { 1409 | "node-int64": "^0.4.0" 1410 | } 1411 | }, 1412 | "buffer-from": { 1413 | "version": "1.1.1", 1414 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 1415 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 1416 | }, 1417 | "callsites": { 1418 | "version": "3.1.0", 1419 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1420 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1421 | "dev": true 1422 | }, 1423 | "camelcase": { 1424 | "version": "5.3.1", 1425 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 1426 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 1427 | "dev": true 1428 | }, 1429 | "caniuse-lite": { 1430 | "version": "1.0.30001247", 1431 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001247.tgz", 1432 | "integrity": "sha512-4rS7co+7+AoOSPRPOPUt5/GdaqZc0EsUpWk66ofE3HJTAajUK2Ss2VwoNzVN69ghg8lYYlh0an0Iy4LIHHo9UQ==", 1433 | "dev": true 1434 | }, 1435 | "chalk": { 1436 | "version": "4.1.1", 1437 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", 1438 | "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", 1439 | "dev": true, 1440 | "requires": { 1441 | "ansi-styles": "^4.1.0", 1442 | "supports-color": "^7.1.0" 1443 | } 1444 | }, 1445 | "char-regex": { 1446 | "version": "1.0.2", 1447 | "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", 1448 | "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", 1449 | "dev": true 1450 | }, 1451 | "ci-info": { 1452 | "version": "3.2.0", 1453 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", 1454 | "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", 1455 | "dev": true 1456 | }, 1457 | "cjs-module-lexer": { 1458 | "version": "1.2.2", 1459 | "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", 1460 | "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", 1461 | "dev": true 1462 | }, 1463 | "cliui": { 1464 | "version": "7.0.4", 1465 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 1466 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 1467 | "requires": { 1468 | "string-width": "^4.2.0", 1469 | "strip-ansi": "^6.0.0", 1470 | "wrap-ansi": "^7.0.0" 1471 | } 1472 | }, 1473 | "co": { 1474 | "version": "4.6.0", 1475 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 1476 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 1477 | "dev": true 1478 | }, 1479 | "collect-v8-coverage": { 1480 | "version": "1.0.1", 1481 | "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", 1482 | "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", 1483 | "dev": true 1484 | }, 1485 | "color-convert": { 1486 | "version": "2.0.1", 1487 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1488 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1489 | "requires": { 1490 | "color-name": "~1.1.4" 1491 | } 1492 | }, 1493 | "color-name": { 1494 | "version": "1.1.4", 1495 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1496 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 1497 | }, 1498 | "colorette": { 1499 | "version": "1.2.2", 1500 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", 1501 | "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", 1502 | "dev": true 1503 | }, 1504 | "combined-stream": { 1505 | "version": "1.0.8", 1506 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 1507 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 1508 | "dev": true, 1509 | "requires": { 1510 | "delayed-stream": "~1.0.0" 1511 | } 1512 | }, 1513 | "concat-map": { 1514 | "version": "0.0.1", 1515 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1516 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 1517 | "dev": true 1518 | }, 1519 | "convert-source-map": { 1520 | "version": "1.8.0", 1521 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", 1522 | "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", 1523 | "dev": true, 1524 | "requires": { 1525 | "safe-buffer": "~5.1.1" 1526 | } 1527 | }, 1528 | "core-js": { 1529 | "version": "3.6.5", 1530 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", 1531 | "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" 1532 | }, 1533 | "cross-spawn": { 1534 | "version": "7.0.3", 1535 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1536 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1537 | "dev": true, 1538 | "requires": { 1539 | "path-key": "^3.1.0", 1540 | "shebang-command": "^2.0.0", 1541 | "which": "^2.0.1" 1542 | } 1543 | }, 1544 | "cssom": { 1545 | "version": "0.4.4", 1546 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", 1547 | "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", 1548 | "dev": true 1549 | }, 1550 | "cssstyle": { 1551 | "version": "2.3.0", 1552 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", 1553 | "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", 1554 | "dev": true, 1555 | "requires": { 1556 | "cssom": "~0.3.6" 1557 | }, 1558 | "dependencies": { 1559 | "cssom": { 1560 | "version": "0.3.8", 1561 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", 1562 | "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", 1563 | "dev": true 1564 | } 1565 | } 1566 | }, 1567 | "data-urls": { 1568 | "version": "2.0.0", 1569 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", 1570 | "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", 1571 | "dev": true, 1572 | "requires": { 1573 | "abab": "^2.0.3", 1574 | "whatwg-mimetype": "^2.3.0", 1575 | "whatwg-url": "^8.0.0" 1576 | } 1577 | }, 1578 | "debug": { 1579 | "version": "4.3.2", 1580 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 1581 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 1582 | "dev": true, 1583 | "requires": { 1584 | "ms": "2.1.2" 1585 | } 1586 | }, 1587 | "decimal.js": { 1588 | "version": "10.3.1", 1589 | "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", 1590 | "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", 1591 | "dev": true 1592 | }, 1593 | "dedent": { 1594 | "version": "0.7.0", 1595 | "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", 1596 | "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", 1597 | "dev": true 1598 | }, 1599 | "deep-is": { 1600 | "version": "0.1.3", 1601 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 1602 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 1603 | "dev": true 1604 | }, 1605 | "deepmerge": { 1606 | "version": "4.2.2", 1607 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", 1608 | "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", 1609 | "dev": true 1610 | }, 1611 | "delayed-stream": { 1612 | "version": "1.0.0", 1613 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1614 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 1615 | "dev": true 1616 | }, 1617 | "detect-newline": { 1618 | "version": "3.1.0", 1619 | "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", 1620 | "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", 1621 | "dev": true 1622 | }, 1623 | "diff": { 1624 | "version": "4.0.2", 1625 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 1626 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" 1627 | }, 1628 | "diff-sequences": { 1629 | "version": "27.0.6", 1630 | "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", 1631 | "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", 1632 | "dev": true 1633 | }, 1634 | "dom-storage": { 1635 | "version": "2.1.0", 1636 | "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", 1637 | "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==" 1638 | }, 1639 | "domexception": { 1640 | "version": "2.0.1", 1641 | "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", 1642 | "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", 1643 | "dev": true, 1644 | "requires": { 1645 | "webidl-conversions": "^5.0.0" 1646 | }, 1647 | "dependencies": { 1648 | "webidl-conversions": { 1649 | "version": "5.0.0", 1650 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", 1651 | "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", 1652 | "dev": true 1653 | } 1654 | } 1655 | }, 1656 | "electron-to-chromium": { 1657 | "version": "1.3.786", 1658 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.786.tgz", 1659 | "integrity": "sha512-AmvbLBj3hepRk8v/DHrFF8gINxOFfDbrn6Ts3PcK46/FBdQb5OMmpamSpZQXSkfi77FfBzYtQtAk+00LCLYMVw==", 1660 | "dev": true 1661 | }, 1662 | "emittery": { 1663 | "version": "0.8.1", 1664 | "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", 1665 | "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", 1666 | "dev": true 1667 | }, 1668 | "emoji-regex": { 1669 | "version": "8.0.0", 1670 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1671 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1672 | }, 1673 | "escalade": { 1674 | "version": "3.1.1", 1675 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1676 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 1677 | }, 1678 | "escape-string-regexp": { 1679 | "version": "2.0.0", 1680 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", 1681 | "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", 1682 | "dev": true 1683 | }, 1684 | "escodegen": { 1685 | "version": "2.0.0", 1686 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", 1687 | "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", 1688 | "dev": true, 1689 | "requires": { 1690 | "esprima": "^4.0.1", 1691 | "estraverse": "^5.2.0", 1692 | "esutils": "^2.0.2", 1693 | "optionator": "^0.8.1", 1694 | "source-map": "~0.6.1" 1695 | } 1696 | }, 1697 | "esprima": { 1698 | "version": "4.0.1", 1699 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1700 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1701 | "dev": true 1702 | }, 1703 | "estraverse": { 1704 | "version": "5.2.0", 1705 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 1706 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 1707 | "dev": true 1708 | }, 1709 | "esutils": { 1710 | "version": "2.0.3", 1711 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1712 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1713 | "dev": true 1714 | }, 1715 | "execa": { 1716 | "version": "5.1.1", 1717 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", 1718 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", 1719 | "dev": true, 1720 | "requires": { 1721 | "cross-spawn": "^7.0.3", 1722 | "get-stream": "^6.0.0", 1723 | "human-signals": "^2.1.0", 1724 | "is-stream": "^2.0.0", 1725 | "merge-stream": "^2.0.0", 1726 | "npm-run-path": "^4.0.1", 1727 | "onetime": "^5.1.2", 1728 | "signal-exit": "^3.0.3", 1729 | "strip-final-newline": "^2.0.0" 1730 | } 1731 | }, 1732 | "exit": { 1733 | "version": "0.1.2", 1734 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 1735 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 1736 | "dev": true 1737 | }, 1738 | "expect": { 1739 | "version": "27.0.6", 1740 | "resolved": "https://registry.npmjs.org/expect/-/expect-27.0.6.tgz", 1741 | "integrity": "sha512-psNLt8j2kwg42jGBDSfAlU49CEZxejN1f1PlANWDZqIhBOVU/c2Pm888FcjWJzFewhIsNWfZJeLjUjtKGiPuSw==", 1742 | "dev": true, 1743 | "requires": { 1744 | "@jest/types": "^27.0.6", 1745 | "ansi-styles": "^5.0.0", 1746 | "jest-get-type": "^27.0.6", 1747 | "jest-matcher-utils": "^27.0.6", 1748 | "jest-message-util": "^27.0.6", 1749 | "jest-regex-util": "^27.0.6" 1750 | }, 1751 | "dependencies": { 1752 | "ansi-styles": { 1753 | "version": "5.2.0", 1754 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 1755 | "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 1756 | "dev": true 1757 | } 1758 | } 1759 | }, 1760 | "fast-json-stable-stringify": { 1761 | "version": "2.1.0", 1762 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1763 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1764 | "dev": true 1765 | }, 1766 | "fast-levenshtein": { 1767 | "version": "2.0.6", 1768 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1769 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1770 | "dev": true 1771 | }, 1772 | "faye-websocket": { 1773 | "version": "0.11.3", 1774 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", 1775 | "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", 1776 | "requires": { 1777 | "websocket-driver": ">=0.5.1" 1778 | } 1779 | }, 1780 | "fb-watchman": { 1781 | "version": "2.0.1", 1782 | "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", 1783 | "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", 1784 | "dev": true, 1785 | "requires": { 1786 | "bser": "2.1.1" 1787 | } 1788 | }, 1789 | "fill-range": { 1790 | "version": "7.0.1", 1791 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1792 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1793 | "dev": true, 1794 | "requires": { 1795 | "to-regex-range": "^5.0.1" 1796 | } 1797 | }, 1798 | "find-up": { 1799 | "version": "4.1.0", 1800 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 1801 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 1802 | "dev": true, 1803 | "requires": { 1804 | "locate-path": "^5.0.0", 1805 | "path-exists": "^4.0.0" 1806 | } 1807 | }, 1808 | "firebase": { 1809 | "version": "8.8.0", 1810 | "resolved": "https://registry.npmjs.org/firebase/-/firebase-8.8.0.tgz", 1811 | "integrity": "sha512-c4ckTSpmVa7delz1HEEqQJfZYwhEWgXgQgVFcPpjUAc0hvMynS8W37SyufxfBcIki2iPfduWV/RrDhM49hKTbw==", 1812 | "requires": { 1813 | "@firebase/analytics": "0.6.15", 1814 | "@firebase/app": "0.6.28", 1815 | "@firebase/app-check": "0.2.0", 1816 | "@firebase/app-types": "0.6.2", 1817 | "@firebase/auth": "0.16.8", 1818 | "@firebase/database": "0.10.8", 1819 | "@firebase/firestore": "2.3.9", 1820 | "@firebase/functions": "0.6.13", 1821 | "@firebase/installations": "0.4.30", 1822 | "@firebase/messaging": "0.7.14", 1823 | "@firebase/performance": "0.4.16", 1824 | "@firebase/polyfill": "0.3.36", 1825 | "@firebase/remote-config": "0.1.41", 1826 | "@firebase/storage": "0.6.0", 1827 | "@firebase/util": "1.1.0" 1828 | } 1829 | }, 1830 | "firestore-mock": { 1831 | "version": "git+https://github.com/Taosif7/firestore-mock.git#6d9ab01fe2dad8c49283f4c71605abaf2f8832bd", 1832 | "from": "git+https://github.com/Taosif7/firestore-mock.git", 1833 | "dev": true 1834 | }, 1835 | "form-data": { 1836 | "version": "3.0.1", 1837 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", 1838 | "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", 1839 | "dev": true, 1840 | "requires": { 1841 | "asynckit": "^0.4.0", 1842 | "combined-stream": "^1.0.8", 1843 | "mime-types": "^2.1.12" 1844 | } 1845 | }, 1846 | "fs.realpath": { 1847 | "version": "1.0.0", 1848 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1849 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1850 | "dev": true 1851 | }, 1852 | "fsevents": { 1853 | "version": "2.3.2", 1854 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1855 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1856 | "dev": true, 1857 | "optional": true 1858 | }, 1859 | "function-bind": { 1860 | "version": "1.1.1", 1861 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1862 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1863 | "dev": true 1864 | }, 1865 | "gensync": { 1866 | "version": "1.0.0-beta.2", 1867 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1868 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1869 | "dev": true 1870 | }, 1871 | "get-caller-file": { 1872 | "version": "2.0.5", 1873 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1874 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 1875 | }, 1876 | "get-package-type": { 1877 | "version": "0.1.0", 1878 | "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 1879 | "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", 1880 | "dev": true 1881 | }, 1882 | "get-stream": { 1883 | "version": "6.0.1", 1884 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 1885 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 1886 | "dev": true 1887 | }, 1888 | "glob": { 1889 | "version": "7.1.7", 1890 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 1891 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 1892 | "dev": true, 1893 | "requires": { 1894 | "fs.realpath": "^1.0.0", 1895 | "inflight": "^1.0.4", 1896 | "inherits": "2", 1897 | "minimatch": "^3.0.4", 1898 | "once": "^1.3.0", 1899 | "path-is-absolute": "^1.0.0" 1900 | } 1901 | }, 1902 | "globals": { 1903 | "version": "11.12.0", 1904 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1905 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1906 | "dev": true 1907 | }, 1908 | "graceful-fs": { 1909 | "version": "4.2.6", 1910 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 1911 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", 1912 | "dev": true 1913 | }, 1914 | "graphql": { 1915 | "version": "15.5.1", 1916 | "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.5.1.tgz", 1917 | "integrity": "sha512-FeTRX67T3LoE3LWAxxOlW2K3Bz+rMYAC18rRguK4wgXaTZMiJwSUwDmPFo3UadAKbzirKIg5Qy+sNJXbpPRnQw==" 1918 | }, 1919 | "graphql-tag": { 1920 | "version": "2.12.5", 1921 | "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.5.tgz", 1922 | "integrity": "sha512-5xNhP4063d16Pz3HBtKprutsPrmHZi5IdUGOWRxA2B6VF7BIRGOHZ5WQvDmJXZuPcBg7rYwaFxvQYjqkSdR3TQ==", 1923 | "requires": { 1924 | "tslib": "^2.1.0" 1925 | } 1926 | }, 1927 | "has": { 1928 | "version": "1.0.3", 1929 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1930 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1931 | "dev": true, 1932 | "requires": { 1933 | "function-bind": "^1.1.1" 1934 | } 1935 | }, 1936 | "has-flag": { 1937 | "version": "4.0.0", 1938 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1939 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1940 | "dev": true 1941 | }, 1942 | "html-encoding-sniffer": { 1943 | "version": "2.0.1", 1944 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", 1945 | "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", 1946 | "dev": true, 1947 | "requires": { 1948 | "whatwg-encoding": "^1.0.5" 1949 | } 1950 | }, 1951 | "html-escaper": { 1952 | "version": "2.0.2", 1953 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 1954 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 1955 | "dev": true 1956 | }, 1957 | "http-parser-js": { 1958 | "version": "0.5.3", 1959 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", 1960 | "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" 1961 | }, 1962 | "http-proxy-agent": { 1963 | "version": "4.0.1", 1964 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 1965 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 1966 | "dev": true, 1967 | "requires": { 1968 | "@tootallnate/once": "1", 1969 | "agent-base": "6", 1970 | "debug": "4" 1971 | } 1972 | }, 1973 | "https-proxy-agent": { 1974 | "version": "5.0.0", 1975 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 1976 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 1977 | "dev": true, 1978 | "requires": { 1979 | "agent-base": "6", 1980 | "debug": "4" 1981 | } 1982 | }, 1983 | "human-signals": { 1984 | "version": "2.1.0", 1985 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 1986 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", 1987 | "dev": true 1988 | }, 1989 | "iconv-lite": { 1990 | "version": "0.4.24", 1991 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1992 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1993 | "dev": true, 1994 | "requires": { 1995 | "safer-buffer": ">= 2.1.2 < 3" 1996 | } 1997 | }, 1998 | "idb": { 1999 | "version": "3.0.2", 2000 | "resolved": "https://registry.npmjs.org/idb/-/idb-3.0.2.tgz", 2001 | "integrity": "sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw==" 2002 | }, 2003 | "import-local": { 2004 | "version": "3.0.2", 2005 | "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", 2006 | "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", 2007 | "dev": true, 2008 | "requires": { 2009 | "pkg-dir": "^4.2.0", 2010 | "resolve-cwd": "^3.0.0" 2011 | } 2012 | }, 2013 | "imurmurhash": { 2014 | "version": "0.1.4", 2015 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2016 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 2017 | "dev": true 2018 | }, 2019 | "inflight": { 2020 | "version": "1.0.6", 2021 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2022 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 2023 | "dev": true, 2024 | "requires": { 2025 | "once": "^1.3.0", 2026 | "wrappy": "1" 2027 | } 2028 | }, 2029 | "inherits": { 2030 | "version": "2.0.4", 2031 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2032 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2033 | "dev": true 2034 | }, 2035 | "is-ci": { 2036 | "version": "3.0.0", 2037 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", 2038 | "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", 2039 | "dev": true, 2040 | "requires": { 2041 | "ci-info": "^3.1.1" 2042 | } 2043 | }, 2044 | "is-core-module": { 2045 | "version": "2.5.0", 2046 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", 2047 | "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", 2048 | "dev": true, 2049 | "requires": { 2050 | "has": "^1.0.3" 2051 | } 2052 | }, 2053 | "is-fullwidth-code-point": { 2054 | "version": "3.0.0", 2055 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2056 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 2057 | }, 2058 | "is-generator-fn": { 2059 | "version": "2.1.0", 2060 | "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", 2061 | "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", 2062 | "dev": true 2063 | }, 2064 | "is-number": { 2065 | "version": "7.0.0", 2066 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2067 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2068 | "dev": true 2069 | }, 2070 | "is-potential-custom-element-name": { 2071 | "version": "1.0.1", 2072 | "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", 2073 | "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", 2074 | "dev": true 2075 | }, 2076 | "is-stream": { 2077 | "version": "2.0.0", 2078 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", 2079 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", 2080 | "dev": true 2081 | }, 2082 | "is-typedarray": { 2083 | "version": "1.0.0", 2084 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 2085 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 2086 | "dev": true 2087 | }, 2088 | "isexe": { 2089 | "version": "2.0.0", 2090 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2091 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 2092 | "dev": true 2093 | }, 2094 | "istanbul-lib-coverage": { 2095 | "version": "3.0.0", 2096 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", 2097 | "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", 2098 | "dev": true 2099 | }, 2100 | "istanbul-lib-instrument": { 2101 | "version": "4.0.3", 2102 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", 2103 | "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", 2104 | "dev": true, 2105 | "requires": { 2106 | "@babel/core": "^7.7.5", 2107 | "@istanbuljs/schema": "^0.1.2", 2108 | "istanbul-lib-coverage": "^3.0.0", 2109 | "semver": "^6.3.0" 2110 | } 2111 | }, 2112 | "istanbul-lib-report": { 2113 | "version": "3.0.0", 2114 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 2115 | "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", 2116 | "dev": true, 2117 | "requires": { 2118 | "istanbul-lib-coverage": "^3.0.0", 2119 | "make-dir": "^3.0.0", 2120 | "supports-color": "^7.1.0" 2121 | } 2122 | }, 2123 | "istanbul-lib-source-maps": { 2124 | "version": "4.0.0", 2125 | "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", 2126 | "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", 2127 | "dev": true, 2128 | "requires": { 2129 | "debug": "^4.1.1", 2130 | "istanbul-lib-coverage": "^3.0.0", 2131 | "source-map": "^0.6.1" 2132 | } 2133 | }, 2134 | "istanbul-reports": { 2135 | "version": "3.0.2", 2136 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", 2137 | "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", 2138 | "dev": true, 2139 | "requires": { 2140 | "html-escaper": "^2.0.0", 2141 | "istanbul-lib-report": "^3.0.0" 2142 | } 2143 | }, 2144 | "jest": { 2145 | "version": "27.0.6", 2146 | "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.6.tgz", 2147 | "integrity": "sha512-EjV8aETrsD0wHl7CKMibKwQNQc3gIRBXlTikBmmHUeVMKaPFxdcUIBfoDqTSXDoGJIivAYGqCWVlzCSaVjPQsA==", 2148 | "dev": true, 2149 | "requires": { 2150 | "@jest/core": "^27.0.6", 2151 | "import-local": "^3.0.2", 2152 | "jest-cli": "^27.0.6" 2153 | } 2154 | }, 2155 | "jest-changed-files": { 2156 | "version": "27.0.6", 2157 | "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.0.6.tgz", 2158 | "integrity": "sha512-BuL/ZDauaq5dumYh5y20sn4IISnf1P9A0TDswTxUi84ORGtVa86ApuBHqICL0vepqAnZiY6a7xeSPWv2/yy4eA==", 2159 | "dev": true, 2160 | "requires": { 2161 | "@jest/types": "^27.0.6", 2162 | "execa": "^5.0.0", 2163 | "throat": "^6.0.1" 2164 | } 2165 | }, 2166 | "jest-circus": { 2167 | "version": "27.0.6", 2168 | "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.0.6.tgz", 2169 | "integrity": "sha512-OJlsz6BBeX9qR+7O9lXefWoc2m9ZqcZ5Ohlzz0pTEAG4xMiZUJoacY8f4YDHxgk0oKYxj277AfOk9w6hZYvi1Q==", 2170 | "dev": true, 2171 | "requires": { 2172 | "@jest/environment": "^27.0.6", 2173 | "@jest/test-result": "^27.0.6", 2174 | "@jest/types": "^27.0.6", 2175 | "@types/node": "*", 2176 | "chalk": "^4.0.0", 2177 | "co": "^4.6.0", 2178 | "dedent": "^0.7.0", 2179 | "expect": "^27.0.6", 2180 | "is-generator-fn": "^2.0.0", 2181 | "jest-each": "^27.0.6", 2182 | "jest-matcher-utils": "^27.0.6", 2183 | "jest-message-util": "^27.0.6", 2184 | "jest-runtime": "^27.0.6", 2185 | "jest-snapshot": "^27.0.6", 2186 | "jest-util": "^27.0.6", 2187 | "pretty-format": "^27.0.6", 2188 | "slash": "^3.0.0", 2189 | "stack-utils": "^2.0.3", 2190 | "throat": "^6.0.1" 2191 | } 2192 | }, 2193 | "jest-cli": { 2194 | "version": "27.0.6", 2195 | "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.0.6.tgz", 2196 | "integrity": "sha512-qUUVlGb9fdKir3RDE+B10ULI+LQrz+MCflEH2UJyoUjoHHCbxDrMxSzjQAPUMsic4SncI62ofYCcAvW6+6rhhg==", 2197 | "dev": true, 2198 | "requires": { 2199 | "@jest/core": "^27.0.6", 2200 | "@jest/test-result": "^27.0.6", 2201 | "@jest/types": "^27.0.6", 2202 | "chalk": "^4.0.0", 2203 | "exit": "^0.1.2", 2204 | "graceful-fs": "^4.2.4", 2205 | "import-local": "^3.0.2", 2206 | "jest-config": "^27.0.6", 2207 | "jest-util": "^27.0.6", 2208 | "jest-validate": "^27.0.6", 2209 | "prompts": "^2.0.1", 2210 | "yargs": "^16.0.3" 2211 | }, 2212 | "dependencies": { 2213 | "jest-config": { 2214 | "version": "27.0.6", 2215 | "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.0.6.tgz", 2216 | "integrity": "sha512-JZRR3I1Plr2YxPBhgqRspDE2S5zprbga3swYNrvY3HfQGu7p/GjyLOqwrYad97tX3U3mzT53TPHVmozacfP/3w==", 2217 | "dev": true, 2218 | "requires": { 2219 | "@babel/core": "^7.1.0", 2220 | "@jest/test-sequencer": "^27.0.6", 2221 | "@jest/types": "^27.0.6", 2222 | "babel-jest": "^27.0.6", 2223 | "chalk": "^4.0.0", 2224 | "deepmerge": "^4.2.2", 2225 | "glob": "^7.1.1", 2226 | "graceful-fs": "^4.2.4", 2227 | "is-ci": "^3.0.0", 2228 | "jest-circus": "^27.0.6", 2229 | "jest-environment-jsdom": "^27.0.6", 2230 | "jest-environment-node": "^27.0.6", 2231 | "jest-get-type": "^27.0.6", 2232 | "jest-jasmine2": "^27.0.6", 2233 | "jest-regex-util": "^27.0.6", 2234 | "jest-resolve": "^27.0.6", 2235 | "jest-runner": "^27.0.6", 2236 | "jest-util": "^27.0.6", 2237 | "jest-validate": "^27.0.6", 2238 | "micromatch": "^4.0.4", 2239 | "pretty-format": "^27.0.6" 2240 | } 2241 | }, 2242 | "ts-node": { 2243 | "version": "10.1.0", 2244 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.1.0.tgz", 2245 | "integrity": "sha512-6szn3+J9WyG2hE+5W8e0ruZrzyk1uFLYye6IGMBadnOzDh8aP7t8CbFpsfCiEx2+wMixAhjFt7lOZC4+l+WbEA==", 2246 | "requires": { 2247 | "arg": "^4.1.0", 2248 | "diff": "^4.0.1", 2249 | "make-error": "^1.1.1", 2250 | "source-map-support": "^0.5.17", 2251 | "yn": "3.1.1" 2252 | } 2253 | } 2254 | } 2255 | }, 2256 | "jest-diff": { 2257 | "version": "27.0.6", 2258 | "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz", 2259 | "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==", 2260 | "dev": true, 2261 | "requires": { 2262 | "chalk": "^4.0.0", 2263 | "diff-sequences": "^27.0.6", 2264 | "jest-get-type": "^27.0.6", 2265 | "pretty-format": "^27.0.6" 2266 | } 2267 | }, 2268 | "jest-docblock": { 2269 | "version": "27.0.6", 2270 | "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.6.tgz", 2271 | "integrity": "sha512-Fid6dPcjwepTFraz0YxIMCi7dejjJ/KL9FBjPYhBp4Sv1Y9PdhImlKZqYU555BlN4TQKaTc+F2Av1z+anVyGkA==", 2272 | "dev": true, 2273 | "requires": { 2274 | "detect-newline": "^3.0.0" 2275 | } 2276 | }, 2277 | "jest-each": { 2278 | "version": "27.0.6", 2279 | "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.6.tgz", 2280 | "integrity": "sha512-m6yKcV3bkSWrUIjxkE9OC0mhBZZdhovIW5ergBYirqnkLXkyEn3oUUF/QZgyecA1cF1QFyTE8bRRl8Tfg1pfLA==", 2281 | "dev": true, 2282 | "requires": { 2283 | "@jest/types": "^27.0.6", 2284 | "chalk": "^4.0.0", 2285 | "jest-get-type": "^27.0.6", 2286 | "jest-util": "^27.0.6", 2287 | "pretty-format": "^27.0.6" 2288 | } 2289 | }, 2290 | "jest-environment-jsdom": { 2291 | "version": "27.0.6", 2292 | "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.0.6.tgz", 2293 | "integrity": "sha512-FvetXg7lnXL9+78H+xUAsra3IeZRTiegA3An01cWeXBspKXUhAwMM9ycIJ4yBaR0L7HkoMPaZsozCLHh4T8fuw==", 2294 | "dev": true, 2295 | "requires": { 2296 | "@jest/environment": "^27.0.6", 2297 | "@jest/fake-timers": "^27.0.6", 2298 | "@jest/types": "^27.0.6", 2299 | "@types/node": "*", 2300 | "jest-mock": "^27.0.6", 2301 | "jest-util": "^27.0.6", 2302 | "jsdom": "^16.6.0" 2303 | } 2304 | }, 2305 | "jest-environment-node": { 2306 | "version": "27.0.6", 2307 | "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.0.6.tgz", 2308 | "integrity": "sha512-+Vi6yLrPg/qC81jfXx3IBlVnDTI6kmRr08iVa2hFCWmJt4zha0XW7ucQltCAPhSR0FEKEoJ3i+W4E6T0s9is0w==", 2309 | "dev": true, 2310 | "requires": { 2311 | "@jest/environment": "^27.0.6", 2312 | "@jest/fake-timers": "^27.0.6", 2313 | "@jest/types": "^27.0.6", 2314 | "@types/node": "*", 2315 | "jest-mock": "^27.0.6", 2316 | "jest-util": "^27.0.6" 2317 | } 2318 | }, 2319 | "jest-get-type": { 2320 | "version": "27.0.6", 2321 | "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz", 2322 | "integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==", 2323 | "dev": true 2324 | }, 2325 | "jest-haste-map": { 2326 | "version": "27.0.6", 2327 | "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz", 2328 | "integrity": "sha512-4ldjPXX9h8doB2JlRzg9oAZ2p6/GpQUNAeiYXqcpmrKbP0Qev0wdZlxSMOmz8mPOEnt4h6qIzXFLDi8RScX/1w==", 2329 | "dev": true, 2330 | "requires": { 2331 | "@jest/types": "^27.0.6", 2332 | "@types/graceful-fs": "^4.1.2", 2333 | "@types/node": "*", 2334 | "anymatch": "^3.0.3", 2335 | "fb-watchman": "^2.0.0", 2336 | "fsevents": "^2.3.2", 2337 | "graceful-fs": "^4.2.4", 2338 | "jest-regex-util": "^27.0.6", 2339 | "jest-serializer": "^27.0.6", 2340 | "jest-util": "^27.0.6", 2341 | "jest-worker": "^27.0.6", 2342 | "micromatch": "^4.0.4", 2343 | "walker": "^1.0.7" 2344 | } 2345 | }, 2346 | "jest-jasmine2": { 2347 | "version": "27.0.6", 2348 | "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.0.6.tgz", 2349 | "integrity": "sha512-cjpH2sBy+t6dvCeKBsHpW41mjHzXgsavaFMp+VWRf0eR4EW8xASk1acqmljFtK2DgyIECMv2yCdY41r2l1+4iA==", 2350 | "dev": true, 2351 | "requires": { 2352 | "@babel/traverse": "^7.1.0", 2353 | "@jest/environment": "^27.0.6", 2354 | "@jest/source-map": "^27.0.6", 2355 | "@jest/test-result": "^27.0.6", 2356 | "@jest/types": "^27.0.6", 2357 | "@types/node": "*", 2358 | "chalk": "^4.0.0", 2359 | "co": "^4.6.0", 2360 | "expect": "^27.0.6", 2361 | "is-generator-fn": "^2.0.0", 2362 | "jest-each": "^27.0.6", 2363 | "jest-matcher-utils": "^27.0.6", 2364 | "jest-message-util": "^27.0.6", 2365 | "jest-runtime": "^27.0.6", 2366 | "jest-snapshot": "^27.0.6", 2367 | "jest-util": "^27.0.6", 2368 | "pretty-format": "^27.0.6", 2369 | "throat": "^6.0.1" 2370 | } 2371 | }, 2372 | "jest-leak-detector": { 2373 | "version": "27.0.6", 2374 | "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.0.6.tgz", 2375 | "integrity": "sha512-2/d6n2wlH5zEcdctX4zdbgX8oM61tb67PQt4Xh8JFAIy6LRKUnX528HulkaG6nD5qDl5vRV1NXejCe1XRCH5gQ==", 2376 | "dev": true, 2377 | "requires": { 2378 | "jest-get-type": "^27.0.6", 2379 | "pretty-format": "^27.0.6" 2380 | } 2381 | }, 2382 | "jest-matcher-utils": { 2383 | "version": "27.0.6", 2384 | "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz", 2385 | "integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==", 2386 | "dev": true, 2387 | "requires": { 2388 | "chalk": "^4.0.0", 2389 | "jest-diff": "^27.0.6", 2390 | "jest-get-type": "^27.0.6", 2391 | "pretty-format": "^27.0.6" 2392 | } 2393 | }, 2394 | "jest-message-util": { 2395 | "version": "27.0.6", 2396 | "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz", 2397 | "integrity": "sha512-rBxIs2XK7rGy+zGxgi+UJKP6WqQ+KrBbD1YMj517HYN3v2BG66t3Xan3FWqYHKZwjdB700KiAJ+iES9a0M+ixw==", 2398 | "dev": true, 2399 | "requires": { 2400 | "@babel/code-frame": "^7.12.13", 2401 | "@jest/types": "^27.0.6", 2402 | "@types/stack-utils": "^2.0.0", 2403 | "chalk": "^4.0.0", 2404 | "graceful-fs": "^4.2.4", 2405 | "micromatch": "^4.0.4", 2406 | "pretty-format": "^27.0.6", 2407 | "slash": "^3.0.0", 2408 | "stack-utils": "^2.0.3" 2409 | } 2410 | }, 2411 | "jest-mock": { 2412 | "version": "27.0.6", 2413 | "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.0.6.tgz", 2414 | "integrity": "sha512-lzBETUoK8cSxts2NYXSBWT+EJNzmUVtVVwS1sU9GwE1DLCfGsngg+ZVSIe0yd0ZSm+y791esiuo+WSwpXJQ5Bw==", 2415 | "dev": true, 2416 | "requires": { 2417 | "@jest/types": "^27.0.6", 2418 | "@types/node": "*" 2419 | } 2420 | }, 2421 | "jest-pnp-resolver": { 2422 | "version": "1.2.2", 2423 | "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", 2424 | "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", 2425 | "dev": true 2426 | }, 2427 | "jest-regex-util": { 2428 | "version": "27.0.6", 2429 | "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.0.6.tgz", 2430 | "integrity": "sha512-SUhPzBsGa1IKm8hx2F4NfTGGp+r7BXJ4CulsZ1k2kI+mGLG+lxGrs76veN2LF/aUdGosJBzKgXmNCw+BzFqBDQ==", 2431 | "dev": true 2432 | }, 2433 | "jest-resolve": { 2434 | "version": "27.0.6", 2435 | "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.0.6.tgz", 2436 | "integrity": "sha512-yKmIgw2LgTh7uAJtzv8UFHGF7Dm7XfvOe/LQ3Txv101fLM8cx2h1QVwtSJ51Q/SCxpIiKfVn6G2jYYMDNHZteA==", 2437 | "dev": true, 2438 | "requires": { 2439 | "@jest/types": "^27.0.6", 2440 | "chalk": "^4.0.0", 2441 | "escalade": "^3.1.1", 2442 | "graceful-fs": "^4.2.4", 2443 | "jest-pnp-resolver": "^1.2.2", 2444 | "jest-util": "^27.0.6", 2445 | "jest-validate": "^27.0.6", 2446 | "resolve": "^1.20.0", 2447 | "slash": "^3.0.0" 2448 | } 2449 | }, 2450 | "jest-resolve-dependencies": { 2451 | "version": "27.0.6", 2452 | "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.0.6.tgz", 2453 | "integrity": "sha512-mg9x9DS3BPAREWKCAoyg3QucCr0n6S8HEEsqRCKSPjPcu9HzRILzhdzY3imsLoZWeosEbJZz6TKasveczzpJZA==", 2454 | "dev": true, 2455 | "requires": { 2456 | "@jest/types": "^27.0.6", 2457 | "jest-regex-util": "^27.0.6", 2458 | "jest-snapshot": "^27.0.6" 2459 | } 2460 | }, 2461 | "jest-runner": { 2462 | "version": "27.0.6", 2463 | "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.0.6.tgz", 2464 | "integrity": "sha512-W3Bz5qAgaSChuivLn+nKOgjqNxM7O/9JOJoKDCqThPIg2sH/d4A/lzyiaFgnb9V1/w29Le11NpzTJSzga1vyYQ==", 2465 | "dev": true, 2466 | "requires": { 2467 | "@jest/console": "^27.0.6", 2468 | "@jest/environment": "^27.0.6", 2469 | "@jest/test-result": "^27.0.6", 2470 | "@jest/transform": "^27.0.6", 2471 | "@jest/types": "^27.0.6", 2472 | "@types/node": "*", 2473 | "chalk": "^4.0.0", 2474 | "emittery": "^0.8.1", 2475 | "exit": "^0.1.2", 2476 | "graceful-fs": "^4.2.4", 2477 | "jest-docblock": "^27.0.6", 2478 | "jest-environment-jsdom": "^27.0.6", 2479 | "jest-environment-node": "^27.0.6", 2480 | "jest-haste-map": "^27.0.6", 2481 | "jest-leak-detector": "^27.0.6", 2482 | "jest-message-util": "^27.0.6", 2483 | "jest-resolve": "^27.0.6", 2484 | "jest-runtime": "^27.0.6", 2485 | "jest-util": "^27.0.6", 2486 | "jest-worker": "^27.0.6", 2487 | "source-map-support": "^0.5.6", 2488 | "throat": "^6.0.1" 2489 | } 2490 | }, 2491 | "jest-runtime": { 2492 | "version": "27.0.6", 2493 | "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.0.6.tgz", 2494 | "integrity": "sha512-BhvHLRVfKibYyqqEFkybsznKwhrsu7AWx2F3y9G9L95VSIN3/ZZ9vBpm/XCS2bS+BWz3sSeNGLzI3TVQ0uL85Q==", 2495 | "dev": true, 2496 | "requires": { 2497 | "@jest/console": "^27.0.6", 2498 | "@jest/environment": "^27.0.6", 2499 | "@jest/fake-timers": "^27.0.6", 2500 | "@jest/globals": "^27.0.6", 2501 | "@jest/source-map": "^27.0.6", 2502 | "@jest/test-result": "^27.0.6", 2503 | "@jest/transform": "^27.0.6", 2504 | "@jest/types": "^27.0.6", 2505 | "@types/yargs": "^16.0.0", 2506 | "chalk": "^4.0.0", 2507 | "cjs-module-lexer": "^1.0.0", 2508 | "collect-v8-coverage": "^1.0.0", 2509 | "exit": "^0.1.2", 2510 | "glob": "^7.1.3", 2511 | "graceful-fs": "^4.2.4", 2512 | "jest-haste-map": "^27.0.6", 2513 | "jest-message-util": "^27.0.6", 2514 | "jest-mock": "^27.0.6", 2515 | "jest-regex-util": "^27.0.6", 2516 | "jest-resolve": "^27.0.6", 2517 | "jest-snapshot": "^27.0.6", 2518 | "jest-util": "^27.0.6", 2519 | "jest-validate": "^27.0.6", 2520 | "slash": "^3.0.0", 2521 | "strip-bom": "^4.0.0", 2522 | "yargs": "^16.0.3" 2523 | } 2524 | }, 2525 | "jest-serializer": { 2526 | "version": "27.0.6", 2527 | "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.0.6.tgz", 2528 | "integrity": "sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==", 2529 | "dev": true, 2530 | "requires": { 2531 | "@types/node": "*", 2532 | "graceful-fs": "^4.2.4" 2533 | } 2534 | }, 2535 | "jest-snapshot": { 2536 | "version": "27.0.6", 2537 | "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.0.6.tgz", 2538 | "integrity": "sha512-NTHaz8He+ATUagUgE7C/UtFcRoHqR2Gc+KDfhQIyx+VFgwbeEMjeP+ILpUTLosZn/ZtbNdCF5LkVnN/l+V751A==", 2539 | "dev": true, 2540 | "requires": { 2541 | "@babel/core": "^7.7.2", 2542 | "@babel/generator": "^7.7.2", 2543 | "@babel/parser": "^7.7.2", 2544 | "@babel/plugin-syntax-typescript": "^7.7.2", 2545 | "@babel/traverse": "^7.7.2", 2546 | "@babel/types": "^7.0.0", 2547 | "@jest/transform": "^27.0.6", 2548 | "@jest/types": "^27.0.6", 2549 | "@types/babel__traverse": "^7.0.4", 2550 | "@types/prettier": "^2.1.5", 2551 | "babel-preset-current-node-syntax": "^1.0.0", 2552 | "chalk": "^4.0.0", 2553 | "expect": "^27.0.6", 2554 | "graceful-fs": "^4.2.4", 2555 | "jest-diff": "^27.0.6", 2556 | "jest-get-type": "^27.0.6", 2557 | "jest-haste-map": "^27.0.6", 2558 | "jest-matcher-utils": "^27.0.6", 2559 | "jest-message-util": "^27.0.6", 2560 | "jest-resolve": "^27.0.6", 2561 | "jest-util": "^27.0.6", 2562 | "natural-compare": "^1.4.0", 2563 | "pretty-format": "^27.0.6", 2564 | "semver": "^7.3.2" 2565 | }, 2566 | "dependencies": { 2567 | "semver": { 2568 | "version": "7.3.5", 2569 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 2570 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 2571 | "dev": true, 2572 | "requires": { 2573 | "lru-cache": "^6.0.0" 2574 | } 2575 | } 2576 | } 2577 | }, 2578 | "jest-util": { 2579 | "version": "27.0.6", 2580 | "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.0.6.tgz", 2581 | "integrity": "sha512-1JjlaIh+C65H/F7D11GNkGDDZtDfMEM8EBXsvd+l/cxtgQ6QhxuloOaiayt89DxUvDarbVhqI98HhgrM1yliFQ==", 2582 | "dev": true, 2583 | "requires": { 2584 | "@jest/types": "^27.0.6", 2585 | "@types/node": "*", 2586 | "chalk": "^4.0.0", 2587 | "graceful-fs": "^4.2.4", 2588 | "is-ci": "^3.0.0", 2589 | "picomatch": "^2.2.3" 2590 | } 2591 | }, 2592 | "jest-validate": { 2593 | "version": "27.0.6", 2594 | "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.0.6.tgz", 2595 | "integrity": "sha512-yhZZOaMH3Zg6DC83n60pLmdU1DQE46DW+KLozPiPbSbPhlXXaiUTDlhHQhHFpaqIFRrInko1FHXjTRpjWRuWfA==", 2596 | "dev": true, 2597 | "requires": { 2598 | "@jest/types": "^27.0.6", 2599 | "camelcase": "^6.2.0", 2600 | "chalk": "^4.0.0", 2601 | "jest-get-type": "^27.0.6", 2602 | "leven": "^3.1.0", 2603 | "pretty-format": "^27.0.6" 2604 | }, 2605 | "dependencies": { 2606 | "camelcase": { 2607 | "version": "6.2.0", 2608 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", 2609 | "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", 2610 | "dev": true 2611 | } 2612 | } 2613 | }, 2614 | "jest-watcher": { 2615 | "version": "27.0.6", 2616 | "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.0.6.tgz", 2617 | "integrity": "sha512-/jIoKBhAP00/iMGnTwUBLgvxkn7vsOweDrOTSPzc7X9uOyUtJIDthQBTI1EXz90bdkrxorUZVhJwiB69gcHtYQ==", 2618 | "dev": true, 2619 | "requires": { 2620 | "@jest/test-result": "^27.0.6", 2621 | "@jest/types": "^27.0.6", 2622 | "@types/node": "*", 2623 | "ansi-escapes": "^4.2.1", 2624 | "chalk": "^4.0.0", 2625 | "jest-util": "^27.0.6", 2626 | "string-length": "^4.0.1" 2627 | } 2628 | }, 2629 | "jest-worker": { 2630 | "version": "27.0.6", 2631 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.6.tgz", 2632 | "integrity": "sha512-qupxcj/dRuA3xHPMUd40gr2EaAurFbkwzOh7wfPaeE9id7hyjURRQoqNfHifHK3XjJU6YJJUQKILGUnwGPEOCA==", 2633 | "dev": true, 2634 | "requires": { 2635 | "@types/node": "*", 2636 | "merge-stream": "^2.0.0", 2637 | "supports-color": "^8.0.0" 2638 | }, 2639 | "dependencies": { 2640 | "supports-color": { 2641 | "version": "8.1.1", 2642 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2643 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2644 | "dev": true, 2645 | "requires": { 2646 | "has-flag": "^4.0.0" 2647 | } 2648 | } 2649 | } 2650 | }, 2651 | "js-tokens": { 2652 | "version": "4.0.0", 2653 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2654 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2655 | "dev": true 2656 | }, 2657 | "js-yaml": { 2658 | "version": "3.14.1", 2659 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 2660 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 2661 | "dev": true, 2662 | "requires": { 2663 | "argparse": "^1.0.7", 2664 | "esprima": "^4.0.0" 2665 | } 2666 | }, 2667 | "jsdom": { 2668 | "version": "16.6.0", 2669 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz", 2670 | "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==", 2671 | "dev": true, 2672 | "requires": { 2673 | "abab": "^2.0.5", 2674 | "acorn": "^8.2.4", 2675 | "acorn-globals": "^6.0.0", 2676 | "cssom": "^0.4.4", 2677 | "cssstyle": "^2.3.0", 2678 | "data-urls": "^2.0.0", 2679 | "decimal.js": "^10.2.1", 2680 | "domexception": "^2.0.1", 2681 | "escodegen": "^2.0.0", 2682 | "form-data": "^3.0.0", 2683 | "html-encoding-sniffer": "^2.0.1", 2684 | "http-proxy-agent": "^4.0.1", 2685 | "https-proxy-agent": "^5.0.0", 2686 | "is-potential-custom-element-name": "^1.0.1", 2687 | "nwsapi": "^2.2.0", 2688 | "parse5": "6.0.1", 2689 | "saxes": "^5.0.1", 2690 | "symbol-tree": "^3.2.4", 2691 | "tough-cookie": "^4.0.0", 2692 | "w3c-hr-time": "^1.0.2", 2693 | "w3c-xmlserializer": "^2.0.0", 2694 | "webidl-conversions": "^6.1.0", 2695 | "whatwg-encoding": "^1.0.5", 2696 | "whatwg-mimetype": "^2.3.0", 2697 | "whatwg-url": "^8.5.0", 2698 | "ws": "^7.4.5", 2699 | "xml-name-validator": "^3.0.0" 2700 | } 2701 | }, 2702 | "jsesc": { 2703 | "version": "2.5.2", 2704 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 2705 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 2706 | "dev": true 2707 | }, 2708 | "json5": { 2709 | "version": "2.2.0", 2710 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", 2711 | "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", 2712 | "dev": true, 2713 | "requires": { 2714 | "minimist": "^1.2.5" 2715 | } 2716 | }, 2717 | "kleur": { 2718 | "version": "3.0.3", 2719 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", 2720 | "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", 2721 | "dev": true 2722 | }, 2723 | "leven": { 2724 | "version": "3.1.0", 2725 | "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", 2726 | "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", 2727 | "dev": true 2728 | }, 2729 | "levn": { 2730 | "version": "0.3.0", 2731 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 2732 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 2733 | "dev": true, 2734 | "requires": { 2735 | "prelude-ls": "~1.1.2", 2736 | "type-check": "~0.3.2" 2737 | } 2738 | }, 2739 | "locate-path": { 2740 | "version": "5.0.0", 2741 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 2742 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 2743 | "dev": true, 2744 | "requires": { 2745 | "p-locate": "^4.1.0" 2746 | } 2747 | }, 2748 | "lodash": { 2749 | "version": "4.17.21", 2750 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2751 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2752 | "dev": true 2753 | }, 2754 | "lodash.camelcase": { 2755 | "version": "4.3.0", 2756 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 2757 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 2758 | }, 2759 | "long": { 2760 | "version": "4.0.0", 2761 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 2762 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 2763 | }, 2764 | "lru-cache": { 2765 | "version": "6.0.0", 2766 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2767 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2768 | "dev": true, 2769 | "requires": { 2770 | "yallist": "^4.0.0" 2771 | } 2772 | }, 2773 | "make-dir": { 2774 | "version": "3.1.0", 2775 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 2776 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 2777 | "dev": true, 2778 | "requires": { 2779 | "semver": "^6.0.0" 2780 | } 2781 | }, 2782 | "make-error": { 2783 | "version": "1.3.6", 2784 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 2785 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" 2786 | }, 2787 | "makeerror": { 2788 | "version": "1.0.11", 2789 | "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", 2790 | "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", 2791 | "dev": true, 2792 | "requires": { 2793 | "tmpl": "1.0.x" 2794 | } 2795 | }, 2796 | "merge-stream": { 2797 | "version": "2.0.0", 2798 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 2799 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 2800 | "dev": true 2801 | }, 2802 | "micromatch": { 2803 | "version": "4.0.4", 2804 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", 2805 | "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", 2806 | "dev": true, 2807 | "requires": { 2808 | "braces": "^3.0.1", 2809 | "picomatch": "^2.2.3" 2810 | } 2811 | }, 2812 | "mime-db": { 2813 | "version": "1.48.0", 2814 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", 2815 | "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", 2816 | "dev": true 2817 | }, 2818 | "mime-types": { 2819 | "version": "2.1.31", 2820 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", 2821 | "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", 2822 | "dev": true, 2823 | "requires": { 2824 | "mime-db": "1.48.0" 2825 | } 2826 | }, 2827 | "mimic-fn": { 2828 | "version": "2.1.0", 2829 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2830 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 2831 | "dev": true 2832 | }, 2833 | "minimatch": { 2834 | "version": "3.0.4", 2835 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2836 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2837 | "dev": true, 2838 | "requires": { 2839 | "brace-expansion": "^1.1.7" 2840 | } 2841 | }, 2842 | "minimist": { 2843 | "version": "1.2.5", 2844 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 2845 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 2846 | "dev": true 2847 | }, 2848 | "mkdirp": { 2849 | "version": "1.0.4", 2850 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 2851 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 2852 | "dev": true 2853 | }, 2854 | "ms": { 2855 | "version": "2.1.2", 2856 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2857 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2858 | "dev": true 2859 | }, 2860 | "natural-compare": { 2861 | "version": "1.4.0", 2862 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2863 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 2864 | "dev": true 2865 | }, 2866 | "node-fetch": { 2867 | "version": "2.6.1", 2868 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 2869 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 2870 | }, 2871 | "node-int64": { 2872 | "version": "0.4.0", 2873 | "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", 2874 | "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", 2875 | "dev": true 2876 | }, 2877 | "node-modules-regexp": { 2878 | "version": "1.0.0", 2879 | "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", 2880 | "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", 2881 | "dev": true 2882 | }, 2883 | "node-releases": { 2884 | "version": "1.1.73", 2885 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", 2886 | "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", 2887 | "dev": true 2888 | }, 2889 | "normalize-path": { 2890 | "version": "3.0.0", 2891 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2892 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2893 | "dev": true 2894 | }, 2895 | "npm-auto-version": { 2896 | "version": "1.0.0", 2897 | "resolved": "https://registry.npmjs.org/npm-auto-version/-/npm-auto-version-1.0.0.tgz", 2898 | "integrity": "sha1-b21s8b2JEL5U71DnOMCfgSWE3jI=", 2899 | "dev": true, 2900 | "requires": { 2901 | "semver": "^5.0.3" 2902 | }, 2903 | "dependencies": { 2904 | "semver": { 2905 | "version": "5.7.1", 2906 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2907 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 2908 | "dev": true 2909 | } 2910 | } 2911 | }, 2912 | "npm-run-path": { 2913 | "version": "4.0.1", 2914 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 2915 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 2916 | "dev": true, 2917 | "requires": { 2918 | "path-key": "^3.0.0" 2919 | } 2920 | }, 2921 | "nwsapi": { 2922 | "version": "2.2.0", 2923 | "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", 2924 | "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", 2925 | "dev": true 2926 | }, 2927 | "once": { 2928 | "version": "1.4.0", 2929 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2930 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2931 | "dev": true, 2932 | "requires": { 2933 | "wrappy": "1" 2934 | } 2935 | }, 2936 | "onetime": { 2937 | "version": "5.1.2", 2938 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 2939 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 2940 | "dev": true, 2941 | "requires": { 2942 | "mimic-fn": "^2.1.0" 2943 | } 2944 | }, 2945 | "optionator": { 2946 | "version": "0.8.3", 2947 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 2948 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 2949 | "dev": true, 2950 | "requires": { 2951 | "deep-is": "~0.1.3", 2952 | "fast-levenshtein": "~2.0.6", 2953 | "levn": "~0.3.0", 2954 | "prelude-ls": "~1.1.2", 2955 | "type-check": "~0.3.2", 2956 | "word-wrap": "~1.2.3" 2957 | } 2958 | }, 2959 | "p-each-series": { 2960 | "version": "2.2.0", 2961 | "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", 2962 | "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", 2963 | "dev": true 2964 | }, 2965 | "p-limit": { 2966 | "version": "2.3.0", 2967 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2968 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2969 | "dev": true, 2970 | "requires": { 2971 | "p-try": "^2.0.0" 2972 | } 2973 | }, 2974 | "p-locate": { 2975 | "version": "4.1.0", 2976 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2977 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2978 | "dev": true, 2979 | "requires": { 2980 | "p-limit": "^2.2.0" 2981 | } 2982 | }, 2983 | "p-try": { 2984 | "version": "2.2.0", 2985 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2986 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 2987 | "dev": true 2988 | }, 2989 | "parse5": { 2990 | "version": "6.0.1", 2991 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", 2992 | "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", 2993 | "dev": true 2994 | }, 2995 | "path-exists": { 2996 | "version": "4.0.0", 2997 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2998 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2999 | "dev": true 3000 | }, 3001 | "path-is-absolute": { 3002 | "version": "1.0.1", 3003 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 3004 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 3005 | "dev": true 3006 | }, 3007 | "path-key": { 3008 | "version": "3.1.1", 3009 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 3010 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 3011 | "dev": true 3012 | }, 3013 | "path-parse": { 3014 | "version": "1.0.7", 3015 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 3016 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 3017 | "dev": true 3018 | }, 3019 | "picomatch": { 3020 | "version": "2.3.0", 3021 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", 3022 | "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", 3023 | "dev": true 3024 | }, 3025 | "pirates": { 3026 | "version": "4.0.1", 3027 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", 3028 | "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", 3029 | "dev": true, 3030 | "requires": { 3031 | "node-modules-regexp": "^1.0.0" 3032 | } 3033 | }, 3034 | "pkg-dir": { 3035 | "version": "4.2.0", 3036 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 3037 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 3038 | "dev": true, 3039 | "requires": { 3040 | "find-up": "^4.0.0" 3041 | } 3042 | }, 3043 | "prelude-ls": { 3044 | "version": "1.1.2", 3045 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 3046 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 3047 | "dev": true 3048 | }, 3049 | "prettier": { 3050 | "version": "2.3.2", 3051 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", 3052 | "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", 3053 | "dev": true 3054 | }, 3055 | "pretty-format": { 3056 | "version": "27.0.6", 3057 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", 3058 | "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", 3059 | "dev": true, 3060 | "requires": { 3061 | "@jest/types": "^27.0.6", 3062 | "ansi-regex": "^5.0.0", 3063 | "ansi-styles": "^5.0.0", 3064 | "react-is": "^17.0.1" 3065 | }, 3066 | "dependencies": { 3067 | "ansi-styles": { 3068 | "version": "5.2.0", 3069 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 3070 | "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 3071 | "dev": true 3072 | } 3073 | } 3074 | }, 3075 | "promise-polyfill": { 3076 | "version": "8.1.3", 3077 | "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz", 3078 | "integrity": "sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==" 3079 | }, 3080 | "prompts": { 3081 | "version": "2.4.1", 3082 | "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", 3083 | "integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==", 3084 | "dev": true, 3085 | "requires": { 3086 | "kleur": "^3.0.3", 3087 | "sisteransi": "^1.0.5" 3088 | } 3089 | }, 3090 | "protobufjs": { 3091 | "version": "6.11.2", 3092 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", 3093 | "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", 3094 | "requires": { 3095 | "@protobufjs/aspromise": "^1.1.2", 3096 | "@protobufjs/base64": "^1.1.2", 3097 | "@protobufjs/codegen": "^2.0.4", 3098 | "@protobufjs/eventemitter": "^1.1.0", 3099 | "@protobufjs/fetch": "^1.1.0", 3100 | "@protobufjs/float": "^1.0.2", 3101 | "@protobufjs/inquire": "^1.1.0", 3102 | "@protobufjs/path": "^1.1.2", 3103 | "@protobufjs/pool": "^1.1.0", 3104 | "@protobufjs/utf8": "^1.1.0", 3105 | "@types/long": "^4.0.1", 3106 | "@types/node": ">=13.7.0", 3107 | "long": "^4.0.0" 3108 | } 3109 | }, 3110 | "psl": { 3111 | "version": "1.8.0", 3112 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 3113 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", 3114 | "dev": true 3115 | }, 3116 | "punycode": { 3117 | "version": "2.1.1", 3118 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 3119 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 3120 | "dev": true 3121 | }, 3122 | "react-is": { 3123 | "version": "17.0.2", 3124 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", 3125 | "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", 3126 | "dev": true 3127 | }, 3128 | "require-directory": { 3129 | "version": "2.1.1", 3130 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 3131 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 3132 | }, 3133 | "resolve": { 3134 | "version": "1.20.0", 3135 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", 3136 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", 3137 | "dev": true, 3138 | "requires": { 3139 | "is-core-module": "^2.2.0", 3140 | "path-parse": "^1.0.6" 3141 | } 3142 | }, 3143 | "resolve-cwd": { 3144 | "version": "3.0.0", 3145 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", 3146 | "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", 3147 | "dev": true, 3148 | "requires": { 3149 | "resolve-from": "^5.0.0" 3150 | } 3151 | }, 3152 | "resolve-from": { 3153 | "version": "5.0.0", 3154 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 3155 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 3156 | "dev": true 3157 | }, 3158 | "rimraf": { 3159 | "version": "3.0.2", 3160 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 3161 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 3162 | "dev": true, 3163 | "requires": { 3164 | "glob": "^7.1.3" 3165 | } 3166 | }, 3167 | "safe-buffer": { 3168 | "version": "5.1.2", 3169 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 3170 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 3171 | }, 3172 | "safer-buffer": { 3173 | "version": "2.1.2", 3174 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 3175 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 3176 | "dev": true 3177 | }, 3178 | "saxes": { 3179 | "version": "5.0.1", 3180 | "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", 3181 | "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", 3182 | "dev": true, 3183 | "requires": { 3184 | "xmlchars": "^2.2.0" 3185 | } 3186 | }, 3187 | "semver": { 3188 | "version": "6.3.0", 3189 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 3190 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 3191 | "dev": true 3192 | }, 3193 | "shebang-command": { 3194 | "version": "2.0.0", 3195 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 3196 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 3197 | "dev": true, 3198 | "requires": { 3199 | "shebang-regex": "^3.0.0" 3200 | } 3201 | }, 3202 | "shebang-regex": { 3203 | "version": "3.0.0", 3204 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 3205 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 3206 | "dev": true 3207 | }, 3208 | "signal-exit": { 3209 | "version": "3.0.3", 3210 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 3211 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 3212 | "dev": true 3213 | }, 3214 | "sisteransi": { 3215 | "version": "1.0.5", 3216 | "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", 3217 | "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", 3218 | "dev": true 3219 | }, 3220 | "slash": { 3221 | "version": "3.0.0", 3222 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 3223 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 3224 | "dev": true 3225 | }, 3226 | "source-map": { 3227 | "version": "0.6.1", 3228 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3229 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 3230 | }, 3231 | "source-map-support": { 3232 | "version": "0.5.19", 3233 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 3234 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 3235 | "requires": { 3236 | "buffer-from": "^1.0.0", 3237 | "source-map": "^0.6.0" 3238 | } 3239 | }, 3240 | "sprintf-js": { 3241 | "version": "1.0.3", 3242 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3243 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 3244 | "dev": true 3245 | }, 3246 | "stack-utils": { 3247 | "version": "2.0.3", 3248 | "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", 3249 | "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", 3250 | "dev": true, 3251 | "requires": { 3252 | "escape-string-regexp": "^2.0.0" 3253 | } 3254 | }, 3255 | "string-length": { 3256 | "version": "4.0.2", 3257 | "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", 3258 | "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", 3259 | "dev": true, 3260 | "requires": { 3261 | "char-regex": "^1.0.2", 3262 | "strip-ansi": "^6.0.0" 3263 | } 3264 | }, 3265 | "string-width": { 3266 | "version": "4.2.2", 3267 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 3268 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 3269 | "requires": { 3270 | "emoji-regex": "^8.0.0", 3271 | "is-fullwidth-code-point": "^3.0.0", 3272 | "strip-ansi": "^6.0.0" 3273 | } 3274 | }, 3275 | "strip-ansi": { 3276 | "version": "6.0.0", 3277 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 3278 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 3279 | "requires": { 3280 | "ansi-regex": "^5.0.0" 3281 | } 3282 | }, 3283 | "strip-bom": { 3284 | "version": "4.0.0", 3285 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", 3286 | "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", 3287 | "dev": true 3288 | }, 3289 | "strip-final-newline": { 3290 | "version": "2.0.0", 3291 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 3292 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 3293 | "dev": true 3294 | }, 3295 | "supports-color": { 3296 | "version": "7.2.0", 3297 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 3298 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 3299 | "dev": true, 3300 | "requires": { 3301 | "has-flag": "^4.0.0" 3302 | } 3303 | }, 3304 | "supports-hyperlinks": { 3305 | "version": "2.2.0", 3306 | "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", 3307 | "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", 3308 | "dev": true, 3309 | "requires": { 3310 | "has-flag": "^4.0.0", 3311 | "supports-color": "^7.0.0" 3312 | } 3313 | }, 3314 | "symbol-tree": { 3315 | "version": "3.2.4", 3316 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", 3317 | "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", 3318 | "dev": true 3319 | }, 3320 | "terminal-link": { 3321 | "version": "2.1.1", 3322 | "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", 3323 | "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", 3324 | "dev": true, 3325 | "requires": { 3326 | "ansi-escapes": "^4.2.1", 3327 | "supports-hyperlinks": "^2.0.0" 3328 | } 3329 | }, 3330 | "test-exclude": { 3331 | "version": "6.0.0", 3332 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", 3333 | "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", 3334 | "dev": true, 3335 | "requires": { 3336 | "@istanbuljs/schema": "^0.1.2", 3337 | "glob": "^7.1.4", 3338 | "minimatch": "^3.0.4" 3339 | } 3340 | }, 3341 | "throat": { 3342 | "version": "6.0.1", 3343 | "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", 3344 | "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", 3345 | "dev": true 3346 | }, 3347 | "tmpl": { 3348 | "version": "1.0.4", 3349 | "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", 3350 | "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", 3351 | "dev": true 3352 | }, 3353 | "to-fast-properties": { 3354 | "version": "2.0.0", 3355 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 3356 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 3357 | "dev": true 3358 | }, 3359 | "to-regex-range": { 3360 | "version": "5.0.1", 3361 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3362 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3363 | "dev": true, 3364 | "requires": { 3365 | "is-number": "^7.0.0" 3366 | } 3367 | }, 3368 | "tough-cookie": { 3369 | "version": "4.0.0", 3370 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", 3371 | "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", 3372 | "dev": true, 3373 | "requires": { 3374 | "psl": "^1.1.33", 3375 | "punycode": "^2.1.1", 3376 | "universalify": "^0.1.2" 3377 | } 3378 | }, 3379 | "tr46": { 3380 | "version": "2.1.0", 3381 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", 3382 | "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", 3383 | "dev": true, 3384 | "requires": { 3385 | "punycode": "^2.1.1" 3386 | } 3387 | }, 3388 | "ts-jest": { 3389 | "version": "27.0.4", 3390 | "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.4.tgz", 3391 | "integrity": "sha512-c4E1ECy9Xz2WGfTMyHbSaArlIva7Wi2p43QOMmCqjSSjHP06KXv+aT+eSY+yZMuqsMi3k7pyGsGj2q5oSl5WfQ==", 3392 | "dev": true, 3393 | "requires": { 3394 | "bs-logger": "0.x", 3395 | "buffer-from": "1.x", 3396 | "fast-json-stable-stringify": "2.x", 3397 | "jest-util": "^27.0.0", 3398 | "json5": "2.x", 3399 | "lodash": "4.x", 3400 | "make-error": "1.x", 3401 | "mkdirp": "1.x", 3402 | "semver": "7.x", 3403 | "yargs-parser": "20.x" 3404 | }, 3405 | "dependencies": { 3406 | "semver": { 3407 | "version": "7.3.5", 3408 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 3409 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 3410 | "dev": true, 3411 | "requires": { 3412 | "lru-cache": "^6.0.0" 3413 | } 3414 | } 3415 | } 3416 | }, 3417 | "ts-node": { 3418 | "version": "8.10.2", 3419 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", 3420 | "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", 3421 | "dev": true, 3422 | "requires": { 3423 | "arg": "^4.1.0", 3424 | "diff": "^4.0.1", 3425 | "make-error": "^1.1.1", 3426 | "source-map-support": "^0.5.17", 3427 | "yn": "3.1.1" 3428 | } 3429 | }, 3430 | "tslib": { 3431 | "version": "2.3.0", 3432 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", 3433 | "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" 3434 | }, 3435 | "type-check": { 3436 | "version": "0.3.2", 3437 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 3438 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 3439 | "dev": true, 3440 | "requires": { 3441 | "prelude-ls": "~1.1.2" 3442 | } 3443 | }, 3444 | "type-detect": { 3445 | "version": "4.0.8", 3446 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 3447 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 3448 | "dev": true 3449 | }, 3450 | "type-fest": { 3451 | "version": "0.21.3", 3452 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 3453 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 3454 | "dev": true 3455 | }, 3456 | "typedarray-to-buffer": { 3457 | "version": "3.1.5", 3458 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 3459 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 3460 | "dev": true, 3461 | "requires": { 3462 | "is-typedarray": "^1.0.0" 3463 | } 3464 | }, 3465 | "typescript": { 3466 | "version": "3.9.10", 3467 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", 3468 | "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", 3469 | "dev": true 3470 | }, 3471 | "universalify": { 3472 | "version": "0.1.2", 3473 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 3474 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 3475 | "dev": true 3476 | }, 3477 | "v8-to-istanbul": { 3478 | "version": "8.0.0", 3479 | "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz", 3480 | "integrity": "sha512-LkmXi8UUNxnCC+JlH7/fsfsKr5AU110l+SYGJimWNkWhxbN5EyeOtm1MJ0hhvqMMOhGwBj1Fp70Yv9i+hX0QAg==", 3481 | "dev": true, 3482 | "requires": { 3483 | "@types/istanbul-lib-coverage": "^2.0.1", 3484 | "convert-source-map": "^1.6.0", 3485 | "source-map": "^0.7.3" 3486 | }, 3487 | "dependencies": { 3488 | "source-map": { 3489 | "version": "0.7.3", 3490 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", 3491 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", 3492 | "dev": true 3493 | } 3494 | } 3495 | }, 3496 | "w3c-hr-time": { 3497 | "version": "1.0.2", 3498 | "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", 3499 | "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", 3500 | "dev": true, 3501 | "requires": { 3502 | "browser-process-hrtime": "^1.0.0" 3503 | } 3504 | }, 3505 | "w3c-xmlserializer": { 3506 | "version": "2.0.0", 3507 | "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", 3508 | "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", 3509 | "dev": true, 3510 | "requires": { 3511 | "xml-name-validator": "^3.0.0" 3512 | } 3513 | }, 3514 | "walker": { 3515 | "version": "1.0.7", 3516 | "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", 3517 | "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", 3518 | "dev": true, 3519 | "requires": { 3520 | "makeerror": "1.0.x" 3521 | } 3522 | }, 3523 | "webidl-conversions": { 3524 | "version": "6.1.0", 3525 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", 3526 | "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", 3527 | "dev": true 3528 | }, 3529 | "websocket-driver": { 3530 | "version": "0.7.4", 3531 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", 3532 | "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", 3533 | "requires": { 3534 | "http-parser-js": ">=0.5.1", 3535 | "safe-buffer": ">=5.1.0", 3536 | "websocket-extensions": ">=0.1.1" 3537 | } 3538 | }, 3539 | "websocket-extensions": { 3540 | "version": "0.1.4", 3541 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", 3542 | "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" 3543 | }, 3544 | "whatwg-encoding": { 3545 | "version": "1.0.5", 3546 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", 3547 | "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", 3548 | "dev": true, 3549 | "requires": { 3550 | "iconv-lite": "0.4.24" 3551 | } 3552 | }, 3553 | "whatwg-fetch": { 3554 | "version": "2.0.4", 3555 | "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", 3556 | "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" 3557 | }, 3558 | "whatwg-mimetype": { 3559 | "version": "2.3.0", 3560 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", 3561 | "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", 3562 | "dev": true 3563 | }, 3564 | "whatwg-url": { 3565 | "version": "8.7.0", 3566 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", 3567 | "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", 3568 | "dev": true, 3569 | "requires": { 3570 | "lodash": "^4.7.0", 3571 | "tr46": "^2.1.0", 3572 | "webidl-conversions": "^6.1.0" 3573 | } 3574 | }, 3575 | "which": { 3576 | "version": "2.0.2", 3577 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3578 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3579 | "dev": true, 3580 | "requires": { 3581 | "isexe": "^2.0.0" 3582 | } 3583 | }, 3584 | "word-wrap": { 3585 | "version": "1.2.3", 3586 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 3587 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 3588 | "dev": true 3589 | }, 3590 | "wrap-ansi": { 3591 | "version": "7.0.0", 3592 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3593 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3594 | "requires": { 3595 | "ansi-styles": "^4.0.0", 3596 | "string-width": "^4.1.0", 3597 | "strip-ansi": "^6.0.0" 3598 | } 3599 | }, 3600 | "wrappy": { 3601 | "version": "1.0.2", 3602 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3603 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 3604 | "dev": true 3605 | }, 3606 | "write-file-atomic": { 3607 | "version": "3.0.3", 3608 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", 3609 | "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", 3610 | "dev": true, 3611 | "requires": { 3612 | "imurmurhash": "^0.1.4", 3613 | "is-typedarray": "^1.0.0", 3614 | "signal-exit": "^3.0.2", 3615 | "typedarray-to-buffer": "^3.1.5" 3616 | } 3617 | }, 3618 | "ws": { 3619 | "version": "7.5.3", 3620 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", 3621 | "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", 3622 | "dev": true 3623 | }, 3624 | "xml-name-validator": { 3625 | "version": "3.0.0", 3626 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", 3627 | "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", 3628 | "dev": true 3629 | }, 3630 | "xmlchars": { 3631 | "version": "2.2.0", 3632 | "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", 3633 | "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", 3634 | "dev": true 3635 | }, 3636 | "xmlhttprequest": { 3637 | "version": "1.8.0", 3638 | "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", 3639 | "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" 3640 | }, 3641 | "y18n": { 3642 | "version": "5.0.8", 3643 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 3644 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" 3645 | }, 3646 | "yallist": { 3647 | "version": "4.0.0", 3648 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3649 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 3650 | "dev": true 3651 | }, 3652 | "yargs": { 3653 | "version": "16.2.0", 3654 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 3655 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 3656 | "requires": { 3657 | "cliui": "^7.0.2", 3658 | "escalade": "^3.1.1", 3659 | "get-caller-file": "^2.0.5", 3660 | "require-directory": "^2.1.1", 3661 | "string-width": "^4.2.0", 3662 | "y18n": "^5.0.5", 3663 | "yargs-parser": "^20.2.2" 3664 | } 3665 | }, 3666 | "yargs-parser": { 3667 | "version": "20.2.9", 3668 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 3669 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" 3670 | }, 3671 | "yn": { 3672 | "version": "3.1.1", 3673 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 3674 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" 3675 | } 3676 | } 3677 | } 3678 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "firegraph", 3 | "main": "lib/index.js", 4 | "types": "lib/index.d.ts", 5 | "version": "1.0.14", 6 | "license": "MIT", 7 | "scripts": { 8 | "test": "jest --env=node --detectOpenHandles --forceExit", 9 | "start": "ts-node src/index.ts", 10 | "build": "tsc -p tsconfig.json --outDir lib", 11 | "examples:types": "ts-node example/types.ts", 12 | "examples:references": "ts-node example/references.ts", 13 | "prepublish": "yarn build && npm-auto-version", 14 | "postpublish": "git push origin --tags", 15 | "format": "prettier --write ." 16 | }, 17 | "dependencies": { 18 | "firebase": "^8.7.1", 19 | "graphql": "^15.5.1", 20 | "graphql-tag": "^2.12.5" 21 | }, 22 | "devDependencies": { 23 | "@types/jest": "^23.3.14", 24 | "firestore-mock": "git+https://github.com/Taosif7/firestore-mock.git", 25 | "jest": "^27.0.6", 26 | "npm-auto-version": "^1.0.0", 27 | "prettier": "^2.3.2", 28 | "ts-jest": "^27.0.3", 29 | "ts-node": "^8.10.2", 30 | "typescript": "^3.9.10" 31 | } 32 | } -------------------------------------------------------------------------------- /src/firegraph/CacheManager.ts: -------------------------------------------------------------------------------- 1 | export interface CacheManagerListener { 2 | onCacheHit: (path: string) => void; 3 | onCacheMiss: (path: string) => void; 4 | onCacheRequested: (path: string) => void; 5 | onCacheSaved: (path: string) => void; 6 | } 7 | 8 | export class CacheManager { 9 | private cache = Object.create(null); 10 | private static listeners: CacheManagerListener[] = []; 11 | 12 | public getDocument( 13 | path: string 14 | ): firebase.default.firestore.DocumentSnapshot | undefined { 15 | const doc: firebase.default.firestore.DocumentSnapshot = this.cache[path]; 16 | 17 | // Call listeners 18 | CacheManager.listeners.forEach((listener) => 19 | listener.onCacheRequested(path) 20 | ); 21 | if (doc == undefined) { 22 | CacheManager.listeners.forEach((listener) => listener.onCacheMiss(path)); 23 | } else { 24 | CacheManager.listeners.forEach((listener) => listener.onCacheHit(path)); 25 | } 26 | 27 | return doc; 28 | } 29 | 30 | public saveDocument( 31 | path: string, 32 | document: firebase.default.firestore.DocumentSnapshot 33 | ) { 34 | this.cache[path] = document; 35 | CacheManager.listeners.forEach((listener) => listener.onCacheSaved(path)); 36 | } 37 | 38 | public static addListener(listener: CacheManagerListener) { 39 | CacheManager.listeners.push(listener); 40 | } 41 | 42 | public static removeListener(listener: CacheManagerListener) { 43 | const index = CacheManager.listeners.indexOf(listener); 44 | CacheManager.listeners.splice(index, 1); 45 | } 46 | 47 | public static removeAllListeners() { 48 | CacheManager.listeners = []; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/firegraph/Collection.ts: -------------------------------------------------------------------------------- 1 | import firebase from 'firebase/app'; 2 | import { GraphQLSelectionSet } from '../types/GraphQL'; 3 | import { FiregraphCollectionResult } from '../types/Firegraph'; 4 | import { resolveDocument } from './Document'; 5 | import { setQueryFilters } from './Where'; 6 | import { setOrders } from './Order'; 7 | import { CacheManager } from './CacheManager'; 8 | 9 | /** 10 | * Retrieves documents from a specified collection path. Currently retrieves 11 | * all fields indicated in the GraphQL selection set. Eventually this will 12 | * allow users to conduct queries with GraphQL syntax. 13 | * @param store An initialized Firestore instance. 14 | * @param collectionName The path of the collection we want to retrieve. 15 | * @param selectionSet The rules for defining the documents we want to get. 16 | * @param cacheManager An instance of cache manager to pass on to the documents fetcher 17 | */ 18 | export async function resolveCollection( 19 | store: firebase.firestore.Firestore, 20 | collectionName: string, 21 | collectionArgs: { [key: string]: any }, 22 | selectionSet: GraphQLSelectionSet, 23 | cacheManager: CacheManager 24 | ): Promise { 25 | let collectionQuery: any = store.collection(collectionName); 26 | let collectionResult: FiregraphCollectionResult = { 27 | name: collectionName, 28 | docs: [], 29 | }; 30 | 31 | if (collectionArgs) { 32 | if (collectionArgs['where']) { 33 | const where = collectionArgs['where']; 34 | collectionQuery = setQueryFilters(collectionQuery, where); 35 | } 36 | 37 | if (collectionArgs['limit']) { 38 | const limit: number = Number.parseInt(collectionArgs['limit']); 39 | collectionQuery = collectionQuery.limit(limit); 40 | } 41 | 42 | if (collectionArgs['orderBy']) { 43 | const orders = collectionArgs['orderBy']; 44 | collectionQuery = setOrders(collectionQuery, orders); 45 | } 46 | } 47 | 48 | const collectionSnapshot = await collectionQuery.get(); 49 | if (selectionSet && selectionSet.selections) { 50 | for (let doc of collectionSnapshot.docs) { 51 | const documentPath = `${collectionName}/${doc.id}`; 52 | collectionResult.docs.push( 53 | await resolveDocument(store, documentPath, selectionSet, cacheManager) 54 | ); 55 | } 56 | } 57 | return collectionResult; 58 | } 59 | -------------------------------------------------------------------------------- /src/firegraph/Document.ts: -------------------------------------------------------------------------------- 1 | import firebase from 'firebase/app'; 2 | import { GraphQLSelectionSet } from '../types/GraphQL'; 3 | import { FiregraphResult } from '../types/Firegraph'; 4 | import { resolveCollection } from './Collection'; 5 | import { CacheManager } from './CacheManager'; 6 | 7 | /** 8 | * Retrieves a single document from a specified document path. Retrieves 9 | * all fields indicated in the GraphQL selection set, including any nested 10 | * collections or references that are defined. 11 | * @param store An initialized Firestore instance. 12 | * @param documentPath The path of the document we want to retrieve. 13 | * @param selectionSet The rules for defining the documents we want to get. 14 | * @param cacheManager An instance of cache manager to use 15 | */ 16 | export async function resolveDocument( 17 | store: firebase.firestore.Firestore, 18 | documentPath: string, 19 | selectionSet: GraphQLSelectionSet, 20 | cacheManager: CacheManager, 21 | fetchedDocument?: firebase.firestore.DocumentSnapshot 22 | ): Promise { 23 | let data: any; 24 | let doc: firebase.firestore.DocumentSnapshot; 25 | let docResult: FiregraphResult = {}; 26 | let cachedDoc = cacheManager.getDocument(documentPath); 27 | 28 | // If cache is found, use it 29 | if (cachedDoc != undefined) { 30 | doc = cachedDoc; 31 | data = doc.data(); 32 | } 33 | // If this function is passed with a Firestore document (i.e. from the 34 | // `resolveCollection` API), we don't need to fetch it again. 35 | else if (fetchedDocument) { 36 | doc = fetchedDocument; 37 | data = fetchedDocument.data(); 38 | } else { 39 | doc = await store.doc(documentPath).get(); 40 | data = doc.data(); 41 | 42 | // Add document to cache 43 | cacheManager.saveDocument(documentPath, doc); 44 | } 45 | 46 | if (selectionSet && selectionSet.selections) { 47 | const fieldsToRetrieve = selectionSet.selections; 48 | for (let field of fieldsToRetrieve) { 49 | let args: any = {}; 50 | for (let arg of field.arguments!) { 51 | args[(arg as any).name.value] = (arg as any).value.value; 52 | } 53 | const fieldName = (field as any).name.value; 54 | const { selectionSet } = field; 55 | const { alias } = field; 56 | 57 | // Here we handle document references and nested collections. 58 | // First, we need to determine which one we are dealing with. 59 | if (selectionSet && selectionSet.selections) { 60 | let nestedPath: string; 61 | 62 | // If its just raw path of some document 63 | if (typeof data[fieldName] == 'string') { 64 | const docId = data[fieldName]; 65 | 66 | // If parent path is provided, consider it 67 | const { path } = args; 68 | let documentParentPath: string = path ? path : ''; 69 | 70 | nestedPath = `${documentParentPath}${docId}`; 71 | const nestedResult = await resolveDocument( 72 | store, 73 | nestedPath, 74 | selectionSet, 75 | cacheManager 76 | ); 77 | 78 | if (alias != undefined) 79 | docResult[(alias as any).value] = nestedResult; 80 | else docResult[fieldName] = nestedResult; 81 | 82 | // if field is of Document Reference type, use its path to resolve the document 83 | } else if ( 84 | data[fieldName] != undefined && 85 | data[fieldName].constructor!.name!.startsWith('DocumentReference') 86 | ) { 87 | nestedPath = `${data[fieldName].path}`; 88 | const nestedResult = await resolveDocument( 89 | store, 90 | nestedPath, 91 | selectionSet, 92 | cacheManager 93 | ); 94 | 95 | if (alias != undefined) 96 | docResult[(alias as any).value] = nestedResult; 97 | else docResult[fieldName] = nestedResult; 98 | 99 | // Else consider it a nested collection. 100 | } else { 101 | nestedPath = `${documentPath}/${fieldName}`; 102 | const nestedResult = await resolveCollection( 103 | store, 104 | nestedPath, 105 | args, 106 | selectionSet, 107 | cacheManager 108 | ); 109 | 110 | if (alias != undefined) 111 | docResult[(alias as any).value] = nestedResult.docs; 112 | else docResult[fieldName] = nestedResult.docs; 113 | } 114 | } else { 115 | if (fieldName === 'id') { 116 | docResult[fieldName] = doc.id; 117 | } else { 118 | if (alias != undefined) 119 | docResult[(alias as any).value] = data[fieldName]; 120 | else docResult[fieldName] = data[fieldName]; 121 | } 122 | } 123 | } 124 | } 125 | return docResult; 126 | } 127 | -------------------------------------------------------------------------------- /src/firegraph/Order.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Applies filters to a Firestore query. Basically chains a series of 3 | * calls to `firestore.collection#orderBy`. 4 | * @param collectionQuery The query to be made against some collection. 5 | * @param order Set of filters formatted as `KEY_COMPARATOR: ASC/DESC` pairs 6 | */ 7 | export const setOrders = ( 8 | collectionQuery: any, 9 | orders: any[] 10 | ): firebase.default.firestore.Query => { 11 | orders.forEach((filter: any) => { 12 | const field: string = filter['key']; 13 | const order: any = filter['value']; 14 | 15 | collectionQuery = collectionQuery.orderBy(field, order); 16 | }); 17 | return collectionQuery; 18 | }; 19 | -------------------------------------------------------------------------------- /src/firegraph/Where.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Parses GraphQL AST to get complex parameters to GraphQL queries. 3 | * @param objectFields Set of key-value pairs in GraphQL AST form. 4 | */ 5 | export const parseObjectValue = (objectFields: any): any => { 6 | return objectFields.map((field: any) => { 7 | const { name, value } = field; 8 | if (value.kind === 'IntValue') value.value = parseInt(value.value); 9 | 10 | if (value.kind === 'ListValue') { 11 | var itemList: any[] = []; 12 | value.values.forEach((e: any) => { 13 | itemList.push(e.value); 14 | }); 15 | 16 | return { 17 | key: name.value, 18 | value: itemList, 19 | }; 20 | } 21 | 22 | return { 23 | key: name.value, 24 | value: value.value, 25 | }; 26 | }); 27 | }; 28 | 29 | /** 30 | * Applies filters to a Firestore query. Basically chains a series of 31 | * calls to `firestore.collection#where`. 32 | * @param collectionQuery The query to be made against some collection. 33 | * @param where Set of filters formatted as `KEY_COMPARATOR: VALUE` pairs 34 | */ 35 | export const setQueryFilters = ( 36 | collectionQuery: any, 37 | where: any[] 38 | ): firebase.default.firestore.Query => { 39 | where.forEach((filter: any) => { 40 | const key: string = filter['key']; 41 | const value: any = filter['value']; 42 | const splitKey: string[] = key.split('_'); 43 | const whereOp = splitKey[splitKey.length - 1]; 44 | const actualKey = key.slice(0, -1 * (whereOp.length + 1)); 45 | switch (whereOp) { 46 | case 'eq': 47 | collectionQuery = collectionQuery.where(actualKey, '==', value); 48 | break; 49 | case 'neq': 50 | collectionQuery = collectionQuery.where(actualKey, '!=', value); 51 | break; 52 | case 'gt': 53 | collectionQuery = collectionQuery.where(actualKey, '>', value); 54 | break; 55 | case 'gte': 56 | collectionQuery = collectionQuery.where(actualKey, '>=', value); 57 | break; 58 | case 'lt': 59 | collectionQuery = collectionQuery.where(actualKey, '<', value); 60 | break; 61 | case 'lte': 62 | collectionQuery = collectionQuery.where(actualKey, '<=', value); 63 | break; 64 | case 'contains': 65 | collectionQuery = collectionQuery.where( 66 | actualKey, 67 | 'array-contains', 68 | value 69 | ); 70 | break; 71 | case 'containsAny': 72 | collectionQuery = collectionQuery.where( 73 | actualKey, 74 | 'array-contains-any', 75 | value 76 | ); 77 | break; 78 | case 'in': 79 | collectionQuery = collectionQuery.where(actualKey, 'in', value); 80 | break; 81 | case 'notIn': 82 | collectionQuery = collectionQuery.where(actualKey, 'not-in', value); 83 | break; 84 | default: 85 | collectionQuery = collectionQuery.where(key, '==', value); 86 | break; 87 | } 88 | }); 89 | return collectionQuery; 90 | }; 91 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import firebase from 'firebase/app'; 2 | 3 | // Top-level imports related to Firegraph. 4 | import { parseObjectValue } from './firegraph/Where'; 5 | import { resolveCollection } from './firegraph/Collection'; 6 | import { FiregraphResult } from './types/Firegraph'; 7 | import { CacheManager } from './firegraph/CacheManager'; 8 | 9 | /** 10 | * Runs a GraphQL query against a Google Cloud Firestore instance. 11 | * @param firestore An initialized Firestore instance. 12 | * @param query GraphQL query to be run against the Firestore. Use `graphql-tag` 13 | * to parse your query, otherwise this will not work. 14 | */ 15 | async function resolve( 16 | firestore: firebase.firestore.Firestore, 17 | query: any 18 | ): Promise { 19 | const results: FiregraphResult = {}; 20 | const { definitions } = query; 21 | const cacheManager = new CacheManager(); 22 | 23 | for (let definition of definitions) { 24 | const { selectionSet } = definition; 25 | 26 | // Because we know that the root-level values in a query are collection 27 | // names, we can define them as collections to be targeted. 28 | const targetCollections = selectionSet.selections; 29 | 30 | // For each collection we have defined in our query, we want to fetch 31 | // its name and run the query for the requested values. 32 | for (let collection of targetCollections) { 33 | const { 34 | name: { value: collectionName }, 35 | alias: alias, 36 | selectionSet, 37 | arguments: collectionArguments, 38 | } = collection; 39 | 40 | // Parse the GraphQL argument AST into something we can use. 41 | const parsedArgs: any = {}; 42 | collectionArguments.forEach((arg: any) => { 43 | if (arg.value.kind === 'ObjectValue') { 44 | const { fields } = arg.value; 45 | parsedArgs[arg.name.value] = parseObjectValue(fields); 46 | } else { 47 | parsedArgs[arg.name.value] = arg.value.value; 48 | } 49 | }); 50 | 51 | // Now we begin to recursively fetch values defined in GraphQL 52 | // selection sets. We pass our `firestore` instance to ensure 53 | // all selections are done from the same database. 54 | const result = await resolveCollection( 55 | firestore, 56 | collectionName, 57 | parsedArgs, 58 | selectionSet, 59 | cacheManager 60 | ); 61 | 62 | // Push the root query result to our results list. 63 | if (alias != undefined) results[alias.value] = result.docs; 64 | else results[result.name] = result.docs; 65 | } 66 | } 67 | 68 | // All necessary queries have been executed. 69 | return results; 70 | } 71 | 72 | export default { 73 | resolve, 74 | }; 75 | -------------------------------------------------------------------------------- /src/types/Firegraph.ts: -------------------------------------------------------------------------------- 1 | export type FiregraphResult = { [key: string]: any }; 2 | 3 | export type FiregraphCollectionResult = { 4 | name: string; 5 | docs: FiregraphResult[]; 6 | }; 7 | -------------------------------------------------------------------------------- /src/types/GraphQL.ts: -------------------------------------------------------------------------------- 1 | export type GraphQLSelection = { 2 | kind: string; 3 | alias?: string; 4 | arguments?: any[]; 5 | directives?: any[]; 6 | selectionSet?: GraphQLSelectionSet; 7 | }; 8 | 9 | export type GraphQLSelectionSet = { 10 | kind: string; 11 | selections?: GraphQLSelection[]; 12 | }; 13 | -------------------------------------------------------------------------------- /test/alias.test.ts: -------------------------------------------------------------------------------- 1 | import gql from 'graphql-tag'; 2 | import firegraph from '../src'; 3 | import { firestore } from './firebase'; 4 | 5 | describe('firegraph', () => { 6 | describe('alias', () => { 7 | it('Should be able to use alias for collection names and document field names', async () => { 8 | const result = await firegraph.resolve( 9 | firestore, 10 | gql` 11 | query { 12 | postsAlias1: posts(limit: 1) { 13 | id 14 | body: message 15 | } 16 | postsAlias2: posts(limit: 1) { 17 | id 18 | } 19 | } 20 | ` 21 | ); 22 | 23 | // Check root collections 24 | expect(result).toHaveProperty('postsAlias1'); 25 | expect(result).toHaveProperty('postsAlias2'); 26 | 27 | // Check field names 28 | const { postsAlias1 } = result; 29 | postsAlias1.forEach((post: any) => { 30 | expect(post).toHaveProperty('body'); 31 | }); 32 | }); 33 | }); 34 | }); 35 | -------------------------------------------------------------------------------- /test/cache.test.ts: -------------------------------------------------------------------------------- 1 | import gql from 'graphql-tag'; 2 | import firegraph from '../src'; 3 | import { CacheManager } from '../src/firegraph/CacheManager'; 4 | import { firestore } from './firebase'; 5 | 6 | describe('firegraph', () => { 7 | describe('cache', () => { 8 | it('should be able to use cached documents', async () => { 9 | let hits = 0; 10 | const listener = { 11 | onCacheHit: (path: string) => { 12 | hits++; 13 | }, 14 | onCacheMiss: (path: string) => { }, 15 | onCacheSaved: (path: string) => {}, 16 | onCacheRequested: (path: string) => { }, 17 | }; 18 | 19 | CacheManager.addListener(listener); 20 | 21 | // Only author documents will overlap with users docs... so total 2 cache hits 22 | const { posts } = await firegraph.resolve( 23 | firestore, 24 | gql` 25 | query { 26 | posts(limit: 2) { 27 | id 28 | message 29 | author { 30 | id 31 | fullname 32 | } 33 | } 34 | users { 35 | id 36 | fullname 37 | } 38 | } 39 | ` 40 | ); 41 | 42 | // Mathematically number of author document read overlaps 43 | // should be equal to number of posts 44 | expect(hits).toEqual(posts.length); 45 | CacheManager.removeListener(listener); 46 | }); 47 | 48 | }); 49 | }); 50 | -------------------------------------------------------------------------------- /test/collections.test.ts: -------------------------------------------------------------------------------- 1 | import gql from 'graphql-tag'; 2 | import firegraph from '../src'; 3 | import { firestore } from './firebase'; 4 | 5 | describe('firegraph', () => { 6 | it('should be able to retrieve a collection', async () => { 7 | const { posts } = await firegraph.resolve( 8 | firestore, 9 | gql` 10 | query { 11 | posts { 12 | id 13 | message 14 | } 15 | } 16 | ` 17 | ); 18 | 19 | posts.map((post: any) => { 20 | expect(post).toHaveProperty('id'); 21 | expect(post).toHaveProperty('message'); 22 | }); 23 | }); 24 | 25 | it('should be able to retrieve nested collections', async () => { 26 | const { posts } = await firegraph.resolve( 27 | firestore, 28 | gql` 29 | query { 30 | posts { 31 | id 32 | message 33 | comments { 34 | id 35 | message 36 | } 37 | } 38 | } 39 | ` 40 | ); 41 | 42 | posts.forEach((post: any) => { 43 | expect(post).toHaveProperty('comments'); 44 | 45 | const { comments } = post; 46 | comments.forEach((comment: any) => { 47 | expect(comment).toHaveProperty('id'); 48 | expect(comment).toHaveProperty('message'); 49 | }); 50 | }); 51 | }); 52 | }); 53 | -------------------------------------------------------------------------------- /test/documentReference.test.ts: -------------------------------------------------------------------------------- 1 | import gql from 'graphql-tag'; 2 | import firegraph from '../src'; 3 | import { firestore } from './firebase'; 4 | 5 | describe('firegraph', () => { 6 | describe('document references', () => { 7 | it('should be able to resolve document reference', async () => { 8 | const { posts } = await firegraph.resolve( 9 | firestore, 10 | gql` 11 | query { 12 | posts { 13 | id 14 | message 15 | author { 16 | id 17 | fullName 18 | favoriteColor 19 | } 20 | } 21 | } 22 | ` 23 | ); 24 | 25 | posts.forEach((post: any) => { 26 | expect(post).toHaveProperty('author'); 27 | 28 | const { author } = post; 29 | expect(author).toHaveProperty('id'); 30 | expect(author).toHaveProperty('fullName'); 31 | expect(author).toHaveProperty('favoriteColor'); 32 | }); 33 | }); 34 | 35 | it('should be able to resolve raw document reference type and parent path', async () => { 36 | const { posts } = await firegraph.resolve( 37 | firestore, 38 | gql` 39 | query { 40 | posts { 41 | id 42 | message 43 | comments { 44 | id 45 | authorId(path: "users/") { 46 | id 47 | fullName 48 | favoriteColor 49 | } 50 | } 51 | } 52 | } 53 | ` 54 | ); 55 | 56 | posts.forEach((post: any) => { 57 | expect(post).toHaveProperty('comments'); 58 | 59 | const { comments } = post; 60 | 61 | comments.forEach((comment: any) => { 62 | expect(comment).toHaveProperty('authorId'); 63 | 64 | const { authorId } = comment; 65 | expect(authorId).toHaveProperty('id'); 66 | }); 67 | }); 68 | }); 69 | }); 70 | }); 71 | -------------------------------------------------------------------------------- /test/firebase/index.ts: -------------------------------------------------------------------------------- 1 | const FirestoreMock = require('firestore-mock') 2 | const _firestore = new FirestoreMock() 3 | 4 | // seed data into mock firebase 5 | 6 | /** 7 | * Users Collection 8 | */ 9 | var uRef1 = _firestore.collection('users').doc('Beeb3V4VvUdY79imRS1f').set({ 10 | 'fullname': 'John Doe', 11 | 'favouriteColor': 'green', 12 | 'hobbies': ['reading', 'cooking', 'coding', 'music'] 13 | }); 14 | var uRef2 = _firestore.collection('users').doc('PBQ4JosAROuqa3YgQrBR').set({ 15 | 'fullname': 'Leonard M. Bailey', 16 | 'favouriteColor': 'blue', 17 | 'hobbies': ['dancing', 'gaming', 'piano', 'music'] 18 | }); 19 | var uRef3 = _firestore.collection('users').doc('U7prtqicwDUSKgasXXNv').set({ 20 | 'fullname': 'Leonard M. Bailey', 21 | 'favouriteColor': 'blue', 22 | 'hobbies': ['coding', 'skateboarding', 'sketching'] 23 | }); 24 | var uRef4 = _firestore.collection('users').doc('kbpjZl0PJstgAPLmypWh').set({ 25 | 'fullname': 'Leila Jones', 26 | 'favouriteColor': 'red', 27 | 'hobbies': ['cooking', 'gaming', 'piano'] 28 | }); 29 | 30 | /** 31 | * Posts collection 32 | */ 33 | 34 | var postRef1 = _firestore.collection('posts').add({ 35 | 'author': uRef1.ref, 36 | 'authorId': uRef1.id, 37 | 'score': 25, 38 | 'likes': [ 39 | uRef1.id, 40 | uRef2.id, 41 | uRef3.id, 42 | ], 43 | 'message': 'hello world', 44 | 'category': 'general', 45 | }); 46 | var postRef2 = _firestore.collection('posts').add({ 47 | 'author': uRef1.ref, 48 | 'authorId': uRef1.id, 49 | 'score': 22, 50 | 'likes': [ 51 | uRef1.id, 52 | uRef2.id, 53 | uRef4.id, 54 | ], 55 | 'message': 'Second Post', 56 | 'category': 'general' 57 | }); 58 | var postRef3 = _firestore.collection('posts').add({ 59 | 'author': uRef2.ref, 60 | 'authorId': uRef2.id, 61 | 'score': 25, 62 | 'likes': [ 63 | uRef1.id, 64 | uRef3.id, 65 | uRef4.id, 66 | ], 67 | 'message': 'This is awesome', 68 | 'category': 'technology' 69 | }); 70 | var postRef4 = _firestore.collection('posts').add({ 71 | 'author': uRef3.ref, 72 | 'authorId': uRef3.id, 73 | 'score': 45, 74 | 'likes': [ 75 | uRef3.id, 76 | uRef2.id, 77 | uRef4.id, 78 | ], 79 | 'message': 'Awesome Gadgets to try', 80 | 'category': 'technology' 81 | }); 82 | var postRef5 = _firestore.collection('posts').add({ 83 | 'author': uRef4.ref, 84 | 'authorId': uRef4.id, 85 | 'score': 11, 86 | 'likes': [ 87 | uRef1.id, 88 | uRef2.id, 89 | ], 90 | 'message': 'How to beat your meat perfectly', 91 | 'category': 'cooking' 92 | }); 93 | 94 | /** 95 | * Comments sub-collection 96 | */ 97 | postRef1.ref.collection('comments').add({ 98 | 'author': uRef4.ref, 99 | 'authorId': uRef4.id, 100 | 'comment': 'Hello!' 101 | }) 102 | postRef4.ref.collection('comments').add({ 103 | 'author': uRef1.ref, 104 | 'authorId': uRef1.id, 105 | 'comment': 'Coooool' 106 | }) 107 | postRef4.ref.collection('comments').add({ 108 | 'author': uRef2.ref, 109 | 'authorId': uRef2.id, 110 | 'comment': '2nd One is the best' 111 | }) 112 | postRef4.ref.collection('comments').add({ 113 | 'author': uRef4.ref, 114 | 'authorId': uRef4.id, 115 | 'comment': 'Innovative stuff' 116 | }) 117 | postRef5.ref.collection('comments').add({ 118 | 'author': uRef1.ref, 119 | 'authorId': uRef1.id, 120 | 'comment': 'Dayum' 121 | }) 122 | 123 | export default _firestore; 124 | export const firestore = _firestore; -------------------------------------------------------------------------------- /test/limit.test.ts: -------------------------------------------------------------------------------- 1 | import gql from 'graphql-tag'; 2 | import firegraph from '../src'; 3 | import { CacheManager } from '../src/firegraph/CacheManager'; 4 | import { firestore } from './firebase'; 5 | 6 | describe('firegraph', () => { 7 | describe('limit', () => { 8 | it('Should be able to limit root collection query length', async () => { 9 | const limit = 1; 10 | const { posts } = await firegraph.resolve( 11 | firestore, 12 | gql` 13 | query { 14 | posts(limit:${limit}) { 15 | id 16 | } 17 | } 18 | ` 19 | ); 20 | 21 | expect(posts.length).toBeLessThanOrEqual(limit); 22 | }); 23 | 24 | it('should be able to limit nested collection query length', async () => { 25 | const root_limit = 1; 26 | const sub_limit = 1; 27 | const { posts } = await firegraph.resolve( 28 | firestore, 29 | gql` 30 | query { 31 | posts(limit:${root_limit}){ 32 | id 33 | comments(limit:${sub_limit}){ 34 | id 35 | } 36 | } 37 | } 38 | ` 39 | ); 40 | 41 | expect(posts.length).toBeLessThanOrEqual(root_limit); 42 | 43 | posts.forEach((post: any) => { 44 | expect(post).toHaveProperty('comments'); 45 | expect(post.comments.length).toBeLessThanOrEqual(sub_limit); 46 | }); 47 | }); 48 | }); 49 | }); 50 | -------------------------------------------------------------------------------- /test/order.test.ts: -------------------------------------------------------------------------------- 1 | import gql from 'graphql-tag'; 2 | import firegraph from '../src'; 3 | import { CacheManager } from '../src/firegraph/CacheManager'; 4 | import { firestore } from './firebase'; 5 | 6 | describe('firegraph', () => { 7 | describe('order', () => { 8 | it('Should order root collection documents', async () => { 9 | const { posts } = await firegraph.resolve( 10 | firestore, 11 | gql` 12 | query { 13 | posts(orderBy: { message: "desc" }) { 14 | id 15 | message 16 | } 17 | } 18 | ` 19 | ); 20 | 21 | let messages: string[] = []; 22 | let messagesSorted: string[] = []; 23 | posts.forEach((post: any) => { 24 | expect(post).toHaveProperty('message'); 25 | messages.push(post.message); 26 | }); 27 | 28 | // copy & sort the messages 29 | messagesSorted = messages.splice(0); 30 | messagesSorted = messagesSorted.sort().reverse(); 31 | 32 | // test for messages field order 33 | if (messages.length > 1) { 34 | for (let i = 1; i < messages.length; i++) { 35 | expect(messages[i]).toEqual(messagesSorted[i]); 36 | } 37 | } 38 | }); 39 | 40 | it('Should order collection documents by multiple fields', async () => { 41 | const { posts } = await firegraph.resolve( 42 | firestore, 43 | gql` 44 | query { 45 | posts(orderBy: { category: "desc", score: "asc" }) { 46 | id 47 | category 48 | score 49 | } 50 | } 51 | ` 52 | ); 53 | 54 | let categories: string[] = []; 55 | let categoriesSorted: string[] = []; 56 | let postScores = new Map(); 57 | 58 | posts.forEach((post: any) => { 59 | expect(post).toHaveProperty('category'); 60 | expect(post).toHaveProperty('score'); 61 | 62 | const category: string = post.category; 63 | const score: number = post.score; 64 | 65 | categories.push(category); 66 | 67 | if (postScores.has(category)) { 68 | const nums: number[] = postScores.get(category); 69 | nums.push(score); 70 | postScores.set(category, nums); 71 | } else { 72 | const nums: number[] = []; 73 | nums.push(score); 74 | postScores.set(category, nums); 75 | } 76 | }); 77 | 78 | // copy & sort the messages 79 | categoriesSorted = categories.splice(0); 80 | categoriesSorted = categoriesSorted.sort().reverse(); 81 | 82 | // test for messages field order 83 | if (categories.length > 1) { 84 | for (let i = 1; i < categories.length; i++) { 85 | expect(categories[i]).toEqual(categoriesSorted[i]); 86 | } 87 | } 88 | 89 | // Test for score field sort 90 | postScores.forEach((value: number[], key: string) => { 91 | if (value.length > 1) { 92 | for (let i = 1; i < value.length; i++) { 93 | expect(value[i]).toBeGreaterThanOrEqual(value[i - 1]); 94 | } 95 | } 96 | }); 97 | }); 98 | }); 99 | }); 100 | -------------------------------------------------------------------------------- /test/where.test.ts: -------------------------------------------------------------------------------- 1 | import gql from 'graphql-tag'; 2 | import firegraph from '../src'; 3 | import { firestore } from './firebase'; 4 | 5 | describe('firegraph', () => { 6 | describe('where', () => { 7 | it('can filter with key-value equality', async () => { 8 | const authorId = 'Beeb3V4VvUdY79imRS1f'; 9 | const { posts } = await firegraph.resolve( 10 | firestore, 11 | gql` 12 | query { 13 | posts(where: { 14 | authorId: ${authorId}, 15 | }) { 16 | id 17 | authorId 18 | message 19 | } 20 | } 21 | ` 22 | ); 23 | 24 | posts.forEach((post: any) => { 25 | expect(post).toHaveProperty('authorId'); 26 | expect(post.authorId).toEqual('Beeb3V4VvUdY79imRS1f'); 27 | }); 28 | }); 29 | 30 | it('can filter with `_gt` operator', async () => { 31 | const { posts } = await firegraph.resolve( 32 | firestore, 33 | gql` 34 | query { 35 | posts(where: { score_gt: 25 }) { 36 | id 37 | score 38 | } 39 | } 40 | ` 41 | ); 42 | 43 | posts.forEach((post: any) => { 44 | expect(post).toHaveProperty('score'); 45 | expect(post.score).toBeGreaterThan(25); 46 | }); 47 | }); 48 | 49 | it('can filter with `_gte` operator', async () => { 50 | const { posts } = await firegraph.resolve( 51 | firestore, 52 | gql` 53 | query { 54 | posts(where: { score_gte: 25 }) { 55 | id 56 | score 57 | } 58 | } 59 | ` 60 | ); 61 | 62 | posts.forEach((post: any) => { 63 | expect(post).toHaveProperty('score'); 64 | expect(post.score).toBeGreaterThanOrEqual(25); 65 | }); 66 | }); 67 | 68 | it('can filter with `_lt` operator', async () => { 69 | const { posts } = await firegraph.resolve( 70 | firestore, 71 | gql` 72 | query { 73 | posts(where: { score_lt: 25 }) { 74 | id 75 | score 76 | } 77 | } 78 | ` 79 | ); 80 | 81 | posts.forEach((post: any) => { 82 | expect(post).toHaveProperty('score'); 83 | expect(post.score).toBeLessThan(25); 84 | }); 85 | }); 86 | 87 | it('can filter with `_lte` operator', async () => { 88 | const { posts } = await firegraph.resolve( 89 | firestore, 90 | gql` 91 | query { 92 | posts(where: { score_lte: 25 }) { 93 | id 94 | score 95 | } 96 | } 97 | ` 98 | ); 99 | 100 | posts.forEach((post: any) => { 101 | expect(post).toHaveProperty('score'); 102 | expect(post.score).toBeLessThanOrEqual(25); 103 | }); 104 | }); 105 | 106 | it('can detect array membership with `_contains`', async () => { 107 | const someUserId = 'PBQ4JosAROuqa3YgQrBR'; 108 | const { posts } = await firegraph.resolve( 109 | firestore, 110 | gql` 111 | query { 112 | posts(where: { 113 | likes_contains: ${someUserId}, 114 | }) { 115 | id 116 | score 117 | likes 118 | } 119 | } 120 | ` 121 | ); 122 | 123 | posts.forEach((post: any) => { 124 | expect(post).toHaveProperty('likes'); 125 | expect(post.likes).toContain(someUserId); 126 | }); 127 | }); 128 | 129 | 130 | it('can detect array membership with `_containsAny`', async () => { 131 | var sample_list = ['dancing', 'sketching']; 132 | 133 | const { users } = await firegraph.resolve( 134 | firestore, 135 | gql` 136 | query { 137 | users(where: { hobbies_containsAny: ${JSON.stringify( 138 | sample_list 139 | )} }) { 140 | id 141 | fullname 142 | hobbies 143 | } 144 | } 145 | ` 146 | ); 147 | 148 | users.forEach((user: any) => { 149 | expect(user).toHaveProperty('hobbies'); 150 | 151 | var hasAny: boolean = false; 152 | sample_list.forEach((e) => { 153 | hasAny = hasAny || (user.hobbies as String[]).includes(e); 154 | }); 155 | expect(hasAny).toBeTruthy(); 156 | }); 157 | }); 158 | 159 | it('can filter documents with `_in`', async () => { 160 | var sample_list = ['blue', 'green']; 161 | 162 | const { users } = await firegraph.resolve( 163 | firestore, 164 | gql` 165 | query { 166 | users(where: { favouriteColor_in: ${JSON.stringify(sample_list)} }) { 167 | id 168 | favouriteColor 169 | } 170 | } 171 | ` 172 | ); 173 | 174 | users.forEach((user: any) => { 175 | expect(user).toHaveProperty('favouriteColor'); 176 | expect(sample_list.includes(user.favouriteColor)).toBeTruthy(); 177 | }); 178 | }); 179 | 180 | it('can filter documents with `_notIn`', async () => { 181 | var sample_list = ['red', 'green']; 182 | 183 | const { users } = await firegraph.resolve( 184 | firestore, 185 | gql` 186 | query { 187 | users(where: { favouriteColor_notIn: ${JSON.stringify(sample_list)} }) { 188 | id 189 | favouriteColor 190 | } 191 | } 192 | ` 193 | ); 194 | 195 | users.forEach((user: any) => { 196 | expect(user).toHaveProperty('favouriteColor'); 197 | expect(sample_list.includes(user.favouriteColor)).toBeFalsy(); 198 | }); 199 | }); 200 | }); 201 | }); 202 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "src/" 4 | ], 5 | "compilerOptions": { 6 | /* Basic Options */ 7 | "outDir": "lib", 8 | "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ 9 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ 10 | // "lib": ["es2015", "dom"], /* Specify library files to be included in the compilation. */ 11 | // "allowJs": true, /* Allow javascript files to be compiled. */ 12 | // "checkJs": true, /* Report errors in .js files. */ 13 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 14 | "declaration": true, /* Generates corresponding '.d.ts' file. */ 15 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 16 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 17 | // "outFile": "./", /* Concatenate and emit output to single file. */ 18 | // "outDir": "./", /* Redirect output structure to the directory. */ 19 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 20 | // "composite": true, /* Enable project compilation */ 21 | // "removeComments": true, /* Do not emit comments to output. */ 22 | // "noEmit": true, /* Do not emit outputs. */ 23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 26 | 27 | /* Strict Type-Checking Options */ 28 | "strict": true, /* Enable all strict type-checking options. */ 29 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 30 | // "strictNullChecks": true, /* Enable strict null checks. */ 31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 36 | 37 | /* Additional Checks */ 38 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 39 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 40 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 42 | 43 | /* Module Resolution Options */ 44 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 45 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 46 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 47 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 48 | // "typeRoots": [], /* List of folders to include type definitions from. */ 49 | // "types": [], /* Type declaration files to be included in compilation. */ 50 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 51 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 52 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 53 | 54 | /* Source Map Options */ 55 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 56 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 57 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 58 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 59 | 60 | /* Experimental Options */ 61 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 62 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 63 | } 64 | } --------------------------------------------------------------------------------