├── .github └── FUNDING.yml ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── docker-compose.yml ├── package-lock.json ├── package.json ├── server.js ├── src ├── config.js ├── db.js ├── helper.js ├── model.js ├── routes.js └── validators.js ├── test └── test.js └── www ├── favicon.ico ├── icon.png ├── icon.svg ├── index.html └── style.css /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | patreon: vasanthv 3 | custom: https://www.paypal.me/vsnthv 4 | 5 | # github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 6 | # open_collective: # Replace with a single Open Collective username 7 | # ko_fi: # Replace with a single Ko-fi username 8 | # tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 9 | # community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 10 | # liberapay: # Replace with a single Liberapay username 11 | # issuehunt: # Replace with a single IssueHunt username 12 | # otechie: # Replace with a single Otechie username 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # git folder 2 | .git 3 | 4 | # NPM 5 | node_modules 6 | npm-debug.log 7 | 8 | # Testing 9 | .nyc_output 10 | 11 | # Mac 12 | .DS_Store 13 | 14 | # data folder for docker 15 | data 16 | 17 | # Sublime text files 18 | jsonbox.sublime-project 19 | jsonbox.sublime-workspace 20 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:latest 2 | WORKDIR /usr/src/app 3 | COPY package.json . 4 | RUN npm install 5 | COPY . . 6 | EXPOSE 3000 7 | CMD [ "npm", "start" ] 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 Vasanth V 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > :warning: Jsonbox.io cloud instance was shut down on May 31st, 2021 due to a lack of maintenance time. The Jsonbox.io's source code will continue to be open-sourced in this repository. 2 | 3 | # jsonbox.io 4 | 5 | A HTTP based JSON storage. It lets you store, read & modify JSON data over HTTP APIs for FREE. Ideal for small projects, prototypes or hackathons, where you don't have to spin up your own data store. 6 | 7 | With the new protected boxes (introduced in v2), you can even power your websites with jsonbox.io. 8 | 9 | ## API Documentation 10 | 11 | Base URL: `https://jsonbox.io/` 12 | 13 | ### Create 14 | 15 | You can create a record (or add a record) to a box by using HTTP post to `jsonbox.io/${BOX_ID}`. 16 | 17 | ```sh 18 | curl -X POST 'https://jsonbox.io/demobox_6d9e326c183fde7b' \ 19 | -H 'content-type: application/json' \ 20 | -d '{"name": "Jon Snow", "age": 25}' 21 | ``` 22 | 23 | Response: 24 | 25 | ```json 26 | { 27 | "_id": "5d776a25fd6d3d6cb1d45c51", 28 | "name": "Jon Snow", 29 | "age": 25, 30 | "_createdOn": "2019-09-10T09:17:25.607Z" 31 | } 32 | ``` 33 | 34 | You can also create multiple records at once by passing an array 35 | 36 | ```sh 37 | curl -X POST 'https://jsonbox.io/demobox_6d9e326c183fde7b' \ 38 | -H 'content-type: application/json' \ 39 | -d '[{"name": "Daenerys Targaryen", "age": 25}, {"name": "Arya Stark", "age": 16}]' 40 | ``` 41 | 42 | ```json 43 | [ 44 | { 45 | "_id": "5d776b75fd6d3d6cb1d45c52", 46 | "name": "Daenerys Targaryen", 47 | "age": 25, 48 | "_createdOn": "2019-09-10T09:23:01.105Z" 49 | }, 50 | { 51 | "_id": "5d776b75fd6d3d6cb1d45c53", 52 | "name": "Arya Stark", 53 | "age": 16, 54 | "_createdOn": "2019-09-10T09:23:01.105Z" 55 | } 56 | ] 57 | ``` 58 | 59 | You can also pass in an optional collections parameter in the URL to group records `jsonbox.io/${BOX_ID}/${COLLECTION}`. 60 | 61 | _Note: A valid `${BOX_ID}` & `${COLLECTION}` should contain only alphanumeric characters & \_. `${BOX_ID}` should be at least 20 characters long._ 62 | 63 | ### Read 64 | 65 | Use HTTP GET to read all the records or a single record. You can also query & sort the records. 66 | 67 | ```sh 68 | curl -X GET 'https://jsonbox.io/demobox_6d9e326c183fde7b' 69 | ``` 70 | 71 | ```json 72 | [ 73 | { 74 | "_id": "5d776b75fd6d3d6cb1d45c52", 75 | "name": "Daenerys Targaryen", 76 | "age": 25, 77 | "_createdOn": "2019-09-10T09:23:01.105Z" 78 | }, 79 | { 80 | "_id": "5d776b75fd6d3d6cb1d45c53", 81 | "name": "Arya Stark", 82 | "age": 16, 83 | "_createdOn": "2019-09-10T09:23:01.105Z" 84 | }, 85 | { 86 | "_id": "5d776a25fd6d3d6cb1d45c51", 87 | "name": "Jon Snow", 88 | "age": 25, 89 | "_createdOn": "2019-09-10T09:17:25.607Z" 90 | } 91 | ] 92 | ``` 93 | 94 | To get all records inside a collection _Sample collection name: "users"_: 95 | 96 | ```sh 97 | curl -X GET 'https://jsonbox.io/demobox_6d9e326c183fde7b/users' 98 | ``` 99 | 100 | To sort the records by a specific field use `sort` query param. In the below example the output will be sorted in the descending order of the age. 101 | 102 | ```sh 103 | curl -X GET 'https://jsonbox.io/demobox_6d9e326c183fde7b?sort=-age' 104 | ``` 105 | 106 | To read a specific record use `jsonbox.io/${BOX_ID}/${RECORD_ID}`. 107 | 108 | ```sh 109 | curl -X GET 'https://jsonbox.io/demobox_6d9e326c183fde7b/5d776a25fd6d3d6cb1d45c51' 110 | ``` 111 | 112 | To query records, you have to pass the key & value as shown below. 113 | 114 | ```sh 115 | curl -X GET 'https://jsonbox.io/demobox_6d9e326c183fde7b?q=name:arya%20stark' 116 | ``` 117 | 118 | All the accepted query params are as follows. 119 | 120 | | Param | Description | Default | 121 | | ----- | --------------------------------------------------------------------------------------------- | ------------ | 122 | | sort | Used to sort the result set by the specific field. Add a prefix "-" to sort in reverse order. | -\_createdOn | 123 | | skip | Used to skip certain no. of records. Can be used for pagination. | 0 | 124 | | limit | Used to limit the results to a specific count. Can be used for pagination. Max. is 1000. | 20 | 125 | | q | Query for filtering values. Check out the format below. | | 126 | 127 | #### Filtering 128 | 129 | You can pass a filter in a query by passing them in URL param `q` as shown below: 130 | 131 | ```sh 132 | curl -X GET 'https://jsonbox.io/demobox_6d9e326c183fde7b?q=name:arya%20stark,age:>13' 133 | ``` 134 | 135 | The above sample will look for the name `arya stark` and age greater than 13. You can filter on `Number`, `String` & `Boolean` values only. 136 | 137 | Different filters for Numeric values. 138 | 139 | | | Sample | 140 | | -------------------------------------------------------------------- | ---------------------------- | 141 | | To filter values greater than or less than a specific value | `q=age:>10` or `q=age:<10` | 142 | | To filter values greater (or less) than or equal to a specific value | `q=age:>=10` or `q=age:<=10` | 143 | | To filter values that match a specific value. | `q=age:=10` | 144 | 145 | Different filters for String values. 146 | 147 | | | Sample | 148 | | ------------------------------------------------------------------ | --------------------- | 149 | | Filter values that start with a specific string | `q=name:arya*` | 150 | | Filter values that end with a specific string | `q=name:*stark` | 151 | | Filter values where a specific string appears anywhere in a string | `q=name:*ya*` | 152 | | Filter values that match a specific string | `q=name:arya%20stark` | 153 | 154 | You can combine multiple fields by separating them with commas as shown below: 155 | 156 | ``` 157 | https://jsonbox.io/demobox_6d9e326c183fde7b?q=name:arya%20stark,age:>13,isalive:true 158 | ``` 159 | 160 | ### Update 161 | 162 | Use HTTP PUT to update record one by one. Please note that this will not patch the record, it is full update. _A Bulk update is not supported yet._ 163 | 164 | ```sh 165 | curl -X PUT 'https://jsonbox.io/demobox_6d9e326c183fde7b/5d776b75fd6d3d6cb1d45c53' \ 166 | -H 'content-type: application/json' \ 167 | -d '{"name": "Arya Stark", "age": 18}' 168 | ``` 169 | 170 | ### Delete 171 | 172 | Two approaches are available for delete 173 | 174 | - To delete a specific record use HTTP DELETE with jsonbox.io/${BOX_ID}/${RECORD_ID} 175 | 176 | ```sh 177 | curl -X DELETE 'https://jsonbox.io/demobox_6d9e326c183fde7b/5d776b75fd6d3d6cb1d45c53' 178 | ``` 179 | 180 | - To delete based on a filter use HTTP DELETE with jsonbox.io/\${BOX_ID}?q={QUERY} 181 | 182 | ```sh 183 | curl -X DELETE 'https://jsonbox.io/demobox_6d9e326c183fde7b?q=name:arya%20stark,age:>13' 184 | ``` 185 | 186 | ### Protected Box 187 | 188 | A **protected box** is similar to a regular box, but you need an API-KEY to create / update / delete records. _Reading records is open and does not need API-KEY_. Pass the API-KEY using the `X-API-KEY` HTTP header. 189 | 190 | ```sh 191 | curl -X POST 'https://jsonbox.io/demobox_6d9e326c183fde7b' \ 192 | -H 'content-type: application/json' \ 193 | --H 'x-api-key: 7b3b910b-a7ad-41e8-89d6-5e28e2e34e70' \ 194 | -d '{"name": "Jon Snow", "age": 25}' 195 | ``` 196 | 197 | You can also use `Authorization: API-KEY 7b3b910b-a7ad-41e8-89d6-5e28e2e34e70` header. _An API-KEY should be a valid GUID/UUID._ 198 | 199 | #### How to create a protected box? 200 | 201 | You create a protected box by pushing your first record to a new box with an API-KEY. All the subsequent write requests to that box expect the API-KEY to be passed. _You cannot change a public box to protected or vice versa._ 202 | 203 | ### Getting Box metadata 204 | 205 | Use `/_meta/${BOX_ID}` in a `GET` request to get metadata of a box 206 | 207 | ``` 208 | https://jsonbox.io/_meta/demobox_6d9e326c183fde7b 209 | ``` 210 | 211 | The result will have the following format 212 | 213 | ```json 214 | { 215 | "_count": 3, 216 | "_createdOn": "2020-03-12T04:45:22.000Z", 217 | "_updatedOn": "2020-03-12T06:23:26.000Z" 218 | } 219 | ``` 220 | 221 | - `_count` - the record count in the box 222 | - `_createdOn` - the oldest record's created date 223 | - `_updatedOn` - the most recent updated date 224 | 225 | ### Optional IP Filtering 226 | When running your own instance localy, you could define IP Address filtering. 227 | Set the value of `FILTER_IP_SET` in config.js to the set of allowed IP addresses. 228 | 229 | Single IP: 230 | ``` 231 | FILTER_IP_SET: ['192.168.1.123'] 232 | ``` 233 | 234 | Using CIDR subnet masks for ranges: 235 | ``` 236 | FILTER_IP_SET: ['127.0.0.1/24'] 237 | ``` 238 | 239 | Using IP ranges: 240 | ``` 241 | FILTER_IP_SET: [['127.0.0.1', '127.0.0.10']] 242 | ``` 243 | 244 | Using wildcard ip ranges and nginx forwarding: 245 | ``` 246 | FILTER_IP_SET: ['10.1.*.*', '123.??.34.8*'] 247 | ``` 248 | 249 | ### Limitations 250 | 251 | This is FREE service, so we have to have some limitations to avoid abuse and stay free forever. 252 | 253 | 1. The request body cannot be more than 50KB. 254 | 2. Can't push or pull more than 1000 records at a time. 255 | 3. `POST` requests are rate-limited to 100 per hour per IP address 256 | 4. There is no limit on the number of records you store in a box, but please don't abuse the API by storing large datasets of more than **5000** records. This is meant for small projects and that's why it is offered FREE of cost. 257 | 5. 30 days of data retention. 258 | 6. No backup. If your data is lost due to some technical issues, its lost forever. 259 | 260 | ### Wrappers 261 | 262 | _Note: The wrappers listed here are from other sources and have not been tested or validated by us_ 263 | 264 | - **Go**: [peteretelej/jsonbox](https://godoc.org/github.com/peteretelej/jsonbox) ([GitHub](https://github.com/peteretelej/jsonbox)) 265 | - **Java**: 266 | 1. [https://search.maven.org/artifact/io.jsonbox/jsonbox](https://search.maven.org/artifact/io.jsonbox/jsonbox) ([GitHub](https://github.com/leonardiwagner/jsonbox-java)) 267 | 2. [https://github.com/leeu1911/jsonbox-java](https://github.com/leeu1911/jsonbox-java) 268 | - **JavaScript (Node + browser)**: [https://www.npmjs.com/package/jsonbox-client](https://www.npmjs.com/package/jsonbox-client) ([GitHub](https://github.com/jsejcksn/jsonbox-client)) 269 | - **JavaScript (Node)**: [https://www.npmjs.com/package/jsonbox-node](https://www.npmjs.com/package/jsonbox-node) ([GitHub](https://github.com/0xflotus/jsonbox-node)) 270 | - **JavaScript (React)**: [https://www.npmjs.com/package/react-jsonbox](https://www.npmjs.com/package/react-jsonbox) ([GitHub](https://github.com/SaraVieira/react-jsonbox)) 271 | - **PHP**: [https://packagist.org/packages/anper/jsonbox](https://packagist.org/packages/anper/jsonbox) ([GitHub](https://github.com/perevoshchikov/jsonbox)) 272 | - **Python**: [https://pypi.org/project/jsonbox/](https://pypi.org/project/jsonbox/) ([GitHub](https://github.com/harlev/jsonbox-python)) 273 | - **Rust**: [https://crates.io/crates/jsonbox](https://crates.io/crates/jsonbox) ([GitHub](https://github.com/kuy/jsonbox-rs)) 274 | 275 | ### How to run locally 276 | 277 | Fork this repo and then clone it: 278 | 279 | ``` 280 | git clone https://github.com//jsonbox.git 281 | ``` 282 | 283 | You need MongoDB to run this application. If you don't already have MongoDB, go to the [official documentation](https://docs.mongodb.com/manual/installation/) and follow the instructions there. Once you have MongoDB installed, run 284 | 285 | ``` 286 | mongo 287 | ``` 288 | 289 | to start the MongoDB instance. Then `cd` into directory where the repo was cloned and install the dependencies: 290 | 291 | ``` 292 | npm install 293 | ``` 294 | 295 | Then just run 296 | 297 | ``` 298 | npm start 299 | ``` 300 | 301 | to start the development server on port `3000`. Your jsonbox instance will be running on `http://localhost:3000`. Alternatively you can run the application using docker with `docker-compose up`. 302 | 303 | ### LICENSE 304 | 305 | MIT 306 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | services: 3 | mongo: 4 | container_name: mongo 5 | image: mongo 6 | volumes: 7 | - ./data:/data/db 8 | ports: 9 | - '27017:27017' 10 | jsonbox: 11 | container_name: jsonbox 12 | restart: always 13 | environment: 14 | - MONGODB_URI=mongodb://mongo:27017/jsonbox-io-dev 15 | build: . 16 | ports: 17 | - '3000:3000' 18 | links: 19 | - mongo 20 | depends_on: 21 | - mongo 22 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jsonbox", 3 | "version": "2.1.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "jsonbox", 9 | "version": "2.1.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "body-parser": "^1.19.0", 13 | "cors": "^2.8.5", 14 | "express": "^4.17.3", 15 | "express-ipfilter": "^1.1.2", 16 | "express-rate-limit": "^5.1.1", 17 | "mongoose": "^5.13.15" 18 | }, 19 | "devDependencies": { 20 | "fetch-lite": "^1.1.0", 21 | "mocha": "^9.1.3" 22 | } 23 | }, 24 | "node_modules/@types/bson": { 25 | "version": "4.0.3", 26 | "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", 27 | "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", 28 | "dependencies": { 29 | "@types/node": "*" 30 | } 31 | }, 32 | "node_modules/@types/mongodb": { 33 | "version": "3.6.17", 34 | "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.17.tgz", 35 | "integrity": "sha512-9hhgvYPdC5iHyyksPcKCu45gfaAIPQHKHGdvNXu4582DmOZX3wrUJIJPT40o4G1oTKPgpMMFqZglOTjhnYoF+A==", 36 | "dependencies": { 37 | "@types/bson": "*", 38 | "@types/node": "*" 39 | } 40 | }, 41 | "node_modules/@types/node": { 42 | "version": "15.6.1", 43 | "resolved": "https://registry.npmjs.org/@types/node/-/node-15.6.1.tgz", 44 | "integrity": "sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA==" 45 | }, 46 | "node_modules/@ungap/promise-all-settled": { 47 | "version": "1.1.2", 48 | "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", 49 | "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", 50 | "dev": true 51 | }, 52 | "node_modules/accepts": { 53 | "version": "1.3.8", 54 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 55 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 56 | "dependencies": { 57 | "mime-types": "~2.1.34", 58 | "negotiator": "0.6.3" 59 | }, 60 | "engines": { 61 | "node": ">= 0.6" 62 | } 63 | }, 64 | "node_modules/ansi-colors": { 65 | "version": "4.1.1", 66 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 67 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 68 | "dev": true, 69 | "engines": { 70 | "node": ">=6" 71 | } 72 | }, 73 | "node_modules/ansi-regex": { 74 | "version": "5.0.1", 75 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 76 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 77 | "dev": true, 78 | "engines": { 79 | "node": ">=8" 80 | } 81 | }, 82 | "node_modules/ansi-styles": { 83 | "version": "4.3.0", 84 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 85 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 86 | "dev": true, 87 | "dependencies": { 88 | "color-convert": "^2.0.1" 89 | }, 90 | "engines": { 91 | "node": ">=8" 92 | }, 93 | "funding": { 94 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 95 | } 96 | }, 97 | "node_modules/anymatch": { 98 | "version": "3.1.2", 99 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 100 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 101 | "dev": true, 102 | "dependencies": { 103 | "normalize-path": "^3.0.0", 104 | "picomatch": "^2.0.4" 105 | }, 106 | "engines": { 107 | "node": ">= 8" 108 | } 109 | }, 110 | "node_modules/argparse": { 111 | "version": "2.0.1", 112 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 113 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 114 | "dev": true 115 | }, 116 | "node_modules/array-flatten": { 117 | "version": "1.1.1", 118 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 119 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 120 | }, 121 | "node_modules/balanced-match": { 122 | "version": "1.0.2", 123 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 124 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 125 | "dev": true 126 | }, 127 | "node_modules/binary-extensions": { 128 | "version": "2.2.0", 129 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 130 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 131 | "dev": true, 132 | "engines": { 133 | "node": ">=8" 134 | } 135 | }, 136 | "node_modules/bl": { 137 | "version": "2.2.1", 138 | "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", 139 | "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", 140 | "dependencies": { 141 | "readable-stream": "^2.3.5", 142 | "safe-buffer": "^5.1.1" 143 | } 144 | }, 145 | "node_modules/bluebird": { 146 | "version": "3.5.1", 147 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 148 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 149 | }, 150 | "node_modules/body-parser": { 151 | "version": "1.19.2", 152 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", 153 | "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", 154 | "dependencies": { 155 | "bytes": "3.1.2", 156 | "content-type": "~1.0.4", 157 | "debug": "2.6.9", 158 | "depd": "~1.1.2", 159 | "http-errors": "1.8.1", 160 | "iconv-lite": "0.4.24", 161 | "on-finished": "~2.3.0", 162 | "qs": "6.9.7", 163 | "raw-body": "2.4.3", 164 | "type-is": "~1.6.18" 165 | }, 166 | "engines": { 167 | "node": ">= 0.8" 168 | } 169 | }, 170 | "node_modules/brace-expansion": { 171 | "version": "1.1.11", 172 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 173 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 174 | "dev": true, 175 | "dependencies": { 176 | "balanced-match": "^1.0.0", 177 | "concat-map": "0.0.1" 178 | } 179 | }, 180 | "node_modules/braces": { 181 | "version": "3.0.2", 182 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 183 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 184 | "dev": true, 185 | "dependencies": { 186 | "fill-range": "^7.0.1" 187 | }, 188 | "engines": { 189 | "node": ">=8" 190 | } 191 | }, 192 | "node_modules/browser-stdout": { 193 | "version": "1.3.1", 194 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 195 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 196 | "dev": true 197 | }, 198 | "node_modules/bson": { 199 | "version": "1.1.6", 200 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", 201 | "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", 202 | "engines": { 203 | "node": ">=0.6.19" 204 | } 205 | }, 206 | "node_modules/bytes": { 207 | "version": "3.1.2", 208 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 209 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 210 | "engines": { 211 | "node": ">= 0.8" 212 | } 213 | }, 214 | "node_modules/camelcase": { 215 | "version": "6.3.0", 216 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 217 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 218 | "dev": true, 219 | "engines": { 220 | "node": ">=10" 221 | }, 222 | "funding": { 223 | "url": "https://github.com/sponsors/sindresorhus" 224 | } 225 | }, 226 | "node_modules/chalk": { 227 | "version": "4.1.2", 228 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 229 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 230 | "dev": true, 231 | "dependencies": { 232 | "ansi-styles": "^4.1.0", 233 | "supports-color": "^7.1.0" 234 | }, 235 | "engines": { 236 | "node": ">=10" 237 | }, 238 | "funding": { 239 | "url": "https://github.com/chalk/chalk?sponsor=1" 240 | } 241 | }, 242 | "node_modules/chalk/node_modules/supports-color": { 243 | "version": "7.2.0", 244 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 245 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 246 | "dev": true, 247 | "dependencies": { 248 | "has-flag": "^4.0.0" 249 | }, 250 | "engines": { 251 | "node": ">=8" 252 | } 253 | }, 254 | "node_modules/chokidar": { 255 | "version": "3.5.3", 256 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 257 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 258 | "dev": true, 259 | "funding": [ 260 | { 261 | "type": "individual", 262 | "url": "https://paulmillr.com/funding/" 263 | } 264 | ], 265 | "dependencies": { 266 | "anymatch": "~3.1.2", 267 | "braces": "~3.0.2", 268 | "glob-parent": "~5.1.2", 269 | "is-binary-path": "~2.1.0", 270 | "is-glob": "~4.0.1", 271 | "normalize-path": "~3.0.0", 272 | "readdirp": "~3.6.0" 273 | }, 274 | "engines": { 275 | "node": ">= 8.10.0" 276 | }, 277 | "optionalDependencies": { 278 | "fsevents": "~2.3.2" 279 | } 280 | }, 281 | "node_modules/cliui": { 282 | "version": "7.0.4", 283 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 284 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 285 | "dev": true, 286 | "dependencies": { 287 | "string-width": "^4.2.0", 288 | "strip-ansi": "^6.0.0", 289 | "wrap-ansi": "^7.0.0" 290 | } 291 | }, 292 | "node_modules/color-convert": { 293 | "version": "2.0.1", 294 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 295 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 296 | "dev": true, 297 | "dependencies": { 298 | "color-name": "~1.1.4" 299 | }, 300 | "engines": { 301 | "node": ">=7.0.0" 302 | } 303 | }, 304 | "node_modules/color-name": { 305 | "version": "1.1.4", 306 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 307 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 308 | "dev": true 309 | }, 310 | "node_modules/concat-map": { 311 | "version": "0.0.1", 312 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 313 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 314 | "dev": true 315 | }, 316 | "node_modules/content-disposition": { 317 | "version": "0.5.4", 318 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 319 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 320 | "dependencies": { 321 | "safe-buffer": "5.2.1" 322 | }, 323 | "engines": { 324 | "node": ">= 0.6" 325 | } 326 | }, 327 | "node_modules/content-disposition/node_modules/safe-buffer": { 328 | "version": "5.2.1", 329 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 330 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 331 | "funding": [ 332 | { 333 | "type": "github", 334 | "url": "https://github.com/sponsors/feross" 335 | }, 336 | { 337 | "type": "patreon", 338 | "url": "https://www.patreon.com/feross" 339 | }, 340 | { 341 | "type": "consulting", 342 | "url": "https://feross.org/support" 343 | } 344 | ] 345 | }, 346 | "node_modules/content-type": { 347 | "version": "1.0.4", 348 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 349 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 350 | "engines": { 351 | "node": ">= 0.6" 352 | } 353 | }, 354 | "node_modules/cookie": { 355 | "version": "0.4.2", 356 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", 357 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", 358 | "engines": { 359 | "node": ">= 0.6" 360 | } 361 | }, 362 | "node_modules/cookie-signature": { 363 | "version": "1.0.6", 364 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 365 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 366 | }, 367 | "node_modules/core-util-is": { 368 | "version": "1.0.3", 369 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 370 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 371 | }, 372 | "node_modules/cors": { 373 | "version": "2.8.5", 374 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 375 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 376 | "dependencies": { 377 | "object-assign": "^4", 378 | "vary": "^1" 379 | }, 380 | "engines": { 381 | "node": ">= 0.10" 382 | } 383 | }, 384 | "node_modules/debug": { 385 | "version": "2.6.9", 386 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 387 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 388 | "dependencies": { 389 | "ms": "2.0.0" 390 | } 391 | }, 392 | "node_modules/decamelize": { 393 | "version": "4.0.0", 394 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 395 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 396 | "dev": true, 397 | "engines": { 398 | "node": ">=10" 399 | }, 400 | "funding": { 401 | "url": "https://github.com/sponsors/sindresorhus" 402 | } 403 | }, 404 | "node_modules/denque": { 405 | "version": "1.5.1", 406 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", 407 | "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", 408 | "engines": { 409 | "node": ">=0.10" 410 | } 411 | }, 412 | "node_modules/depd": { 413 | "version": "1.1.2", 414 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 415 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 416 | "engines": { 417 | "node": ">= 0.6" 418 | } 419 | }, 420 | "node_modules/destroy": { 421 | "version": "1.0.4", 422 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 423 | "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" 424 | }, 425 | "node_modules/diff": { 426 | "version": "5.0.0", 427 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 428 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 429 | "dev": true, 430 | "engines": { 431 | "node": ">=0.3.1" 432 | } 433 | }, 434 | "node_modules/ee-first": { 435 | "version": "1.1.1", 436 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 437 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 438 | }, 439 | "node_modules/emoji-regex": { 440 | "version": "8.0.0", 441 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 442 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 443 | "dev": true 444 | }, 445 | "node_modules/encodeurl": { 446 | "version": "1.0.2", 447 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 448 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 449 | "engines": { 450 | "node": ">= 0.8" 451 | } 452 | }, 453 | "node_modules/escalade": { 454 | "version": "3.1.1", 455 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 456 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 457 | "dev": true, 458 | "engines": { 459 | "node": ">=6" 460 | } 461 | }, 462 | "node_modules/escape-html": { 463 | "version": "1.0.3", 464 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 465 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 466 | }, 467 | "node_modules/escape-string-regexp": { 468 | "version": "4.0.0", 469 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 470 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 471 | "dev": true, 472 | "engines": { 473 | "node": ">=10" 474 | }, 475 | "funding": { 476 | "url": "https://github.com/sponsors/sindresorhus" 477 | } 478 | }, 479 | "node_modules/etag": { 480 | "version": "1.8.1", 481 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 482 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 483 | "engines": { 484 | "node": ">= 0.6" 485 | } 486 | }, 487 | "node_modules/express": { 488 | "version": "4.17.3", 489 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", 490 | "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", 491 | "dependencies": { 492 | "accepts": "~1.3.8", 493 | "array-flatten": "1.1.1", 494 | "body-parser": "1.19.2", 495 | "content-disposition": "0.5.4", 496 | "content-type": "~1.0.4", 497 | "cookie": "0.4.2", 498 | "cookie-signature": "1.0.6", 499 | "debug": "2.6.9", 500 | "depd": "~1.1.2", 501 | "encodeurl": "~1.0.2", 502 | "escape-html": "~1.0.3", 503 | "etag": "~1.8.1", 504 | "finalhandler": "~1.1.2", 505 | "fresh": "0.5.2", 506 | "merge-descriptors": "1.0.1", 507 | "methods": "~1.1.2", 508 | "on-finished": "~2.3.0", 509 | "parseurl": "~1.3.3", 510 | "path-to-regexp": "0.1.7", 511 | "proxy-addr": "~2.0.7", 512 | "qs": "6.9.7", 513 | "range-parser": "~1.2.1", 514 | "safe-buffer": "5.2.1", 515 | "send": "0.17.2", 516 | "serve-static": "1.14.2", 517 | "setprototypeof": "1.2.0", 518 | "statuses": "~1.5.0", 519 | "type-is": "~1.6.18", 520 | "utils-merge": "1.0.1", 521 | "vary": "~1.1.2" 522 | }, 523 | "engines": { 524 | "node": ">= 0.10.0" 525 | } 526 | }, 527 | "node_modules/express-ipfilter": { 528 | "version": "1.1.2", 529 | "resolved": "https://registry.npmjs.org/express-ipfilter/-/express-ipfilter-1.1.2.tgz", 530 | "integrity": "sha512-dm1G3sVxlSbcOWSxfUTCo20ySyNQXJ4hJD5fuQJFoZlhkQvpbuDGBlh8AbFm1GwX85EWvfyhekOkvcydaXkBkg==", 531 | "dependencies": { 532 | "ip": "~1.1.0", 533 | "lodash": "^4.17.11", 534 | "proxy-addr": "^2.0.4", 535 | "range_check": "^1.2.0" 536 | }, 537 | "engines": { 538 | "node": ">=8.9.0" 539 | } 540 | }, 541 | "node_modules/express-rate-limit": { 542 | "version": "5.1.1", 543 | "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.1.1.tgz", 544 | "integrity": "sha512-puA1zcCx/quwWUOU6pT6daCt6t7SweD9wKChKhb+KSgFMKRwS81C224hiSAUANw/gnSHiwEhgozM/2ezEBZPeA==" 545 | }, 546 | "node_modules/express/node_modules/safe-buffer": { 547 | "version": "5.2.1", 548 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 549 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 550 | "funding": [ 551 | { 552 | "type": "github", 553 | "url": "https://github.com/sponsors/feross" 554 | }, 555 | { 556 | "type": "patreon", 557 | "url": "https://www.patreon.com/feross" 558 | }, 559 | { 560 | "type": "consulting", 561 | "url": "https://feross.org/support" 562 | } 563 | ] 564 | }, 565 | "node_modules/fetch-lite": { 566 | "version": "1.1.0", 567 | "resolved": "https://registry.npmjs.org/fetch-lite/-/fetch-lite-1.1.0.tgz", 568 | "integrity": "sha1-E7rOtbO3mJ7GSEXj0IodFTkiPj8=", 569 | "dev": true 570 | }, 571 | "node_modules/fill-range": { 572 | "version": "7.0.1", 573 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 574 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 575 | "dev": true, 576 | "dependencies": { 577 | "to-regex-range": "^5.0.1" 578 | }, 579 | "engines": { 580 | "node": ">=8" 581 | } 582 | }, 583 | "node_modules/finalhandler": { 584 | "version": "1.1.2", 585 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 586 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 587 | "dependencies": { 588 | "debug": "2.6.9", 589 | "encodeurl": "~1.0.2", 590 | "escape-html": "~1.0.3", 591 | "on-finished": "~2.3.0", 592 | "parseurl": "~1.3.3", 593 | "statuses": "~1.5.0", 594 | "unpipe": "~1.0.0" 595 | }, 596 | "engines": { 597 | "node": ">= 0.8" 598 | } 599 | }, 600 | "node_modules/find-up": { 601 | "version": "5.0.0", 602 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 603 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 604 | "dev": true, 605 | "dependencies": { 606 | "locate-path": "^6.0.0", 607 | "path-exists": "^4.0.0" 608 | }, 609 | "engines": { 610 | "node": ">=10" 611 | }, 612 | "funding": { 613 | "url": "https://github.com/sponsors/sindresorhus" 614 | } 615 | }, 616 | "node_modules/flat": { 617 | "version": "5.0.2", 618 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 619 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 620 | "dev": true, 621 | "bin": { 622 | "flat": "cli.js" 623 | } 624 | }, 625 | "node_modules/forwarded": { 626 | "version": "0.2.0", 627 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 628 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 629 | "engines": { 630 | "node": ">= 0.6" 631 | } 632 | }, 633 | "node_modules/fresh": { 634 | "version": "0.5.2", 635 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 636 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 637 | "engines": { 638 | "node": ">= 0.6" 639 | } 640 | }, 641 | "node_modules/fs.realpath": { 642 | "version": "1.0.0", 643 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 644 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 645 | "dev": true 646 | }, 647 | "node_modules/fsevents": { 648 | "version": "2.3.2", 649 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 650 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 651 | "dev": true, 652 | "hasInstallScript": true, 653 | "optional": true, 654 | "os": [ 655 | "darwin" 656 | ], 657 | "engines": { 658 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 659 | } 660 | }, 661 | "node_modules/get-caller-file": { 662 | "version": "2.0.5", 663 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 664 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 665 | "dev": true, 666 | "engines": { 667 | "node": "6.* || 8.* || >= 10.*" 668 | } 669 | }, 670 | "node_modules/glob": { 671 | "version": "7.2.0", 672 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 673 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 674 | "dev": true, 675 | "dependencies": { 676 | "fs.realpath": "^1.0.0", 677 | "inflight": "^1.0.4", 678 | "inherits": "2", 679 | "minimatch": "^3.0.4", 680 | "once": "^1.3.0", 681 | "path-is-absolute": "^1.0.0" 682 | }, 683 | "engines": { 684 | "node": "*" 685 | }, 686 | "funding": { 687 | "url": "https://github.com/sponsors/isaacs" 688 | } 689 | }, 690 | "node_modules/glob-parent": { 691 | "version": "5.1.2", 692 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 693 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 694 | "dev": true, 695 | "dependencies": { 696 | "is-glob": "^4.0.1" 697 | }, 698 | "engines": { 699 | "node": ">= 6" 700 | } 701 | }, 702 | "node_modules/growl": { 703 | "version": "1.10.5", 704 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 705 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 706 | "dev": true, 707 | "engines": { 708 | "node": ">=4.x" 709 | } 710 | }, 711 | "node_modules/has-flag": { 712 | "version": "4.0.0", 713 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 714 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 715 | "dev": true, 716 | "engines": { 717 | "node": ">=8" 718 | } 719 | }, 720 | "node_modules/he": { 721 | "version": "1.2.0", 722 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 723 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 724 | "dev": true, 725 | "bin": { 726 | "he": "bin/he" 727 | } 728 | }, 729 | "node_modules/http-errors": { 730 | "version": "1.8.1", 731 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 732 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 733 | "dependencies": { 734 | "depd": "~1.1.2", 735 | "inherits": "2.0.4", 736 | "setprototypeof": "1.2.0", 737 | "statuses": ">= 1.5.0 < 2", 738 | "toidentifier": "1.0.1" 739 | }, 740 | "engines": { 741 | "node": ">= 0.6" 742 | } 743 | }, 744 | "node_modules/iconv-lite": { 745 | "version": "0.4.24", 746 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 747 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 748 | "dependencies": { 749 | "safer-buffer": ">= 2.1.2 < 3" 750 | }, 751 | "engines": { 752 | "node": ">=0.10.0" 753 | } 754 | }, 755 | "node_modules/inflight": { 756 | "version": "1.0.6", 757 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 758 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 759 | "dev": true, 760 | "dependencies": { 761 | "once": "^1.3.0", 762 | "wrappy": "1" 763 | } 764 | }, 765 | "node_modules/inherits": { 766 | "version": "2.0.4", 767 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 768 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 769 | }, 770 | "node_modules/ip": { 771 | "version": "1.1.5", 772 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", 773 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" 774 | }, 775 | "node_modules/ip6": { 776 | "version": "0.0.4", 777 | "resolved": "https://registry.npmjs.org/ip6/-/ip6-0.0.4.tgz", 778 | "integrity": "sha1-RMWp23njnUBSAbTXjROzhw5I2zE=" 779 | }, 780 | "node_modules/ipaddr.js": { 781 | "version": "1.9.1", 782 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 783 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 784 | "engines": { 785 | "node": ">= 0.10" 786 | } 787 | }, 788 | "node_modules/is-binary-path": { 789 | "version": "2.1.0", 790 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 791 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 792 | "dev": true, 793 | "dependencies": { 794 | "binary-extensions": "^2.0.0" 795 | }, 796 | "engines": { 797 | "node": ">=8" 798 | } 799 | }, 800 | "node_modules/is-extglob": { 801 | "version": "2.1.1", 802 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 803 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 804 | "dev": true, 805 | "engines": { 806 | "node": ">=0.10.0" 807 | } 808 | }, 809 | "node_modules/is-fullwidth-code-point": { 810 | "version": "3.0.0", 811 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 812 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 813 | "dev": true, 814 | "engines": { 815 | "node": ">=8" 816 | } 817 | }, 818 | "node_modules/is-glob": { 819 | "version": "4.0.3", 820 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 821 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 822 | "dev": true, 823 | "dependencies": { 824 | "is-extglob": "^2.1.1" 825 | }, 826 | "engines": { 827 | "node": ">=0.10.0" 828 | } 829 | }, 830 | "node_modules/is-number": { 831 | "version": "7.0.0", 832 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 833 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 834 | "dev": true, 835 | "engines": { 836 | "node": ">=0.12.0" 837 | } 838 | }, 839 | "node_modules/is-plain-obj": { 840 | "version": "2.1.0", 841 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 842 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 843 | "dev": true, 844 | "engines": { 845 | "node": ">=8" 846 | } 847 | }, 848 | "node_modules/is-unicode-supported": { 849 | "version": "0.1.0", 850 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 851 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 852 | "dev": true, 853 | "engines": { 854 | "node": ">=10" 855 | }, 856 | "funding": { 857 | "url": "https://github.com/sponsors/sindresorhus" 858 | } 859 | }, 860 | "node_modules/isarray": { 861 | "version": "1.0.0", 862 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 863 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 864 | }, 865 | "node_modules/isexe": { 866 | "version": "2.0.0", 867 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 868 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 869 | "dev": true 870 | }, 871 | "node_modules/js-yaml": { 872 | "version": "4.1.0", 873 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 874 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 875 | "dev": true, 876 | "dependencies": { 877 | "argparse": "^2.0.1" 878 | }, 879 | "bin": { 880 | "js-yaml": "bin/js-yaml.js" 881 | } 882 | }, 883 | "node_modules/kareem": { 884 | "version": "2.3.2", 885 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", 886 | "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" 887 | }, 888 | "node_modules/locate-path": { 889 | "version": "6.0.0", 890 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 891 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 892 | "dev": true, 893 | "dependencies": { 894 | "p-locate": "^5.0.0" 895 | }, 896 | "engines": { 897 | "node": ">=10" 898 | }, 899 | "funding": { 900 | "url": "https://github.com/sponsors/sindresorhus" 901 | } 902 | }, 903 | "node_modules/lodash": { 904 | "version": "4.17.21", 905 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 906 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 907 | }, 908 | "node_modules/log-symbols": { 909 | "version": "4.1.0", 910 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 911 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 912 | "dev": true, 913 | "dependencies": { 914 | "chalk": "^4.1.0", 915 | "is-unicode-supported": "^0.1.0" 916 | }, 917 | "engines": { 918 | "node": ">=10" 919 | }, 920 | "funding": { 921 | "url": "https://github.com/sponsors/sindresorhus" 922 | } 923 | }, 924 | "node_modules/media-typer": { 925 | "version": "0.3.0", 926 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 927 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 928 | "engines": { 929 | "node": ">= 0.6" 930 | } 931 | }, 932 | "node_modules/memory-pager": { 933 | "version": "1.5.0", 934 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 935 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 936 | "optional": true 937 | }, 938 | "node_modules/merge-descriptors": { 939 | "version": "1.0.1", 940 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 941 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 942 | }, 943 | "node_modules/methods": { 944 | "version": "1.1.2", 945 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 946 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 947 | "engines": { 948 | "node": ">= 0.6" 949 | } 950 | }, 951 | "node_modules/mime": { 952 | "version": "1.6.0", 953 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 954 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 955 | "bin": { 956 | "mime": "cli.js" 957 | }, 958 | "engines": { 959 | "node": ">=4" 960 | } 961 | }, 962 | "node_modules/mime-db": { 963 | "version": "1.52.0", 964 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 965 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 966 | "engines": { 967 | "node": ">= 0.6" 968 | } 969 | }, 970 | "node_modules/mime-types": { 971 | "version": "2.1.35", 972 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 973 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 974 | "dependencies": { 975 | "mime-db": "1.52.0" 976 | }, 977 | "engines": { 978 | "node": ">= 0.6" 979 | } 980 | }, 981 | "node_modules/minimatch": { 982 | "version": "3.0.4", 983 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 984 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 985 | "dev": true, 986 | "dependencies": { 987 | "brace-expansion": "^1.1.7" 988 | }, 989 | "engines": { 990 | "node": "*" 991 | } 992 | }, 993 | "node_modules/mocha": { 994 | "version": "9.2.1", 995 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.1.tgz", 996 | "integrity": "sha512-T7uscqjJVS46Pq1XDXyo9Uvey9gd3huT/DD9cYBb4K2Xc/vbKRPUWK067bxDQRK0yIz6Jxk73IrnimvASzBNAQ==", 997 | "dev": true, 998 | "dependencies": { 999 | "@ungap/promise-all-settled": "1.1.2", 1000 | "ansi-colors": "4.1.1", 1001 | "browser-stdout": "1.3.1", 1002 | "chokidar": "3.5.3", 1003 | "debug": "4.3.3", 1004 | "diff": "5.0.0", 1005 | "escape-string-regexp": "4.0.0", 1006 | "find-up": "5.0.0", 1007 | "glob": "7.2.0", 1008 | "growl": "1.10.5", 1009 | "he": "1.2.0", 1010 | "js-yaml": "4.1.0", 1011 | "log-symbols": "4.1.0", 1012 | "minimatch": "3.0.4", 1013 | "ms": "2.1.3", 1014 | "nanoid": "3.2.0", 1015 | "serialize-javascript": "6.0.0", 1016 | "strip-json-comments": "3.1.1", 1017 | "supports-color": "8.1.1", 1018 | "which": "2.0.2", 1019 | "workerpool": "6.2.0", 1020 | "yargs": "16.2.0", 1021 | "yargs-parser": "20.2.4", 1022 | "yargs-unparser": "2.0.0" 1023 | }, 1024 | "bin": { 1025 | "_mocha": "bin/_mocha", 1026 | "mocha": "bin/mocha" 1027 | }, 1028 | "engines": { 1029 | "node": ">= 12.0.0" 1030 | }, 1031 | "funding": { 1032 | "type": "opencollective", 1033 | "url": "https://opencollective.com/mochajs" 1034 | } 1035 | }, 1036 | "node_modules/mocha/node_modules/debug": { 1037 | "version": "4.3.3", 1038 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 1039 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 1040 | "dev": true, 1041 | "dependencies": { 1042 | "ms": "2.1.2" 1043 | }, 1044 | "engines": { 1045 | "node": ">=6.0" 1046 | }, 1047 | "peerDependenciesMeta": { 1048 | "supports-color": { 1049 | "optional": true 1050 | } 1051 | } 1052 | }, 1053 | "node_modules/mocha/node_modules/debug/node_modules/ms": { 1054 | "version": "2.1.2", 1055 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1056 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1057 | "dev": true 1058 | }, 1059 | "node_modules/mocha/node_modules/ms": { 1060 | "version": "2.1.3", 1061 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1062 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1063 | "dev": true 1064 | }, 1065 | "node_modules/mongodb": { 1066 | "version": "3.7.3", 1067 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", 1068 | "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", 1069 | "dependencies": { 1070 | "bl": "^2.2.1", 1071 | "bson": "^1.1.4", 1072 | "denque": "^1.4.1", 1073 | "optional-require": "^1.1.8", 1074 | "safe-buffer": "^5.1.2" 1075 | }, 1076 | "engines": { 1077 | "node": ">=4" 1078 | }, 1079 | "optionalDependencies": { 1080 | "saslprep": "^1.0.0" 1081 | }, 1082 | "peerDependenciesMeta": { 1083 | "aws4": { 1084 | "optional": true 1085 | }, 1086 | "bson-ext": { 1087 | "optional": true 1088 | }, 1089 | "kerberos": { 1090 | "optional": true 1091 | }, 1092 | "mongodb-client-encryption": { 1093 | "optional": true 1094 | }, 1095 | "mongodb-extjson": { 1096 | "optional": true 1097 | }, 1098 | "snappy": { 1099 | "optional": true 1100 | } 1101 | } 1102 | }, 1103 | "node_modules/mongodb/node_modules/optional-require": { 1104 | "version": "1.1.8", 1105 | "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", 1106 | "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", 1107 | "dependencies": { 1108 | "require-at": "^1.0.6" 1109 | }, 1110 | "engines": { 1111 | "node": ">=4" 1112 | } 1113 | }, 1114 | "node_modules/mongoose": { 1115 | "version": "5.13.15", 1116 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.15.tgz", 1117 | "integrity": "sha512-cxp1Gbb8yUWkaEbajdhspSaKzAvsIvOtRlYD87GN/P2QEUhpd6bIvebi36T6M0tIVAMauNaK9SPA055N3PwF8Q==", 1118 | "dependencies": { 1119 | "@types/bson": "1.x || 4.0.x", 1120 | "@types/mongodb": "^3.5.27", 1121 | "bson": "^1.1.4", 1122 | "kareem": "2.3.2", 1123 | "mongodb": "3.7.3", 1124 | "mongoose-legacy-pluralize": "1.0.2", 1125 | "mpath": "0.8.4", 1126 | "mquery": "3.2.5", 1127 | "ms": "2.1.2", 1128 | "optional-require": "1.0.x", 1129 | "regexp-clone": "1.0.0", 1130 | "safe-buffer": "5.2.1", 1131 | "sift": "13.5.2", 1132 | "sliced": "1.0.1" 1133 | }, 1134 | "engines": { 1135 | "node": ">=4.0.0" 1136 | }, 1137 | "funding": { 1138 | "type": "opencollective", 1139 | "url": "https://opencollective.com/mongoose" 1140 | } 1141 | }, 1142 | "node_modules/mongoose-legacy-pluralize": { 1143 | "version": "1.0.2", 1144 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 1145 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==", 1146 | "peerDependencies": { 1147 | "mongoose": "*" 1148 | } 1149 | }, 1150 | "node_modules/mongoose/node_modules/ms": { 1151 | "version": "2.1.2", 1152 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1153 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1154 | }, 1155 | "node_modules/mongoose/node_modules/safe-buffer": { 1156 | "version": "5.2.1", 1157 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1158 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1159 | "funding": [ 1160 | { 1161 | "type": "github", 1162 | "url": "https://github.com/sponsors/feross" 1163 | }, 1164 | { 1165 | "type": "patreon", 1166 | "url": "https://www.patreon.com/feross" 1167 | }, 1168 | { 1169 | "type": "consulting", 1170 | "url": "https://feross.org/support" 1171 | } 1172 | ] 1173 | }, 1174 | "node_modules/mpath": { 1175 | "version": "0.8.4", 1176 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", 1177 | "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==", 1178 | "engines": { 1179 | "node": ">=4.0.0" 1180 | } 1181 | }, 1182 | "node_modules/mquery": { 1183 | "version": "3.2.5", 1184 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", 1185 | "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", 1186 | "dependencies": { 1187 | "bluebird": "3.5.1", 1188 | "debug": "3.1.0", 1189 | "regexp-clone": "^1.0.0", 1190 | "safe-buffer": "5.1.2", 1191 | "sliced": "1.0.1" 1192 | }, 1193 | "engines": { 1194 | "node": ">=4.0.0" 1195 | } 1196 | }, 1197 | "node_modules/mquery/node_modules/debug": { 1198 | "version": "3.1.0", 1199 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1200 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1201 | "dependencies": { 1202 | "ms": "2.0.0" 1203 | } 1204 | }, 1205 | "node_modules/ms": { 1206 | "version": "2.0.0", 1207 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1208 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1209 | }, 1210 | "node_modules/nanoid": { 1211 | "version": "3.2.0", 1212 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", 1213 | "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", 1214 | "dev": true, 1215 | "bin": { 1216 | "nanoid": "bin/nanoid.cjs" 1217 | }, 1218 | "engines": { 1219 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1220 | } 1221 | }, 1222 | "node_modules/negotiator": { 1223 | "version": "0.6.3", 1224 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1225 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1226 | "engines": { 1227 | "node": ">= 0.6" 1228 | } 1229 | }, 1230 | "node_modules/normalize-path": { 1231 | "version": "3.0.0", 1232 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1233 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1234 | "dev": true, 1235 | "engines": { 1236 | "node": ">=0.10.0" 1237 | } 1238 | }, 1239 | "node_modules/object-assign": { 1240 | "version": "4.1.1", 1241 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1242 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1243 | "engines": { 1244 | "node": ">=0.10.0" 1245 | } 1246 | }, 1247 | "node_modules/on-finished": { 1248 | "version": "2.3.0", 1249 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1250 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1251 | "dependencies": { 1252 | "ee-first": "1.1.1" 1253 | }, 1254 | "engines": { 1255 | "node": ">= 0.8" 1256 | } 1257 | }, 1258 | "node_modules/once": { 1259 | "version": "1.4.0", 1260 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1261 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1262 | "dev": true, 1263 | "dependencies": { 1264 | "wrappy": "1" 1265 | } 1266 | }, 1267 | "node_modules/optional-require": { 1268 | "version": "1.0.3", 1269 | "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", 1270 | "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==", 1271 | "engines": { 1272 | "node": ">=4" 1273 | } 1274 | }, 1275 | "node_modules/p-limit": { 1276 | "version": "3.1.0", 1277 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1278 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1279 | "dev": true, 1280 | "dependencies": { 1281 | "yocto-queue": "^0.1.0" 1282 | }, 1283 | "engines": { 1284 | "node": ">=10" 1285 | }, 1286 | "funding": { 1287 | "url": "https://github.com/sponsors/sindresorhus" 1288 | } 1289 | }, 1290 | "node_modules/p-locate": { 1291 | "version": "5.0.0", 1292 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1293 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1294 | "dev": true, 1295 | "dependencies": { 1296 | "p-limit": "^3.0.2" 1297 | }, 1298 | "engines": { 1299 | "node": ">=10" 1300 | }, 1301 | "funding": { 1302 | "url": "https://github.com/sponsors/sindresorhus" 1303 | } 1304 | }, 1305 | "node_modules/parseurl": { 1306 | "version": "1.3.3", 1307 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1308 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1309 | "engines": { 1310 | "node": ">= 0.8" 1311 | } 1312 | }, 1313 | "node_modules/path-exists": { 1314 | "version": "4.0.0", 1315 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1316 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1317 | "dev": true, 1318 | "engines": { 1319 | "node": ">=8" 1320 | } 1321 | }, 1322 | "node_modules/path-is-absolute": { 1323 | "version": "1.0.1", 1324 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1325 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1326 | "dev": true, 1327 | "engines": { 1328 | "node": ">=0.10.0" 1329 | } 1330 | }, 1331 | "node_modules/path-to-regexp": { 1332 | "version": "0.1.7", 1333 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1334 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1335 | }, 1336 | "node_modules/picomatch": { 1337 | "version": "2.3.1", 1338 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1339 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1340 | "dev": true, 1341 | "engines": { 1342 | "node": ">=8.6" 1343 | }, 1344 | "funding": { 1345 | "url": "https://github.com/sponsors/jonschlinkert" 1346 | } 1347 | }, 1348 | "node_modules/process-nextick-args": { 1349 | "version": "2.0.1", 1350 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1351 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1352 | }, 1353 | "node_modules/proxy-addr": { 1354 | "version": "2.0.7", 1355 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1356 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1357 | "dependencies": { 1358 | "forwarded": "0.2.0", 1359 | "ipaddr.js": "1.9.1" 1360 | }, 1361 | "engines": { 1362 | "node": ">= 0.10" 1363 | } 1364 | }, 1365 | "node_modules/qs": { 1366 | "version": "6.9.7", 1367 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", 1368 | "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", 1369 | "engines": { 1370 | "node": ">=0.6" 1371 | }, 1372 | "funding": { 1373 | "url": "https://github.com/sponsors/ljharb" 1374 | } 1375 | }, 1376 | "node_modules/randombytes": { 1377 | "version": "2.1.0", 1378 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1379 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1380 | "dev": true, 1381 | "dependencies": { 1382 | "safe-buffer": "^5.1.0" 1383 | } 1384 | }, 1385 | "node_modules/range_check": { 1386 | "version": "1.4.0", 1387 | "resolved": "https://registry.npmjs.org/range_check/-/range_check-1.4.0.tgz", 1388 | "integrity": "sha1-zYfHrGLEC6nfabhwPGBPYMN0hjU=", 1389 | "dependencies": { 1390 | "ip6": "0.0.4", 1391 | "ipaddr.js": "1.2" 1392 | } 1393 | }, 1394 | "node_modules/range_check/node_modules/ipaddr.js": { 1395 | "version": "1.2.0", 1396 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.2.0.tgz", 1397 | "integrity": "sha1-irpJyRknmVhb3WQ+DMtQ6K53e6Q=", 1398 | "engines": { 1399 | "node": ">= 0.10" 1400 | } 1401 | }, 1402 | "node_modules/range-parser": { 1403 | "version": "1.2.1", 1404 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1405 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1406 | "engines": { 1407 | "node": ">= 0.6" 1408 | } 1409 | }, 1410 | "node_modules/raw-body": { 1411 | "version": "2.4.3", 1412 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", 1413 | "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", 1414 | "dependencies": { 1415 | "bytes": "3.1.2", 1416 | "http-errors": "1.8.1", 1417 | "iconv-lite": "0.4.24", 1418 | "unpipe": "1.0.0" 1419 | }, 1420 | "engines": { 1421 | "node": ">= 0.8" 1422 | } 1423 | }, 1424 | "node_modules/readable-stream": { 1425 | "version": "2.3.7", 1426 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1427 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1428 | "dependencies": { 1429 | "core-util-is": "~1.0.0", 1430 | "inherits": "~2.0.3", 1431 | "isarray": "~1.0.0", 1432 | "process-nextick-args": "~2.0.0", 1433 | "safe-buffer": "~5.1.1", 1434 | "string_decoder": "~1.1.1", 1435 | "util-deprecate": "~1.0.1" 1436 | } 1437 | }, 1438 | "node_modules/readdirp": { 1439 | "version": "3.6.0", 1440 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1441 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1442 | "dev": true, 1443 | "dependencies": { 1444 | "picomatch": "^2.2.1" 1445 | }, 1446 | "engines": { 1447 | "node": ">=8.10.0" 1448 | } 1449 | }, 1450 | "node_modules/regexp-clone": { 1451 | "version": "1.0.0", 1452 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", 1453 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" 1454 | }, 1455 | "node_modules/require-at": { 1456 | "version": "1.0.6", 1457 | "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", 1458 | "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", 1459 | "engines": { 1460 | "node": ">=4" 1461 | } 1462 | }, 1463 | "node_modules/require-directory": { 1464 | "version": "2.1.1", 1465 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1466 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1467 | "dev": true, 1468 | "engines": { 1469 | "node": ">=0.10.0" 1470 | } 1471 | }, 1472 | "node_modules/safe-buffer": { 1473 | "version": "5.1.2", 1474 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1475 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1476 | }, 1477 | "node_modules/safer-buffer": { 1478 | "version": "2.1.2", 1479 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1480 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1481 | }, 1482 | "node_modules/saslprep": { 1483 | "version": "1.0.3", 1484 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", 1485 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", 1486 | "optional": true, 1487 | "dependencies": { 1488 | "sparse-bitfield": "^3.0.3" 1489 | }, 1490 | "engines": { 1491 | "node": ">=6" 1492 | } 1493 | }, 1494 | "node_modules/send": { 1495 | "version": "0.17.2", 1496 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", 1497 | "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", 1498 | "dependencies": { 1499 | "debug": "2.6.9", 1500 | "depd": "~1.1.2", 1501 | "destroy": "~1.0.4", 1502 | "encodeurl": "~1.0.2", 1503 | "escape-html": "~1.0.3", 1504 | "etag": "~1.8.1", 1505 | "fresh": "0.5.2", 1506 | "http-errors": "1.8.1", 1507 | "mime": "1.6.0", 1508 | "ms": "2.1.3", 1509 | "on-finished": "~2.3.0", 1510 | "range-parser": "~1.2.1", 1511 | "statuses": "~1.5.0" 1512 | }, 1513 | "engines": { 1514 | "node": ">= 0.8.0" 1515 | } 1516 | }, 1517 | "node_modules/send/node_modules/ms": { 1518 | "version": "2.1.3", 1519 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1520 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1521 | }, 1522 | "node_modules/serialize-javascript": { 1523 | "version": "6.0.0", 1524 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 1525 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 1526 | "dev": true, 1527 | "dependencies": { 1528 | "randombytes": "^2.1.0" 1529 | } 1530 | }, 1531 | "node_modules/serve-static": { 1532 | "version": "1.14.2", 1533 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", 1534 | "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", 1535 | "dependencies": { 1536 | "encodeurl": "~1.0.2", 1537 | "escape-html": "~1.0.3", 1538 | "parseurl": "~1.3.3", 1539 | "send": "0.17.2" 1540 | }, 1541 | "engines": { 1542 | "node": ">= 0.8.0" 1543 | } 1544 | }, 1545 | "node_modules/setprototypeof": { 1546 | "version": "1.2.0", 1547 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1548 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1549 | }, 1550 | "node_modules/sift": { 1551 | "version": "13.5.2", 1552 | "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", 1553 | "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" 1554 | }, 1555 | "node_modules/sliced": { 1556 | "version": "1.0.1", 1557 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 1558 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 1559 | }, 1560 | "node_modules/sparse-bitfield": { 1561 | "version": "3.0.3", 1562 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1563 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 1564 | "optional": true, 1565 | "dependencies": { 1566 | "memory-pager": "^1.0.2" 1567 | } 1568 | }, 1569 | "node_modules/statuses": { 1570 | "version": "1.5.0", 1571 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1572 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 1573 | "engines": { 1574 | "node": ">= 0.6" 1575 | } 1576 | }, 1577 | "node_modules/string_decoder": { 1578 | "version": "1.1.1", 1579 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1580 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1581 | "dependencies": { 1582 | "safe-buffer": "~5.1.0" 1583 | } 1584 | }, 1585 | "node_modules/string-width": { 1586 | "version": "4.2.3", 1587 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1588 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1589 | "dev": true, 1590 | "dependencies": { 1591 | "emoji-regex": "^8.0.0", 1592 | "is-fullwidth-code-point": "^3.0.0", 1593 | "strip-ansi": "^6.0.1" 1594 | }, 1595 | "engines": { 1596 | "node": ">=8" 1597 | } 1598 | }, 1599 | "node_modules/strip-ansi": { 1600 | "version": "6.0.1", 1601 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1602 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1603 | "dev": true, 1604 | "dependencies": { 1605 | "ansi-regex": "^5.0.1" 1606 | }, 1607 | "engines": { 1608 | "node": ">=8" 1609 | } 1610 | }, 1611 | "node_modules/strip-json-comments": { 1612 | "version": "3.1.1", 1613 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1614 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1615 | "dev": true, 1616 | "engines": { 1617 | "node": ">=8" 1618 | }, 1619 | "funding": { 1620 | "url": "https://github.com/sponsors/sindresorhus" 1621 | } 1622 | }, 1623 | "node_modules/supports-color": { 1624 | "version": "8.1.1", 1625 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1626 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1627 | "dev": true, 1628 | "dependencies": { 1629 | "has-flag": "^4.0.0" 1630 | }, 1631 | "engines": { 1632 | "node": ">=10" 1633 | }, 1634 | "funding": { 1635 | "url": "https://github.com/chalk/supports-color?sponsor=1" 1636 | } 1637 | }, 1638 | "node_modules/to-regex-range": { 1639 | "version": "5.0.1", 1640 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1641 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1642 | "dev": true, 1643 | "dependencies": { 1644 | "is-number": "^7.0.0" 1645 | }, 1646 | "engines": { 1647 | "node": ">=8.0" 1648 | } 1649 | }, 1650 | "node_modules/toidentifier": { 1651 | "version": "1.0.1", 1652 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1653 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1654 | "engines": { 1655 | "node": ">=0.6" 1656 | } 1657 | }, 1658 | "node_modules/type-is": { 1659 | "version": "1.6.18", 1660 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1661 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1662 | "dependencies": { 1663 | "media-typer": "0.3.0", 1664 | "mime-types": "~2.1.24" 1665 | }, 1666 | "engines": { 1667 | "node": ">= 0.6" 1668 | } 1669 | }, 1670 | "node_modules/unpipe": { 1671 | "version": "1.0.0", 1672 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1673 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 1674 | "engines": { 1675 | "node": ">= 0.8" 1676 | } 1677 | }, 1678 | "node_modules/util-deprecate": { 1679 | "version": "1.0.2", 1680 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1681 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1682 | }, 1683 | "node_modules/utils-merge": { 1684 | "version": "1.0.1", 1685 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1686 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 1687 | "engines": { 1688 | "node": ">= 0.4.0" 1689 | } 1690 | }, 1691 | "node_modules/vary": { 1692 | "version": "1.1.2", 1693 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1694 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 1695 | "engines": { 1696 | "node": ">= 0.8" 1697 | } 1698 | }, 1699 | "node_modules/which": { 1700 | "version": "2.0.2", 1701 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1702 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1703 | "dev": true, 1704 | "dependencies": { 1705 | "isexe": "^2.0.0" 1706 | }, 1707 | "bin": { 1708 | "node-which": "bin/node-which" 1709 | }, 1710 | "engines": { 1711 | "node": ">= 8" 1712 | } 1713 | }, 1714 | "node_modules/workerpool": { 1715 | "version": "6.2.0", 1716 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", 1717 | "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", 1718 | "dev": true 1719 | }, 1720 | "node_modules/wrap-ansi": { 1721 | "version": "7.0.0", 1722 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1723 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1724 | "dev": true, 1725 | "dependencies": { 1726 | "ansi-styles": "^4.0.0", 1727 | "string-width": "^4.1.0", 1728 | "strip-ansi": "^6.0.0" 1729 | }, 1730 | "engines": { 1731 | "node": ">=10" 1732 | }, 1733 | "funding": { 1734 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1735 | } 1736 | }, 1737 | "node_modules/wrappy": { 1738 | "version": "1.0.2", 1739 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1740 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1741 | "dev": true 1742 | }, 1743 | "node_modules/y18n": { 1744 | "version": "5.0.8", 1745 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1746 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1747 | "dev": true, 1748 | "engines": { 1749 | "node": ">=10" 1750 | } 1751 | }, 1752 | "node_modules/yargs": { 1753 | "version": "16.2.0", 1754 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1755 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1756 | "dev": true, 1757 | "dependencies": { 1758 | "cliui": "^7.0.2", 1759 | "escalade": "^3.1.1", 1760 | "get-caller-file": "^2.0.5", 1761 | "require-directory": "^2.1.1", 1762 | "string-width": "^4.2.0", 1763 | "y18n": "^5.0.5", 1764 | "yargs-parser": "^20.2.2" 1765 | }, 1766 | "engines": { 1767 | "node": ">=10" 1768 | } 1769 | }, 1770 | "node_modules/yargs-parser": { 1771 | "version": "20.2.4", 1772 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 1773 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 1774 | "dev": true, 1775 | "engines": { 1776 | "node": ">=10" 1777 | } 1778 | }, 1779 | "node_modules/yargs-unparser": { 1780 | "version": "2.0.0", 1781 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 1782 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1783 | "dev": true, 1784 | "dependencies": { 1785 | "camelcase": "^6.0.0", 1786 | "decamelize": "^4.0.0", 1787 | "flat": "^5.0.2", 1788 | "is-plain-obj": "^2.1.0" 1789 | }, 1790 | "engines": { 1791 | "node": ">=10" 1792 | } 1793 | }, 1794 | "node_modules/yocto-queue": { 1795 | "version": "0.1.0", 1796 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1797 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1798 | "dev": true, 1799 | "engines": { 1800 | "node": ">=10" 1801 | }, 1802 | "funding": { 1803 | "url": "https://github.com/sponsors/sindresorhus" 1804 | } 1805 | } 1806 | }, 1807 | "dependencies": { 1808 | "@types/bson": { 1809 | "version": "4.0.3", 1810 | "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", 1811 | "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", 1812 | "requires": { 1813 | "@types/node": "*" 1814 | } 1815 | }, 1816 | "@types/mongodb": { 1817 | "version": "3.6.17", 1818 | "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.17.tgz", 1819 | "integrity": "sha512-9hhgvYPdC5iHyyksPcKCu45gfaAIPQHKHGdvNXu4582DmOZX3wrUJIJPT40o4G1oTKPgpMMFqZglOTjhnYoF+A==", 1820 | "requires": { 1821 | "@types/bson": "*", 1822 | "@types/node": "*" 1823 | } 1824 | }, 1825 | "@types/node": { 1826 | "version": "15.6.1", 1827 | "resolved": "https://registry.npmjs.org/@types/node/-/node-15.6.1.tgz", 1828 | "integrity": "sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA==" 1829 | }, 1830 | "@ungap/promise-all-settled": { 1831 | "version": "1.1.2", 1832 | "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", 1833 | "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", 1834 | "dev": true 1835 | }, 1836 | "accepts": { 1837 | "version": "1.3.8", 1838 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 1839 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 1840 | "requires": { 1841 | "mime-types": "~2.1.34", 1842 | "negotiator": "0.6.3" 1843 | } 1844 | }, 1845 | "ansi-colors": { 1846 | "version": "4.1.1", 1847 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 1848 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 1849 | "dev": true 1850 | }, 1851 | "ansi-regex": { 1852 | "version": "5.0.1", 1853 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1854 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1855 | "dev": true 1856 | }, 1857 | "ansi-styles": { 1858 | "version": "4.3.0", 1859 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1860 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1861 | "dev": true, 1862 | "requires": { 1863 | "color-convert": "^2.0.1" 1864 | } 1865 | }, 1866 | "anymatch": { 1867 | "version": "3.1.2", 1868 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 1869 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 1870 | "dev": true, 1871 | "requires": { 1872 | "normalize-path": "^3.0.0", 1873 | "picomatch": "^2.0.4" 1874 | } 1875 | }, 1876 | "argparse": { 1877 | "version": "2.0.1", 1878 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1879 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1880 | "dev": true 1881 | }, 1882 | "array-flatten": { 1883 | "version": "1.1.1", 1884 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 1885 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 1886 | }, 1887 | "balanced-match": { 1888 | "version": "1.0.2", 1889 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1890 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1891 | "dev": true 1892 | }, 1893 | "binary-extensions": { 1894 | "version": "2.2.0", 1895 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1896 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1897 | "dev": true 1898 | }, 1899 | "bl": { 1900 | "version": "2.2.1", 1901 | "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", 1902 | "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", 1903 | "requires": { 1904 | "readable-stream": "^2.3.5", 1905 | "safe-buffer": "^5.1.1" 1906 | } 1907 | }, 1908 | "bluebird": { 1909 | "version": "3.5.1", 1910 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 1911 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 1912 | }, 1913 | "body-parser": { 1914 | "version": "1.19.2", 1915 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", 1916 | "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", 1917 | "requires": { 1918 | "bytes": "3.1.2", 1919 | "content-type": "~1.0.4", 1920 | "debug": "2.6.9", 1921 | "depd": "~1.1.2", 1922 | "http-errors": "1.8.1", 1923 | "iconv-lite": "0.4.24", 1924 | "on-finished": "~2.3.0", 1925 | "qs": "6.9.7", 1926 | "raw-body": "2.4.3", 1927 | "type-is": "~1.6.18" 1928 | } 1929 | }, 1930 | "brace-expansion": { 1931 | "version": "1.1.11", 1932 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1933 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1934 | "dev": true, 1935 | "requires": { 1936 | "balanced-match": "^1.0.0", 1937 | "concat-map": "0.0.1" 1938 | } 1939 | }, 1940 | "braces": { 1941 | "version": "3.0.2", 1942 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1943 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1944 | "dev": true, 1945 | "requires": { 1946 | "fill-range": "^7.0.1" 1947 | } 1948 | }, 1949 | "browser-stdout": { 1950 | "version": "1.3.1", 1951 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 1952 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 1953 | "dev": true 1954 | }, 1955 | "bson": { 1956 | "version": "1.1.6", 1957 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", 1958 | "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" 1959 | }, 1960 | "bytes": { 1961 | "version": "3.1.2", 1962 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 1963 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 1964 | }, 1965 | "camelcase": { 1966 | "version": "6.3.0", 1967 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 1968 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 1969 | "dev": true 1970 | }, 1971 | "chalk": { 1972 | "version": "4.1.2", 1973 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1974 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1975 | "dev": true, 1976 | "requires": { 1977 | "ansi-styles": "^4.1.0", 1978 | "supports-color": "^7.1.0" 1979 | }, 1980 | "dependencies": { 1981 | "supports-color": { 1982 | "version": "7.2.0", 1983 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1984 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1985 | "dev": true, 1986 | "requires": { 1987 | "has-flag": "^4.0.0" 1988 | } 1989 | } 1990 | } 1991 | }, 1992 | "chokidar": { 1993 | "version": "3.5.3", 1994 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1995 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1996 | "dev": true, 1997 | "requires": { 1998 | "anymatch": "~3.1.2", 1999 | "braces": "~3.0.2", 2000 | "fsevents": "~2.3.2", 2001 | "glob-parent": "~5.1.2", 2002 | "is-binary-path": "~2.1.0", 2003 | "is-glob": "~4.0.1", 2004 | "normalize-path": "~3.0.0", 2005 | "readdirp": "~3.6.0" 2006 | } 2007 | }, 2008 | "cliui": { 2009 | "version": "7.0.4", 2010 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 2011 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 2012 | "dev": true, 2013 | "requires": { 2014 | "string-width": "^4.2.0", 2015 | "strip-ansi": "^6.0.0", 2016 | "wrap-ansi": "^7.0.0" 2017 | } 2018 | }, 2019 | "color-convert": { 2020 | "version": "2.0.1", 2021 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2022 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2023 | "dev": true, 2024 | "requires": { 2025 | "color-name": "~1.1.4" 2026 | } 2027 | }, 2028 | "color-name": { 2029 | "version": "1.1.4", 2030 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2031 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2032 | "dev": true 2033 | }, 2034 | "concat-map": { 2035 | "version": "0.0.1", 2036 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2037 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 2038 | "dev": true 2039 | }, 2040 | "content-disposition": { 2041 | "version": "0.5.4", 2042 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 2043 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 2044 | "requires": { 2045 | "safe-buffer": "5.2.1" 2046 | }, 2047 | "dependencies": { 2048 | "safe-buffer": { 2049 | "version": "5.2.1", 2050 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2051 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2052 | } 2053 | } 2054 | }, 2055 | "content-type": { 2056 | "version": "1.0.4", 2057 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 2058 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 2059 | }, 2060 | "cookie": { 2061 | "version": "0.4.2", 2062 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", 2063 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" 2064 | }, 2065 | "cookie-signature": { 2066 | "version": "1.0.6", 2067 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 2068 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 2069 | }, 2070 | "core-util-is": { 2071 | "version": "1.0.3", 2072 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 2073 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" 2074 | }, 2075 | "cors": { 2076 | "version": "2.8.5", 2077 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 2078 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 2079 | "requires": { 2080 | "object-assign": "^4", 2081 | "vary": "^1" 2082 | } 2083 | }, 2084 | "debug": { 2085 | "version": "2.6.9", 2086 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2087 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2088 | "requires": { 2089 | "ms": "2.0.0" 2090 | } 2091 | }, 2092 | "decamelize": { 2093 | "version": "4.0.0", 2094 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 2095 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 2096 | "dev": true 2097 | }, 2098 | "denque": { 2099 | "version": "1.5.1", 2100 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", 2101 | "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" 2102 | }, 2103 | "depd": { 2104 | "version": "1.1.2", 2105 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 2106 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 2107 | }, 2108 | "destroy": { 2109 | "version": "1.0.4", 2110 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 2111 | "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" 2112 | }, 2113 | "diff": { 2114 | "version": "5.0.0", 2115 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 2116 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 2117 | "dev": true 2118 | }, 2119 | "ee-first": { 2120 | "version": "1.1.1", 2121 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 2122 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 2123 | }, 2124 | "emoji-regex": { 2125 | "version": "8.0.0", 2126 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2127 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2128 | "dev": true 2129 | }, 2130 | "encodeurl": { 2131 | "version": "1.0.2", 2132 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 2133 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 2134 | }, 2135 | "escalade": { 2136 | "version": "3.1.1", 2137 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 2138 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 2139 | "dev": true 2140 | }, 2141 | "escape-html": { 2142 | "version": "1.0.3", 2143 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 2144 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 2145 | }, 2146 | "escape-string-regexp": { 2147 | "version": "4.0.0", 2148 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 2149 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 2150 | "dev": true 2151 | }, 2152 | "etag": { 2153 | "version": "1.8.1", 2154 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 2155 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 2156 | }, 2157 | "express": { 2158 | "version": "4.17.3", 2159 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", 2160 | "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", 2161 | "requires": { 2162 | "accepts": "~1.3.8", 2163 | "array-flatten": "1.1.1", 2164 | "body-parser": "1.19.2", 2165 | "content-disposition": "0.5.4", 2166 | "content-type": "~1.0.4", 2167 | "cookie": "0.4.2", 2168 | "cookie-signature": "1.0.6", 2169 | "debug": "2.6.9", 2170 | "depd": "~1.1.2", 2171 | "encodeurl": "~1.0.2", 2172 | "escape-html": "~1.0.3", 2173 | "etag": "~1.8.1", 2174 | "finalhandler": "~1.1.2", 2175 | "fresh": "0.5.2", 2176 | "merge-descriptors": "1.0.1", 2177 | "methods": "~1.1.2", 2178 | "on-finished": "~2.3.0", 2179 | "parseurl": "~1.3.3", 2180 | "path-to-regexp": "0.1.7", 2181 | "proxy-addr": "~2.0.7", 2182 | "qs": "6.9.7", 2183 | "range-parser": "~1.2.1", 2184 | "safe-buffer": "5.2.1", 2185 | "send": "0.17.2", 2186 | "serve-static": "1.14.2", 2187 | "setprototypeof": "1.2.0", 2188 | "statuses": "~1.5.0", 2189 | "type-is": "~1.6.18", 2190 | "utils-merge": "1.0.1", 2191 | "vary": "~1.1.2" 2192 | }, 2193 | "dependencies": { 2194 | "safe-buffer": { 2195 | "version": "5.2.1", 2196 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2197 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2198 | } 2199 | } 2200 | }, 2201 | "express-ipfilter": { 2202 | "version": "1.1.2", 2203 | "resolved": "https://registry.npmjs.org/express-ipfilter/-/express-ipfilter-1.1.2.tgz", 2204 | "integrity": "sha512-dm1G3sVxlSbcOWSxfUTCo20ySyNQXJ4hJD5fuQJFoZlhkQvpbuDGBlh8AbFm1GwX85EWvfyhekOkvcydaXkBkg==", 2205 | "requires": { 2206 | "ip": "~1.1.0", 2207 | "lodash": "^4.17.11", 2208 | "proxy-addr": "^2.0.4", 2209 | "range_check": "^1.2.0" 2210 | } 2211 | }, 2212 | "express-rate-limit": { 2213 | "version": "5.1.1", 2214 | "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.1.1.tgz", 2215 | "integrity": "sha512-puA1zcCx/quwWUOU6pT6daCt6t7SweD9wKChKhb+KSgFMKRwS81C224hiSAUANw/gnSHiwEhgozM/2ezEBZPeA==" 2216 | }, 2217 | "fetch-lite": { 2218 | "version": "1.1.0", 2219 | "resolved": "https://registry.npmjs.org/fetch-lite/-/fetch-lite-1.1.0.tgz", 2220 | "integrity": "sha1-E7rOtbO3mJ7GSEXj0IodFTkiPj8=", 2221 | "dev": true 2222 | }, 2223 | "fill-range": { 2224 | "version": "7.0.1", 2225 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 2226 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 2227 | "dev": true, 2228 | "requires": { 2229 | "to-regex-range": "^5.0.1" 2230 | } 2231 | }, 2232 | "finalhandler": { 2233 | "version": "1.1.2", 2234 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 2235 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 2236 | "requires": { 2237 | "debug": "2.6.9", 2238 | "encodeurl": "~1.0.2", 2239 | "escape-html": "~1.0.3", 2240 | "on-finished": "~2.3.0", 2241 | "parseurl": "~1.3.3", 2242 | "statuses": "~1.5.0", 2243 | "unpipe": "~1.0.0" 2244 | } 2245 | }, 2246 | "find-up": { 2247 | "version": "5.0.0", 2248 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 2249 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 2250 | "dev": true, 2251 | "requires": { 2252 | "locate-path": "^6.0.0", 2253 | "path-exists": "^4.0.0" 2254 | } 2255 | }, 2256 | "flat": { 2257 | "version": "5.0.2", 2258 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 2259 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 2260 | "dev": true 2261 | }, 2262 | "forwarded": { 2263 | "version": "0.2.0", 2264 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 2265 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 2266 | }, 2267 | "fresh": { 2268 | "version": "0.5.2", 2269 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 2270 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 2271 | }, 2272 | "fs.realpath": { 2273 | "version": "1.0.0", 2274 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2275 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 2276 | "dev": true 2277 | }, 2278 | "fsevents": { 2279 | "version": "2.3.2", 2280 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 2281 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 2282 | "dev": true, 2283 | "optional": true 2284 | }, 2285 | "get-caller-file": { 2286 | "version": "2.0.5", 2287 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 2288 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 2289 | "dev": true 2290 | }, 2291 | "glob": { 2292 | "version": "7.2.0", 2293 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 2294 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 2295 | "dev": true, 2296 | "requires": { 2297 | "fs.realpath": "^1.0.0", 2298 | "inflight": "^1.0.4", 2299 | "inherits": "2", 2300 | "minimatch": "^3.0.4", 2301 | "once": "^1.3.0", 2302 | "path-is-absolute": "^1.0.0" 2303 | } 2304 | }, 2305 | "glob-parent": { 2306 | "version": "5.1.2", 2307 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2308 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2309 | "dev": true, 2310 | "requires": { 2311 | "is-glob": "^4.0.1" 2312 | } 2313 | }, 2314 | "growl": { 2315 | "version": "1.10.5", 2316 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 2317 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 2318 | "dev": true 2319 | }, 2320 | "has-flag": { 2321 | "version": "4.0.0", 2322 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2323 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2324 | "dev": true 2325 | }, 2326 | "he": { 2327 | "version": "1.2.0", 2328 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 2329 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 2330 | "dev": true 2331 | }, 2332 | "http-errors": { 2333 | "version": "1.8.1", 2334 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", 2335 | "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", 2336 | "requires": { 2337 | "depd": "~1.1.2", 2338 | "inherits": "2.0.4", 2339 | "setprototypeof": "1.2.0", 2340 | "statuses": ">= 1.5.0 < 2", 2341 | "toidentifier": "1.0.1" 2342 | } 2343 | }, 2344 | "iconv-lite": { 2345 | "version": "0.4.24", 2346 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 2347 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 2348 | "requires": { 2349 | "safer-buffer": ">= 2.1.2 < 3" 2350 | } 2351 | }, 2352 | "inflight": { 2353 | "version": "1.0.6", 2354 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2355 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 2356 | "dev": true, 2357 | "requires": { 2358 | "once": "^1.3.0", 2359 | "wrappy": "1" 2360 | } 2361 | }, 2362 | "inherits": { 2363 | "version": "2.0.4", 2364 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2365 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 2366 | }, 2367 | "ip": { 2368 | "version": "1.1.5", 2369 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", 2370 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" 2371 | }, 2372 | "ip6": { 2373 | "version": "0.0.4", 2374 | "resolved": "https://registry.npmjs.org/ip6/-/ip6-0.0.4.tgz", 2375 | "integrity": "sha1-RMWp23njnUBSAbTXjROzhw5I2zE=" 2376 | }, 2377 | "ipaddr.js": { 2378 | "version": "1.9.1", 2379 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 2380 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 2381 | }, 2382 | "is-binary-path": { 2383 | "version": "2.1.0", 2384 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2385 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2386 | "dev": true, 2387 | "requires": { 2388 | "binary-extensions": "^2.0.0" 2389 | } 2390 | }, 2391 | "is-extglob": { 2392 | "version": "2.1.1", 2393 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2394 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 2395 | "dev": true 2396 | }, 2397 | "is-fullwidth-code-point": { 2398 | "version": "3.0.0", 2399 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2400 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2401 | "dev": true 2402 | }, 2403 | "is-glob": { 2404 | "version": "4.0.3", 2405 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2406 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2407 | "dev": true, 2408 | "requires": { 2409 | "is-extglob": "^2.1.1" 2410 | } 2411 | }, 2412 | "is-number": { 2413 | "version": "7.0.0", 2414 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2415 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2416 | "dev": true 2417 | }, 2418 | "is-plain-obj": { 2419 | "version": "2.1.0", 2420 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 2421 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 2422 | "dev": true 2423 | }, 2424 | "is-unicode-supported": { 2425 | "version": "0.1.0", 2426 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 2427 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 2428 | "dev": true 2429 | }, 2430 | "isarray": { 2431 | "version": "1.0.0", 2432 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2433 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 2434 | }, 2435 | "isexe": { 2436 | "version": "2.0.0", 2437 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2438 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 2439 | "dev": true 2440 | }, 2441 | "js-yaml": { 2442 | "version": "4.1.0", 2443 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2444 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2445 | "dev": true, 2446 | "requires": { 2447 | "argparse": "^2.0.1" 2448 | } 2449 | }, 2450 | "kareem": { 2451 | "version": "2.3.2", 2452 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", 2453 | "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" 2454 | }, 2455 | "locate-path": { 2456 | "version": "6.0.0", 2457 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2458 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2459 | "dev": true, 2460 | "requires": { 2461 | "p-locate": "^5.0.0" 2462 | } 2463 | }, 2464 | "lodash": { 2465 | "version": "4.17.21", 2466 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2467 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 2468 | }, 2469 | "log-symbols": { 2470 | "version": "4.1.0", 2471 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 2472 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 2473 | "dev": true, 2474 | "requires": { 2475 | "chalk": "^4.1.0", 2476 | "is-unicode-supported": "^0.1.0" 2477 | } 2478 | }, 2479 | "media-typer": { 2480 | "version": "0.3.0", 2481 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2482 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 2483 | }, 2484 | "memory-pager": { 2485 | "version": "1.5.0", 2486 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 2487 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 2488 | "optional": true 2489 | }, 2490 | "merge-descriptors": { 2491 | "version": "1.0.1", 2492 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 2493 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 2494 | }, 2495 | "methods": { 2496 | "version": "1.1.2", 2497 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2498 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 2499 | }, 2500 | "mime": { 2501 | "version": "1.6.0", 2502 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 2503 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 2504 | }, 2505 | "mime-db": { 2506 | "version": "1.52.0", 2507 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 2508 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 2509 | }, 2510 | "mime-types": { 2511 | "version": "2.1.35", 2512 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 2513 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 2514 | "requires": { 2515 | "mime-db": "1.52.0" 2516 | } 2517 | }, 2518 | "minimatch": { 2519 | "version": "3.0.4", 2520 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2521 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2522 | "dev": true, 2523 | "requires": { 2524 | "brace-expansion": "^1.1.7" 2525 | } 2526 | }, 2527 | "mocha": { 2528 | "version": "9.2.1", 2529 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.1.tgz", 2530 | "integrity": "sha512-T7uscqjJVS46Pq1XDXyo9Uvey9gd3huT/DD9cYBb4K2Xc/vbKRPUWK067bxDQRK0yIz6Jxk73IrnimvASzBNAQ==", 2531 | "dev": true, 2532 | "requires": { 2533 | "@ungap/promise-all-settled": "1.1.2", 2534 | "ansi-colors": "4.1.1", 2535 | "browser-stdout": "1.3.1", 2536 | "chokidar": "3.5.3", 2537 | "debug": "4.3.3", 2538 | "diff": "5.0.0", 2539 | "escape-string-regexp": "4.0.0", 2540 | "find-up": "5.0.0", 2541 | "glob": "7.2.0", 2542 | "growl": "1.10.5", 2543 | "he": "1.2.0", 2544 | "js-yaml": "4.1.0", 2545 | "log-symbols": "4.1.0", 2546 | "minimatch": "3.0.4", 2547 | "ms": "2.1.3", 2548 | "nanoid": "3.2.0", 2549 | "serialize-javascript": "6.0.0", 2550 | "strip-json-comments": "3.1.1", 2551 | "supports-color": "8.1.1", 2552 | "which": "2.0.2", 2553 | "workerpool": "6.2.0", 2554 | "yargs": "16.2.0", 2555 | "yargs-parser": "20.2.4", 2556 | "yargs-unparser": "2.0.0" 2557 | }, 2558 | "dependencies": { 2559 | "debug": { 2560 | "version": "4.3.3", 2561 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 2562 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 2563 | "dev": true, 2564 | "requires": { 2565 | "ms": "2.1.2" 2566 | }, 2567 | "dependencies": { 2568 | "ms": { 2569 | "version": "2.1.2", 2570 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2571 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2572 | "dev": true 2573 | } 2574 | } 2575 | }, 2576 | "ms": { 2577 | "version": "2.1.3", 2578 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2579 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2580 | "dev": true 2581 | } 2582 | } 2583 | }, 2584 | "mongodb": { 2585 | "version": "3.7.3", 2586 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", 2587 | "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", 2588 | "requires": { 2589 | "bl": "^2.2.1", 2590 | "bson": "^1.1.4", 2591 | "denque": "^1.4.1", 2592 | "optional-require": "^1.1.8", 2593 | "safe-buffer": "^5.1.2", 2594 | "saslprep": "^1.0.0" 2595 | }, 2596 | "dependencies": { 2597 | "optional-require": { 2598 | "version": "1.1.8", 2599 | "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", 2600 | "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", 2601 | "requires": { 2602 | "require-at": "^1.0.6" 2603 | } 2604 | } 2605 | } 2606 | }, 2607 | "mongoose": { 2608 | "version": "5.13.15", 2609 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.15.tgz", 2610 | "integrity": "sha512-cxp1Gbb8yUWkaEbajdhspSaKzAvsIvOtRlYD87GN/P2QEUhpd6bIvebi36T6M0tIVAMauNaK9SPA055N3PwF8Q==", 2611 | "requires": { 2612 | "@types/bson": "1.x || 4.0.x", 2613 | "@types/mongodb": "^3.5.27", 2614 | "bson": "^1.1.4", 2615 | "kareem": "2.3.2", 2616 | "mongodb": "3.7.3", 2617 | "mongoose-legacy-pluralize": "1.0.2", 2618 | "mpath": "0.8.4", 2619 | "mquery": "3.2.5", 2620 | "ms": "2.1.2", 2621 | "optional-require": "1.0.x", 2622 | "regexp-clone": "1.0.0", 2623 | "safe-buffer": "5.2.1", 2624 | "sift": "13.5.2", 2625 | "sliced": "1.0.1" 2626 | }, 2627 | "dependencies": { 2628 | "ms": { 2629 | "version": "2.1.2", 2630 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2631 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 2632 | }, 2633 | "safe-buffer": { 2634 | "version": "5.2.1", 2635 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2636 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2637 | } 2638 | } 2639 | }, 2640 | "mongoose-legacy-pluralize": { 2641 | "version": "1.0.2", 2642 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 2643 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==", 2644 | "requires": {} 2645 | }, 2646 | "mpath": { 2647 | "version": "0.8.4", 2648 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", 2649 | "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==" 2650 | }, 2651 | "mquery": { 2652 | "version": "3.2.5", 2653 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", 2654 | "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", 2655 | "requires": { 2656 | "bluebird": "3.5.1", 2657 | "debug": "3.1.0", 2658 | "regexp-clone": "^1.0.0", 2659 | "safe-buffer": "5.1.2", 2660 | "sliced": "1.0.1" 2661 | }, 2662 | "dependencies": { 2663 | "debug": { 2664 | "version": "3.1.0", 2665 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 2666 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 2667 | "requires": { 2668 | "ms": "2.0.0" 2669 | } 2670 | } 2671 | } 2672 | }, 2673 | "ms": { 2674 | "version": "2.0.0", 2675 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2676 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2677 | }, 2678 | "nanoid": { 2679 | "version": "3.2.0", 2680 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", 2681 | "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", 2682 | "dev": true 2683 | }, 2684 | "negotiator": { 2685 | "version": "0.6.3", 2686 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 2687 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 2688 | }, 2689 | "normalize-path": { 2690 | "version": "3.0.0", 2691 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2692 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2693 | "dev": true 2694 | }, 2695 | "object-assign": { 2696 | "version": "4.1.1", 2697 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2698 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 2699 | }, 2700 | "on-finished": { 2701 | "version": "2.3.0", 2702 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2703 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2704 | "requires": { 2705 | "ee-first": "1.1.1" 2706 | } 2707 | }, 2708 | "once": { 2709 | "version": "1.4.0", 2710 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2711 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2712 | "dev": true, 2713 | "requires": { 2714 | "wrappy": "1" 2715 | } 2716 | }, 2717 | "optional-require": { 2718 | "version": "1.0.3", 2719 | "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", 2720 | "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==" 2721 | }, 2722 | "p-limit": { 2723 | "version": "3.1.0", 2724 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2725 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2726 | "dev": true, 2727 | "requires": { 2728 | "yocto-queue": "^0.1.0" 2729 | } 2730 | }, 2731 | "p-locate": { 2732 | "version": "5.0.0", 2733 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2734 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2735 | "dev": true, 2736 | "requires": { 2737 | "p-limit": "^3.0.2" 2738 | } 2739 | }, 2740 | "parseurl": { 2741 | "version": "1.3.3", 2742 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 2743 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 2744 | }, 2745 | "path-exists": { 2746 | "version": "4.0.0", 2747 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2748 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2749 | "dev": true 2750 | }, 2751 | "path-is-absolute": { 2752 | "version": "1.0.1", 2753 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2754 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 2755 | "dev": true 2756 | }, 2757 | "path-to-regexp": { 2758 | "version": "0.1.7", 2759 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2760 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 2761 | }, 2762 | "picomatch": { 2763 | "version": "2.3.1", 2764 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2765 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2766 | "dev": true 2767 | }, 2768 | "process-nextick-args": { 2769 | "version": "2.0.1", 2770 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2771 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 2772 | }, 2773 | "proxy-addr": { 2774 | "version": "2.0.7", 2775 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 2776 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 2777 | "requires": { 2778 | "forwarded": "0.2.0", 2779 | "ipaddr.js": "1.9.1" 2780 | } 2781 | }, 2782 | "qs": { 2783 | "version": "6.9.7", 2784 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", 2785 | "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" 2786 | }, 2787 | "randombytes": { 2788 | "version": "2.1.0", 2789 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2790 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2791 | "dev": true, 2792 | "requires": { 2793 | "safe-buffer": "^5.1.0" 2794 | } 2795 | }, 2796 | "range_check": { 2797 | "version": "1.4.0", 2798 | "resolved": "https://registry.npmjs.org/range_check/-/range_check-1.4.0.tgz", 2799 | "integrity": "sha1-zYfHrGLEC6nfabhwPGBPYMN0hjU=", 2800 | "requires": { 2801 | "ip6": "0.0.4", 2802 | "ipaddr.js": "1.2" 2803 | }, 2804 | "dependencies": { 2805 | "ipaddr.js": { 2806 | "version": "1.2.0", 2807 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.2.0.tgz", 2808 | "integrity": "sha1-irpJyRknmVhb3WQ+DMtQ6K53e6Q=" 2809 | } 2810 | } 2811 | }, 2812 | "range-parser": { 2813 | "version": "1.2.1", 2814 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2815 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 2816 | }, 2817 | "raw-body": { 2818 | "version": "2.4.3", 2819 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", 2820 | "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", 2821 | "requires": { 2822 | "bytes": "3.1.2", 2823 | "http-errors": "1.8.1", 2824 | "iconv-lite": "0.4.24", 2825 | "unpipe": "1.0.0" 2826 | } 2827 | }, 2828 | "readable-stream": { 2829 | "version": "2.3.7", 2830 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 2831 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 2832 | "requires": { 2833 | "core-util-is": "~1.0.0", 2834 | "inherits": "~2.0.3", 2835 | "isarray": "~1.0.0", 2836 | "process-nextick-args": "~2.0.0", 2837 | "safe-buffer": "~5.1.1", 2838 | "string_decoder": "~1.1.1", 2839 | "util-deprecate": "~1.0.1" 2840 | } 2841 | }, 2842 | "readdirp": { 2843 | "version": "3.6.0", 2844 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2845 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2846 | "dev": true, 2847 | "requires": { 2848 | "picomatch": "^2.2.1" 2849 | } 2850 | }, 2851 | "regexp-clone": { 2852 | "version": "1.0.0", 2853 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", 2854 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" 2855 | }, 2856 | "require-at": { 2857 | "version": "1.0.6", 2858 | "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", 2859 | "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==" 2860 | }, 2861 | "require-directory": { 2862 | "version": "2.1.1", 2863 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2864 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 2865 | "dev": true 2866 | }, 2867 | "safe-buffer": { 2868 | "version": "5.1.2", 2869 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2870 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2871 | }, 2872 | "safer-buffer": { 2873 | "version": "2.1.2", 2874 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2875 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2876 | }, 2877 | "saslprep": { 2878 | "version": "1.0.3", 2879 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", 2880 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", 2881 | "optional": true, 2882 | "requires": { 2883 | "sparse-bitfield": "^3.0.3" 2884 | } 2885 | }, 2886 | "send": { 2887 | "version": "0.17.2", 2888 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", 2889 | "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", 2890 | "requires": { 2891 | "debug": "2.6.9", 2892 | "depd": "~1.1.2", 2893 | "destroy": "~1.0.4", 2894 | "encodeurl": "~1.0.2", 2895 | "escape-html": "~1.0.3", 2896 | "etag": "~1.8.1", 2897 | "fresh": "0.5.2", 2898 | "http-errors": "1.8.1", 2899 | "mime": "1.6.0", 2900 | "ms": "2.1.3", 2901 | "on-finished": "~2.3.0", 2902 | "range-parser": "~1.2.1", 2903 | "statuses": "~1.5.0" 2904 | }, 2905 | "dependencies": { 2906 | "ms": { 2907 | "version": "2.1.3", 2908 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2909 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 2910 | } 2911 | } 2912 | }, 2913 | "serialize-javascript": { 2914 | "version": "6.0.0", 2915 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 2916 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 2917 | "dev": true, 2918 | "requires": { 2919 | "randombytes": "^2.1.0" 2920 | } 2921 | }, 2922 | "serve-static": { 2923 | "version": "1.14.2", 2924 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", 2925 | "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", 2926 | "requires": { 2927 | "encodeurl": "~1.0.2", 2928 | "escape-html": "~1.0.3", 2929 | "parseurl": "~1.3.3", 2930 | "send": "0.17.2" 2931 | } 2932 | }, 2933 | "setprototypeof": { 2934 | "version": "1.2.0", 2935 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 2936 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 2937 | }, 2938 | "sift": { 2939 | "version": "13.5.2", 2940 | "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", 2941 | "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" 2942 | }, 2943 | "sliced": { 2944 | "version": "1.0.1", 2945 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 2946 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 2947 | }, 2948 | "sparse-bitfield": { 2949 | "version": "3.0.3", 2950 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 2951 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 2952 | "optional": true, 2953 | "requires": { 2954 | "memory-pager": "^1.0.2" 2955 | } 2956 | }, 2957 | "statuses": { 2958 | "version": "1.5.0", 2959 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 2960 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 2961 | }, 2962 | "string_decoder": { 2963 | "version": "1.1.1", 2964 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2965 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2966 | "requires": { 2967 | "safe-buffer": "~5.1.0" 2968 | } 2969 | }, 2970 | "string-width": { 2971 | "version": "4.2.3", 2972 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2973 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2974 | "dev": true, 2975 | "requires": { 2976 | "emoji-regex": "^8.0.0", 2977 | "is-fullwidth-code-point": "^3.0.0", 2978 | "strip-ansi": "^6.0.1" 2979 | } 2980 | }, 2981 | "strip-ansi": { 2982 | "version": "6.0.1", 2983 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2984 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2985 | "dev": true, 2986 | "requires": { 2987 | "ansi-regex": "^5.0.1" 2988 | } 2989 | }, 2990 | "strip-json-comments": { 2991 | "version": "3.1.1", 2992 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2993 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2994 | "dev": true 2995 | }, 2996 | "supports-color": { 2997 | "version": "8.1.1", 2998 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2999 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 3000 | "dev": true, 3001 | "requires": { 3002 | "has-flag": "^4.0.0" 3003 | } 3004 | }, 3005 | "to-regex-range": { 3006 | "version": "5.0.1", 3007 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3008 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3009 | "dev": true, 3010 | "requires": { 3011 | "is-number": "^7.0.0" 3012 | } 3013 | }, 3014 | "toidentifier": { 3015 | "version": "1.0.1", 3016 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 3017 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 3018 | }, 3019 | "type-is": { 3020 | "version": "1.6.18", 3021 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 3022 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 3023 | "requires": { 3024 | "media-typer": "0.3.0", 3025 | "mime-types": "~2.1.24" 3026 | } 3027 | }, 3028 | "unpipe": { 3029 | "version": "1.0.0", 3030 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3031 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 3032 | }, 3033 | "util-deprecate": { 3034 | "version": "1.0.2", 3035 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3036 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 3037 | }, 3038 | "utils-merge": { 3039 | "version": "1.0.1", 3040 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 3041 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 3042 | }, 3043 | "vary": { 3044 | "version": "1.1.2", 3045 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 3046 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 3047 | }, 3048 | "which": { 3049 | "version": "2.0.2", 3050 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3051 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3052 | "dev": true, 3053 | "requires": { 3054 | "isexe": "^2.0.0" 3055 | } 3056 | }, 3057 | "workerpool": { 3058 | "version": "6.2.0", 3059 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", 3060 | "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", 3061 | "dev": true 3062 | }, 3063 | "wrap-ansi": { 3064 | "version": "7.0.0", 3065 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3066 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3067 | "dev": true, 3068 | "requires": { 3069 | "ansi-styles": "^4.0.0", 3070 | "string-width": "^4.1.0", 3071 | "strip-ansi": "^6.0.0" 3072 | } 3073 | }, 3074 | "wrappy": { 3075 | "version": "1.0.2", 3076 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3077 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 3078 | "dev": true 3079 | }, 3080 | "y18n": { 3081 | "version": "5.0.8", 3082 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 3083 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 3084 | "dev": true 3085 | }, 3086 | "yargs": { 3087 | "version": "16.2.0", 3088 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 3089 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 3090 | "dev": true, 3091 | "requires": { 3092 | "cliui": "^7.0.2", 3093 | "escalade": "^3.1.1", 3094 | "get-caller-file": "^2.0.5", 3095 | "require-directory": "^2.1.1", 3096 | "string-width": "^4.2.0", 3097 | "y18n": "^5.0.5", 3098 | "yargs-parser": "^20.2.2" 3099 | } 3100 | }, 3101 | "yargs-parser": { 3102 | "version": "20.2.4", 3103 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 3104 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 3105 | "dev": true 3106 | }, 3107 | "yargs-unparser": { 3108 | "version": "2.0.0", 3109 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 3110 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 3111 | "dev": true, 3112 | "requires": { 3113 | "camelcase": "^6.0.0", 3114 | "decamelize": "^4.0.0", 3115 | "flat": "^5.0.2", 3116 | "is-plain-obj": "^2.1.0" 3117 | } 3118 | }, 3119 | "yocto-queue": { 3120 | "version": "0.1.0", 3121 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 3122 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3123 | "dev": true 3124 | } 3125 | } 3126 | } 3127 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jsonbox", 3 | "version": "2.1.0", 4 | "description": "A Free HTTP based JSON storage.", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node server.js", 9 | "dev-test": "./node_modules/mocha/bin/mocha" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/vasanthv/jsonbox.git" 14 | }, 15 | "keywords": [ 16 | "json", 17 | "store", 18 | "storage", 19 | "restful" 20 | ], 21 | "author": "Vasanth V", 22 | "license": "MIT", 23 | "bugs": { 24 | "url": "https://github.com/vasanthv/jsonbox/issues" 25 | }, 26 | "homepage": "https://github.com/vasanthv/jsonbox#readme", 27 | "dependencies": { 28 | "body-parser": "^1.19.0", 29 | "cors": "^2.8.5", 30 | "express": "^4.17.3", 31 | "express-ipfilter": "^1.1.2", 32 | "express-rate-limit": "^5.1.1", 33 | "mongoose": "^5.13.15" 34 | }, 35 | "devDependencies": { 36 | "fetch-lite": "^1.1.0", 37 | "mocha": "^9.1.3" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const bodyParser = require('body-parser'); 2 | const express = require('express'); 3 | const path = require('path'); 4 | const cors = require('cors'); 5 | const config = require('./src/config'); 6 | const routes = require('./src/routes'); 7 | 8 | const app = express(); 9 | 10 | app.enable('trust proxy'); 11 | // set express server middlewares 12 | app.use(cors()); 13 | app.use(express.static(path.join(__dirname, 'www'))); 14 | app.use(bodyParser.json()); 15 | 16 | app.get('/v2', (req, res) => res.sendFile(path.join(__dirname, 'www/index.html'))); 17 | 18 | app.use(routes); 19 | 20 | app.listen(config.PORT, err => { 21 | if (err) console.error(err); 22 | console.log('Server started on ' + config.PORT); 23 | }); 24 | -------------------------------------------------------------------------------- /src/config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | SIZE_LIMIT: 50, // mentioned in KB 3 | PORT: process.env.PORT || 3000, 4 | MONGO_URL: process.env.MONGODB_URI || "mongodb://localhost:27017/jsonbox-io-dev", 5 | REQUEST_LIMIT_PER_HOUR: 100, 6 | ENABLE_DATA_EXPIRY: false, // Once switched on the index will be be set in mongodb. Might need to remove it in order to switch off the behaviour 7 | DATA_EXPIRY_IN_DAYS: 30, 8 | FILTER_IP_SET: [], // example ['172.29.0.1'] 9 | FILTER_OPTIONS: { mode: "allow" }, 10 | }; 11 | -------------------------------------------------------------------------------- /src/db.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A singleton implemetaion for the database 3 | */ 4 | 5 | const mongoose = require('mongoose'); 6 | const config = require('./config'); 7 | 8 | module.exports = (() => { 9 | let instance; 10 | let db = mongoose.connection; 11 | 12 | const connectToDb = () => { 13 | mongoose.connect(config.MONGO_URL, { 14 | useCreateIndex: true, 15 | useNewUrlParser: true, 16 | useUnifiedTopology: true 17 | }); 18 | }; 19 | 20 | const createInstance = () => { 21 | db.on('error', error => { 22 | console.error('Error in MongoDb connection: ' + error); 23 | mongoose.disconnect(); // Trigger disconnect on any error 24 | }); 25 | db.on('connected', () => console.log('Data Db connected')); 26 | db.on('disconnected', () => { 27 | console.log('MongoDB disconnected!'); 28 | connectToDb(); 29 | }); 30 | 31 | connectToDb(); 32 | const Schema = mongoose.Schema; 33 | 34 | // Data Schema 35 | const dataSchema = new Schema({ 36 | _box: { type: String, index: true, select: false }, // box to which the record belongs 37 | _collection: { type: String, index: true }, // Any collection if user passes in URL 38 | _createdOn: Date, // Date on which its created 39 | _apiKey: { type: String, index: true, select: false }, // API KEY used to create / update the record 40 | _updatedOn: Date, // Date on which its updated 41 | _expiry: { type: Date, select: false }, // date after which this record will be deleted 42 | data: { type: Object } // Actual data of the record 43 | }); 44 | 45 | // Once switched on the index will be be set in mongodb. Might need to remove it in order to switch off the behaviour 46 | if (config.ENABLE_DATA_EXPIRY) { 47 | dataSchema.index({ "_expiry": 1 }, { expireAfterSeconds: 0 }); 48 | } 49 | 50 | return mongoose.model('Data', dataSchema); 51 | }; 52 | 53 | return { 54 | getInstance: () => { 55 | if (!instance) { 56 | instance = createInstance(); 57 | } 58 | return instance; 59 | } 60 | }; 61 | })(); 62 | -------------------------------------------------------------------------------- /src/helper.js: -------------------------------------------------------------------------------- 1 | const config = require('./config'); 2 | 3 | const memorySizeOf = obj => { 4 | // took this function from https://stackoverflow.com/a/50180927/607608 5 | var bytes = 0; 6 | 7 | function sizeOf(obj) { 8 | if (obj !== null && obj !== undefined) { 9 | switch (typeof obj) { 10 | case 'number': 11 | bytes += 8; 12 | break; 13 | case 'string': 14 | bytes += obj.length * 2; 15 | break; 16 | case 'boolean': 17 | bytes += 4; 18 | break; 19 | case 'object': 20 | var objClass = Object.prototype.toString.call(obj).slice(8, -1); 21 | if (objClass === 'Object' || objClass === 'Array') { 22 | for (var key in obj) { 23 | if (!obj.hasOwnProperty(key)) continue; 24 | sizeOf(obj[key]); 25 | } 26 | } else bytes += obj.toString().length * 2; 27 | break; 28 | } 29 | } 30 | return bytes; 31 | } 32 | return sizeOf(obj); 33 | }; 34 | 35 | const isValidKeys = obj => { 36 | const keys = Object.keys(obj); 37 | return keys.every(key => /^[A-Za-z]/i.test(key[0])); 38 | }; 39 | 40 | const responseBody = (obj, collection) => { 41 | let response = {}; 42 | response['_id'] = obj._id; 43 | const data = obj.data; 44 | response = { ...response, ...data }; 45 | response['_createdOn'] = obj._createdOn; 46 | if (obj._updatedOn) response['_updatedOn'] = obj._updatedOn; 47 | if (!collection && obj._collection) response['_collection'] = obj._collection; 48 | return response; 49 | }; 50 | 51 | const parse_query = req_q => { 52 | let query = {}; 53 | let q = {}; 54 | req_q.split(',').forEach(i => (q[i.split(':')[0]] = i.split(':')[1])); 55 | Object.keys(q).forEach(key => { 56 | const value = q[key]; 57 | if ( 58 | value.startsWith('>=') || 59 | value.startsWith('<=') || 60 | value.startsWith('>') || 61 | value.startsWith('<') || 62 | value.startsWith('=') 63 | ) { 64 | // Querying a Number 65 | let val = 0; 66 | if (value.startsWith('>=') || value.startsWith('<=')) val = value.substr(2); 67 | else val = value.substr(1); 68 | 69 | if (value.startsWith('>=')) query['data.' + key] = { $gte: +val }; 70 | else if (value.startsWith('<=')) query['data.' + key] = { $lte: +val }; 71 | else if (value.startsWith('>')) query['data.' + key] = { $gt: +val }; 72 | else if (value.startsWith('<')) query['data.' + key] = { $lt: +val }; 73 | else if (value.startsWith('=')) query['data.' + key] = +val; 74 | } else if (value.startsWith('*') || value.endsWith('*')) { 75 | // Need to do regex query 76 | let val = value; 77 | if (value.startsWith('*')) val = value.substr(1); 78 | if (value.endsWith('*')) val = val.substr(0, val.length - 1); 79 | 80 | let regexp; 81 | if (value.startsWith('*') && value.endsWith('*')) regexp = new RegExp(val, 'i'); 82 | else if (value.startsWith('*')) regexp = new RegExp(val + '$', 'i'); 83 | else if (value.endsWith('*')) regexp = new RegExp('^' + val, 'i'); 84 | query['data.' + key] = regexp; 85 | } else { 86 | if (value == 'true') query['data.' + key] = true; 87 | else if (value == 'false') query['data.' + key] = false; 88 | else query['data.' + key] = new RegExp('^' + value + '$', 'i'); 89 | } 90 | }); 91 | 92 | return query; 93 | }; 94 | 95 | const getExpiryDate = () => { 96 | const expiryDate = new Date(); 97 | expiryDate.setDate(expiryDate.getDate() + config.DATA_EXPIRY_IN_DAYS); 98 | return expiryDate; 99 | } 100 | 101 | module.exports = { 102 | memorySizeOf, 103 | isValidKeys, 104 | responseBody, 105 | parse_query, 106 | getExpiryDate 107 | }; 108 | -------------------------------------------------------------------------------- /src/model.js: -------------------------------------------------------------------------------- 1 | const helper = require('./helper'); 2 | const config = require('./config'); 3 | const Data = require('./db').getInstance(); 4 | 5 | const xpost = async (req, res, next) => { 6 | try { 7 | const createRecord = async body => { 8 | const date = new Date(); 9 | let record = { _box: req.box }; 10 | 11 | if (req.collection) record['_collection'] = req.collection; 12 | if (req.apiKey) record['_apiKey'] = req.apiKey; 13 | record['_createdOn'] = date; 14 | record['_expiry'] = helper.getExpiryDate(); 15 | record['data'] = body; 16 | 17 | const newRecord = await new Data(record).save(); 18 | return helper.responseBody(newRecord, req.collection); 19 | }; 20 | 21 | if (Array.isArray(req.body)) { 22 | const createRecordPromise = req.body.map(createRecord); 23 | const newRecords = await Promise.all(createRecordPromise); 24 | res.json(newRecords); 25 | } else { 26 | const newRecord = await createRecord(req.body); 27 | res.json(newRecord); 28 | } 29 | } catch (error) { 30 | next(error); 31 | } 32 | }; 33 | 34 | const xget = async (req, res, next) => { 35 | try { 36 | if (req.recordId) { 37 | const record = await Data.findOne({ _id: req.recordId, _box: req.box }).exec(); 38 | res.json(helper.responseBody(record, req.collection)); 39 | } else { 40 | const skip = req.query.skip ? +req.query.skip : 0; 41 | 42 | let limit = req.query.limit ? +req.query.limit : 20; 43 | limit = limit > 1000 ? 1000 : limit; 44 | 45 | let sort = req.query.sort ? req.query.sort : '-_createdOn'; 46 | if (!['_createdOn', '-_createdOn', '_updatedOn', '-_updatedOn'].includes(sort)) { 47 | sort = sort[0] === '-' ? '-data.' + sort.substr(1) : 'data.' + sort; 48 | } 49 | 50 | let query = {}; 51 | if (req.query.q) query = helper.parse_query(req.query.q); 52 | 53 | query['_box'] = req.box; 54 | if (req.collection) query['_collection'] = req.collection; 55 | 56 | const records = await Data.find(query) 57 | .skip(skip) 58 | .limit(limit) 59 | .sort(sort) 60 | .exec(); 61 | res.json(records.map(r => helper.responseBody(r, req.collection))); 62 | } 63 | } catch (error) { 64 | next(error); 65 | } 66 | }; 67 | const xput = async (req, res, next) => { 68 | try { 69 | const record = await Data.findOne({ _id: req.recordId, _box: req.box }).exec(); 70 | if (record) { 71 | await Data.updateOne({ _id: req.recordId, _box: req.box }, { 72 | _updatedOn: new Date(), 73 | _expiry: helper.getExpiryDate(), 74 | data: req.body 75 | }); 76 | res.json({ message: 'Record updated.' }); 77 | } else { 78 | res.status(400).json({ message: 'Invalid record Id' }); 79 | } 80 | } catch (error) { 81 | next(error); 82 | } 83 | }; 84 | const xdelete = async (req, res, next) => { 85 | try { 86 | if (req.recordId) { 87 | const record = await Data.findOne({ _id: req.recordId, _box: req.box }).exec(); 88 | 89 | if (record) { 90 | await Data.deleteOne({ _id: req.recordId, _box: req.box }); 91 | res.json({ message: 'Record removed.' }); 92 | } else { 93 | res.status(400).json({ message: 'Invalid record Id' }); 94 | } 95 | } else if (req.query.q) { 96 | const query = helper.parse_query(req.query.q); 97 | query['_box'] = req.box; 98 | 99 | const result = await Data.deleteMany(query); 100 | res.json({ message: result.deletedCount + ' Records removed.' }); 101 | } 102 | } catch (error) { 103 | next(error); 104 | } 105 | }; 106 | 107 | const xmeta = async (req, res, next) => { 108 | try { 109 | let query = {}; 110 | query['_box'] = req.params.boxId; 111 | 112 | const promises = [ 113 | Data.countDocuments(query).exec(), 114 | Data.findOne(query) 115 | .sort('_createdOn') 116 | .exec(), 117 | Data.findOne(query) 118 | .sort('-_updatedOn') 119 | .exec() 120 | ]; 121 | 122 | const result = {}; 123 | Promise.all(promises).then(function(values) { 124 | result['_count'] = values[0]; 125 | result['_sizeLimit'] = config.SIZE_LIMIT; 126 | 127 | if (values[0] > 0) { 128 | // get first _createdOn 129 | const createdOn = values[1]['_createdOn']; 130 | if (createdOn) result['_createdOn'] = createdOn; 131 | 132 | // get last _updatedOn 133 | const updatedOn = values[2]['_updatedOn']; 134 | if (updatedOn) result['_updatedOn'] = updatedOn; 135 | } 136 | 137 | res.json(result); 138 | }); 139 | } catch (error) { 140 | next(error); 141 | } 142 | }; 143 | 144 | module.exports = { 145 | xpost, 146 | xget, 147 | xput, 148 | xdelete, 149 | xmeta 150 | }; 151 | -------------------------------------------------------------------------------- /src/routes.js: -------------------------------------------------------------------------------- 1 | const router = require("express").Router(); 2 | const rateLimit = require("express-rate-limit"); 3 | 4 | const model = require("./model"); 5 | const config = require("./config"); 6 | const validators = require("./validators"); 7 | 8 | const ipfilter = require('express-ipfilter').IpFilter 9 | const IpDeniedError = require('express-ipfilter').IpDeniedError 10 | 11 | // Optionally use IP filter 12 | if (config.FILTER_IP_SET !== undefined && 13 | Array.isArray(config.FILTER_IP_SET) && 14 | config.FILTER_IP_SET.length > 0) { 15 | router.use(ipfilter(config.FILTER_IP_SET, config.FILTER_OPTIONS)); 16 | } 17 | 18 | router.get("/_meta/:boxId", model.xmeta); 19 | 20 | // list of all validators to be in place 21 | router.use(validators.removeNativeKeys); 22 | router.use(validators.sizeValidator); 23 | router.use(validators.keysValidator); 24 | router.use(validators.extractParams); 25 | router.use(validators.validateParams); 26 | router.use(validators.authenticateRequest); 27 | 28 | // only 100 POST requests are allowed in 60 minutes window 29 | router.post("/*", rateLimit({ windowMs: 60 * 60 * 1000, max: config.REQUEST_LIMIT_PER_HOUR }), model.xpost); 30 | router.get("/*", model.xget); 31 | router.put("/*", model.xput); 32 | router.delete("/*", model.xdelete); 33 | 34 | /** 35 | * DATA endpoint's common error handling middleware 36 | */ 37 | router.use((err, req, res, next) => { 38 | console.error(err); 39 | if (err instanceof IpDeniedError) { 40 | res.status(403).json({ message: "Forbidden" }); 41 | } else { 42 | res.status(err.statusCode || 500).json({ message: err.message }); 43 | } 44 | }); 45 | 46 | module.exports = router; 47 | -------------------------------------------------------------------------------- /src/validators.js: -------------------------------------------------------------------------------- 1 | const helper = require("./helper"); 2 | const config = require("./config"); 3 | 4 | const Data = require("./db").getInstance(); 5 | 6 | // remove the system keys from req.body 7 | const removeNativeKeys = (req, res, next) => { 8 | delete req.body._id; 9 | delete req.body._createdOn; 10 | delete req.body._updatedOn; 11 | delete req.body._collection; 12 | delete req.body._expiry; 13 | next(); 14 | }; 15 | 16 | // validator: size of payload should be < 10KB 17 | const sizeValidator = (req, res, next) => { 18 | if (req.method === "POST" || req.method === "PUT") { 19 | if (Object.keys(req.body).length > 0) { 20 | const memorySize = helper.memorySizeOf(req.body); 21 | req["bodySize"] = memorySize; 22 | 23 | // memorySize is size in bytes. 10KB => 10 * 1024 24 | if (memorySize > config.SIZE_LIMIT * 1024) { 25 | throwError(`JSON body is too large. Should be less than ${config.SIZE_LIMIT}KB`, 413); 26 | } else if (Array.isArray(req.body)) { 27 | if (req.body.length > 1000) { 28 | throwError("Not more than 1000 records for bulk upload.", 413); 29 | } else next(); 30 | } else next(); 31 | } else throwError("Empty body.", 400); 32 | } else next(); 33 | }; 34 | 35 | // The Body top level keys should start with an alphabet 36 | const keysValidator = (req, res, next) => { 37 | let validKeys = Array.isArray(req.body) ? req.body.every(helper.isValidKeys) : helper.isValidKeys(req.body); 38 | if (validKeys) next(); 39 | else throwError("Invalid JSON keys. Keys should start with an alphabet"); 40 | }; 41 | 42 | // extract the box, collection, record ids from the path 43 | const extractParams = (req, res, next) => { 44 | const path = req.path; 45 | const pathParams = path.split("/").filter((p) => !!p); 46 | const isHexString = /^([0-9A-Fa-f]){24}$/; 47 | const isValidBoxID = /^[0-9A-Za-z_]+$/i; 48 | 49 | req["apiKey"] = 50 | req.headers["x-api-key"] || (req.headers["authorization"] ? req.headers["authorization"].split(" ")[1] : null); 51 | 52 | if (pathParams[0]) { 53 | req["box"] = isValidBoxID.test(pathParams[0]) ? pathParams[0] : undefined; 54 | 55 | if (pathParams[1]) { 56 | const isObjectId = isHexString.test(pathParams[1]); 57 | if (isObjectId) req["recordId"] = pathParams[1]; 58 | else req["collection"] = isValidBoxID.test(pathParams[1]) ? pathParams[1] : undefined; 59 | } 60 | 61 | if (!req["recordId"] && pathParams[2]) { 62 | req["recordId"] = isHexString.test(pathParams[2]) ? pathParams[2] : undefined; 63 | } 64 | 65 | next(); 66 | } else throwError("Box id cannot be empty."); 67 | }; 68 | 69 | // check if all the required parameters is present 70 | const validateParams = (req, res, next) => { 71 | const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; 72 | 73 | if (!req.box) { 74 | throwError("Invalid or empty box id"); 75 | } else if (req.box.length < 20 || req.box.length > 64) { 76 | throwError("Box id must be atleast 20 chars long & max. 64 chars."); 77 | } else if (req.collection ? req.collection.length > 20 : false) { 78 | throwError("Collection name can't be more than 20 chars."); 79 | } else if (req.method === "PUT" || req.method === "DELETE") { 80 | if (!req.recordId && !req.query.q) { 81 | throwError("Invalid or empty record id or missing query definition"); 82 | } else if (Array.isArray(req.body)) { 83 | throwError("Bulk update not supported."); 84 | } else next(); 85 | } else if (req.apiKey) { 86 | if (uuidRegex.test(req["apiKey"])) next(); 87 | else throwError("Invalid API-KEY. API-KEY Should be a UUID."); 88 | } else next(); 89 | }; 90 | 91 | // Check if the Request has a valid API_KEY 92 | const authenticateRequest = async (req, res, next) => { 93 | try { 94 | if (req.method === "POST" || req.method === "PUT" || req.method === "DELETE") { 95 | const firstRecord = await Data.findOne({ _box: req.box }) 96 | .select("_apiKey") 97 | .sort("-_createdOn") 98 | .exec(); 99 | if (firstRecord) { 100 | if (firstRecord._apiKey) { 101 | if (firstRecord._apiKey == req["apiKey"]) next(); 102 | else throwError("Invalid API_KEY.", 401); 103 | } else { 104 | // dont pass API_KEY if the first data does not have key 105 | req["apiKey"] = null; 106 | next(); 107 | } 108 | } else next(); 109 | } else next(); 110 | } catch (error) { 111 | next(error); 112 | } 113 | }; 114 | 115 | const throwError = (message, code = 400) => { 116 | const errorObject = new Error(message); 117 | errorObject.statusCode = code; 118 | throw errorObject; 119 | }; 120 | 121 | module.exports = { 122 | removeNativeKeys, 123 | sizeValidator, 124 | keysValidator, 125 | extractParams, 126 | validateParams, 127 | authenticateRequest, 128 | }; 129 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const fetch = require('fetch-lite'); 3 | const config = require('../src/config'); 4 | 5 | const apiBase = 'http://localhost:3000'; 6 | const random = (i, j) => Math.floor(Math.random() * j) + i; 7 | 8 | const mockData = [ 9 | { 10 | name: 'Jon Snow', 11 | age: 23, 12 | from: { 13 | place: 'Winterfell' 14 | } 15 | }, 16 | { 17 | name: 'Arya Stark', 18 | age: 13, 19 | from: { 20 | place: 'Winterfell' 21 | } 22 | }, 23 | { 24 | name: 'Visyrys', 25 | age: 26, 26 | from: { 27 | place: 'Dragonstone' 28 | } 29 | } 30 | ]; 31 | describe('jsonbox.io tests', () => { 32 | const boxId = `box_4a83b8cf8b0688d90790_${random(1000, 9999)}`; 33 | let recordId = null; 34 | console.log(`Box ID: ${boxId}`); 35 | describe('Create records', function() { 36 | it('Should be 200, with 3 records', async () => { 37 | const response = await fetch(`${apiBase}/${boxId}`, { 38 | method: 'POST', 39 | body: JSON.stringify(mockData), 40 | headers: { 'Content-Type': 'application/json' } 41 | }); 42 | assert.equal(response.status, 200); 43 | assert.equal(response.body.length, 3); 44 | return; 45 | }); 46 | }); 47 | describe('Read records', () => { 48 | it('Should be 200, with 3 records', async () => { 49 | const response = await fetch(`${apiBase}/${boxId}`, { 50 | method: 'GET', 51 | headers: { 'Content-Type': 'application/json' } 52 | }); 53 | assert.equal(response.status, 200); 54 | assert.equal(response.body.length, 3); 55 | }); 56 | }); 57 | describe('Read _meta', () => { 58 | it('Should be 200, with 3 records', async () => { 59 | const response = await fetch(`${apiBase}/_meta/${boxId}`, { 60 | method: 'GET', 61 | headers: { 'Content-Type': 'application/json' } 62 | }); 63 | assert.equal(response.status, 200); 64 | assert.equal(response.body["_count"], 3); 65 | assert.equal(response.body["_sizeLimit"], config.SIZE_LIMIT); 66 | assert.notEqual(response.body["_createdOn"], undefined); 67 | }); 68 | }); 69 | describe('Query records', () => { 70 | it('Should be 200, with 1 record', async () => { 71 | const response = await fetch(`${apiBase}/${boxId}?q=name:*stark,age:<15`, { 72 | method: 'GET', 73 | headers: { 'Content-Type': 'application/json' } 74 | }); 75 | assert.equal(response.status, 200); 76 | assert.equal(response.body.length, 1); 77 | recordId = response.body[0]._id; 78 | }); 79 | }); 80 | describe('Update record', () => { 81 | it('Should be 200', async () => { 82 | const response = await fetch(`${apiBase}/${boxId}/${recordId}`, { 83 | method: 'PUT', 84 | body: JSON.stringify({ 85 | name: 'Arya Stark', 86 | age: 23, 87 | from: { 88 | place: 'Winterfell' 89 | } 90 | }), 91 | headers: { 'Content-Type': 'application/json' } 92 | }); 93 | assert.equal(response.status, 200); 94 | }); 95 | }); 96 | describe('Query records again to verify update', () => { 97 | it('Should be 200, with 0 records', async () => { 98 | const response = await fetch(`${apiBase}/${boxId}?q=name:*stark,age:<15`, { 99 | method: 'GET', 100 | headers: { 'Content-Type': 'application/json' } 101 | }); 102 | assert.equal(response.status, 200); 103 | assert.equal(response.body.length, 0); 104 | }); 105 | }); 106 | describe('Delete record', () => { 107 | it('Should be 200', async () => { 108 | const response = await fetch(`${apiBase}/${boxId}/${recordId}`, { 109 | method: 'DELETE', 110 | headers: { 'Content-Type': 'application/json' } 111 | }); 112 | assert.equal(response.status, 200); 113 | }); 114 | }); 115 | describe('Verify delete', () => { 116 | it('Should be 200, with 2 records', async () => { 117 | const response = await fetch(`${apiBase}/${boxId}`, { 118 | method: 'GET', 119 | headers: { 'Content-Type': 'application/json' } 120 | }); 121 | assert.equal(response.status, 200); 122 | assert.equal(response.body.length, 2); 123 | }); 124 | }); 125 | }); 126 | 127 | describe('jsonbox.io protected box tests', () => { 128 | const boxId = `box_4a83b8cf8b0688d90790_${random(1000, 9999)}`; 129 | let apiKey = 'f11842b5-0ee9-47e4-aeaf-1ddfce0e6fd9'; 130 | console.log(`Box ID: ${boxId}`); 131 | describe('Create records', function() { 132 | it('Should be 200, with 3 records', async () => { 133 | const response = await fetch(`${apiBase}/${boxId}`, { 134 | method: 'POST', 135 | body: JSON.stringify(mockData), 136 | headers: { 'Content-Type': 'application/json', 'X-API-KEY': apiKey } 137 | }); 138 | assert.equal(response.status, 200); 139 | assert.equal(response.body.length, 3); 140 | recordId = response.body[0]._id; 141 | }); 142 | }); 143 | describe('Read records', () => { 144 | it('Should be 200, with 3 records', async () => { 145 | const response = await fetch(`${apiBase}/${boxId}`, { 146 | method: 'GET', 147 | headers: { 'Content-Type': 'application/json' } 148 | }); 149 | assert.equal(response.status, 200); 150 | assert.equal(response.body.length, 3); 151 | }); 152 | }); 153 | describe('Update record. Fail', () => { 154 | it('Should be 401', async () => { 155 | const response = await fetch(`${apiBase}/${boxId}/${recordId}`, { 156 | method: 'PUT', 157 | body: JSON.stringify({ 158 | name: 'Arya Stark', 159 | age: 23, 160 | from: { 161 | place: 'Winterfell' 162 | } 163 | }), 164 | headers: { 'Content-Type': 'application/json' } 165 | }); 166 | assert.equal(response.status, 401); 167 | }); 168 | }); 169 | describe('Delete record. Fail', () => { 170 | it('Should be 401', async () => { 171 | const response = await fetch(`${apiBase}/${boxId}/${recordId}`, { 172 | method: 'DELETE', 173 | headers: { 'Content-Type': 'application/json' } 174 | }); 175 | assert.equal(response.status, 401); 176 | }); 177 | }); 178 | describe('Update record.', () => { 179 | it('Should be 200', async () => { 180 | const response = await fetch(`${apiBase}/${boxId}/${recordId}`, { 181 | method: 'PUT', 182 | body: JSON.stringify({ 183 | name: 'Arya Stark', 184 | age: 23, 185 | from: { 186 | place: 'Winterfell' 187 | } 188 | }), 189 | headers: { 'Content-Type': 'application/json', 'X-API-KEY': apiKey } 190 | }); 191 | assert.equal(response.status, 200); 192 | }); 193 | }); 194 | describe('Delete record.', () => { 195 | it('Should be 200', async () => { 196 | const response = await fetch(`${apiBase}/${boxId}/${recordId}`, { 197 | method: 'DELETE', 198 | headers: { 'Content-Type': 'application/json', Authorization: `API-KEY ${apiKey}` } 199 | }); 200 | assert.equal(response.status, 200); 201 | }); 202 | }); 203 | }); 204 | -------------------------------------------------------------------------------- /www/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vasanthv/jsonbox/917b843c8becbdc967f80ecb6fd961c986bbd4e7/www/favicon.ico -------------------------------------------------------------------------------- /www/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vasanthv/jsonbox/917b843c8becbdc967f80ecb6fd961c986bbd4e7/www/icon.png -------------------------------------------------------------------------------- /www/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /www/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 27 | 28 | 29 | 30 | jsonbox.io | A Free HTTP based JSON storage 31 | 32 | 33 | 34 | 35 |
36 |
37 |
Note: Jsonbox.io cloud instance will soon be shut down on May 31st, 2021 due to lack of maintenance time. The Jsonbox.io's source code will continue to be open-sourced in Github.

FYI, you can create your own Jsonbox.io instance for free using Heroku & MongoDB Cloud. Go for it if you love Jsonbox.io :)
38 | 39 |

40 | 49 | jsonbox.io V2 50 |

51 |

A free HTTP based JSON storage

52 |

53 | jsonbox.io lets you store, read & modify JSON data over HTTP APIs for 54 | free (for 30 days). Copy the URL below and start sending HTTP requests to play around with your data 55 | store. 56 |

57 |
58 | 64 | 65 |
66 | 71 | Read the docs 72 | 73 |

74 | 75 | By using Jsonbox.io you agree to the following terms: This service is provided under an "as is" condition. It might change or will be discontinued without prior notice. The maker of this service can't be held liable in any way for any reason. 76 | 77 |

78 | 81 |
82 |
83 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /www/style.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-size: 1.2em; 3 | } 4 | body { 5 | font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, 6 | "Helvetica Neue", sans-serif; 7 | color: #333333; 8 | margin: 0; 9 | line-height: 1.6; 10 | -webkit-font-smoothing: antialiased; 11 | -moz-osx-font-smoothing: grayscale; 12 | -webkit-text-size-adjust: 100%; 13 | } 14 | .wrapper { 15 | width: 100%; 16 | max-width: 640px; 17 | margin: auto; 18 | box-sizing: border-box; 19 | padding: 0px 10px; 20 | } 21 | .mono { 22 | font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace; 23 | font-size: 0.9rem; 24 | } 25 | h1, 26 | h3 { 27 | font-weight: normal; 28 | } 29 | a { 30 | color: #333; 31 | } 32 | #title { 33 | margin-top: 2rem; 34 | display: flex; 35 | color: #000; 36 | } 37 | #title #logo { 38 | width: 48px; 39 | margin-right: 1rem; 40 | } 41 | #title span { 42 | flex: 1; 43 | font-size: 1.8rem; 44 | line-height: 48px; 45 | } 46 | #title small { 47 | color: #888; 48 | } 49 | 50 | #subtitle { 51 | font-size: 1.3rem; 52 | font-style: italic; 53 | } 54 | 55 | #random { 56 | display: flex; 57 | background-color: #ecf0f1; 58 | border-radius: 0.5rem; 59 | padding: 1rem 0.8rem; 60 | } 61 | #random input { 62 | flex: 1; 63 | font-size: 0.8rem; 64 | border: none; 65 | background: none; 66 | outline: none; 67 | } 68 | #random button { 69 | font-size: 1rem; 70 | border: none; 71 | background: none; 72 | cursor: pointer; 73 | } 74 | 75 | #githublink { 76 | display: block; 77 | font-size: 1.2rem; 78 | color: #333; 79 | text-decoration: none; 80 | margin: 2rem 0px; 81 | text-align: center; 82 | } 83 | #footer { 84 | text-align: center; 85 | font-size: 0.75rem; 86 | margin: 10vh auto 1rem; 87 | } 88 | 89 | #redband { 90 | background: #e74c3c; 91 | color: #fff; 92 | padding: 10px; 93 | border-radius: 5px; 94 | font-size: 14px; 95 | margin: 10px auto; 96 | } 97 | --------------------------------------------------------------------------------