├── .gitignore ├── .nvmrc ├── 01-event-loop ├── README.md ├── docker-compose.yml ├── package-lock.json ├── package.json ├── query.js ├── seed.js └── seed.sql ├── 02-event-loop-phases ├── 1-check-timers-non-deterministic.js ├── 2-check-and-timers-deterministic.js ├── README.md ├── package-lock.json ├── package.json └── pop-quiz.js ├── 03-promises-async-await-and-process.nextTick ├── 1-promises-microtasks.js ├── 2-timers-microtasks.js ├── 3-async-then.js ├── 4-async-await.js ├── 5-microtask-event-loop-blocked.js ├── 6-timers-microtasks-nextTick.js ├── README.md ├── package-lock.json └── package.json └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 18.12.0 -------------------------------------------------------------------------------- /01-event-loop/README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 | 6 | 7 |

Node.js visualized - Event Loop

8 |

Dev.to article :newspaper_roll: :
https://dev.to/nodedoctors/an-animated-guide-to-nodejs-event-loop-3g62

9 |

Twitter thread 🧵:
https://twitter.com/AndrewHu368/status/1588963730398019584

10 | 11 | 12 | 13 |
14 | 15 | ### Prerequisites 16 | 17 | * `node 18.12.0` 18 | * `npm >= 6.14.15` 19 | 20 | 21 | ### Configuration 22 | 23 | 1. Install dependencies 24 | ```sh 25 | npm install 26 | ``` 27 | 2. Start the PostgreSQL database 28 | ```sh 29 | docker-compose up -d 30 | ``` 31 | 3. Seed the database 32 | ```sh 33 | npm run seed 34 | ``` 35 | 36 | 37 | ## Usage 38 | 39 | Open the terminal and run: 40 | ```sh 41 | npm run query 42 | ``` 43 | -------------------------------------------------------------------------------- /01-event-loop/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.1' 2 | services: 3 | eventloop-db: 4 | container_name: eventloop-db 5 | environment: 6 | - POSTGRES_DB=eventloop-db 7 | - POSTGRES_USER=postgres 8 | - POSTGRES_PASSWORD=postgres 9 | networks: 10 | - default 11 | ports: 12 | - 5445:5432 13 | expose: 14 | - 5445 15 | image: 'postgres' -------------------------------------------------------------------------------- /01-event-loop/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "first", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "first", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "pg": "^8.8.0" 13 | } 14 | }, 15 | "node_modules/buffer-writer": { 16 | "version": "2.0.0", 17 | "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", 18 | "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", 19 | "engines": { 20 | "node": ">=4" 21 | } 22 | }, 23 | "node_modules/packet-reader": { 24 | "version": "1.0.0", 25 | "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", 26 | "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" 27 | }, 28 | "node_modules/pg": { 29 | "version": "8.8.0", 30 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", 31 | "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", 32 | "dependencies": { 33 | "buffer-writer": "2.0.0", 34 | "packet-reader": "1.0.0", 35 | "pg-connection-string": "^2.5.0", 36 | "pg-pool": "^3.5.2", 37 | "pg-protocol": "^1.5.0", 38 | "pg-types": "^2.1.0", 39 | "pgpass": "1.x" 40 | }, 41 | "engines": { 42 | "node": ">= 8.0.0" 43 | }, 44 | "peerDependencies": { 45 | "pg-native": ">=3.0.1" 46 | }, 47 | "peerDependenciesMeta": { 48 | "pg-native": { 49 | "optional": true 50 | } 51 | } 52 | }, 53 | "node_modules/pg-connection-string": { 54 | "version": "2.5.0", 55 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", 56 | "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" 57 | }, 58 | "node_modules/pg-int8": { 59 | "version": "1.0.1", 60 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 61 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", 62 | "engines": { 63 | "node": ">=4.0.0" 64 | } 65 | }, 66 | "node_modules/pg-pool": { 67 | "version": "3.5.2", 68 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", 69 | "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", 70 | "peerDependencies": { 71 | "pg": ">=8.0" 72 | } 73 | }, 74 | "node_modules/pg-protocol": { 75 | "version": "1.5.0", 76 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", 77 | "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" 78 | }, 79 | "node_modules/pg-types": { 80 | "version": "2.2.0", 81 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 82 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 83 | "dependencies": { 84 | "pg-int8": "1.0.1", 85 | "postgres-array": "~2.0.0", 86 | "postgres-bytea": "~1.0.0", 87 | "postgres-date": "~1.0.4", 88 | "postgres-interval": "^1.1.0" 89 | }, 90 | "engines": { 91 | "node": ">=4" 92 | } 93 | }, 94 | "node_modules/pgpass": { 95 | "version": "1.0.5", 96 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", 97 | "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", 98 | "dependencies": { 99 | "split2": "^4.1.0" 100 | } 101 | }, 102 | "node_modules/postgres-array": { 103 | "version": "2.0.0", 104 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 105 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", 106 | "engines": { 107 | "node": ">=4" 108 | } 109 | }, 110 | "node_modules/postgres-bytea": { 111 | "version": "1.0.0", 112 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 113 | "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", 114 | "engines": { 115 | "node": ">=0.10.0" 116 | } 117 | }, 118 | "node_modules/postgres-date": { 119 | "version": "1.0.7", 120 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 121 | "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", 122 | "engines": { 123 | "node": ">=0.10.0" 124 | } 125 | }, 126 | "node_modules/postgres-interval": { 127 | "version": "1.2.0", 128 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 129 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 130 | "dependencies": { 131 | "xtend": "^4.0.0" 132 | }, 133 | "engines": { 134 | "node": ">=0.10.0" 135 | } 136 | }, 137 | "node_modules/split2": { 138 | "version": "4.1.0", 139 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", 140 | "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", 141 | "engines": { 142 | "node": ">= 10.x" 143 | } 144 | }, 145 | "node_modules/xtend": { 146 | "version": "4.0.2", 147 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 148 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 149 | "engines": { 150 | "node": ">=0.4" 151 | } 152 | } 153 | }, 154 | "dependencies": { 155 | "buffer-writer": { 156 | "version": "2.0.0", 157 | "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", 158 | "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" 159 | }, 160 | "packet-reader": { 161 | "version": "1.0.0", 162 | "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", 163 | "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" 164 | }, 165 | "pg": { 166 | "version": "8.8.0", 167 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", 168 | "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", 169 | "requires": { 170 | "buffer-writer": "2.0.0", 171 | "packet-reader": "1.0.0", 172 | "pg-connection-string": "^2.5.0", 173 | "pg-pool": "^3.5.2", 174 | "pg-protocol": "^1.5.0", 175 | "pg-types": "^2.1.0", 176 | "pgpass": "1.x" 177 | } 178 | }, 179 | "pg-connection-string": { 180 | "version": "2.5.0", 181 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", 182 | "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" 183 | }, 184 | "pg-int8": { 185 | "version": "1.0.1", 186 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 187 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" 188 | }, 189 | "pg-pool": { 190 | "version": "3.5.2", 191 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", 192 | "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", 193 | "requires": {} 194 | }, 195 | "pg-protocol": { 196 | "version": "1.5.0", 197 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", 198 | "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" 199 | }, 200 | "pg-types": { 201 | "version": "2.2.0", 202 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 203 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 204 | "requires": { 205 | "pg-int8": "1.0.1", 206 | "postgres-array": "~2.0.0", 207 | "postgres-bytea": "~1.0.0", 208 | "postgres-date": "~1.0.4", 209 | "postgres-interval": "^1.1.0" 210 | } 211 | }, 212 | "pgpass": { 213 | "version": "1.0.5", 214 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", 215 | "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", 216 | "requires": { 217 | "split2": "^4.1.0" 218 | } 219 | }, 220 | "postgres-array": { 221 | "version": "2.0.0", 222 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 223 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" 224 | }, 225 | "postgres-bytea": { 226 | "version": "1.0.0", 227 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 228 | "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==" 229 | }, 230 | "postgres-date": { 231 | "version": "1.0.7", 232 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 233 | "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" 234 | }, 235 | "postgres-interval": { 236 | "version": "1.2.0", 237 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 238 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 239 | "requires": { 240 | "xtend": "^4.0.0" 241 | } 242 | }, 243 | "split2": { 244 | "version": "4.1.0", 245 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", 246 | "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" 247 | }, 248 | "xtend": { 249 | "version": "4.0.2", 250 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 251 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 252 | } 253 | } 254 | } 255 | -------------------------------------------------------------------------------- /01-event-loop/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "01-non-blocking-overview", 3 | "version": "1.0.0", 4 | "description": "01-non-blocking-overview", 5 | "scripts": { 6 | "seed": "node seed.js", 7 | "query": "node query.js" 8 | }, 9 | "keywords": [], 10 | "author": "Node Doctors", 11 | "license": "ISC", 12 | "dependencies": { 13 | "pg": "8.8.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /01-event-loop/query.js: -------------------------------------------------------------------------------- 1 | const { Client } = require("pg"); 2 | 3 | const client = new Client({ 4 | user: "postgres", 5 | password: "postgres", 6 | port: 5445, 7 | database: "eventloop-db", 8 | }); 9 | 10 | client.connect(); 11 | 12 | console.log("Starting Node.js"); 13 | 14 | client.query("SELECT * FROM public.cars", function callback(_err, _res) { 15 | console.log("Query executed"); 16 | client.end(); 17 | }); 18 | console.log("Before query result"); 19 | -------------------------------------------------------------------------------- /01-event-loop/seed.js: -------------------------------------------------------------------------------- 1 | const { Pool } = require("pg"); 2 | const fs = require("fs"); 3 | 4 | const pool = new Pool({ 5 | user: "postgres", 6 | password: "postgres", 7 | port: 5445, 8 | database: "eventloop-db", 9 | }); 10 | 11 | pool.connect((err, client, done) => { 12 | if (err) throw err; 13 | const seedQuery = fs.readFileSync("./seed.sql", { encoding: "utf8" }); 14 | client.query(seedQuery, (_err, _res) => { 15 | console.log("Seeding Completed!"); 16 | pool.end(); 17 | done(); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /01-event-loop/seed.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS cars; 2 | 3 | CREATE TABLE cars(id SERIAL PRIMARY KEY, name VARCHAR(255), price INT); 4 | INSERT INTO cars(name, price) VALUES('Audi', 52642); 5 | INSERT INTO cars(name, price) VALUES('Mercedes', 57127); 6 | INSERT INTO cars(name, price) VALUES('Skoda', 9000); 7 | INSERT INTO cars(name, price) VALUES('Volvo', 29000); 8 | INSERT INTO cars(name, price) VALUES('Bentley', 350000); 9 | INSERT INTO cars(name, price) VALUES('Citroen', 21000); 10 | INSERT INTO cars(name, price) VALUES('Hummer', 41400); 11 | INSERT INTO cars(name, price) VALUES('Volkswagen', 21600); -------------------------------------------------------------------------------- /02-event-loop-phases/1-check-timers-non-deterministic.js: -------------------------------------------------------------------------------- 1 | setImmediate(() => { 2 | console.log("immediate"); 3 | }); 4 | 5 | setTimeout(() => { 6 | console.log("timeout"); 7 | }); 8 | -------------------------------------------------------------------------------- /02-event-loop-phases/2-check-and-timers-deterministic.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | const port = 3000; 4 | 5 | app.get('/example', (req, res) => { 6 | setImmediate(() => { 7 | console.log('immediate'); 8 | }); 9 | 10 | setTimeout(() => { 11 | console.log('timeout'); 12 | }); 13 | res.send('Hello World!'); 14 | }); 15 | 16 | app.listen(port, () => { 17 | console.log(`Example app listening on port ${port}`); 18 | }); 19 | -------------------------------------------------------------------------------- /02-event-loop-phases/README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 | 6 | 7 |

Node.js visualized - Event Loop phases

8 |

Dev.to article :newspaper_roll: : https://dev.to/nodedoctors/animated-nodejs-event-loop-phases-1mcp

9 | 10 | 11 |
12 | 13 | ### Prerequisites 14 | 15 | * `node 18.12.0` 16 | * `npm >= 6.14.15` 17 | 18 | 19 | 20 | ## Usage 21 | 22 | Open the terminal and run: 23 | ```sh 24 | npm run one 25 | ``` 26 | -------------------------------------------------------------------------------- /02-event-loop-phases/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "02-event-loop-phases-and-more", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "02-event-loop-phases-and-more", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "express": "^4.18.2" 13 | } 14 | }, 15 | "node_modules/accepts": { 16 | "version": "1.3.8", 17 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 18 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 19 | "dependencies": { 20 | "mime-types": "~2.1.34", 21 | "negotiator": "0.6.3" 22 | }, 23 | "engines": { 24 | "node": ">= 0.6" 25 | } 26 | }, 27 | "node_modules/array-flatten": { 28 | "version": "1.1.1", 29 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 30 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 31 | }, 32 | "node_modules/body-parser": { 33 | "version": "1.20.1", 34 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 35 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 36 | "dependencies": { 37 | "bytes": "3.1.2", 38 | "content-type": "~1.0.4", 39 | "debug": "2.6.9", 40 | "depd": "2.0.0", 41 | "destroy": "1.2.0", 42 | "http-errors": "2.0.0", 43 | "iconv-lite": "0.4.24", 44 | "on-finished": "2.4.1", 45 | "qs": "6.11.0", 46 | "raw-body": "2.5.1", 47 | "type-is": "~1.6.18", 48 | "unpipe": "1.0.0" 49 | }, 50 | "engines": { 51 | "node": ">= 0.8", 52 | "npm": "1.2.8000 || >= 1.4.16" 53 | } 54 | }, 55 | "node_modules/bytes": { 56 | "version": "3.1.2", 57 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 58 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 59 | "engines": { 60 | "node": ">= 0.8" 61 | } 62 | }, 63 | "node_modules/call-bind": { 64 | "version": "1.0.2", 65 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 66 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 67 | "dependencies": { 68 | "function-bind": "^1.1.1", 69 | "get-intrinsic": "^1.0.2" 70 | }, 71 | "funding": { 72 | "url": "https://github.com/sponsors/ljharb" 73 | } 74 | }, 75 | "node_modules/content-disposition": { 76 | "version": "0.5.4", 77 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 78 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 79 | "dependencies": { 80 | "safe-buffer": "5.2.1" 81 | }, 82 | "engines": { 83 | "node": ">= 0.6" 84 | } 85 | }, 86 | "node_modules/content-type": { 87 | "version": "1.0.4", 88 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 89 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 90 | "engines": { 91 | "node": ">= 0.6" 92 | } 93 | }, 94 | "node_modules/cookie": { 95 | "version": "0.5.0", 96 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 97 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 98 | "engines": { 99 | "node": ">= 0.6" 100 | } 101 | }, 102 | "node_modules/cookie-signature": { 103 | "version": "1.0.6", 104 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 105 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 106 | }, 107 | "node_modules/debug": { 108 | "version": "2.6.9", 109 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 110 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 111 | "dependencies": { 112 | "ms": "2.0.0" 113 | } 114 | }, 115 | "node_modules/depd": { 116 | "version": "2.0.0", 117 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 118 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 119 | "engines": { 120 | "node": ">= 0.8" 121 | } 122 | }, 123 | "node_modules/destroy": { 124 | "version": "1.2.0", 125 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 126 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 127 | "engines": { 128 | "node": ">= 0.8", 129 | "npm": "1.2.8000 || >= 1.4.16" 130 | } 131 | }, 132 | "node_modules/ee-first": { 133 | "version": "1.1.1", 134 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 135 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 136 | }, 137 | "node_modules/encodeurl": { 138 | "version": "1.0.2", 139 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 140 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 141 | "engines": { 142 | "node": ">= 0.8" 143 | } 144 | }, 145 | "node_modules/escape-html": { 146 | "version": "1.0.3", 147 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 148 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 149 | }, 150 | "node_modules/etag": { 151 | "version": "1.8.1", 152 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 153 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 154 | "engines": { 155 | "node": ">= 0.6" 156 | } 157 | }, 158 | "node_modules/express": { 159 | "version": "4.18.2", 160 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 161 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 162 | "dependencies": { 163 | "accepts": "~1.3.8", 164 | "array-flatten": "1.1.1", 165 | "body-parser": "1.20.1", 166 | "content-disposition": "0.5.4", 167 | "content-type": "~1.0.4", 168 | "cookie": "0.5.0", 169 | "cookie-signature": "1.0.6", 170 | "debug": "2.6.9", 171 | "depd": "2.0.0", 172 | "encodeurl": "~1.0.2", 173 | "escape-html": "~1.0.3", 174 | "etag": "~1.8.1", 175 | "finalhandler": "1.2.0", 176 | "fresh": "0.5.2", 177 | "http-errors": "2.0.0", 178 | "merge-descriptors": "1.0.1", 179 | "methods": "~1.1.2", 180 | "on-finished": "2.4.1", 181 | "parseurl": "~1.3.3", 182 | "path-to-regexp": "0.1.7", 183 | "proxy-addr": "~2.0.7", 184 | "qs": "6.11.0", 185 | "range-parser": "~1.2.1", 186 | "safe-buffer": "5.2.1", 187 | "send": "0.18.0", 188 | "serve-static": "1.15.0", 189 | "setprototypeof": "1.2.0", 190 | "statuses": "2.0.1", 191 | "type-is": "~1.6.18", 192 | "utils-merge": "1.0.1", 193 | "vary": "~1.1.2" 194 | }, 195 | "engines": { 196 | "node": ">= 0.10.0" 197 | } 198 | }, 199 | "node_modules/finalhandler": { 200 | "version": "1.2.0", 201 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 202 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 203 | "dependencies": { 204 | "debug": "2.6.9", 205 | "encodeurl": "~1.0.2", 206 | "escape-html": "~1.0.3", 207 | "on-finished": "2.4.1", 208 | "parseurl": "~1.3.3", 209 | "statuses": "2.0.1", 210 | "unpipe": "~1.0.0" 211 | }, 212 | "engines": { 213 | "node": ">= 0.8" 214 | } 215 | }, 216 | "node_modules/forwarded": { 217 | "version": "0.2.0", 218 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 219 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 220 | "engines": { 221 | "node": ">= 0.6" 222 | } 223 | }, 224 | "node_modules/fresh": { 225 | "version": "0.5.2", 226 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 227 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 228 | "engines": { 229 | "node": ">= 0.6" 230 | } 231 | }, 232 | "node_modules/function-bind": { 233 | "version": "1.1.1", 234 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 235 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 236 | }, 237 | "node_modules/get-intrinsic": { 238 | "version": "1.1.3", 239 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 240 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 241 | "dependencies": { 242 | "function-bind": "^1.1.1", 243 | "has": "^1.0.3", 244 | "has-symbols": "^1.0.3" 245 | }, 246 | "funding": { 247 | "url": "https://github.com/sponsors/ljharb" 248 | } 249 | }, 250 | "node_modules/has": { 251 | "version": "1.0.3", 252 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 253 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 254 | "dependencies": { 255 | "function-bind": "^1.1.1" 256 | }, 257 | "engines": { 258 | "node": ">= 0.4.0" 259 | } 260 | }, 261 | "node_modules/has-symbols": { 262 | "version": "1.0.3", 263 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 264 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 265 | "engines": { 266 | "node": ">= 0.4" 267 | }, 268 | "funding": { 269 | "url": "https://github.com/sponsors/ljharb" 270 | } 271 | }, 272 | "node_modules/http-errors": { 273 | "version": "2.0.0", 274 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 275 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 276 | "dependencies": { 277 | "depd": "2.0.0", 278 | "inherits": "2.0.4", 279 | "setprototypeof": "1.2.0", 280 | "statuses": "2.0.1", 281 | "toidentifier": "1.0.1" 282 | }, 283 | "engines": { 284 | "node": ">= 0.8" 285 | } 286 | }, 287 | "node_modules/iconv-lite": { 288 | "version": "0.4.24", 289 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 290 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 291 | "dependencies": { 292 | "safer-buffer": ">= 2.1.2 < 3" 293 | }, 294 | "engines": { 295 | "node": ">=0.10.0" 296 | } 297 | }, 298 | "node_modules/inherits": { 299 | "version": "2.0.4", 300 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 301 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 302 | }, 303 | "node_modules/ipaddr.js": { 304 | "version": "1.9.1", 305 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 306 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 307 | "engines": { 308 | "node": ">= 0.10" 309 | } 310 | }, 311 | "node_modules/media-typer": { 312 | "version": "0.3.0", 313 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 314 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 315 | "engines": { 316 | "node": ">= 0.6" 317 | } 318 | }, 319 | "node_modules/merge-descriptors": { 320 | "version": "1.0.1", 321 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 322 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 323 | }, 324 | "node_modules/methods": { 325 | "version": "1.1.2", 326 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 327 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 328 | "engines": { 329 | "node": ">= 0.6" 330 | } 331 | }, 332 | "node_modules/mime": { 333 | "version": "1.6.0", 334 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 335 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 336 | "bin": { 337 | "mime": "cli.js" 338 | }, 339 | "engines": { 340 | "node": ">=4" 341 | } 342 | }, 343 | "node_modules/mime-db": { 344 | "version": "1.52.0", 345 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 346 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 347 | "engines": { 348 | "node": ">= 0.6" 349 | } 350 | }, 351 | "node_modules/mime-types": { 352 | "version": "2.1.35", 353 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 354 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 355 | "dependencies": { 356 | "mime-db": "1.52.0" 357 | }, 358 | "engines": { 359 | "node": ">= 0.6" 360 | } 361 | }, 362 | "node_modules/ms": { 363 | "version": "2.0.0", 364 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 365 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 366 | }, 367 | "node_modules/negotiator": { 368 | "version": "0.6.3", 369 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 370 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 371 | "engines": { 372 | "node": ">= 0.6" 373 | } 374 | }, 375 | "node_modules/object-inspect": { 376 | "version": "1.12.2", 377 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 378 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 379 | "funding": { 380 | "url": "https://github.com/sponsors/ljharb" 381 | } 382 | }, 383 | "node_modules/on-finished": { 384 | "version": "2.4.1", 385 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 386 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 387 | "dependencies": { 388 | "ee-first": "1.1.1" 389 | }, 390 | "engines": { 391 | "node": ">= 0.8" 392 | } 393 | }, 394 | "node_modules/parseurl": { 395 | "version": "1.3.3", 396 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 397 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 398 | "engines": { 399 | "node": ">= 0.8" 400 | } 401 | }, 402 | "node_modules/path-to-regexp": { 403 | "version": "0.1.7", 404 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 405 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 406 | }, 407 | "node_modules/proxy-addr": { 408 | "version": "2.0.7", 409 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 410 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 411 | "dependencies": { 412 | "forwarded": "0.2.0", 413 | "ipaddr.js": "1.9.1" 414 | }, 415 | "engines": { 416 | "node": ">= 0.10" 417 | } 418 | }, 419 | "node_modules/qs": { 420 | "version": "6.11.0", 421 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 422 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 423 | "dependencies": { 424 | "side-channel": "^1.0.4" 425 | }, 426 | "engines": { 427 | "node": ">=0.6" 428 | }, 429 | "funding": { 430 | "url": "https://github.com/sponsors/ljharb" 431 | } 432 | }, 433 | "node_modules/range-parser": { 434 | "version": "1.2.1", 435 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 436 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 437 | "engines": { 438 | "node": ">= 0.6" 439 | } 440 | }, 441 | "node_modules/raw-body": { 442 | "version": "2.5.1", 443 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 444 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 445 | "dependencies": { 446 | "bytes": "3.1.2", 447 | "http-errors": "2.0.0", 448 | "iconv-lite": "0.4.24", 449 | "unpipe": "1.0.0" 450 | }, 451 | "engines": { 452 | "node": ">= 0.8" 453 | } 454 | }, 455 | "node_modules/safe-buffer": { 456 | "version": "5.2.1", 457 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 458 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 459 | "funding": [ 460 | { 461 | "type": "github", 462 | "url": "https://github.com/sponsors/feross" 463 | }, 464 | { 465 | "type": "patreon", 466 | "url": "https://www.patreon.com/feross" 467 | }, 468 | { 469 | "type": "consulting", 470 | "url": "https://feross.org/support" 471 | } 472 | ] 473 | }, 474 | "node_modules/safer-buffer": { 475 | "version": "2.1.2", 476 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 477 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 478 | }, 479 | "node_modules/send": { 480 | "version": "0.18.0", 481 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 482 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 483 | "dependencies": { 484 | "debug": "2.6.9", 485 | "depd": "2.0.0", 486 | "destroy": "1.2.0", 487 | "encodeurl": "~1.0.2", 488 | "escape-html": "~1.0.3", 489 | "etag": "~1.8.1", 490 | "fresh": "0.5.2", 491 | "http-errors": "2.0.0", 492 | "mime": "1.6.0", 493 | "ms": "2.1.3", 494 | "on-finished": "2.4.1", 495 | "range-parser": "~1.2.1", 496 | "statuses": "2.0.1" 497 | }, 498 | "engines": { 499 | "node": ">= 0.8.0" 500 | } 501 | }, 502 | "node_modules/send/node_modules/ms": { 503 | "version": "2.1.3", 504 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 505 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 506 | }, 507 | "node_modules/serve-static": { 508 | "version": "1.15.0", 509 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 510 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 511 | "dependencies": { 512 | "encodeurl": "~1.0.2", 513 | "escape-html": "~1.0.3", 514 | "parseurl": "~1.3.3", 515 | "send": "0.18.0" 516 | }, 517 | "engines": { 518 | "node": ">= 0.8.0" 519 | } 520 | }, 521 | "node_modules/setprototypeof": { 522 | "version": "1.2.0", 523 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 524 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 525 | }, 526 | "node_modules/side-channel": { 527 | "version": "1.0.4", 528 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 529 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 530 | "dependencies": { 531 | "call-bind": "^1.0.0", 532 | "get-intrinsic": "^1.0.2", 533 | "object-inspect": "^1.9.0" 534 | }, 535 | "funding": { 536 | "url": "https://github.com/sponsors/ljharb" 537 | } 538 | }, 539 | "node_modules/statuses": { 540 | "version": "2.0.1", 541 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 542 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 543 | "engines": { 544 | "node": ">= 0.8" 545 | } 546 | }, 547 | "node_modules/toidentifier": { 548 | "version": "1.0.1", 549 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 550 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 551 | "engines": { 552 | "node": ">=0.6" 553 | } 554 | }, 555 | "node_modules/type-is": { 556 | "version": "1.6.18", 557 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 558 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 559 | "dependencies": { 560 | "media-typer": "0.3.0", 561 | "mime-types": "~2.1.24" 562 | }, 563 | "engines": { 564 | "node": ">= 0.6" 565 | } 566 | }, 567 | "node_modules/unpipe": { 568 | "version": "1.0.0", 569 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 570 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 571 | "engines": { 572 | "node": ">= 0.8" 573 | } 574 | }, 575 | "node_modules/utils-merge": { 576 | "version": "1.0.1", 577 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 578 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 579 | "engines": { 580 | "node": ">= 0.4.0" 581 | } 582 | }, 583 | "node_modules/vary": { 584 | "version": "1.1.2", 585 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 586 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 587 | "engines": { 588 | "node": ">= 0.8" 589 | } 590 | } 591 | }, 592 | "dependencies": { 593 | "accepts": { 594 | "version": "1.3.8", 595 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 596 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 597 | "requires": { 598 | "mime-types": "~2.1.34", 599 | "negotiator": "0.6.3" 600 | } 601 | }, 602 | "array-flatten": { 603 | "version": "1.1.1", 604 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 605 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 606 | }, 607 | "body-parser": { 608 | "version": "1.20.1", 609 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 610 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 611 | "requires": { 612 | "bytes": "3.1.2", 613 | "content-type": "~1.0.4", 614 | "debug": "2.6.9", 615 | "depd": "2.0.0", 616 | "destroy": "1.2.0", 617 | "http-errors": "2.0.0", 618 | "iconv-lite": "0.4.24", 619 | "on-finished": "2.4.1", 620 | "qs": "6.11.0", 621 | "raw-body": "2.5.1", 622 | "type-is": "~1.6.18", 623 | "unpipe": "1.0.0" 624 | } 625 | }, 626 | "bytes": { 627 | "version": "3.1.2", 628 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 629 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 630 | }, 631 | "call-bind": { 632 | "version": "1.0.2", 633 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 634 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 635 | "requires": { 636 | "function-bind": "^1.1.1", 637 | "get-intrinsic": "^1.0.2" 638 | } 639 | }, 640 | "content-disposition": { 641 | "version": "0.5.4", 642 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 643 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 644 | "requires": { 645 | "safe-buffer": "5.2.1" 646 | } 647 | }, 648 | "content-type": { 649 | "version": "1.0.4", 650 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 651 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 652 | }, 653 | "cookie": { 654 | "version": "0.5.0", 655 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 656 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 657 | }, 658 | "cookie-signature": { 659 | "version": "1.0.6", 660 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 661 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 662 | }, 663 | "debug": { 664 | "version": "2.6.9", 665 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 666 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 667 | "requires": { 668 | "ms": "2.0.0" 669 | } 670 | }, 671 | "depd": { 672 | "version": "2.0.0", 673 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 674 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 675 | }, 676 | "destroy": { 677 | "version": "1.2.0", 678 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 679 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 680 | }, 681 | "ee-first": { 682 | "version": "1.1.1", 683 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 684 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 685 | }, 686 | "encodeurl": { 687 | "version": "1.0.2", 688 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 689 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 690 | }, 691 | "escape-html": { 692 | "version": "1.0.3", 693 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 694 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 695 | }, 696 | "etag": { 697 | "version": "1.8.1", 698 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 699 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 700 | }, 701 | "express": { 702 | "version": "4.18.2", 703 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 704 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 705 | "requires": { 706 | "accepts": "~1.3.8", 707 | "array-flatten": "1.1.1", 708 | "body-parser": "1.20.1", 709 | "content-disposition": "0.5.4", 710 | "content-type": "~1.0.4", 711 | "cookie": "0.5.0", 712 | "cookie-signature": "1.0.6", 713 | "debug": "2.6.9", 714 | "depd": "2.0.0", 715 | "encodeurl": "~1.0.2", 716 | "escape-html": "~1.0.3", 717 | "etag": "~1.8.1", 718 | "finalhandler": "1.2.0", 719 | "fresh": "0.5.2", 720 | "http-errors": "2.0.0", 721 | "merge-descriptors": "1.0.1", 722 | "methods": "~1.1.2", 723 | "on-finished": "2.4.1", 724 | "parseurl": "~1.3.3", 725 | "path-to-regexp": "0.1.7", 726 | "proxy-addr": "~2.0.7", 727 | "qs": "6.11.0", 728 | "range-parser": "~1.2.1", 729 | "safe-buffer": "5.2.1", 730 | "send": "0.18.0", 731 | "serve-static": "1.15.0", 732 | "setprototypeof": "1.2.0", 733 | "statuses": "2.0.1", 734 | "type-is": "~1.6.18", 735 | "utils-merge": "1.0.1", 736 | "vary": "~1.1.2" 737 | } 738 | }, 739 | "finalhandler": { 740 | "version": "1.2.0", 741 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 742 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 743 | "requires": { 744 | "debug": "2.6.9", 745 | "encodeurl": "~1.0.2", 746 | "escape-html": "~1.0.3", 747 | "on-finished": "2.4.1", 748 | "parseurl": "~1.3.3", 749 | "statuses": "2.0.1", 750 | "unpipe": "~1.0.0" 751 | } 752 | }, 753 | "forwarded": { 754 | "version": "0.2.0", 755 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 756 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 757 | }, 758 | "fresh": { 759 | "version": "0.5.2", 760 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 761 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 762 | }, 763 | "function-bind": { 764 | "version": "1.1.1", 765 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 766 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 767 | }, 768 | "get-intrinsic": { 769 | "version": "1.1.3", 770 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 771 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 772 | "requires": { 773 | "function-bind": "^1.1.1", 774 | "has": "^1.0.3", 775 | "has-symbols": "^1.0.3" 776 | } 777 | }, 778 | "has": { 779 | "version": "1.0.3", 780 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 781 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 782 | "requires": { 783 | "function-bind": "^1.1.1" 784 | } 785 | }, 786 | "has-symbols": { 787 | "version": "1.0.3", 788 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 789 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 790 | }, 791 | "http-errors": { 792 | "version": "2.0.0", 793 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 794 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 795 | "requires": { 796 | "depd": "2.0.0", 797 | "inherits": "2.0.4", 798 | "setprototypeof": "1.2.0", 799 | "statuses": "2.0.1", 800 | "toidentifier": "1.0.1" 801 | } 802 | }, 803 | "iconv-lite": { 804 | "version": "0.4.24", 805 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 806 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 807 | "requires": { 808 | "safer-buffer": ">= 2.1.2 < 3" 809 | } 810 | }, 811 | "inherits": { 812 | "version": "2.0.4", 813 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 814 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 815 | }, 816 | "ipaddr.js": { 817 | "version": "1.9.1", 818 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 819 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 820 | }, 821 | "media-typer": { 822 | "version": "0.3.0", 823 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 824 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 825 | }, 826 | "merge-descriptors": { 827 | "version": "1.0.1", 828 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 829 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 830 | }, 831 | "methods": { 832 | "version": "1.1.2", 833 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 834 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 835 | }, 836 | "mime": { 837 | "version": "1.6.0", 838 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 839 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 840 | }, 841 | "mime-db": { 842 | "version": "1.52.0", 843 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 844 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 845 | }, 846 | "mime-types": { 847 | "version": "2.1.35", 848 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 849 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 850 | "requires": { 851 | "mime-db": "1.52.0" 852 | } 853 | }, 854 | "ms": { 855 | "version": "2.0.0", 856 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 857 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 858 | }, 859 | "negotiator": { 860 | "version": "0.6.3", 861 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 862 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 863 | }, 864 | "object-inspect": { 865 | "version": "1.12.2", 866 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 867 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" 868 | }, 869 | "on-finished": { 870 | "version": "2.4.1", 871 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 872 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 873 | "requires": { 874 | "ee-first": "1.1.1" 875 | } 876 | }, 877 | "parseurl": { 878 | "version": "1.3.3", 879 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 880 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 881 | }, 882 | "path-to-regexp": { 883 | "version": "0.1.7", 884 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 885 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 886 | }, 887 | "proxy-addr": { 888 | "version": "2.0.7", 889 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 890 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 891 | "requires": { 892 | "forwarded": "0.2.0", 893 | "ipaddr.js": "1.9.1" 894 | } 895 | }, 896 | "qs": { 897 | "version": "6.11.0", 898 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 899 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 900 | "requires": { 901 | "side-channel": "^1.0.4" 902 | } 903 | }, 904 | "range-parser": { 905 | "version": "1.2.1", 906 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 907 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 908 | }, 909 | "raw-body": { 910 | "version": "2.5.1", 911 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 912 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 913 | "requires": { 914 | "bytes": "3.1.2", 915 | "http-errors": "2.0.0", 916 | "iconv-lite": "0.4.24", 917 | "unpipe": "1.0.0" 918 | } 919 | }, 920 | "safe-buffer": { 921 | "version": "5.2.1", 922 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 923 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 924 | }, 925 | "safer-buffer": { 926 | "version": "2.1.2", 927 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 928 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 929 | }, 930 | "send": { 931 | "version": "0.18.0", 932 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 933 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 934 | "requires": { 935 | "debug": "2.6.9", 936 | "depd": "2.0.0", 937 | "destroy": "1.2.0", 938 | "encodeurl": "~1.0.2", 939 | "escape-html": "~1.0.3", 940 | "etag": "~1.8.1", 941 | "fresh": "0.5.2", 942 | "http-errors": "2.0.0", 943 | "mime": "1.6.0", 944 | "ms": "2.1.3", 945 | "on-finished": "2.4.1", 946 | "range-parser": "~1.2.1", 947 | "statuses": "2.0.1" 948 | }, 949 | "dependencies": { 950 | "ms": { 951 | "version": "2.1.3", 952 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 953 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 954 | } 955 | } 956 | }, 957 | "serve-static": { 958 | "version": "1.15.0", 959 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 960 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 961 | "requires": { 962 | "encodeurl": "~1.0.2", 963 | "escape-html": "~1.0.3", 964 | "parseurl": "~1.3.3", 965 | "send": "0.18.0" 966 | } 967 | }, 968 | "setprototypeof": { 969 | "version": "1.2.0", 970 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 971 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 972 | }, 973 | "side-channel": { 974 | "version": "1.0.4", 975 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 976 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 977 | "requires": { 978 | "call-bind": "^1.0.0", 979 | "get-intrinsic": "^1.0.2", 980 | "object-inspect": "^1.9.0" 981 | } 982 | }, 983 | "statuses": { 984 | "version": "2.0.1", 985 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 986 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 987 | }, 988 | "toidentifier": { 989 | "version": "1.0.1", 990 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 991 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 992 | }, 993 | "type-is": { 994 | "version": "1.6.18", 995 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 996 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 997 | "requires": { 998 | "media-typer": "0.3.0", 999 | "mime-types": "~2.1.24" 1000 | } 1001 | }, 1002 | "unpipe": { 1003 | "version": "1.0.0", 1004 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1005 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1006 | }, 1007 | "utils-merge": { 1008 | "version": "1.0.1", 1009 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1010 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 1011 | }, 1012 | "vary": { 1013 | "version": "1.1.2", 1014 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1015 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1016 | } 1017 | } 1018 | } 1019 | -------------------------------------------------------------------------------- /02-event-loop-phases/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "02-event-loop-phases", 3 | "version": "1.0.0", 4 | "description": "02-event-loop-phases", 5 | "scripts": { 6 | "one": "node 1-check-timers-non-deterministic.js", 7 | "two": "node 2-check-and-timers-deterministic.js" 8 | }, 9 | "keywords": [], 10 | "author": "Node Doctors", 11 | "license": "ISC", 12 | "dependencies": { 13 | "express": "^4.18.2" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /02-event-loop-phases/pop-quiz.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | 3 | fs.readFile(__filename, (_data) => { 4 | const promise = new Promise((resolve, _reject) => { 5 | console.log('inside promise definition'); 6 | 7 | setTimeout(() => { 8 | console.log('timeout'); 9 | 10 | resolve('resolved'); 11 | 12 | console.log('still timeout'); 13 | 14 | process.nextTick(() => { 15 | setImmediate(() => console.log('immediate')); 16 | }); 17 | }); 18 | }); 19 | 20 | promise.then((data) => { 21 | console.log('then'); 22 | console.log(data); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /03-promises-async-await-and-process.nextTick/1-promises-microtasks.js: -------------------------------------------------------------------------------- 1 | const promise1 = new Promise(function callback(resolve, _reject) { 2 | resolve(); 3 | }); 4 | 5 | const promise2 = new Promise(function callback(resolve, _reject) { 6 | resolve(); 7 | }); 8 | 9 | promise1.then(() => { 10 | console.log('first promise'); 11 | }); 12 | 13 | promise2.then(() => { 14 | console.log('second promise'); 15 | }); 16 | -------------------------------------------------------------------------------- /03-promises-async-await-and-process.nextTick/2-timers-microtasks.js: -------------------------------------------------------------------------------- 1 | const promise = new Promise((resolve, _reject) => { 2 | setTimeout(() => { 3 | console.log('before resolve'); 4 | resolve(1); 5 | console.log('after resolve'); 6 | }); 7 | 8 | console.log('inside promise defintion'); 9 | }); 10 | 11 | console.log(promise); 12 | promise.then((result) => { 13 | console.log('result', result); 14 | }); 15 | -------------------------------------------------------------------------------- /03-promises-async-await-and-process.nextTick/3-async-then.js: -------------------------------------------------------------------------------- 1 | async function foo() { 2 | return 'async result'; 3 | } 4 | 5 | function run() { 6 | foo().then((result) => { 7 | console.log(result); 8 | console.log('after then'); 9 | }); 10 | } 11 | 12 | run(); 13 | -------------------------------------------------------------------------------- /03-promises-async-await-and-process.nextTick/4-async-await.js: -------------------------------------------------------------------------------- 1 | async function foo() { 2 | return 'async result'; 3 | } 4 | 5 | async function run() { 6 | const result = await foo(); 7 | console.log(result); 8 | console.log('after then'); 9 | } 10 | 11 | run(); 12 | -------------------------------------------------------------------------------- /03-promises-async-await-and-process.nextTick/5-microtask-event-loop-blocked.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | const port = 3000; 4 | 5 | app.get('/example', (_req, res) => { 6 | res.send('Hello, world! 👋'); 7 | 8 | for (let i = 0; i < 1000; i++) { 9 | Promise.resolve().then(() => { 10 | console.log('✋ Blocking'); 11 | }); 12 | } 13 | }); 14 | 15 | app.listen(port, () => { 16 | console.log(`Example app listening on port ${port}`); 17 | }); 18 | -------------------------------------------------------------------------------- /03-promises-async-await-and-process.nextTick/6-timers-microtasks-nextTick.js: -------------------------------------------------------------------------------- 1 | setTimeout(() => { 2 | console.log('set timeout'); 3 | }); 4 | 5 | Promise.resolve(1).then(() => { 6 | console.log('first promise'); 7 | }); 8 | 9 | Promise.resolve(2).then(() => { 10 | console.log('second promise'); 11 | }); 12 | 13 | process.nextTick(() => { 14 | console.log('first nextTick'); 15 | }); 16 | 17 | process.nextTick(() => { 18 | console.log('second nextTick'); 19 | }); 20 | -------------------------------------------------------------------------------- /03-promises-async-await-and-process.nextTick/README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 | 6 | 7 |

Node.js visualized - Promises, async/await, and nextTick under the hood

8 |

Dev.to article :newspaper_roll: :

9 |

Twitter thread 🧵:

10 | 11 | 12 | 13 |
14 | 15 | ### Prerequisites 16 | 17 | * `node 18.12.0` 18 | * `npm >= 6.14.15` 19 | 20 | 21 | 22 | ## Usage 23 | 24 | Open the terminal and run: 25 | ```sh 26 | npm run one 27 | ``` 28 | -------------------------------------------------------------------------------- /03-promises-async-await-and-process.nextTick/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "03-promises-async-await-and-process.nextTick", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "dependencies": { 8 | "express": "^4.18.2" 9 | } 10 | }, 11 | "node_modules/accepts": { 12 | "version": "1.3.8", 13 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 14 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 15 | "dependencies": { 16 | "mime-types": "~2.1.34", 17 | "negotiator": "0.6.3" 18 | }, 19 | "engines": { 20 | "node": ">= 0.6" 21 | } 22 | }, 23 | "node_modules/array-flatten": { 24 | "version": "1.1.1", 25 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 26 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 27 | }, 28 | "node_modules/body-parser": { 29 | "version": "1.20.1", 30 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 31 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 32 | "dependencies": { 33 | "bytes": "3.1.2", 34 | "content-type": "~1.0.4", 35 | "debug": "2.6.9", 36 | "depd": "2.0.0", 37 | "destroy": "1.2.0", 38 | "http-errors": "2.0.0", 39 | "iconv-lite": "0.4.24", 40 | "on-finished": "2.4.1", 41 | "qs": "6.11.0", 42 | "raw-body": "2.5.1", 43 | "type-is": "~1.6.18", 44 | "unpipe": "1.0.0" 45 | }, 46 | "engines": { 47 | "node": ">= 0.8", 48 | "npm": "1.2.8000 || >= 1.4.16" 49 | } 50 | }, 51 | "node_modules/bytes": { 52 | "version": "3.1.2", 53 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 54 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 55 | "engines": { 56 | "node": ">= 0.8" 57 | } 58 | }, 59 | "node_modules/call-bind": { 60 | "version": "1.0.2", 61 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 62 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 63 | "dependencies": { 64 | "function-bind": "^1.1.1", 65 | "get-intrinsic": "^1.0.2" 66 | }, 67 | "funding": { 68 | "url": "https://github.com/sponsors/ljharb" 69 | } 70 | }, 71 | "node_modules/content-disposition": { 72 | "version": "0.5.4", 73 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 74 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 75 | "dependencies": { 76 | "safe-buffer": "5.2.1" 77 | }, 78 | "engines": { 79 | "node": ">= 0.6" 80 | } 81 | }, 82 | "node_modules/content-type": { 83 | "version": "1.0.4", 84 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 85 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 86 | "engines": { 87 | "node": ">= 0.6" 88 | } 89 | }, 90 | "node_modules/cookie": { 91 | "version": "0.5.0", 92 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 93 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 94 | "engines": { 95 | "node": ">= 0.6" 96 | } 97 | }, 98 | "node_modules/cookie-signature": { 99 | "version": "1.0.6", 100 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 101 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 102 | }, 103 | "node_modules/debug": { 104 | "version": "2.6.9", 105 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 106 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 107 | "dependencies": { 108 | "ms": "2.0.0" 109 | } 110 | }, 111 | "node_modules/depd": { 112 | "version": "2.0.0", 113 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 114 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 115 | "engines": { 116 | "node": ">= 0.8" 117 | } 118 | }, 119 | "node_modules/destroy": { 120 | "version": "1.2.0", 121 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 122 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 123 | "engines": { 124 | "node": ">= 0.8", 125 | "npm": "1.2.8000 || >= 1.4.16" 126 | } 127 | }, 128 | "node_modules/ee-first": { 129 | "version": "1.1.1", 130 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 131 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 132 | }, 133 | "node_modules/encodeurl": { 134 | "version": "1.0.2", 135 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 136 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 137 | "engines": { 138 | "node": ">= 0.8" 139 | } 140 | }, 141 | "node_modules/escape-html": { 142 | "version": "1.0.3", 143 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 144 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 145 | }, 146 | "node_modules/etag": { 147 | "version": "1.8.1", 148 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 149 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 150 | "engines": { 151 | "node": ">= 0.6" 152 | } 153 | }, 154 | "node_modules/express": { 155 | "version": "4.18.2", 156 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 157 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 158 | "dependencies": { 159 | "accepts": "~1.3.8", 160 | "array-flatten": "1.1.1", 161 | "body-parser": "1.20.1", 162 | "content-disposition": "0.5.4", 163 | "content-type": "~1.0.4", 164 | "cookie": "0.5.0", 165 | "cookie-signature": "1.0.6", 166 | "debug": "2.6.9", 167 | "depd": "2.0.0", 168 | "encodeurl": "~1.0.2", 169 | "escape-html": "~1.0.3", 170 | "etag": "~1.8.1", 171 | "finalhandler": "1.2.0", 172 | "fresh": "0.5.2", 173 | "http-errors": "2.0.0", 174 | "merge-descriptors": "1.0.1", 175 | "methods": "~1.1.2", 176 | "on-finished": "2.4.1", 177 | "parseurl": "~1.3.3", 178 | "path-to-regexp": "0.1.7", 179 | "proxy-addr": "~2.0.7", 180 | "qs": "6.11.0", 181 | "range-parser": "~1.2.1", 182 | "safe-buffer": "5.2.1", 183 | "send": "0.18.0", 184 | "serve-static": "1.15.0", 185 | "setprototypeof": "1.2.0", 186 | "statuses": "2.0.1", 187 | "type-is": "~1.6.18", 188 | "utils-merge": "1.0.1", 189 | "vary": "~1.1.2" 190 | }, 191 | "engines": { 192 | "node": ">= 0.10.0" 193 | } 194 | }, 195 | "node_modules/finalhandler": { 196 | "version": "1.2.0", 197 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 198 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 199 | "dependencies": { 200 | "debug": "2.6.9", 201 | "encodeurl": "~1.0.2", 202 | "escape-html": "~1.0.3", 203 | "on-finished": "2.4.1", 204 | "parseurl": "~1.3.3", 205 | "statuses": "2.0.1", 206 | "unpipe": "~1.0.0" 207 | }, 208 | "engines": { 209 | "node": ">= 0.8" 210 | } 211 | }, 212 | "node_modules/forwarded": { 213 | "version": "0.2.0", 214 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 215 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 216 | "engines": { 217 | "node": ">= 0.6" 218 | } 219 | }, 220 | "node_modules/fresh": { 221 | "version": "0.5.2", 222 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 223 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 224 | "engines": { 225 | "node": ">= 0.6" 226 | } 227 | }, 228 | "node_modules/function-bind": { 229 | "version": "1.1.1", 230 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 231 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 232 | }, 233 | "node_modules/get-intrinsic": { 234 | "version": "1.1.3", 235 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 236 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 237 | "dependencies": { 238 | "function-bind": "^1.1.1", 239 | "has": "^1.0.3", 240 | "has-symbols": "^1.0.3" 241 | }, 242 | "funding": { 243 | "url": "https://github.com/sponsors/ljharb" 244 | } 245 | }, 246 | "node_modules/has": { 247 | "version": "1.0.3", 248 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 249 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 250 | "dependencies": { 251 | "function-bind": "^1.1.1" 252 | }, 253 | "engines": { 254 | "node": ">= 0.4.0" 255 | } 256 | }, 257 | "node_modules/has-symbols": { 258 | "version": "1.0.3", 259 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 260 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 261 | "engines": { 262 | "node": ">= 0.4" 263 | }, 264 | "funding": { 265 | "url": "https://github.com/sponsors/ljharb" 266 | } 267 | }, 268 | "node_modules/http-errors": { 269 | "version": "2.0.0", 270 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 271 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 272 | "dependencies": { 273 | "depd": "2.0.0", 274 | "inherits": "2.0.4", 275 | "setprototypeof": "1.2.0", 276 | "statuses": "2.0.1", 277 | "toidentifier": "1.0.1" 278 | }, 279 | "engines": { 280 | "node": ">= 0.8" 281 | } 282 | }, 283 | "node_modules/iconv-lite": { 284 | "version": "0.4.24", 285 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 286 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 287 | "dependencies": { 288 | "safer-buffer": ">= 2.1.2 < 3" 289 | }, 290 | "engines": { 291 | "node": ">=0.10.0" 292 | } 293 | }, 294 | "node_modules/inherits": { 295 | "version": "2.0.4", 296 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 297 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 298 | }, 299 | "node_modules/ipaddr.js": { 300 | "version": "1.9.1", 301 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 302 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 303 | "engines": { 304 | "node": ">= 0.10" 305 | } 306 | }, 307 | "node_modules/media-typer": { 308 | "version": "0.3.0", 309 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 310 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 311 | "engines": { 312 | "node": ">= 0.6" 313 | } 314 | }, 315 | "node_modules/merge-descriptors": { 316 | "version": "1.0.1", 317 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 318 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 319 | }, 320 | "node_modules/methods": { 321 | "version": "1.1.2", 322 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 323 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 324 | "engines": { 325 | "node": ">= 0.6" 326 | } 327 | }, 328 | "node_modules/mime": { 329 | "version": "1.6.0", 330 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 331 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 332 | "bin": { 333 | "mime": "cli.js" 334 | }, 335 | "engines": { 336 | "node": ">=4" 337 | } 338 | }, 339 | "node_modules/mime-db": { 340 | "version": "1.52.0", 341 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 342 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 343 | "engines": { 344 | "node": ">= 0.6" 345 | } 346 | }, 347 | "node_modules/mime-types": { 348 | "version": "2.1.35", 349 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 350 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 351 | "dependencies": { 352 | "mime-db": "1.52.0" 353 | }, 354 | "engines": { 355 | "node": ">= 0.6" 356 | } 357 | }, 358 | "node_modules/ms": { 359 | "version": "2.0.0", 360 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 361 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 362 | }, 363 | "node_modules/negotiator": { 364 | "version": "0.6.3", 365 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 366 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 367 | "engines": { 368 | "node": ">= 0.6" 369 | } 370 | }, 371 | "node_modules/object-inspect": { 372 | "version": "1.12.2", 373 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 374 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 375 | "funding": { 376 | "url": "https://github.com/sponsors/ljharb" 377 | } 378 | }, 379 | "node_modules/on-finished": { 380 | "version": "2.4.1", 381 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 382 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 383 | "dependencies": { 384 | "ee-first": "1.1.1" 385 | }, 386 | "engines": { 387 | "node": ">= 0.8" 388 | } 389 | }, 390 | "node_modules/parseurl": { 391 | "version": "1.3.3", 392 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 393 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 394 | "engines": { 395 | "node": ">= 0.8" 396 | } 397 | }, 398 | "node_modules/path-to-regexp": { 399 | "version": "0.1.7", 400 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 401 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 402 | }, 403 | "node_modules/proxy-addr": { 404 | "version": "2.0.7", 405 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 406 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 407 | "dependencies": { 408 | "forwarded": "0.2.0", 409 | "ipaddr.js": "1.9.1" 410 | }, 411 | "engines": { 412 | "node": ">= 0.10" 413 | } 414 | }, 415 | "node_modules/qs": { 416 | "version": "6.11.0", 417 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 418 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 419 | "dependencies": { 420 | "side-channel": "^1.0.4" 421 | }, 422 | "engines": { 423 | "node": ">=0.6" 424 | }, 425 | "funding": { 426 | "url": "https://github.com/sponsors/ljharb" 427 | } 428 | }, 429 | "node_modules/range-parser": { 430 | "version": "1.2.1", 431 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 432 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 433 | "engines": { 434 | "node": ">= 0.6" 435 | } 436 | }, 437 | "node_modules/raw-body": { 438 | "version": "2.5.1", 439 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 440 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 441 | "dependencies": { 442 | "bytes": "3.1.2", 443 | "http-errors": "2.0.0", 444 | "iconv-lite": "0.4.24", 445 | "unpipe": "1.0.0" 446 | }, 447 | "engines": { 448 | "node": ">= 0.8" 449 | } 450 | }, 451 | "node_modules/safe-buffer": { 452 | "version": "5.2.1", 453 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 454 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 455 | "funding": [ 456 | { 457 | "type": "github", 458 | "url": "https://github.com/sponsors/feross" 459 | }, 460 | { 461 | "type": "patreon", 462 | "url": "https://www.patreon.com/feross" 463 | }, 464 | { 465 | "type": "consulting", 466 | "url": "https://feross.org/support" 467 | } 468 | ] 469 | }, 470 | "node_modules/safer-buffer": { 471 | "version": "2.1.2", 472 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 473 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 474 | }, 475 | "node_modules/send": { 476 | "version": "0.18.0", 477 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 478 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 479 | "dependencies": { 480 | "debug": "2.6.9", 481 | "depd": "2.0.0", 482 | "destroy": "1.2.0", 483 | "encodeurl": "~1.0.2", 484 | "escape-html": "~1.0.3", 485 | "etag": "~1.8.1", 486 | "fresh": "0.5.2", 487 | "http-errors": "2.0.0", 488 | "mime": "1.6.0", 489 | "ms": "2.1.3", 490 | "on-finished": "2.4.1", 491 | "range-parser": "~1.2.1", 492 | "statuses": "2.0.1" 493 | }, 494 | "engines": { 495 | "node": ">= 0.8.0" 496 | } 497 | }, 498 | "node_modules/send/node_modules/ms": { 499 | "version": "2.1.3", 500 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 501 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 502 | }, 503 | "node_modules/serve-static": { 504 | "version": "1.15.0", 505 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 506 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 507 | "dependencies": { 508 | "encodeurl": "~1.0.2", 509 | "escape-html": "~1.0.3", 510 | "parseurl": "~1.3.3", 511 | "send": "0.18.0" 512 | }, 513 | "engines": { 514 | "node": ">= 0.8.0" 515 | } 516 | }, 517 | "node_modules/setprototypeof": { 518 | "version": "1.2.0", 519 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 520 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 521 | }, 522 | "node_modules/side-channel": { 523 | "version": "1.0.4", 524 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 525 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 526 | "dependencies": { 527 | "call-bind": "^1.0.0", 528 | "get-intrinsic": "^1.0.2", 529 | "object-inspect": "^1.9.0" 530 | }, 531 | "funding": { 532 | "url": "https://github.com/sponsors/ljharb" 533 | } 534 | }, 535 | "node_modules/statuses": { 536 | "version": "2.0.1", 537 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 538 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 539 | "engines": { 540 | "node": ">= 0.8" 541 | } 542 | }, 543 | "node_modules/toidentifier": { 544 | "version": "1.0.1", 545 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 546 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 547 | "engines": { 548 | "node": ">=0.6" 549 | } 550 | }, 551 | "node_modules/type-is": { 552 | "version": "1.6.18", 553 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 554 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 555 | "dependencies": { 556 | "media-typer": "0.3.0", 557 | "mime-types": "~2.1.24" 558 | }, 559 | "engines": { 560 | "node": ">= 0.6" 561 | } 562 | }, 563 | "node_modules/unpipe": { 564 | "version": "1.0.0", 565 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 566 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 567 | "engines": { 568 | "node": ">= 0.8" 569 | } 570 | }, 571 | "node_modules/utils-merge": { 572 | "version": "1.0.1", 573 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 574 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 575 | "engines": { 576 | "node": ">= 0.4.0" 577 | } 578 | }, 579 | "node_modules/vary": { 580 | "version": "1.1.2", 581 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 582 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 583 | "engines": { 584 | "node": ">= 0.8" 585 | } 586 | } 587 | }, 588 | "dependencies": { 589 | "accepts": { 590 | "version": "1.3.8", 591 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 592 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 593 | "requires": { 594 | "mime-types": "~2.1.34", 595 | "negotiator": "0.6.3" 596 | } 597 | }, 598 | "array-flatten": { 599 | "version": "1.1.1", 600 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 601 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 602 | }, 603 | "body-parser": { 604 | "version": "1.20.1", 605 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 606 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 607 | "requires": { 608 | "bytes": "3.1.2", 609 | "content-type": "~1.0.4", 610 | "debug": "2.6.9", 611 | "depd": "2.0.0", 612 | "destroy": "1.2.0", 613 | "http-errors": "2.0.0", 614 | "iconv-lite": "0.4.24", 615 | "on-finished": "2.4.1", 616 | "qs": "6.11.0", 617 | "raw-body": "2.5.1", 618 | "type-is": "~1.6.18", 619 | "unpipe": "1.0.0" 620 | } 621 | }, 622 | "bytes": { 623 | "version": "3.1.2", 624 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 625 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 626 | }, 627 | "call-bind": { 628 | "version": "1.0.2", 629 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 630 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 631 | "requires": { 632 | "function-bind": "^1.1.1", 633 | "get-intrinsic": "^1.0.2" 634 | } 635 | }, 636 | "content-disposition": { 637 | "version": "0.5.4", 638 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 639 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 640 | "requires": { 641 | "safe-buffer": "5.2.1" 642 | } 643 | }, 644 | "content-type": { 645 | "version": "1.0.4", 646 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 647 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 648 | }, 649 | "cookie": { 650 | "version": "0.5.0", 651 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 652 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 653 | }, 654 | "cookie-signature": { 655 | "version": "1.0.6", 656 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 657 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 658 | }, 659 | "debug": { 660 | "version": "2.6.9", 661 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 662 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 663 | "requires": { 664 | "ms": "2.0.0" 665 | } 666 | }, 667 | "depd": { 668 | "version": "2.0.0", 669 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 670 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 671 | }, 672 | "destroy": { 673 | "version": "1.2.0", 674 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 675 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 676 | }, 677 | "ee-first": { 678 | "version": "1.1.1", 679 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 680 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 681 | }, 682 | "encodeurl": { 683 | "version": "1.0.2", 684 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 685 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 686 | }, 687 | "escape-html": { 688 | "version": "1.0.3", 689 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 690 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 691 | }, 692 | "etag": { 693 | "version": "1.8.1", 694 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 695 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 696 | }, 697 | "express": { 698 | "version": "4.18.2", 699 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 700 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 701 | "requires": { 702 | "accepts": "~1.3.8", 703 | "array-flatten": "1.1.1", 704 | "body-parser": "1.20.1", 705 | "content-disposition": "0.5.4", 706 | "content-type": "~1.0.4", 707 | "cookie": "0.5.0", 708 | "cookie-signature": "1.0.6", 709 | "debug": "2.6.9", 710 | "depd": "2.0.0", 711 | "encodeurl": "~1.0.2", 712 | "escape-html": "~1.0.3", 713 | "etag": "~1.8.1", 714 | "finalhandler": "1.2.0", 715 | "fresh": "0.5.2", 716 | "http-errors": "2.0.0", 717 | "merge-descriptors": "1.0.1", 718 | "methods": "~1.1.2", 719 | "on-finished": "2.4.1", 720 | "parseurl": "~1.3.3", 721 | "path-to-regexp": "0.1.7", 722 | "proxy-addr": "~2.0.7", 723 | "qs": "6.11.0", 724 | "range-parser": "~1.2.1", 725 | "safe-buffer": "5.2.1", 726 | "send": "0.18.0", 727 | "serve-static": "1.15.0", 728 | "setprototypeof": "1.2.0", 729 | "statuses": "2.0.1", 730 | "type-is": "~1.6.18", 731 | "utils-merge": "1.0.1", 732 | "vary": "~1.1.2" 733 | } 734 | }, 735 | "finalhandler": { 736 | "version": "1.2.0", 737 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 738 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 739 | "requires": { 740 | "debug": "2.6.9", 741 | "encodeurl": "~1.0.2", 742 | "escape-html": "~1.0.3", 743 | "on-finished": "2.4.1", 744 | "parseurl": "~1.3.3", 745 | "statuses": "2.0.1", 746 | "unpipe": "~1.0.0" 747 | } 748 | }, 749 | "forwarded": { 750 | "version": "0.2.0", 751 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 752 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 753 | }, 754 | "fresh": { 755 | "version": "0.5.2", 756 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 757 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 758 | }, 759 | "function-bind": { 760 | "version": "1.1.1", 761 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 762 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 763 | }, 764 | "get-intrinsic": { 765 | "version": "1.1.3", 766 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", 767 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", 768 | "requires": { 769 | "function-bind": "^1.1.1", 770 | "has": "^1.0.3", 771 | "has-symbols": "^1.0.3" 772 | } 773 | }, 774 | "has": { 775 | "version": "1.0.3", 776 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 777 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 778 | "requires": { 779 | "function-bind": "^1.1.1" 780 | } 781 | }, 782 | "has-symbols": { 783 | "version": "1.0.3", 784 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 785 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 786 | }, 787 | "http-errors": { 788 | "version": "2.0.0", 789 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 790 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 791 | "requires": { 792 | "depd": "2.0.0", 793 | "inherits": "2.0.4", 794 | "setprototypeof": "1.2.0", 795 | "statuses": "2.0.1", 796 | "toidentifier": "1.0.1" 797 | } 798 | }, 799 | "iconv-lite": { 800 | "version": "0.4.24", 801 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 802 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 803 | "requires": { 804 | "safer-buffer": ">= 2.1.2 < 3" 805 | } 806 | }, 807 | "inherits": { 808 | "version": "2.0.4", 809 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 810 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 811 | }, 812 | "ipaddr.js": { 813 | "version": "1.9.1", 814 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 815 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 816 | }, 817 | "media-typer": { 818 | "version": "0.3.0", 819 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 820 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 821 | }, 822 | "merge-descriptors": { 823 | "version": "1.0.1", 824 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 825 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 826 | }, 827 | "methods": { 828 | "version": "1.1.2", 829 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 830 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 831 | }, 832 | "mime": { 833 | "version": "1.6.0", 834 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 835 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 836 | }, 837 | "mime-db": { 838 | "version": "1.52.0", 839 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 840 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 841 | }, 842 | "mime-types": { 843 | "version": "2.1.35", 844 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 845 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 846 | "requires": { 847 | "mime-db": "1.52.0" 848 | } 849 | }, 850 | "ms": { 851 | "version": "2.0.0", 852 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 853 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 854 | }, 855 | "negotiator": { 856 | "version": "0.6.3", 857 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 858 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 859 | }, 860 | "object-inspect": { 861 | "version": "1.12.2", 862 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 863 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" 864 | }, 865 | "on-finished": { 866 | "version": "2.4.1", 867 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 868 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 869 | "requires": { 870 | "ee-first": "1.1.1" 871 | } 872 | }, 873 | "parseurl": { 874 | "version": "1.3.3", 875 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 876 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 877 | }, 878 | "path-to-regexp": { 879 | "version": "0.1.7", 880 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 881 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 882 | }, 883 | "proxy-addr": { 884 | "version": "2.0.7", 885 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 886 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 887 | "requires": { 888 | "forwarded": "0.2.0", 889 | "ipaddr.js": "1.9.1" 890 | } 891 | }, 892 | "qs": { 893 | "version": "6.11.0", 894 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 895 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 896 | "requires": { 897 | "side-channel": "^1.0.4" 898 | } 899 | }, 900 | "range-parser": { 901 | "version": "1.2.1", 902 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 903 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 904 | }, 905 | "raw-body": { 906 | "version": "2.5.1", 907 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 908 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 909 | "requires": { 910 | "bytes": "3.1.2", 911 | "http-errors": "2.0.0", 912 | "iconv-lite": "0.4.24", 913 | "unpipe": "1.0.0" 914 | } 915 | }, 916 | "safe-buffer": { 917 | "version": "5.2.1", 918 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 919 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 920 | }, 921 | "safer-buffer": { 922 | "version": "2.1.2", 923 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 924 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 925 | }, 926 | "send": { 927 | "version": "0.18.0", 928 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 929 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 930 | "requires": { 931 | "debug": "2.6.9", 932 | "depd": "2.0.0", 933 | "destroy": "1.2.0", 934 | "encodeurl": "~1.0.2", 935 | "escape-html": "~1.0.3", 936 | "etag": "~1.8.1", 937 | "fresh": "0.5.2", 938 | "http-errors": "2.0.0", 939 | "mime": "1.6.0", 940 | "ms": "2.1.3", 941 | "on-finished": "2.4.1", 942 | "range-parser": "~1.2.1", 943 | "statuses": "2.0.1" 944 | }, 945 | "dependencies": { 946 | "ms": { 947 | "version": "2.1.3", 948 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 949 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 950 | } 951 | } 952 | }, 953 | "serve-static": { 954 | "version": "1.15.0", 955 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 956 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 957 | "requires": { 958 | "encodeurl": "~1.0.2", 959 | "escape-html": "~1.0.3", 960 | "parseurl": "~1.3.3", 961 | "send": "0.18.0" 962 | } 963 | }, 964 | "setprototypeof": { 965 | "version": "1.2.0", 966 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 967 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 968 | }, 969 | "side-channel": { 970 | "version": "1.0.4", 971 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 972 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 973 | "requires": { 974 | "call-bind": "^1.0.0", 975 | "get-intrinsic": "^1.0.2", 976 | "object-inspect": "^1.9.0" 977 | } 978 | }, 979 | "statuses": { 980 | "version": "2.0.1", 981 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 982 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 983 | }, 984 | "toidentifier": { 985 | "version": "1.0.1", 986 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 987 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 988 | }, 989 | "type-is": { 990 | "version": "1.6.18", 991 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 992 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 993 | "requires": { 994 | "media-typer": "0.3.0", 995 | "mime-types": "~2.1.24" 996 | } 997 | }, 998 | "unpipe": { 999 | "version": "1.0.0", 1000 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1001 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1002 | }, 1003 | "utils-merge": { 1004 | "version": "1.0.1", 1005 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1006 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 1007 | }, 1008 | "vary": { 1009 | "version": "1.1.2", 1010 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1011 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1012 | } 1013 | } 1014 | } 1015 | -------------------------------------------------------------------------------- /03-promises-async-await-and-process.nextTick/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "03-promises-async-await-and-process.nextick", 3 | "version": "1.0.0", 4 | "description": "03-promises-async-await-and-process.nextTick", 5 | "scripts": { 6 | "one": "node 1-promises-microtasks.js", 7 | "two": "node 2-timers-microtasks.js", 8 | "three": "node 3-async-then.js", 9 | "four": "node 4-async-await.js", 10 | "five": "node 5-microtask-event-loop-blocked.js", 11 | "six": "node 6-timers-microtasks-nextTick.js" 12 | }, 13 | "keywords": [], 14 | "author": "Node Doctors", 15 | "license": "ISC", 16 | "dependencies": { 17 | "express": "^4.18.2" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 | 6 | 7 |

An animated guide to Node.js

8 | 9 |
10 | 11 | ### Prerequisites 12 | 13 | * `node 18.12.0` 14 | * `npm >= 6.14.15` 15 | --------------------------------------------------------------------------------