├── .gitignore ├── Dockerfile ├── README.md ├── benchmarking-results ├── 1.before-caching.txt └── 2.after-caching.txt ├── docker-compose.yml ├── package-lock.json ├── package.json └── src ├── db.js ├── index-cached.js ├── index-nocache.js └── seeder.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Microbundle cache 58 | .rpt2_cache/ 59 | .rts2_cache_cjs/ 60 | .rts2_cache_es/ 61 | .rts2_cache_umd/ 62 | 63 | # Optional REPL history 64 | .node_repl_history 65 | 66 | # Output of 'npm pack' 67 | *.tgz 68 | 69 | # Yarn Integrity file 70 | .yarn-integrity 71 | 72 | # dotenv environment variables file 73 | .env 74 | .env.test 75 | .env.production 76 | 77 | # parcel-bundler cache (https://parceljs.org/) 78 | .cache 79 | .parcel-cache 80 | 81 | # Next.js build output 82 | .next 83 | out 84 | 85 | # Nuxt.js build / generate output 86 | .nuxt 87 | dist 88 | 89 | # Gatsby files 90 | .cache/ 91 | # Comment in the public line in if your project uses Gatsby and not Next.js 92 | # https://nextjs.org/blog/next-9-1#public-directory-support 93 | # public 94 | 95 | # vuepress build output 96 | .vuepress/dist 97 | 98 | # Serverless directories 99 | .serverless/ 100 | 101 | # FuseBox cache 102 | .fusebox/ 103 | 104 | # DynamoDB Local files 105 | .dynamodb/ 106 | 107 | # TernJS port file 108 | .tern-port 109 | 110 | # Stores VSCode versions used for testing VSCode extensions 111 | .vscode-test 112 | 113 | # yarn v2 114 | .yarn/cache 115 | .yarn/unplugged 116 | .yarn/build-state.yml 117 | .yarn/install-state.gz 118 | .pnp.* 119 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:16-alpine 2 | 3 | WORKDIR /src/ 4 | 5 | COPY package.json package-lock.json /src/ 6 | 7 | RUN npm ci --silent 8 | 9 | COPY . /src 10 | 11 | CMD npm run seed-and-servers -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # poc-100ms-cache-nodejs 2 | 3 | An Example to show how 100ms cache would double your capacity of throuput using NodeCache as an example of caching. 4 | 5 | ## Running 6 | - docker-compose up --build 7 | - npm ci --silent 8 | - npm run loadtest:nocache 9 | - npm run loadtest:cached 10 | 11 | ## Author 12 | - @erickwendel -------------------------------------------------------------------------------- /benchmarking-results/1.before-caching.txt: -------------------------------------------------------------------------------- 1 | > npx autocannon -c 100 -d 10 localhost:4000 --renderStatusCodes 2 | 3 | Running 10s test @ http://localhost:4000 4 | 100 connections 5 | 6 | ┌─────────┬────────┬────────┬────────┬─────────┬───────────┬───────────┬─────────┐ 7 | │ Stat │ 2.5% │ 50% │ 97.5% │ 99% │ Avg │ Stdev │ Max │ 8 | ├─────────┼────────┼────────┼────────┼─────────┼───────────┼───────────┼─────────┤ 9 | │ Latency │ 216 ms │ 300 ms │ 970 ms │ 1069 ms │ 347.45 ms │ 160.99 ms │ 1146 ms │ 10 | └─────────┴────────┴────────┴────────┴─────────┴───────────┴───────────┴─────────┘ 11 | ┌───────────┬─────────┬─────────┬────────┬────────┬────────┬─────────┬─────────┐ 12 | │ Stat │ 1% │ 2.5% │ 50% │ 97.5% │ Avg │ Stdev │ Min │ 13 | ├───────────┼─────────┼─────────┼────────┼────────┼────────┼─────────┼─────────┤ 14 | │ Req/Sec │ 52 │ 52 │ 306 │ 401 │ 283.8 │ 93.34 │ 52 │ 15 | ├───────────┼─────────┼─────────┼────────┼────────┼────────┼─────────┼─────────┤ 16 | │ Bytes/Sec │ 24.4 kB │ 24.4 kB │ 144 kB │ 190 kB │ 134 kB │ 44.2 kB │ 24.4 kB │ 17 | └───────────┴─────────┴─────────┴────────┴────────┴────────┴─────────┴─────────┘ 18 | ┌──────┬───────┐ 19 | │ Code │ Count │ 20 | ├──────┼───────┤ 21 | │ 200 │ 2838 │ 22 | └──────┴───────┘ 23 | 24 | Req/Bytes counts sampled once per second. 25 | 26 | 3k requests in 10.07s, 1.34 MB read -------------------------------------------------------------------------------- /benchmarking-results/2.after-caching.txt: -------------------------------------------------------------------------------- 1 | ⬢ poc-100ms-cache npm run loadtest 2 | 3 | > poc-100ms-cache@1.0.0 loadtest 4 | > npx autocannon -c 100 -d 10 localhost:3000 --renderStatusCodes 5 | 6 | Running 10s test @ http://localhost:3000 7 | 100 connections 8 | 9 | ┌─────────┬───────┬────────┬────────┬─────────┬───────────┬───────────┬─────────┐ 10 | │ Stat │ 2.5% │ 50% │ 97.5% │ 99% │ Avg │ Stdev │ Max │ 11 | ├─────────┼───────┼────────┼────────┼─────────┼───────────┼───────────┼─────────┤ 12 | │ Latency │ 49 ms │ 111 ms │ 944 ms │ 1289 ms │ 169.87 ms │ 240.39 ms │ 2458 ms │ 13 | └─────────┴───────┴────────┴────────┴─────────┴───────────┴───────────┴─────────┘ 14 | ┌───────────┬─────────┬─────────┬────────┬────────┬────────┬─────────┬─────────┐ 15 | │ Stat │ 1% │ 2.5% │ 50% │ 97.5% │ Avg │ Stdev │ Min │ 16 | ├───────────┼─────────┼─────────┼────────┼────────┼────────┼─────────┼─────────┤ 17 | │ Req/Sec │ 187 │ 187 │ 590 │ 767 │ 579.8 │ 144.96 │ 187 │ 18 | ├───────────┼─────────┼─────────┼────────┼────────┼────────┼─────────┼─────────┤ 19 | │ Bytes/Sec │ 85.2 kB │ 85.2 kB │ 270 kB │ 353 kB │ 265 kB │ 66.7 kB │ 85.2 kB │ 20 | └───────────┴─────────┴─────────┴────────┴────────┴────────┴─────────┴─────────┘ 21 | ┌──────┬───────┐ 22 | │ Code │ Count │ 23 | ├──────┼───────┤ 24 | │ 200 │ 5798 │ 25 | └──────┴───────┘ 26 | 27 | Req/Bytes counts sampled once per second. 28 | 29 | 6k requests in 10.05s, 2.65 MB read 30 | 31 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | api-heroes-caching: 4 | container_name: api-heroes-caching 5 | build: . 6 | ports: 7 | - 3000:3000 8 | - 4000:4000 9 | environment: 10 | POSTGRES_HOST: postgres:mysecretpassword@postgres:5432 11 | 12 | depends_on: 13 | - postgres 14 | links: 15 | - postgres 16 | # volumes: 17 | # - .:/src 18 | # - nodemodules:/src/node_modules 19 | 20 | postgres: 21 | container_name: postgres 22 | restart: always 23 | image: postgres 24 | ports: 25 | - 5432:5432 26 | environment: 27 | POSTGRES_PASSWORD: mysecretpassword 28 | POSTGRES_DB: heroes 29 | volumes: 30 | - db-data:/var/lib/postgresql/data 31 | 32 | volumes: 33 | db-data: {} -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "poc-100ms-cache", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "poc-100ms-cache", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "concurrently": "^6.4.0", 13 | "faker": "^5.5.3", 14 | "node-cache": "^5.1.2", 15 | "pg": "^8.7.1", 16 | "sequelize": "^6.12.0-alpha.1" 17 | }, 18 | "devDependencies": { 19 | "autocannon": "^7.5.0" 20 | } 21 | }, 22 | "node_modules/@assemblyscript/loader": { 23 | "version": "0.10.1", 24 | "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", 25 | "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", 26 | "dev": true 27 | }, 28 | "node_modules/@types/debug": { 29 | "version": "4.1.7", 30 | "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", 31 | "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", 32 | "dependencies": { 33 | "@types/ms": "*" 34 | } 35 | }, 36 | "node_modules/@types/ms": { 37 | "version": "0.7.31", 38 | "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", 39 | "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" 40 | }, 41 | "node_modules/@types/node": { 42 | "version": "16.11.9", 43 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.9.tgz", 44 | "integrity": "sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A==" 45 | }, 46 | "node_modules/ansi-regex": { 47 | "version": "5.0.1", 48 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 49 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 50 | "engines": { 51 | "node": ">=8" 52 | } 53 | }, 54 | "node_modules/ansi-styles": { 55 | "version": "4.3.0", 56 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 57 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 58 | "dependencies": { 59 | "color-convert": "^2.0.1" 60 | }, 61 | "engines": { 62 | "node": ">=8" 63 | }, 64 | "funding": { 65 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 66 | } 67 | }, 68 | "node_modules/any-promise": { 69 | "version": "1.3.0", 70 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 71 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 72 | }, 73 | "node_modules/asynckit": { 74 | "version": "0.4.0", 75 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 76 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 77 | "dev": true 78 | }, 79 | "node_modules/autocannon": { 80 | "version": "7.5.0", 81 | "resolved": "https://registry.npmjs.org/autocannon/-/autocannon-7.5.0.tgz", 82 | "integrity": "sha512-jl5UAnOqRQaczv2zQXBjYupXJgHBLEd5T7L1eYHXiu6XR8ZoxA082WDpj5pccMFg06F1y6cXcbP8roOibZOJhw==", 83 | "dev": true, 84 | "dependencies": { 85 | "chalk": "^4.1.0", 86 | "char-spinner": "^1.0.1", 87 | "cli-table3": "^0.6.0", 88 | "color-support": "^1.1.1", 89 | "cross-argv": "^1.0.0", 90 | "form-data": "^4.0.0", 91 | "has-async-hooks": "^1.0.0", 92 | "hdr-histogram-js": "^2.0.1", 93 | "hdr-histogram-percentiles-obj": "^3.0.0", 94 | "http-parser-js": "^0.5.2", 95 | "hyperid": "^2.0.3", 96 | "lodash.clonedeep": "^4.5.0", 97 | "manage-path": "^2.0.0", 98 | "on-net-listen": "^1.1.1", 99 | "pretty-bytes": "^5.4.1", 100 | "progress": "^2.0.3", 101 | "reinterval": "^1.1.0", 102 | "retimer": "^3.0.0", 103 | "semver": "^7.3.2", 104 | "subarg": "^1.0.0", 105 | "timestring": "^6.0.0" 106 | }, 107 | "bin": { 108 | "autocannon": "autocannon.js" 109 | } 110 | }, 111 | "node_modules/base64-js": { 112 | "version": "1.5.1", 113 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 114 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 115 | "dev": true, 116 | "funding": [ 117 | { 118 | "type": "github", 119 | "url": "https://github.com/sponsors/feross" 120 | }, 121 | { 122 | "type": "patreon", 123 | "url": "https://www.patreon.com/feross" 124 | }, 125 | { 126 | "type": "consulting", 127 | "url": "https://feross.org/support" 128 | } 129 | ] 130 | }, 131 | "node_modules/buffer-writer": { 132 | "version": "2.0.0", 133 | "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", 134 | "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", 135 | "engines": { 136 | "node": ">=4" 137 | } 138 | }, 139 | "node_modules/chalk": { 140 | "version": "4.1.2", 141 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 142 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 143 | "dependencies": { 144 | "ansi-styles": "^4.1.0", 145 | "supports-color": "^7.1.0" 146 | }, 147 | "engines": { 148 | "node": ">=10" 149 | }, 150 | "funding": { 151 | "url": "https://github.com/chalk/chalk?sponsor=1" 152 | } 153 | }, 154 | "node_modules/chalk/node_modules/supports-color": { 155 | "version": "7.2.0", 156 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 157 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 158 | "dependencies": { 159 | "has-flag": "^4.0.0" 160 | }, 161 | "engines": { 162 | "node": ">=8" 163 | } 164 | }, 165 | "node_modules/char-spinner": { 166 | "version": "1.0.1", 167 | "resolved": "https://registry.npmjs.org/char-spinner/-/char-spinner-1.0.1.tgz", 168 | "integrity": "sha1-5upnvSR+EHESmDt6sEee02KAAIE=", 169 | "dev": true 170 | }, 171 | "node_modules/cli-table3": { 172 | "version": "0.6.0", 173 | "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", 174 | "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", 175 | "dev": true, 176 | "dependencies": { 177 | "object-assign": "^4.1.0", 178 | "string-width": "^4.2.0" 179 | }, 180 | "engines": { 181 | "node": "10.* || >= 12.*" 182 | }, 183 | "optionalDependencies": { 184 | "colors": "^1.1.2" 185 | } 186 | }, 187 | "node_modules/cliui": { 188 | "version": "7.0.4", 189 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 190 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 191 | "dependencies": { 192 | "string-width": "^4.2.0", 193 | "strip-ansi": "^6.0.0", 194 | "wrap-ansi": "^7.0.0" 195 | } 196 | }, 197 | "node_modules/clone": { 198 | "version": "2.1.2", 199 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 200 | "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", 201 | "engines": { 202 | "node": ">=0.8" 203 | } 204 | }, 205 | "node_modules/color-convert": { 206 | "version": "2.0.1", 207 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 208 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 209 | "dependencies": { 210 | "color-name": "~1.1.4" 211 | }, 212 | "engines": { 213 | "node": ">=7.0.0" 214 | } 215 | }, 216 | "node_modules/color-name": { 217 | "version": "1.1.4", 218 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 219 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 220 | }, 221 | "node_modules/color-support": { 222 | "version": "1.1.3", 223 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 224 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 225 | "dev": true, 226 | "bin": { 227 | "color-support": "bin.js" 228 | } 229 | }, 230 | "node_modules/colors": { 231 | "version": "1.4.0", 232 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 233 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", 234 | "dev": true, 235 | "optional": true, 236 | "engines": { 237 | "node": ">=0.1.90" 238 | } 239 | }, 240 | "node_modules/combined-stream": { 241 | "version": "1.0.8", 242 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 243 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 244 | "dev": true, 245 | "dependencies": { 246 | "delayed-stream": "~1.0.0" 247 | }, 248 | "engines": { 249 | "node": ">= 0.8" 250 | } 251 | }, 252 | "node_modules/concurrently": { 253 | "version": "6.4.0", 254 | "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.4.0.tgz", 255 | "integrity": "sha512-HZ3D0RTQMH3oS4gvtYj1P+NBc6PzE2McEra6yEFcQKrUQ9HvtTGU4Dbne083F034p+LRb7kWU0tPRNvSGs1UCQ==", 256 | "dependencies": { 257 | "chalk": "^4.1.0", 258 | "date-fns": "^2.16.1", 259 | "lodash": "^4.17.21", 260 | "rxjs": "^6.6.3", 261 | "spawn-command": "^0.0.2-1", 262 | "supports-color": "^8.1.0", 263 | "tree-kill": "^1.2.2", 264 | "yargs": "^16.2.0" 265 | }, 266 | "bin": { 267 | "concurrently": "bin/concurrently.js" 268 | }, 269 | "engines": { 270 | "node": ">=10.0.0" 271 | } 272 | }, 273 | "node_modules/cross-argv": { 274 | "version": "1.0.0", 275 | "resolved": "https://registry.npmjs.org/cross-argv/-/cross-argv-1.0.0.tgz", 276 | "integrity": "sha512-uAVe/bgNHlPdP1VE4Sk08u9pAJ7o1x/tVQtX77T5zlhYhuwOWtVkPBEtHdvF5cq48VzeCG5i1zN4dQc8pwLYrw==", 277 | "dev": true 278 | }, 279 | "node_modules/date-fns": { 280 | "version": "2.26.0", 281 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.26.0.tgz", 282 | "integrity": "sha512-VQI812dRi3cusdY/fhoBKvc6l2W8BPWU1FNVnFH9Nttjx4AFBRzfSVb/Eyc7jBT6e9sg1XtAGsYpBQ6c/jygbg==", 283 | "engines": { 284 | "node": ">=0.11" 285 | }, 286 | "funding": { 287 | "type": "opencollective", 288 | "url": "https://opencollective.com/date-fns" 289 | } 290 | }, 291 | "node_modules/debug": { 292 | "version": "4.3.2", 293 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 294 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 295 | "dependencies": { 296 | "ms": "2.1.2" 297 | }, 298 | "engines": { 299 | "node": ">=6.0" 300 | }, 301 | "peerDependenciesMeta": { 302 | "supports-color": { 303 | "optional": true 304 | } 305 | } 306 | }, 307 | "node_modules/delayed-stream": { 308 | "version": "1.0.0", 309 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 310 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 311 | "dev": true, 312 | "engines": { 313 | "node": ">=0.4.0" 314 | } 315 | }, 316 | "node_modules/dottie": { 317 | "version": "2.0.2", 318 | "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", 319 | "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" 320 | }, 321 | "node_modules/emoji-regex": { 322 | "version": "8.0.0", 323 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 324 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 325 | }, 326 | "node_modules/escalade": { 327 | "version": "3.1.1", 328 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 329 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 330 | "engines": { 331 | "node": ">=6" 332 | } 333 | }, 334 | "node_modules/faker": { 335 | "version": "5.5.3", 336 | "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", 337 | "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==" 338 | }, 339 | "node_modules/form-data": { 340 | "version": "4.0.0", 341 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 342 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 343 | "dev": true, 344 | "dependencies": { 345 | "asynckit": "^0.4.0", 346 | "combined-stream": "^1.0.8", 347 | "mime-types": "^2.1.12" 348 | }, 349 | "engines": { 350 | "node": ">= 6" 351 | } 352 | }, 353 | "node_modules/get-caller-file": { 354 | "version": "2.0.5", 355 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 356 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 357 | "engines": { 358 | "node": "6.* || 8.* || >= 10.*" 359 | } 360 | }, 361 | "node_modules/has-async-hooks": { 362 | "version": "1.0.0", 363 | "resolved": "https://registry.npmjs.org/has-async-hooks/-/has-async-hooks-1.0.0.tgz", 364 | "integrity": "sha512-YF0VPGjkxr7AyyQQNykX8zK4PvtEDsUJAPqwu06UFz1lb6EvI53sPh5H1kWxg8NXI5LsfRCZ8uX9NkYDZBb/mw==", 365 | "dev": true 366 | }, 367 | "node_modules/has-flag": { 368 | "version": "4.0.0", 369 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 370 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 371 | "engines": { 372 | "node": ">=8" 373 | } 374 | }, 375 | "node_modules/hdr-histogram-js": { 376 | "version": "2.0.1", 377 | "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.1.tgz", 378 | "integrity": "sha512-uPZxl1dAFnjUFHWLZmt93vUUvtHeaBay9nVNHu38SdOjMSF/4KqJUqa1Seuj08ptU1rEb6AHvB41X8n/zFZ74Q==", 379 | "dev": true, 380 | "dependencies": { 381 | "@assemblyscript/loader": "^0.10.1", 382 | "base64-js": "^1.2.0", 383 | "pako": "^1.0.3" 384 | } 385 | }, 386 | "node_modules/hdr-histogram-percentiles-obj": { 387 | "version": "3.0.0", 388 | "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", 389 | "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", 390 | "dev": true 391 | }, 392 | "node_modules/http-parser-js": { 393 | "version": "0.5.3", 394 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", 395 | "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", 396 | "dev": true 397 | }, 398 | "node_modules/hyperid": { 399 | "version": "2.3.1", 400 | "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-2.3.1.tgz", 401 | "integrity": "sha512-mIbI7Ymn6MCdODaW1/6wdf5lvvXzmPsARN4zTLakMmcziBOuP4PxCBJvHF6kbAIHX6H4vAELx/pDmt0j6Th5RQ==", 402 | "dev": true, 403 | "dependencies": { 404 | "uuid": "^8.3.2", 405 | "uuid-parse": "^1.1.0" 406 | } 407 | }, 408 | "node_modules/inflection": { 409 | "version": "1.13.1", 410 | "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.1.tgz", 411 | "integrity": "sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA==", 412 | "engines": [ 413 | "node >= 0.4.0" 414 | ] 415 | }, 416 | "node_modules/inherits": { 417 | "version": "2.0.4", 418 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 419 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 420 | }, 421 | "node_modules/is-fullwidth-code-point": { 422 | "version": "3.0.0", 423 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 424 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 425 | "engines": { 426 | "node": ">=8" 427 | } 428 | }, 429 | "node_modules/lodash": { 430 | "version": "4.17.21", 431 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 432 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 433 | }, 434 | "node_modules/lodash.clonedeep": { 435 | "version": "4.5.0", 436 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 437 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", 438 | "dev": true 439 | }, 440 | "node_modules/lru-cache": { 441 | "version": "6.0.0", 442 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 443 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 444 | "dependencies": { 445 | "yallist": "^4.0.0" 446 | }, 447 | "engines": { 448 | "node": ">=10" 449 | } 450 | }, 451 | "node_modules/manage-path": { 452 | "version": "2.0.0", 453 | "resolved": "https://registry.npmjs.org/manage-path/-/manage-path-2.0.0.tgz", 454 | "integrity": "sha1-9M+EV7km7u4qg7FzUBQUvHbrlZc=", 455 | "dev": true 456 | }, 457 | "node_modules/mime-db": { 458 | "version": "1.51.0", 459 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 460 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", 461 | "dev": true, 462 | "engines": { 463 | "node": ">= 0.6" 464 | } 465 | }, 466 | "node_modules/mime-types": { 467 | "version": "2.1.34", 468 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 469 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 470 | "dev": true, 471 | "dependencies": { 472 | "mime-db": "1.51.0" 473 | }, 474 | "engines": { 475 | "node": ">= 0.6" 476 | } 477 | }, 478 | "node_modules/minimist": { 479 | "version": "1.2.5", 480 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 481 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 482 | "dev": true 483 | }, 484 | "node_modules/moment": { 485 | "version": "2.29.1", 486 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", 487 | "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", 488 | "engines": { 489 | "node": "*" 490 | } 491 | }, 492 | "node_modules/moment-timezone": { 493 | "version": "0.5.34", 494 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz", 495 | "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==", 496 | "dependencies": { 497 | "moment": ">= 2.9.0" 498 | }, 499 | "engines": { 500 | "node": "*" 501 | } 502 | }, 503 | "node_modules/ms": { 504 | "version": "2.1.2", 505 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 506 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 507 | }, 508 | "node_modules/node-cache": { 509 | "version": "5.1.2", 510 | "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", 511 | "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", 512 | "dependencies": { 513 | "clone": "2.x" 514 | }, 515 | "engines": { 516 | "node": ">= 8.0.0" 517 | } 518 | }, 519 | "node_modules/object-assign": { 520 | "version": "4.1.1", 521 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 522 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 523 | "dev": true, 524 | "engines": { 525 | "node": ">=0.10.0" 526 | } 527 | }, 528 | "node_modules/on-net-listen": { 529 | "version": "1.1.2", 530 | "resolved": "https://registry.npmjs.org/on-net-listen/-/on-net-listen-1.1.2.tgz", 531 | "integrity": "sha512-y1HRYy8s/RlcBvDUwKXSmkODMdx4KSuIvloCnQYJ2LdBBC1asY4HtfhXwe3UWknLakATZDnbzht2Ijw3M1EqFg==", 532 | "dev": true, 533 | "engines": { 534 | "node": ">=9.4.0 || ^8.9.4" 535 | } 536 | }, 537 | "node_modules/packet-reader": { 538 | "version": "1.0.0", 539 | "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", 540 | "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" 541 | }, 542 | "node_modules/pako": { 543 | "version": "1.0.11", 544 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 545 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", 546 | "dev": true 547 | }, 548 | "node_modules/pg": { 549 | "version": "8.7.1", 550 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.1.tgz", 551 | "integrity": "sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA==", 552 | "dependencies": { 553 | "buffer-writer": "2.0.0", 554 | "packet-reader": "1.0.0", 555 | "pg-connection-string": "^2.5.0", 556 | "pg-pool": "^3.4.1", 557 | "pg-protocol": "^1.5.0", 558 | "pg-types": "^2.1.0", 559 | "pgpass": "1.x" 560 | }, 561 | "engines": { 562 | "node": ">= 8.0.0" 563 | }, 564 | "peerDependencies": { 565 | "pg-native": ">=2.0.0" 566 | }, 567 | "peerDependenciesMeta": { 568 | "pg-native": { 569 | "optional": true 570 | } 571 | } 572 | }, 573 | "node_modules/pg-connection-string": { 574 | "version": "2.5.0", 575 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", 576 | "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" 577 | }, 578 | "node_modules/pg-int8": { 579 | "version": "1.0.1", 580 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 581 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", 582 | "engines": { 583 | "node": ">=4.0.0" 584 | } 585 | }, 586 | "node_modules/pg-pool": { 587 | "version": "3.4.1", 588 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.4.1.tgz", 589 | "integrity": "sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ==", 590 | "peerDependencies": { 591 | "pg": ">=8.0" 592 | } 593 | }, 594 | "node_modules/pg-protocol": { 595 | "version": "1.5.0", 596 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", 597 | "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" 598 | }, 599 | "node_modules/pg-types": { 600 | "version": "2.2.0", 601 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 602 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 603 | "dependencies": { 604 | "pg-int8": "1.0.1", 605 | "postgres-array": "~2.0.0", 606 | "postgres-bytea": "~1.0.0", 607 | "postgres-date": "~1.0.4", 608 | "postgres-interval": "^1.1.0" 609 | }, 610 | "engines": { 611 | "node": ">=4" 612 | } 613 | }, 614 | "node_modules/pgpass": { 615 | "version": "1.0.4", 616 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz", 617 | "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==", 618 | "dependencies": { 619 | "split2": "^3.1.1" 620 | } 621 | }, 622 | "node_modules/postgres-array": { 623 | "version": "2.0.0", 624 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 625 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", 626 | "engines": { 627 | "node": ">=4" 628 | } 629 | }, 630 | "node_modules/postgres-bytea": { 631 | "version": "1.0.0", 632 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 633 | "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=", 634 | "engines": { 635 | "node": ">=0.10.0" 636 | } 637 | }, 638 | "node_modules/postgres-date": { 639 | "version": "1.0.7", 640 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 641 | "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", 642 | "engines": { 643 | "node": ">=0.10.0" 644 | } 645 | }, 646 | "node_modules/postgres-interval": { 647 | "version": "1.2.0", 648 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 649 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 650 | "dependencies": { 651 | "xtend": "^4.0.0" 652 | }, 653 | "engines": { 654 | "node": ">=0.10.0" 655 | } 656 | }, 657 | "node_modules/pretty-bytes": { 658 | "version": "5.6.0", 659 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", 660 | "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", 661 | "dev": true, 662 | "engines": { 663 | "node": ">=6" 664 | }, 665 | "funding": { 666 | "url": "https://github.com/sponsors/sindresorhus" 667 | } 668 | }, 669 | "node_modules/progress": { 670 | "version": "2.0.3", 671 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 672 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 673 | "dev": true, 674 | "engines": { 675 | "node": ">=0.4.0" 676 | } 677 | }, 678 | "node_modules/readable-stream": { 679 | "version": "3.6.0", 680 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 681 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 682 | "dependencies": { 683 | "inherits": "^2.0.3", 684 | "string_decoder": "^1.1.1", 685 | "util-deprecate": "^1.0.1" 686 | }, 687 | "engines": { 688 | "node": ">= 6" 689 | } 690 | }, 691 | "node_modules/reinterval": { 692 | "version": "1.1.0", 693 | "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", 694 | "integrity": "sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=", 695 | "dev": true 696 | }, 697 | "node_modules/require-directory": { 698 | "version": "2.1.1", 699 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 700 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 701 | "engines": { 702 | "node": ">=0.10.0" 703 | } 704 | }, 705 | "node_modules/retimer": { 706 | "version": "3.0.0", 707 | "resolved": "https://registry.npmjs.org/retimer/-/retimer-3.0.0.tgz", 708 | "integrity": "sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==", 709 | "dev": true 710 | }, 711 | "node_modules/retry-as-promised": { 712 | "version": "3.2.0", 713 | "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", 714 | "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", 715 | "dependencies": { 716 | "any-promise": "^1.3.0" 717 | } 718 | }, 719 | "node_modules/rxjs": { 720 | "version": "6.6.7", 721 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 722 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 723 | "dependencies": { 724 | "tslib": "^1.9.0" 725 | }, 726 | "engines": { 727 | "npm": ">=2.0.0" 728 | } 729 | }, 730 | "node_modules/safe-buffer": { 731 | "version": "5.2.1", 732 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 733 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 734 | "funding": [ 735 | { 736 | "type": "github", 737 | "url": "https://github.com/sponsors/feross" 738 | }, 739 | { 740 | "type": "patreon", 741 | "url": "https://www.patreon.com/feross" 742 | }, 743 | { 744 | "type": "consulting", 745 | "url": "https://feross.org/support" 746 | } 747 | ] 748 | }, 749 | "node_modules/semver": { 750 | "version": "7.3.5", 751 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 752 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 753 | "dependencies": { 754 | "lru-cache": "^6.0.0" 755 | }, 756 | "bin": { 757 | "semver": "bin/semver.js" 758 | }, 759 | "engines": { 760 | "node": ">=10" 761 | } 762 | }, 763 | "node_modules/sequelize": { 764 | "version": "6.12.0-alpha.1", 765 | "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.12.0-alpha.1.tgz", 766 | "integrity": "sha512-MrjM8GJtUKhuc3ZkGbhlSr1DQdce3oRAI4STwgurfO0utBcdQE0kC1O3hp752XRFwzM+brH9Oy/dbVkupIZ4BQ==", 767 | "dependencies": { 768 | "@types/debug": "^4.1.7", 769 | "debug": "^4.1.1", 770 | "dottie": "^2.0.0", 771 | "inflection": "1.13.1", 772 | "lodash": "^4.17.20", 773 | "moment": "^2.26.0", 774 | "moment-timezone": "^0.5.31", 775 | "pg-connection-string": "^2.5.0", 776 | "retry-as-promised": "^3.2.0", 777 | "semver": "^7.3.2", 778 | "sequelize-pool": "^6.0.0", 779 | "toposort-class": "^1.0.1", 780 | "uuid": "^8.1.0", 781 | "validator": "^13.7.0", 782 | "wkx": "^0.5.0" 783 | }, 784 | "engines": { 785 | "node": ">=10.0.0" 786 | }, 787 | "peerDependenciesMeta": { 788 | "mariadb": { 789 | "optional": true 790 | }, 791 | "mysql2": { 792 | "optional": true 793 | }, 794 | "pg": { 795 | "optional": true 796 | }, 797 | "pg-hstore": { 798 | "optional": true 799 | }, 800 | "sqlite3": { 801 | "optional": true 802 | }, 803 | "tedious": { 804 | "optional": true 805 | } 806 | } 807 | }, 808 | "node_modules/sequelize-pool": { 809 | "version": "6.1.0", 810 | "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-6.1.0.tgz", 811 | "integrity": "sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg==", 812 | "engines": { 813 | "node": ">= 10.0.0" 814 | } 815 | }, 816 | "node_modules/spawn-command": { 817 | "version": "0.0.2-1", 818 | "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", 819 | "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=" 820 | }, 821 | "node_modules/split2": { 822 | "version": "3.2.2", 823 | "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", 824 | "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", 825 | "dependencies": { 826 | "readable-stream": "^3.0.0" 827 | } 828 | }, 829 | "node_modules/string_decoder": { 830 | "version": "1.3.0", 831 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 832 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 833 | "dependencies": { 834 | "safe-buffer": "~5.2.0" 835 | } 836 | }, 837 | "node_modules/string-width": { 838 | "version": "4.2.3", 839 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 840 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 841 | "dependencies": { 842 | "emoji-regex": "^8.0.0", 843 | "is-fullwidth-code-point": "^3.0.0", 844 | "strip-ansi": "^6.0.1" 845 | }, 846 | "engines": { 847 | "node": ">=8" 848 | } 849 | }, 850 | "node_modules/strip-ansi": { 851 | "version": "6.0.1", 852 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 853 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 854 | "dependencies": { 855 | "ansi-regex": "^5.0.1" 856 | }, 857 | "engines": { 858 | "node": ">=8" 859 | } 860 | }, 861 | "node_modules/subarg": { 862 | "version": "1.0.0", 863 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", 864 | "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", 865 | "dev": true, 866 | "dependencies": { 867 | "minimist": "^1.1.0" 868 | } 869 | }, 870 | "node_modules/supports-color": { 871 | "version": "8.1.1", 872 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 873 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 874 | "dependencies": { 875 | "has-flag": "^4.0.0" 876 | }, 877 | "engines": { 878 | "node": ">=10" 879 | }, 880 | "funding": { 881 | "url": "https://github.com/chalk/supports-color?sponsor=1" 882 | } 883 | }, 884 | "node_modules/timestring": { 885 | "version": "6.0.0", 886 | "resolved": "https://registry.npmjs.org/timestring/-/timestring-6.0.0.tgz", 887 | "integrity": "sha512-wMctrWD2HZZLuIlchlkE2dfXJh7J2KDI9Dwl+2abPYg0mswQHfOAyQW3jJg1pY5VfttSINZuKcXoB3FGypVklA==", 888 | "dev": true, 889 | "engines": { 890 | "node": ">=8" 891 | } 892 | }, 893 | "node_modules/toposort-class": { 894 | "version": "1.0.1", 895 | "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", 896 | "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" 897 | }, 898 | "node_modules/tree-kill": { 899 | "version": "1.2.2", 900 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 901 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 902 | "bin": { 903 | "tree-kill": "cli.js" 904 | } 905 | }, 906 | "node_modules/tslib": { 907 | "version": "1.14.1", 908 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 909 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 910 | }, 911 | "node_modules/util-deprecate": { 912 | "version": "1.0.2", 913 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 914 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 915 | }, 916 | "node_modules/uuid": { 917 | "version": "8.3.2", 918 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 919 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 920 | "bin": { 921 | "uuid": "dist/bin/uuid" 922 | } 923 | }, 924 | "node_modules/uuid-parse": { 925 | "version": "1.1.0", 926 | "resolved": "https://registry.npmjs.org/uuid-parse/-/uuid-parse-1.1.0.tgz", 927 | "integrity": "sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==", 928 | "dev": true 929 | }, 930 | "node_modules/validator": { 931 | "version": "13.7.0", 932 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", 933 | "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", 934 | "engines": { 935 | "node": ">= 0.10" 936 | } 937 | }, 938 | "node_modules/wkx": { 939 | "version": "0.5.0", 940 | "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", 941 | "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", 942 | "dependencies": { 943 | "@types/node": "*" 944 | } 945 | }, 946 | "node_modules/wrap-ansi": { 947 | "version": "7.0.0", 948 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 949 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 950 | "dependencies": { 951 | "ansi-styles": "^4.0.0", 952 | "string-width": "^4.1.0", 953 | "strip-ansi": "^6.0.0" 954 | }, 955 | "engines": { 956 | "node": ">=10" 957 | }, 958 | "funding": { 959 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 960 | } 961 | }, 962 | "node_modules/xtend": { 963 | "version": "4.0.2", 964 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 965 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 966 | "engines": { 967 | "node": ">=0.4" 968 | } 969 | }, 970 | "node_modules/y18n": { 971 | "version": "5.0.8", 972 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 973 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 974 | "engines": { 975 | "node": ">=10" 976 | } 977 | }, 978 | "node_modules/yallist": { 979 | "version": "4.0.0", 980 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 981 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 982 | }, 983 | "node_modules/yargs": { 984 | "version": "16.2.0", 985 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 986 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 987 | "dependencies": { 988 | "cliui": "^7.0.2", 989 | "escalade": "^3.1.1", 990 | "get-caller-file": "^2.0.5", 991 | "require-directory": "^2.1.1", 992 | "string-width": "^4.2.0", 993 | "y18n": "^5.0.5", 994 | "yargs-parser": "^20.2.2" 995 | }, 996 | "engines": { 997 | "node": ">=10" 998 | } 999 | }, 1000 | "node_modules/yargs-parser": { 1001 | "version": "20.2.9", 1002 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 1003 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 1004 | "engines": { 1005 | "node": ">=10" 1006 | } 1007 | } 1008 | }, 1009 | "dependencies": { 1010 | "@assemblyscript/loader": { 1011 | "version": "0.10.1", 1012 | "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", 1013 | "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", 1014 | "dev": true 1015 | }, 1016 | "@types/debug": { 1017 | "version": "4.1.7", 1018 | "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", 1019 | "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", 1020 | "requires": { 1021 | "@types/ms": "*" 1022 | } 1023 | }, 1024 | "@types/ms": { 1025 | "version": "0.7.31", 1026 | "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", 1027 | "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" 1028 | }, 1029 | "@types/node": { 1030 | "version": "16.11.9", 1031 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.9.tgz", 1032 | "integrity": "sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A==" 1033 | }, 1034 | "ansi-regex": { 1035 | "version": "5.0.1", 1036 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1037 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 1038 | }, 1039 | "ansi-styles": { 1040 | "version": "4.3.0", 1041 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1042 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1043 | "requires": { 1044 | "color-convert": "^2.0.1" 1045 | } 1046 | }, 1047 | "any-promise": { 1048 | "version": "1.3.0", 1049 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 1050 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 1051 | }, 1052 | "asynckit": { 1053 | "version": "0.4.0", 1054 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 1055 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 1056 | "dev": true 1057 | }, 1058 | "autocannon": { 1059 | "version": "7.5.0", 1060 | "resolved": "https://registry.npmjs.org/autocannon/-/autocannon-7.5.0.tgz", 1061 | "integrity": "sha512-jl5UAnOqRQaczv2zQXBjYupXJgHBLEd5T7L1eYHXiu6XR8ZoxA082WDpj5pccMFg06F1y6cXcbP8roOibZOJhw==", 1062 | "dev": true, 1063 | "requires": { 1064 | "chalk": "^4.1.0", 1065 | "char-spinner": "^1.0.1", 1066 | "cli-table3": "^0.6.0", 1067 | "color-support": "^1.1.1", 1068 | "cross-argv": "^1.0.0", 1069 | "form-data": "^4.0.0", 1070 | "has-async-hooks": "^1.0.0", 1071 | "hdr-histogram-js": "^2.0.1", 1072 | "hdr-histogram-percentiles-obj": "^3.0.0", 1073 | "http-parser-js": "^0.5.2", 1074 | "hyperid": "^2.0.3", 1075 | "lodash.clonedeep": "^4.5.0", 1076 | "manage-path": "^2.0.0", 1077 | "on-net-listen": "^1.1.1", 1078 | "pretty-bytes": "^5.4.1", 1079 | "progress": "^2.0.3", 1080 | "reinterval": "^1.1.0", 1081 | "retimer": "^3.0.0", 1082 | "semver": "^7.3.2", 1083 | "subarg": "^1.0.0", 1084 | "timestring": "^6.0.0" 1085 | } 1086 | }, 1087 | "base64-js": { 1088 | "version": "1.5.1", 1089 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 1090 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 1091 | "dev": true 1092 | }, 1093 | "buffer-writer": { 1094 | "version": "2.0.0", 1095 | "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", 1096 | "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" 1097 | }, 1098 | "chalk": { 1099 | "version": "4.1.2", 1100 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1101 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1102 | "requires": { 1103 | "ansi-styles": "^4.1.0", 1104 | "supports-color": "^7.1.0" 1105 | }, 1106 | "dependencies": { 1107 | "supports-color": { 1108 | "version": "7.2.0", 1109 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1110 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1111 | "requires": { 1112 | "has-flag": "^4.0.0" 1113 | } 1114 | } 1115 | } 1116 | }, 1117 | "char-spinner": { 1118 | "version": "1.0.1", 1119 | "resolved": "https://registry.npmjs.org/char-spinner/-/char-spinner-1.0.1.tgz", 1120 | "integrity": "sha1-5upnvSR+EHESmDt6sEee02KAAIE=", 1121 | "dev": true 1122 | }, 1123 | "cli-table3": { 1124 | "version": "0.6.0", 1125 | "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", 1126 | "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", 1127 | "dev": true, 1128 | "requires": { 1129 | "colors": "^1.1.2", 1130 | "object-assign": "^4.1.0", 1131 | "string-width": "^4.2.0" 1132 | } 1133 | }, 1134 | "cliui": { 1135 | "version": "7.0.4", 1136 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 1137 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 1138 | "requires": { 1139 | "string-width": "^4.2.0", 1140 | "strip-ansi": "^6.0.0", 1141 | "wrap-ansi": "^7.0.0" 1142 | } 1143 | }, 1144 | "clone": { 1145 | "version": "2.1.2", 1146 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 1147 | "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" 1148 | }, 1149 | "color-convert": { 1150 | "version": "2.0.1", 1151 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1152 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1153 | "requires": { 1154 | "color-name": "~1.1.4" 1155 | } 1156 | }, 1157 | "color-name": { 1158 | "version": "1.1.4", 1159 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1160 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 1161 | }, 1162 | "color-support": { 1163 | "version": "1.1.3", 1164 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 1165 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 1166 | "dev": true 1167 | }, 1168 | "colors": { 1169 | "version": "1.4.0", 1170 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 1171 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", 1172 | "dev": true, 1173 | "optional": true 1174 | }, 1175 | "combined-stream": { 1176 | "version": "1.0.8", 1177 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 1178 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 1179 | "dev": true, 1180 | "requires": { 1181 | "delayed-stream": "~1.0.0" 1182 | } 1183 | }, 1184 | "concurrently": { 1185 | "version": "6.4.0", 1186 | "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.4.0.tgz", 1187 | "integrity": "sha512-HZ3D0RTQMH3oS4gvtYj1P+NBc6PzE2McEra6yEFcQKrUQ9HvtTGU4Dbne083F034p+LRb7kWU0tPRNvSGs1UCQ==", 1188 | "requires": { 1189 | "chalk": "^4.1.0", 1190 | "date-fns": "^2.16.1", 1191 | "lodash": "^4.17.21", 1192 | "rxjs": "^6.6.3", 1193 | "spawn-command": "^0.0.2-1", 1194 | "supports-color": "^8.1.0", 1195 | "tree-kill": "^1.2.2", 1196 | "yargs": "^16.2.0" 1197 | } 1198 | }, 1199 | "cross-argv": { 1200 | "version": "1.0.0", 1201 | "resolved": "https://registry.npmjs.org/cross-argv/-/cross-argv-1.0.0.tgz", 1202 | "integrity": "sha512-uAVe/bgNHlPdP1VE4Sk08u9pAJ7o1x/tVQtX77T5zlhYhuwOWtVkPBEtHdvF5cq48VzeCG5i1zN4dQc8pwLYrw==", 1203 | "dev": true 1204 | }, 1205 | "date-fns": { 1206 | "version": "2.26.0", 1207 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.26.0.tgz", 1208 | "integrity": "sha512-VQI812dRi3cusdY/fhoBKvc6l2W8BPWU1FNVnFH9Nttjx4AFBRzfSVb/Eyc7jBT6e9sg1XtAGsYpBQ6c/jygbg==" 1209 | }, 1210 | "debug": { 1211 | "version": "4.3.2", 1212 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", 1213 | "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", 1214 | "requires": { 1215 | "ms": "2.1.2" 1216 | } 1217 | }, 1218 | "delayed-stream": { 1219 | "version": "1.0.0", 1220 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1221 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 1222 | "dev": true 1223 | }, 1224 | "dottie": { 1225 | "version": "2.0.2", 1226 | "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", 1227 | "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" 1228 | }, 1229 | "emoji-regex": { 1230 | "version": "8.0.0", 1231 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1232 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1233 | }, 1234 | "escalade": { 1235 | "version": "3.1.1", 1236 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1237 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 1238 | }, 1239 | "faker": { 1240 | "version": "5.5.3", 1241 | "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", 1242 | "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==" 1243 | }, 1244 | "form-data": { 1245 | "version": "4.0.0", 1246 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 1247 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 1248 | "dev": true, 1249 | "requires": { 1250 | "asynckit": "^0.4.0", 1251 | "combined-stream": "^1.0.8", 1252 | "mime-types": "^2.1.12" 1253 | } 1254 | }, 1255 | "get-caller-file": { 1256 | "version": "2.0.5", 1257 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1258 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 1259 | }, 1260 | "has-async-hooks": { 1261 | "version": "1.0.0", 1262 | "resolved": "https://registry.npmjs.org/has-async-hooks/-/has-async-hooks-1.0.0.tgz", 1263 | "integrity": "sha512-YF0VPGjkxr7AyyQQNykX8zK4PvtEDsUJAPqwu06UFz1lb6EvI53sPh5H1kWxg8NXI5LsfRCZ8uX9NkYDZBb/mw==", 1264 | "dev": true 1265 | }, 1266 | "has-flag": { 1267 | "version": "4.0.0", 1268 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1269 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 1270 | }, 1271 | "hdr-histogram-js": { 1272 | "version": "2.0.1", 1273 | "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.1.tgz", 1274 | "integrity": "sha512-uPZxl1dAFnjUFHWLZmt93vUUvtHeaBay9nVNHu38SdOjMSF/4KqJUqa1Seuj08ptU1rEb6AHvB41X8n/zFZ74Q==", 1275 | "dev": true, 1276 | "requires": { 1277 | "@assemblyscript/loader": "^0.10.1", 1278 | "base64-js": "^1.2.0", 1279 | "pako": "^1.0.3" 1280 | } 1281 | }, 1282 | "hdr-histogram-percentiles-obj": { 1283 | "version": "3.0.0", 1284 | "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", 1285 | "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", 1286 | "dev": true 1287 | }, 1288 | "http-parser-js": { 1289 | "version": "0.5.3", 1290 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", 1291 | "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", 1292 | "dev": true 1293 | }, 1294 | "hyperid": { 1295 | "version": "2.3.1", 1296 | "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-2.3.1.tgz", 1297 | "integrity": "sha512-mIbI7Ymn6MCdODaW1/6wdf5lvvXzmPsARN4zTLakMmcziBOuP4PxCBJvHF6kbAIHX6H4vAELx/pDmt0j6Th5RQ==", 1298 | "dev": true, 1299 | "requires": { 1300 | "uuid": "^8.3.2", 1301 | "uuid-parse": "^1.1.0" 1302 | } 1303 | }, 1304 | "inflection": { 1305 | "version": "1.13.1", 1306 | "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.1.tgz", 1307 | "integrity": "sha512-dldYtl2WlN0QDkIDtg8+xFwOS2Tbmp12t1cHa5/YClU6ZQjTFm7B66UcVbh9NQB+HvT5BAd2t5+yKsBkw5pcqA==" 1308 | }, 1309 | "inherits": { 1310 | "version": "2.0.4", 1311 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1312 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1313 | }, 1314 | "is-fullwidth-code-point": { 1315 | "version": "3.0.0", 1316 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1317 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 1318 | }, 1319 | "lodash": { 1320 | "version": "4.17.21", 1321 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1322 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1323 | }, 1324 | "lodash.clonedeep": { 1325 | "version": "4.5.0", 1326 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 1327 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", 1328 | "dev": true 1329 | }, 1330 | "lru-cache": { 1331 | "version": "6.0.0", 1332 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1333 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1334 | "requires": { 1335 | "yallist": "^4.0.0" 1336 | } 1337 | }, 1338 | "manage-path": { 1339 | "version": "2.0.0", 1340 | "resolved": "https://registry.npmjs.org/manage-path/-/manage-path-2.0.0.tgz", 1341 | "integrity": "sha1-9M+EV7km7u4qg7FzUBQUvHbrlZc=", 1342 | "dev": true 1343 | }, 1344 | "mime-db": { 1345 | "version": "1.51.0", 1346 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", 1347 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", 1348 | "dev": true 1349 | }, 1350 | "mime-types": { 1351 | "version": "2.1.34", 1352 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", 1353 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", 1354 | "dev": true, 1355 | "requires": { 1356 | "mime-db": "1.51.0" 1357 | } 1358 | }, 1359 | "minimist": { 1360 | "version": "1.2.5", 1361 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1362 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1363 | "dev": true 1364 | }, 1365 | "moment": { 1366 | "version": "2.29.1", 1367 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", 1368 | "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" 1369 | }, 1370 | "moment-timezone": { 1371 | "version": "0.5.34", 1372 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz", 1373 | "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==", 1374 | "requires": { 1375 | "moment": ">= 2.9.0" 1376 | } 1377 | }, 1378 | "ms": { 1379 | "version": "2.1.2", 1380 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1381 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1382 | }, 1383 | "node-cache": { 1384 | "version": "5.1.2", 1385 | "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", 1386 | "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", 1387 | "requires": { 1388 | "clone": "2.x" 1389 | } 1390 | }, 1391 | "object-assign": { 1392 | "version": "4.1.1", 1393 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1394 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1395 | "dev": true 1396 | }, 1397 | "on-net-listen": { 1398 | "version": "1.1.2", 1399 | "resolved": "https://registry.npmjs.org/on-net-listen/-/on-net-listen-1.1.2.tgz", 1400 | "integrity": "sha512-y1HRYy8s/RlcBvDUwKXSmkODMdx4KSuIvloCnQYJ2LdBBC1asY4HtfhXwe3UWknLakATZDnbzht2Ijw3M1EqFg==", 1401 | "dev": true 1402 | }, 1403 | "packet-reader": { 1404 | "version": "1.0.0", 1405 | "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", 1406 | "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" 1407 | }, 1408 | "pako": { 1409 | "version": "1.0.11", 1410 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 1411 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", 1412 | "dev": true 1413 | }, 1414 | "pg": { 1415 | "version": "8.7.1", 1416 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.1.tgz", 1417 | "integrity": "sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA==", 1418 | "requires": { 1419 | "buffer-writer": "2.0.0", 1420 | "packet-reader": "1.0.0", 1421 | "pg-connection-string": "^2.5.0", 1422 | "pg-pool": "^3.4.1", 1423 | "pg-protocol": "^1.5.0", 1424 | "pg-types": "^2.1.0", 1425 | "pgpass": "1.x" 1426 | } 1427 | }, 1428 | "pg-connection-string": { 1429 | "version": "2.5.0", 1430 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", 1431 | "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" 1432 | }, 1433 | "pg-int8": { 1434 | "version": "1.0.1", 1435 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 1436 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" 1437 | }, 1438 | "pg-pool": { 1439 | "version": "3.4.1", 1440 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.4.1.tgz", 1441 | "integrity": "sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ==", 1442 | "requires": {} 1443 | }, 1444 | "pg-protocol": { 1445 | "version": "1.5.0", 1446 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", 1447 | "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" 1448 | }, 1449 | "pg-types": { 1450 | "version": "2.2.0", 1451 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 1452 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 1453 | "requires": { 1454 | "pg-int8": "1.0.1", 1455 | "postgres-array": "~2.0.0", 1456 | "postgres-bytea": "~1.0.0", 1457 | "postgres-date": "~1.0.4", 1458 | "postgres-interval": "^1.1.0" 1459 | } 1460 | }, 1461 | "pgpass": { 1462 | "version": "1.0.4", 1463 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz", 1464 | "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==", 1465 | "requires": { 1466 | "split2": "^3.1.1" 1467 | } 1468 | }, 1469 | "postgres-array": { 1470 | "version": "2.0.0", 1471 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 1472 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" 1473 | }, 1474 | "postgres-bytea": { 1475 | "version": "1.0.0", 1476 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 1477 | "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" 1478 | }, 1479 | "postgres-date": { 1480 | "version": "1.0.7", 1481 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 1482 | "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" 1483 | }, 1484 | "postgres-interval": { 1485 | "version": "1.2.0", 1486 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 1487 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 1488 | "requires": { 1489 | "xtend": "^4.0.0" 1490 | } 1491 | }, 1492 | "pretty-bytes": { 1493 | "version": "5.6.0", 1494 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", 1495 | "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", 1496 | "dev": true 1497 | }, 1498 | "progress": { 1499 | "version": "2.0.3", 1500 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1501 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1502 | "dev": true 1503 | }, 1504 | "readable-stream": { 1505 | "version": "3.6.0", 1506 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1507 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1508 | "requires": { 1509 | "inherits": "^2.0.3", 1510 | "string_decoder": "^1.1.1", 1511 | "util-deprecate": "^1.0.1" 1512 | } 1513 | }, 1514 | "reinterval": { 1515 | "version": "1.1.0", 1516 | "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", 1517 | "integrity": "sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=", 1518 | "dev": true 1519 | }, 1520 | "require-directory": { 1521 | "version": "2.1.1", 1522 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1523 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 1524 | }, 1525 | "retimer": { 1526 | "version": "3.0.0", 1527 | "resolved": "https://registry.npmjs.org/retimer/-/retimer-3.0.0.tgz", 1528 | "integrity": "sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==", 1529 | "dev": true 1530 | }, 1531 | "retry-as-promised": { 1532 | "version": "3.2.0", 1533 | "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", 1534 | "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", 1535 | "requires": { 1536 | "any-promise": "^1.3.0" 1537 | } 1538 | }, 1539 | "rxjs": { 1540 | "version": "6.6.7", 1541 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 1542 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 1543 | "requires": { 1544 | "tslib": "^1.9.0" 1545 | } 1546 | }, 1547 | "safe-buffer": { 1548 | "version": "5.2.1", 1549 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1550 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1551 | }, 1552 | "semver": { 1553 | "version": "7.3.5", 1554 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 1555 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 1556 | "requires": { 1557 | "lru-cache": "^6.0.0" 1558 | } 1559 | }, 1560 | "sequelize": { 1561 | "version": "6.12.0-alpha.1", 1562 | "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.12.0-alpha.1.tgz", 1563 | "integrity": "sha512-MrjM8GJtUKhuc3ZkGbhlSr1DQdce3oRAI4STwgurfO0utBcdQE0kC1O3hp752XRFwzM+brH9Oy/dbVkupIZ4BQ==", 1564 | "requires": { 1565 | "@types/debug": "^4.1.7", 1566 | "debug": "^4.1.1", 1567 | "dottie": "^2.0.0", 1568 | "inflection": "1.13.1", 1569 | "lodash": "^4.17.20", 1570 | "moment": "^2.26.0", 1571 | "moment-timezone": "^0.5.31", 1572 | "pg-connection-string": "^2.5.0", 1573 | "retry-as-promised": "^3.2.0", 1574 | "semver": "^7.3.2", 1575 | "sequelize-pool": "^6.0.0", 1576 | "toposort-class": "^1.0.1", 1577 | "uuid": "^8.1.0", 1578 | "validator": "^13.7.0", 1579 | "wkx": "^0.5.0" 1580 | } 1581 | }, 1582 | "sequelize-pool": { 1583 | "version": "6.1.0", 1584 | "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-6.1.0.tgz", 1585 | "integrity": "sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg==" 1586 | }, 1587 | "spawn-command": { 1588 | "version": "0.0.2-1", 1589 | "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", 1590 | "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=" 1591 | }, 1592 | "split2": { 1593 | "version": "3.2.2", 1594 | "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", 1595 | "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", 1596 | "requires": { 1597 | "readable-stream": "^3.0.0" 1598 | } 1599 | }, 1600 | "string_decoder": { 1601 | "version": "1.3.0", 1602 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1603 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1604 | "requires": { 1605 | "safe-buffer": "~5.2.0" 1606 | } 1607 | }, 1608 | "string-width": { 1609 | "version": "4.2.3", 1610 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1611 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1612 | "requires": { 1613 | "emoji-regex": "^8.0.0", 1614 | "is-fullwidth-code-point": "^3.0.0", 1615 | "strip-ansi": "^6.0.1" 1616 | } 1617 | }, 1618 | "strip-ansi": { 1619 | "version": "6.0.1", 1620 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1621 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1622 | "requires": { 1623 | "ansi-regex": "^5.0.1" 1624 | } 1625 | }, 1626 | "subarg": { 1627 | "version": "1.0.0", 1628 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", 1629 | "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", 1630 | "dev": true, 1631 | "requires": { 1632 | "minimist": "^1.1.0" 1633 | } 1634 | }, 1635 | "supports-color": { 1636 | "version": "8.1.1", 1637 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1638 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1639 | "requires": { 1640 | "has-flag": "^4.0.0" 1641 | } 1642 | }, 1643 | "timestring": { 1644 | "version": "6.0.0", 1645 | "resolved": "https://registry.npmjs.org/timestring/-/timestring-6.0.0.tgz", 1646 | "integrity": "sha512-wMctrWD2HZZLuIlchlkE2dfXJh7J2KDI9Dwl+2abPYg0mswQHfOAyQW3jJg1pY5VfttSINZuKcXoB3FGypVklA==", 1647 | "dev": true 1648 | }, 1649 | "toposort-class": { 1650 | "version": "1.0.1", 1651 | "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", 1652 | "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" 1653 | }, 1654 | "tree-kill": { 1655 | "version": "1.2.2", 1656 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 1657 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==" 1658 | }, 1659 | "tslib": { 1660 | "version": "1.14.1", 1661 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1662 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1663 | }, 1664 | "util-deprecate": { 1665 | "version": "1.0.2", 1666 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1667 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1668 | }, 1669 | "uuid": { 1670 | "version": "8.3.2", 1671 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 1672 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 1673 | }, 1674 | "uuid-parse": { 1675 | "version": "1.1.0", 1676 | "resolved": "https://registry.npmjs.org/uuid-parse/-/uuid-parse-1.1.0.tgz", 1677 | "integrity": "sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==", 1678 | "dev": true 1679 | }, 1680 | "validator": { 1681 | "version": "13.7.0", 1682 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", 1683 | "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" 1684 | }, 1685 | "wkx": { 1686 | "version": "0.5.0", 1687 | "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", 1688 | "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", 1689 | "requires": { 1690 | "@types/node": "*" 1691 | } 1692 | }, 1693 | "wrap-ansi": { 1694 | "version": "7.0.0", 1695 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1696 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1697 | "requires": { 1698 | "ansi-styles": "^4.0.0", 1699 | "string-width": "^4.1.0", 1700 | "strip-ansi": "^6.0.0" 1701 | } 1702 | }, 1703 | "xtend": { 1704 | "version": "4.0.2", 1705 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1706 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1707 | }, 1708 | "y18n": { 1709 | "version": "5.0.8", 1710 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1711 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" 1712 | }, 1713 | "yallist": { 1714 | "version": "4.0.0", 1715 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1716 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1717 | }, 1718 | "yargs": { 1719 | "version": "16.2.0", 1720 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1721 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1722 | "requires": { 1723 | "cliui": "^7.0.2", 1724 | "escalade": "^3.1.1", 1725 | "get-caller-file": "^2.0.5", 1726 | "require-directory": "^2.1.1", 1727 | "string-width": "^4.2.0", 1728 | "y18n": "^5.0.5", 1729 | "yargs-parser": "^20.2.2" 1730 | } 1731 | }, 1732 | "yargs-parser": { 1733 | "version": "20.2.9", 1734 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 1735 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" 1736 | } 1737 | } 1738 | } 1739 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "poc-100ms-cache", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "type": "module", 7 | "scripts": { 8 | "seed-and-servers": "concurrently \"npm run seed\" \"npm run cached\" \"npm run nocache\"", 9 | "nocache": "node src/index-nocache.js", 10 | "cached": "node src/index-cached.js", 11 | "seed": "node src/seeder.js", 12 | "loadtest:cached": "npx autocannon -c 100 -d 10 localhost:3000 --renderStatusCodes", 13 | "loadtest:nocache": "npx autocannon -c 100 -d 10 localhost:4000 --renderStatusCodes" 14 | }, 15 | "keywords": [], 16 | "author": "erickwendel", 17 | "license": "ISC", 18 | "dependencies": { 19 | "concurrently": "^6.4.0", 20 | "faker": "^5.5.3", 21 | "node-cache": "^5.1.2", 22 | "pg": "^8.7.1", 23 | "sequelize": "^6.12.0-alpha.1" 24 | }, 25 | "devDependencies": { 26 | "autocannon": "^7.5.0" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/db.js: -------------------------------------------------------------------------------- 1 | import Sequelize from 'sequelize' 2 | export async function setDbModel() { 3 | const sequelize = new Sequelize( 4 | `postgres://${process.env.POSTGRES_HOST}/heroes`, 5 | { logging: false } 6 | ); 7 | 8 | await sequelize.authenticate(); 9 | console.log("postgres is running"); 10 | 11 | const Hero = sequelize.define("hero", { 12 | name: Sequelize.STRING, 13 | power: Sequelize.STRING, 14 | }); 15 | 16 | await Hero.sync({ force: true }); 17 | 18 | return Hero 19 | } -------------------------------------------------------------------------------- /src/index-cached.js: -------------------------------------------------------------------------------- 1 | import { createServer } from 'http' 2 | import NodeCache from "node-cache"; 3 | import { setDbModel } from './db.js'; 4 | import Sequelize from 'sequelize' 5 | 6 | const CACHE_LIMIT = 0.1 // 100ms 7 | const dbCache = new NodeCache({ stdTTL: CACHE_LIMIT, checkperiod: 0.2 }); 8 | const Hero = await setDbModel() 9 | 10 | // coloquei essa query só para exemplificar o que poderia ser a chave do cache 11 | const mySqlQuery = 'SELECT power as repeatedTimes, COUNT(power) FROM HERO GROUP BY power' 12 | async function handler(request, response) { 13 | if (dbCache.has(mySqlQuery)) { 14 | response.end(JSON.stringify(dbCache.get(mySqlQuery))) 15 | return; 16 | } 17 | 18 | try { 19 | const all = await Hero.findAll({ 20 | group: ['power'], 21 | attributes: ['power', [Sequelize.fn('COUNT', 'power'), 'repeatedTimes']], 22 | }) 23 | 24 | 25 | const success = dbCache.set(mySqlQuery, all, CACHE_LIMIT); 26 | if (success) { 27 | response.writeHead(200) 28 | response.end(JSON.stringify(all)) 29 | return; 30 | } 31 | 32 | response.writeHead(500) 33 | response.end() 34 | } catch (error) { 35 | console.log('error!!', error) 36 | response.writeHead(500) 37 | response.end() 38 | } 39 | 40 | } 41 | 42 | createServer(handler) 43 | .listen(3000, () => console.log('cached: listening to 3000')) -------------------------------------------------------------------------------- /src/index-nocache.js: -------------------------------------------------------------------------------- 1 | import { createServer } from 'http' 2 | import { setDbModel } from './db.js'; 3 | import Sequelize from 'sequelize' 4 | 5 | const Hero = await setDbModel() 6 | async function handler(request, response) { 7 | try { 8 | const all = await Hero.findAll({ 9 | group: ['power'], 10 | attributes: ['power', [Sequelize.fn('COUNT', 'power'), 'repeatedTimes']], 11 | }) 12 | 13 | response.writeHead(200) 14 | response.end(JSON.stringify(all)) 15 | return; 16 | 17 | } catch (error) { 18 | console.log('error!!', error) 19 | response.writeHead(500) 20 | response.end() 21 | } 22 | 23 | } 24 | 25 | createServer(handler) 26 | .listen(4000, () => console.log('nocache: listening to 4000')) -------------------------------------------------------------------------------- /src/seeder.js: -------------------------------------------------------------------------------- 1 | import faker from 'faker' 2 | import { setDbModel } from './db.js' 3 | 4 | const MAX_ITEMS_PER_INTERVAL = 100 5 | const INTERVAL = 500 6 | const Hero = await setDbModel() 7 | 8 | async function runInterval() { 9 | const promises = [] 10 | for (let i = 0; i < MAX_ITEMS_PER_INTERVAL; i++) { 11 | const result = Hero.create({ 12 | name: faker.name.title(), 13 | power: faker.lorem.word(2) 14 | }) 15 | 16 | promises.push(result) 17 | } 18 | 19 | await Promise.all(promises) 20 | 21 | } 22 | 23 | setInterval(runInterval, INTERVAL); 24 | console.log(`seeder is adding ${MAX_ITEMS_PER_INTERVAL} items per interval of ${INTERVAL}ms`) --------------------------------------------------------------------------------