├── .gitignore ├── package-lock.json ├── package.json ├── public └── styles.css ├── server.js └── views ├── create-post.ejs ├── dashboard.ejs ├── edit-post.ejs ├── homepage.ejs ├── includes ├── footer.ejs ├── head.ejs └── header.ejs ├── login.ejs └── single-post.ejs /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | node_modules/ 3 | ourApp.db 4 | ourApp.db-shm 5 | ourApp.db-wal -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "our-backend-project", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "our-backend-project", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "bcrypt": "^5.1.1", 13 | "better-sqlite3": "^11.2.1", 14 | "cookie-parser": "^1.4.6", 15 | "dotenv": "^16.4.5", 16 | "ejs": "^3.1.10", 17 | "express": "^4.19.2", 18 | "jsonwebtoken": "^9.0.2", 19 | "marked": "^14.1.1", 20 | "nodemon": "^3.1.4", 21 | "sanitize-html": "^2.13.0" 22 | } 23 | }, 24 | "node_modules/@mapbox/node-pre-gyp": { 25 | "version": "1.0.11", 26 | "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", 27 | "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", 28 | "dependencies": { 29 | "detect-libc": "^2.0.0", 30 | "https-proxy-agent": "^5.0.0", 31 | "make-dir": "^3.1.0", 32 | "node-fetch": "^2.6.7", 33 | "nopt": "^5.0.0", 34 | "npmlog": "^5.0.1", 35 | "rimraf": "^3.0.2", 36 | "semver": "^7.3.5", 37 | "tar": "^6.1.11" 38 | }, 39 | "bin": { 40 | "node-pre-gyp": "bin/node-pre-gyp" 41 | } 42 | }, 43 | "node_modules/abbrev": { 44 | "version": "1.1.1", 45 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 46 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 47 | }, 48 | "node_modules/accepts": { 49 | "version": "1.3.8", 50 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 51 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 52 | "dependencies": { 53 | "mime-types": "~2.1.34", 54 | "negotiator": "0.6.3" 55 | }, 56 | "engines": { 57 | "node": ">= 0.6" 58 | } 59 | }, 60 | "node_modules/agent-base": { 61 | "version": "6.0.2", 62 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 63 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 64 | "dependencies": { 65 | "debug": "4" 66 | }, 67 | "engines": { 68 | "node": ">= 6.0.0" 69 | } 70 | }, 71 | "node_modules/agent-base/node_modules/debug": { 72 | "version": "4.3.6", 73 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 74 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 75 | "dependencies": { 76 | "ms": "2.1.2" 77 | }, 78 | "engines": { 79 | "node": ">=6.0" 80 | }, 81 | "peerDependenciesMeta": { 82 | "supports-color": { 83 | "optional": true 84 | } 85 | } 86 | }, 87 | "node_modules/agent-base/node_modules/ms": { 88 | "version": "2.1.2", 89 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 90 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 91 | }, 92 | "node_modules/ansi-regex": { 93 | "version": "5.0.1", 94 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 95 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 96 | "engines": { 97 | "node": ">=8" 98 | } 99 | }, 100 | "node_modules/ansi-styles": { 101 | "version": "4.3.0", 102 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 103 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 104 | "dependencies": { 105 | "color-convert": "^2.0.1" 106 | }, 107 | "engines": { 108 | "node": ">=8" 109 | }, 110 | "funding": { 111 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 112 | } 113 | }, 114 | "node_modules/anymatch": { 115 | "version": "3.1.3", 116 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 117 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 118 | "dependencies": { 119 | "normalize-path": "^3.0.0", 120 | "picomatch": "^2.0.4" 121 | }, 122 | "engines": { 123 | "node": ">= 8" 124 | } 125 | }, 126 | "node_modules/aproba": { 127 | "version": "2.0.0", 128 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", 129 | "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" 130 | }, 131 | "node_modules/are-we-there-yet": { 132 | "version": "2.0.0", 133 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", 134 | "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", 135 | "deprecated": "This package is no longer supported.", 136 | "dependencies": { 137 | "delegates": "^1.0.0", 138 | "readable-stream": "^3.6.0" 139 | }, 140 | "engines": { 141 | "node": ">=10" 142 | } 143 | }, 144 | "node_modules/array-flatten": { 145 | "version": "1.1.1", 146 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 147 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 148 | }, 149 | "node_modules/async": { 150 | "version": "3.2.6", 151 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", 152 | "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" 153 | }, 154 | "node_modules/balanced-match": { 155 | "version": "1.0.2", 156 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 157 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 158 | }, 159 | "node_modules/base64-js": { 160 | "version": "1.5.1", 161 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 162 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 163 | "funding": [ 164 | { 165 | "type": "github", 166 | "url": "https://github.com/sponsors/feross" 167 | }, 168 | { 169 | "type": "patreon", 170 | "url": "https://www.patreon.com/feross" 171 | }, 172 | { 173 | "type": "consulting", 174 | "url": "https://feross.org/support" 175 | } 176 | ] 177 | }, 178 | "node_modules/bcrypt": { 179 | "version": "5.1.1", 180 | "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", 181 | "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", 182 | "hasInstallScript": true, 183 | "dependencies": { 184 | "@mapbox/node-pre-gyp": "^1.0.11", 185 | "node-addon-api": "^5.0.0" 186 | }, 187 | "engines": { 188 | "node": ">= 10.0.0" 189 | } 190 | }, 191 | "node_modules/better-sqlite3": { 192 | "version": "11.2.1", 193 | "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.2.1.tgz", 194 | "integrity": "sha512-Xbt1d68wQnUuFIEVsbt6V+RG30zwgbtCGQ4QOcXVrOH0FE4eHk64FWZ9NUfRHS4/x1PXqwz/+KOrnXD7f0WieA==", 195 | "hasInstallScript": true, 196 | "dependencies": { 197 | "bindings": "^1.5.0", 198 | "prebuild-install": "^7.1.1" 199 | } 200 | }, 201 | "node_modules/binary-extensions": { 202 | "version": "2.3.0", 203 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 204 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 205 | "engines": { 206 | "node": ">=8" 207 | }, 208 | "funding": { 209 | "url": "https://github.com/sponsors/sindresorhus" 210 | } 211 | }, 212 | "node_modules/bindings": { 213 | "version": "1.5.0", 214 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 215 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 216 | "dependencies": { 217 | "file-uri-to-path": "1.0.0" 218 | } 219 | }, 220 | "node_modules/bl": { 221 | "version": "4.1.0", 222 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 223 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 224 | "dependencies": { 225 | "buffer": "^5.5.0", 226 | "inherits": "^2.0.4", 227 | "readable-stream": "^3.4.0" 228 | } 229 | }, 230 | "node_modules/body-parser": { 231 | "version": "1.20.2", 232 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", 233 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", 234 | "dependencies": { 235 | "bytes": "3.1.2", 236 | "content-type": "~1.0.5", 237 | "debug": "2.6.9", 238 | "depd": "2.0.0", 239 | "destroy": "1.2.0", 240 | "http-errors": "2.0.0", 241 | "iconv-lite": "0.4.24", 242 | "on-finished": "2.4.1", 243 | "qs": "6.11.0", 244 | "raw-body": "2.5.2", 245 | "type-is": "~1.6.18", 246 | "unpipe": "1.0.0" 247 | }, 248 | "engines": { 249 | "node": ">= 0.8", 250 | "npm": "1.2.8000 || >= 1.4.16" 251 | } 252 | }, 253 | "node_modules/brace-expansion": { 254 | "version": "1.1.11", 255 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 256 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 257 | "dependencies": { 258 | "balanced-match": "^1.0.0", 259 | "concat-map": "0.0.1" 260 | } 261 | }, 262 | "node_modules/braces": { 263 | "version": "3.0.3", 264 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 265 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 266 | "dependencies": { 267 | "fill-range": "^7.1.1" 268 | }, 269 | "engines": { 270 | "node": ">=8" 271 | } 272 | }, 273 | "node_modules/buffer": { 274 | "version": "5.7.1", 275 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 276 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 277 | "funding": [ 278 | { 279 | "type": "github", 280 | "url": "https://github.com/sponsors/feross" 281 | }, 282 | { 283 | "type": "patreon", 284 | "url": "https://www.patreon.com/feross" 285 | }, 286 | { 287 | "type": "consulting", 288 | "url": "https://feross.org/support" 289 | } 290 | ], 291 | "dependencies": { 292 | "base64-js": "^1.3.1", 293 | "ieee754": "^1.1.13" 294 | } 295 | }, 296 | "node_modules/buffer-equal-constant-time": { 297 | "version": "1.0.1", 298 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 299 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" 300 | }, 301 | "node_modules/bytes": { 302 | "version": "3.1.2", 303 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 304 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 305 | "engines": { 306 | "node": ">= 0.8" 307 | } 308 | }, 309 | "node_modules/call-bind": { 310 | "version": "1.0.7", 311 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 312 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 313 | "dependencies": { 314 | "es-define-property": "^1.0.0", 315 | "es-errors": "^1.3.0", 316 | "function-bind": "^1.1.2", 317 | "get-intrinsic": "^1.2.4", 318 | "set-function-length": "^1.2.1" 319 | }, 320 | "engines": { 321 | "node": ">= 0.4" 322 | }, 323 | "funding": { 324 | "url": "https://github.com/sponsors/ljharb" 325 | } 326 | }, 327 | "node_modules/chalk": { 328 | "version": "4.1.2", 329 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 330 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 331 | "dependencies": { 332 | "ansi-styles": "^4.1.0", 333 | "supports-color": "^7.1.0" 334 | }, 335 | "engines": { 336 | "node": ">=10" 337 | }, 338 | "funding": { 339 | "url": "https://github.com/chalk/chalk?sponsor=1" 340 | } 341 | }, 342 | "node_modules/chalk/node_modules/has-flag": { 343 | "version": "4.0.0", 344 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 345 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 346 | "engines": { 347 | "node": ">=8" 348 | } 349 | }, 350 | "node_modules/chalk/node_modules/supports-color": { 351 | "version": "7.2.0", 352 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 353 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 354 | "dependencies": { 355 | "has-flag": "^4.0.0" 356 | }, 357 | "engines": { 358 | "node": ">=8" 359 | } 360 | }, 361 | "node_modules/chokidar": { 362 | "version": "3.6.0", 363 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 364 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 365 | "dependencies": { 366 | "anymatch": "~3.1.2", 367 | "braces": "~3.0.2", 368 | "glob-parent": "~5.1.2", 369 | "is-binary-path": "~2.1.0", 370 | "is-glob": "~4.0.1", 371 | "normalize-path": "~3.0.0", 372 | "readdirp": "~3.6.0" 373 | }, 374 | "engines": { 375 | "node": ">= 8.10.0" 376 | }, 377 | "funding": { 378 | "url": "https://paulmillr.com/funding/" 379 | }, 380 | "optionalDependencies": { 381 | "fsevents": "~2.3.2" 382 | } 383 | }, 384 | "node_modules/chownr": { 385 | "version": "1.1.4", 386 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 387 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 388 | }, 389 | "node_modules/color-convert": { 390 | "version": "2.0.1", 391 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 392 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 393 | "dependencies": { 394 | "color-name": "~1.1.4" 395 | }, 396 | "engines": { 397 | "node": ">=7.0.0" 398 | } 399 | }, 400 | "node_modules/color-name": { 401 | "version": "1.1.4", 402 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 403 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 404 | }, 405 | "node_modules/color-support": { 406 | "version": "1.1.3", 407 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 408 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 409 | "bin": { 410 | "color-support": "bin.js" 411 | } 412 | }, 413 | "node_modules/concat-map": { 414 | "version": "0.0.1", 415 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 416 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 417 | }, 418 | "node_modules/console-control-strings": { 419 | "version": "1.1.0", 420 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 421 | "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" 422 | }, 423 | "node_modules/content-disposition": { 424 | "version": "0.5.4", 425 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 426 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 427 | "dependencies": { 428 | "safe-buffer": "5.2.1" 429 | }, 430 | "engines": { 431 | "node": ">= 0.6" 432 | } 433 | }, 434 | "node_modules/content-type": { 435 | "version": "1.0.5", 436 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 437 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 438 | "engines": { 439 | "node": ">= 0.6" 440 | } 441 | }, 442 | "node_modules/cookie": { 443 | "version": "0.6.0", 444 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", 445 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", 446 | "engines": { 447 | "node": ">= 0.6" 448 | } 449 | }, 450 | "node_modules/cookie-parser": { 451 | "version": "1.4.6", 452 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", 453 | "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", 454 | "dependencies": { 455 | "cookie": "0.4.1", 456 | "cookie-signature": "1.0.6" 457 | }, 458 | "engines": { 459 | "node": ">= 0.8.0" 460 | } 461 | }, 462 | "node_modules/cookie-parser/node_modules/cookie": { 463 | "version": "0.4.1", 464 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", 465 | "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", 466 | "engines": { 467 | "node": ">= 0.6" 468 | } 469 | }, 470 | "node_modules/cookie-signature": { 471 | "version": "1.0.6", 472 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 473 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 474 | }, 475 | "node_modules/debug": { 476 | "version": "2.6.9", 477 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 478 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 479 | "dependencies": { 480 | "ms": "2.0.0" 481 | } 482 | }, 483 | "node_modules/decompress-response": { 484 | "version": "6.0.0", 485 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 486 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 487 | "dependencies": { 488 | "mimic-response": "^3.1.0" 489 | }, 490 | "engines": { 491 | "node": ">=10" 492 | }, 493 | "funding": { 494 | "url": "https://github.com/sponsors/sindresorhus" 495 | } 496 | }, 497 | "node_modules/deep-extend": { 498 | "version": "0.6.0", 499 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 500 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 501 | "engines": { 502 | "node": ">=4.0.0" 503 | } 504 | }, 505 | "node_modules/deepmerge": { 506 | "version": "4.3.1", 507 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 508 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 509 | "engines": { 510 | "node": ">=0.10.0" 511 | } 512 | }, 513 | "node_modules/define-data-property": { 514 | "version": "1.1.4", 515 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 516 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 517 | "dependencies": { 518 | "es-define-property": "^1.0.0", 519 | "es-errors": "^1.3.0", 520 | "gopd": "^1.0.1" 521 | }, 522 | "engines": { 523 | "node": ">= 0.4" 524 | }, 525 | "funding": { 526 | "url": "https://github.com/sponsors/ljharb" 527 | } 528 | }, 529 | "node_modules/delegates": { 530 | "version": "1.0.0", 531 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 532 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" 533 | }, 534 | "node_modules/depd": { 535 | "version": "2.0.0", 536 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 537 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 538 | "engines": { 539 | "node": ">= 0.8" 540 | } 541 | }, 542 | "node_modules/destroy": { 543 | "version": "1.2.0", 544 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 545 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 546 | "engines": { 547 | "node": ">= 0.8", 548 | "npm": "1.2.8000 || >= 1.4.16" 549 | } 550 | }, 551 | "node_modules/detect-libc": { 552 | "version": "2.0.3", 553 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", 554 | "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", 555 | "engines": { 556 | "node": ">=8" 557 | } 558 | }, 559 | "node_modules/dom-serializer": { 560 | "version": "2.0.0", 561 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", 562 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 563 | "dependencies": { 564 | "domelementtype": "^2.3.0", 565 | "domhandler": "^5.0.2", 566 | "entities": "^4.2.0" 567 | }, 568 | "funding": { 569 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 570 | } 571 | }, 572 | "node_modules/domelementtype": { 573 | "version": "2.3.0", 574 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 575 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 576 | "funding": [ 577 | { 578 | "type": "github", 579 | "url": "https://github.com/sponsors/fb55" 580 | } 581 | ] 582 | }, 583 | "node_modules/domhandler": { 584 | "version": "5.0.3", 585 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", 586 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 587 | "dependencies": { 588 | "domelementtype": "^2.3.0" 589 | }, 590 | "engines": { 591 | "node": ">= 4" 592 | }, 593 | "funding": { 594 | "url": "https://github.com/fb55/domhandler?sponsor=1" 595 | } 596 | }, 597 | "node_modules/domutils": { 598 | "version": "3.1.0", 599 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", 600 | "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", 601 | "dependencies": { 602 | "dom-serializer": "^2.0.0", 603 | "domelementtype": "^2.3.0", 604 | "domhandler": "^5.0.3" 605 | }, 606 | "funding": { 607 | "url": "https://github.com/fb55/domutils?sponsor=1" 608 | } 609 | }, 610 | "node_modules/dotenv": { 611 | "version": "16.4.5", 612 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", 613 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", 614 | "engines": { 615 | "node": ">=12" 616 | }, 617 | "funding": { 618 | "url": "https://dotenvx.com" 619 | } 620 | }, 621 | "node_modules/ecdsa-sig-formatter": { 622 | "version": "1.0.11", 623 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 624 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 625 | "dependencies": { 626 | "safe-buffer": "^5.0.1" 627 | } 628 | }, 629 | "node_modules/ee-first": { 630 | "version": "1.1.1", 631 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 632 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 633 | }, 634 | "node_modules/ejs": { 635 | "version": "3.1.10", 636 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", 637 | "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", 638 | "dependencies": { 639 | "jake": "^10.8.5" 640 | }, 641 | "bin": { 642 | "ejs": "bin/cli.js" 643 | }, 644 | "engines": { 645 | "node": ">=0.10.0" 646 | } 647 | }, 648 | "node_modules/emoji-regex": { 649 | "version": "8.0.0", 650 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 651 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 652 | }, 653 | "node_modules/encodeurl": { 654 | "version": "1.0.2", 655 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 656 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 657 | "engines": { 658 | "node": ">= 0.8" 659 | } 660 | }, 661 | "node_modules/end-of-stream": { 662 | "version": "1.4.4", 663 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 664 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 665 | "dependencies": { 666 | "once": "^1.4.0" 667 | } 668 | }, 669 | "node_modules/entities": { 670 | "version": "4.5.0", 671 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 672 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 673 | "engines": { 674 | "node": ">=0.12" 675 | }, 676 | "funding": { 677 | "url": "https://github.com/fb55/entities?sponsor=1" 678 | } 679 | }, 680 | "node_modules/es-define-property": { 681 | "version": "1.0.0", 682 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 683 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 684 | "dependencies": { 685 | "get-intrinsic": "^1.2.4" 686 | }, 687 | "engines": { 688 | "node": ">= 0.4" 689 | } 690 | }, 691 | "node_modules/es-errors": { 692 | "version": "1.3.0", 693 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 694 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 695 | "engines": { 696 | "node": ">= 0.4" 697 | } 698 | }, 699 | "node_modules/escape-html": { 700 | "version": "1.0.3", 701 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 702 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 703 | }, 704 | "node_modules/escape-string-regexp": { 705 | "version": "4.0.0", 706 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 707 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 708 | "engines": { 709 | "node": ">=10" 710 | }, 711 | "funding": { 712 | "url": "https://github.com/sponsors/sindresorhus" 713 | } 714 | }, 715 | "node_modules/etag": { 716 | "version": "1.8.1", 717 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 718 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 719 | "engines": { 720 | "node": ">= 0.6" 721 | } 722 | }, 723 | "node_modules/expand-template": { 724 | "version": "2.0.3", 725 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 726 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 727 | "engines": { 728 | "node": ">=6" 729 | } 730 | }, 731 | "node_modules/express": { 732 | "version": "4.19.2", 733 | "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", 734 | "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", 735 | "dependencies": { 736 | "accepts": "~1.3.8", 737 | "array-flatten": "1.1.1", 738 | "body-parser": "1.20.2", 739 | "content-disposition": "0.5.4", 740 | "content-type": "~1.0.4", 741 | "cookie": "0.6.0", 742 | "cookie-signature": "1.0.6", 743 | "debug": "2.6.9", 744 | "depd": "2.0.0", 745 | "encodeurl": "~1.0.2", 746 | "escape-html": "~1.0.3", 747 | "etag": "~1.8.1", 748 | "finalhandler": "1.2.0", 749 | "fresh": "0.5.2", 750 | "http-errors": "2.0.0", 751 | "merge-descriptors": "1.0.1", 752 | "methods": "~1.1.2", 753 | "on-finished": "2.4.1", 754 | "parseurl": "~1.3.3", 755 | "path-to-regexp": "0.1.7", 756 | "proxy-addr": "~2.0.7", 757 | "qs": "6.11.0", 758 | "range-parser": "~1.2.1", 759 | "safe-buffer": "5.2.1", 760 | "send": "0.18.0", 761 | "serve-static": "1.15.0", 762 | "setprototypeof": "1.2.0", 763 | "statuses": "2.0.1", 764 | "type-is": "~1.6.18", 765 | "utils-merge": "1.0.1", 766 | "vary": "~1.1.2" 767 | }, 768 | "engines": { 769 | "node": ">= 0.10.0" 770 | } 771 | }, 772 | "node_modules/file-uri-to-path": { 773 | "version": "1.0.0", 774 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 775 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 776 | }, 777 | "node_modules/filelist": { 778 | "version": "1.0.4", 779 | "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", 780 | "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", 781 | "dependencies": { 782 | "minimatch": "^5.0.1" 783 | } 784 | }, 785 | "node_modules/filelist/node_modules/brace-expansion": { 786 | "version": "2.0.1", 787 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 788 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 789 | "dependencies": { 790 | "balanced-match": "^1.0.0" 791 | } 792 | }, 793 | "node_modules/filelist/node_modules/minimatch": { 794 | "version": "5.1.6", 795 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 796 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 797 | "dependencies": { 798 | "brace-expansion": "^2.0.1" 799 | }, 800 | "engines": { 801 | "node": ">=10" 802 | } 803 | }, 804 | "node_modules/fill-range": { 805 | "version": "7.1.1", 806 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 807 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 808 | "dependencies": { 809 | "to-regex-range": "^5.0.1" 810 | }, 811 | "engines": { 812 | "node": ">=8" 813 | } 814 | }, 815 | "node_modules/finalhandler": { 816 | "version": "1.2.0", 817 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 818 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 819 | "dependencies": { 820 | "debug": "2.6.9", 821 | "encodeurl": "~1.0.2", 822 | "escape-html": "~1.0.3", 823 | "on-finished": "2.4.1", 824 | "parseurl": "~1.3.3", 825 | "statuses": "2.0.1", 826 | "unpipe": "~1.0.0" 827 | }, 828 | "engines": { 829 | "node": ">= 0.8" 830 | } 831 | }, 832 | "node_modules/forwarded": { 833 | "version": "0.2.0", 834 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 835 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 836 | "engines": { 837 | "node": ">= 0.6" 838 | } 839 | }, 840 | "node_modules/fresh": { 841 | "version": "0.5.2", 842 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 843 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 844 | "engines": { 845 | "node": ">= 0.6" 846 | } 847 | }, 848 | "node_modules/fs-constants": { 849 | "version": "1.0.0", 850 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 851 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 852 | }, 853 | "node_modules/fs-minipass": { 854 | "version": "2.1.0", 855 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 856 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 857 | "dependencies": { 858 | "minipass": "^3.0.0" 859 | }, 860 | "engines": { 861 | "node": ">= 8" 862 | } 863 | }, 864 | "node_modules/fs-minipass/node_modules/minipass": { 865 | "version": "3.3.6", 866 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 867 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 868 | "dependencies": { 869 | "yallist": "^4.0.0" 870 | }, 871 | "engines": { 872 | "node": ">=8" 873 | } 874 | }, 875 | "node_modules/fs.realpath": { 876 | "version": "1.0.0", 877 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 878 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 879 | }, 880 | "node_modules/fsevents": { 881 | "version": "2.3.3", 882 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 883 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 884 | "hasInstallScript": true, 885 | "optional": true, 886 | "os": [ 887 | "darwin" 888 | ], 889 | "engines": { 890 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 891 | } 892 | }, 893 | "node_modules/function-bind": { 894 | "version": "1.1.2", 895 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 896 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 897 | "funding": { 898 | "url": "https://github.com/sponsors/ljharb" 899 | } 900 | }, 901 | "node_modules/gauge": { 902 | "version": "3.0.2", 903 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", 904 | "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", 905 | "deprecated": "This package is no longer supported.", 906 | "dependencies": { 907 | "aproba": "^1.0.3 || ^2.0.0", 908 | "color-support": "^1.1.2", 909 | "console-control-strings": "^1.0.0", 910 | "has-unicode": "^2.0.1", 911 | "object-assign": "^4.1.1", 912 | "signal-exit": "^3.0.0", 913 | "string-width": "^4.2.3", 914 | "strip-ansi": "^6.0.1", 915 | "wide-align": "^1.1.2" 916 | }, 917 | "engines": { 918 | "node": ">=10" 919 | } 920 | }, 921 | "node_modules/get-intrinsic": { 922 | "version": "1.2.4", 923 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 924 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 925 | "dependencies": { 926 | "es-errors": "^1.3.0", 927 | "function-bind": "^1.1.2", 928 | "has-proto": "^1.0.1", 929 | "has-symbols": "^1.0.3", 930 | "hasown": "^2.0.0" 931 | }, 932 | "engines": { 933 | "node": ">= 0.4" 934 | }, 935 | "funding": { 936 | "url": "https://github.com/sponsors/ljharb" 937 | } 938 | }, 939 | "node_modules/github-from-package": { 940 | "version": "0.0.0", 941 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 942 | "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" 943 | }, 944 | "node_modules/glob": { 945 | "version": "7.2.3", 946 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 947 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 948 | "deprecated": "Glob versions prior to v9 are no longer supported", 949 | "dependencies": { 950 | "fs.realpath": "^1.0.0", 951 | "inflight": "^1.0.4", 952 | "inherits": "2", 953 | "minimatch": "^3.1.1", 954 | "once": "^1.3.0", 955 | "path-is-absolute": "^1.0.0" 956 | }, 957 | "engines": { 958 | "node": "*" 959 | }, 960 | "funding": { 961 | "url": "https://github.com/sponsors/isaacs" 962 | } 963 | }, 964 | "node_modules/glob-parent": { 965 | "version": "5.1.2", 966 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 967 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 968 | "dependencies": { 969 | "is-glob": "^4.0.1" 970 | }, 971 | "engines": { 972 | "node": ">= 6" 973 | } 974 | }, 975 | "node_modules/gopd": { 976 | "version": "1.0.1", 977 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 978 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 979 | "dependencies": { 980 | "get-intrinsic": "^1.1.3" 981 | }, 982 | "funding": { 983 | "url": "https://github.com/sponsors/ljharb" 984 | } 985 | }, 986 | "node_modules/has-flag": { 987 | "version": "3.0.0", 988 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 989 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 990 | "engines": { 991 | "node": ">=4" 992 | } 993 | }, 994 | "node_modules/has-property-descriptors": { 995 | "version": "1.0.2", 996 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 997 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 998 | "dependencies": { 999 | "es-define-property": "^1.0.0" 1000 | }, 1001 | "funding": { 1002 | "url": "https://github.com/sponsors/ljharb" 1003 | } 1004 | }, 1005 | "node_modules/has-proto": { 1006 | "version": "1.0.3", 1007 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 1008 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 1009 | "engines": { 1010 | "node": ">= 0.4" 1011 | }, 1012 | "funding": { 1013 | "url": "https://github.com/sponsors/ljharb" 1014 | } 1015 | }, 1016 | "node_modules/has-symbols": { 1017 | "version": "1.0.3", 1018 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1019 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1020 | "engines": { 1021 | "node": ">= 0.4" 1022 | }, 1023 | "funding": { 1024 | "url": "https://github.com/sponsors/ljharb" 1025 | } 1026 | }, 1027 | "node_modules/has-unicode": { 1028 | "version": "2.0.1", 1029 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 1030 | "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" 1031 | }, 1032 | "node_modules/hasown": { 1033 | "version": "2.0.2", 1034 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1035 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1036 | "dependencies": { 1037 | "function-bind": "^1.1.2" 1038 | }, 1039 | "engines": { 1040 | "node": ">= 0.4" 1041 | } 1042 | }, 1043 | "node_modules/htmlparser2": { 1044 | "version": "8.0.2", 1045 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", 1046 | "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", 1047 | "funding": [ 1048 | "https://github.com/fb55/htmlparser2?sponsor=1", 1049 | { 1050 | "type": "github", 1051 | "url": "https://github.com/sponsors/fb55" 1052 | } 1053 | ], 1054 | "dependencies": { 1055 | "domelementtype": "^2.3.0", 1056 | "domhandler": "^5.0.3", 1057 | "domutils": "^3.0.1", 1058 | "entities": "^4.4.0" 1059 | } 1060 | }, 1061 | "node_modules/http-errors": { 1062 | "version": "2.0.0", 1063 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1064 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1065 | "dependencies": { 1066 | "depd": "2.0.0", 1067 | "inherits": "2.0.4", 1068 | "setprototypeof": "1.2.0", 1069 | "statuses": "2.0.1", 1070 | "toidentifier": "1.0.1" 1071 | }, 1072 | "engines": { 1073 | "node": ">= 0.8" 1074 | } 1075 | }, 1076 | "node_modules/https-proxy-agent": { 1077 | "version": "5.0.1", 1078 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 1079 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 1080 | "dependencies": { 1081 | "agent-base": "6", 1082 | "debug": "4" 1083 | }, 1084 | "engines": { 1085 | "node": ">= 6" 1086 | } 1087 | }, 1088 | "node_modules/https-proxy-agent/node_modules/debug": { 1089 | "version": "4.3.6", 1090 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 1091 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 1092 | "dependencies": { 1093 | "ms": "2.1.2" 1094 | }, 1095 | "engines": { 1096 | "node": ">=6.0" 1097 | }, 1098 | "peerDependenciesMeta": { 1099 | "supports-color": { 1100 | "optional": true 1101 | } 1102 | } 1103 | }, 1104 | "node_modules/https-proxy-agent/node_modules/ms": { 1105 | "version": "2.1.2", 1106 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1107 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1108 | }, 1109 | "node_modules/iconv-lite": { 1110 | "version": "0.4.24", 1111 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1112 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1113 | "dependencies": { 1114 | "safer-buffer": ">= 2.1.2 < 3" 1115 | }, 1116 | "engines": { 1117 | "node": ">=0.10.0" 1118 | } 1119 | }, 1120 | "node_modules/ieee754": { 1121 | "version": "1.2.1", 1122 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1123 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1124 | "funding": [ 1125 | { 1126 | "type": "github", 1127 | "url": "https://github.com/sponsors/feross" 1128 | }, 1129 | { 1130 | "type": "patreon", 1131 | "url": "https://www.patreon.com/feross" 1132 | }, 1133 | { 1134 | "type": "consulting", 1135 | "url": "https://feross.org/support" 1136 | } 1137 | ] 1138 | }, 1139 | "node_modules/ignore-by-default": { 1140 | "version": "1.0.1", 1141 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 1142 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" 1143 | }, 1144 | "node_modules/inflight": { 1145 | "version": "1.0.6", 1146 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1147 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1148 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 1149 | "dependencies": { 1150 | "once": "^1.3.0", 1151 | "wrappy": "1" 1152 | } 1153 | }, 1154 | "node_modules/inherits": { 1155 | "version": "2.0.4", 1156 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1157 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1158 | }, 1159 | "node_modules/ini": { 1160 | "version": "1.3.8", 1161 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 1162 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 1163 | }, 1164 | "node_modules/ipaddr.js": { 1165 | "version": "1.9.1", 1166 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1167 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1168 | "engines": { 1169 | "node": ">= 0.10" 1170 | } 1171 | }, 1172 | "node_modules/is-binary-path": { 1173 | "version": "2.1.0", 1174 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1175 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1176 | "dependencies": { 1177 | "binary-extensions": "^2.0.0" 1178 | }, 1179 | "engines": { 1180 | "node": ">=8" 1181 | } 1182 | }, 1183 | "node_modules/is-extglob": { 1184 | "version": "2.1.1", 1185 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1186 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1187 | "engines": { 1188 | "node": ">=0.10.0" 1189 | } 1190 | }, 1191 | "node_modules/is-fullwidth-code-point": { 1192 | "version": "3.0.0", 1193 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1194 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1195 | "engines": { 1196 | "node": ">=8" 1197 | } 1198 | }, 1199 | "node_modules/is-glob": { 1200 | "version": "4.0.3", 1201 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1202 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1203 | "dependencies": { 1204 | "is-extglob": "^2.1.1" 1205 | }, 1206 | "engines": { 1207 | "node": ">=0.10.0" 1208 | } 1209 | }, 1210 | "node_modules/is-number": { 1211 | "version": "7.0.0", 1212 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1213 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1214 | "engines": { 1215 | "node": ">=0.12.0" 1216 | } 1217 | }, 1218 | "node_modules/is-plain-object": { 1219 | "version": "5.0.0", 1220 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", 1221 | "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", 1222 | "engines": { 1223 | "node": ">=0.10.0" 1224 | } 1225 | }, 1226 | "node_modules/jake": { 1227 | "version": "10.9.2", 1228 | "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", 1229 | "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", 1230 | "dependencies": { 1231 | "async": "^3.2.3", 1232 | "chalk": "^4.0.2", 1233 | "filelist": "^1.0.4", 1234 | "minimatch": "^3.1.2" 1235 | }, 1236 | "bin": { 1237 | "jake": "bin/cli.js" 1238 | }, 1239 | "engines": { 1240 | "node": ">=10" 1241 | } 1242 | }, 1243 | "node_modules/jsonwebtoken": { 1244 | "version": "9.0.2", 1245 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", 1246 | "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", 1247 | "dependencies": { 1248 | "jws": "^3.2.2", 1249 | "lodash.includes": "^4.3.0", 1250 | "lodash.isboolean": "^3.0.3", 1251 | "lodash.isinteger": "^4.0.4", 1252 | "lodash.isnumber": "^3.0.3", 1253 | "lodash.isplainobject": "^4.0.6", 1254 | "lodash.isstring": "^4.0.1", 1255 | "lodash.once": "^4.0.0", 1256 | "ms": "^2.1.1", 1257 | "semver": "^7.5.4" 1258 | }, 1259 | "engines": { 1260 | "node": ">=12", 1261 | "npm": ">=6" 1262 | } 1263 | }, 1264 | "node_modules/jsonwebtoken/node_modules/ms": { 1265 | "version": "2.1.3", 1266 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1267 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1268 | }, 1269 | "node_modules/jwa": { 1270 | "version": "1.4.1", 1271 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 1272 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 1273 | "dependencies": { 1274 | "buffer-equal-constant-time": "1.0.1", 1275 | "ecdsa-sig-formatter": "1.0.11", 1276 | "safe-buffer": "^5.0.1" 1277 | } 1278 | }, 1279 | "node_modules/jws": { 1280 | "version": "3.2.2", 1281 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 1282 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 1283 | "dependencies": { 1284 | "jwa": "^1.4.1", 1285 | "safe-buffer": "^5.0.1" 1286 | } 1287 | }, 1288 | "node_modules/lodash.includes": { 1289 | "version": "4.3.0", 1290 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 1291 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" 1292 | }, 1293 | "node_modules/lodash.isboolean": { 1294 | "version": "3.0.3", 1295 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 1296 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" 1297 | }, 1298 | "node_modules/lodash.isinteger": { 1299 | "version": "4.0.4", 1300 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 1301 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" 1302 | }, 1303 | "node_modules/lodash.isnumber": { 1304 | "version": "3.0.3", 1305 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 1306 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" 1307 | }, 1308 | "node_modules/lodash.isplainobject": { 1309 | "version": "4.0.6", 1310 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1311 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" 1312 | }, 1313 | "node_modules/lodash.isstring": { 1314 | "version": "4.0.1", 1315 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1316 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" 1317 | }, 1318 | "node_modules/lodash.once": { 1319 | "version": "4.1.1", 1320 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 1321 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" 1322 | }, 1323 | "node_modules/make-dir": { 1324 | "version": "3.1.0", 1325 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1326 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1327 | "dependencies": { 1328 | "semver": "^6.0.0" 1329 | }, 1330 | "engines": { 1331 | "node": ">=8" 1332 | }, 1333 | "funding": { 1334 | "url": "https://github.com/sponsors/sindresorhus" 1335 | } 1336 | }, 1337 | "node_modules/make-dir/node_modules/semver": { 1338 | "version": "6.3.1", 1339 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 1340 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 1341 | "bin": { 1342 | "semver": "bin/semver.js" 1343 | } 1344 | }, 1345 | "node_modules/marked": { 1346 | "version": "14.1.1", 1347 | "resolved": "https://registry.npmjs.org/marked/-/marked-14.1.1.tgz", 1348 | "integrity": "sha512-eS59oxof5eBVDCKTs+mJbvB/6Vq137GbimF9wkTIlto2/B2ppY5nigUUQgKVmA3bI2mPTIshUyDj5j612ZxlQQ==", 1349 | "bin": { 1350 | "marked": "bin/marked.js" 1351 | }, 1352 | "engines": { 1353 | "node": ">= 18" 1354 | } 1355 | }, 1356 | "node_modules/media-typer": { 1357 | "version": "0.3.0", 1358 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1359 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 1360 | "engines": { 1361 | "node": ">= 0.6" 1362 | } 1363 | }, 1364 | "node_modules/merge-descriptors": { 1365 | "version": "1.0.1", 1366 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1367 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 1368 | }, 1369 | "node_modules/methods": { 1370 | "version": "1.1.2", 1371 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1372 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 1373 | "engines": { 1374 | "node": ">= 0.6" 1375 | } 1376 | }, 1377 | "node_modules/mime": { 1378 | "version": "1.6.0", 1379 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1380 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1381 | "bin": { 1382 | "mime": "cli.js" 1383 | }, 1384 | "engines": { 1385 | "node": ">=4" 1386 | } 1387 | }, 1388 | "node_modules/mime-db": { 1389 | "version": "1.52.0", 1390 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1391 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1392 | "engines": { 1393 | "node": ">= 0.6" 1394 | } 1395 | }, 1396 | "node_modules/mime-types": { 1397 | "version": "2.1.35", 1398 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1399 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1400 | "dependencies": { 1401 | "mime-db": "1.52.0" 1402 | }, 1403 | "engines": { 1404 | "node": ">= 0.6" 1405 | } 1406 | }, 1407 | "node_modules/mimic-response": { 1408 | "version": "3.1.0", 1409 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 1410 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 1411 | "engines": { 1412 | "node": ">=10" 1413 | }, 1414 | "funding": { 1415 | "url": "https://github.com/sponsors/sindresorhus" 1416 | } 1417 | }, 1418 | "node_modules/minimatch": { 1419 | "version": "3.1.2", 1420 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1421 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1422 | "dependencies": { 1423 | "brace-expansion": "^1.1.7" 1424 | }, 1425 | "engines": { 1426 | "node": "*" 1427 | } 1428 | }, 1429 | "node_modules/minimist": { 1430 | "version": "1.2.8", 1431 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1432 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1433 | "funding": { 1434 | "url": "https://github.com/sponsors/ljharb" 1435 | } 1436 | }, 1437 | "node_modules/minipass": { 1438 | "version": "5.0.0", 1439 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 1440 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 1441 | "engines": { 1442 | "node": ">=8" 1443 | } 1444 | }, 1445 | "node_modules/minizlib": { 1446 | "version": "2.1.2", 1447 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 1448 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 1449 | "dependencies": { 1450 | "minipass": "^3.0.0", 1451 | "yallist": "^4.0.0" 1452 | }, 1453 | "engines": { 1454 | "node": ">= 8" 1455 | } 1456 | }, 1457 | "node_modules/minizlib/node_modules/minipass": { 1458 | "version": "3.3.6", 1459 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1460 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1461 | "dependencies": { 1462 | "yallist": "^4.0.0" 1463 | }, 1464 | "engines": { 1465 | "node": ">=8" 1466 | } 1467 | }, 1468 | "node_modules/mkdirp": { 1469 | "version": "1.0.4", 1470 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1471 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 1472 | "bin": { 1473 | "mkdirp": "bin/cmd.js" 1474 | }, 1475 | "engines": { 1476 | "node": ">=10" 1477 | } 1478 | }, 1479 | "node_modules/mkdirp-classic": { 1480 | "version": "0.5.3", 1481 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 1482 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 1483 | }, 1484 | "node_modules/ms": { 1485 | "version": "2.0.0", 1486 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1487 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1488 | }, 1489 | "node_modules/nanoid": { 1490 | "version": "3.3.7", 1491 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 1492 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 1493 | "funding": [ 1494 | { 1495 | "type": "github", 1496 | "url": "https://github.com/sponsors/ai" 1497 | } 1498 | ], 1499 | "bin": { 1500 | "nanoid": "bin/nanoid.cjs" 1501 | }, 1502 | "engines": { 1503 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1504 | } 1505 | }, 1506 | "node_modules/napi-build-utils": { 1507 | "version": "1.0.2", 1508 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 1509 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" 1510 | }, 1511 | "node_modules/negotiator": { 1512 | "version": "0.6.3", 1513 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1514 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1515 | "engines": { 1516 | "node": ">= 0.6" 1517 | } 1518 | }, 1519 | "node_modules/node-abi": { 1520 | "version": "3.67.0", 1521 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.67.0.tgz", 1522 | "integrity": "sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==", 1523 | "dependencies": { 1524 | "semver": "^7.3.5" 1525 | }, 1526 | "engines": { 1527 | "node": ">=10" 1528 | } 1529 | }, 1530 | "node_modules/node-addon-api": { 1531 | "version": "5.1.0", 1532 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", 1533 | "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" 1534 | }, 1535 | "node_modules/node-fetch": { 1536 | "version": "2.7.0", 1537 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 1538 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 1539 | "dependencies": { 1540 | "whatwg-url": "^5.0.0" 1541 | }, 1542 | "engines": { 1543 | "node": "4.x || >=6.0.0" 1544 | }, 1545 | "peerDependencies": { 1546 | "encoding": "^0.1.0" 1547 | }, 1548 | "peerDependenciesMeta": { 1549 | "encoding": { 1550 | "optional": true 1551 | } 1552 | } 1553 | }, 1554 | "node_modules/nodemon": { 1555 | "version": "3.1.4", 1556 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", 1557 | "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", 1558 | "dependencies": { 1559 | "chokidar": "^3.5.2", 1560 | "debug": "^4", 1561 | "ignore-by-default": "^1.0.1", 1562 | "minimatch": "^3.1.2", 1563 | "pstree.remy": "^1.1.8", 1564 | "semver": "^7.5.3", 1565 | "simple-update-notifier": "^2.0.0", 1566 | "supports-color": "^5.5.0", 1567 | "touch": "^3.1.0", 1568 | "undefsafe": "^2.0.5" 1569 | }, 1570 | "bin": { 1571 | "nodemon": "bin/nodemon.js" 1572 | }, 1573 | "engines": { 1574 | "node": ">=10" 1575 | }, 1576 | "funding": { 1577 | "type": "opencollective", 1578 | "url": "https://opencollective.com/nodemon" 1579 | } 1580 | }, 1581 | "node_modules/nodemon/node_modules/debug": { 1582 | "version": "4.3.6", 1583 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 1584 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 1585 | "dependencies": { 1586 | "ms": "2.1.2" 1587 | }, 1588 | "engines": { 1589 | "node": ">=6.0" 1590 | }, 1591 | "peerDependenciesMeta": { 1592 | "supports-color": { 1593 | "optional": true 1594 | } 1595 | } 1596 | }, 1597 | "node_modules/nodemon/node_modules/ms": { 1598 | "version": "2.1.2", 1599 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1600 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1601 | }, 1602 | "node_modules/nopt": { 1603 | "version": "5.0.0", 1604 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", 1605 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", 1606 | "dependencies": { 1607 | "abbrev": "1" 1608 | }, 1609 | "bin": { 1610 | "nopt": "bin/nopt.js" 1611 | }, 1612 | "engines": { 1613 | "node": ">=6" 1614 | } 1615 | }, 1616 | "node_modules/normalize-path": { 1617 | "version": "3.0.0", 1618 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1619 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1620 | "engines": { 1621 | "node": ">=0.10.0" 1622 | } 1623 | }, 1624 | "node_modules/npmlog": { 1625 | "version": "5.0.1", 1626 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", 1627 | "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", 1628 | "deprecated": "This package is no longer supported.", 1629 | "dependencies": { 1630 | "are-we-there-yet": "^2.0.0", 1631 | "console-control-strings": "^1.1.0", 1632 | "gauge": "^3.0.0", 1633 | "set-blocking": "^2.0.0" 1634 | } 1635 | }, 1636 | "node_modules/object-assign": { 1637 | "version": "4.1.1", 1638 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1639 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1640 | "engines": { 1641 | "node": ">=0.10.0" 1642 | } 1643 | }, 1644 | "node_modules/object-inspect": { 1645 | "version": "1.13.2", 1646 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", 1647 | "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", 1648 | "engines": { 1649 | "node": ">= 0.4" 1650 | }, 1651 | "funding": { 1652 | "url": "https://github.com/sponsors/ljharb" 1653 | } 1654 | }, 1655 | "node_modules/on-finished": { 1656 | "version": "2.4.1", 1657 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1658 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1659 | "dependencies": { 1660 | "ee-first": "1.1.1" 1661 | }, 1662 | "engines": { 1663 | "node": ">= 0.8" 1664 | } 1665 | }, 1666 | "node_modules/once": { 1667 | "version": "1.4.0", 1668 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1669 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1670 | "dependencies": { 1671 | "wrappy": "1" 1672 | } 1673 | }, 1674 | "node_modules/parse-srcset": { 1675 | "version": "1.0.2", 1676 | "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", 1677 | "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" 1678 | }, 1679 | "node_modules/parseurl": { 1680 | "version": "1.3.3", 1681 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1682 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1683 | "engines": { 1684 | "node": ">= 0.8" 1685 | } 1686 | }, 1687 | "node_modules/path-is-absolute": { 1688 | "version": "1.0.1", 1689 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1690 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1691 | "engines": { 1692 | "node": ">=0.10.0" 1693 | } 1694 | }, 1695 | "node_modules/path-to-regexp": { 1696 | "version": "0.1.7", 1697 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1698 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1699 | }, 1700 | "node_modules/picocolors": { 1701 | "version": "1.1.0", 1702 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", 1703 | "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" 1704 | }, 1705 | "node_modules/picomatch": { 1706 | "version": "2.3.1", 1707 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1708 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1709 | "engines": { 1710 | "node": ">=8.6" 1711 | }, 1712 | "funding": { 1713 | "url": "https://github.com/sponsors/jonschlinkert" 1714 | } 1715 | }, 1716 | "node_modules/postcss": { 1717 | "version": "8.4.45", 1718 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", 1719 | "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", 1720 | "funding": [ 1721 | { 1722 | "type": "opencollective", 1723 | "url": "https://opencollective.com/postcss/" 1724 | }, 1725 | { 1726 | "type": "tidelift", 1727 | "url": "https://tidelift.com/funding/github/npm/postcss" 1728 | }, 1729 | { 1730 | "type": "github", 1731 | "url": "https://github.com/sponsors/ai" 1732 | } 1733 | ], 1734 | "dependencies": { 1735 | "nanoid": "^3.3.7", 1736 | "picocolors": "^1.0.1", 1737 | "source-map-js": "^1.2.0" 1738 | }, 1739 | "engines": { 1740 | "node": "^10 || ^12 || >=14" 1741 | } 1742 | }, 1743 | "node_modules/prebuild-install": { 1744 | "version": "7.1.2", 1745 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", 1746 | "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", 1747 | "dependencies": { 1748 | "detect-libc": "^2.0.0", 1749 | "expand-template": "^2.0.3", 1750 | "github-from-package": "0.0.0", 1751 | "minimist": "^1.2.3", 1752 | "mkdirp-classic": "^0.5.3", 1753 | "napi-build-utils": "^1.0.1", 1754 | "node-abi": "^3.3.0", 1755 | "pump": "^3.0.0", 1756 | "rc": "^1.2.7", 1757 | "simple-get": "^4.0.0", 1758 | "tar-fs": "^2.0.0", 1759 | "tunnel-agent": "^0.6.0" 1760 | }, 1761 | "bin": { 1762 | "prebuild-install": "bin.js" 1763 | }, 1764 | "engines": { 1765 | "node": ">=10" 1766 | } 1767 | }, 1768 | "node_modules/proxy-addr": { 1769 | "version": "2.0.7", 1770 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1771 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1772 | "dependencies": { 1773 | "forwarded": "0.2.0", 1774 | "ipaddr.js": "1.9.1" 1775 | }, 1776 | "engines": { 1777 | "node": ">= 0.10" 1778 | } 1779 | }, 1780 | "node_modules/pstree.remy": { 1781 | "version": "1.1.8", 1782 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 1783 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" 1784 | }, 1785 | "node_modules/pump": { 1786 | "version": "3.0.0", 1787 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1788 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1789 | "dependencies": { 1790 | "end-of-stream": "^1.1.0", 1791 | "once": "^1.3.1" 1792 | } 1793 | }, 1794 | "node_modules/qs": { 1795 | "version": "6.11.0", 1796 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1797 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1798 | "dependencies": { 1799 | "side-channel": "^1.0.4" 1800 | }, 1801 | "engines": { 1802 | "node": ">=0.6" 1803 | }, 1804 | "funding": { 1805 | "url": "https://github.com/sponsors/ljharb" 1806 | } 1807 | }, 1808 | "node_modules/range-parser": { 1809 | "version": "1.2.1", 1810 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1811 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1812 | "engines": { 1813 | "node": ">= 0.6" 1814 | } 1815 | }, 1816 | "node_modules/raw-body": { 1817 | "version": "2.5.2", 1818 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 1819 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 1820 | "dependencies": { 1821 | "bytes": "3.1.2", 1822 | "http-errors": "2.0.0", 1823 | "iconv-lite": "0.4.24", 1824 | "unpipe": "1.0.0" 1825 | }, 1826 | "engines": { 1827 | "node": ">= 0.8" 1828 | } 1829 | }, 1830 | "node_modules/rc": { 1831 | "version": "1.2.8", 1832 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1833 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1834 | "dependencies": { 1835 | "deep-extend": "^0.6.0", 1836 | "ini": "~1.3.0", 1837 | "minimist": "^1.2.0", 1838 | "strip-json-comments": "~2.0.1" 1839 | }, 1840 | "bin": { 1841 | "rc": "cli.js" 1842 | } 1843 | }, 1844 | "node_modules/readable-stream": { 1845 | "version": "3.6.2", 1846 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 1847 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 1848 | "dependencies": { 1849 | "inherits": "^2.0.3", 1850 | "string_decoder": "^1.1.1", 1851 | "util-deprecate": "^1.0.1" 1852 | }, 1853 | "engines": { 1854 | "node": ">= 6" 1855 | } 1856 | }, 1857 | "node_modules/readdirp": { 1858 | "version": "3.6.0", 1859 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1860 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1861 | "dependencies": { 1862 | "picomatch": "^2.2.1" 1863 | }, 1864 | "engines": { 1865 | "node": ">=8.10.0" 1866 | } 1867 | }, 1868 | "node_modules/rimraf": { 1869 | "version": "3.0.2", 1870 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1871 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1872 | "deprecated": "Rimraf versions prior to v4 are no longer supported", 1873 | "dependencies": { 1874 | "glob": "^7.1.3" 1875 | }, 1876 | "bin": { 1877 | "rimraf": "bin.js" 1878 | }, 1879 | "funding": { 1880 | "url": "https://github.com/sponsors/isaacs" 1881 | } 1882 | }, 1883 | "node_modules/safe-buffer": { 1884 | "version": "5.2.1", 1885 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1886 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1887 | "funding": [ 1888 | { 1889 | "type": "github", 1890 | "url": "https://github.com/sponsors/feross" 1891 | }, 1892 | { 1893 | "type": "patreon", 1894 | "url": "https://www.patreon.com/feross" 1895 | }, 1896 | { 1897 | "type": "consulting", 1898 | "url": "https://feross.org/support" 1899 | } 1900 | ] 1901 | }, 1902 | "node_modules/safer-buffer": { 1903 | "version": "2.1.2", 1904 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1905 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1906 | }, 1907 | "node_modules/sanitize-html": { 1908 | "version": "2.13.0", 1909 | "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.13.0.tgz", 1910 | "integrity": "sha512-Xff91Z+4Mz5QiNSLdLWwjgBDm5b1RU6xBT0+12rapjiaR7SwfRdjw8f+6Rir2MXKLrDicRFHdb51hGOAxmsUIA==", 1911 | "dependencies": { 1912 | "deepmerge": "^4.2.2", 1913 | "escape-string-regexp": "^4.0.0", 1914 | "htmlparser2": "^8.0.0", 1915 | "is-plain-object": "^5.0.0", 1916 | "parse-srcset": "^1.0.2", 1917 | "postcss": "^8.3.11" 1918 | } 1919 | }, 1920 | "node_modules/semver": { 1921 | "version": "7.6.3", 1922 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 1923 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 1924 | "bin": { 1925 | "semver": "bin/semver.js" 1926 | }, 1927 | "engines": { 1928 | "node": ">=10" 1929 | } 1930 | }, 1931 | "node_modules/send": { 1932 | "version": "0.18.0", 1933 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1934 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1935 | "dependencies": { 1936 | "debug": "2.6.9", 1937 | "depd": "2.0.0", 1938 | "destroy": "1.2.0", 1939 | "encodeurl": "~1.0.2", 1940 | "escape-html": "~1.0.3", 1941 | "etag": "~1.8.1", 1942 | "fresh": "0.5.2", 1943 | "http-errors": "2.0.0", 1944 | "mime": "1.6.0", 1945 | "ms": "2.1.3", 1946 | "on-finished": "2.4.1", 1947 | "range-parser": "~1.2.1", 1948 | "statuses": "2.0.1" 1949 | }, 1950 | "engines": { 1951 | "node": ">= 0.8.0" 1952 | } 1953 | }, 1954 | "node_modules/send/node_modules/ms": { 1955 | "version": "2.1.3", 1956 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1957 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1958 | }, 1959 | "node_modules/serve-static": { 1960 | "version": "1.15.0", 1961 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1962 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1963 | "dependencies": { 1964 | "encodeurl": "~1.0.2", 1965 | "escape-html": "~1.0.3", 1966 | "parseurl": "~1.3.3", 1967 | "send": "0.18.0" 1968 | }, 1969 | "engines": { 1970 | "node": ">= 0.8.0" 1971 | } 1972 | }, 1973 | "node_modules/set-blocking": { 1974 | "version": "2.0.0", 1975 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1976 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" 1977 | }, 1978 | "node_modules/set-function-length": { 1979 | "version": "1.2.2", 1980 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 1981 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 1982 | "dependencies": { 1983 | "define-data-property": "^1.1.4", 1984 | "es-errors": "^1.3.0", 1985 | "function-bind": "^1.1.2", 1986 | "get-intrinsic": "^1.2.4", 1987 | "gopd": "^1.0.1", 1988 | "has-property-descriptors": "^1.0.2" 1989 | }, 1990 | "engines": { 1991 | "node": ">= 0.4" 1992 | } 1993 | }, 1994 | "node_modules/setprototypeof": { 1995 | "version": "1.2.0", 1996 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1997 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1998 | }, 1999 | "node_modules/side-channel": { 2000 | "version": "1.0.6", 2001 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 2002 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 2003 | "dependencies": { 2004 | "call-bind": "^1.0.7", 2005 | "es-errors": "^1.3.0", 2006 | "get-intrinsic": "^1.2.4", 2007 | "object-inspect": "^1.13.1" 2008 | }, 2009 | "engines": { 2010 | "node": ">= 0.4" 2011 | }, 2012 | "funding": { 2013 | "url": "https://github.com/sponsors/ljharb" 2014 | } 2015 | }, 2016 | "node_modules/signal-exit": { 2017 | "version": "3.0.7", 2018 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 2019 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 2020 | }, 2021 | "node_modules/simple-concat": { 2022 | "version": "1.0.1", 2023 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 2024 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 2025 | "funding": [ 2026 | { 2027 | "type": "github", 2028 | "url": "https://github.com/sponsors/feross" 2029 | }, 2030 | { 2031 | "type": "patreon", 2032 | "url": "https://www.patreon.com/feross" 2033 | }, 2034 | { 2035 | "type": "consulting", 2036 | "url": "https://feross.org/support" 2037 | } 2038 | ] 2039 | }, 2040 | "node_modules/simple-get": { 2041 | "version": "4.0.1", 2042 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 2043 | "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 2044 | "funding": [ 2045 | { 2046 | "type": "github", 2047 | "url": "https://github.com/sponsors/feross" 2048 | }, 2049 | { 2050 | "type": "patreon", 2051 | "url": "https://www.patreon.com/feross" 2052 | }, 2053 | { 2054 | "type": "consulting", 2055 | "url": "https://feross.org/support" 2056 | } 2057 | ], 2058 | "dependencies": { 2059 | "decompress-response": "^6.0.0", 2060 | "once": "^1.3.1", 2061 | "simple-concat": "^1.0.0" 2062 | } 2063 | }, 2064 | "node_modules/simple-update-notifier": { 2065 | "version": "2.0.0", 2066 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", 2067 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", 2068 | "dependencies": { 2069 | "semver": "^7.5.3" 2070 | }, 2071 | "engines": { 2072 | "node": ">=10" 2073 | } 2074 | }, 2075 | "node_modules/source-map-js": { 2076 | "version": "1.2.0", 2077 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", 2078 | "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", 2079 | "engines": { 2080 | "node": ">=0.10.0" 2081 | } 2082 | }, 2083 | "node_modules/statuses": { 2084 | "version": "2.0.1", 2085 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 2086 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 2087 | "engines": { 2088 | "node": ">= 0.8" 2089 | } 2090 | }, 2091 | "node_modules/string_decoder": { 2092 | "version": "1.3.0", 2093 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2094 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2095 | "dependencies": { 2096 | "safe-buffer": "~5.2.0" 2097 | } 2098 | }, 2099 | "node_modules/string-width": { 2100 | "version": "4.2.3", 2101 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2102 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2103 | "dependencies": { 2104 | "emoji-regex": "^8.0.0", 2105 | "is-fullwidth-code-point": "^3.0.0", 2106 | "strip-ansi": "^6.0.1" 2107 | }, 2108 | "engines": { 2109 | "node": ">=8" 2110 | } 2111 | }, 2112 | "node_modules/strip-ansi": { 2113 | "version": "6.0.1", 2114 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2115 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2116 | "dependencies": { 2117 | "ansi-regex": "^5.0.1" 2118 | }, 2119 | "engines": { 2120 | "node": ">=8" 2121 | } 2122 | }, 2123 | "node_modules/strip-json-comments": { 2124 | "version": "2.0.1", 2125 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2126 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 2127 | "engines": { 2128 | "node": ">=0.10.0" 2129 | } 2130 | }, 2131 | "node_modules/supports-color": { 2132 | "version": "5.5.0", 2133 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2134 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2135 | "dependencies": { 2136 | "has-flag": "^3.0.0" 2137 | }, 2138 | "engines": { 2139 | "node": ">=4" 2140 | } 2141 | }, 2142 | "node_modules/tar": { 2143 | "version": "6.2.1", 2144 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", 2145 | "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", 2146 | "dependencies": { 2147 | "chownr": "^2.0.0", 2148 | "fs-minipass": "^2.0.0", 2149 | "minipass": "^5.0.0", 2150 | "minizlib": "^2.1.1", 2151 | "mkdirp": "^1.0.3", 2152 | "yallist": "^4.0.0" 2153 | }, 2154 | "engines": { 2155 | "node": ">=10" 2156 | } 2157 | }, 2158 | "node_modules/tar-fs": { 2159 | "version": "2.1.1", 2160 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", 2161 | "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", 2162 | "dependencies": { 2163 | "chownr": "^1.1.1", 2164 | "mkdirp-classic": "^0.5.2", 2165 | "pump": "^3.0.0", 2166 | "tar-stream": "^2.1.4" 2167 | } 2168 | }, 2169 | "node_modules/tar-stream": { 2170 | "version": "2.2.0", 2171 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 2172 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 2173 | "dependencies": { 2174 | "bl": "^4.0.3", 2175 | "end-of-stream": "^1.4.1", 2176 | "fs-constants": "^1.0.0", 2177 | "inherits": "^2.0.3", 2178 | "readable-stream": "^3.1.1" 2179 | }, 2180 | "engines": { 2181 | "node": ">=6" 2182 | } 2183 | }, 2184 | "node_modules/tar/node_modules/chownr": { 2185 | "version": "2.0.0", 2186 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 2187 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 2188 | "engines": { 2189 | "node": ">=10" 2190 | } 2191 | }, 2192 | "node_modules/to-regex-range": { 2193 | "version": "5.0.1", 2194 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2195 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2196 | "dependencies": { 2197 | "is-number": "^7.0.0" 2198 | }, 2199 | "engines": { 2200 | "node": ">=8.0" 2201 | } 2202 | }, 2203 | "node_modules/toidentifier": { 2204 | "version": "1.0.1", 2205 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2206 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 2207 | "engines": { 2208 | "node": ">=0.6" 2209 | } 2210 | }, 2211 | "node_modules/touch": { 2212 | "version": "3.1.1", 2213 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", 2214 | "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", 2215 | "bin": { 2216 | "nodetouch": "bin/nodetouch.js" 2217 | } 2218 | }, 2219 | "node_modules/tr46": { 2220 | "version": "0.0.3", 2221 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2222 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 2223 | }, 2224 | "node_modules/tunnel-agent": { 2225 | "version": "0.6.0", 2226 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2227 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 2228 | "dependencies": { 2229 | "safe-buffer": "^5.0.1" 2230 | }, 2231 | "engines": { 2232 | "node": "*" 2233 | } 2234 | }, 2235 | "node_modules/type-is": { 2236 | "version": "1.6.18", 2237 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2238 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2239 | "dependencies": { 2240 | "media-typer": "0.3.0", 2241 | "mime-types": "~2.1.24" 2242 | }, 2243 | "engines": { 2244 | "node": ">= 0.6" 2245 | } 2246 | }, 2247 | "node_modules/undefsafe": { 2248 | "version": "2.0.5", 2249 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 2250 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" 2251 | }, 2252 | "node_modules/unpipe": { 2253 | "version": "1.0.0", 2254 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2255 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 2256 | "engines": { 2257 | "node": ">= 0.8" 2258 | } 2259 | }, 2260 | "node_modules/util-deprecate": { 2261 | "version": "1.0.2", 2262 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2263 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 2264 | }, 2265 | "node_modules/utils-merge": { 2266 | "version": "1.0.1", 2267 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2268 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 2269 | "engines": { 2270 | "node": ">= 0.4.0" 2271 | } 2272 | }, 2273 | "node_modules/vary": { 2274 | "version": "1.1.2", 2275 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2276 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 2277 | "engines": { 2278 | "node": ">= 0.8" 2279 | } 2280 | }, 2281 | "node_modules/webidl-conversions": { 2282 | "version": "3.0.1", 2283 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 2284 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 2285 | }, 2286 | "node_modules/whatwg-url": { 2287 | "version": "5.0.0", 2288 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 2289 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 2290 | "dependencies": { 2291 | "tr46": "~0.0.3", 2292 | "webidl-conversions": "^3.0.0" 2293 | } 2294 | }, 2295 | "node_modules/wide-align": { 2296 | "version": "1.1.5", 2297 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", 2298 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", 2299 | "dependencies": { 2300 | "string-width": "^1.0.2 || 2 || 3 || 4" 2301 | } 2302 | }, 2303 | "node_modules/wrappy": { 2304 | "version": "1.0.2", 2305 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2306 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 2307 | }, 2308 | "node_modules/yallist": { 2309 | "version": "4.0.0", 2310 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2311 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 2312 | } 2313 | } 2314 | } 2315 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "our-backend-project", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "dev": "nodemon server", 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "description": "", 13 | "dependencies": { 14 | "bcrypt": "^5.1.1", 15 | "better-sqlite3": "^11.2.1", 16 | "cookie-parser": "^1.4.6", 17 | "dotenv": "^16.4.5", 18 | "ejs": "^3.1.10", 19 | "express": "^4.19.2", 20 | "jsonwebtoken": "^9.0.2", 21 | "marked": "^14.1.1", 22 | "nodemon": "^3.1.4", 23 | "sanitize-html": "^2.13.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /public/styles.css: -------------------------------------------------------------------------------- 1 | :root, 2 | ::backdrop { 3 | --sans-font: -apple-system, BlinkMacSystemFont, "Avenir Next", Avenir, "Nimbus Sans L", Roboto, "Noto Sans", "Segoe UI", Arial, Helvetica, 4 | "Helvetica Neue", sans-serif; 5 | --mono-font: Consolas, Menlo, Monaco, "Andale Mono", "Ubuntu Mono", monospace; 6 | --standard-border-radius: 5px; 7 | --bg: #fff; 8 | --accent-bg: #f5f7ff; 9 | --text: #212121; 10 | --text-light: #585858; 11 | --border: #898ea4; 12 | --accent: #0d47a1; 13 | --accent-hover: #1266e2; 14 | --accent-text: var(--bg); 15 | --code: #d81b60; 16 | --preformatted: #444; 17 | --marked: #fd3; 18 | --disabled: #efefef; 19 | } 20 | @media (prefers-color-scheme: dark) { 21 | :root, 22 | ::backdrop { 23 | color-scheme: dark; 24 | --bg: #212121; 25 | --accent-bg: #2b2b2b; 26 | --text: #dcdcdc; 27 | --text-light: #ababab; 28 | --accent: #ffb300; 29 | --accent-hover: #ffe099; 30 | --accent-text: var(--bg); 31 | --code: #f06292; 32 | --preformatted: #ccc; 33 | --disabled: #111; 34 | } 35 | img, 36 | video { 37 | opacity: 0.8; 38 | } 39 | } 40 | *, 41 | :before, 42 | :after { 43 | box-sizing: border-box; 44 | } 45 | textarea, 46 | select, 47 | input, 48 | progress { 49 | -webkit-appearance: none; 50 | -moz-appearance: none; 51 | appearance: none; 52 | } 53 | html { 54 | font-family: var(--sans-font); 55 | scroll-behavior: smooth; 56 | } 57 | body { 58 | color: var(--text); 59 | background-color: var(--bg); 60 | grid-template-columns: 1fr min(45rem, 90%) 1fr; 61 | margin: 0; 62 | font-size: 1.15rem; 63 | line-height: 1.5; 64 | display: grid; 65 | } 66 | body > * { 67 | grid-column: 2; 68 | } 69 | body > header { 70 | background-color: var(--accent-bg); 71 | border-bottom: 1px solid var(--border); 72 | text-align: center; 73 | grid-column: 1/-1; 74 | padding: 0 0.5rem 2rem; 75 | } 76 | body > header > :only-child { 77 | margin-block-start: 2rem; 78 | } 79 | body > header h1 { 80 | max-width: 1200px; 81 | margin: 1rem auto; 82 | } 83 | body > header p { 84 | max-width: 40rem; 85 | margin: 1rem auto; 86 | } 87 | main { 88 | padding-top: 1.5rem; 89 | } 90 | body > footer { 91 | color: var(--text-light); 92 | text-align: center; 93 | border-top: 1px solid var(--border); 94 | margin-top: 4rem; 95 | padding: 2rem 1rem 1.5rem; 96 | font-size: 0.9rem; 97 | } 98 | h1 { 99 | font-size: 3rem; 100 | } 101 | h2 { 102 | margin-top: 3rem; 103 | font-size: 2.6rem; 104 | } 105 | h3 { 106 | margin-top: 3rem; 107 | font-size: 2rem; 108 | } 109 | h4 { 110 | font-size: 1.44rem; 111 | } 112 | h5 { 113 | font-size: 1.15rem; 114 | } 115 | h6 { 116 | font-size: 0.96rem; 117 | } 118 | p { 119 | margin: 1.5rem 0; 120 | } 121 | p, 122 | h1, 123 | h2, 124 | h3, 125 | h4, 126 | h5, 127 | h6 { 128 | overflow-wrap: break-word; 129 | } 130 | h1, 131 | h2, 132 | h3 { 133 | line-height: 1.1; 134 | } 135 | @media only screen and (width<=720px) { 136 | h1 { 137 | font-size: 2.5rem; 138 | } 139 | h2 { 140 | font-size: 2.1rem; 141 | } 142 | h3 { 143 | font-size: 1.75rem; 144 | } 145 | h4 { 146 | font-size: 1.25rem; 147 | } 148 | } 149 | a, 150 | a:visited { 151 | color: var(--accent); 152 | } 153 | a:hover { 154 | text-decoration: none; 155 | } 156 | button, 157 | .button, 158 | a.button, 159 | input[type="submit"], 160 | input[type="reset"], 161 | input[type="button"], 162 | label[type="button"] { 163 | border: 1px solid var(--accent); 164 | background-color: var(--accent); 165 | color: var(--accent-text); 166 | padding: 0.5rem 0.9rem; 167 | line-height: normal; 168 | text-decoration: none; 169 | } 170 | .button[aria-disabled="true"], 171 | input:disabled, 172 | textarea:disabled, 173 | select:disabled, 174 | button[disabled] { 175 | cursor: not-allowed; 176 | background-color: var(--disabled); 177 | border-color: var(--disabled); 178 | color: var(--text-light); 179 | } 180 | input[type="range"] { 181 | padding: 0; 182 | } 183 | abbr[title] { 184 | cursor: help; 185 | text-decoration-line: underline; 186 | text-decoration-style: dotted; 187 | } 188 | button:enabled:hover, 189 | .button:not([aria-disabled="true"]):hover, 190 | input[type="submit"]:enabled:hover, 191 | input[type="reset"]:enabled:hover, 192 | input[type="button"]:enabled:hover, 193 | label[type="button"]:hover { 194 | background-color: var(--accent-hover); 195 | border-color: var(--accent-hover); 196 | cursor: pointer; 197 | } 198 | .button:focus-visible, 199 | button:focus-visible:where(:enabled), 200 | input:enabled:focus-visible:where([type="submit"], [type="reset"], [type="button"]) { 201 | outline: 2px solid var(--accent); 202 | outline-offset: 1px; 203 | } 204 | header > nav { 205 | padding: 1rem 0 0; 206 | font-size: 1rem; 207 | line-height: 2; 208 | } 209 | header > nav ul, 210 | header > nav ol { 211 | flex-flow: wrap; 212 | place-content: space-around center; 213 | align-items: center; 214 | margin: 0; 215 | padding: 0; 216 | list-style-type: none; 217 | display: flex; 218 | } 219 | header > nav ul li, 220 | header > nav ol li { 221 | display: inline-block; 222 | } 223 | header > nav a, 224 | header > nav a:visited { 225 | border: 1px solid var(--border); 226 | border-radius: var(--standard-border-radius); 227 | color: var(--text); 228 | margin: 0 0.5rem 1rem; 229 | padding: 0.1rem 1rem; 230 | text-decoration: none; 231 | display: inline-block; 232 | } 233 | header > nav a:hover, 234 | header > nav a.current, 235 | header > nav a[aria-current="page"], 236 | header > nav a[aria-current="true"] { 237 | border-color: var(--accent); 238 | color: var(--accent); 239 | cursor: pointer; 240 | } 241 | @media only screen and (width<=720px) { 242 | header > nav a { 243 | border: none; 244 | padding: 0; 245 | line-height: 1; 246 | text-decoration: underline; 247 | } 248 | } 249 | aside, 250 | details, 251 | pre, 252 | progress { 253 | background-color: var(--accent-bg); 254 | border: 1px solid var(--border); 255 | border-radius: var(--standard-border-radius); 256 | margin-bottom: 1rem; 257 | } 258 | aside { 259 | float: right; 260 | width: 30%; 261 | margin-inline-start: 15px; 262 | padding: 0 15px; 263 | font-size: 1rem; 264 | } 265 | [dir="rtl"] aside { 266 | float: left; 267 | } 268 | @media only screen and (width<=720px) { 269 | aside { 270 | float: none; 271 | width: 100%; 272 | margin-inline-start: 0; 273 | } 274 | } 275 | article, 276 | fieldset, 277 | dialog { 278 | border: 1px solid var(--border); 279 | border-radius: var(--standard-border-radius); 280 | margin-bottom: 1rem; 281 | padding: 1rem; 282 | } 283 | article h2:first-child, 284 | section h2:first-child, 285 | article h3:first-child, 286 | section h3:first-child { 287 | margin-top: 1rem; 288 | } 289 | section { 290 | border-top: 1px solid var(--border); 291 | border-bottom: 1px solid var(--border); 292 | margin: 3rem 0; 293 | padding: 2rem 1rem; 294 | } 295 | section + section, 296 | section:first-child { 297 | border-top: 0; 298 | padding-top: 0; 299 | } 300 | section + section { 301 | margin-top: 0; 302 | } 303 | section:last-child { 304 | border-bottom: 0; 305 | padding-bottom: 0; 306 | } 307 | details { 308 | padding: 0.7rem 1rem; 309 | } 310 | summary { 311 | cursor: pointer; 312 | word-break: break-all; 313 | margin: -0.7rem -1rem; 314 | padding: 0.7rem 1rem; 315 | font-weight: 700; 316 | } 317 | details[open] > summary + * { 318 | margin-top: 0; 319 | } 320 | details[open] > summary { 321 | margin-bottom: 0.5rem; 322 | } 323 | details[open] > :last-child { 324 | margin-bottom: 0; 325 | } 326 | table { 327 | border-collapse: collapse; 328 | margin: 1.5rem 0; 329 | } 330 | figure > table { 331 | width: max-content; 332 | margin: 0; 333 | } 334 | td, 335 | th { 336 | border: 1px solid var(--border); 337 | text-align: start; 338 | padding: 0.5rem; 339 | } 340 | th { 341 | background-color: var(--accent-bg); 342 | font-weight: 700; 343 | } 344 | tr:nth-child(2n) { 345 | background-color: var(--accent-bg); 346 | } 347 | table caption { 348 | margin-bottom: 0.5rem; 349 | font-weight: 700; 350 | } 351 | textarea, 352 | select, 353 | input, 354 | button, 355 | .button { 356 | font-size: inherit; 357 | border-radius: var(--standard-border-radius); 358 | box-shadow: none; 359 | max-width: 100%; 360 | margin-bottom: 0.5rem; 361 | padding: 0.5rem; 362 | font-family: inherit; 363 | display: inline-block; 364 | } 365 | textarea, 366 | select, 367 | input { 368 | color: var(--text); 369 | background-color: var(--bg); 370 | border: 1px solid var(--border); 371 | } 372 | label { 373 | display: block; 374 | } 375 | textarea:not([cols]) { 376 | width: 100%; 377 | } 378 | select:not([multiple]) { 379 | background-image: linear-gradient(45deg, transparent 49%, var(--text) 51%), linear-gradient(135deg, var(--text) 51%, transparent 49%); 380 | background-position: calc(100% - 15px), calc(100% - 10px); 381 | background-repeat: no-repeat; 382 | background-size: 5px 5px, 5px 5px; 383 | padding-inline-end: 25px; 384 | } 385 | [dir="rtl"] select:not([multiple]) { 386 | background-position: 10px, 15px; 387 | } 388 | input[type="checkbox"], 389 | input[type="radio"] { 390 | vertical-align: middle; 391 | width: min-content; 392 | position: relative; 393 | } 394 | input[type="checkbox"] + label, 395 | input[type="radio"] + label { 396 | display: inline-block; 397 | } 398 | input[type="radio"] { 399 | border-radius: 100%; 400 | } 401 | input[type="checkbox"]:checked, 402 | input[type="radio"]:checked { 403 | background-color: var(--accent); 404 | } 405 | input[type="checkbox"]:checked:after { 406 | content: " "; 407 | border-right: solid var(--bg) 0.08em; 408 | border-bottom: solid var(--bg) 0.08em; 409 | background-color: #0000; 410 | border-radius: 0; 411 | width: 0.18em; 412 | height: 0.32em; 413 | font-size: 1.8em; 414 | position: absolute; 415 | top: 0.05em; 416 | left: 0.17em; 417 | transform: rotate(45deg); 418 | } 419 | input[type="radio"]:checked:after { 420 | content: " "; 421 | background-color: var(--bg); 422 | border-radius: 100%; 423 | width: 0.25em; 424 | height: 0.25em; 425 | font-size: 32px; 426 | position: absolute; 427 | top: 0.125em; 428 | left: 0.125em; 429 | } 430 | @media only screen and (width<=720px) { 431 | textarea, 432 | select, 433 | input { 434 | width: 100%; 435 | } 436 | } 437 | input[type="color"] { 438 | height: 2.5rem; 439 | padding: 0.2rem; 440 | } 441 | input[type="file"] { 442 | border: 0; 443 | } 444 | hr { 445 | background: var(--border); 446 | border: none; 447 | height: 1px; 448 | margin: 1rem auto; 449 | } 450 | mark { 451 | border-radius: var(--standard-border-radius); 452 | background-color: var(--marked); 453 | color: #000; 454 | padding: 2px 5px; 455 | } 456 | mark a { 457 | color: #0d47a1; 458 | } 459 | img, 460 | video { 461 | border-radius: var(--standard-border-radius); 462 | max-width: 100%; 463 | height: auto; 464 | } 465 | figure { 466 | margin: 0; 467 | display: block; 468 | overflow-x: auto; 469 | } 470 | figure > img, 471 | figure > picture > img { 472 | margin-inline: auto; 473 | display: block; 474 | } 475 | figcaption { 476 | text-align: center; 477 | color: var(--text-light); 478 | margin-block: 1rem; 479 | font-size: 0.9rem; 480 | } 481 | blockquote { 482 | border-inline-start: 0.35rem solid var(--accent); 483 | color: var(--text-light); 484 | margin-block: 2rem; 485 | margin-inline: 2rem 0; 486 | padding: 0.4rem 0.8rem; 487 | font-style: italic; 488 | } 489 | cite { 490 | color: var(--text-light); 491 | font-size: 0.9rem; 492 | font-style: normal; 493 | } 494 | dt { 495 | color: var(--text-light); 496 | } 497 | code, 498 | pre, 499 | pre span, 500 | kbd, 501 | samp { 502 | font-family: var(--mono-font); 503 | color: var(--code); 504 | } 505 | kbd { 506 | color: var(--preformatted); 507 | border: 1px solid var(--preformatted); 508 | border-bottom: 3px solid var(--preformatted); 509 | border-radius: var(--standard-border-radius); 510 | padding: 0.1rem 0.4rem; 511 | } 512 | pre { 513 | color: var(--preformatted); 514 | max-width: 100%; 515 | padding: 1rem 1.4rem; 516 | overflow: auto; 517 | } 518 | pre code { 519 | color: var(--preformatted); 520 | background: 0 0; 521 | margin: 0; 522 | padding: 0; 523 | } 524 | progress { 525 | width: 100%; 526 | } 527 | progress:indeterminate { 528 | background-color: var(--accent-bg); 529 | } 530 | progress::-webkit-progress-bar { 531 | border-radius: var(--standard-border-radius); 532 | background-color: var(--accent-bg); 533 | } 534 | progress::-webkit-progress-value { 535 | border-radius: var(--standard-border-radius); 536 | background-color: var(--accent); 537 | } 538 | progress::-moz-progress-bar { 539 | border-radius: var(--standard-border-radius); 540 | background-color: var(--accent); 541 | transition-property: width; 542 | transition-duration: 0.3s; 543 | } 544 | progress:indeterminate::-moz-progress-bar { 545 | background-color: var(--accent-bg); 546 | } 547 | dialog { 548 | max-width: 40rem; 549 | margin: auto; 550 | } 551 | dialog::backdrop { 552 | background-color: var(--bg); 553 | opacity: 0.8; 554 | } 555 | @media only screen and (width<=720px) { 556 | dialog { 557 | max-width: 100%; 558 | margin: auto 1em; 559 | } 560 | } 561 | sup, 562 | sub { 563 | vertical-align: baseline; 564 | position: relative; 565 | } 566 | sup { 567 | top: -0.4em; 568 | } 569 | sub { 570 | top: 0.3em; 571 | } 572 | .notice { 573 | background: var(--accent-bg); 574 | border: 2px solid var(--border); 575 | border-radius: var(--standard-border-radius); 576 | margin: 2rem 0; 577 | padding: 1.5rem; 578 | } 579 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config() 2 | const jwt = require("jsonwebtoken") 3 | const marked = require("marked") 4 | const sanitizeHTML = require("sanitize-html") 5 | const bcrypt = require("bcrypt") 6 | const cookieParser = require("cookie-parser") 7 | const express = require("express") 8 | const db = require("better-sqlite3")("ourApp.db") 9 | db.pragma("journal_mode = WAL") 10 | 11 | // database setup here 12 | const createTables = db.transaction(() => { 13 | db.prepare( 14 | ` 15 | CREATE TABLE IF NOT EXISTS users ( 16 | id INTEGER PRIMARY KEY AUTOINCREMENT, 17 | username STRING NOT NULL UNIQUE, 18 | password STRING NOT NULL 19 | ) 20 | ` 21 | ).run() 22 | 23 | db.prepare( 24 | ` 25 | CREATE TABLE IF NOT EXISTS posts ( 26 | id INTEGER PRIMARY KEY AUTOINCREMENT, 27 | createdDate TEXT, 28 | title STRING NOT NULL, 29 | body TEXT NOT NULL, 30 | authorid INTEGER, 31 | FOREIGN KEY (authorid) REFERENCES users (id) 32 | ) 33 | ` 34 | ).run() 35 | }) 36 | 37 | createTables() 38 | 39 | // database setup ends here 40 | 41 | const app = express() 42 | 43 | app.set("view engine", "ejs") 44 | app.use(express.urlencoded({ extended: false })) 45 | app.use(express.static("public")) 46 | app.use(cookieParser()) 47 | 48 | app.use(function (req, res, next) { 49 | // make our markdown function available 50 | res.locals.filterUserHTML = function (content) { 51 | return sanitizeHTML(marked.parse(content), { 52 | allowedTags: ["p", "br", "ul", "li", "ol", "strong", "bold", "i", "em", "h1", "h2", "h3", "h4", "h5", "h6"], 53 | allowedAttributes: {} 54 | }) 55 | } 56 | 57 | res.locals.errors = [] 58 | 59 | // try to decode incoming cookie 60 | try { 61 | const decoded = jwt.verify(req.cookies.ourSimpleApp, process.env.JWTSECRET) 62 | req.user = decoded 63 | } catch (err) { 64 | req.user = false 65 | } 66 | 67 | res.locals.user = req.user 68 | console.log(req.user) 69 | 70 | next() 71 | }) 72 | 73 | app.get("/", (req, res) => { 74 | if (req.user) { 75 | const postsStatement = db.prepare("SELECT * FROM posts WHERE authorid = ? ORDER BY createdDate DESC") 76 | const posts = postsStatement.all(req.user.userid) 77 | return res.render("dashboard", { posts }) 78 | } 79 | 80 | res.render("homepage") 81 | }) 82 | 83 | app.get("/login", (req, res) => { 84 | res.render("login") 85 | }) 86 | 87 | app.get("/logout", (req, res) => { 88 | res.clearCookie("ourSimpleApp") 89 | res.redirect("/") 90 | }) 91 | 92 | app.post("/login", (req, res) => { 93 | let errors = [] 94 | 95 | if (typeof req.body.username !== "string") req.body.username = "" 96 | if (typeof req.body.password !== "string") req.body.password = "" 97 | 98 | if (req.body.username.trim() == "") errors = ["Invalid username / password."] 99 | if (req.body.password == "") errors = ["Invalid username / password."] 100 | 101 | if (errors.length) { 102 | return res.render("login", { errors }) 103 | } 104 | 105 | const userInQuestionStatement = db.prepare("SELECT * FROM users WHERE USERNAME = ?") 106 | const userInQuestion = userInQuestionStatement.get(req.body.username) 107 | 108 | if (!userInQuestion) { 109 | errors = ["Invalid username / password."] 110 | return res.render("login", { errors }) 111 | } 112 | 113 | const matchOrNot = bcrypt.compareSync(req.body.password, userInQuestion.password) 114 | if (!matchOrNot) { 115 | errors = ["Invalid username / password."] 116 | return res.render("login", { errors }) 117 | } 118 | 119 | const ourTokenValue = jwt.sign( 120 | { exp: Math.floor(Date.now() / 1000) + 60 * 60 * 24, skyColor: "blue", userid: userInQuestion.id, username: userInQuestion.username }, 121 | process.env.JWTSECRET 122 | ) 123 | 124 | res.cookie("ourSimpleApp", ourTokenValue, { 125 | httpOnly: true, 126 | secure: true, 127 | sameSite: "strict", 128 | maxAge: 1000 * 60 * 60 * 24 129 | }) 130 | 131 | res.redirect("/") 132 | }) 133 | 134 | function mustBeLoggedIn(req, res, next) { 135 | if (req.user) { 136 | return next() 137 | } 138 | return res.redirect("/") 139 | } 140 | 141 | app.get("/create-post", mustBeLoggedIn, (req, res) => { 142 | res.render("create-post") 143 | }) 144 | 145 | function sharedPostValidation(req) { 146 | const errors = [] 147 | 148 | if (typeof req.body.title !== "string") req.body.title = "" 149 | if (typeof req.body.body !== "string") req.body.body = "" 150 | 151 | // trim - sanitize or strip out html 152 | req.body.title = sanitizeHTML(req.body.title.trim(), { allowedTags: [], allowedAttributes: {} }) 153 | req.body.body = sanitizeHTML(req.body.body.trim(), { allowedTags: [], allowedAttributes: {} }) 154 | 155 | if (!req.body.title) errors.push("You must provide a title.") 156 | if (!req.body.body) errors.push("You must provide content.") 157 | 158 | return errors 159 | } 160 | 161 | app.get("/edit-post/:id", mustBeLoggedIn, (req, res) => { 162 | // try to look up the post in question 163 | const statement = db.prepare("SELECT * FROM posts WHERE id = ?") 164 | const post = statement.get(req.params.id) 165 | 166 | if (!post) { 167 | return res.redirect("/") 168 | } 169 | 170 | // if you're not the author, redirect to homepage 171 | if (post.authorid !== req.user.userid) { 172 | return res.redirect("/") 173 | } 174 | 175 | // otherwise, render the edit post template 176 | res.render("edit-post", { post }) 177 | }) 178 | 179 | app.post("/edit-post/:id", mustBeLoggedIn, (req, res) => { 180 | // try to look up the post in question 181 | const statement = db.prepare("SELECT * FROM posts WHERE id = ?") 182 | const post = statement.get(req.params.id) 183 | 184 | if (!post) { 185 | return res.redirect("/") 186 | } 187 | 188 | // if you're not the author, redirect to homepage 189 | if (post.authorid !== req.user.userid) { 190 | return res.redirect("/") 191 | } 192 | 193 | const errors = sharedPostValidation(req) 194 | 195 | if (errors.length) { 196 | return res.render("edit-post", { errors }) 197 | } 198 | 199 | const updateStatement = db.prepare("UPDATE posts SET title = ?, body = ? WHERE id = ?") 200 | updateStatement.run(req.body.title, req.body.body, req.params.id) 201 | 202 | res.redirect(`/post/${req.params.id}`) 203 | }) 204 | 205 | app.post("/delete-post/:id", mustBeLoggedIn, (req, res) => { 206 | // try to look up the post in question 207 | const statement = db.prepare("SELECT * FROM posts WHERE id = ?") 208 | const post = statement.get(req.params.id) 209 | 210 | if (!post) { 211 | return res.redirect("/") 212 | } 213 | 214 | // if you're not the author, redirect to homepage 215 | if (post.authorid !== req.user.userid) { 216 | return res.redirect("/") 217 | } 218 | 219 | const deleteStatement = db.prepare("DELETE FROM posts WHERE id = ?") 220 | deleteStatement.run(req.params.id) 221 | 222 | res.redirect("/") 223 | }) 224 | 225 | app.get("/post/:id", (req, res) => { 226 | const statement = db.prepare("SELECT posts.*, users.username FROM posts INNER JOIN users ON posts.authorid = users.id WHERE posts.id = ?") 227 | const post = statement.get(req.params.id) 228 | 229 | if (!post) { 230 | return res.redirect("/") 231 | } 232 | 233 | const isAuthor = post.authorid === req.user.userid 234 | 235 | res.render("single-post", { post, isAuthor }) 236 | }) 237 | 238 | app.post("/create-post", mustBeLoggedIn, (req, res) => { 239 | const errors = sharedPostValidation(req) 240 | 241 | if (errors.length) { 242 | return res.render("create-post", { errors }) 243 | } 244 | 245 | // save into database 246 | const ourStatement = db.prepare("INSERT INTO posts (title, body, authorid, createdDate) VALUES (?, ?, ?, ?)") 247 | const result = ourStatement.run(req.body.title, req.body.body, req.user.userid, new Date().toISOString()) 248 | 249 | const getPostStatement = db.prepare("SELECT * FROM posts WHERE ROWID = ?") 250 | const realPost = getPostStatement.get(result.lastInsertRowid) 251 | 252 | res.redirect(`/post/${realPost.id}`) 253 | }) 254 | 255 | app.post("/register", (req, res) => { 256 | const errors = [] 257 | 258 | if (typeof req.body.username !== "string") req.body.username = "" 259 | if (typeof req.body.password !== "string") req.body.password = "" 260 | 261 | req.body.username = req.body.username.trim() 262 | 263 | if (!req.body.username) errors.push("You must provide a username.") 264 | if (req.body.username && req.body.username.length < 3) errors.push("Username must be at least 3 characters.") 265 | if (req.body.username && req.body.username.length > 10) errors.push("Username cannot exceed 10 characters.") 266 | if (req.body.username && !req.body.username.match(/^[a-zA-Z0-9]+$/)) errors.push("Username can only contain letters and numbers.") 267 | 268 | // check if username exists already 269 | const usernameStatement = db.prepare("SELECT * FROM users WHERE username = ?") 270 | const usernameCheck = usernameStatement.get(req.body.username) 271 | 272 | if (usernameCheck) errors.push("That username is already taken.") 273 | 274 | if (!req.body.password) errors.push("You must provide a password.") 275 | if (req.body.password && req.body.password.length < 12) errors.push("Password must be at least 12 characters.") 276 | if (req.body.password && req.body.password.length > 70) errors.push("Password cannot exceed 70 characters.") 277 | 278 | if (errors.length) { 279 | return res.render("homepage", { errors }) 280 | } 281 | 282 | // save the new user into a database 283 | const salt = bcrypt.genSaltSync(10) 284 | req.body.password = bcrypt.hashSync(req.body.password, salt) 285 | 286 | const ourStatement = db.prepare("INSERT INTO users (username, password) VALUES (?, ?)") 287 | const result = ourStatement.run(req.body.username, req.body.password) 288 | 289 | const lookupStatement = db.prepare("SELECT * FROM users WHERE ROWID = ?") 290 | const ourUser = lookupStatement.get(result.lastInsertRowid) 291 | 292 | // log the user in by giving them a cookie 293 | const ourTokenValue = jwt.sign( 294 | { exp: Math.floor(Date.now() / 1000) + 60 * 60 * 24, skyColor: "blue", userid: ourUser.id, username: ourUser.username }, 295 | process.env.JWTSECRET 296 | ) 297 | 298 | res.cookie("ourSimpleApp", ourTokenValue, { 299 | httpOnly: true, 300 | secure: true, 301 | sameSite: "strict", 302 | maxAge: 1000 * 60 * 60 * 24 303 | }) 304 | 305 | res.redirect("/") 306 | }) 307 | 308 | app.listen(3000) 309 | -------------------------------------------------------------------------------- /views/create-post.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | <%- include('includes/head') %> 4 |
5 | <%- include('includes/header') %> 6 | 7 |