├── .gitignore
├── mvc-front
├── index.html
├── package-lock.json
├── package.json
├── src
│ ├── helpers.ts
│ ├── main.ts
│ ├── modules
│ │ ├── counter
│ │ │ ├── CounterController.ts
│ │ │ ├── CounterModel.ts
│ │ │ └── CounterView.ts
│ │ ├── counterTwo
│ │ │ ├── CounterTwoController.ts
│ │ │ ├── CounterTwoModel.ts
│ │ │ └── CounterTwoView.ts
│ │ └── users
│ │ │ ├── UsersModel.ts
│ │ │ ├── UsersView.ts
│ │ │ ├── user.css
│ │ │ └── usersController.ts
│ └── types
│ │ ├── controller.ts
│ │ ├── model.ts
│ │ └── view.ts
└── tsconfig.json
└── mvc-node
├── package-lock.json
├── package.json
└── src
├── domain
└── users
│ ├── controller.js
│ ├── graphql-controller.js
│ ├── model.js
│ ├── rest-controller.js
│ └── soap-controller.js
├── server.js
└── views
├── users-error.hbs
└── users.hbs
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
2 | .idea
3 |
--------------------------------------------------------------------------------
/mvc-front/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + TS
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/mvc-front/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mvc-front",
3 | "version": "1.0.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "mvc-front",
9 | "version": "1.0.0",
10 | "devDependencies": {
11 | "typescript": "^4.6.4",
12 | "vite": "^3.1.0"
13 | }
14 | },
15 | "node_modules/@esbuild/android-arm": {
16 | "version": "0.15.12",
17 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.12.tgz",
18 | "integrity": "sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==",
19 | "cpu": [
20 | "arm"
21 | ],
22 | "dev": true,
23 | "optional": true,
24 | "os": [
25 | "android"
26 | ],
27 | "engines": {
28 | "node": ">=12"
29 | }
30 | },
31 | "node_modules/@esbuild/linux-loong64": {
32 | "version": "0.15.12",
33 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz",
34 | "integrity": "sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==",
35 | "cpu": [
36 | "loong64"
37 | ],
38 | "dev": true,
39 | "optional": true,
40 | "os": [
41 | "linux"
42 | ],
43 | "engines": {
44 | "node": ">=12"
45 | }
46 | },
47 | "node_modules/esbuild": {
48 | "version": "0.15.12",
49 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.12.tgz",
50 | "integrity": "sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==",
51 | "dev": true,
52 | "hasInstallScript": true,
53 | "bin": {
54 | "esbuild": "bin/esbuild"
55 | },
56 | "engines": {
57 | "node": ">=12"
58 | },
59 | "optionalDependencies": {
60 | "@esbuild/android-arm": "0.15.12",
61 | "@esbuild/linux-loong64": "0.15.12",
62 | "esbuild-android-64": "0.15.12",
63 | "esbuild-android-arm64": "0.15.12",
64 | "esbuild-darwin-64": "0.15.12",
65 | "esbuild-darwin-arm64": "0.15.12",
66 | "esbuild-freebsd-64": "0.15.12",
67 | "esbuild-freebsd-arm64": "0.15.12",
68 | "esbuild-linux-32": "0.15.12",
69 | "esbuild-linux-64": "0.15.12",
70 | "esbuild-linux-arm": "0.15.12",
71 | "esbuild-linux-arm64": "0.15.12",
72 | "esbuild-linux-mips64le": "0.15.12",
73 | "esbuild-linux-ppc64le": "0.15.12",
74 | "esbuild-linux-riscv64": "0.15.12",
75 | "esbuild-linux-s390x": "0.15.12",
76 | "esbuild-netbsd-64": "0.15.12",
77 | "esbuild-openbsd-64": "0.15.12",
78 | "esbuild-sunos-64": "0.15.12",
79 | "esbuild-windows-32": "0.15.12",
80 | "esbuild-windows-64": "0.15.12",
81 | "esbuild-windows-arm64": "0.15.12"
82 | }
83 | },
84 | "node_modules/esbuild-android-64": {
85 | "version": "0.15.12",
86 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz",
87 | "integrity": "sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==",
88 | "cpu": [
89 | "x64"
90 | ],
91 | "dev": true,
92 | "optional": true,
93 | "os": [
94 | "android"
95 | ],
96 | "engines": {
97 | "node": ">=12"
98 | }
99 | },
100 | "node_modules/esbuild-android-arm64": {
101 | "version": "0.15.12",
102 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz",
103 | "integrity": "sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==",
104 | "cpu": [
105 | "arm64"
106 | ],
107 | "dev": true,
108 | "optional": true,
109 | "os": [
110 | "android"
111 | ],
112 | "engines": {
113 | "node": ">=12"
114 | }
115 | },
116 | "node_modules/esbuild-darwin-64": {
117 | "version": "0.15.12",
118 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz",
119 | "integrity": "sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==",
120 | "cpu": [
121 | "x64"
122 | ],
123 | "dev": true,
124 | "optional": true,
125 | "os": [
126 | "darwin"
127 | ],
128 | "engines": {
129 | "node": ">=12"
130 | }
131 | },
132 | "node_modules/esbuild-darwin-arm64": {
133 | "version": "0.15.12",
134 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz",
135 | "integrity": "sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==",
136 | "cpu": [
137 | "arm64"
138 | ],
139 | "dev": true,
140 | "optional": true,
141 | "os": [
142 | "darwin"
143 | ],
144 | "engines": {
145 | "node": ">=12"
146 | }
147 | },
148 | "node_modules/esbuild-freebsd-64": {
149 | "version": "0.15.12",
150 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz",
151 | "integrity": "sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==",
152 | "cpu": [
153 | "x64"
154 | ],
155 | "dev": true,
156 | "optional": true,
157 | "os": [
158 | "freebsd"
159 | ],
160 | "engines": {
161 | "node": ">=12"
162 | }
163 | },
164 | "node_modules/esbuild-freebsd-arm64": {
165 | "version": "0.15.12",
166 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz",
167 | "integrity": "sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==",
168 | "cpu": [
169 | "arm64"
170 | ],
171 | "dev": true,
172 | "optional": true,
173 | "os": [
174 | "freebsd"
175 | ],
176 | "engines": {
177 | "node": ">=12"
178 | }
179 | },
180 | "node_modules/esbuild-linux-32": {
181 | "version": "0.15.12",
182 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz",
183 | "integrity": "sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==",
184 | "cpu": [
185 | "ia32"
186 | ],
187 | "dev": true,
188 | "optional": true,
189 | "os": [
190 | "linux"
191 | ],
192 | "engines": {
193 | "node": ">=12"
194 | }
195 | },
196 | "node_modules/esbuild-linux-64": {
197 | "version": "0.15.12",
198 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz",
199 | "integrity": "sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==",
200 | "cpu": [
201 | "x64"
202 | ],
203 | "dev": true,
204 | "optional": true,
205 | "os": [
206 | "linux"
207 | ],
208 | "engines": {
209 | "node": ">=12"
210 | }
211 | },
212 | "node_modules/esbuild-linux-arm": {
213 | "version": "0.15.12",
214 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz",
215 | "integrity": "sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==",
216 | "cpu": [
217 | "arm"
218 | ],
219 | "dev": true,
220 | "optional": true,
221 | "os": [
222 | "linux"
223 | ],
224 | "engines": {
225 | "node": ">=12"
226 | }
227 | },
228 | "node_modules/esbuild-linux-arm64": {
229 | "version": "0.15.12",
230 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz",
231 | "integrity": "sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==",
232 | "cpu": [
233 | "arm64"
234 | ],
235 | "dev": true,
236 | "optional": true,
237 | "os": [
238 | "linux"
239 | ],
240 | "engines": {
241 | "node": ">=12"
242 | }
243 | },
244 | "node_modules/esbuild-linux-mips64le": {
245 | "version": "0.15.12",
246 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz",
247 | "integrity": "sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==",
248 | "cpu": [
249 | "mips64el"
250 | ],
251 | "dev": true,
252 | "optional": true,
253 | "os": [
254 | "linux"
255 | ],
256 | "engines": {
257 | "node": ">=12"
258 | }
259 | },
260 | "node_modules/esbuild-linux-ppc64le": {
261 | "version": "0.15.12",
262 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz",
263 | "integrity": "sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==",
264 | "cpu": [
265 | "ppc64"
266 | ],
267 | "dev": true,
268 | "optional": true,
269 | "os": [
270 | "linux"
271 | ],
272 | "engines": {
273 | "node": ">=12"
274 | }
275 | },
276 | "node_modules/esbuild-linux-riscv64": {
277 | "version": "0.15.12",
278 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz",
279 | "integrity": "sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==",
280 | "cpu": [
281 | "riscv64"
282 | ],
283 | "dev": true,
284 | "optional": true,
285 | "os": [
286 | "linux"
287 | ],
288 | "engines": {
289 | "node": ">=12"
290 | }
291 | },
292 | "node_modules/esbuild-linux-s390x": {
293 | "version": "0.15.12",
294 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz",
295 | "integrity": "sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==",
296 | "cpu": [
297 | "s390x"
298 | ],
299 | "dev": true,
300 | "optional": true,
301 | "os": [
302 | "linux"
303 | ],
304 | "engines": {
305 | "node": ">=12"
306 | }
307 | },
308 | "node_modules/esbuild-netbsd-64": {
309 | "version": "0.15.12",
310 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz",
311 | "integrity": "sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==",
312 | "cpu": [
313 | "x64"
314 | ],
315 | "dev": true,
316 | "optional": true,
317 | "os": [
318 | "netbsd"
319 | ],
320 | "engines": {
321 | "node": ">=12"
322 | }
323 | },
324 | "node_modules/esbuild-openbsd-64": {
325 | "version": "0.15.12",
326 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz",
327 | "integrity": "sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==",
328 | "cpu": [
329 | "x64"
330 | ],
331 | "dev": true,
332 | "optional": true,
333 | "os": [
334 | "openbsd"
335 | ],
336 | "engines": {
337 | "node": ">=12"
338 | }
339 | },
340 | "node_modules/esbuild-sunos-64": {
341 | "version": "0.15.12",
342 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz",
343 | "integrity": "sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==",
344 | "cpu": [
345 | "x64"
346 | ],
347 | "dev": true,
348 | "optional": true,
349 | "os": [
350 | "sunos"
351 | ],
352 | "engines": {
353 | "node": ">=12"
354 | }
355 | },
356 | "node_modules/esbuild-windows-32": {
357 | "version": "0.15.12",
358 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz",
359 | "integrity": "sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==",
360 | "cpu": [
361 | "ia32"
362 | ],
363 | "dev": true,
364 | "optional": true,
365 | "os": [
366 | "win32"
367 | ],
368 | "engines": {
369 | "node": ">=12"
370 | }
371 | },
372 | "node_modules/esbuild-windows-64": {
373 | "version": "0.15.12",
374 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz",
375 | "integrity": "sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==",
376 | "cpu": [
377 | "x64"
378 | ],
379 | "dev": true,
380 | "optional": true,
381 | "os": [
382 | "win32"
383 | ],
384 | "engines": {
385 | "node": ">=12"
386 | }
387 | },
388 | "node_modules/esbuild-windows-arm64": {
389 | "version": "0.15.12",
390 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz",
391 | "integrity": "sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==",
392 | "cpu": [
393 | "arm64"
394 | ],
395 | "dev": true,
396 | "optional": true,
397 | "os": [
398 | "win32"
399 | ],
400 | "engines": {
401 | "node": ">=12"
402 | }
403 | },
404 | "node_modules/fsevents": {
405 | "version": "2.3.2",
406 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
407 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
408 | "dev": true,
409 | "hasInstallScript": true,
410 | "optional": true,
411 | "os": [
412 | "darwin"
413 | ],
414 | "engines": {
415 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
416 | }
417 | },
418 | "node_modules/function-bind": {
419 | "version": "1.1.1",
420 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
421 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
422 | "dev": true
423 | },
424 | "node_modules/has": {
425 | "version": "1.0.3",
426 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
427 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
428 | "dev": true,
429 | "dependencies": {
430 | "function-bind": "^1.1.1"
431 | },
432 | "engines": {
433 | "node": ">= 0.4.0"
434 | }
435 | },
436 | "node_modules/is-core-module": {
437 | "version": "2.11.0",
438 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
439 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
440 | "dev": true,
441 | "dependencies": {
442 | "has": "^1.0.3"
443 | },
444 | "funding": {
445 | "url": "https://github.com/sponsors/ljharb"
446 | }
447 | },
448 | "node_modules/nanoid": {
449 | "version": "3.3.4",
450 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
451 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
452 | "dev": true,
453 | "bin": {
454 | "nanoid": "bin/nanoid.cjs"
455 | },
456 | "engines": {
457 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
458 | }
459 | },
460 | "node_modules/path-parse": {
461 | "version": "1.0.7",
462 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
463 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
464 | "dev": true
465 | },
466 | "node_modules/picocolors": {
467 | "version": "1.0.0",
468 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
469 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
470 | "dev": true
471 | },
472 | "node_modules/postcss": {
473 | "version": "8.4.18",
474 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz",
475 | "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==",
476 | "dev": true,
477 | "funding": [
478 | {
479 | "type": "opencollective",
480 | "url": "https://opencollective.com/postcss/"
481 | },
482 | {
483 | "type": "tidelift",
484 | "url": "https://tidelift.com/funding/github/npm/postcss"
485 | }
486 | ],
487 | "dependencies": {
488 | "nanoid": "^3.3.4",
489 | "picocolors": "^1.0.0",
490 | "source-map-js": "^1.0.2"
491 | },
492 | "engines": {
493 | "node": "^10 || ^12 || >=14"
494 | }
495 | },
496 | "node_modules/resolve": {
497 | "version": "1.22.1",
498 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
499 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
500 | "dev": true,
501 | "dependencies": {
502 | "is-core-module": "^2.9.0",
503 | "path-parse": "^1.0.7",
504 | "supports-preserve-symlinks-flag": "^1.0.0"
505 | },
506 | "bin": {
507 | "resolve": "bin/resolve"
508 | },
509 | "funding": {
510 | "url": "https://github.com/sponsors/ljharb"
511 | }
512 | },
513 | "node_modules/rollup": {
514 | "version": "2.79.1",
515 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
516 | "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
517 | "dev": true,
518 | "bin": {
519 | "rollup": "dist/bin/rollup"
520 | },
521 | "engines": {
522 | "node": ">=10.0.0"
523 | },
524 | "optionalDependencies": {
525 | "fsevents": "~2.3.2"
526 | }
527 | },
528 | "node_modules/source-map-js": {
529 | "version": "1.0.2",
530 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
531 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
532 | "dev": true,
533 | "engines": {
534 | "node": ">=0.10.0"
535 | }
536 | },
537 | "node_modules/supports-preserve-symlinks-flag": {
538 | "version": "1.0.0",
539 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
540 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
541 | "dev": true,
542 | "engines": {
543 | "node": ">= 0.4"
544 | },
545 | "funding": {
546 | "url": "https://github.com/sponsors/ljharb"
547 | }
548 | },
549 | "node_modules/typescript": {
550 | "version": "4.8.4",
551 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
552 | "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
553 | "dev": true,
554 | "bin": {
555 | "tsc": "bin/tsc",
556 | "tsserver": "bin/tsserver"
557 | },
558 | "engines": {
559 | "node": ">=4.2.0"
560 | }
561 | },
562 | "node_modules/vite": {
563 | "version": "3.2.2",
564 | "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.2.tgz",
565 | "integrity": "sha512-pLrhatFFOWO9kS19bQ658CnRYzv0WLbsPih6R+iFeEEhDOuYgYCX2rztUViMz/uy/V8cLCJvLFeiOK7RJEzHcw==",
566 | "dev": true,
567 | "dependencies": {
568 | "esbuild": "^0.15.9",
569 | "postcss": "^8.4.18",
570 | "resolve": "^1.22.1",
571 | "rollup": "^2.79.1"
572 | },
573 | "bin": {
574 | "vite": "bin/vite.js"
575 | },
576 | "engines": {
577 | "node": "^14.18.0 || >=16.0.0"
578 | },
579 | "optionalDependencies": {
580 | "fsevents": "~2.3.2"
581 | },
582 | "peerDependencies": {
583 | "less": "*",
584 | "sass": "*",
585 | "stylus": "*",
586 | "sugarss": "*",
587 | "terser": "^5.4.0"
588 | },
589 | "peerDependenciesMeta": {
590 | "less": {
591 | "optional": true
592 | },
593 | "sass": {
594 | "optional": true
595 | },
596 | "stylus": {
597 | "optional": true
598 | },
599 | "sugarss": {
600 | "optional": true
601 | },
602 | "terser": {
603 | "optional": true
604 | }
605 | }
606 | }
607 | },
608 | "dependencies": {
609 | "@esbuild/android-arm": {
610 | "version": "0.15.12",
611 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.12.tgz",
612 | "integrity": "sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==",
613 | "dev": true,
614 | "optional": true
615 | },
616 | "@esbuild/linux-loong64": {
617 | "version": "0.15.12",
618 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz",
619 | "integrity": "sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==",
620 | "dev": true,
621 | "optional": true
622 | },
623 | "esbuild": {
624 | "version": "0.15.12",
625 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.12.tgz",
626 | "integrity": "sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==",
627 | "dev": true,
628 | "requires": {
629 | "@esbuild/android-arm": "0.15.12",
630 | "@esbuild/linux-loong64": "0.15.12",
631 | "esbuild-android-64": "0.15.12",
632 | "esbuild-android-arm64": "0.15.12",
633 | "esbuild-darwin-64": "0.15.12",
634 | "esbuild-darwin-arm64": "0.15.12",
635 | "esbuild-freebsd-64": "0.15.12",
636 | "esbuild-freebsd-arm64": "0.15.12",
637 | "esbuild-linux-32": "0.15.12",
638 | "esbuild-linux-64": "0.15.12",
639 | "esbuild-linux-arm": "0.15.12",
640 | "esbuild-linux-arm64": "0.15.12",
641 | "esbuild-linux-mips64le": "0.15.12",
642 | "esbuild-linux-ppc64le": "0.15.12",
643 | "esbuild-linux-riscv64": "0.15.12",
644 | "esbuild-linux-s390x": "0.15.12",
645 | "esbuild-netbsd-64": "0.15.12",
646 | "esbuild-openbsd-64": "0.15.12",
647 | "esbuild-sunos-64": "0.15.12",
648 | "esbuild-windows-32": "0.15.12",
649 | "esbuild-windows-64": "0.15.12",
650 | "esbuild-windows-arm64": "0.15.12"
651 | }
652 | },
653 | "esbuild-android-64": {
654 | "version": "0.15.12",
655 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz",
656 | "integrity": "sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==",
657 | "dev": true,
658 | "optional": true
659 | },
660 | "esbuild-android-arm64": {
661 | "version": "0.15.12",
662 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz",
663 | "integrity": "sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==",
664 | "dev": true,
665 | "optional": true
666 | },
667 | "esbuild-darwin-64": {
668 | "version": "0.15.12",
669 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz",
670 | "integrity": "sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==",
671 | "dev": true,
672 | "optional": true
673 | },
674 | "esbuild-darwin-arm64": {
675 | "version": "0.15.12",
676 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz",
677 | "integrity": "sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==",
678 | "dev": true,
679 | "optional": true
680 | },
681 | "esbuild-freebsd-64": {
682 | "version": "0.15.12",
683 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz",
684 | "integrity": "sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==",
685 | "dev": true,
686 | "optional": true
687 | },
688 | "esbuild-freebsd-arm64": {
689 | "version": "0.15.12",
690 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz",
691 | "integrity": "sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==",
692 | "dev": true,
693 | "optional": true
694 | },
695 | "esbuild-linux-32": {
696 | "version": "0.15.12",
697 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz",
698 | "integrity": "sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==",
699 | "dev": true,
700 | "optional": true
701 | },
702 | "esbuild-linux-64": {
703 | "version": "0.15.12",
704 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz",
705 | "integrity": "sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==",
706 | "dev": true,
707 | "optional": true
708 | },
709 | "esbuild-linux-arm": {
710 | "version": "0.15.12",
711 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz",
712 | "integrity": "sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==",
713 | "dev": true,
714 | "optional": true
715 | },
716 | "esbuild-linux-arm64": {
717 | "version": "0.15.12",
718 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz",
719 | "integrity": "sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==",
720 | "dev": true,
721 | "optional": true
722 | },
723 | "esbuild-linux-mips64le": {
724 | "version": "0.15.12",
725 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz",
726 | "integrity": "sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==",
727 | "dev": true,
728 | "optional": true
729 | },
730 | "esbuild-linux-ppc64le": {
731 | "version": "0.15.12",
732 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz",
733 | "integrity": "sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==",
734 | "dev": true,
735 | "optional": true
736 | },
737 | "esbuild-linux-riscv64": {
738 | "version": "0.15.12",
739 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz",
740 | "integrity": "sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==",
741 | "dev": true,
742 | "optional": true
743 | },
744 | "esbuild-linux-s390x": {
745 | "version": "0.15.12",
746 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz",
747 | "integrity": "sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==",
748 | "dev": true,
749 | "optional": true
750 | },
751 | "esbuild-netbsd-64": {
752 | "version": "0.15.12",
753 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz",
754 | "integrity": "sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==",
755 | "dev": true,
756 | "optional": true
757 | },
758 | "esbuild-openbsd-64": {
759 | "version": "0.15.12",
760 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz",
761 | "integrity": "sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==",
762 | "dev": true,
763 | "optional": true
764 | },
765 | "esbuild-sunos-64": {
766 | "version": "0.15.12",
767 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz",
768 | "integrity": "sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==",
769 | "dev": true,
770 | "optional": true
771 | },
772 | "esbuild-windows-32": {
773 | "version": "0.15.12",
774 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz",
775 | "integrity": "sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==",
776 | "dev": true,
777 | "optional": true
778 | },
779 | "esbuild-windows-64": {
780 | "version": "0.15.12",
781 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz",
782 | "integrity": "sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==",
783 | "dev": true,
784 | "optional": true
785 | },
786 | "esbuild-windows-arm64": {
787 | "version": "0.15.12",
788 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz",
789 | "integrity": "sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==",
790 | "dev": true,
791 | "optional": true
792 | },
793 | "fsevents": {
794 | "version": "2.3.2",
795 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
796 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
797 | "dev": true,
798 | "optional": true
799 | },
800 | "function-bind": {
801 | "version": "1.1.1",
802 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
803 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
804 | "dev": true
805 | },
806 | "has": {
807 | "version": "1.0.3",
808 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
809 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
810 | "dev": true,
811 | "requires": {
812 | "function-bind": "^1.1.1"
813 | }
814 | },
815 | "is-core-module": {
816 | "version": "2.11.0",
817 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
818 | "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
819 | "dev": true,
820 | "requires": {
821 | "has": "^1.0.3"
822 | }
823 | },
824 | "nanoid": {
825 | "version": "3.3.4",
826 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
827 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
828 | "dev": true
829 | },
830 | "path-parse": {
831 | "version": "1.0.7",
832 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
833 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
834 | "dev": true
835 | },
836 | "picocolors": {
837 | "version": "1.0.0",
838 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
839 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
840 | "dev": true
841 | },
842 | "postcss": {
843 | "version": "8.4.18",
844 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz",
845 | "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==",
846 | "dev": true,
847 | "requires": {
848 | "nanoid": "^3.3.4",
849 | "picocolors": "^1.0.0",
850 | "source-map-js": "^1.0.2"
851 | }
852 | },
853 | "resolve": {
854 | "version": "1.22.1",
855 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
856 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
857 | "dev": true,
858 | "requires": {
859 | "is-core-module": "^2.9.0",
860 | "path-parse": "^1.0.7",
861 | "supports-preserve-symlinks-flag": "^1.0.0"
862 | }
863 | },
864 | "rollup": {
865 | "version": "2.79.1",
866 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
867 | "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
868 | "dev": true,
869 | "requires": {
870 | "fsevents": "~2.3.2"
871 | }
872 | },
873 | "source-map-js": {
874 | "version": "1.0.2",
875 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
876 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
877 | "dev": true
878 | },
879 | "supports-preserve-symlinks-flag": {
880 | "version": "1.0.0",
881 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
882 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
883 | "dev": true
884 | },
885 | "typescript": {
886 | "version": "4.8.4",
887 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
888 | "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
889 | "dev": true
890 | },
891 | "vite": {
892 | "version": "3.2.2",
893 | "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.2.tgz",
894 | "integrity": "sha512-pLrhatFFOWO9kS19bQ658CnRYzv0WLbsPih6R+iFeEEhDOuYgYCX2rztUViMz/uy/V8cLCJvLFeiOK7RJEzHcw==",
895 | "dev": true,
896 | "requires": {
897 | "esbuild": "^0.15.9",
898 | "fsevents": "~2.3.2",
899 | "postcss": "^8.4.18",
900 | "resolve": "^1.22.1",
901 | "rollup": "^2.79.1"
902 | }
903 | }
904 | }
905 | }
906 |
--------------------------------------------------------------------------------
/mvc-front/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mvc-front",
3 | "version": "1.0.0",
4 | "description": "",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "tsc && vite build",
9 | "preview": "vite preview"
10 | },
11 | "devDependencies": {
12 | "typescript": "^4.6.4",
13 | "vite": "^3.1.0"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/mvc-front/src/helpers.ts:
--------------------------------------------------------------------------------
1 | export function delay(ms: number = 1000) {
2 | return new Promise(res => {
3 | setTimeout(res, ms)
4 | })
5 | }
6 |
--------------------------------------------------------------------------------
/mvc-front/src/main.ts:
--------------------------------------------------------------------------------
1 | import {CounterTwoView} from "./modules/counterTwo/CounterTwoView";
2 | import {UsersView} from "./modules/users/UsersView";
3 | import {UsersController} from "./modules/users/usersController";
4 | import {UsersModel} from "./modules/users/UsersModel";
5 |
6 | const counterView = new CounterTwoView(document.getElementById('counter1')!)
7 |
8 | counterView.mount();
9 |
10 | const usersModel = new UsersModel();
11 | const usersController = new UsersController(usersModel)
12 | const usersView = new UsersView(
13 | document.getElementById('users')!,
14 | usersController
15 | )
16 |
17 | usersView.mount();
18 |
--------------------------------------------------------------------------------
/mvc-front/src/modules/counter/CounterController.ts:
--------------------------------------------------------------------------------
1 | import {CounterModel} from "./CounterModel";
2 |
3 | export class CounterController {
4 | model: CounterModel;
5 |
6 | constructor(model: CounterModel) {
7 | this.model = model
8 | }
9 |
10 | handleIncrement() {
11 | console.log('increment', this.model)
12 | this.model.increment();
13 | }
14 |
15 | handleDecrement() {
16 | console.log('handleDecrement')
17 | this.model.decrement();
18 | }
19 |
20 | handleMultiply() {
21 | console.log('handleMultiply')
22 | this.model.multipleAndDivide();
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/mvc-front/src/modules/counter/CounterModel.ts:
--------------------------------------------------------------------------------
1 | import {CounterView} from "./CounterView";
2 |
3 | export class CounterModel {
4 | view: CounterView;
5 | value: number;
6 |
7 | constructor(view: CounterView) {
8 | this.value = 0;
9 | this.view = view;
10 | }
11 |
12 | increment() {
13 | this.value += 1;
14 | this.view.updateTitle()
15 | }
16 |
17 | decrement() {
18 | this.value -= 1;
19 | this.view.updateTitle()
20 | }
21 |
22 | multipleAndDivide() {
23 | this.value *= 5;
24 | this.value /= 3;
25 | this.value = Math.ceil(this.value);
26 | this.view.updateTitle()
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/mvc-front/src/modules/counter/CounterView.ts:
--------------------------------------------------------------------------------
1 | import {CounterController} from "./CounterController";
2 | import {CounterModel} from "./CounterModel";
3 |
4 | export class CounterView {
5 | controller: CounterController;
6 | model: CounterModel;
7 | root: HTMLElement;
8 |
9 | private title: HTMLElement;
10 | private incrementButton: HTMLElement;
11 | private decrementButton: HTMLElement;
12 | private multipleButton: HTMLElement;
13 |
14 | constructor(root: HTMLElement) {
15 | this.root = root;
16 | this.model = new CounterModel(this);
17 | this.controller = new CounterController(this.model);
18 |
19 | this.title = document.createElement('h1');
20 | this.title.innerText = 'Value = 0';
21 |
22 | this.incrementButton = document.createElement('button');
23 | this.incrementButton.innerText = 'increment';
24 | this.decrementButton = document.createElement('button');
25 | this.decrementButton.innerText = 'decrement';
26 | this.multipleButton = document.createElement('button');
27 | this.multipleButton.innerText = 'multiply';
28 |
29 | this.bindListeners();
30 | }
31 |
32 | private bindListeners() {
33 | this.incrementButton.addEventListener('click', this.controller.handleIncrement.bind(this));
34 | this.decrementButton.addEventListener('click', this.controller.handleDecrement.bind(this));
35 | this.multipleButton.addEventListener('click', this.controller.handleMultiply.bind(this));
36 | }
37 |
38 | public updateTitle() {
39 | this.title.innerText = `Value = ${this.model.value}`;
40 | }
41 |
42 | public render() {
43 | this.root.appendChild(this.title);
44 | this.root.appendChild(this.incrementButton);
45 | this.root.appendChild(this.decrementButton);
46 | this.root.appendChild(this.multipleButton);
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/mvc-front/src/modules/counterTwo/CounterTwoController.ts:
--------------------------------------------------------------------------------
1 | import {CounterTwoModel} from "./CounterTwoModel";
2 | import {Controller} from "../../types/controller";
3 |
4 | export class CounterTwoController implements Controller {
5 | model: CounterTwoModel;
6 |
7 | constructor() {
8 | this.model = new CounterTwoModel();
9 | }
10 |
11 | handleIncrement() {
12 | console.log('increment', this.model)
13 | return this.model.increment();
14 | }
15 |
16 | handleDecrement() {
17 | console.log('handleDecrement')
18 | return this.model.decrement();
19 | }
20 |
21 | handleMultiply() {
22 | console.log('handleMultiply')
23 | return this.model.multipleAndDivide();
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/mvc-front/src/modules/counterTwo/CounterTwoModel.ts:
--------------------------------------------------------------------------------
1 | import {Model} from "../../types/model";
2 |
3 | export class CounterTwoModel implements Model {
4 | value: number;
5 |
6 | constructor() {
7 | this.value = 0;
8 | }
9 |
10 | increment() {
11 | this.value += 1;
12 | return this.value;
13 | }
14 |
15 | decrement() {
16 | this.value -= 1;
17 | return this.value;
18 | }
19 |
20 | multipleAndDivide() {
21 | this.value *= 5;
22 | this.value /= 3;
23 | this.value = Math.ceil(this.value);
24 | return this.value;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/mvc-front/src/modules/counterTwo/CounterTwoView.ts:
--------------------------------------------------------------------------------
1 | import {CounterTwoController} from "./CounterTwoController";
2 | import {View} from '../../types/view'
3 |
4 | export class CounterTwoView implements View {
5 | controller: CounterTwoController;
6 | root: HTMLElement;
7 |
8 | private title: HTMLElement;
9 | private incrementButton: HTMLElement;
10 | private decrementButton: HTMLElement;
11 | private multipleButton: HTMLElement;
12 |
13 | constructor(root: HTMLElement) {
14 | this.root = root;
15 | this.controller = new CounterTwoController();
16 |
17 | this.title = document.createElement('h1');
18 | this.title.innerText = 'Value = 0';
19 |
20 | this.incrementButton = document.createElement('button');
21 | this.incrementButton.innerText = 'increment';
22 | this.decrementButton = document.createElement('button');
23 | this.decrementButton.innerText = 'decrement';
24 | this.multipleButton = document.createElement('button');
25 | this.multipleButton.innerText = 'multiply';
26 |
27 | this.bindListeners();
28 | }
29 |
30 | private onIncrementClick = () => {
31 | this.updateTitle(this.controller.handleIncrement())
32 | }
33 |
34 | private onDecrementClick = () => {
35 | this.updateTitle(this.controller.handleDecrement())
36 | }
37 |
38 | private onMultiplyClick = () => {
39 | this.updateTitle(this.controller.handleMultiply())
40 | }
41 |
42 | private bindListeners() {
43 | this.incrementButton.addEventListener('click', this.onIncrementClick);
44 | this.decrementButton.addEventListener('click', this.onDecrementClick);
45 | this.multipleButton.addEventListener('click', this.onMultiplyClick);
46 | }
47 |
48 | public updateTitle(value: number) {
49 | this.title.innerText = `Value = ${value}`;
50 | }
51 |
52 | public mount() {
53 | this.root.appendChild(this.title);
54 | this.root.appendChild(this.incrementButton);
55 | this.root.appendChild(this.decrementButton);
56 | this.root.appendChild(this.multipleButton);
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/mvc-front/src/modules/users/UsersModel.ts:
--------------------------------------------------------------------------------
1 | import {delay} from "../../helpers";
2 |
3 | export interface User {
4 | id: string;
5 | username: string;
6 | age: number;
7 | createdAt: string;
8 | }
9 |
10 | export type SortOrder = 'asc' | 'desc';
11 | export type SortField = 'age' | 'username';
12 |
13 | export class UsersModel {
14 | users: User[];
15 | searchValue: string;
16 | sortOrder: SortOrder;
17 | sortField: SortField;
18 |
19 | constructor() {
20 | this.users = [];
21 | this.searchValue = '';
22 | this.sortOrder = 'asc';
23 | this.sortField = 'username';
24 | }
25 |
26 | async fetchUsers(): Promise {
27 | try {
28 |
29 | return this.users;
30 | } catch (e) {
31 | this.users = [];
32 | return [];
33 | }
34 | }
35 |
36 | createUser(username: string, age: number) {
37 | if(this.users.find(user => user.username === username)) {
38 | throw Error('Пользователь уже существует')
39 | }
40 |
41 | const newUser: User = {
42 | id: String(Math.random()),
43 | username,
44 | age,
45 | createdAt: Date.now().toString(),
46 | }
47 |
48 | this.users.push(newUser)
49 | return newUser;
50 | }
51 |
52 | sortUsers(field: SortField, order: SortOrder) {
53 | const sortedUsers = [...this.users.sort((a, b) => {
54 | if(order === "asc") {
55 | return a[field] > b[field] ? 1 : -1;
56 | }
57 | return a[field] < b[field] ? 1 : -1;
58 | })]
59 |
60 | this.users = sortedUsers;
61 |
62 | return sortedUsers;
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/mvc-front/src/modules/users/UsersView.ts:
--------------------------------------------------------------------------------
1 | import {UsersController} from "./usersController";
2 | import {SortField, SortOrder, User} from "./UsersModel";
3 | import './user.css';
4 |
5 | export class UsersView {
6 | controller: UsersController;
7 | root: HTMLElement;
8 |
9 | private form: HTMLDivElement;
10 | private users: HTMLElement;
11 | private usernameInput: HTMLInputElement;
12 | private ageInput: HTMLInputElement;
13 | private createButton: HTMLButtonElement;
14 |
15 | private sortSelectors: HTMLDivElement;
16 | private fieldSelect: HTMLSelectElement;
17 | private orderSelect: HTMLSelectElement;
18 | private sortButton: HTMLButtonElement;
19 |
20 | constructor(root: HTMLElement, controller: UsersController) {
21 | this.root = root;
22 | this.controller = controller;
23 |
24 |
25 | this.createUserForm()
26 | this.createSortSelectors()
27 | this.createUsersList();
28 |
29 | this.bindListeners();
30 |
31 | }
32 |
33 | private onCreateClick = () => {
34 | try {
35 | const newUser = this.controller.handleCreate(this.usernameInput.value, Number(this.ageInput.value))
36 | this.renderNewUser(newUser);
37 | } catch (e) {
38 | this.showError((e as Error).message)
39 | }
40 | }
41 |
42 | private onSortClick = () => {
43 | const newUsers = this.controller.handleSort(this.fieldSelect.value as SortField, this.orderSelect.value as SortOrder)
44 | this.renderUsers(newUsers);
45 | }
46 |
47 | private bindListeners() {
48 | this.createButton.addEventListener('click', this.onCreateClick)
49 | this.sortButton.addEventListener('click', this.onSortClick)
50 | }
51 |
52 | private showError(message: string) {
53 | alert(message);
54 | }
55 |
56 | private getUserElement(user: User) {
57 | return `
58 |
59 |
Username = ${user.username}
60 | Age = ${user.age}
61 |
62 | `
63 | }
64 |
65 | private renderNewUser(user: User) {
66 | const userNode = document.createElement('div');
67 | userNode.innerHTML = this.getUserElement(user);
68 |
69 | this.users.appendChild(userNode)
70 | }
71 |
72 | private renderUsers(users: User[]) {
73 | const usersElements = users.map(user => {
74 | return this.getUserElement(user);
75 | })
76 |
77 | this.users.innerHTML = usersElements.join('')
78 | }
79 |
80 | private createUsersList() {
81 | this.users = document.createElement('div');
82 | }
83 |
84 | private createSortSelectors() {
85 | this.sortSelectors = document.createElement('div');
86 |
87 | this.fieldSelect = document.createElement('select');
88 | const usernameOption = document.createElement('option');
89 | usernameOption.value = 'username';
90 | usernameOption.innerText = 'Имя пользователя';
91 | const ageOption = document.createElement('option');
92 | ageOption.value = 'age';
93 | ageOption.innerText = 'Возраст';
94 |
95 | this.fieldSelect.add(usernameOption);
96 | this.fieldSelect.add(ageOption);
97 |
98 | this.orderSelect = document.createElement('select');
99 | const ascOption = document.createElement('option');
100 | ascOption.value = 'asc';
101 | ascOption.innerText = 'По возрастанию';
102 | const descOption = document.createElement('option');
103 | descOption.value = 'desc';
104 | descOption.innerText = 'по убыванию';
105 |
106 | this.orderSelect.add(ascOption);
107 | this.orderSelect.add(descOption);
108 |
109 | this.sortButton = document.createElement('button');
110 | this.sortButton.innerText = 'сортировать';
111 |
112 | this.sortSelectors.appendChild(this.fieldSelect)
113 | this.sortSelectors.appendChild(this.orderSelect)
114 | this.sortSelectors.appendChild(this.sortButton)
115 | }
116 |
117 | private createUserForm() {
118 | this.form = document.createElement('div');
119 | this.usernameInput = document.createElement('input');
120 | this.usernameInput.placeholder = 'Введите имя пользователя'
121 | this.ageInput = document.createElement('input');
122 | this.ageInput.placeholder = 'Введите возраст'
123 | this.createButton = document.createElement('button');
124 | this.createButton.innerText = 'Создать'
125 | this.form.appendChild(this.usernameInput)
126 | this.form.appendChild(this.ageInput)
127 | this.form.appendChild(this.createButton)
128 | }
129 |
130 | public mount() {
131 | this.root.innerHTML = `
132 | Пользователи
133 | `
134 | this.root.appendChild(this.sortSelectors)
135 | this.root.appendChild(this.form)
136 | this.root.appendChild(this.users)
137 | }
138 | }
139 |
--------------------------------------------------------------------------------
/mvc-front/src/modules/users/user.css:
--------------------------------------------------------------------------------
1 | .user {
2 | padding: 15px;
3 | border: 1px solid gray;
4 | margin-top: 15px;
5 | }
6 |
--------------------------------------------------------------------------------
/mvc-front/src/modules/users/usersController.ts:
--------------------------------------------------------------------------------
1 | import {SortField, SortOrder, UsersModel} from "./UsersModel";
2 |
3 | export class UsersController {
4 | model: UsersModel;
5 |
6 | constructor(model: UsersModel) {
7 | this.model = model
8 | }
9 |
10 | public handleCreate(username: string, age: number) {
11 | console.log('handleCreate')
12 | if(!username || !age) {
13 | throw Error('Укажите username и age');
14 | }
15 | return this.model.createUser(username, age);
16 | }
17 |
18 | public handleSort(field: SortField, order: SortOrder) {
19 | console.log('handleSort')
20 | if(!field) {
21 | throw Error('Укажите поле сортировки');
22 | }
23 | return this.model.sortUsers(field, order);
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/mvc-front/src/types/controller.ts:
--------------------------------------------------------------------------------
1 | import {Model} from "./model";
2 |
3 | export interface Controller {
4 | model: Model;
5 | }
6 |
--------------------------------------------------------------------------------
/mvc-front/src/types/model.ts:
--------------------------------------------------------------------------------
1 | export interface Model {}
2 |
--------------------------------------------------------------------------------
/mvc-front/src/types/view.ts:
--------------------------------------------------------------------------------
1 | import {Controller} from "./controller";
2 |
3 | export interface View {
4 | mount: () => void;
5 | controller: Controller;
6 | }
7 |
--------------------------------------------------------------------------------
/mvc-front/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ESNext",
4 | "useDefineForClassFields": true,
5 | "module": "ESNext",
6 | "lib": ["ESNext", "DOM"],
7 | "moduleResolution": "Node",
8 | "strict": true,
9 | "sourceMap": true,
10 | "resolveJsonModule": true,
11 | "isolatedModules": true,
12 | "esModuleInterop": true,
13 | "noEmit": true,
14 | "noUnusedLocals": true,
15 | "noUnusedParameters": true,
16 | "noImplicitReturns": true,
17 | "skipLibCheck": true,
18 | "strictPropertyInitialization": false
19 | },
20 | "include": ["src"]
21 | }
22 |
--------------------------------------------------------------------------------
/mvc-node/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mvc-node",
3 | "version": "1.0.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "mvc-node",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "express": "^4.18.2",
13 | "hbs": "^4.2.0",
14 | "nodemon": "^2.0.20"
15 | }
16 | },
17 | "node_modules/abbrev": {
18 | "version": "1.1.1",
19 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
20 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
21 | },
22 | "node_modules/accepts": {
23 | "version": "1.3.8",
24 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
25 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
26 | "dependencies": {
27 | "mime-types": "~2.1.34",
28 | "negotiator": "0.6.3"
29 | },
30 | "engines": {
31 | "node": ">= 0.6"
32 | }
33 | },
34 | "node_modules/anymatch": {
35 | "version": "3.1.2",
36 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
37 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
38 | "dependencies": {
39 | "normalize-path": "^3.0.0",
40 | "picomatch": "^2.0.4"
41 | },
42 | "engines": {
43 | "node": ">= 8"
44 | }
45 | },
46 | "node_modules/array-flatten": {
47 | "version": "1.1.1",
48 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
49 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
50 | },
51 | "node_modules/balanced-match": {
52 | "version": "1.0.2",
53 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
54 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
55 | },
56 | "node_modules/binary-extensions": {
57 | "version": "2.2.0",
58 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
59 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
60 | "engines": {
61 | "node": ">=8"
62 | }
63 | },
64 | "node_modules/body-parser": {
65 | "version": "1.20.1",
66 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
67 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
68 | "dependencies": {
69 | "bytes": "3.1.2",
70 | "content-type": "~1.0.4",
71 | "debug": "2.6.9",
72 | "depd": "2.0.0",
73 | "destroy": "1.2.0",
74 | "http-errors": "2.0.0",
75 | "iconv-lite": "0.4.24",
76 | "on-finished": "2.4.1",
77 | "qs": "6.11.0",
78 | "raw-body": "2.5.1",
79 | "type-is": "~1.6.18",
80 | "unpipe": "1.0.0"
81 | },
82 | "engines": {
83 | "node": ">= 0.8",
84 | "npm": "1.2.8000 || >= 1.4.16"
85 | }
86 | },
87 | "node_modules/brace-expansion": {
88 | "version": "1.1.11",
89 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
90 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
91 | "dependencies": {
92 | "balanced-match": "^1.0.0",
93 | "concat-map": "0.0.1"
94 | }
95 | },
96 | "node_modules/braces": {
97 | "version": "3.0.2",
98 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
99 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
100 | "dependencies": {
101 | "fill-range": "^7.0.1"
102 | },
103 | "engines": {
104 | "node": ">=8"
105 | }
106 | },
107 | "node_modules/bytes": {
108 | "version": "3.1.2",
109 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
110 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
111 | "engines": {
112 | "node": ">= 0.8"
113 | }
114 | },
115 | "node_modules/call-bind": {
116 | "version": "1.0.2",
117 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
118 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
119 | "dependencies": {
120 | "function-bind": "^1.1.1",
121 | "get-intrinsic": "^1.0.2"
122 | },
123 | "funding": {
124 | "url": "https://github.com/sponsors/ljharb"
125 | }
126 | },
127 | "node_modules/chokidar": {
128 | "version": "3.5.3",
129 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
130 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
131 | "funding": [
132 | {
133 | "type": "individual",
134 | "url": "https://paulmillr.com/funding/"
135 | }
136 | ],
137 | "dependencies": {
138 | "anymatch": "~3.1.2",
139 | "braces": "~3.0.2",
140 | "glob-parent": "~5.1.2",
141 | "is-binary-path": "~2.1.0",
142 | "is-glob": "~4.0.1",
143 | "normalize-path": "~3.0.0",
144 | "readdirp": "~3.6.0"
145 | },
146 | "engines": {
147 | "node": ">= 8.10.0"
148 | },
149 | "optionalDependencies": {
150 | "fsevents": "~2.3.2"
151 | }
152 | },
153 | "node_modules/concat-map": {
154 | "version": "0.0.1",
155 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
156 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
157 | },
158 | "node_modules/content-disposition": {
159 | "version": "0.5.4",
160 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
161 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
162 | "dependencies": {
163 | "safe-buffer": "5.2.1"
164 | },
165 | "engines": {
166 | "node": ">= 0.6"
167 | }
168 | },
169 | "node_modules/content-type": {
170 | "version": "1.0.4",
171 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
172 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
173 | "engines": {
174 | "node": ">= 0.6"
175 | }
176 | },
177 | "node_modules/cookie": {
178 | "version": "0.5.0",
179 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
180 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
181 | "engines": {
182 | "node": ">= 0.6"
183 | }
184 | },
185 | "node_modules/cookie-signature": {
186 | "version": "1.0.6",
187 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
188 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
189 | },
190 | "node_modules/debug": {
191 | "version": "2.6.9",
192 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
193 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
194 | "dependencies": {
195 | "ms": "2.0.0"
196 | }
197 | },
198 | "node_modules/depd": {
199 | "version": "2.0.0",
200 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
201 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
202 | "engines": {
203 | "node": ">= 0.8"
204 | }
205 | },
206 | "node_modules/destroy": {
207 | "version": "1.2.0",
208 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
209 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
210 | "engines": {
211 | "node": ">= 0.8",
212 | "npm": "1.2.8000 || >= 1.4.16"
213 | }
214 | },
215 | "node_modules/ee-first": {
216 | "version": "1.1.1",
217 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
218 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
219 | },
220 | "node_modules/encodeurl": {
221 | "version": "1.0.2",
222 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
223 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
224 | "engines": {
225 | "node": ">= 0.8"
226 | }
227 | },
228 | "node_modules/escape-html": {
229 | "version": "1.0.3",
230 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
231 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
232 | },
233 | "node_modules/etag": {
234 | "version": "1.8.1",
235 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
236 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
237 | "engines": {
238 | "node": ">= 0.6"
239 | }
240 | },
241 | "node_modules/express": {
242 | "version": "4.18.2",
243 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
244 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
245 | "dependencies": {
246 | "accepts": "~1.3.8",
247 | "array-flatten": "1.1.1",
248 | "body-parser": "1.20.1",
249 | "content-disposition": "0.5.4",
250 | "content-type": "~1.0.4",
251 | "cookie": "0.5.0",
252 | "cookie-signature": "1.0.6",
253 | "debug": "2.6.9",
254 | "depd": "2.0.0",
255 | "encodeurl": "~1.0.2",
256 | "escape-html": "~1.0.3",
257 | "etag": "~1.8.1",
258 | "finalhandler": "1.2.0",
259 | "fresh": "0.5.2",
260 | "http-errors": "2.0.0",
261 | "merge-descriptors": "1.0.1",
262 | "methods": "~1.1.2",
263 | "on-finished": "2.4.1",
264 | "parseurl": "~1.3.3",
265 | "path-to-regexp": "0.1.7",
266 | "proxy-addr": "~2.0.7",
267 | "qs": "6.11.0",
268 | "range-parser": "~1.2.1",
269 | "safe-buffer": "5.2.1",
270 | "send": "0.18.0",
271 | "serve-static": "1.15.0",
272 | "setprototypeof": "1.2.0",
273 | "statuses": "2.0.1",
274 | "type-is": "~1.6.18",
275 | "utils-merge": "1.0.1",
276 | "vary": "~1.1.2"
277 | },
278 | "engines": {
279 | "node": ">= 0.10.0"
280 | }
281 | },
282 | "node_modules/fill-range": {
283 | "version": "7.0.1",
284 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
285 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
286 | "dependencies": {
287 | "to-regex-range": "^5.0.1"
288 | },
289 | "engines": {
290 | "node": ">=8"
291 | }
292 | },
293 | "node_modules/finalhandler": {
294 | "version": "1.2.0",
295 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
296 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
297 | "dependencies": {
298 | "debug": "2.6.9",
299 | "encodeurl": "~1.0.2",
300 | "escape-html": "~1.0.3",
301 | "on-finished": "2.4.1",
302 | "parseurl": "~1.3.3",
303 | "statuses": "2.0.1",
304 | "unpipe": "~1.0.0"
305 | },
306 | "engines": {
307 | "node": ">= 0.8"
308 | }
309 | },
310 | "node_modules/foreachasync": {
311 | "version": "3.0.0",
312 | "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz",
313 | "integrity": "sha512-J+ler7Ta54FwwNcx6wQRDhTIbNeyDcARMkOcguEqnEdtm0jKvN3Li3PDAb2Du3ubJYEWfYL83XMROXdsXAXycw=="
314 | },
315 | "node_modules/forwarded": {
316 | "version": "0.2.0",
317 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
318 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
319 | "engines": {
320 | "node": ">= 0.6"
321 | }
322 | },
323 | "node_modules/fresh": {
324 | "version": "0.5.2",
325 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
326 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
327 | "engines": {
328 | "node": ">= 0.6"
329 | }
330 | },
331 | "node_modules/fsevents": {
332 | "version": "2.3.2",
333 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
334 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
335 | "hasInstallScript": true,
336 | "optional": true,
337 | "os": [
338 | "darwin"
339 | ],
340 | "engines": {
341 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
342 | }
343 | },
344 | "node_modules/function-bind": {
345 | "version": "1.1.1",
346 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
347 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
348 | },
349 | "node_modules/get-intrinsic": {
350 | "version": "1.1.3",
351 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
352 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
353 | "dependencies": {
354 | "function-bind": "^1.1.1",
355 | "has": "^1.0.3",
356 | "has-symbols": "^1.0.3"
357 | },
358 | "funding": {
359 | "url": "https://github.com/sponsors/ljharb"
360 | }
361 | },
362 | "node_modules/glob-parent": {
363 | "version": "5.1.2",
364 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
365 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
366 | "dependencies": {
367 | "is-glob": "^4.0.1"
368 | },
369 | "engines": {
370 | "node": ">= 6"
371 | }
372 | },
373 | "node_modules/handlebars": {
374 | "version": "4.7.7",
375 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
376 | "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
377 | "dependencies": {
378 | "minimist": "^1.2.5",
379 | "neo-async": "^2.6.0",
380 | "source-map": "^0.6.1",
381 | "wordwrap": "^1.0.0"
382 | },
383 | "bin": {
384 | "handlebars": "bin/handlebars"
385 | },
386 | "engines": {
387 | "node": ">=0.4.7"
388 | },
389 | "optionalDependencies": {
390 | "uglify-js": "^3.1.4"
391 | }
392 | },
393 | "node_modules/has": {
394 | "version": "1.0.3",
395 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
396 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
397 | "dependencies": {
398 | "function-bind": "^1.1.1"
399 | },
400 | "engines": {
401 | "node": ">= 0.4.0"
402 | }
403 | },
404 | "node_modules/has-flag": {
405 | "version": "3.0.0",
406 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
407 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
408 | "engines": {
409 | "node": ">=4"
410 | }
411 | },
412 | "node_modules/has-symbols": {
413 | "version": "1.0.3",
414 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
415 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
416 | "engines": {
417 | "node": ">= 0.4"
418 | },
419 | "funding": {
420 | "url": "https://github.com/sponsors/ljharb"
421 | }
422 | },
423 | "node_modules/hbs": {
424 | "version": "4.2.0",
425 | "resolved": "https://registry.npmjs.org/hbs/-/hbs-4.2.0.tgz",
426 | "integrity": "sha512-dQwHnrfWlTk5PvG9+a45GYpg0VpX47ryKF8dULVd6DtwOE6TEcYQXQ5QM6nyOx/h7v3bvEQbdn19EDAcfUAgZg==",
427 | "dependencies": {
428 | "handlebars": "4.7.7",
429 | "walk": "2.3.15"
430 | },
431 | "engines": {
432 | "node": ">= 0.8",
433 | "npm": "1.2.8000 || >= 1.4.16"
434 | }
435 | },
436 | "node_modules/http-errors": {
437 | "version": "2.0.0",
438 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
439 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
440 | "dependencies": {
441 | "depd": "2.0.0",
442 | "inherits": "2.0.4",
443 | "setprototypeof": "1.2.0",
444 | "statuses": "2.0.1",
445 | "toidentifier": "1.0.1"
446 | },
447 | "engines": {
448 | "node": ">= 0.8"
449 | }
450 | },
451 | "node_modules/iconv-lite": {
452 | "version": "0.4.24",
453 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
454 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
455 | "dependencies": {
456 | "safer-buffer": ">= 2.1.2 < 3"
457 | },
458 | "engines": {
459 | "node": ">=0.10.0"
460 | }
461 | },
462 | "node_modules/ignore-by-default": {
463 | "version": "1.0.1",
464 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
465 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA=="
466 | },
467 | "node_modules/inherits": {
468 | "version": "2.0.4",
469 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
470 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
471 | },
472 | "node_modules/ipaddr.js": {
473 | "version": "1.9.1",
474 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
475 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
476 | "engines": {
477 | "node": ">= 0.10"
478 | }
479 | },
480 | "node_modules/is-binary-path": {
481 | "version": "2.1.0",
482 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
483 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
484 | "dependencies": {
485 | "binary-extensions": "^2.0.0"
486 | },
487 | "engines": {
488 | "node": ">=8"
489 | }
490 | },
491 | "node_modules/is-extglob": {
492 | "version": "2.1.1",
493 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
494 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
495 | "engines": {
496 | "node": ">=0.10.0"
497 | }
498 | },
499 | "node_modules/is-glob": {
500 | "version": "4.0.3",
501 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
502 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
503 | "dependencies": {
504 | "is-extglob": "^2.1.1"
505 | },
506 | "engines": {
507 | "node": ">=0.10.0"
508 | }
509 | },
510 | "node_modules/is-number": {
511 | "version": "7.0.0",
512 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
513 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
514 | "engines": {
515 | "node": ">=0.12.0"
516 | }
517 | },
518 | "node_modules/media-typer": {
519 | "version": "0.3.0",
520 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
521 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
522 | "engines": {
523 | "node": ">= 0.6"
524 | }
525 | },
526 | "node_modules/merge-descriptors": {
527 | "version": "1.0.1",
528 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
529 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
530 | },
531 | "node_modules/methods": {
532 | "version": "1.1.2",
533 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
534 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
535 | "engines": {
536 | "node": ">= 0.6"
537 | }
538 | },
539 | "node_modules/mime": {
540 | "version": "1.6.0",
541 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
542 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
543 | "bin": {
544 | "mime": "cli.js"
545 | },
546 | "engines": {
547 | "node": ">=4"
548 | }
549 | },
550 | "node_modules/mime-db": {
551 | "version": "1.52.0",
552 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
553 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
554 | "engines": {
555 | "node": ">= 0.6"
556 | }
557 | },
558 | "node_modules/mime-types": {
559 | "version": "2.1.35",
560 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
561 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
562 | "dependencies": {
563 | "mime-db": "1.52.0"
564 | },
565 | "engines": {
566 | "node": ">= 0.6"
567 | }
568 | },
569 | "node_modules/minimatch": {
570 | "version": "3.1.2",
571 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
572 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
573 | "dependencies": {
574 | "brace-expansion": "^1.1.7"
575 | },
576 | "engines": {
577 | "node": "*"
578 | }
579 | },
580 | "node_modules/minimist": {
581 | "version": "1.2.7",
582 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
583 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
584 | "funding": {
585 | "url": "https://github.com/sponsors/ljharb"
586 | }
587 | },
588 | "node_modules/ms": {
589 | "version": "2.0.0",
590 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
591 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
592 | },
593 | "node_modules/negotiator": {
594 | "version": "0.6.3",
595 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
596 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
597 | "engines": {
598 | "node": ">= 0.6"
599 | }
600 | },
601 | "node_modules/neo-async": {
602 | "version": "2.6.2",
603 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
604 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
605 | },
606 | "node_modules/nodemon": {
607 | "version": "2.0.20",
608 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz",
609 | "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==",
610 | "dependencies": {
611 | "chokidar": "^3.5.2",
612 | "debug": "^3.2.7",
613 | "ignore-by-default": "^1.0.1",
614 | "minimatch": "^3.1.2",
615 | "pstree.remy": "^1.1.8",
616 | "semver": "^5.7.1",
617 | "simple-update-notifier": "^1.0.7",
618 | "supports-color": "^5.5.0",
619 | "touch": "^3.1.0",
620 | "undefsafe": "^2.0.5"
621 | },
622 | "bin": {
623 | "nodemon": "bin/nodemon.js"
624 | },
625 | "engines": {
626 | "node": ">=8.10.0"
627 | },
628 | "funding": {
629 | "type": "opencollective",
630 | "url": "https://opencollective.com/nodemon"
631 | }
632 | },
633 | "node_modules/nodemon/node_modules/debug": {
634 | "version": "3.2.7",
635 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
636 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
637 | "dependencies": {
638 | "ms": "^2.1.1"
639 | }
640 | },
641 | "node_modules/nodemon/node_modules/ms": {
642 | "version": "2.1.3",
643 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
644 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
645 | },
646 | "node_modules/nopt": {
647 | "version": "1.0.10",
648 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
649 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
650 | "dependencies": {
651 | "abbrev": "1"
652 | },
653 | "bin": {
654 | "nopt": "bin/nopt.js"
655 | },
656 | "engines": {
657 | "node": "*"
658 | }
659 | },
660 | "node_modules/normalize-path": {
661 | "version": "3.0.0",
662 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
663 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
664 | "engines": {
665 | "node": ">=0.10.0"
666 | }
667 | },
668 | "node_modules/object-inspect": {
669 | "version": "1.12.2",
670 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
671 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
672 | "funding": {
673 | "url": "https://github.com/sponsors/ljharb"
674 | }
675 | },
676 | "node_modules/on-finished": {
677 | "version": "2.4.1",
678 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
679 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
680 | "dependencies": {
681 | "ee-first": "1.1.1"
682 | },
683 | "engines": {
684 | "node": ">= 0.8"
685 | }
686 | },
687 | "node_modules/parseurl": {
688 | "version": "1.3.3",
689 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
690 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
691 | "engines": {
692 | "node": ">= 0.8"
693 | }
694 | },
695 | "node_modules/path-to-regexp": {
696 | "version": "0.1.7",
697 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
698 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
699 | },
700 | "node_modules/picomatch": {
701 | "version": "2.3.1",
702 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
703 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
704 | "engines": {
705 | "node": ">=8.6"
706 | },
707 | "funding": {
708 | "url": "https://github.com/sponsors/jonschlinkert"
709 | }
710 | },
711 | "node_modules/proxy-addr": {
712 | "version": "2.0.7",
713 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
714 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
715 | "dependencies": {
716 | "forwarded": "0.2.0",
717 | "ipaddr.js": "1.9.1"
718 | },
719 | "engines": {
720 | "node": ">= 0.10"
721 | }
722 | },
723 | "node_modules/pstree.remy": {
724 | "version": "1.1.8",
725 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
726 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="
727 | },
728 | "node_modules/qs": {
729 | "version": "6.11.0",
730 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
731 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
732 | "dependencies": {
733 | "side-channel": "^1.0.4"
734 | },
735 | "engines": {
736 | "node": ">=0.6"
737 | },
738 | "funding": {
739 | "url": "https://github.com/sponsors/ljharb"
740 | }
741 | },
742 | "node_modules/range-parser": {
743 | "version": "1.2.1",
744 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
745 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
746 | "engines": {
747 | "node": ">= 0.6"
748 | }
749 | },
750 | "node_modules/raw-body": {
751 | "version": "2.5.1",
752 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
753 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
754 | "dependencies": {
755 | "bytes": "3.1.2",
756 | "http-errors": "2.0.0",
757 | "iconv-lite": "0.4.24",
758 | "unpipe": "1.0.0"
759 | },
760 | "engines": {
761 | "node": ">= 0.8"
762 | }
763 | },
764 | "node_modules/readdirp": {
765 | "version": "3.6.0",
766 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
767 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
768 | "dependencies": {
769 | "picomatch": "^2.2.1"
770 | },
771 | "engines": {
772 | "node": ">=8.10.0"
773 | }
774 | },
775 | "node_modules/safe-buffer": {
776 | "version": "5.2.1",
777 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
778 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
779 | "funding": [
780 | {
781 | "type": "github",
782 | "url": "https://github.com/sponsors/feross"
783 | },
784 | {
785 | "type": "patreon",
786 | "url": "https://www.patreon.com/feross"
787 | },
788 | {
789 | "type": "consulting",
790 | "url": "https://feross.org/support"
791 | }
792 | ]
793 | },
794 | "node_modules/safer-buffer": {
795 | "version": "2.1.2",
796 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
797 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
798 | },
799 | "node_modules/semver": {
800 | "version": "5.7.1",
801 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
802 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
803 | "bin": {
804 | "semver": "bin/semver"
805 | }
806 | },
807 | "node_modules/send": {
808 | "version": "0.18.0",
809 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
810 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
811 | "dependencies": {
812 | "debug": "2.6.9",
813 | "depd": "2.0.0",
814 | "destroy": "1.2.0",
815 | "encodeurl": "~1.0.2",
816 | "escape-html": "~1.0.3",
817 | "etag": "~1.8.1",
818 | "fresh": "0.5.2",
819 | "http-errors": "2.0.0",
820 | "mime": "1.6.0",
821 | "ms": "2.1.3",
822 | "on-finished": "2.4.1",
823 | "range-parser": "~1.2.1",
824 | "statuses": "2.0.1"
825 | },
826 | "engines": {
827 | "node": ">= 0.8.0"
828 | }
829 | },
830 | "node_modules/send/node_modules/ms": {
831 | "version": "2.1.3",
832 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
833 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
834 | },
835 | "node_modules/serve-static": {
836 | "version": "1.15.0",
837 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
838 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
839 | "dependencies": {
840 | "encodeurl": "~1.0.2",
841 | "escape-html": "~1.0.3",
842 | "parseurl": "~1.3.3",
843 | "send": "0.18.0"
844 | },
845 | "engines": {
846 | "node": ">= 0.8.0"
847 | }
848 | },
849 | "node_modules/setprototypeof": {
850 | "version": "1.2.0",
851 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
852 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
853 | },
854 | "node_modules/side-channel": {
855 | "version": "1.0.4",
856 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
857 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
858 | "dependencies": {
859 | "call-bind": "^1.0.0",
860 | "get-intrinsic": "^1.0.2",
861 | "object-inspect": "^1.9.0"
862 | },
863 | "funding": {
864 | "url": "https://github.com/sponsors/ljharb"
865 | }
866 | },
867 | "node_modules/simple-update-notifier": {
868 | "version": "1.0.7",
869 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz",
870 | "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==",
871 | "dependencies": {
872 | "semver": "~7.0.0"
873 | },
874 | "engines": {
875 | "node": ">=8.10.0"
876 | }
877 | },
878 | "node_modules/simple-update-notifier/node_modules/semver": {
879 | "version": "7.0.0",
880 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
881 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
882 | "bin": {
883 | "semver": "bin/semver.js"
884 | }
885 | },
886 | "node_modules/source-map": {
887 | "version": "0.6.1",
888 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
889 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
890 | "engines": {
891 | "node": ">=0.10.0"
892 | }
893 | },
894 | "node_modules/statuses": {
895 | "version": "2.0.1",
896 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
897 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
898 | "engines": {
899 | "node": ">= 0.8"
900 | }
901 | },
902 | "node_modules/supports-color": {
903 | "version": "5.5.0",
904 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
905 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
906 | "dependencies": {
907 | "has-flag": "^3.0.0"
908 | },
909 | "engines": {
910 | "node": ">=4"
911 | }
912 | },
913 | "node_modules/to-regex-range": {
914 | "version": "5.0.1",
915 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
916 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
917 | "dependencies": {
918 | "is-number": "^7.0.0"
919 | },
920 | "engines": {
921 | "node": ">=8.0"
922 | }
923 | },
924 | "node_modules/toidentifier": {
925 | "version": "1.0.1",
926 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
927 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
928 | "engines": {
929 | "node": ">=0.6"
930 | }
931 | },
932 | "node_modules/touch": {
933 | "version": "3.1.0",
934 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
935 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
936 | "dependencies": {
937 | "nopt": "~1.0.10"
938 | },
939 | "bin": {
940 | "nodetouch": "bin/nodetouch.js"
941 | }
942 | },
943 | "node_modules/type-is": {
944 | "version": "1.6.18",
945 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
946 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
947 | "dependencies": {
948 | "media-typer": "0.3.0",
949 | "mime-types": "~2.1.24"
950 | },
951 | "engines": {
952 | "node": ">= 0.6"
953 | }
954 | },
955 | "node_modules/uglify-js": {
956 | "version": "3.17.4",
957 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
958 | "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
959 | "optional": true,
960 | "bin": {
961 | "uglifyjs": "bin/uglifyjs"
962 | },
963 | "engines": {
964 | "node": ">=0.8.0"
965 | }
966 | },
967 | "node_modules/undefsafe": {
968 | "version": "2.0.5",
969 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
970 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA=="
971 | },
972 | "node_modules/unpipe": {
973 | "version": "1.0.0",
974 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
975 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
976 | "engines": {
977 | "node": ">= 0.8"
978 | }
979 | },
980 | "node_modules/utils-merge": {
981 | "version": "1.0.1",
982 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
983 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
984 | "engines": {
985 | "node": ">= 0.4.0"
986 | }
987 | },
988 | "node_modules/vary": {
989 | "version": "1.1.2",
990 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
991 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
992 | "engines": {
993 | "node": ">= 0.8"
994 | }
995 | },
996 | "node_modules/walk": {
997 | "version": "2.3.15",
998 | "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz",
999 | "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==",
1000 | "dependencies": {
1001 | "foreachasync": "^3.0.0"
1002 | }
1003 | },
1004 | "node_modules/wordwrap": {
1005 | "version": "1.0.0",
1006 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
1007 | "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="
1008 | }
1009 | },
1010 | "dependencies": {
1011 | "abbrev": {
1012 | "version": "1.1.1",
1013 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
1014 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
1015 | },
1016 | "accepts": {
1017 | "version": "1.3.8",
1018 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
1019 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
1020 | "requires": {
1021 | "mime-types": "~2.1.34",
1022 | "negotiator": "0.6.3"
1023 | }
1024 | },
1025 | "anymatch": {
1026 | "version": "3.1.2",
1027 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
1028 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
1029 | "requires": {
1030 | "normalize-path": "^3.0.0",
1031 | "picomatch": "^2.0.4"
1032 | }
1033 | },
1034 | "array-flatten": {
1035 | "version": "1.1.1",
1036 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
1037 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
1038 | },
1039 | "balanced-match": {
1040 | "version": "1.0.2",
1041 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1042 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
1043 | },
1044 | "binary-extensions": {
1045 | "version": "2.2.0",
1046 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
1047 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
1048 | },
1049 | "body-parser": {
1050 | "version": "1.20.1",
1051 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
1052 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
1053 | "requires": {
1054 | "bytes": "3.1.2",
1055 | "content-type": "~1.0.4",
1056 | "debug": "2.6.9",
1057 | "depd": "2.0.0",
1058 | "destroy": "1.2.0",
1059 | "http-errors": "2.0.0",
1060 | "iconv-lite": "0.4.24",
1061 | "on-finished": "2.4.1",
1062 | "qs": "6.11.0",
1063 | "raw-body": "2.5.1",
1064 | "type-is": "~1.6.18",
1065 | "unpipe": "1.0.0"
1066 | }
1067 | },
1068 | "brace-expansion": {
1069 | "version": "1.1.11",
1070 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1071 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1072 | "requires": {
1073 | "balanced-match": "^1.0.0",
1074 | "concat-map": "0.0.1"
1075 | }
1076 | },
1077 | "braces": {
1078 | "version": "3.0.2",
1079 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
1080 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
1081 | "requires": {
1082 | "fill-range": "^7.0.1"
1083 | }
1084 | },
1085 | "bytes": {
1086 | "version": "3.1.2",
1087 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
1088 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
1089 | },
1090 | "call-bind": {
1091 | "version": "1.0.2",
1092 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
1093 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
1094 | "requires": {
1095 | "function-bind": "^1.1.1",
1096 | "get-intrinsic": "^1.0.2"
1097 | }
1098 | },
1099 | "chokidar": {
1100 | "version": "3.5.3",
1101 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
1102 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
1103 | "requires": {
1104 | "anymatch": "~3.1.2",
1105 | "braces": "~3.0.2",
1106 | "fsevents": "~2.3.2",
1107 | "glob-parent": "~5.1.2",
1108 | "is-binary-path": "~2.1.0",
1109 | "is-glob": "~4.0.1",
1110 | "normalize-path": "~3.0.0",
1111 | "readdirp": "~3.6.0"
1112 | }
1113 | },
1114 | "concat-map": {
1115 | "version": "0.0.1",
1116 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1117 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
1118 | },
1119 | "content-disposition": {
1120 | "version": "0.5.4",
1121 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
1122 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
1123 | "requires": {
1124 | "safe-buffer": "5.2.1"
1125 | }
1126 | },
1127 | "content-type": {
1128 | "version": "1.0.4",
1129 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
1130 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
1131 | },
1132 | "cookie": {
1133 | "version": "0.5.0",
1134 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
1135 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
1136 | },
1137 | "cookie-signature": {
1138 | "version": "1.0.6",
1139 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
1140 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
1141 | },
1142 | "debug": {
1143 | "version": "2.6.9",
1144 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1145 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1146 | "requires": {
1147 | "ms": "2.0.0"
1148 | }
1149 | },
1150 | "depd": {
1151 | "version": "2.0.0",
1152 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
1153 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
1154 | },
1155 | "destroy": {
1156 | "version": "1.2.0",
1157 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
1158 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
1159 | },
1160 | "ee-first": {
1161 | "version": "1.1.1",
1162 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
1163 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
1164 | },
1165 | "encodeurl": {
1166 | "version": "1.0.2",
1167 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1168 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
1169 | },
1170 | "escape-html": {
1171 | "version": "1.0.3",
1172 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
1173 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
1174 | },
1175 | "etag": {
1176 | "version": "1.8.1",
1177 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
1178 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
1179 | },
1180 | "express": {
1181 | "version": "4.18.2",
1182 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
1183 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
1184 | "requires": {
1185 | "accepts": "~1.3.8",
1186 | "array-flatten": "1.1.1",
1187 | "body-parser": "1.20.1",
1188 | "content-disposition": "0.5.4",
1189 | "content-type": "~1.0.4",
1190 | "cookie": "0.5.0",
1191 | "cookie-signature": "1.0.6",
1192 | "debug": "2.6.9",
1193 | "depd": "2.0.0",
1194 | "encodeurl": "~1.0.2",
1195 | "escape-html": "~1.0.3",
1196 | "etag": "~1.8.1",
1197 | "finalhandler": "1.2.0",
1198 | "fresh": "0.5.2",
1199 | "http-errors": "2.0.0",
1200 | "merge-descriptors": "1.0.1",
1201 | "methods": "~1.1.2",
1202 | "on-finished": "2.4.1",
1203 | "parseurl": "~1.3.3",
1204 | "path-to-regexp": "0.1.7",
1205 | "proxy-addr": "~2.0.7",
1206 | "qs": "6.11.0",
1207 | "range-parser": "~1.2.1",
1208 | "safe-buffer": "5.2.1",
1209 | "send": "0.18.0",
1210 | "serve-static": "1.15.0",
1211 | "setprototypeof": "1.2.0",
1212 | "statuses": "2.0.1",
1213 | "type-is": "~1.6.18",
1214 | "utils-merge": "1.0.1",
1215 | "vary": "~1.1.2"
1216 | }
1217 | },
1218 | "fill-range": {
1219 | "version": "7.0.1",
1220 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
1221 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
1222 | "requires": {
1223 | "to-regex-range": "^5.0.1"
1224 | }
1225 | },
1226 | "finalhandler": {
1227 | "version": "1.2.0",
1228 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
1229 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
1230 | "requires": {
1231 | "debug": "2.6.9",
1232 | "encodeurl": "~1.0.2",
1233 | "escape-html": "~1.0.3",
1234 | "on-finished": "2.4.1",
1235 | "parseurl": "~1.3.3",
1236 | "statuses": "2.0.1",
1237 | "unpipe": "~1.0.0"
1238 | }
1239 | },
1240 | "foreachasync": {
1241 | "version": "3.0.0",
1242 | "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz",
1243 | "integrity": "sha512-J+ler7Ta54FwwNcx6wQRDhTIbNeyDcARMkOcguEqnEdtm0jKvN3Li3PDAb2Du3ubJYEWfYL83XMROXdsXAXycw=="
1244 | },
1245 | "forwarded": {
1246 | "version": "0.2.0",
1247 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
1248 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
1249 | },
1250 | "fresh": {
1251 | "version": "0.5.2",
1252 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1253 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
1254 | },
1255 | "fsevents": {
1256 | "version": "2.3.2",
1257 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
1258 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
1259 | "optional": true
1260 | },
1261 | "function-bind": {
1262 | "version": "1.1.1",
1263 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1264 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
1265 | },
1266 | "get-intrinsic": {
1267 | "version": "1.1.3",
1268 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
1269 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
1270 | "requires": {
1271 | "function-bind": "^1.1.1",
1272 | "has": "^1.0.3",
1273 | "has-symbols": "^1.0.3"
1274 | }
1275 | },
1276 | "glob-parent": {
1277 | "version": "5.1.2",
1278 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1279 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1280 | "requires": {
1281 | "is-glob": "^4.0.1"
1282 | }
1283 | },
1284 | "handlebars": {
1285 | "version": "4.7.7",
1286 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
1287 | "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
1288 | "requires": {
1289 | "minimist": "^1.2.5",
1290 | "neo-async": "^2.6.0",
1291 | "source-map": "^0.6.1",
1292 | "uglify-js": "^3.1.4",
1293 | "wordwrap": "^1.0.0"
1294 | }
1295 | },
1296 | "has": {
1297 | "version": "1.0.3",
1298 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1299 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1300 | "requires": {
1301 | "function-bind": "^1.1.1"
1302 | }
1303 | },
1304 | "has-flag": {
1305 | "version": "3.0.0",
1306 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1307 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
1308 | },
1309 | "has-symbols": {
1310 | "version": "1.0.3",
1311 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
1312 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
1313 | },
1314 | "hbs": {
1315 | "version": "4.2.0",
1316 | "resolved": "https://registry.npmjs.org/hbs/-/hbs-4.2.0.tgz",
1317 | "integrity": "sha512-dQwHnrfWlTk5PvG9+a45GYpg0VpX47ryKF8dULVd6DtwOE6TEcYQXQ5QM6nyOx/h7v3bvEQbdn19EDAcfUAgZg==",
1318 | "requires": {
1319 | "handlebars": "4.7.7",
1320 | "walk": "2.3.15"
1321 | }
1322 | },
1323 | "http-errors": {
1324 | "version": "2.0.0",
1325 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
1326 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
1327 | "requires": {
1328 | "depd": "2.0.0",
1329 | "inherits": "2.0.4",
1330 | "setprototypeof": "1.2.0",
1331 | "statuses": "2.0.1",
1332 | "toidentifier": "1.0.1"
1333 | }
1334 | },
1335 | "iconv-lite": {
1336 | "version": "0.4.24",
1337 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1338 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1339 | "requires": {
1340 | "safer-buffer": ">= 2.1.2 < 3"
1341 | }
1342 | },
1343 | "ignore-by-default": {
1344 | "version": "1.0.1",
1345 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
1346 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA=="
1347 | },
1348 | "inherits": {
1349 | "version": "2.0.4",
1350 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1351 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1352 | },
1353 | "ipaddr.js": {
1354 | "version": "1.9.1",
1355 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1356 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
1357 | },
1358 | "is-binary-path": {
1359 | "version": "2.1.0",
1360 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1361 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1362 | "requires": {
1363 | "binary-extensions": "^2.0.0"
1364 | }
1365 | },
1366 | "is-extglob": {
1367 | "version": "2.1.1",
1368 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1369 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
1370 | },
1371 | "is-glob": {
1372 | "version": "4.0.3",
1373 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1374 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1375 | "requires": {
1376 | "is-extglob": "^2.1.1"
1377 | }
1378 | },
1379 | "is-number": {
1380 | "version": "7.0.0",
1381 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1382 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
1383 | },
1384 | "media-typer": {
1385 | "version": "0.3.0",
1386 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1387 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
1388 | },
1389 | "merge-descriptors": {
1390 | "version": "1.0.1",
1391 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1392 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
1393 | },
1394 | "methods": {
1395 | "version": "1.1.2",
1396 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1397 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
1398 | },
1399 | "mime": {
1400 | "version": "1.6.0",
1401 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1402 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1403 | },
1404 | "mime-db": {
1405 | "version": "1.52.0",
1406 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1407 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
1408 | },
1409 | "mime-types": {
1410 | "version": "2.1.35",
1411 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1412 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1413 | "requires": {
1414 | "mime-db": "1.52.0"
1415 | }
1416 | },
1417 | "minimatch": {
1418 | "version": "3.1.2",
1419 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1420 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1421 | "requires": {
1422 | "brace-expansion": "^1.1.7"
1423 | }
1424 | },
1425 | "minimist": {
1426 | "version": "1.2.7",
1427 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
1428 | "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
1429 | },
1430 | "ms": {
1431 | "version": "2.0.0",
1432 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1433 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1434 | },
1435 | "negotiator": {
1436 | "version": "0.6.3",
1437 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1438 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
1439 | },
1440 | "neo-async": {
1441 | "version": "2.6.2",
1442 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
1443 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
1444 | },
1445 | "nodemon": {
1446 | "version": "2.0.20",
1447 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz",
1448 | "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==",
1449 | "requires": {
1450 | "chokidar": "^3.5.2",
1451 | "debug": "^3.2.7",
1452 | "ignore-by-default": "^1.0.1",
1453 | "minimatch": "^3.1.2",
1454 | "pstree.remy": "^1.1.8",
1455 | "semver": "^5.7.1",
1456 | "simple-update-notifier": "^1.0.7",
1457 | "supports-color": "^5.5.0",
1458 | "touch": "^3.1.0",
1459 | "undefsafe": "^2.0.5"
1460 | },
1461 | "dependencies": {
1462 | "debug": {
1463 | "version": "3.2.7",
1464 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
1465 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
1466 | "requires": {
1467 | "ms": "^2.1.1"
1468 | }
1469 | },
1470 | "ms": {
1471 | "version": "2.1.3",
1472 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1473 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1474 | }
1475 | }
1476 | },
1477 | "nopt": {
1478 | "version": "1.0.10",
1479 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1480 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
1481 | "requires": {
1482 | "abbrev": "1"
1483 | }
1484 | },
1485 | "normalize-path": {
1486 | "version": "3.0.0",
1487 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1488 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
1489 | },
1490 | "object-inspect": {
1491 | "version": "1.12.2",
1492 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
1493 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
1494 | },
1495 | "on-finished": {
1496 | "version": "2.4.1",
1497 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1498 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1499 | "requires": {
1500 | "ee-first": "1.1.1"
1501 | }
1502 | },
1503 | "parseurl": {
1504 | "version": "1.3.3",
1505 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1506 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1507 | },
1508 | "path-to-regexp": {
1509 | "version": "0.1.7",
1510 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1511 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1512 | },
1513 | "picomatch": {
1514 | "version": "2.3.1",
1515 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1516 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
1517 | },
1518 | "proxy-addr": {
1519 | "version": "2.0.7",
1520 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1521 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1522 | "requires": {
1523 | "forwarded": "0.2.0",
1524 | "ipaddr.js": "1.9.1"
1525 | }
1526 | },
1527 | "pstree.remy": {
1528 | "version": "1.1.8",
1529 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1530 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="
1531 | },
1532 | "qs": {
1533 | "version": "6.11.0",
1534 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1535 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1536 | "requires": {
1537 | "side-channel": "^1.0.4"
1538 | }
1539 | },
1540 | "range-parser": {
1541 | "version": "1.2.1",
1542 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1543 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1544 | },
1545 | "raw-body": {
1546 | "version": "2.5.1",
1547 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1548 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1549 | "requires": {
1550 | "bytes": "3.1.2",
1551 | "http-errors": "2.0.0",
1552 | "iconv-lite": "0.4.24",
1553 | "unpipe": "1.0.0"
1554 | }
1555 | },
1556 | "readdirp": {
1557 | "version": "3.6.0",
1558 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1559 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1560 | "requires": {
1561 | "picomatch": "^2.2.1"
1562 | }
1563 | },
1564 | "safe-buffer": {
1565 | "version": "5.2.1",
1566 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1567 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1568 | },
1569 | "safer-buffer": {
1570 | "version": "2.1.2",
1571 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1572 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1573 | },
1574 | "semver": {
1575 | "version": "5.7.1",
1576 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1577 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
1578 | },
1579 | "send": {
1580 | "version": "0.18.0",
1581 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1582 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1583 | "requires": {
1584 | "debug": "2.6.9",
1585 | "depd": "2.0.0",
1586 | "destroy": "1.2.0",
1587 | "encodeurl": "~1.0.2",
1588 | "escape-html": "~1.0.3",
1589 | "etag": "~1.8.1",
1590 | "fresh": "0.5.2",
1591 | "http-errors": "2.0.0",
1592 | "mime": "1.6.0",
1593 | "ms": "2.1.3",
1594 | "on-finished": "2.4.1",
1595 | "range-parser": "~1.2.1",
1596 | "statuses": "2.0.1"
1597 | },
1598 | "dependencies": {
1599 | "ms": {
1600 | "version": "2.1.3",
1601 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1602 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1603 | }
1604 | }
1605 | },
1606 | "serve-static": {
1607 | "version": "1.15.0",
1608 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1609 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1610 | "requires": {
1611 | "encodeurl": "~1.0.2",
1612 | "escape-html": "~1.0.3",
1613 | "parseurl": "~1.3.3",
1614 | "send": "0.18.0"
1615 | }
1616 | },
1617 | "setprototypeof": {
1618 | "version": "1.2.0",
1619 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1620 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1621 | },
1622 | "side-channel": {
1623 | "version": "1.0.4",
1624 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1625 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1626 | "requires": {
1627 | "call-bind": "^1.0.0",
1628 | "get-intrinsic": "^1.0.2",
1629 | "object-inspect": "^1.9.0"
1630 | }
1631 | },
1632 | "simple-update-notifier": {
1633 | "version": "1.0.7",
1634 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz",
1635 | "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==",
1636 | "requires": {
1637 | "semver": "~7.0.0"
1638 | },
1639 | "dependencies": {
1640 | "semver": {
1641 | "version": "7.0.0",
1642 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
1643 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
1644 | }
1645 | }
1646 | },
1647 | "source-map": {
1648 | "version": "0.6.1",
1649 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1650 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
1651 | },
1652 | "statuses": {
1653 | "version": "2.0.1",
1654 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1655 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
1656 | },
1657 | "supports-color": {
1658 | "version": "5.5.0",
1659 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1660 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1661 | "requires": {
1662 | "has-flag": "^3.0.0"
1663 | }
1664 | },
1665 | "to-regex-range": {
1666 | "version": "5.0.1",
1667 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1668 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1669 | "requires": {
1670 | "is-number": "^7.0.0"
1671 | }
1672 | },
1673 | "toidentifier": {
1674 | "version": "1.0.1",
1675 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1676 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
1677 | },
1678 | "touch": {
1679 | "version": "3.1.0",
1680 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
1681 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
1682 | "requires": {
1683 | "nopt": "~1.0.10"
1684 | }
1685 | },
1686 | "type-is": {
1687 | "version": "1.6.18",
1688 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1689 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1690 | "requires": {
1691 | "media-typer": "0.3.0",
1692 | "mime-types": "~2.1.24"
1693 | }
1694 | },
1695 | "uglify-js": {
1696 | "version": "3.17.4",
1697 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
1698 | "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
1699 | "optional": true
1700 | },
1701 | "undefsafe": {
1702 | "version": "2.0.5",
1703 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
1704 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA=="
1705 | },
1706 | "unpipe": {
1707 | "version": "1.0.0",
1708 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1709 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
1710 | },
1711 | "utils-merge": {
1712 | "version": "1.0.1",
1713 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1714 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
1715 | },
1716 | "vary": {
1717 | "version": "1.1.2",
1718 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1719 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
1720 | },
1721 | "walk": {
1722 | "version": "2.3.15",
1723 | "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz",
1724 | "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==",
1725 | "requires": {
1726 | "foreachasync": "^3.0.0"
1727 | }
1728 | },
1729 | "wordwrap": {
1730 | "version": "1.0.0",
1731 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
1732 | "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="
1733 | }
1734 | }
1735 | }
1736 |
--------------------------------------------------------------------------------
/mvc-node/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mvc-node",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon ./src/server.js"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "express": "^4.18.2",
14 | "hbs": "^4.2.0",
15 | "nodemon": "^2.0.20"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/mvc-node/src/domain/users/controller.js:
--------------------------------------------------------------------------------
1 | const userModel = require('./model');
2 |
3 | module.exports = {
4 | getAll: (req, res) => {
5 | return res.render('users.hbs', {
6 | users: userModel.getAll()
7 | })
8 | },
9 | create: (req, res) => {
10 | try {
11 | const { age, username} = req.body;
12 |
13 | if(!age || !username) {
14 | throw new Error('Не указан username или возраст');
15 | }
16 |
17 | userModel.create({ age, username })
18 |
19 | return res.redirect('/users')
20 | } catch (e) {
21 | return res.render('users-error.hbs', {
22 | message: e.message
23 | });
24 | }
25 |
26 | },
27 | removeById: (req, res) => {
28 | try {
29 | const id = req.query.id;
30 |
31 | if(!id) {
32 | throw new Error('id не указан');
33 | }
34 |
35 | userModel.removeById({ id })
36 |
37 | res.render('users-view.hbs', {
38 | users: userModel.getAll()
39 | })
40 | } catch (e) {
41 | return res.render('users-error.hbs', {
42 | message: e.message
43 | });
44 | }
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/mvc-node/src/domain/users/graphql-controller.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/utimur/mvc/eb1a522c35c847046288992ce5b9fcdab6cc3d9d/mvc-node/src/domain/users/graphql-controller.js
--------------------------------------------------------------------------------
/mvc-node/src/domain/users/model.js:
--------------------------------------------------------------------------------
1 | let users = [
2 | { id: '1', username: 'Ulbi TV', age: 23 }
3 | ]
4 |
5 | module.exports = {
6 | create: ({ username, age }) => {
7 | const newUser = {
8 | username,
9 | age,
10 | id: String(Date.now())
11 | }
12 |
13 | if(!users.find(user => user.username === users)) {
14 | users.push(newUser)
15 | } else {
16 | throw new Error('Пользователь уже существует')
17 | }
18 |
19 | return newUser;
20 | },
21 | removeById: ({ id }) => {
22 | const userIndex = users.findIndex(user => user.id === String(id));
23 |
24 | if(userIndex === -1) {
25 | throw new Error('Пользователь не найден')
26 | }
27 |
28 | users.splice(userIndex, 1);
29 |
30 | return id;
31 | },
32 | removeByUsername: ({ id }) => {},
33 | getAll: () => {
34 | return users;
35 | },
36 | getById: ({id}) => {
37 | return users.find(user => user.id === id);
38 | },
39 | }
40 |
--------------------------------------------------------------------------------
/mvc-node/src/domain/users/rest-controller.js:
--------------------------------------------------------------------------------
1 | const userModel = require('./model');
2 |
3 | module.exports = {
4 | getAll: (req, res) => {
5 | return res.json(userModel.getAll())
6 | },
7 | }
8 |
--------------------------------------------------------------------------------
/mvc-node/src/domain/users/soap-controller.js:
--------------------------------------------------------------------------------
1 | const userModel = require('./model');
2 |
3 | module.exports = {
4 | getAll: (req, res) => {
5 | const xmlUsers = XML.parse(userModel.getAll());
6 | return res.send(xmlUsers);
7 | },
8 | }
9 |
--------------------------------------------------------------------------------
/mvc-node/src/server.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | const path = require('path');
3 | const userController = require('./domain/users/controller')
4 |
5 |
6 | const PORT = 5000;
7 |
8 | const app = express();
9 |
10 | app.set("view engine", "hbs");
11 | app.set('views', path.resolve(__dirname, 'views'));
12 | app.use(express.urlencoded({ extended: false }));
13 |
14 |
15 | app.get('/users', userController.getAll)
16 | app.post('/users/create', userController.create)
17 | app.delete('/users/remove', userController.removeById)
18 |
19 | app.listen(PORT,() => console.log('server started on PORT = ' + PORT))
20 |
21 |
--------------------------------------------------------------------------------
/mvc-node/src/views/users-error.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Пользователи
5 |
6 |
7 |
8 | Произошла ошибка. {{message}}
9 | Вернуться на страницу пользователей
10 |
11 |
12 |
--------------------------------------------------------------------------------
/mvc-node/src/views/users.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Пользователи
5 |
6 |
7 |
8 | Создать нового пользователя
9 |
16 | Список пользователей
17 | {{#each users}}
18 |
19 |
Username - {{this.username}}
20 |
Возраст - {{this.age}}
21 |
24 |
25 | {{/each}}
26 |
33 |
34 |
35 |
--------------------------------------------------------------------------------