├── .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 |
--------------------------------------------------------------------------------