├── .editorconfig ├── .eslintignore ├── .eslintrc.json ├── .github └── workflows │ └── test.yml ├── .gitignore ├── .idea ├── .gitignore ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── dictionaries │ └── saibotsivad.xml ├── inspectionProfiles │ └── Project_Default.xml ├── jsLibraryMappings.xml ├── jsLinters │ └── eslint.xml ├── markdown.xml ├── modules.xml ├── mongodb.iml └── vcs.xml ├── .nvmrc ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── demo ├── .eslintrc.json ├── README.md ├── demo.js └── fetch-shim.js ├── index.d.ts ├── package-lock.json ├── package.json └── src ├── .eslintrc.json └── index.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = tab 6 | indent_size = 4 7 | 8 | [*.js] 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = true 14 | 15 | [*.{yml,yaml}] 16 | indent_style = space 17 | indent_size = 2 18 | 19 | [package.json] 20 | indent_style = space 21 | indent_size = 2 22 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | # the usual suspects 2 | /node_modules 3 | .DS_Store 4 | 5 | # personal local files 6 | /configuration.js 7 | /configuration.sh 8 | /fiddle.js 9 | 10 | # globbed things 11 | globbed-*.js 12 | 13 | *.ts 14 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "es6": true 4 | }, 5 | "extends": [ 6 | "eslint:recommended" 7 | ], 8 | "parserOptions": { 9 | "ecmaVersion": "latest", 10 | "sourceType": "module" 11 | }, 12 | "rules": { 13 | "array-bracket-spacing": [ 14 | "error", 15 | "always", 16 | { 17 | "objectsInArrays": true, 18 | "arraysInArrays": true 19 | } 20 | ], 21 | "block-spacing": [ 22 | "error", 23 | "always" 24 | ], 25 | "brace-style": [ 26 | "error", 27 | "1tbs", 28 | { 29 | "allowSingleLine": true 30 | } 31 | ], 32 | "comma-dangle": [ 33 | "error", 34 | "always-multiline" 35 | ], 36 | "comma-spacing": [ 37 | "error", 38 | { 39 | "before": false, 40 | "after": true 41 | } 42 | ], 43 | "eol-last": [ 44 | "error", 45 | "always" 46 | ], 47 | "eqeqeq": [ 48 | "error", 49 | "always" 50 | ], 51 | "indent": [ 52 | "error", 53 | "tab" 54 | ], 55 | "keyword-spacing": [ 56 | "error", 57 | { 58 | "before": true 59 | } 60 | ], 61 | "linebreak-style": [ 62 | "error", 63 | "unix" 64 | ], 65 | "no-eval": "error", 66 | "no-implied-eval": "error", 67 | "no-irregular-whitespace": [ 68 | "error", 69 | { 70 | "skipStrings": false 71 | } 72 | ], 73 | "no-new": "error", 74 | "no-return-await": "error", 75 | "no-unexpected-multiline": "error", 76 | "no-useless-rename": "error", 77 | "no-var": [ 78 | "error" 79 | ], 80 | "object-curly-spacing": [ 81 | "error", 82 | "always" 83 | ], 84 | "quotes": [ 85 | "error", 86 | "single", 87 | { 88 | "avoidEscape": true 89 | } 90 | ], 91 | "semi": [ 92 | "error", 93 | "never" 94 | ], 95 | "space-before-blocks": [ 96 | "error", 97 | "always" 98 | ], 99 | "space-before-function-paren": [ 100 | "error", 101 | { 102 | "anonymous": "always", 103 | "asyncArrow": "always", 104 | "named": "never" 105 | } 106 | ], 107 | "space-in-parens": [ 108 | "error", 109 | "never" 110 | ], 111 | "valid-jsdoc": [ 112 | "error", 113 | { 114 | "requireReturn": false 115 | } 116 | ] 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | # 2 | # This workflow will run all the normal static tests (linting, unit, etc.), will 3 | # make sure the build completes successfully, and will connect to a MongoDB Data API 4 | # if merged to the main branch. 5 | # 6 | 7 | name: test 8 | 9 | on: 10 | push: 11 | branches: [ '*' ] 12 | 13 | jobs: 14 | build: 15 | environment: test 16 | runs-on: ubuntu-latest 17 | strategy: 18 | matrix: 19 | node-version: [ 16.x, 18.x, 20.x ] 20 | steps: 21 | - uses: actions/checkout@v4 22 | - name: Use Node.js ${{ matrix.node-version }} 23 | uses: actions/setup-node@v4 24 | with: 25 | node-version: ${{ matrix.node-version }} 26 | - run: npm ci 27 | - run: npm run lint 28 | - run: npm run build 29 | - run: npm run demo 30 | env: 31 | MONGODB_API_URL: ${{secrets.MONGODB_API_URL}} 32 | MONGODB_API_KEY: ${{secrets.MONGODB_API_KEY}} 33 | MONGODB_DATABASE_NAME: ${{secrets.MONGODB_DATABASE_NAME}} 34 | MONGODB_CLUSTER_NAME: ${{secrets.MONGODB_CLUSTER_NAME}} 35 | MONGODB_COLLECTION_NAME: ${{secrets.MONGODB_COLLECTION_NAME}} 36 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # the usual culprits 2 | /node_modules 3 | .DS_Store 4 | 5 | # personal local files 6 | /configuration.js 7 | /configuration.sh 8 | /fiddle.js 9 | 10 | # globbed things 11 | globbed-*.js 12 | 13 | # built things 14 | /dist 15 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 17 | 18 | 19 | 22 | 23 | 24 | 31 | 32 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/dictionaries/saibotsivad.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 28 | 29 | -------------------------------------------------------------------------------- /.idea/jsLibraryMappings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/jsLinters/eslint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | -------------------------------------------------------------------------------- /.idea/markdown.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/mongodb.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v16.10.0 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) 6 | and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). 7 | 8 | Change categories are: 9 | 10 | * `Added` for new features. 11 | * `Changed` for changes in existing functionality. 12 | * `Deprecated` for once-stable features removed in upcoming releases. 13 | * `Removed` for deprecated features removed in this release. 14 | * `Fixed` for any bug fixes. 15 | * `Security` to invite users to upgrade in case of vulnerabilities. 16 | 17 | ## Unreleased 18 | ### Added 19 | ### Changed 20 | ### Deprecated 21 | ### Fixed 22 | ### Removed 23 | ### Security 24 | 25 | ## [1.2.0](https://github.com/saibotsivad/mongodb/compare/v1.1.0...v1.2.0) - 2024-06-15 26 | ### Added 27 | - Support for Web API [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers), 28 | so you can use the global `fetch` as-is. 29 | - Updated tests to run against Node.js version 18 and 20 as well as 16 (original). 30 | ### Fixed 31 | - Type for option parameters had `cluster` instead of `dataSource`, which was a breaking 32 | change in `1.0.0`. Types are now fixed. Closes #3 33 | 34 | ## [1.1.0](https://github.com/saibotsivad/mongodb/compare/v1.0.0...v1.1.0) - 2022-09-30 35 | ### Added 36 | - The `interpose` method allows you to inspect and mutate requests immediately prior to 37 | sending them, for things like logging and debugging. 38 | 39 | ## [1.0.0](https://github.com/saibotsivad/mongodb/compare/v0.0.10...v1.0.0) - 2022-09-30 40 | 41 | Since MongoDB Data API is now out of beta, this library is going to v1 as well! 🎉 42 | 43 | ### Added 44 | - Full test suite (it's the demo code) that actually connects to a MongoDB Data API 45 | instance to verify that all requests are being made correctly. (Note to my future 46 | self: this is using a free version, which will likely be automatically spun down 47 | due to inactivity. I will need to go spin it back up for tests to pass.) 48 | ### Changed 49 | - BREAKING: Simplified the interface a bit, by requiring the fully qualified URL instead of region 50 | and/or app ID. Here are the [MongoDB URL docs](https://www.mongodb.com/docs/atlas/api/data-api-resources/#base-url). 51 | - BREAKING: Renamed `cluster` to `dataSource` to match their parameter names better. 52 | - Change the default-vs-overrides a bit: you don't *need* to specify the `dataSource`, `database`, 53 | or `collection` properties at initialization. If you do, you can still specify them at 54 | the request to override the defaults. 55 | 56 | ## [0.0.10](https://github.com/saibotsivad/mongodb/compare/v0.0.9...v0.0.10) - 2022-02-23 57 | ### Fixed 58 | - Documentation only: the `insertMany` examples were incorrectly written. 59 | 60 | ## [0.0.9](https://github.com/saibotsivad/mongodb/compare/v0.0.8...v0.0.9) - 2022-01-28 61 | ### Fixed 62 | - After using this for a while now, I was able to make the error handling more consistent. 63 | 64 | ## [0.0.8](https://github.com/saibotsivad/mongodb/compare/v0.0.7...v0.0.8) - 2022-01-25 65 | ### Fixed 66 | - Tidy up the response handling code a bit after experimenting with the Data API responses more thoroughly. 67 | - Several example corrections to the docs. 68 | 69 | ## [0.0.6-0.0.7](https://github.com/saibotsivad/mongodb/compare/v0.0.5...v0.0.7) - 2022-01-24 70 | ### Fixed 71 | - Creating can return a 201, and errors aren't always JSON bodies. 72 | - Parameters needs rest expansion. 73 | 74 | ## [0.0.4-0.0.5](https://github.com/saibotsivad/mongodb/compare/v0.0.3...v0.0.5) - 2022-01-14 75 | ### Added 76 | - JSDoc documentation for all the functions. I tried adding a little more to the TS definition. 77 | ### Changed 78 | - Made the function results more consistent with the MongoDB Data API, e.g. calling `deleteOne` returns `{ deletedCount: Number }` instead of `Number`. This was done to make it easier to add properties as the Data API becomes more feature complete. 79 | 80 | ## [0.0.1-0.0.3](https://github.com/saibotsivad/mongodb/compare/v0.0.0...v0.0.3) - 2022-01-12 81 | ### Fixed 82 | - Correction to paths so IDEs recognize the module correctly. 83 | 84 | ## [0.0.0](https://github.com/saibotsivad/mongodb/tree/v0.0.0) - 2022-01-12 85 | ### Added 86 | - Created the base project from [saibotsivad/init](https://github.com/saibotsivad/init). 87 | - Basic functionality and documentation in the readme. 88 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contribution Guide 2 | 3 | Considering contributing? Thank you so much! 4 | 5 | ## Pull Requests 6 | 7 | Please consider these simple guidelines when filing a pull request: 8 | 9 | * Commits follow the [Angular commit convention](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#-git-commit-guidelines) 10 | * [Tabs for indentation, spaces for alignment](https://gist.github.com/saibotsivad/06021a81865226cfc140) 11 | * Features and bug fixes should be covered by test cases 12 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Very Open License (VOL) 2 | 3 | The contributor(s) to this creative work voluntarily grant permission 4 | to any individual(s) or entities of any kind 5 | 6 | - to use the creative work in any manner, 7 | - to modify the creative work without restriction, 8 | - to sell the creative work or derivatives thereof for profit, and 9 | - to release modifications of the creative work in part or whole under any license 10 | 11 | with no requirement for compensation or recognition of any kind. 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @saibotsivad/mongodb 2 | 3 | Simple wrapper for the [MongoDB Data API](https://docs.atlas.mongodb.com/api/data-api/). 4 | 5 | > **v1 Update!** MongoDB's "Data API" is out of beta, so this library is now v1! 🎉 6 | 7 | ## Install 8 | 9 | The usual ways: 10 | 11 | ```shell 12 | npm install @saibotsivad/mongodb 13 | ``` 14 | 15 | ## Example 16 | 17 | Instantiate and issue a request: 18 | 19 | ```js 20 | import { mongodb } from '@saibotsivad/mongodb' 21 | 22 | const db = mongodb({ 23 | apiKey: 'AKAIDEXAMPLEKEY', 24 | apiUrl: 'https://data.mongodb-api.com/app/data-abc123/endpoint/data/v1', 25 | dataSource: 'myCluster3', 26 | database: 'myDatabase', 27 | collection: 'vehicles', 28 | }) 29 | 30 | const car = await db.findOne({ filter: { type: 'car' } }) 31 | // => { _id: "61df...", type: "car", ...etc } 32 | ``` 33 | 34 | ## Instantiate 35 | 36 | Import the `{ mongodb }` function and instantiate with the following properties: 37 | 38 | #### `apiKey: string` **(always required)** 39 | 40 | The programmatic API key, generated using the MongoDB Atlas interface. 41 | 42 | #### `apiUrl: string` **(always required)** 43 | 44 | The fully qualified URL, e.g. something like this: 45 | 46 | ``` 47 | https://data.mongodb-api.com/app/data-abc123/endpoint/data/v1 48 | ``` 49 | 50 | #### `interpose: function` 51 | 52 | Called immediately prior to making the `fetch` request, with the name of the request (e.g. `findOne`) and the body of the request. Useful for things like logging and debugging, but you can also mutate the object if needed. 53 | 54 | ```ts 55 | type interpose = (input: { name: string, body: Object }) => { body: Object } 56 | ``` 57 | 58 | ## Request Requirements 59 | 60 | These are properties that are **required** for every request. 61 | 62 | You can set them when you create a `mongodb` instance, or override or provide them on the individual request: 63 | 64 | ```js 65 | const db = mongodb({ 66 | apiKey: 'AKAIDEXAMPLEKEY', 67 | apiUrl: 'https://data.mongodb-api.com/app/data-abc123/endpoint/data/v1', 68 | dataSource: 'myCluster1', 69 | database: 'myDatabase', 70 | collection: 'vehicles', 71 | }) 72 | 73 | // override `collection` for this one request 74 | const car = await db.findOne({ filter: { type: 'hobbit' } }, { collection: 'people' }) 75 | // => { _id: "42fd...", type: "hobbit", ...etc } 76 | ``` 77 | 78 | #### `dataSource: string` 79 | 80 | The name of the MongoDB cluster. 81 | 82 | #### `database: string` 83 | 84 | The name of the MongoDB database. 85 | 86 | #### `collection: string` 87 | 88 | The name of the collection. 89 | 90 | ## Environment Specific 91 | 92 | #### `fetch: function` 93 | 94 | This library was written to use the [`fetch` Web API](https://developer.mozilla.org/en-US/docs/Web/API/fetch) using `globalThis.fetch` to make requests to the MongoDB Data API. 95 | 96 | To make requests in an environment *without* `fetch`, e.g. NodeJS, you will need to provide your own fetch-like implementation. 97 | 98 | Check [the response type definition](./index.d.ts) for interface requirements, but for example you could use something like the very lightweight [`httpie`](https://github.com/lukeed/httpie/) library, like in [the demo](./demo/fetch-shim.js). 99 | 100 | ## Methods 101 | 102 | The available methods follow the [Data API Resources](https://docs.atlas.mongodb.com/api/data-api-resources/) exactly, so go read those for more details. 103 | 104 | Each one can be overridden with a second property, which is an object containing the earlier "Request Requirements" properties, e.g.: 105 | 106 | ```js 107 | await db.findOne( 108 | { filter: { type: 'car' } }, 109 | { 110 | dataSource: 'AlternateCluster', 111 | database: 'AlternateDatabase', 112 | collection: 'AlternateTable', 113 | }, 114 | ) 115 | ``` 116 | 117 | ### aggregate 118 | 119 | [Runs an aggregation pipeline](https://docs.atlas.mongodb.com/api/data-api-resources/#run-an-aggregation-pipeline) and returns the result set of the final stage of the pipeline as an array of documents. 120 | 121 | ```ts 122 | ( 123 | parameters: { pipeline: MongoPipeline }, 124 | overrides?: { dataSource?: string, database?: string, collection?: string }, 125 | ) => 126 | Promise<{ documents: Array }> 127 | ``` 128 | 129 | ```js 130 | await db.aggregate({ 131 | pipeline: [ 132 | { 133 | $group: { 134 | _id: "$status", 135 | count: { $sum: 1 }, 136 | text: { $push: "$text" } 137 | } 138 | }, 139 | { $sort: { count: 1 } } 140 | ] 141 | }) 142 | // => { documents [{ _id: ... }] } 143 | ``` 144 | 145 | ### deleteOne 146 | 147 | [Delete the first document](https://docs.atlas.mongodb.com/api/data-api-resources/#delete-a-single-document) matching the filter, and return the number of documents deleted. 148 | 149 | ```ts 150 | ( 151 | parameters: { filter: MongoFilter }, 152 | overrides?: { dataSource?: string, database?: string, collection?: string }, 153 | ) => 154 | Promise<{ deletedCount: Number }> 155 | ``` 156 | 157 | ```js 158 | await db.deleteOne({ 159 | filter: { _id: { $oid: '6193ebd53821e5ec5b4f6c3b' } } 160 | }) 161 | // => { deletedCount: 1 } 162 | ``` 163 | 164 | ### deleteMany 165 | 166 | [Delete multiple documents](https://docs.atlas.mongodb.com/api/data-api-resources/#delete-multiple-documents) and return the number of documents deleted. 167 | 168 | ```ts 169 | ( 170 | parameters: { filter: MongoFilter }, 171 | overrides?: { dataSource?: string, database?: string, collection?: string }, 172 | ) => 173 | Promise<{ deletedCount: Number }> 174 | ``` 175 | 176 | ```js 177 | await db.deleteMany({ 178 | filter: { status: 'complete' } 179 | }) 180 | // => { deletedCount: 7 } 181 | ``` 182 | 183 | ### find 184 | 185 | [Find multiple documents](https://docs.atlas.mongodb.com/api/data-api-resources/#find-multiple-documents) and return a list of those documents. 186 | 187 | ```ts 188 | ( 189 | parameters: { filter: MongoFilter, projection: MongoProjection, sort: MongoSort, limit: Integer, skip: Integer }, 190 | overrides?: { dataSource?: string, database?: string, collection?: string }, 191 | ) => 192 | Promise<{ documents: Array }> 193 | ``` 194 | 195 | ```js 196 | await db.find({ 197 | filter: { status: 'complete' }, 198 | sort: { completedAt: -1 } 199 | }) 200 | // => { documents: [{ _id: ... }] } 201 | ``` 202 | 203 | ### findOne 204 | 205 | [Find and return the first document matching the filter](https://docs.atlas.mongodb.com/api/data-api-resources/#find-a-single-document). 206 | 207 | ```ts 208 | ( 209 | parameters: { filter: MongoFilter, projection: MongoProjection }, 210 | overrides?: { dataSource?: string, database?: string, collection?: string }, 211 | ) => 212 | Promise<{ document: Object }> 213 | ``` 214 | 215 | ```js 216 | await db.findOne({ filter: { _id: { $oid: '6193ebd53821e5ec5b4f6c3b' } } }) 217 | // => { document: { _id: ... } } 218 | ``` 219 | 220 | ### insertOne 221 | 222 | [Insert a single document](https://docs.atlas.mongodb.com/api/data-api-resources/#insert-a-single-document) and return the ID of that document. 223 | 224 | ```ts 225 | ( 226 | parameters: { document: EjsonDocument }, 227 | overrides?: { dataSource?: string, database?: string, collection?: string }, 228 | ) => 229 | Promise<{ insertedId: String }> 230 | ``` 231 | 232 | ```js 233 | await db.insertOne({ document: { type: 'car' } }) 234 | // => { insertedId: '61935189ec53247016a623c9' } 235 | ``` 236 | 237 | ### insertMany 238 | 239 | [Insert multiple documents at once](https://docs.atlas.mongodb.com/api/data-api-resources/#insert-multiple-documents) and return the generated IDs. 240 | 241 | ```ts 242 | ( 243 | parameters: { documents: Array }, 244 | overrides?: { dataSource?: string, database?: string, collection?: string }, 245 | ) => 246 | Promise<{ insertedIds: Array }> 247 | ``` 248 | 249 | ```js 250 | await db.insertMany({ 251 | documents: [ 252 | { type: 'car' }, 253 | { type: 'truck' } 254 | ] 255 | }) 256 | // => { insertedIds: [ '61935189ec53247016a623c9', '61935189ec53247016a623ca' ] } 257 | ``` 258 | 259 | ### replaceOne 260 | 261 | [Replace or upsert the first document matching the filter](https://docs.atlas.mongodb.com/api/data-api-resources/#replace-a-single-document) and return the matched and modified count, along with the generated ID if a new document was generated. 262 | 263 | ```ts 264 | ( 265 | parameters: { filter: MongoFilter, replacement: EjsonDocument, upsert: Boolean }, 266 | overrides?: { dataSource?: string, database?: string, collection?: string }, 267 | ) => 268 | Promise<{ matchedCount: Integer, modifiedCount: Integer, upsertedId?: String }> 269 | ``` 270 | 271 | ```js 272 | await db.replaceOne({ 273 | filter: { id: { $oid: '61935189ec53247016a623c9' } }, 274 | replacement: { type: 'van' } 275 | }) 276 | // => { matchedCount: 1, modifiedCount: 1, upsertedId: '...' } 277 | ``` 278 | 279 | ### updateOne 280 | 281 | [Update the first document matching the filter](https://docs.atlas.mongodb.com/api/data-api-resources/#update-a-single-document) and return the matched and modified count, along with the generated ID if a new document was generated. 282 | 283 | ```ts 284 | ( 285 | parameters: { filter: MongoFilter, update: MongoUpdate, upsert: Boolean }, 286 | overrides?: { dataSource?: string, database?: string, collection?: string }, 287 | ) => 288 | Promise<{ matchedCount: Integer, modifiedCount: Integer, upsertedId?: String }> 289 | ``` 290 | 291 | ```js 292 | await db.updateOne({ 293 | filter: { id: { $oid: '61935189ec53247016a623c9' } }, 294 | update: { 295 | $set: { 296 | status: 'complete', 297 | completedAt: { $date: { $numberLong: Date.now().toString() } } 298 | } 299 | } 300 | }) 301 | // => { matchedCount: 1, modifiedCount: 1, upsertedId: '...' } 302 | ``` 303 | 304 | ### updateMany 305 | 306 | [Update all documents matching the filter](https://docs.atlas.mongodb.com/api/data-api-resources/#update-multiple-documents) and return the matched and modified count, along with the generated ID if a new document was generated. 307 | 308 | ```ts 309 | ( 310 | parameters: { filter: MongoFilter, update: MongoUpdate, upsert: Boolean }, 311 | overrides?: { dataSource?: string, database?: string, collection?: string }, 312 | ) => 313 | Promise<{ matchedCount: Integer, modifiedCount: Integer, upsertedId?: String }> 314 | ``` 315 | 316 | ```js 317 | await db.updateOne({ 318 | filter: { status: 'open' }, 319 | update: { 320 | $set: { 321 | status: 'complete', 322 | completedAt: { $date: { $numberLong: Date.now().toString() } } 323 | } 324 | } 325 | }) 326 | // => { matchedCount: 7, modifiedCount: 4 } 327 | ``` 328 | 329 | ## License 330 | 331 | Published and released under the [Very Open License](http://veryopenlicense.com). 332 | 333 | If you need a commercial license, [contact me here](https://davistobias.com/license?software=mongodb). 334 | -------------------------------------------------------------------------------- /demo/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /demo/README.md: -------------------------------------------------------------------------------- 1 | # Demo of `@saibotsivad/mongodb` 2 | 3 | This is a demo that is also used to test requests and responses from an actual MongoDB Data API. 4 | 5 | It is meant to run in a NodeJS environment, so it makes use of the `fetch` shim. 6 | 7 | To run it yourself, you'll need to set some environment variables, e.g. with `bash` you might do: 8 | 9 | ```bash 10 | export MONGODB_API_URL="https://data.mongodb-api.com/app/YOUR_APP_ID/endpoint/data/v1" 11 | export MONGODB_API_KEY="YOUR_API_KEY" 12 | export MONGODB_DATABASE_NAME="local" # any name is fine 13 | export MONGODB_CLUSTER_NAME="YOUR_CLUSTER" 14 | node demo.js 15 | ``` 16 | 17 | The demo utilizes all methods exposed by the Data API, and asserts things about them. 18 | -------------------------------------------------------------------------------- /demo/demo.js: -------------------------------------------------------------------------------- 1 | import assert from 'node:assert/strict' 2 | 3 | import { mongodb } from '../dist/index.mjs' 4 | import { fetch } from './fetch-shim.js' 5 | 6 | const nodeVersion = process.version 7 | 8 | const apiUrl = process.env.MONGODB_API_URL 9 | const apiKey = process.env.MONGODB_API_KEY 10 | const dataSource = process.env.MONGODB_CLUSTER_NAME 11 | const database = process.env.MONGODB_DATABASE_NAME 12 | const collection = process.env.MONGODB_COLLECTION_NAME 13 | 14 | const withBadApiKey = mongodb({ 15 | apiUrl, 16 | apiKey: 'battery-horse-staple', 17 | dataSource, 18 | database, 19 | collection, 20 | fetch, 21 | }) 22 | await assert.rejects( 23 | async () => withBadApiKey.find({ filter: {} }), 24 | error => { 25 | assert.equal(error.name, 'MongodbError') 26 | assert.equal(error.title, 'InvalidSession') 27 | return true 28 | }, 29 | ) 30 | 31 | const withGoodKeyButBadRequest = mongodb({ 32 | apiUrl, 33 | apiKey, 34 | dataSource, 35 | database, 36 | collection, 37 | fetch, 38 | }) 39 | await assert.rejects( 40 | async () => withGoodKeyButBadRequest.find({ filter: { $the_hobbits_the_hobbits: 'to isengard' } }), 41 | error => { 42 | assert.equal(error.name, 'MongodbError') 43 | assert.ok(error.message.includes('unknown top level operator')) 44 | return true 45 | }, 46 | ) 47 | 48 | const differentWaysToInitialize = [ 49 | { 50 | description: 'With no options.', 51 | success: false, 52 | initialize: () => mongodb({}), 53 | }, 54 | { 55 | description: 'With a URL but no API key.', 56 | success: false, 57 | initialize: () => mongodb({ 58 | apiUrl, 59 | fetch, 60 | }), 61 | }, 62 | { 63 | description: 'With an API key and no URL.', 64 | success: false, 65 | initialize: () => mongodb({ 66 | apiKey, 67 | fetch, 68 | }), 69 | }, 70 | { 71 | description: 'With an API key and URL.', 72 | success: true, 73 | initialize: () => mongodb({ 74 | apiKey, 75 | apiUrl, 76 | fetch, 77 | }), 78 | }, 79 | ] 80 | 81 | console.log('These are the different valid ways to initialize:') 82 | for (const { description, success, initialize } of differentWaysToInitialize) { 83 | console.log('-', description) 84 | try { 85 | initialize() 86 | if (!success) assert.fail(description) 87 | } catch (error) { 88 | if (success) { 89 | console.error(error) 90 | assert.fail(description) 91 | } 92 | } 93 | } 94 | 95 | const goodDefaults = { apiKey, apiUrl, fetch } 96 | const differentWaysToSetRequestParams = [ 97 | { 98 | description: 'All parameters are set at default.', 99 | success: true, 100 | initialize: () => mongodb({ 101 | ...goodDefaults, 102 | dataSource, 103 | database, 104 | collection, 105 | }), 106 | overrides: { 107 | // None 108 | }, 109 | }, 110 | { 111 | description: 'None of the required parameters are provided.', 112 | success: false, 113 | initialize: () => mongodb({ 114 | ...goodDefaults, 115 | }), 116 | overrides: { 117 | // None 118 | }, 119 | }, 120 | { 121 | description: 'All parameters are overridden.', 122 | success: true, 123 | initialize: () => mongodb({ 124 | ...goodDefaults, 125 | dataSource: 'BAD', 126 | database: 'BAD', 127 | collection: 'BAD', 128 | }), 129 | overrides: { 130 | // The good ones 131 | dataSource, 132 | database, 133 | collection, 134 | }, 135 | }, 136 | ] 137 | 138 | const db = mongodb({ 139 | apiKey, 140 | apiUrl, 141 | dataSource, 142 | database, 143 | collection, 144 | fetch, 145 | }) 146 | 147 | console.log('These are the different ways you can set request params on the initializer:') 148 | for (const { description, success, initialize, overrides } of differentWaysToSetRequestParams) { 149 | console.log('-', description) 150 | let testingDb 151 | try { 152 | testingDb = initialize() 153 | } catch (error) { 154 | console.error(error) 155 | assert.fail(description) 156 | } 157 | let result 158 | try { 159 | result = await testingDb.insertOne({ document: { description, nodeVersion } }, overrides) 160 | } catch (error) { 161 | if (success) { 162 | console.error(error) 163 | assert.fail(description) 164 | } 165 | } 166 | // Cleanup after the test 167 | if (success) { 168 | const { deletedCount } = await db.deleteOne({ filter: { _id: { $oid: result.insertedId } } }) 169 | if (deletedCount !== 1) assert.fail('Failed to remove document: ' + result.insertedId) 170 | } 171 | } 172 | 173 | console.log('Now testing out all methods.') 174 | 175 | console.log('db.insertOne') 176 | const { insertedId } = await db.insertOne({ 177 | document: { 178 | name: 'Bilbo Baggins', 179 | nodeVersion, 180 | }, 181 | }) 182 | assert.ok(insertedId, 'The document was correctly inserted.') 183 | console.log('Inserted ID:', insertedId) 184 | 185 | console.log('db.findOne') 186 | const out1 = await db.findOne({ 187 | filter: { 188 | _id: { $oid: insertedId }, 189 | }, 190 | }) 191 | assert.equal(out1.document._id, insertedId, 'It should be found.') 192 | 193 | console.log('db.deleteOne') 194 | const out2 = await db.deleteOne({ 195 | filter: { 196 | _id: { $oid: insertedId }, 197 | }, 198 | }) 199 | assert.equal(out2.deletedCount, 1, 'Deleted the document.') 200 | 201 | console.log('db.insertMany') 202 | const { insertedIds } = await db.insertMany({ 203 | documents: [ 204 | { 205 | name: 'Bilbo Baggins', 206 | type: 'hobbit', 207 | nodeVersion, 208 | }, 209 | { 210 | name: 'Samwise Gamgee', 211 | type: 'hobbit', 212 | nodeVersion, 213 | }, 214 | ], 215 | }) 216 | assert.equal(insertedIds.length, 2, 'The two documents were correctly inserted.') 217 | 218 | console.log('db.find') 219 | const { documents } = await db.find({ 220 | filter: { 221 | type: 'hobbit', 222 | nodeVersion, 223 | }, 224 | }) 225 | assert.equal(documents.length, 2, 'Found both documents') 226 | 227 | console.log('db.updateOne') 228 | const out3 = await db.updateOne({ 229 | filter: { 230 | _id: { $oid: documents[0]._id }, 231 | }, 232 | update: { 233 | $set: { pipe: true }, 234 | }, 235 | }) 236 | assert.equal(out3.matchedCount, 1) 237 | assert.equal(out3.modifiedCount, 1) 238 | 239 | console.log('db.updateMany') 240 | const out4 = await db.updateMany({ 241 | filter: { 242 | type: 'hobbit', 243 | nodeVersion, 244 | }, 245 | update: { 246 | $set: { teaTime: true }, 247 | }, 248 | }) 249 | assert.equal(out4.matchedCount, 2) 250 | assert.equal(out4.modifiedCount, 2) 251 | 252 | console.log('db.replaceOne') 253 | const { documents: updatedHobbits } = await db.find({ 254 | filter: { 255 | type: 'hobbit', 256 | name: 'Bilbo Baggins', 257 | nodeVersion, 258 | }, 259 | }) 260 | assert.equal(updatedHobbits.length, 1, 'Found one document') 261 | updatedHobbits[0].age = '111' 262 | delete updatedHobbits[0]._id 263 | const out5 = await db.replaceOne({ 264 | filter: { 265 | _id: updatedHobbits[0]._id, 266 | }, 267 | replacement: updatedHobbits[0], 268 | }) 269 | assert.equal(out5.matchedCount, 1) 270 | assert.equal(out5.modifiedCount, 1) 271 | 272 | console.log('db.aggregate') 273 | const out6 = await db.aggregate({ 274 | pipeline: [ 275 | { 276 | $match: { type: 'hobbit', nodeVersion }, 277 | }, 278 | { 279 | $sort: { name: 1 }, 280 | }, 281 | ], 282 | }) 283 | assert.equal(out6.documents.length, 2) 284 | delete out6.documents[0]._id 285 | delete out6.documents[1]._id 286 | assert.deepStrictEqual( 287 | out6.documents[0], 288 | { 289 | name: 'Bilbo Baggins', 290 | type: 'hobbit', 291 | nodeVersion, 292 | pipe: true, 293 | teaTime: true, 294 | age: '111', 295 | }, 296 | ) 297 | assert.deepStrictEqual( 298 | out6.documents[1], 299 | { 300 | name: 'Samwise Gamgee', 301 | type: 'hobbit', 302 | nodeVersion, 303 | teaTime: true, 304 | }, 305 | ) 306 | 307 | console.log('The "interpose" function.') 308 | const currentDate = new Date().toISOString() 309 | const interposeDb = mongodb({ 310 | apiKey, 311 | apiUrl, 312 | dataSource: 'BAD', 313 | database: 'BAD', 314 | collection: 'BAD', 315 | fetch, 316 | interpose: ({ name, body }) => { 317 | assert.equal(name, 'findOne') 318 | delete body.projection 319 | assert.deepStrictEqual( 320 | body, 321 | { 322 | filter: { currentDate, nodeVersion }, 323 | dataSource: 'BAD', 324 | database: 'BAD', 325 | collection: 'BAD', 326 | }, 327 | 'it has the bad request', 328 | ) 329 | // You can return whatever you want and totally mutate everything. 330 | return { 331 | body: { 332 | filter: { name: 'Bilbo Baggins' }, 333 | // use the good ones again 334 | dataSource, 335 | database, 336 | collection, 337 | }, 338 | } 339 | }, 340 | }) 341 | const interposed = await interposeDb.findOne({ filter: { currentDate, nodeVersion } }) 342 | assert.equal(interposed.document.type, 'hobbit', 'original query would not have found it but modified did') 343 | 344 | console.log('db.deleteMany') 345 | const out99 = await db.deleteMany({ 346 | filter: { 347 | type: 'hobbit', 348 | nodeVersion, 349 | }, 350 | }) 351 | assert.equal(out99.deletedCount, 2, 'Deleted both documents.') 352 | 353 | const shouldBeEmpty = await db.find({ filter: { nodeVersion } }) 354 | assert.equal(shouldBeEmpty.documents.length, 0) 355 | -------------------------------------------------------------------------------- /demo/fetch-shim.js: -------------------------------------------------------------------------------- 1 | import { post } from 'httpie' 2 | 3 | /** 4 | * A small shim to make `httpie` behave more like `fetch`. 5 | * 6 | * @param {{ statusCode: number, headers: Map, data: string }} response - The response from the `httpie` POST request. 7 | * @return {{ json: function(): Promise, text: function(): Promise, status: number }} - The `fetch`-like response object. 8 | */ 9 | const postFetchShim = response => ({ 10 | status: response.statusCode, 11 | headers: response.headers, 12 | json: async () => response.data, 13 | text: async () => response.data, 14 | }) 15 | 16 | export const fetch = async (url, parameters) => post(url, parameters).then(postFetchShim, postFetchShim) 17 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | export function mongodb(params: { 2 | apiKey?: string; 3 | apiId?: string; 4 | apiRegion?: string; 5 | apiUrl?: string; 6 | dataSource?: string; 7 | database?: string; 8 | collection?: string; 9 | fetch?: ( 10 | url: string, 11 | options: { 12 | method: 'POST', 13 | headers: { [key: string]: string }, 14 | body: string 15 | }, 16 | ) => Promise<{ 17 | status: number, 18 | headers: { [key: string]: string }, 19 | json: () => Promise, 20 | text: () => Promise, 21 | }>; 22 | }): { 23 | aggregate; 24 | deleteOne; 25 | deleteMany; 26 | find; 27 | findOne; 28 | insertOne; 29 | insertMany; 30 | replaceOne; 31 | updateOne; 32 | updateMany; 33 | }; 34 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@saibotsivad/mongodb", 3 | "version": "1.1.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@saibotsivad/mongodb", 9 | "version": "1.1.0", 10 | "license": "SEE LICENSE IN LICENSE.md", 11 | "devDependencies": { 12 | "bundt": "github:saibotsivad/bundt", 13 | "eslint": "^8.24.0", 14 | "httpie": "^1.1.2" 15 | } 16 | }, 17 | "node_modules/@eslint/eslintrc": { 18 | "version": "1.3.2", 19 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", 20 | "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", 21 | "dev": true, 22 | "dependencies": { 23 | "ajv": "^6.12.4", 24 | "debug": "^4.3.2", 25 | "espree": "^9.4.0", 26 | "globals": "^13.15.0", 27 | "ignore": "^5.2.0", 28 | "import-fresh": "^3.2.1", 29 | "js-yaml": "^4.1.0", 30 | "minimatch": "^3.1.2", 31 | "strip-json-comments": "^3.1.1" 32 | }, 33 | "engines": { 34 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 35 | }, 36 | "funding": { 37 | "url": "https://opencollective.com/eslint" 38 | } 39 | }, 40 | "node_modules/@humanwhocodes/config-array": { 41 | "version": "0.10.7", 42 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", 43 | "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", 44 | "dev": true, 45 | "dependencies": { 46 | "@humanwhocodes/object-schema": "^1.2.1", 47 | "debug": "^4.1.1", 48 | "minimatch": "^3.0.4" 49 | }, 50 | "engines": { 51 | "node": ">=10.10.0" 52 | } 53 | }, 54 | "node_modules/@humanwhocodes/gitignore-to-minimatch": { 55 | "version": "1.0.2", 56 | "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", 57 | "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", 58 | "dev": true, 59 | "funding": { 60 | "type": "github", 61 | "url": "https://github.com/sponsors/nzakas" 62 | } 63 | }, 64 | "node_modules/@humanwhocodes/module-importer": { 65 | "version": "1.0.1", 66 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 67 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 68 | "dev": true, 69 | "engines": { 70 | "node": ">=12.22" 71 | }, 72 | "funding": { 73 | "type": "github", 74 | "url": "https://github.com/sponsors/nzakas" 75 | } 76 | }, 77 | "node_modules/@humanwhocodes/object-schema": { 78 | "version": "1.2.1", 79 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 80 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 81 | "dev": true 82 | }, 83 | "node_modules/@jridgewell/gen-mapping": { 84 | "version": "0.3.2", 85 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", 86 | "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", 87 | "dev": true, 88 | "dependencies": { 89 | "@jridgewell/set-array": "^1.0.1", 90 | "@jridgewell/sourcemap-codec": "^1.4.10", 91 | "@jridgewell/trace-mapping": "^0.3.9" 92 | }, 93 | "engines": { 94 | "node": ">=6.0.0" 95 | } 96 | }, 97 | "node_modules/@jridgewell/resolve-uri": { 98 | "version": "3.1.0", 99 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 100 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 101 | "dev": true, 102 | "engines": { 103 | "node": ">=6.0.0" 104 | } 105 | }, 106 | "node_modules/@jridgewell/set-array": { 107 | "version": "1.1.2", 108 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 109 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 110 | "dev": true, 111 | "engines": { 112 | "node": ">=6.0.0" 113 | } 114 | }, 115 | "node_modules/@jridgewell/source-map": { 116 | "version": "0.3.2", 117 | "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", 118 | "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", 119 | "dev": true, 120 | "dependencies": { 121 | "@jridgewell/gen-mapping": "^0.3.0", 122 | "@jridgewell/trace-mapping": "^0.3.9" 123 | } 124 | }, 125 | "node_modules/@jridgewell/sourcemap-codec": { 126 | "version": "1.4.14", 127 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 128 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 129 | "dev": true 130 | }, 131 | "node_modules/@jridgewell/trace-mapping": { 132 | "version": "0.3.15", 133 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", 134 | "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", 135 | "dev": true, 136 | "dependencies": { 137 | "@jridgewell/resolve-uri": "^3.0.3", 138 | "@jridgewell/sourcemap-codec": "^1.4.10" 139 | } 140 | }, 141 | "node_modules/@nodelib/fs.scandir": { 142 | "version": "2.1.5", 143 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 144 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 145 | "dev": true, 146 | "dependencies": { 147 | "@nodelib/fs.stat": "2.0.5", 148 | "run-parallel": "^1.1.9" 149 | }, 150 | "engines": { 151 | "node": ">= 8" 152 | } 153 | }, 154 | "node_modules/@nodelib/fs.stat": { 155 | "version": "2.0.5", 156 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 157 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 158 | "dev": true, 159 | "engines": { 160 | "node": ">= 8" 161 | } 162 | }, 163 | "node_modules/@nodelib/fs.walk": { 164 | "version": "1.2.8", 165 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 166 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 167 | "dev": true, 168 | "dependencies": { 169 | "@nodelib/fs.scandir": "2.1.5", 170 | "fastq": "^1.6.0" 171 | }, 172 | "engines": { 173 | "node": ">= 8" 174 | } 175 | }, 176 | "node_modules/acorn": { 177 | "version": "8.8.0", 178 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", 179 | "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", 180 | "dev": true, 181 | "bin": { 182 | "acorn": "bin/acorn" 183 | }, 184 | "engines": { 185 | "node": ">=0.4.0" 186 | } 187 | }, 188 | "node_modules/acorn-jsx": { 189 | "version": "5.3.2", 190 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 191 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 192 | "dev": true, 193 | "peerDependencies": { 194 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 195 | } 196 | }, 197 | "node_modules/ajv": { 198 | "version": "6.12.6", 199 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 200 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 201 | "dev": true, 202 | "dependencies": { 203 | "fast-deep-equal": "^3.1.1", 204 | "fast-json-stable-stringify": "^2.0.0", 205 | "json-schema-traverse": "^0.4.1", 206 | "uri-js": "^4.2.2" 207 | }, 208 | "funding": { 209 | "type": "github", 210 | "url": "https://github.com/sponsors/epoberezkin" 211 | } 212 | }, 213 | "node_modules/ansi-regex": { 214 | "version": "5.0.1", 215 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 216 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 217 | "dev": true, 218 | "engines": { 219 | "node": ">=8" 220 | } 221 | }, 222 | "node_modules/ansi-styles": { 223 | "version": "4.3.0", 224 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 225 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 226 | "dev": true, 227 | "dependencies": { 228 | "color-convert": "^2.0.1" 229 | }, 230 | "engines": { 231 | "node": ">=8" 232 | }, 233 | "funding": { 234 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 235 | } 236 | }, 237 | "node_modules/argparse": { 238 | "version": "2.0.1", 239 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 240 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 241 | "dev": true 242 | }, 243 | "node_modules/array-union": { 244 | "version": "2.1.0", 245 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 246 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 247 | "dev": true, 248 | "engines": { 249 | "node": ">=8" 250 | } 251 | }, 252 | "node_modules/balanced-match": { 253 | "version": "1.0.2", 254 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 255 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 256 | "dev": true 257 | }, 258 | "node_modules/brace-expansion": { 259 | "version": "1.1.11", 260 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 261 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 262 | "dev": true, 263 | "dependencies": { 264 | "balanced-match": "^1.0.0", 265 | "concat-map": "0.0.1" 266 | } 267 | }, 268 | "node_modules/braces": { 269 | "version": "3.0.2", 270 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 271 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 272 | "dev": true, 273 | "dependencies": { 274 | "fill-range": "^7.0.1" 275 | }, 276 | "engines": { 277 | "node": ">=8" 278 | } 279 | }, 280 | "node_modules/buffer-from": { 281 | "version": "1.1.2", 282 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 283 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 284 | "dev": true 285 | }, 286 | "node_modules/bundt": { 287 | "version": "1.1.5", 288 | "resolved": "git+ssh://git@github.com/saibotsivad/bundt.git#a36675e567c902d9af8f6e611f661d3585876a7f", 289 | "dev": true, 290 | "license": "MIT", 291 | "dependencies": { 292 | "kleur": "^4.0.0", 293 | "mk-dirs": "^3.0.0", 294 | "rewrite-imports": "^3.0.0", 295 | "terser": "^5.15.0" 296 | }, 297 | "bin": { 298 | "bundt": "index.js" 299 | }, 300 | "engines": { 301 | "node": ">=6" 302 | } 303 | }, 304 | "node_modules/callsites": { 305 | "version": "3.1.0", 306 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 307 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 308 | "dev": true, 309 | "engines": { 310 | "node": ">=6" 311 | } 312 | }, 313 | "node_modules/chalk": { 314 | "version": "4.1.2", 315 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 316 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 317 | "dev": true, 318 | "dependencies": { 319 | "ansi-styles": "^4.1.0", 320 | "supports-color": "^7.1.0" 321 | }, 322 | "engines": { 323 | "node": ">=10" 324 | }, 325 | "funding": { 326 | "url": "https://github.com/chalk/chalk?sponsor=1" 327 | } 328 | }, 329 | "node_modules/color-convert": { 330 | "version": "2.0.1", 331 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 332 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 333 | "dev": true, 334 | "dependencies": { 335 | "color-name": "~1.1.4" 336 | }, 337 | "engines": { 338 | "node": ">=7.0.0" 339 | } 340 | }, 341 | "node_modules/color-name": { 342 | "version": "1.1.4", 343 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 344 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 345 | "dev": true 346 | }, 347 | "node_modules/commander": { 348 | "version": "2.20.3", 349 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 350 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 351 | "dev": true 352 | }, 353 | "node_modules/concat-map": { 354 | "version": "0.0.1", 355 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 356 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 357 | "dev": true 358 | }, 359 | "node_modules/cross-spawn": { 360 | "version": "7.0.3", 361 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 362 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 363 | "dev": true, 364 | "dependencies": { 365 | "path-key": "^3.1.0", 366 | "shebang-command": "^2.0.0", 367 | "which": "^2.0.1" 368 | }, 369 | "engines": { 370 | "node": ">= 8" 371 | } 372 | }, 373 | "node_modules/debug": { 374 | "version": "4.3.4", 375 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 376 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 377 | "dev": true, 378 | "dependencies": { 379 | "ms": "2.1.2" 380 | }, 381 | "engines": { 382 | "node": ">=6.0" 383 | }, 384 | "peerDependenciesMeta": { 385 | "supports-color": { 386 | "optional": true 387 | } 388 | } 389 | }, 390 | "node_modules/deep-is": { 391 | "version": "0.1.4", 392 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 393 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 394 | "dev": true 395 | }, 396 | "node_modules/dir-glob": { 397 | "version": "3.0.1", 398 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 399 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 400 | "dev": true, 401 | "dependencies": { 402 | "path-type": "^4.0.0" 403 | }, 404 | "engines": { 405 | "node": ">=8" 406 | } 407 | }, 408 | "node_modules/doctrine": { 409 | "version": "3.0.0", 410 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 411 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 412 | "dev": true, 413 | "dependencies": { 414 | "esutils": "^2.0.2" 415 | }, 416 | "engines": { 417 | "node": ">=6.0.0" 418 | } 419 | }, 420 | "node_modules/escape-string-regexp": { 421 | "version": "4.0.0", 422 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 423 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 424 | "dev": true, 425 | "engines": { 426 | "node": ">=10" 427 | }, 428 | "funding": { 429 | "url": "https://github.com/sponsors/sindresorhus" 430 | } 431 | }, 432 | "node_modules/eslint": { 433 | "version": "8.24.0", 434 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", 435 | "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", 436 | "dev": true, 437 | "dependencies": { 438 | "@eslint/eslintrc": "^1.3.2", 439 | "@humanwhocodes/config-array": "^0.10.5", 440 | "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", 441 | "@humanwhocodes/module-importer": "^1.0.1", 442 | "ajv": "^6.10.0", 443 | "chalk": "^4.0.0", 444 | "cross-spawn": "^7.0.2", 445 | "debug": "^4.3.2", 446 | "doctrine": "^3.0.0", 447 | "escape-string-regexp": "^4.0.0", 448 | "eslint-scope": "^7.1.1", 449 | "eslint-utils": "^3.0.0", 450 | "eslint-visitor-keys": "^3.3.0", 451 | "espree": "^9.4.0", 452 | "esquery": "^1.4.0", 453 | "esutils": "^2.0.2", 454 | "fast-deep-equal": "^3.1.3", 455 | "file-entry-cache": "^6.0.1", 456 | "find-up": "^5.0.0", 457 | "glob-parent": "^6.0.1", 458 | "globals": "^13.15.0", 459 | "globby": "^11.1.0", 460 | "grapheme-splitter": "^1.0.4", 461 | "ignore": "^5.2.0", 462 | "import-fresh": "^3.0.0", 463 | "imurmurhash": "^0.1.4", 464 | "is-glob": "^4.0.0", 465 | "js-sdsl": "^4.1.4", 466 | "js-yaml": "^4.1.0", 467 | "json-stable-stringify-without-jsonify": "^1.0.1", 468 | "levn": "^0.4.1", 469 | "lodash.merge": "^4.6.2", 470 | "minimatch": "^3.1.2", 471 | "natural-compare": "^1.4.0", 472 | "optionator": "^0.9.1", 473 | "regexpp": "^3.2.0", 474 | "strip-ansi": "^6.0.1", 475 | "strip-json-comments": "^3.1.0", 476 | "text-table": "^0.2.0" 477 | }, 478 | "bin": { 479 | "eslint": "bin/eslint.js" 480 | }, 481 | "engines": { 482 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 483 | }, 484 | "funding": { 485 | "url": "https://opencollective.com/eslint" 486 | } 487 | }, 488 | "node_modules/eslint-scope": { 489 | "version": "7.1.1", 490 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 491 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 492 | "dev": true, 493 | "dependencies": { 494 | "esrecurse": "^4.3.0", 495 | "estraverse": "^5.2.0" 496 | }, 497 | "engines": { 498 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 499 | } 500 | }, 501 | "node_modules/eslint-utils": { 502 | "version": "3.0.0", 503 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 504 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 505 | "dev": true, 506 | "dependencies": { 507 | "eslint-visitor-keys": "^2.0.0" 508 | }, 509 | "engines": { 510 | "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" 511 | }, 512 | "funding": { 513 | "url": "https://github.com/sponsors/mysticatea" 514 | }, 515 | "peerDependencies": { 516 | "eslint": ">=5" 517 | } 518 | }, 519 | "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 520 | "version": "2.1.0", 521 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 522 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 523 | "dev": true, 524 | "engines": { 525 | "node": ">=10" 526 | } 527 | }, 528 | "node_modules/eslint-visitor-keys": { 529 | "version": "3.3.0", 530 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", 531 | "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", 532 | "dev": true, 533 | "engines": { 534 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 535 | } 536 | }, 537 | "node_modules/espree": { 538 | "version": "9.4.0", 539 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", 540 | "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", 541 | "dev": true, 542 | "dependencies": { 543 | "acorn": "^8.8.0", 544 | "acorn-jsx": "^5.3.2", 545 | "eslint-visitor-keys": "^3.3.0" 546 | }, 547 | "engines": { 548 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 549 | }, 550 | "funding": { 551 | "url": "https://opencollective.com/eslint" 552 | } 553 | }, 554 | "node_modules/esquery": { 555 | "version": "1.4.0", 556 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 557 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 558 | "dev": true, 559 | "dependencies": { 560 | "estraverse": "^5.1.0" 561 | }, 562 | "engines": { 563 | "node": ">=0.10" 564 | } 565 | }, 566 | "node_modules/esrecurse": { 567 | "version": "4.3.0", 568 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 569 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 570 | "dev": true, 571 | "dependencies": { 572 | "estraverse": "^5.2.0" 573 | }, 574 | "engines": { 575 | "node": ">=4.0" 576 | } 577 | }, 578 | "node_modules/estraverse": { 579 | "version": "5.3.0", 580 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 581 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 582 | "dev": true, 583 | "engines": { 584 | "node": ">=4.0" 585 | } 586 | }, 587 | "node_modules/esutils": { 588 | "version": "2.0.3", 589 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 590 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 591 | "dev": true, 592 | "engines": { 593 | "node": ">=0.10.0" 594 | } 595 | }, 596 | "node_modules/fast-deep-equal": { 597 | "version": "3.1.3", 598 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 599 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 600 | "dev": true 601 | }, 602 | "node_modules/fast-glob": { 603 | "version": "3.2.12", 604 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 605 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 606 | "dev": true, 607 | "dependencies": { 608 | "@nodelib/fs.stat": "^2.0.2", 609 | "@nodelib/fs.walk": "^1.2.3", 610 | "glob-parent": "^5.1.2", 611 | "merge2": "^1.3.0", 612 | "micromatch": "^4.0.4" 613 | }, 614 | "engines": { 615 | "node": ">=8.6.0" 616 | } 617 | }, 618 | "node_modules/fast-glob/node_modules/glob-parent": { 619 | "version": "5.1.2", 620 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 621 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 622 | "dev": true, 623 | "dependencies": { 624 | "is-glob": "^4.0.1" 625 | }, 626 | "engines": { 627 | "node": ">= 6" 628 | } 629 | }, 630 | "node_modules/fast-json-stable-stringify": { 631 | "version": "2.1.0", 632 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 633 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 634 | "dev": true 635 | }, 636 | "node_modules/fast-levenshtein": { 637 | "version": "2.0.6", 638 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 639 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 640 | "dev": true 641 | }, 642 | "node_modules/fastq": { 643 | "version": "1.13.0", 644 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 645 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 646 | "dev": true, 647 | "dependencies": { 648 | "reusify": "^1.0.4" 649 | } 650 | }, 651 | "node_modules/file-entry-cache": { 652 | "version": "6.0.1", 653 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 654 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 655 | "dev": true, 656 | "dependencies": { 657 | "flat-cache": "^3.0.4" 658 | }, 659 | "engines": { 660 | "node": "^10.12.0 || >=12.0.0" 661 | } 662 | }, 663 | "node_modules/fill-range": { 664 | "version": "7.0.1", 665 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 666 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 667 | "dev": true, 668 | "dependencies": { 669 | "to-regex-range": "^5.0.1" 670 | }, 671 | "engines": { 672 | "node": ">=8" 673 | } 674 | }, 675 | "node_modules/find-up": { 676 | "version": "5.0.0", 677 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 678 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 679 | "dev": true, 680 | "dependencies": { 681 | "locate-path": "^6.0.0", 682 | "path-exists": "^4.0.0" 683 | }, 684 | "engines": { 685 | "node": ">=10" 686 | }, 687 | "funding": { 688 | "url": "https://github.com/sponsors/sindresorhus" 689 | } 690 | }, 691 | "node_modules/flat-cache": { 692 | "version": "3.0.4", 693 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 694 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 695 | "dev": true, 696 | "dependencies": { 697 | "flatted": "^3.1.0", 698 | "rimraf": "^3.0.2" 699 | }, 700 | "engines": { 701 | "node": "^10.12.0 || >=12.0.0" 702 | } 703 | }, 704 | "node_modules/flatted": { 705 | "version": "3.2.7", 706 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 707 | "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 708 | "dev": true 709 | }, 710 | "node_modules/fs.realpath": { 711 | "version": "1.0.0", 712 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 713 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 714 | "dev": true 715 | }, 716 | "node_modules/glob": { 717 | "version": "7.2.3", 718 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 719 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 720 | "dev": true, 721 | "dependencies": { 722 | "fs.realpath": "^1.0.0", 723 | "inflight": "^1.0.4", 724 | "inherits": "2", 725 | "minimatch": "^3.1.1", 726 | "once": "^1.3.0", 727 | "path-is-absolute": "^1.0.0" 728 | }, 729 | "engines": { 730 | "node": "*" 731 | }, 732 | "funding": { 733 | "url": "https://github.com/sponsors/isaacs" 734 | } 735 | }, 736 | "node_modules/glob-parent": { 737 | "version": "6.0.2", 738 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 739 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 740 | "dev": true, 741 | "dependencies": { 742 | "is-glob": "^4.0.3" 743 | }, 744 | "engines": { 745 | "node": ">=10.13.0" 746 | } 747 | }, 748 | "node_modules/globals": { 749 | "version": "13.17.0", 750 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", 751 | "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", 752 | "dev": true, 753 | "dependencies": { 754 | "type-fest": "^0.20.2" 755 | }, 756 | "engines": { 757 | "node": ">=8" 758 | }, 759 | "funding": { 760 | "url": "https://github.com/sponsors/sindresorhus" 761 | } 762 | }, 763 | "node_modules/globby": { 764 | "version": "11.1.0", 765 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 766 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 767 | "dev": true, 768 | "dependencies": { 769 | "array-union": "^2.1.0", 770 | "dir-glob": "^3.0.1", 771 | "fast-glob": "^3.2.9", 772 | "ignore": "^5.2.0", 773 | "merge2": "^1.4.1", 774 | "slash": "^3.0.0" 775 | }, 776 | "engines": { 777 | "node": ">=10" 778 | }, 779 | "funding": { 780 | "url": "https://github.com/sponsors/sindresorhus" 781 | } 782 | }, 783 | "node_modules/grapheme-splitter": { 784 | "version": "1.0.4", 785 | "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", 786 | "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", 787 | "dev": true 788 | }, 789 | "node_modules/has-flag": { 790 | "version": "4.0.0", 791 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 792 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 793 | "dev": true, 794 | "engines": { 795 | "node": ">=8" 796 | } 797 | }, 798 | "node_modules/httpie": { 799 | "version": "1.1.2", 800 | "resolved": "https://registry.npmjs.org/httpie/-/httpie-1.1.2.tgz", 801 | "integrity": "sha512-VQ82oXG95oY1fQw/XecHuvcFBA+lZQ9Vwj1RfLcO8a7HpDd4cc2ukwpJt+TUlFaLUAzZErylxWu6wclJ1rUhUQ==", 802 | "dev": true, 803 | "engines": { 804 | "node": ">=8" 805 | } 806 | }, 807 | "node_modules/ignore": { 808 | "version": "5.2.0", 809 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", 810 | "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", 811 | "dev": true, 812 | "engines": { 813 | "node": ">= 4" 814 | } 815 | }, 816 | "node_modules/import-fresh": { 817 | "version": "3.3.0", 818 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 819 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 820 | "dev": true, 821 | "dependencies": { 822 | "parent-module": "^1.0.0", 823 | "resolve-from": "^4.0.0" 824 | }, 825 | "engines": { 826 | "node": ">=6" 827 | }, 828 | "funding": { 829 | "url": "https://github.com/sponsors/sindresorhus" 830 | } 831 | }, 832 | "node_modules/imurmurhash": { 833 | "version": "0.1.4", 834 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 835 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 836 | "dev": true, 837 | "engines": { 838 | "node": ">=0.8.19" 839 | } 840 | }, 841 | "node_modules/inflight": { 842 | "version": "1.0.6", 843 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 844 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 845 | "dev": true, 846 | "dependencies": { 847 | "once": "^1.3.0", 848 | "wrappy": "1" 849 | } 850 | }, 851 | "node_modules/inherits": { 852 | "version": "2.0.4", 853 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 854 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 855 | "dev": true 856 | }, 857 | "node_modules/is-extglob": { 858 | "version": "2.1.1", 859 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 860 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 861 | "dev": true, 862 | "engines": { 863 | "node": ">=0.10.0" 864 | } 865 | }, 866 | "node_modules/is-glob": { 867 | "version": "4.0.3", 868 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 869 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 870 | "dev": true, 871 | "dependencies": { 872 | "is-extglob": "^2.1.1" 873 | }, 874 | "engines": { 875 | "node": ">=0.10.0" 876 | } 877 | }, 878 | "node_modules/is-number": { 879 | "version": "7.0.0", 880 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 881 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 882 | "dev": true, 883 | "engines": { 884 | "node": ">=0.12.0" 885 | } 886 | }, 887 | "node_modules/isexe": { 888 | "version": "2.0.0", 889 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 890 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 891 | "dev": true 892 | }, 893 | "node_modules/js-sdsl": { 894 | "version": "4.1.4", 895 | "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", 896 | "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", 897 | "dev": true 898 | }, 899 | "node_modules/js-yaml": { 900 | "version": "4.1.0", 901 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 902 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 903 | "dev": true, 904 | "dependencies": { 905 | "argparse": "^2.0.1" 906 | }, 907 | "bin": { 908 | "js-yaml": "bin/js-yaml.js" 909 | } 910 | }, 911 | "node_modules/json-schema-traverse": { 912 | "version": "0.4.1", 913 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 914 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 915 | "dev": true 916 | }, 917 | "node_modules/json-stable-stringify-without-jsonify": { 918 | "version": "1.0.1", 919 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 920 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 921 | "dev": true 922 | }, 923 | "node_modules/kleur": { 924 | "version": "4.1.5", 925 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 926 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 927 | "dev": true, 928 | "engines": { 929 | "node": ">=6" 930 | } 931 | }, 932 | "node_modules/levn": { 933 | "version": "0.4.1", 934 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 935 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 936 | "dev": true, 937 | "dependencies": { 938 | "prelude-ls": "^1.2.1", 939 | "type-check": "~0.4.0" 940 | }, 941 | "engines": { 942 | "node": ">= 0.8.0" 943 | } 944 | }, 945 | "node_modules/locate-path": { 946 | "version": "6.0.0", 947 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 948 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 949 | "dev": true, 950 | "dependencies": { 951 | "p-locate": "^5.0.0" 952 | }, 953 | "engines": { 954 | "node": ">=10" 955 | }, 956 | "funding": { 957 | "url": "https://github.com/sponsors/sindresorhus" 958 | } 959 | }, 960 | "node_modules/lodash.merge": { 961 | "version": "4.6.2", 962 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 963 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 964 | "dev": true 965 | }, 966 | "node_modules/merge2": { 967 | "version": "1.4.1", 968 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 969 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 970 | "dev": true, 971 | "engines": { 972 | "node": ">= 8" 973 | } 974 | }, 975 | "node_modules/micromatch": { 976 | "version": "4.0.5", 977 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 978 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 979 | "dev": true, 980 | "dependencies": { 981 | "braces": "^3.0.2", 982 | "picomatch": "^2.3.1" 983 | }, 984 | "engines": { 985 | "node": ">=8.6" 986 | } 987 | }, 988 | "node_modules/minimatch": { 989 | "version": "3.1.2", 990 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 991 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 992 | "dev": true, 993 | "dependencies": { 994 | "brace-expansion": "^1.1.7" 995 | }, 996 | "engines": { 997 | "node": "*" 998 | } 999 | }, 1000 | "node_modules/mk-dirs": { 1001 | "version": "3.0.0", 1002 | "resolved": "https://registry.npmjs.org/mk-dirs/-/mk-dirs-3.0.0.tgz", 1003 | "integrity": "sha512-FEZDdUFb88hgdnsfAPa4VxcPVOd+8GyZ2jsI965im5bjBlBYhrvXuTqLka/UHa6YdUNN/kZBsVgofhZ3322AJw==", 1004 | "dev": true, 1005 | "engines": { 1006 | "node": ">=6" 1007 | } 1008 | }, 1009 | "node_modules/ms": { 1010 | "version": "2.1.2", 1011 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1012 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1013 | "dev": true 1014 | }, 1015 | "node_modules/natural-compare": { 1016 | "version": "1.4.0", 1017 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1018 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1019 | "dev": true 1020 | }, 1021 | "node_modules/once": { 1022 | "version": "1.4.0", 1023 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1024 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1025 | "dev": true, 1026 | "dependencies": { 1027 | "wrappy": "1" 1028 | } 1029 | }, 1030 | "node_modules/optionator": { 1031 | "version": "0.9.1", 1032 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1033 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 1034 | "dev": true, 1035 | "dependencies": { 1036 | "deep-is": "^0.1.3", 1037 | "fast-levenshtein": "^2.0.6", 1038 | "levn": "^0.4.1", 1039 | "prelude-ls": "^1.2.1", 1040 | "type-check": "^0.4.0", 1041 | "word-wrap": "^1.2.3" 1042 | }, 1043 | "engines": { 1044 | "node": ">= 0.8.0" 1045 | } 1046 | }, 1047 | "node_modules/p-limit": { 1048 | "version": "3.1.0", 1049 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1050 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1051 | "dev": true, 1052 | "dependencies": { 1053 | "yocto-queue": "^0.1.0" 1054 | }, 1055 | "engines": { 1056 | "node": ">=10" 1057 | }, 1058 | "funding": { 1059 | "url": "https://github.com/sponsors/sindresorhus" 1060 | } 1061 | }, 1062 | "node_modules/p-locate": { 1063 | "version": "5.0.0", 1064 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1065 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1066 | "dev": true, 1067 | "dependencies": { 1068 | "p-limit": "^3.0.2" 1069 | }, 1070 | "engines": { 1071 | "node": ">=10" 1072 | }, 1073 | "funding": { 1074 | "url": "https://github.com/sponsors/sindresorhus" 1075 | } 1076 | }, 1077 | "node_modules/parent-module": { 1078 | "version": "1.0.1", 1079 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1080 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1081 | "dev": true, 1082 | "dependencies": { 1083 | "callsites": "^3.0.0" 1084 | }, 1085 | "engines": { 1086 | "node": ">=6" 1087 | } 1088 | }, 1089 | "node_modules/path-exists": { 1090 | "version": "4.0.0", 1091 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1092 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1093 | "dev": true, 1094 | "engines": { 1095 | "node": ">=8" 1096 | } 1097 | }, 1098 | "node_modules/path-is-absolute": { 1099 | "version": "1.0.1", 1100 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1101 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1102 | "dev": true, 1103 | "engines": { 1104 | "node": ">=0.10.0" 1105 | } 1106 | }, 1107 | "node_modules/path-key": { 1108 | "version": "3.1.1", 1109 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1110 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1111 | "dev": true, 1112 | "engines": { 1113 | "node": ">=8" 1114 | } 1115 | }, 1116 | "node_modules/path-type": { 1117 | "version": "4.0.0", 1118 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1119 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1120 | "dev": true, 1121 | "engines": { 1122 | "node": ">=8" 1123 | } 1124 | }, 1125 | "node_modules/picomatch": { 1126 | "version": "2.3.1", 1127 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1128 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1129 | "dev": true, 1130 | "engines": { 1131 | "node": ">=8.6" 1132 | }, 1133 | "funding": { 1134 | "url": "https://github.com/sponsors/jonschlinkert" 1135 | } 1136 | }, 1137 | "node_modules/prelude-ls": { 1138 | "version": "1.2.1", 1139 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1140 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1141 | "dev": true, 1142 | "engines": { 1143 | "node": ">= 0.8.0" 1144 | } 1145 | }, 1146 | "node_modules/punycode": { 1147 | "version": "2.1.1", 1148 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1149 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1150 | "dev": true, 1151 | "engines": { 1152 | "node": ">=6" 1153 | } 1154 | }, 1155 | "node_modules/queue-microtask": { 1156 | "version": "1.2.3", 1157 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1158 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1159 | "dev": true, 1160 | "funding": [ 1161 | { 1162 | "type": "github", 1163 | "url": "https://github.com/sponsors/feross" 1164 | }, 1165 | { 1166 | "type": "patreon", 1167 | "url": "https://www.patreon.com/feross" 1168 | }, 1169 | { 1170 | "type": "consulting", 1171 | "url": "https://feross.org/support" 1172 | } 1173 | ] 1174 | }, 1175 | "node_modules/regexpp": { 1176 | "version": "3.2.0", 1177 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 1178 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 1179 | "dev": true, 1180 | "engines": { 1181 | "node": ">=8" 1182 | }, 1183 | "funding": { 1184 | "url": "https://github.com/sponsors/mysticatea" 1185 | } 1186 | }, 1187 | "node_modules/resolve-from": { 1188 | "version": "4.0.0", 1189 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1190 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1191 | "dev": true, 1192 | "engines": { 1193 | "node": ">=4" 1194 | } 1195 | }, 1196 | "node_modules/reusify": { 1197 | "version": "1.0.4", 1198 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1199 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1200 | "dev": true, 1201 | "engines": { 1202 | "iojs": ">=1.0.0", 1203 | "node": ">=0.10.0" 1204 | } 1205 | }, 1206 | "node_modules/rewrite-imports": { 1207 | "version": "3.0.0", 1208 | "resolved": "https://registry.npmjs.org/rewrite-imports/-/rewrite-imports-3.0.0.tgz", 1209 | "integrity": "sha512-RClzg1cUfYLYkQadcrjgih8+CqJDKOP3OIWGkFE+e5n71085QnOwghzLPonEe1gG6iblCVJ8lHGFtd+n8wj3Hg==", 1210 | "dev": true, 1211 | "engines": { 1212 | "node": ">=6" 1213 | } 1214 | }, 1215 | "node_modules/rimraf": { 1216 | "version": "3.0.2", 1217 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1218 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1219 | "dev": true, 1220 | "dependencies": { 1221 | "glob": "^7.1.3" 1222 | }, 1223 | "bin": { 1224 | "rimraf": "bin.js" 1225 | }, 1226 | "funding": { 1227 | "url": "https://github.com/sponsors/isaacs" 1228 | } 1229 | }, 1230 | "node_modules/run-parallel": { 1231 | "version": "1.2.0", 1232 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1233 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1234 | "dev": true, 1235 | "funding": [ 1236 | { 1237 | "type": "github", 1238 | "url": "https://github.com/sponsors/feross" 1239 | }, 1240 | { 1241 | "type": "patreon", 1242 | "url": "https://www.patreon.com/feross" 1243 | }, 1244 | { 1245 | "type": "consulting", 1246 | "url": "https://feross.org/support" 1247 | } 1248 | ], 1249 | "dependencies": { 1250 | "queue-microtask": "^1.2.2" 1251 | } 1252 | }, 1253 | "node_modules/shebang-command": { 1254 | "version": "2.0.0", 1255 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1256 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1257 | "dev": true, 1258 | "dependencies": { 1259 | "shebang-regex": "^3.0.0" 1260 | }, 1261 | "engines": { 1262 | "node": ">=8" 1263 | } 1264 | }, 1265 | "node_modules/shebang-regex": { 1266 | "version": "3.0.0", 1267 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1268 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1269 | "dev": true, 1270 | "engines": { 1271 | "node": ">=8" 1272 | } 1273 | }, 1274 | "node_modules/slash": { 1275 | "version": "3.0.0", 1276 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1277 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 1278 | "dev": true, 1279 | "engines": { 1280 | "node": ">=8" 1281 | } 1282 | }, 1283 | "node_modules/source-map": { 1284 | "version": "0.6.1", 1285 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1286 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1287 | "dev": true, 1288 | "engines": { 1289 | "node": ">=0.10.0" 1290 | } 1291 | }, 1292 | "node_modules/source-map-support": { 1293 | "version": "0.5.21", 1294 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 1295 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 1296 | "dev": true, 1297 | "dependencies": { 1298 | "buffer-from": "^1.0.0", 1299 | "source-map": "^0.6.0" 1300 | } 1301 | }, 1302 | "node_modules/strip-ansi": { 1303 | "version": "6.0.1", 1304 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1305 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1306 | "dev": true, 1307 | "dependencies": { 1308 | "ansi-regex": "^5.0.1" 1309 | }, 1310 | "engines": { 1311 | "node": ">=8" 1312 | } 1313 | }, 1314 | "node_modules/strip-json-comments": { 1315 | "version": "3.1.1", 1316 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1317 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1318 | "dev": true, 1319 | "engines": { 1320 | "node": ">=8" 1321 | }, 1322 | "funding": { 1323 | "url": "https://github.com/sponsors/sindresorhus" 1324 | } 1325 | }, 1326 | "node_modules/supports-color": { 1327 | "version": "7.2.0", 1328 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1329 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1330 | "dev": true, 1331 | "dependencies": { 1332 | "has-flag": "^4.0.0" 1333 | }, 1334 | "engines": { 1335 | "node": ">=8" 1336 | } 1337 | }, 1338 | "node_modules/terser": { 1339 | "version": "5.15.0", 1340 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", 1341 | "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", 1342 | "dev": true, 1343 | "dependencies": { 1344 | "@jridgewell/source-map": "^0.3.2", 1345 | "acorn": "^8.5.0", 1346 | "commander": "^2.20.0", 1347 | "source-map-support": "~0.5.20" 1348 | }, 1349 | "bin": { 1350 | "terser": "bin/terser" 1351 | }, 1352 | "engines": { 1353 | "node": ">=10" 1354 | } 1355 | }, 1356 | "node_modules/text-table": { 1357 | "version": "0.2.0", 1358 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1359 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 1360 | "dev": true 1361 | }, 1362 | "node_modules/to-regex-range": { 1363 | "version": "5.0.1", 1364 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1365 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1366 | "dev": true, 1367 | "dependencies": { 1368 | "is-number": "^7.0.0" 1369 | }, 1370 | "engines": { 1371 | "node": ">=8.0" 1372 | } 1373 | }, 1374 | "node_modules/type-check": { 1375 | "version": "0.4.0", 1376 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1377 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1378 | "dev": true, 1379 | "dependencies": { 1380 | "prelude-ls": "^1.2.1" 1381 | }, 1382 | "engines": { 1383 | "node": ">= 0.8.0" 1384 | } 1385 | }, 1386 | "node_modules/type-fest": { 1387 | "version": "0.20.2", 1388 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1389 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1390 | "dev": true, 1391 | "engines": { 1392 | "node": ">=10" 1393 | }, 1394 | "funding": { 1395 | "url": "https://github.com/sponsors/sindresorhus" 1396 | } 1397 | }, 1398 | "node_modules/uri-js": { 1399 | "version": "4.4.1", 1400 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1401 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1402 | "dev": true, 1403 | "dependencies": { 1404 | "punycode": "^2.1.0" 1405 | } 1406 | }, 1407 | "node_modules/which": { 1408 | "version": "2.0.2", 1409 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1410 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1411 | "dev": true, 1412 | "dependencies": { 1413 | "isexe": "^2.0.0" 1414 | }, 1415 | "bin": { 1416 | "node-which": "bin/node-which" 1417 | }, 1418 | "engines": { 1419 | "node": ">= 8" 1420 | } 1421 | }, 1422 | "node_modules/word-wrap": { 1423 | "version": "1.2.3", 1424 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1425 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1426 | "dev": true, 1427 | "engines": { 1428 | "node": ">=0.10.0" 1429 | } 1430 | }, 1431 | "node_modules/wrappy": { 1432 | "version": "1.0.2", 1433 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1434 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1435 | "dev": true 1436 | }, 1437 | "node_modules/yocto-queue": { 1438 | "version": "0.1.0", 1439 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1440 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1441 | "dev": true, 1442 | "engines": { 1443 | "node": ">=10" 1444 | }, 1445 | "funding": { 1446 | "url": "https://github.com/sponsors/sindresorhus" 1447 | } 1448 | } 1449 | }, 1450 | "dependencies": { 1451 | "@eslint/eslintrc": { 1452 | "version": "1.3.2", 1453 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", 1454 | "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", 1455 | "dev": true, 1456 | "requires": { 1457 | "ajv": "^6.12.4", 1458 | "debug": "^4.3.2", 1459 | "espree": "^9.4.0", 1460 | "globals": "^13.15.0", 1461 | "ignore": "^5.2.0", 1462 | "import-fresh": "^3.2.1", 1463 | "js-yaml": "^4.1.0", 1464 | "minimatch": "^3.1.2", 1465 | "strip-json-comments": "^3.1.1" 1466 | } 1467 | }, 1468 | "@humanwhocodes/config-array": { 1469 | "version": "0.10.7", 1470 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", 1471 | "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", 1472 | "dev": true, 1473 | "requires": { 1474 | "@humanwhocodes/object-schema": "^1.2.1", 1475 | "debug": "^4.1.1", 1476 | "minimatch": "^3.0.4" 1477 | } 1478 | }, 1479 | "@humanwhocodes/gitignore-to-minimatch": { 1480 | "version": "1.0.2", 1481 | "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", 1482 | "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", 1483 | "dev": true 1484 | }, 1485 | "@humanwhocodes/module-importer": { 1486 | "version": "1.0.1", 1487 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 1488 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 1489 | "dev": true 1490 | }, 1491 | "@humanwhocodes/object-schema": { 1492 | "version": "1.2.1", 1493 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 1494 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 1495 | "dev": true 1496 | }, 1497 | "@jridgewell/gen-mapping": { 1498 | "version": "0.3.2", 1499 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", 1500 | "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", 1501 | "dev": true, 1502 | "requires": { 1503 | "@jridgewell/set-array": "^1.0.1", 1504 | "@jridgewell/sourcemap-codec": "^1.4.10", 1505 | "@jridgewell/trace-mapping": "^0.3.9" 1506 | } 1507 | }, 1508 | "@jridgewell/resolve-uri": { 1509 | "version": "3.1.0", 1510 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 1511 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 1512 | "dev": true 1513 | }, 1514 | "@jridgewell/set-array": { 1515 | "version": "1.1.2", 1516 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 1517 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 1518 | "dev": true 1519 | }, 1520 | "@jridgewell/source-map": { 1521 | "version": "0.3.2", 1522 | "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", 1523 | "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", 1524 | "dev": true, 1525 | "requires": { 1526 | "@jridgewell/gen-mapping": "^0.3.0", 1527 | "@jridgewell/trace-mapping": "^0.3.9" 1528 | } 1529 | }, 1530 | "@jridgewell/sourcemap-codec": { 1531 | "version": "1.4.14", 1532 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 1533 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 1534 | "dev": true 1535 | }, 1536 | "@jridgewell/trace-mapping": { 1537 | "version": "0.3.15", 1538 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", 1539 | "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", 1540 | "dev": true, 1541 | "requires": { 1542 | "@jridgewell/resolve-uri": "^3.0.3", 1543 | "@jridgewell/sourcemap-codec": "^1.4.10" 1544 | } 1545 | }, 1546 | "@nodelib/fs.scandir": { 1547 | "version": "2.1.5", 1548 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1549 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1550 | "dev": true, 1551 | "requires": { 1552 | "@nodelib/fs.stat": "2.0.5", 1553 | "run-parallel": "^1.1.9" 1554 | } 1555 | }, 1556 | "@nodelib/fs.stat": { 1557 | "version": "2.0.5", 1558 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1559 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1560 | "dev": true 1561 | }, 1562 | "@nodelib/fs.walk": { 1563 | "version": "1.2.8", 1564 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1565 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1566 | "dev": true, 1567 | "requires": { 1568 | "@nodelib/fs.scandir": "2.1.5", 1569 | "fastq": "^1.6.0" 1570 | } 1571 | }, 1572 | "acorn": { 1573 | "version": "8.8.0", 1574 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", 1575 | "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", 1576 | "dev": true 1577 | }, 1578 | "acorn-jsx": { 1579 | "version": "5.3.2", 1580 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1581 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1582 | "dev": true, 1583 | "requires": {} 1584 | }, 1585 | "ajv": { 1586 | "version": "6.12.6", 1587 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1588 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1589 | "dev": true, 1590 | "requires": { 1591 | "fast-deep-equal": "^3.1.1", 1592 | "fast-json-stable-stringify": "^2.0.0", 1593 | "json-schema-traverse": "^0.4.1", 1594 | "uri-js": "^4.2.2" 1595 | } 1596 | }, 1597 | "ansi-regex": { 1598 | "version": "5.0.1", 1599 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1600 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1601 | "dev": true 1602 | }, 1603 | "ansi-styles": { 1604 | "version": "4.3.0", 1605 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1606 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1607 | "dev": true, 1608 | "requires": { 1609 | "color-convert": "^2.0.1" 1610 | } 1611 | }, 1612 | "argparse": { 1613 | "version": "2.0.1", 1614 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1615 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1616 | "dev": true 1617 | }, 1618 | "array-union": { 1619 | "version": "2.1.0", 1620 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 1621 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 1622 | "dev": true 1623 | }, 1624 | "balanced-match": { 1625 | "version": "1.0.2", 1626 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1627 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1628 | "dev": true 1629 | }, 1630 | "brace-expansion": { 1631 | "version": "1.1.11", 1632 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1633 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1634 | "dev": true, 1635 | "requires": { 1636 | "balanced-match": "^1.0.0", 1637 | "concat-map": "0.0.1" 1638 | } 1639 | }, 1640 | "braces": { 1641 | "version": "3.0.2", 1642 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1643 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1644 | "dev": true, 1645 | "requires": { 1646 | "fill-range": "^7.0.1" 1647 | } 1648 | }, 1649 | "buffer-from": { 1650 | "version": "1.1.2", 1651 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 1652 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 1653 | "dev": true 1654 | }, 1655 | "bundt": { 1656 | "version": "git+ssh://git@github.com/saibotsivad/bundt.git#a36675e567c902d9af8f6e611f661d3585876a7f", 1657 | "dev": true, 1658 | "from": "bundt@github:saibotsivad/bundt", 1659 | "requires": { 1660 | "kleur": "^4.0.0", 1661 | "mk-dirs": "^3.0.0", 1662 | "rewrite-imports": "^3.0.0", 1663 | "terser": "^5.15.0" 1664 | } 1665 | }, 1666 | "callsites": { 1667 | "version": "3.1.0", 1668 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1669 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1670 | "dev": true 1671 | }, 1672 | "chalk": { 1673 | "version": "4.1.2", 1674 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1675 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1676 | "dev": true, 1677 | "requires": { 1678 | "ansi-styles": "^4.1.0", 1679 | "supports-color": "^7.1.0" 1680 | } 1681 | }, 1682 | "color-convert": { 1683 | "version": "2.0.1", 1684 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1685 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1686 | "dev": true, 1687 | "requires": { 1688 | "color-name": "~1.1.4" 1689 | } 1690 | }, 1691 | "color-name": { 1692 | "version": "1.1.4", 1693 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1694 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1695 | "dev": true 1696 | }, 1697 | "commander": { 1698 | "version": "2.20.3", 1699 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 1700 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 1701 | "dev": true 1702 | }, 1703 | "concat-map": { 1704 | "version": "0.0.1", 1705 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1706 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1707 | "dev": true 1708 | }, 1709 | "cross-spawn": { 1710 | "version": "7.0.3", 1711 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1712 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1713 | "dev": true, 1714 | "requires": { 1715 | "path-key": "^3.1.0", 1716 | "shebang-command": "^2.0.0", 1717 | "which": "^2.0.1" 1718 | } 1719 | }, 1720 | "debug": { 1721 | "version": "4.3.4", 1722 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1723 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1724 | "dev": true, 1725 | "requires": { 1726 | "ms": "2.1.2" 1727 | } 1728 | }, 1729 | "deep-is": { 1730 | "version": "0.1.4", 1731 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 1732 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 1733 | "dev": true 1734 | }, 1735 | "dir-glob": { 1736 | "version": "3.0.1", 1737 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 1738 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 1739 | "dev": true, 1740 | "requires": { 1741 | "path-type": "^4.0.0" 1742 | } 1743 | }, 1744 | "doctrine": { 1745 | "version": "3.0.0", 1746 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1747 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1748 | "dev": true, 1749 | "requires": { 1750 | "esutils": "^2.0.2" 1751 | } 1752 | }, 1753 | "escape-string-regexp": { 1754 | "version": "4.0.0", 1755 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1756 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1757 | "dev": true 1758 | }, 1759 | "eslint": { 1760 | "version": "8.24.0", 1761 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", 1762 | "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", 1763 | "dev": true, 1764 | "requires": { 1765 | "@eslint/eslintrc": "^1.3.2", 1766 | "@humanwhocodes/config-array": "^0.10.5", 1767 | "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", 1768 | "@humanwhocodes/module-importer": "^1.0.1", 1769 | "ajv": "^6.10.0", 1770 | "chalk": "^4.0.0", 1771 | "cross-spawn": "^7.0.2", 1772 | "debug": "^4.3.2", 1773 | "doctrine": "^3.0.0", 1774 | "escape-string-regexp": "^4.0.0", 1775 | "eslint-scope": "^7.1.1", 1776 | "eslint-utils": "^3.0.0", 1777 | "eslint-visitor-keys": "^3.3.0", 1778 | "espree": "^9.4.0", 1779 | "esquery": "^1.4.0", 1780 | "esutils": "^2.0.2", 1781 | "fast-deep-equal": "^3.1.3", 1782 | "file-entry-cache": "^6.0.1", 1783 | "find-up": "^5.0.0", 1784 | "glob-parent": "^6.0.1", 1785 | "globals": "^13.15.0", 1786 | "globby": "^11.1.0", 1787 | "grapheme-splitter": "^1.0.4", 1788 | "ignore": "^5.2.0", 1789 | "import-fresh": "^3.0.0", 1790 | "imurmurhash": "^0.1.4", 1791 | "is-glob": "^4.0.0", 1792 | "js-sdsl": "^4.1.4", 1793 | "js-yaml": "^4.1.0", 1794 | "json-stable-stringify-without-jsonify": "^1.0.1", 1795 | "levn": "^0.4.1", 1796 | "lodash.merge": "^4.6.2", 1797 | "minimatch": "^3.1.2", 1798 | "natural-compare": "^1.4.0", 1799 | "optionator": "^0.9.1", 1800 | "regexpp": "^3.2.0", 1801 | "strip-ansi": "^6.0.1", 1802 | "strip-json-comments": "^3.1.0", 1803 | "text-table": "^0.2.0" 1804 | } 1805 | }, 1806 | "eslint-scope": { 1807 | "version": "7.1.1", 1808 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", 1809 | "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", 1810 | "dev": true, 1811 | "requires": { 1812 | "esrecurse": "^4.3.0", 1813 | "estraverse": "^5.2.0" 1814 | } 1815 | }, 1816 | "eslint-utils": { 1817 | "version": "3.0.0", 1818 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 1819 | "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 1820 | "dev": true, 1821 | "requires": { 1822 | "eslint-visitor-keys": "^2.0.0" 1823 | }, 1824 | "dependencies": { 1825 | "eslint-visitor-keys": { 1826 | "version": "2.1.0", 1827 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 1828 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 1829 | "dev": true 1830 | } 1831 | } 1832 | }, 1833 | "eslint-visitor-keys": { 1834 | "version": "3.3.0", 1835 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", 1836 | "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", 1837 | "dev": true 1838 | }, 1839 | "espree": { 1840 | "version": "9.4.0", 1841 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", 1842 | "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", 1843 | "dev": true, 1844 | "requires": { 1845 | "acorn": "^8.8.0", 1846 | "acorn-jsx": "^5.3.2", 1847 | "eslint-visitor-keys": "^3.3.0" 1848 | } 1849 | }, 1850 | "esquery": { 1851 | "version": "1.4.0", 1852 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 1853 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 1854 | "dev": true, 1855 | "requires": { 1856 | "estraverse": "^5.1.0" 1857 | } 1858 | }, 1859 | "esrecurse": { 1860 | "version": "4.3.0", 1861 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 1862 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 1863 | "dev": true, 1864 | "requires": { 1865 | "estraverse": "^5.2.0" 1866 | } 1867 | }, 1868 | "estraverse": { 1869 | "version": "5.3.0", 1870 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 1871 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 1872 | "dev": true 1873 | }, 1874 | "esutils": { 1875 | "version": "2.0.3", 1876 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1877 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1878 | "dev": true 1879 | }, 1880 | "fast-deep-equal": { 1881 | "version": "3.1.3", 1882 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1883 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1884 | "dev": true 1885 | }, 1886 | "fast-glob": { 1887 | "version": "3.2.12", 1888 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 1889 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 1890 | "dev": true, 1891 | "requires": { 1892 | "@nodelib/fs.stat": "^2.0.2", 1893 | "@nodelib/fs.walk": "^1.2.3", 1894 | "glob-parent": "^5.1.2", 1895 | "merge2": "^1.3.0", 1896 | "micromatch": "^4.0.4" 1897 | }, 1898 | "dependencies": { 1899 | "glob-parent": { 1900 | "version": "5.1.2", 1901 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1902 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1903 | "dev": true, 1904 | "requires": { 1905 | "is-glob": "^4.0.1" 1906 | } 1907 | } 1908 | } 1909 | }, 1910 | "fast-json-stable-stringify": { 1911 | "version": "2.1.0", 1912 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1913 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1914 | "dev": true 1915 | }, 1916 | "fast-levenshtein": { 1917 | "version": "2.0.6", 1918 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1919 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1920 | "dev": true 1921 | }, 1922 | "fastq": { 1923 | "version": "1.13.0", 1924 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 1925 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 1926 | "dev": true, 1927 | "requires": { 1928 | "reusify": "^1.0.4" 1929 | } 1930 | }, 1931 | "file-entry-cache": { 1932 | "version": "6.0.1", 1933 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 1934 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 1935 | "dev": true, 1936 | "requires": { 1937 | "flat-cache": "^3.0.4" 1938 | } 1939 | }, 1940 | "fill-range": { 1941 | "version": "7.0.1", 1942 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1943 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1944 | "dev": true, 1945 | "requires": { 1946 | "to-regex-range": "^5.0.1" 1947 | } 1948 | }, 1949 | "find-up": { 1950 | "version": "5.0.0", 1951 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1952 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1953 | "dev": true, 1954 | "requires": { 1955 | "locate-path": "^6.0.0", 1956 | "path-exists": "^4.0.0" 1957 | } 1958 | }, 1959 | "flat-cache": { 1960 | "version": "3.0.4", 1961 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 1962 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 1963 | "dev": true, 1964 | "requires": { 1965 | "flatted": "^3.1.0", 1966 | "rimraf": "^3.0.2" 1967 | } 1968 | }, 1969 | "flatted": { 1970 | "version": "3.2.7", 1971 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 1972 | "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 1973 | "dev": true 1974 | }, 1975 | "fs.realpath": { 1976 | "version": "1.0.0", 1977 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1978 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1979 | "dev": true 1980 | }, 1981 | "glob": { 1982 | "version": "7.2.3", 1983 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1984 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1985 | "dev": true, 1986 | "requires": { 1987 | "fs.realpath": "^1.0.0", 1988 | "inflight": "^1.0.4", 1989 | "inherits": "2", 1990 | "minimatch": "^3.1.1", 1991 | "once": "^1.3.0", 1992 | "path-is-absolute": "^1.0.0" 1993 | } 1994 | }, 1995 | "glob-parent": { 1996 | "version": "6.0.2", 1997 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1998 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1999 | "dev": true, 2000 | "requires": { 2001 | "is-glob": "^4.0.3" 2002 | } 2003 | }, 2004 | "globals": { 2005 | "version": "13.17.0", 2006 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", 2007 | "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", 2008 | "dev": true, 2009 | "requires": { 2010 | "type-fest": "^0.20.2" 2011 | } 2012 | }, 2013 | "globby": { 2014 | "version": "11.1.0", 2015 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 2016 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 2017 | "dev": true, 2018 | "requires": { 2019 | "array-union": "^2.1.0", 2020 | "dir-glob": "^3.0.1", 2021 | "fast-glob": "^3.2.9", 2022 | "ignore": "^5.2.0", 2023 | "merge2": "^1.4.1", 2024 | "slash": "^3.0.0" 2025 | } 2026 | }, 2027 | "grapheme-splitter": { 2028 | "version": "1.0.4", 2029 | "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", 2030 | "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", 2031 | "dev": true 2032 | }, 2033 | "has-flag": { 2034 | "version": "4.0.0", 2035 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2036 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2037 | "dev": true 2038 | }, 2039 | "httpie": { 2040 | "version": "1.1.2", 2041 | "resolved": "https://registry.npmjs.org/httpie/-/httpie-1.1.2.tgz", 2042 | "integrity": "sha512-VQ82oXG95oY1fQw/XecHuvcFBA+lZQ9Vwj1RfLcO8a7HpDd4cc2ukwpJt+TUlFaLUAzZErylxWu6wclJ1rUhUQ==", 2043 | "dev": true 2044 | }, 2045 | "ignore": { 2046 | "version": "5.2.0", 2047 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", 2048 | "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", 2049 | "dev": true 2050 | }, 2051 | "import-fresh": { 2052 | "version": "3.3.0", 2053 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 2054 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 2055 | "dev": true, 2056 | "requires": { 2057 | "parent-module": "^1.0.0", 2058 | "resolve-from": "^4.0.0" 2059 | } 2060 | }, 2061 | "imurmurhash": { 2062 | "version": "0.1.4", 2063 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2064 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 2065 | "dev": true 2066 | }, 2067 | "inflight": { 2068 | "version": "1.0.6", 2069 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2070 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 2071 | "dev": true, 2072 | "requires": { 2073 | "once": "^1.3.0", 2074 | "wrappy": "1" 2075 | } 2076 | }, 2077 | "inherits": { 2078 | "version": "2.0.4", 2079 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2080 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2081 | "dev": true 2082 | }, 2083 | "is-extglob": { 2084 | "version": "2.1.1", 2085 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2086 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2087 | "dev": true 2088 | }, 2089 | "is-glob": { 2090 | "version": "4.0.3", 2091 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2092 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2093 | "dev": true, 2094 | "requires": { 2095 | "is-extglob": "^2.1.1" 2096 | } 2097 | }, 2098 | "is-number": { 2099 | "version": "7.0.0", 2100 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2101 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2102 | "dev": true 2103 | }, 2104 | "isexe": { 2105 | "version": "2.0.0", 2106 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2107 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 2108 | "dev": true 2109 | }, 2110 | "js-sdsl": { 2111 | "version": "4.1.4", 2112 | "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", 2113 | "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", 2114 | "dev": true 2115 | }, 2116 | "js-yaml": { 2117 | "version": "4.1.0", 2118 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2119 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2120 | "dev": true, 2121 | "requires": { 2122 | "argparse": "^2.0.1" 2123 | } 2124 | }, 2125 | "json-schema-traverse": { 2126 | "version": "0.4.1", 2127 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2128 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 2129 | "dev": true 2130 | }, 2131 | "json-stable-stringify-without-jsonify": { 2132 | "version": "1.0.1", 2133 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 2134 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 2135 | "dev": true 2136 | }, 2137 | "kleur": { 2138 | "version": "4.1.5", 2139 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 2140 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 2141 | "dev": true 2142 | }, 2143 | "levn": { 2144 | "version": "0.4.1", 2145 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 2146 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 2147 | "dev": true, 2148 | "requires": { 2149 | "prelude-ls": "^1.2.1", 2150 | "type-check": "~0.4.0" 2151 | } 2152 | }, 2153 | "locate-path": { 2154 | "version": "6.0.0", 2155 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2156 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2157 | "dev": true, 2158 | "requires": { 2159 | "p-locate": "^5.0.0" 2160 | } 2161 | }, 2162 | "lodash.merge": { 2163 | "version": "4.6.2", 2164 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 2165 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 2166 | "dev": true 2167 | }, 2168 | "merge2": { 2169 | "version": "1.4.1", 2170 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2171 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2172 | "dev": true 2173 | }, 2174 | "micromatch": { 2175 | "version": "4.0.5", 2176 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 2177 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 2178 | "dev": true, 2179 | "requires": { 2180 | "braces": "^3.0.2", 2181 | "picomatch": "^2.3.1" 2182 | } 2183 | }, 2184 | "minimatch": { 2185 | "version": "3.1.2", 2186 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2187 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2188 | "dev": true, 2189 | "requires": { 2190 | "brace-expansion": "^1.1.7" 2191 | } 2192 | }, 2193 | "mk-dirs": { 2194 | "version": "3.0.0", 2195 | "resolved": "https://registry.npmjs.org/mk-dirs/-/mk-dirs-3.0.0.tgz", 2196 | "integrity": "sha512-FEZDdUFb88hgdnsfAPa4VxcPVOd+8GyZ2jsI965im5bjBlBYhrvXuTqLka/UHa6YdUNN/kZBsVgofhZ3322AJw==", 2197 | "dev": true 2198 | }, 2199 | "ms": { 2200 | "version": "2.1.2", 2201 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2202 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2203 | "dev": true 2204 | }, 2205 | "natural-compare": { 2206 | "version": "1.4.0", 2207 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2208 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2209 | "dev": true 2210 | }, 2211 | "once": { 2212 | "version": "1.4.0", 2213 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2214 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2215 | "dev": true, 2216 | "requires": { 2217 | "wrappy": "1" 2218 | } 2219 | }, 2220 | "optionator": { 2221 | "version": "0.9.1", 2222 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 2223 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 2224 | "dev": true, 2225 | "requires": { 2226 | "deep-is": "^0.1.3", 2227 | "fast-levenshtein": "^2.0.6", 2228 | "levn": "^0.4.1", 2229 | "prelude-ls": "^1.2.1", 2230 | "type-check": "^0.4.0", 2231 | "word-wrap": "^1.2.3" 2232 | } 2233 | }, 2234 | "p-limit": { 2235 | "version": "3.1.0", 2236 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2237 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2238 | "dev": true, 2239 | "requires": { 2240 | "yocto-queue": "^0.1.0" 2241 | } 2242 | }, 2243 | "p-locate": { 2244 | "version": "5.0.0", 2245 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2246 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2247 | "dev": true, 2248 | "requires": { 2249 | "p-limit": "^3.0.2" 2250 | } 2251 | }, 2252 | "parent-module": { 2253 | "version": "1.0.1", 2254 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 2255 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 2256 | "dev": true, 2257 | "requires": { 2258 | "callsites": "^3.0.0" 2259 | } 2260 | }, 2261 | "path-exists": { 2262 | "version": "4.0.0", 2263 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2264 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2265 | "dev": true 2266 | }, 2267 | "path-is-absolute": { 2268 | "version": "1.0.1", 2269 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2270 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2271 | "dev": true 2272 | }, 2273 | "path-key": { 2274 | "version": "3.1.1", 2275 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2276 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2277 | "dev": true 2278 | }, 2279 | "path-type": { 2280 | "version": "4.0.0", 2281 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 2282 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 2283 | "dev": true 2284 | }, 2285 | "picomatch": { 2286 | "version": "2.3.1", 2287 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2288 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2289 | "dev": true 2290 | }, 2291 | "prelude-ls": { 2292 | "version": "1.2.1", 2293 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 2294 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 2295 | "dev": true 2296 | }, 2297 | "punycode": { 2298 | "version": "2.1.1", 2299 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2300 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2301 | "dev": true 2302 | }, 2303 | "queue-microtask": { 2304 | "version": "1.2.3", 2305 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2306 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2307 | "dev": true 2308 | }, 2309 | "regexpp": { 2310 | "version": "3.2.0", 2311 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 2312 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 2313 | "dev": true 2314 | }, 2315 | "resolve-from": { 2316 | "version": "4.0.0", 2317 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2318 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2319 | "dev": true 2320 | }, 2321 | "reusify": { 2322 | "version": "1.0.4", 2323 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2324 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2325 | "dev": true 2326 | }, 2327 | "rewrite-imports": { 2328 | "version": "3.0.0", 2329 | "resolved": "https://registry.npmjs.org/rewrite-imports/-/rewrite-imports-3.0.0.tgz", 2330 | "integrity": "sha512-RClzg1cUfYLYkQadcrjgih8+CqJDKOP3OIWGkFE+e5n71085QnOwghzLPonEe1gG6iblCVJ8lHGFtd+n8wj3Hg==", 2331 | "dev": true 2332 | }, 2333 | "rimraf": { 2334 | "version": "3.0.2", 2335 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 2336 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 2337 | "dev": true, 2338 | "requires": { 2339 | "glob": "^7.1.3" 2340 | } 2341 | }, 2342 | "run-parallel": { 2343 | "version": "1.2.0", 2344 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2345 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2346 | "dev": true, 2347 | "requires": { 2348 | "queue-microtask": "^1.2.2" 2349 | } 2350 | }, 2351 | "shebang-command": { 2352 | "version": "2.0.0", 2353 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2354 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2355 | "dev": true, 2356 | "requires": { 2357 | "shebang-regex": "^3.0.0" 2358 | } 2359 | }, 2360 | "shebang-regex": { 2361 | "version": "3.0.0", 2362 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2363 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2364 | "dev": true 2365 | }, 2366 | "slash": { 2367 | "version": "3.0.0", 2368 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 2369 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 2370 | "dev": true 2371 | }, 2372 | "source-map": { 2373 | "version": "0.6.1", 2374 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2375 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2376 | "dev": true 2377 | }, 2378 | "source-map-support": { 2379 | "version": "0.5.21", 2380 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 2381 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 2382 | "dev": true, 2383 | "requires": { 2384 | "buffer-from": "^1.0.0", 2385 | "source-map": "^0.6.0" 2386 | } 2387 | }, 2388 | "strip-ansi": { 2389 | "version": "6.0.1", 2390 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2391 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2392 | "dev": true, 2393 | "requires": { 2394 | "ansi-regex": "^5.0.1" 2395 | } 2396 | }, 2397 | "strip-json-comments": { 2398 | "version": "3.1.1", 2399 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2400 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2401 | "dev": true 2402 | }, 2403 | "supports-color": { 2404 | "version": "7.2.0", 2405 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2406 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2407 | "dev": true, 2408 | "requires": { 2409 | "has-flag": "^4.0.0" 2410 | } 2411 | }, 2412 | "terser": { 2413 | "version": "5.15.0", 2414 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", 2415 | "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", 2416 | "dev": true, 2417 | "requires": { 2418 | "@jridgewell/source-map": "^0.3.2", 2419 | "acorn": "^8.5.0", 2420 | "commander": "^2.20.0", 2421 | "source-map-support": "~0.5.20" 2422 | } 2423 | }, 2424 | "text-table": { 2425 | "version": "0.2.0", 2426 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2427 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 2428 | "dev": true 2429 | }, 2430 | "to-regex-range": { 2431 | "version": "5.0.1", 2432 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2433 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2434 | "dev": true, 2435 | "requires": { 2436 | "is-number": "^7.0.0" 2437 | } 2438 | }, 2439 | "type-check": { 2440 | "version": "0.4.0", 2441 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2442 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2443 | "dev": true, 2444 | "requires": { 2445 | "prelude-ls": "^1.2.1" 2446 | } 2447 | }, 2448 | "type-fest": { 2449 | "version": "0.20.2", 2450 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 2451 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 2452 | "dev": true 2453 | }, 2454 | "uri-js": { 2455 | "version": "4.4.1", 2456 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2457 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2458 | "dev": true, 2459 | "requires": { 2460 | "punycode": "^2.1.0" 2461 | } 2462 | }, 2463 | "which": { 2464 | "version": "2.0.2", 2465 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2466 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2467 | "dev": true, 2468 | "requires": { 2469 | "isexe": "^2.0.0" 2470 | } 2471 | }, 2472 | "word-wrap": { 2473 | "version": "1.2.3", 2474 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2475 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2476 | "dev": true 2477 | }, 2478 | "wrappy": { 2479 | "version": "1.0.2", 2480 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2481 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2482 | "dev": true 2483 | }, 2484 | "yocto-queue": { 2485 | "version": "0.1.0", 2486 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2487 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2488 | "dev": true 2489 | } 2490 | } 2491 | } 2492 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@saibotsivad/mongodb", 3 | "version": "1.1.0", 4 | "description": "Simple wrapper for the MongoDB Data API.", 5 | "module": "dist/index.mjs", 6 | "unpkg": "dist/index.min.js", 7 | "main": "dist/index.js", 8 | "types": "index.d.ts", 9 | "type": "module", 10 | "exports": { 11 | ".": { 12 | "import": "./dist/index.mjs", 13 | "require": "./dist/index.js" 14 | }, 15 | "./package.json": "./package.json" 16 | }, 17 | "files": [ 18 | "src", 19 | "dist", 20 | "*.d.ts" 21 | ], 22 | "scripts": { 23 | "prepublishOnly": "npm run build", 24 | "lint": "eslint src/*.js", 25 | "demo": "node demo/demo.js", 26 | "build": "bundt src/index.js" 27 | }, 28 | "repository": { 29 | "type": "git", 30 | "url": "git+https://github.com/saibotsivad/mongodb.git" 31 | }, 32 | "keywords": [ 33 | "mongodb", 34 | "atlas", 35 | "data", 36 | "api" 37 | ], 38 | "author": { 39 | "name": "Tobias Davis", 40 | "email": "tobias@davistobias.com", 41 | "url": "https://davistobias.com" 42 | }, 43 | "license": "SEE LICENSE IN LICENSE.md", 44 | "bugs": { 45 | "url": "https://github.com/saibotsivad/mongodb/issues" 46 | }, 47 | "homepage": "https://github.com/saibotsivad/mongodb", 48 | "devDependencies": { 49 | "bundt": "github:saibotsivad/bundt", 50 | "eslint": "^8.24.0", 51 | "httpie": "^1.1.2" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true 4 | }, 5 | "globals": { 6 | "globalThis": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | class MongodbError extends Error { 2 | constructor({ error, error_code, link }, status) { 3 | super(error) 4 | this.name = 'MongodbError' 5 | this.status = status 6 | if (error_code) this.title = error_code 7 | if (link) this.meta = { link } 8 | } 9 | } 10 | 11 | const requiredConnectionParameters = [ 'dataSource', 'database', 'collection' ] 12 | const makeAndAssertConnectionIsValid = (inits, overrides) => { 13 | const connection = {} 14 | const notSet = [] 15 | for (const key of requiredConnectionParameters) { 16 | connection[key] = overrides?.[key] || inits?.[key] 17 | if (!connection[key]) notSet.push(key) 18 | } 19 | if (notSet.length) throw new Error('One or more request parameters were not set: ' + notSet.join(', ')) 20 | return connection 21 | } 22 | 23 | export function mongodb({ 24 | apiKey, 25 | apiUrl, 26 | dataSource, 27 | database, 28 | collection, 29 | fetch = globalThis.fetch, 30 | interpose = passThrough => passThrough, 31 | }) { 32 | if (!apiUrl || !apiKey) throw new Error('The `apiUrl` and `apiKey` must always be set.') 33 | 34 | const request = async (name, parameters, overrides) => { 35 | const { body } = interpose({ 36 | name, 37 | body: { 38 | ...(parameters || {}), 39 | ...makeAndAssertConnectionIsValid({ dataSource, database, collection }, overrides), 40 | }, 41 | }) 42 | const response = await fetch(apiUrl + '/action/' + name, { 43 | method: 'POST', 44 | headers: { 45 | 'content-type': 'application/json', 46 | 'access-control-request-headers': '*', 47 | 'api-key': apiKey, 48 | }, 49 | body: JSON.stringify(body), 50 | }) 51 | const status = response.status || response.statusCode || 500 52 | if (status === 200 || status === 201) { 53 | return response.json() 54 | } else { 55 | // Errors that are at the Data API service level, for example authentication 56 | // and pathname validation, return a JSON error object. Errors that are at 57 | // the database level, for example errors returned from the `insertOne` call, 58 | // return a plaintext error string. 59 | let error = ( 60 | typeof response.headers?.get === 'function' 61 | ? response.headers.get('content-type') 62 | : response.headers['content-type'] 63 | )?.includes('application/json') 64 | ? await response.json() 65 | : await response.text() 66 | if (typeof error === 'string') { 67 | if (error.includes('{')) { 68 | try { 69 | error = JSON.parse(error) 70 | } catch (ignore) { 71 | // not valid JSON 72 | error = { error } 73 | } 74 | } else { 75 | // also not valid JSON, probably plaintext 76 | error = { error } 77 | } 78 | } 79 | return Promise.reject(new MongodbError(error, status)) 80 | } 81 | } 82 | 83 | return { 84 | /** 85 | * Runs an aggregation pipeline and returns the result set of the final stage of the pipeline 86 | * as an array of documents. 87 | * @param {Object} parameters - The request parameters. 88 | * @param {Object} parameters.pipeline - The MongoDB pipeline array. 89 | * @param {Object} [overrides] - Overrides specific to this request. 90 | * @return {Promise<{ documents: Array }>} - The returned list of documents. 91 | */ 92 | aggregate: async ({ pipeline }, overrides) => request('aggregate', { pipeline }, overrides), 93 | 94 | /** 95 | * Delete the first document matching the filter, and return the number of documents deleted. 96 | * @param {Object} parameters - The request parameters. 97 | * @param {Object} parameters.filter - The MongoDB filter object. 98 | * @param {Object} [overrides] - Overrides specific to this request. 99 | * @return {Promise<{ deletedCount: Number }>} - The number of documents deleted. 100 | */ 101 | deleteOne: async ({ filter }, overrides) => request('deleteOne', { filter }, overrides), 102 | 103 | /** 104 | * Delete all documents matching the filter, and return the number of documents deleted. 105 | * @param {Object} parameters - The request parameters. 106 | * @param {Object} parameters.filter - The MongoDB filter object. 107 | * @param {Object} [overrides] - Overrides specific to this request. 108 | * @return {Promise<{ deletedCount: Number }>} - The number of documents deleted. 109 | */ 110 | deleteMany: async ({ filter }, overrides) => request('deleteMany', { filter }, overrides), 111 | 112 | /** 113 | * Find and return a list of documents. 114 | * @param {Object} parameters - The request parameters. 115 | * @param {Object} [parameters.filter] - The MongoDB filter object. 116 | * @param {Object} [parameters.projection] - The MongoDB projection object. 117 | * @param {Object} [parameters.sort] - The MongoDB sort object, e.g. `{ completed: -1 }`. 118 | * @param {Number} [parameters.limit] - The maximum number of documents to return. 119 | * @param {Number} [parameters.skip] - The number of documents to skip, aka the cursor position. 120 | * @param {Object} [overrides] - Overrides specific to this request. 121 | * @return {Promise<{ documents: Array }>} - The documents matching the parameters. 122 | */ 123 | find: async ({ filter, projection, sort, limit, skip }, overrides) => request('find', { 124 | filter, 125 | projection, 126 | sort, 127 | limit, 128 | skip, 129 | }, overrides), 130 | 131 | /** 132 | * Find and return the first document matching the filter. 133 | * @param {Object} parameters - The request parameters. 134 | * @param {Object} [parameters.filter] - The MongoDB filter object. 135 | * @param {Object} [parameters.projection] - The MongoDB projection object. 136 | * @param {Object} [overrides] - Overrides specific to this request. 137 | * @return {Promise<{ document: Object }>} - The document matching the parameters. 138 | */ 139 | findOne: async ({ filter, projection }, overrides) => request('findOne', { 140 | filter, 141 | projection, 142 | }, overrides), 143 | 144 | /** 145 | * Insert a single document. Must be an EJSON document. 146 | * @param {Object} parameters - The request parameters. 147 | * @param {Object} parameters.document - The EJSON document to insert. 148 | * @param {Object} [overrides] - Overrides specific to this request. 149 | * @return {Promise<{ insertedId: String }>} - The identifier of the inserted document. 150 | */ 151 | insertOne: async ({ document }, overrides) => request('insertOne', { document }, overrides), 152 | 153 | /** 154 | * Insert multiple documents at once. Must be EJSON documents. 155 | * @param {Object} parameters - The request parameters. 156 | * @param {Object} parameters.documents - The EJSON documents to insert. 157 | * @param {Object} [overrides] - Overrides specific to this request. 158 | * @return {Promise<{ insertedIds: Array }>} - The identifiers of the inserted document. 159 | */ 160 | insertMany: async ({ documents }, overrides) => request('insertMany', { documents }, overrides), 161 | 162 | /** 163 | * Replace or upsert a single document. Must be an EJSON document. 164 | * @param {Object} parameters - The request parameters. 165 | * @param {Object} parameters.filter - The MongoDB filter object. 166 | * @param {Object} parameters.replacement - The EJSON document to replace or upsert. 167 | * @param {Boolean} [parameters.upsert] - If set to true, it will insert the `replacement` document if no documents match the `filter`. 168 | * @param {Object} [overrides] - Overrides specific to this request. 169 | * @return {Promise<{ matchedCount: Number, modifiedCount: Number, upsertedId: String }>} - The request results. 170 | */ 171 | replaceOne: async ({ filter, replacement, upsert }, overrides) => request('replaceOne', { 172 | filter, 173 | replacement, 174 | upsert, 175 | }, overrides), 176 | 177 | /** 178 | * Update or upsert a single document. Must be an EJSON document. 179 | * @param {Object} parameters - The request parameters. 180 | * @param {Object} parameters.filter - The MongoDB filter object. 181 | * @param {Object} parameters.update - The EJSON document to update or upsert. 182 | * @param {Boolean} [parameters.upsert] - If set to true, it will insert the `replacement` document if no documents match the `filter`. 183 | * @param {Object} [overrides] - Overrides specific to this request. 184 | * @return {Promise<{ matchedCount: Number, modifiedCount: Number, upsertedId: String }>} - The request results. 185 | */ 186 | updateOne: async ({ filter, update, upsert }, overrides) => request('updateOne', { 187 | filter, 188 | update, 189 | upsert, 190 | }, overrides), 191 | 192 | /** 193 | * Update many documents or upsert a single document. Must be an EJSON document. 194 | * @param {Object} parameters - The request parameters. 195 | * @param {Object} parameters.filter - The MongoDB filter object. 196 | * @param {Object} parameters.update - The EJSON document to update or upsert. 197 | * @param {Boolean} [parameters.upsert] - If set to true, it will insert the `replacement` document if no documents match the `filter`. 198 | * @param {Object} [overrides] - Overrides specific to this request. 199 | * @return {Promise<{ matchedCount: Number, modifiedCount: Number, upsertedId: String }>} - The request results. 200 | */ 201 | updateMany: async ({ filter, update, upsert }, overrides) => request('updateMany', { 202 | filter, 203 | update, 204 | upsert, 205 | }, overrides), 206 | } 207 | } 208 | --------------------------------------------------------------------------------