advent-of-code

Entries to advent of code, multiple years
git clone git://git.finwo.net/misc/advent-of-code
Log | Files | Refs

commit ce42583414a689837101ec26c0f67b415d56cfb2
parent e9b6db60c76467e7bc6a28a2c153ba6aab1c991c
Author: finwo <finwo@pm.me>
Date:   Sat, 11 Dec 2021 23:55:55 +0100

Adding mongo to day-04 is complete overkill, keep it in memory instead

Diffstat:
Msolutions/common/line-by-line.ts | 8++++----
Asolutions/day-04/api/assets/input | 602+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msolutions/day-04/api/package-lock.json | 1197++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Msolutions/day-04/api/package.json | 9++++++++-
Asolutions/day-04/api/src/app.ts | 10++++++++++
Asolutions/day-04/api/src/bingo/bingo.module.ts | 45+++++++++++++++++++++++++++++++++++++++++++++
Asolutions/day-04/api/src/bingo/model/board.ts | 15+++++++++++++++
Asolutions/day-04/api/src/bingo/model/game.ts | 15+++++++++++++++
Asolutions/day-04/api/src/common/line-by-line.ts | 12++++++++++++
Msolutions/day-04/api/src/index.ts | 40+++++++++++++++++++++-------------------
Asolutions/day-04/api/src/interface/rest/index.ts | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Msolutions/day-04/api/tsconfig.json | 2++
Msolutions/day-04/docker-compose.yml | 50++++++++++++++------------------------------------
Dsolutions/day-04/docker/mongo/init.js | 10----------
14 files changed, 1981 insertions(+), 85 deletions(-)

diff --git a/solutions/common/line-by-line.ts b/solutions/common/line-by-line.ts @@ -1,8 +1,8 @@ -import readline from 'readline'; -import fs from 'fs'; -import events from 'events'; +const events = require('events'); +const fs = require('fs'); +const readline = require('readline'); -export function lineByLine(filename: string, cb: ()=>{}): Promise<void> { +export function lineByLine(filename: string, cb: (string)=>Promise<void>): Promise<any> { const rl = readline.createInterface({ input : fs.createReadStream(filename), output : null, diff --git a/solutions/day-04/api/assets/input b/solutions/day-04/api/assets/input @@ -0,0 +1,602 @@ +10,80,6,69,22,99,63,92,30,67,28,93,0,50,65,87,38,7,91,60,57,40,84,51,27,12,44,88,64,35,39,74,61,55,31,48,81,89,62,37,94,43,29,14,95,8,78,49,90,97,66,70,25,68,75,45,42,23,9,96,56,72,59,32,85,3,71,79,18,24,33,19,15,20,82,26,21,13,4,98,83,34,86,5,2,73,17,54,1,77,52,58,76,36,16,46,41,47,11,53 + + 3 82 18 50 90 +16 37 52 67 28 +30 54 80 11 10 +60 79 7 65 58 +76 83 38 51 1 + +83 63 60 88 98 +70 87 5 99 14 +85 3 11 16 33 +72 69 97 36 49 +26 17 58 13 2 + +30 80 64 53 69 +36 0 32 46 70 +13 31 22 95 15 +12 35 5 84 21 +39 60 68 83 47 + +77 93 26 62 88 +87 76 80 10 63 +32 7 28 82 44 +43 30 31 16 74 +33 86 42 45 47 + +95 86 93 45 67 +20 58 63 35 97 +84 79 10 54 49 +48 66 75 23 61 + 5 30 6 56 71 + +75 8 85 12 98 +37 51 91 24 23 +50 54 81 53 33 +72 57 52 25 6 +56 40 95 87 22 + +52 19 53 9 32 +23 99 48 26 73 +10 8 54 20 79 +49 45 34 74 90 +27 72 30 13 57 + + 1 60 72 85 64 +62 39 56 93 78 +90 17 87 48 7 + 9 13 45 23 69 +44 80 86 55 21 + +86 57 25 98 18 +42 75 38 9 66 +54 19 99 87 49 +33 32 53 8 6 +17 68 24 58 95 + + 2 5 80 10 61 +27 16 40 67 78 +66 13 24 42 75 +25 7 35 11 85 +93 38 4 31 77 + +52 81 68 88 95 +82 50 46 87 20 + 3 54 59 75 51 +92 93 38 72 4 + 8 77 61 31 56 + +45 16 8 44 62 +92 23 42 20 74 +73 83 65 9 84 +55 13 21 70 59 +34 2 98 47 37 + + 3 54 85 79 76 +42 29 45 12 46 +60 59 24 67 80 +89 15 99 68 48 +40 7 95 44 70 + +75 31 99 16 32 +80 56 43 30 36 +66 73 35 20 61 +67 28 89 23 54 +47 26 69 70 50 + +35 91 81 13 15 +73 1 37 68 28 +98 29 9 22 56 +12 59 82 67 31 +77 47 32 79 52 + +22 73 39 14 46 +99 0 27 34 40 + 4 5 38 23 18 +64 26 89 59 79 +71 76 53 49 62 + +14 37 27 67 94 +76 16 79 61 83 + 8 43 36 28 75 +10 4 24 56 44 +26 1 88 9 86 + +14 78 43 10 30 +56 29 1 61 9 + 7 95 39 35 25 +33 87 71 97 21 +72 0 4 2 24 + +88 0 72 42 6 +53 79 58 80 20 +57 84 15 21 64 +98 17 43 8 95 + 2 22 59 63 78 + +78 21 33 57 72 +10 69 85 73 16 +92 60 87 39 63 +40 15 77 80 56 + 6 62 99 50 3 + +38 72 34 41 74 +90 29 9 6 91 +94 39 56 71 67 +53 21 22 32 10 +73 48 79 47 85 + + 5 49 73 24 8 +75 12 11 47 69 +66 70 89 62 48 +99 3 29 88 30 +10 40 32 33 43 + +61 93 2 58 84 +47 62 51 16 82 +80 22 50 31 65 +76 85 83 4 40 +86 59 68 14 69 + +52 5 74 9 72 +84 69 38 1 27 +78 90 46 97 95 +57 21 32 93 29 +11 66 20 51 48 + + 2 3 58 18 53 +11 96 63 33 13 +55 47 30 9 46 +98 85 79 19 65 +87 94 77 27 75 + +54 97 46 33 90 +99 93 22 0 51 +83 53 34 29 38 +35 65 80 82 9 +56 30 19 49 15 + +43 40 51 67 37 + 4 30 85 24 21 +83 94 69 91 99 +13 32 82 86 12 +66 9 60 65 97 + +71 96 55 92 6 +83 8 63 56 18 + 4 0 74 70 34 +15 87 44 80 29 +68 33 99 14 47 + +76 86 46 6 8 +90 80 77 30 62 +97 66 55 59 36 + 1 43 27 15 57 +54 70 38 21 89 + +75 96 97 54 29 +62 43 69 57 88 +36 46 73 84 28 +18 98 38 63 4 +59 35 99 90 58 + +66 29 60 25 95 +91 4 87 76 41 +26 19 45 96 74 + 7 82 3 81 31 +17 64 51 93 71 + +41 51 14 70 26 +35 38 50 25 13 +95 60 88 36 24 +66 94 62 97 83 +21 10 37 1 96 + +38 90 81 96 14 +40 82 71 18 83 +78 17 65 46 84 + 7 92 63 79 49 +55 21 89 95 72 + +60 35 26 67 42 +59 77 15 6 75 +18 16 21 55 4 +98 49 38 43 30 + 0 85 69 96 19 + +93 22 87 66 94 + 7 43 98 18 57 +29 20 91 60 21 +28 51 17 10 14 +96 12 15 25 37 + +12 69 27 41 36 +58 11 42 44 9 + 8 56 33 7 30 +70 64 78 17 61 +22 28 94 0 99 + +16 64 88 22 48 +65 42 23 7 26 +97 12 63 57 45 +29 94 91 21 54 +95 43 0 85 46 + + 9 50 54 98 35 +45 37 84 87 5 +40 23 14 17 18 +73 43 86 41 59 +69 77 78 15 60 + +79 9 45 59 85 +38 56 64 95 60 +39 22 14 57 66 +98 53 83 76 16 +62 94 72 54 82 + +77 44 6 66 46 + 9 89 11 84 63 +81 94 87 83 21 +22 90 1 93 92 +24 65 34 45 99 + +36 93 59 5 43 +76 49 51 0 68 +71 34 55 7 73 +14 10 45 63 95 +30 94 79 67 11 + +93 98 82 96 91 + 3 79 55 70 24 +68 56 87 12 76 +19 31 67 1 54 +49 62 23 15 10 + +10 74 98 15 6 +14 31 66 38 86 +68 84 60 80 26 +34 72 87 92 61 +81 56 73 12 53 + +11 69 4 6 23 +38 47 16 99 96 + 7 13 40 41 78 +12 5 1 18 88 +20 42 10 82 73 + +66 97 72 55 99 +26 59 6 79 53 +74 80 98 28 69 +25 95 17 29 34 +85 64 84 90 42 + +95 50 58 51 66 +48 27 81 94 0 +35 82 57 71 16 +32 93 70 40 25 +31 73 46 12 90 + +39 94 52 9 88 + 3 23 59 77 29 + 2 40 93 85 38 +74 97 12 50 1 +22 36 68 65 37 + +70 15 44 90 55 +42 20 82 0 78 +10 49 62 3 22 +91 73 84 40 28 +72 13 11 60 19 + +58 95 66 36 22 +91 99 77 94 44 +70 14 85 13 52 +49 6 2 50 35 +47 42 15 98 63 + +35 1 99 21 68 +93 32 30 76 5 +79 96 10 85 16 +19 69 81 78 70 +66 36 26 94 39 + +78 51 55 4 97 +21 36 53 1 26 +77 42 20 12 65 +17 52 6 40 16 +19 85 2 24 23 + +95 68 76 14 30 +19 11 64 99 60 +63 55 8 40 65 +41 75 62 53 83 +26 34 46 72 79 + +68 6 35 62 77 +43 14 88 7 11 +40 45 98 86 64 + 3 53 56 87 30 +28 37 48 10 72 + +13 69 72 93 17 + 1 46 8 56 37 +78 27 49 64 59 +81 99 33 76 79 +84 98 51 82 31 + +57 41 45 15 10 +65 72 79 17 29 +67 0 33 32 69 +56 96 92 46 53 +88 3 18 87 51 + +97 52 58 67 17 +51 69 43 20 63 + 1 26 27 47 99 +53 23 14 90 86 + 4 56 13 36 11 + +88 11 57 73 89 +43 34 91 15 58 + 9 39 18 12 14 + 1 98 29 77 52 +84 97 96 68 10 + +99 5 69 53 45 +10 43 24 60 55 +64 57 30 3 0 +22 65 68 32 83 +52 38 74 97 20 + +27 25 33 41 67 +54 42 3 1 55 +66 92 44 98 35 +14 82 5 10 39 +52 79 69 76 48 + +64 58 60 91 42 +45 55 35 9 72 +36 74 99 33 26 +67 4 25 50 14 +15 2 96 82 11 + +34 84 90 95 26 + 8 66 52 43 63 +79 98 36 85 41 +47 24 33 88 71 +86 91 83 40 18 + +79 68 49 64 35 +23 57 27 77 71 +95 39 43 19 98 +78 62 65 58 60 +52 73 82 4 32 + +22 54 57 45 3 +43 85 30 60 94 +35 46 28 55 6 +82 42 13 83 59 +76 70 41 61 1 + +76 89 34 96 1 +95 60 55 23 88 +37 13 61 92 62 +98 77 32 82 31 +33 74 71 58 86 + +73 91 92 49 44 +53 6 29 8 95 + 4 31 54 20 97 +98 57 2 65 75 +43 88 1 58 0 + +49 91 70 1 79 +17 90 33 65 54 +56 47 63 83 52 + 8 45 72 84 39 +43 37 71 97 59 + +90 93 20 31 96 +98 84 2 87 73 +97 16 19 24 38 +14 11 94 92 36 + 4 10 27 44 30 + +20 77 81 80 28 +35 51 93 24 62 +54 56 41 68 79 +29 67 89 60 12 +63 91 18 90 99 + +28 48 94 50 73 +20 27 34 59 43 +66 55 35 98 57 +40 53 21 99 4 +17 74 80 5 12 + +76 22 6 61 23 +70 67 69 33 9 +87 2 12 68 27 +13 52 82 15 84 +24 51 89 53 38 + +96 23 91 97 10 +50 8 68 67 0 +65 3 92 4 70 +53 77 59 86 66 +41 78 44 52 71 + +62 19 17 63 75 +43 88 15 84 13 +41 7 47 16 23 +12 71 8 83 50 +36 31 22 5 79 + +71 95 17 90 63 +64 52 32 3 93 +70 13 99 40 5 +22 18 83 11 55 +47 59 78 45 29 + + 9 98 73 46 79 + 5 51 84 26 40 +64 62 0 66 18 +33 83 47 1 63 +89 31 99 54 36 + +98 15 86 9 50 +67 7 75 85 17 +96 27 64 81 19 +80 30 29 54 52 +49 25 36 5 90 + +39 29 40 16 69 +38 55 67 71 59 +42 72 51 10 45 +94 75 21 27 0 +84 6 22 33 30 + +33 64 82 97 39 +79 7 62 49 99 +26 3 13 66 10 +37 98 15 80 47 + 1 35 30 50 43 + +56 92 41 82 34 +68 79 11 0 65 +70 84 26 76 96 + 1 72 31 80 8 + 9 38 98 17 7 + +12 19 6 29 89 +96 87 70 75 77 +84 74 64 54 13 +16 68 44 79 43 +61 47 69 26 50 + +43 20 45 21 87 +80 50 83 26 49 +64 99 71 75 9 +18 96 6 94 88 +76 97 51 11 74 + +85 47 25 72 93 +96 36 81 55 27 +63 18 57 1 29 + 9 35 83 88 98 +90 21 3 67 82 + +58 94 55 10 98 + 2 24 71 93 57 +74 34 21 35 73 +89 88 6 16 8 +76 81 38 28 83 + +36 53 63 67 18 +51 74 60 69 85 +32 22 80 58 98 +34 92 13 12 26 +46 61 31 96 47 + +90 1 5 10 48 +12 76 95 83 17 +24 84 65 44 28 +81 80 41 79 15 +29 61 75 94 40 + +65 22 40 75 86 +93 77 46 35 87 +88 5 91 48 74 +92 28 66 47 30 +69 2 29 67 94 + +78 38 1 53 68 +84 70 26 7 72 +92 87 55 47 6 +51 82 36 73 28 +75 58 35 49 56 + +61 85 60 19 24 +16 23 71 74 33 +42 7 57 82 70 +14 97 59 99 49 +46 30 89 79 41 + + 5 24 92 19 65 + 0 80 33 78 23 + 4 37 31 16 41 +79 73 88 36 67 +86 29 62 61 71 + +40 51 27 57 85 +53 68 31 60 83 +48 69 24 17 96 +54 89 22 77 64 +95 26 21 65 41 + +48 7 20 68 21 +31 22 1 99 96 +82 63 78 2 70 +18 83 58 92 51 +81 64 98 44 89 + +23 74 99 75 6 +81 14 37 8 85 +12 36 55 20 47 +88 7 90 87 43 + 3 44 83 15 2 + +97 15 69 76 95 +13 44 31 10 14 +40 83 49 11 65 +43 98 55 92 89 +90 33 73 32 53 + +25 79 77 83 68 + 5 10 23 15 19 +18 4 92 51 76 +17 90 70 49 39 +74 63 75 42 67 + +46 66 18 17 28 +75 76 78 72 44 +57 39 97 27 99 +36 58 62 90 82 +14 45 48 64 1 + +51 90 58 6 37 +28 30 57 54 10 +45 80 39 4 0 +29 17 66 18 55 +96 44 36 76 34 + +94 50 0 71 99 +11 67 96 87 64 +48 30 31 68 40 +89 55 23 92 42 +16 62 37 83 33 + +66 42 91 70 72 +28 69 96 17 71 +99 5 2 26 19 +60 87 51 83 76 +77 33 64 61 54 + +61 93 90 82 88 +80 11 25 40 28 +60 29 34 39 21 +24 13 72 77 2 +19 95 47 17 0 + +86 97 50 42 87 + 7 18 80 23 30 +41 6 96 92 98 +36 45 77 71 38 +19 40 47 39 53 + +83 7 80 86 65 +37 22 19 84 92 +29 17 76 4 33 +97 50 1 12 21 +15 58 39 38 74 + diff --git a/solutions/day-04/api/package-lock.json b/solutions/day-04/api/package-lock.json @@ -11,10 +11,16 @@ "dependencies": { "cors": "^2.8.5", "express": "^4.17.1", + "level-mem": "^6.0.1", + "levelgraph": "^3.0.0", "module-alias": "^2.2.2", + "mongodb": "^4.2.1", "morgan": "^1.10.0", + "readline": "^1.3.0", "reflect-metadata": "^0.1.13", - "typescript": "^4.5.3" + "typedi": "^0.10.0", + "typescript": "^4.5.3", + "uuid": "^8.3.2" }, "devDependencies": { "@types/node": "^16.11.12", @@ -46,8 +52,21 @@ "node_modules/@types/node": { "version": "16.11.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==", - "dev": true + "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + }, + "node_modules/@types/webidl-conversions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", + "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", + "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } }, "node_modules/abbrev": { "version": "1.1.1", @@ -55,6 +74,45 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "node_modules/abstract-leveldown": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", + "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", + "dependencies": { + "buffer": "^6.0.3", + "catering": "^2.0.0", + "is-buffer": "^2.0.5", + "level-concat-iterator": "^3.0.0", + "level-supports": "^2.0.1", + "queue-microtask": "^1.2.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/abstract-leveldown/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -124,6 +182,25 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -208,6 +285,40 @@ "node": ">=8" } }, + "node_modules/bson": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.0.tgz", + "integrity": "sha512-8jw1NU1hglS+Da1jDOUYuNcBJ4cNHCFIqzlwoFNnsTOg2R/ox0aTYcTiBN4dzRa9q7Cvy6XErh3L8ReTEb9AQQ==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -258,6 +369,37 @@ "node": ">=8" } }, + "node_modules/callback-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/callback-stream/-/callback-stream-1.1.0.tgz", + "integrity": "sha1-RwGlEmbwbgbqpx/BcjOCLYdfSQg=", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "> 1.0.0 < 3.0.0" + } + }, + "node_modules/callback-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/callback-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/camelcase": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", @@ -270,6 +412,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/catering": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", + "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", + "dependencies": { + "queue-tick": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -428,6 +581,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -484,6 +642,26 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, + "node_modules/deferred-leveldown": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-7.0.0.tgz", + "integrity": "sha512-QKN8NtuS3BC6m0B8vAnBls44tX1WXAFATUsJlruyAYbZpysWV3siH6o/i3g9DCHauzodksO60bdj5NazNbjCmg==", + "dependencies": { + "abstract-leveldown": "^7.2.0", + "inherits": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/denque": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", + "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -534,11 +712,24 @@ "node": ">= 0.8" } }, + "node_modules/encoding-down": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-7.1.0.tgz", + "integrity": "sha512-ky47X5jP84ryk5EQmvedQzELwVJPjCgXDQZGeb9F6r4PdChByCGHTBrVcF3h8ynKVJ1wVbkxTsDC8zBROPypgQ==", + "dependencies": { + "abstract-leveldown": "^7.2.0", + "inherits": "^2.0.3", + "level-codec": "^10.0.0", + "level-errors": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "dependencies": { "once": "^1.4.0" } @@ -605,6 +796,43 @@ "node": ">= 0.10.0" } }, + "node_modules/fastfall": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/fastfall/-/fastfall-1.5.1.tgz", + "integrity": "sha1-P+4DMxpJ0dObPN96XpzWb0dee5Q=", + "dependencies": { + "reusify": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fastparallel": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/fastparallel/-/fastparallel-2.4.1.tgz", + "integrity": "sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==", + "dependencies": { + "reusify": "^1.0.4", + "xtend": "^4.0.2" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fastseries": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/fastseries/-/fastseries-1.7.2.tgz", + "integrity": "sha1-0izhO5Qz3/M4jZHb1ri9qbIaD0s=", + "dependencies": { + "reusify": "^1.0.0", + "xtend": "^4.0.0" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -670,6 +898,11 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, "node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -807,6 +1040,25 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", @@ -875,6 +1127,28 @@ "node": ">=8" } }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, "node_modules/is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -984,6 +1258,11 @@ "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", "dev": true }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -1011,6 +1290,161 @@ "node": ">=8" } }, + "node_modules/level-codec": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-10.0.0.tgz", + "integrity": "sha512-QW3VteVNAp6c/LuV6nDjg7XDXx9XHK4abmQarxZmlRSDyXYk20UdaJTSX6yzVvQ4i0JyWSB7jert0DsyD/kk6g==", + "dependencies": { + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/level-codec/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/level-concat-iterator": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", + "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", + "dependencies": { + "catering": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/level-errors": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-3.0.1.tgz", + "integrity": "sha512-tqTL2DxzPDzpwl0iV5+rBCv65HWbHp6eutluHNcVIftKZlQN//b6GEnZDM2CvGZvzGYMwyPtYppYnydBQd2SMQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/level-iterator-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-5.0.0.tgz", + "integrity": "sha512-wnb1+o+CVFUDdiSMR/ZymE2prPs3cjVLlXuDeSq9Zb8o032XrabGEXcTCsBxprAtseO3qvFeGzh6406z9sOTRA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/level-iterator-stream/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/level-mem": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-6.0.1.tgz", + "integrity": "sha512-IBliILfS59qDUibuGs/jCD0loih0oI0+5pmvsZ0Yxa/SWBEEgVT70dKnArEo7UdOciUHEcyD07LEx5Ox5QHIMg==", + "dependencies": { + "level-packager": "^6.0.1", + "memdown": "^6.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/level-packager": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-6.0.1.tgz", + "integrity": "sha512-8Ezr0XM6hmAwqX9uu8IGzGNkWz/9doyPA8Oo9/D7qcMI6meJC+XhIbNYHukJhIn8OGdlzQs/JPcL9B8lA2F6EQ==", + "dependencies": { + "encoding-down": "^7.1.0", + "levelup": "^5.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/level-supports": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", + "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/level-ws": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-3.0.0.tgz", + "integrity": "sha512-dHWw8wrffw2QzuTjcvHHGb6Wp5SFrZ21bJ9/AuHh2+72dWkR6Pt78SuC9zaPgY/1W8vL9/rh8CqNlxXz5QAWmw==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^3.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/levelgraph": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/levelgraph/-/levelgraph-3.0.0.tgz", + "integrity": "sha512-ec3eJ6UrY3pdFjemizTBr2VOcAuXzipEqIvuVF3mCNEcZPAjvkHUAo0W7tO5UcuhHaGPRSsyua0pj2tGN+Mq8Q==", + "dependencies": { + "callback-stream": "^1.1.0", + "inherits": "^2.0.4", + "level-ws": "^3.0.0", + "lodash.keys": "^4.2.0", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "steed": "^1.1.3", + "xtend": "^4.0.2" + } + }, + "node_modules/levelgraph/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/levelup": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-5.1.1.tgz", + "integrity": "sha512-0mFCcHcEebOwsQuk00WJwjLI6oCjbBuEYdh/RaRqhjnyVlzqf41T1NnDtCedumZ56qyIh8euLFDqV1KfzTAVhg==", + "dependencies": { + "catering": "^2.0.0", + "deferred-leveldown": "^7.0.0", + "level-errors": "^3.0.1", + "level-iterator-stream": "^5.0.0", + "level-supports": "^2.0.1", + "queue-microtask": "^1.2.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lodash.keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.2.0.tgz", + "integrity": "sha1-oIYCrBLk+4P5H8H7ejYKTZujUgU=" + }, "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -1032,6 +1466,11 @@ "node": ">=10" } }, + "node_modules/ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -1064,6 +1503,50 @@ "node": ">= 0.6" } }, + "node_modules/memdown": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-6.1.1.tgz", + "integrity": "sha512-vh2RiuVrn6Vv73088C1KzLwy9+hhRwoZsgddYqIoVuFFrcoc2Rt+lq/KrmkFn6ulko7AtQ0AvqtYid35exb38A==", + "dependencies": { + "abstract-leveldown": "^7.2.0", + "buffer": "^6.0.3", + "functional-red-black-tree": "^1.0.1", + "inherits": "^2.0.1", + "ltgt": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/memdown/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -1139,6 +1622,31 @@ "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" }, + "node_modules/mongodb": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.2.1.tgz", + "integrity": "sha512-nDC+ulM/Ea3Q2VG5eemuGfB7T4ORwrtKegH2XW9OLlUBgQF6OTNrzFCS1Z3SJGVA+T0Sr1xBYV6DMnp0A7us0g==", + "dependencies": { + "bson": "^4.6.0", + "denque": "^2.0.1", + "mongodb-connection-string-url": "^2.2.0" + }, + "engines": { + "node": ">=12.9.0" + }, + "optionalDependencies": { + "saslprep": "^1.0.3" + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.2.0.tgz", + "integrity": "sha512-U0cDxLUrQrl7DZA828CA+o69EuWPWEJTwdMPozyd7cy/dbtncUZczMw7wRHcwMD7oKOn0NM2tF9jdf5FFVW9CA==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, "node_modules/morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", @@ -1283,7 +1791,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "dependencies": { "wrappy": "1" } @@ -1364,6 +1871,11 @@ "node": ">=4" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -1386,12 +1898,19 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, "node_modules/pupa": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", @@ -1412,6 +1931,30 @@ "node": ">=0.6" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/queue-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", + "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==" + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -1455,6 +1998,19 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1467,6 +2023,11 @@ "node": ">=8.10.0" } }, + "node_modules/readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw=" + }, "node_modules/reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -1505,6 +2066,15 @@ "lowercase-keys": "^1.0.0" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -1530,6 +2100,18 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -1613,6 +2195,15 @@ "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "dev": true }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -1621,6 +2212,45 @@ "node": ">= 0.6" } }, + "node_modules/steed": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/steed/-/steed-1.1.3.tgz", + "integrity": "sha1-8VJd1a2xLrIb90dJU3Zo1iW5q8U=", + "dependencies": { + "fastfall": "^1.5.0", + "fastparallel": "^2.2.0", + "fastq": "^1.3.0", + "fastseries": "^1.7.0", + "reusify": "^1.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -1709,6 +2339,17 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -1742,6 +2383,11 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typedi": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/typedi/-/typedi-0.10.0.tgz", + "integrity": "sha512-v3UJF8xm68BBj6AF4oQML3ikrfK2c9EmZUyLOfShpJuItAqVBHWP/KtpGinkSsIiP6EZyyb6Z3NXyW9dgS9X1w==" + }, "node_modules/typescript": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.3.tgz", @@ -1835,6 +2481,11 @@ "node": ">=4" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -1843,6 +2494,14 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -1851,6 +2510,26 @@ "node": ">= 0.8" } }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -1883,8 +2562,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -1907,6 +2585,14 @@ "node": ">=8" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -1933,8 +2619,21 @@ "@types/node": { "version": "16.11.12", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==", - "dev": true + "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==" + }, + "@types/webidl-conversions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", + "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" + }, + "@types/whatwg-url": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", + "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", + "requires": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } }, "abbrev": { "version": "1.1.1", @@ -1942,6 +2641,30 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, + "abstract-leveldown": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", + "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", + "requires": { + "buffer": "^6.0.3", + "catering": "^2.0.0", + "is-buffer": "^2.0.5", + "level-concat-iterator": "^3.0.0", + "level-supports": "^2.0.1", + "queue-microtask": "^1.2.3" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } + } + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -1996,6 +2719,11 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -2062,6 +2790,23 @@ "fill-range": "^7.0.1" } }, + "bson": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.0.tgz", + "integrity": "sha512-8jw1NU1hglS+Da1jDOUYuNcBJ4cNHCFIqzlwoFNnsTOg2R/ox0aTYcTiBN4dzRa9q7Cvy6XErh3L8ReTEb9AQQ==", + "requires": { + "buffer": "^5.6.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -2099,12 +2844,53 @@ } } }, + "callback-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/callback-stream/-/callback-stream-1.1.0.tgz", + "integrity": "sha1-RwGlEmbwbgbqpx/BcjOCLYdfSQg=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "> 1.0.0 < 3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "camelcase": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", "dev": true }, + "catering": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", + "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", + "requires": { + "queue-tick": "^1.0.0" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2227,6 +3013,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -2271,6 +3062,20 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, + "deferred-leveldown": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-7.0.0.tgz", + "integrity": "sha512-QKN8NtuS3BC6m0B8vAnBls44tX1WXAFATUsJlruyAYbZpysWV3siH6o/i3g9DCHauzodksO60bdj5NazNbjCmg==", + "requires": { + "abstract-leveldown": "^7.2.0", + "inherits": "^2.0.3" + } + }, + "denque": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", + "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -2312,11 +3117,21 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "encoding-down": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-7.1.0.tgz", + "integrity": "sha512-ky47X5jP84ryk5EQmvedQzELwVJPjCgXDQZGeb9F6r4PdChByCGHTBrVcF3h8ynKVJ1wVbkxTsDC8zBROPypgQ==", + "requires": { + "abstract-leveldown": "^7.2.0", + "inherits": "^2.0.3", + "level-codec": "^10.0.0", + "level-errors": "^3.0.0" + } + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -2374,6 +3189,40 @@ "vary": "~1.1.2" } }, + "fastfall": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/fastfall/-/fastfall-1.5.1.tgz", + "integrity": "sha1-P+4DMxpJ0dObPN96XpzWb0dee5Q=", + "requires": { + "reusify": "^1.0.0" + } + }, + "fastparallel": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/fastparallel/-/fastparallel-2.4.1.tgz", + "integrity": "sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==", + "requires": { + "reusify": "^1.0.4", + "xtend": "^4.0.2" + } + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "fastseries": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/fastseries/-/fastseries-1.7.2.tgz", + "integrity": "sha1-0izhO5Qz3/M4jZHb1ri9qbIaD0s=", + "requires": { + "reusify": "^1.0.0", + "xtend": "^4.0.0" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2420,6 +3269,11 @@ "dev": true, "optional": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -2524,6 +3378,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", @@ -2577,6 +3436,11 @@ "binary-extensions": "^2.0.0" } }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -2653,6 +3517,11 @@ "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", "dev": true }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -2677,6 +3546,126 @@ "package-json": "^6.3.0" } }, + "level-codec": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-10.0.0.tgz", + "integrity": "sha512-QW3VteVNAp6c/LuV6nDjg7XDXx9XHK4abmQarxZmlRSDyXYk20UdaJTSX6yzVvQ4i0JyWSB7jert0DsyD/kk6g==", + "requires": { + "buffer": "^6.0.3" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } + } + }, + "level-concat-iterator": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", + "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", + "requires": { + "catering": "^2.1.0" + } + }, + "level-errors": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-3.0.1.tgz", + "integrity": "sha512-tqTL2DxzPDzpwl0iV5+rBCv65HWbHp6eutluHNcVIftKZlQN//b6GEnZDM2CvGZvzGYMwyPtYppYnydBQd2SMQ==" + }, + "level-iterator-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-5.0.0.tgz", + "integrity": "sha512-wnb1+o+CVFUDdiSMR/ZymE2prPs3cjVLlXuDeSq9Zb8o032XrabGEXcTCsBxprAtseO3qvFeGzh6406z9sOTRA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + } + }, + "level-mem": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-6.0.1.tgz", + "integrity": "sha512-IBliILfS59qDUibuGs/jCD0loih0oI0+5pmvsZ0Yxa/SWBEEgVT70dKnArEo7UdOciUHEcyD07LEx5Ox5QHIMg==", + "requires": { + "level-packager": "^6.0.1", + "memdown": "^6.1.1" + } + }, + "level-packager": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-6.0.1.tgz", + "integrity": "sha512-8Ezr0XM6hmAwqX9uu8IGzGNkWz/9doyPA8Oo9/D7qcMI6meJC+XhIbNYHukJhIn8OGdlzQs/JPcL9B8lA2F6EQ==", + "requires": { + "encoding-down": "^7.1.0", + "levelup": "^5.1.1" + } + }, + "level-supports": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", + "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==" + }, + "level-ws": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-3.0.0.tgz", + "integrity": "sha512-dHWw8wrffw2QzuTjcvHHGb6Wp5SFrZ21bJ9/AuHh2+72dWkR6Pt78SuC9zaPgY/1W8vL9/rh8CqNlxXz5QAWmw==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^3.1.0" + } + }, + "levelgraph": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/levelgraph/-/levelgraph-3.0.0.tgz", + "integrity": "sha512-ec3eJ6UrY3pdFjemizTBr2VOcAuXzipEqIvuVF3mCNEcZPAjvkHUAo0W7tO5UcuhHaGPRSsyua0pj2tGN+Mq8Q==", + "requires": { + "callback-stream": "^1.1.0", + "inherits": "^2.0.4", + "level-ws": "^3.0.0", + "lodash.keys": "^4.2.0", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "steed": "^1.1.3", + "xtend": "^4.0.2" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + } + }, + "levelup": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-5.1.1.tgz", + "integrity": "sha512-0mFCcHcEebOwsQuk00WJwjLI6oCjbBuEYdh/RaRqhjnyVlzqf41T1NnDtCedumZ56qyIh8euLFDqV1KfzTAVhg==", + "requires": { + "catering": "^2.0.0", + "deferred-leveldown": "^7.0.0", + "level-errors": "^3.0.1", + "level-iterator-stream": "^5.0.0", + "level-supports": "^2.0.1", + "queue-microtask": "^1.2.3" + } + }, + "lodash.keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.2.0.tgz", + "integrity": "sha1-oIYCrBLk+4P5H8H7ejYKTZujUgU=" + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -2692,6 +3681,11 @@ "yallist": "^4.0.0" } }, + "ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=" + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -2714,6 +3708,35 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, + "memdown": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-6.1.1.tgz", + "integrity": "sha512-vh2RiuVrn6Vv73088C1KzLwy9+hhRwoZsgddYqIoVuFFrcoc2Rt+lq/KrmkFn6ulko7AtQ0AvqtYid35exb38A==", + "requires": { + "abstract-leveldown": "^7.2.0", + "buffer": "^6.0.3", + "functional-red-black-tree": "^1.0.1", + "inherits": "^2.0.1", + "ltgt": "^2.2.0" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } + } + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -2768,6 +3791,26 @@ "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" }, + "mongodb": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.2.1.tgz", + "integrity": "sha512-nDC+ulM/Ea3Q2VG5eemuGfB7T4ORwrtKegH2XW9OLlUBgQF6OTNrzFCS1Z3SJGVA+T0Sr1xBYV6DMnp0A7us0g==", + "requires": { + "bson": "^4.6.0", + "denque": "^2.0.1", + "mongodb-connection-string-url": "^2.2.0", + "saslprep": "^1.0.3" + } + }, + "mongodb-connection-string-url": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.2.0.tgz", + "integrity": "sha512-U0cDxLUrQrl7DZA828CA+o69EuWPWEJTwdMPozyd7cy/dbtncUZczMw7wRHcwMD7oKOn0NM2tF9jdf5FFVW9CA==", + "requires": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, "morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", @@ -2875,7 +3918,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -2934,6 +3976,11 @@ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", "dev": true }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -2953,12 +4000,16 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, "pupa": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", @@ -2973,6 +4024,16 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "queue-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", + "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==" + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -3009,6 +4070,16 @@ } } }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -3018,6 +4089,11 @@ "picomatch": "^2.2.1" } }, + "readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw=" + }, "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -3050,6 +4126,11 @@ "lowercase-keys": "^1.0.0" } }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -3069,6 +4150,15 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -3141,11 +4231,47 @@ "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "dev": true }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "steed": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/steed/-/steed-1.1.3.tgz", + "integrity": "sha1-8VJd1a2xLrIb90dJU3Zo1iW5q8U=", + "requires": { + "fastfall": "^1.5.0", + "fastparallel": "^2.2.0", + "fastq": "^1.3.0", + "fastseries": "^1.7.0", + "reusify": "^1.0.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -3210,6 +4336,14 @@ "nopt": "~1.0.10" } }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "requires": { + "punycode": "^2.1.1" + } + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -3234,6 +4368,11 @@ "is-typedarray": "^1.0.0" } }, + "typedi": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/typedi/-/typedi-0.10.0.tgz", + "integrity": "sha512-v3UJF8xm68BBj6AF4oQML3ikrfK2c9EmZUyLOfShpJuItAqVBHWP/KtpGinkSsIiP6EZyyb6Z3NXyW9dgS9X1w==" + }, "typescript": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.3.tgz", @@ -3301,16 +4440,40 @@ "prepend-http": "^2.0.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -3334,8 +4497,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "3.0.3", @@ -3355,6 +4517,11 @@ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/solutions/day-04/api/package.json b/solutions/day-04/api/package.json @@ -18,10 +18,16 @@ "dependencies": { "cors": "^2.8.5", "express": "^4.17.1", + "level-mem": "^6.0.1", + "levelgraph": "^3.0.0", "module-alias": "^2.2.2", + "mongodb": "^4.2.1", "morgan": "^1.10.0", + "readline": "^1.3.0", "reflect-metadata": "^0.1.13", - "typescript": "^4.5.3" + "typedi": "^0.10.0", + "typescript": "^4.5.3", + "uuid": "^8.3.2" }, "devDependencies": { "@types/node": "^16.11.12", @@ -29,6 +35,7 @@ "rimraf": "^3.0.2" }, "_moduleAliases": { + "@common": "dist/common", "@config": "dist/config" } } diff --git a/solutions/day-04/api/src/app.ts b/solutions/day-04/api/src/app.ts @@ -0,0 +1,10 @@ +import { Service } from 'typedi'; + +import { BingoModule } from './bingo/bingo.module'; + +@Service() +export class AppModule { + constructor( + bingoModule: BingoModule + ) {} +} diff --git a/solutions/day-04/api/src/bingo/bingo.module.ts b/solutions/day-04/api/src/bingo/bingo.module.ts @@ -0,0 +1,45 @@ +import { Service, Container } from 'typedi'; +import { lineByLine } from '@common/line-by-line'; + +import { Board } from './model/board'; +import { Game } from './model/game'; + +@Service() +export class BingoModule { + + constructor() { + this.initializeDb(); + } + + // TODO: move into dedicated file + async initializeDb() { + const db: {[index:string]:{[index:string]:any}[]} = Container.get('db'); + db.game = db.game || []; + db.board = db.board || []; + + // Only a single input file exists + let game = null; + let board = null; + await lineByLine(__dirname + '/../../assets/input', async line => { + + // Task defined first line as already-drawn numbers + if (!game) { + game = new Game({ drawn: line.split(',').map(v => parseInt(v)), board: [] }); + db.game.push(game); + return; + } + + // Handle board closure + if (!line) { + board = new Board({ game }); + db.board.push(board); + game.board.push(board); + return; + } + + // Parse the board values line + board.values.push(line.split(' ').filter(v => v).map(v => parseInt(v))); + }); + + } +} diff --git a/solutions/day-04/api/src/bingo/model/board.ts b/solutions/day-04/api/src/bingo/model/board.ts @@ -0,0 +1,15 @@ +import { v4 as uuidv4 } from 'uuid'; +import { Game } from './game'; + +export class Board { + public uuid : string; + public values : number[][]; + public game : (Game|string)[]; + + constructor(data?: Partial<Board>) { + this.uuid = uuidv4(); + if (data) Object.assign(this, data); + this.values = this.values || []; + } + +} diff --git a/solutions/day-04/api/src/bingo/model/game.ts b/solutions/day-04/api/src/bingo/model/game.ts @@ -0,0 +1,15 @@ +import { v4 as uuidv4 } from 'uuid'; +import { Board } from './board'; + +export class Game { + public uuid : string; + public name : string; + public drawn : number[]; + public board : (Board|string)[]; + + constructor(data?: Partial<Game>) { + this.uuid = uuidv4(); + if (data) Object.assign(this, data); + this.drawn = this.drawn || []; + } +} diff --git a/solutions/day-04/api/src/common/line-by-line.ts b/solutions/day-04/api/src/common/line-by-line.ts @@ -0,0 +1,12 @@ +const events = require('events'); +const fs = require('fs'); +const readline = require('readline'); + +export function lineByLine(filename: string, cb: (string)=>Promise<void>): Promise<any> { + const rl = readline.createInterface({ + input : fs.createReadStream(filename), + output : null, + }); + rl.on('line', cb); + return events.once(rl, 'close'); +} diff --git a/solutions/day-04/api/src/index.ts b/solutions/day-04/api/src/index.ts @@ -1,26 +1,28 @@ import 'reflect-metadata'; import 'module-alias/register'; -const cors = require('cors'); -const express = require('express'); -const morgan = require('morgan'); - +// Load db and config import { http } from '@config'; -async function bootstrap() { - const app = express(); - app.use(morgan('tiny')); - app.use(cors()); - // await require('@db').init({ app }); - // await require('./middleware/auth/jct-ed25519').init({ app }); - // await require('@app').init({ app }); - // await require('@graphql').init({ app }); - app.get('/', (req, res) => { - res.end('dinges'); - }); - await app.listen(http.port, '0.0.0.0'); - console.log(`Listening on :${http.port}`); -} +// Basic dependencies +const cors = require('cors'); +const express = require('express'); +const morgan = require('morgan'); + +// Bootstrap container before loading controllers +import { Container } from 'typedi'; +const app = express(); +app.use(morgan('tiny')); +app.use(cors()); +Container.set('router', app); +Container.set('db', {}); -bootstrap(); +// Load app into container +import { AppModule } from './app'; +Container.get(AppModule); +// Start listening +app.listen(http.port, '0.0.0.0', err => { + if (err) throw err; + console.log(`Listening on 0.0.0.0:${http.port}`); +}) diff --git a/solutions/day-04/api/src/interface/rest/index.ts b/solutions/day-04/api/src/interface/rest/index.ts @@ -0,0 +1,51 @@ +import { Request, Response } from 'express'; +import { Container } from 'typedi'; + +const routes = new Map(); +const controllers = []; + +export enum Method { + DELETE = 'delete', + GET = 'get', + POST = 'post', + PUT = 'put', +}; + +export function Controller(prefix?: string): ClassDecorator { + return function(constructor: Function) { + const router = Container.get('router'); + const controllerRoutes = routes.get(constructor) || []; + for(const route of controllerRoutes) { + const path = ['',prefix,route.path].join('/').replace(/\/+/g,'/'); + router[route.method](path, async (req: Request, res: Response, next: Function) => { + const controller = Container.get(constructor); + await controller[route.name]({ req, res }); + if (!res.writableEnded) next(); + }); + } + } +} + +export function Route(method: Method, path: string): MethodDecorator { + return function(target: any, propertyKey: string, descriptor: PropertyDescriptor): void { + const map = routes.get(target.constructor) || []; + map.push({ path, method, name: propertyKey }); + routes.set(target.constructor, map); + }; +} + +export function Delete(path: string): MethodDecorator { + return Route(Method.DELETE, path); +} + +export function Get(path: string): MethodDecorator { + return Route(Method.GET, path); +} + +export function Post(path: string): MethodDecorator { + return Route(Method.POST, path); +} + +export function Put(path: string): MethodDecorator { + return Route(Method.PUT, path); +} diff --git a/solutions/day-04/api/tsconfig.json b/solutions/day-04/api/tsconfig.json @@ -18,6 +18,8 @@ "forceConsistentCasingInFileNames": false, "noFallthroughCasesInSwitch": false, "paths": { + "@common": ["src/common"], + "@common/*": ["src/common/*"], "@config": ["src/config"], "@config/*": ["src/config/*"] } diff --git a/solutions/day-04/docker-compose.yml b/solutions/day-04/docker-compose.yml @@ -15,19 +15,18 @@ services: web: build: context: web - command: npm start depends_on: - api - nginx-proxy volumes: - - ./web:/app + - ./web/dist:/srv/www networks: - webproxy ports: - 3000:3000 environment: - - PORT=3000 - - VIRTUAL_PORT=3000 + - PORT=5000 + - VIRTUAL_PORT=5000 - VIRTUAL_HOST=web.docker api: @@ -35,7 +34,6 @@ services: context: api command: npm run start:dev depends_on: - - mongo - nginx-proxy volumes: - ./api:/app @@ -46,40 +44,20 @@ services: - 3010:5000 environment: - PORT=5000 - - DB_TYPE=mongodb - - DB_HOST=mongo - - DB_PORT=27017 - - DDB_NAME=database - VIRTUAL_PORT=5000 - VIRTUAL_HOST=api.docker - mongo: - image: mongo:latest - environment: - - MONGO_INITDB_DATABASE=database - - MONGO_INITDB_ROOT_USERNAME=root - - MONGO_INITDB_ROOT_PASSWORD=super_secret - volumes: - - ./docker/mongo/init.js:/docker-entrypoint-initdb.d/init-mongo.js:ro - - ./data/mongo:/data/db - networks: - - default - ports: - - "27017-27019:27017-27019" - - adminer: - image: finwo/adminer - restart: always - ports: - - 4000:8080 - depends_on: - - mongo - networks: - - webproxy - - default - environment: - - VIRTUAL_PORT=8080 - - VIRTUAL_HOST=adminer.docker + # adminer: + # image: finwo/adminer + # restart: always + # ports: + # - 4000:8080 + # networks: + # - webproxy + # - default + # environment: + # - VIRTUAL_PORT=8080 + # - VIRTUAL_HOST=adminer.docker networks: default: diff --git a/solutions/day-04/docker/mongo/init.js b/solutions/day-04/docker/mongo/init.js @@ -1,10 +0,0 @@ -db.createUser({ - user : "username", - pwd : "password", - roles : [ - { - role : "readWrite", - db : "database" - } - ], -});